gpgme/lang/js/BrowserTestExtension/tests/openpgpModeTest.js
Maximilian Krambach 987b317468 js: Tests and improvements for openpgp mode
--

* Added openpgp - Mode tests to the browsertest Extension. These tests
  require openpgp, which should not be a hard dependency for the main
  project. Packing openpgpjs into the extension is still TODO

* Fixes:
  - openpgp mode API now correctly handles parameters as an object,
    similar to openpgpjs
  - proper check and parsing of openpgpjs Message Objects
2018-05-14 16:23:24 +02:00

197 lines
8.4 KiB
JavaScript

/* gpgme.js - Javascript integration for gpgme
* Copyright (C) 2018 Bundesamt für Sicherheit in der Informationstechnik
*
* This file is part of GPGME.
*
* GPGME is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* GPGME is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
* SPDX-License-Identifier: LGPL-2.1+
*/
describe('Encrypting-Decrypting in openpgp mode, using a Message object', function () {
it('Simple Encrypt-Decrypt', function (done) {
let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'});
prm.then(function (context) {
context.encrypt({
data: openpgp.message.fromText(inputvalues.encrypt.good.data),
publicKeys: inputvalues.encrypt.good.fingerprint}
).then(function (answer) {
expect(answer).to.not.be.empty;
expect(answer).to.be.an("object");
expect(answer.data).to.include('BEGIN PGP MESSAGE');
expect(answer.data).to.include('END PGP MESSAGE');
let msg = openpgp.message.fromText(answer.data);
context.decrypt({message:msg}).then(function (result) {
expect(result).to.not.be.empty;
expect(result.data).to.be.a('string');
expect(result.data).to.equal(inputvalues.encrypt.good.data);
context._GpgME.connection.disconnect();
done();
});
});
});
});
it('Encrypt-Decrypt, sending Uint8Array as data', function (done) {
//TODO! fails. Reason is that atob<->btoa destroys the uint8Array,
// resulting in a string of constituyent numbers
// (error already occurs in encryption)
let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'});
prm.then(function (context) {
let input = bigUint8(0.3);
expect(input).to.be.an.instanceof(Uint8Array);
context.encrypt({
data: input,
publicKeys: inputvalues.encrypt.good.fingerprint}
).then(function (answer) {
expect(answer).to.not.be.empty;
expect(answer.data).to.be.a("string");
expect(answer.data).to.include('BEGIN PGP MESSAGE');
expect(answer.data).to.include('END PGP MESSAGE');
context.decrypt({message:answer.data}).then(function (result) {
expect(result).to.not.be.empty;
expect(result.data).to.be.an.instanceof(Uint8Array);
expect(result.data).to.equal(input);
context._GpgME.connection.disconnect();
done();
});
});
});
});
it('Keys as Fingerprints', function(done){
let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'});
let input = inputvalues.encrypt.good.data_nonascii;
prm.then(function (context) {
context.encrypt({
data: input,
publicKeys: inputvalues.encrypt.good.fingerprint}
).then(function (answer) {
expect(answer).to.not.be.empty;
expect(answer.data).to.be.a("string");
expect(answer.data).to.include('BEGIN PGP MESSAGE');
expect(answer.data).to.include('END PGP MESSAGE');
context.decrypt({message:answer.data}).then(function (result) {
expect(result).to.not.be.empty;
expect(result.data).to.be.a('string');
expect(result.data).to.equal(input);
context._GpgME.connection.disconnect();
done();
});
});
});
});
it('Keys as openpgp Keys', function(){
let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'});
let data = inputvalues.encrypt.good.data_nonascii;
let key = openpgp.key.readArmored(openpgpInputs.pubKeyArmored);
expect(key).to.be.an('object');
prm.then(function (context) {
context.encrypt({
data: data,
publicKeys: [key]}
).then( function (answer) {
expect(answer).to.not.be.empty;
expect(answer.data).to.be.a("string");
expect(answer.data).to.include('BEGIN PGP MESSAGE');
expect(answer.data).to.include('END PGP MESSAGE');
context.decrypt({message:answer.data}).then( function (result){
expect(result).to.not.be.empty;
expect(result.data).to.be.a('string');
expect(result.data).to.equal(data);
context._GpgME.connection.disconnect();
done();
});
});
});
});
it('Trying to send non-implemented parameters: passwords', function(done){
let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'});
let data = 'Hello World';
let key = inputvalues.encrypt.good.fingerprint;
prm.then(function (context) {
context.encrypt({
data: data,
publicKeys: [key],
passwords: 'My secret password'}
).then( function(){},
function(error){
expect(error).to.be.an.instanceof(Error);
expect(error.code).equal('NOT_IMPLEMENTED');
done();
});
});
});
it('Trying to send non-implemented parameters: signature', function(done){
let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'});
let data = 'Hello World';
let key = inputvalues.encrypt.good.fingerprint;
prm.then(function (context) {
context.encrypt({
data: data,
publicKeys: [key],
signature: {any: 'value'}
}).then(
function(){},
function(error){
expect(error).to.be.an.instanceof(Error);
expect(error.code).equal('NOT_IMPLEMENTED');
done();
});
});
});
});
describe('Keyring in openpgp mode', function(){
it('Check Existence and structure of Keyring after init', function(done){
let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'});
prm.then(function (context) {
expect(context.Keyring).to.be.an('object');
expect(context.Keyring.getPublicKeys).to.be.a('function');
expect(context.Keyring.deleteKey).to.be.a('function');
expect(context.Keyring.getDefaultKey).to.be.a('function');
done();
});
});
// TODO: gpgme key interface not yet there
});
describe('Decrypting and verification in openpgp mode', function(){
it('Decrypt', function(){
let msg = openpgp.message.fromText(inputvalues.encryptedData);
let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'});
prm.then(function (context) {
context.decrypt({message: msg})
.then(function(answer){
expect(answer.data).to.be.a('string');
expect(result.data).to.equal('¡Äußerste µ€ før ñoquis@hóme! Добрый день\n');
done();
});
});
});
it('Decryption attempt with bad data returns gnupg error', function(done){
let msg = openpgp.message.fromText(bigString(0.1));
let prm = Gpgmejs.init({api_style: 'gpgme_openpgpjs'});
prm.then(function (context) {
context.decrypt({message: msg})
.then( function(){},
function(error){
expect(error).to.be.an.instanceof(Error);
expect(error.code).to.equal('GNUPG_ERROR');
expect(error.message).to.be.a('string');
// TBD: Type of error
done();
});
});
}).timeout(4000);
});