Release new version

This commit is contained in:
Bart Butler 2016-08-17 12:29:41 -07:00
parent 68cdc0069d
commit 64d9233095
6 changed files with 230 additions and 190 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "openpgp", "name": "openpgp",
"version": "2.3.2", "version": "2.3.3",
"license": "LGPL-3.0+", "license": "LGPL-3.0+",
"homepage": "http://openpgpjs.org/", "homepage": "http://openpgpjs.org/",
"authors": [ "authors": [

192
dist/openpgp.js vendored
View File

@ -2947,7 +2947,7 @@ return exports;
* @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
* @license Licensed under MIT license * @license Licensed under MIT license
* See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE
* @version 3.1.2 * @version 3.2.1
*/ */
(function() { (function() {
@ -3005,7 +3005,7 @@ return exports;
var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined; var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined;
var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {}; var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {};
var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver; var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;
var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]'; var lib$es6$promise$asap$$isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
// test for web worker but not in IE10 // test for web worker but not in IE10
var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' && var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' &&
@ -3095,19 +3095,19 @@ return exports;
} }
function lib$es6$promise$then$$then(onFulfillment, onRejection) { function lib$es6$promise$then$$then(onFulfillment, onRejection) {
var parent = this; var parent = this;
var state = parent._state;
if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) {
return this;
}
var child = new this.constructor(lib$es6$promise$$internal$$noop); var child = new this.constructor(lib$es6$promise$$internal$$noop);
var result = parent._result;
if (child[lib$es6$promise$$internal$$PROMISE_ID] === undefined) {
lib$es6$promise$$internal$$makePromise(child);
}
var state = parent._state;
if (state) { if (state) {
var callback = arguments[state - 1]; var callback = arguments[state - 1];
lib$es6$promise$asap$$asap(function(){ lib$es6$promise$asap$$asap(function(){
lib$es6$promise$$internal$$invokeCallback(state, child, callback, result); lib$es6$promise$$internal$$invokeCallback(state, child, callback, parent._result);
}); });
} else { } else {
lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection); lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection);
@ -3129,6 +3129,7 @@ return exports;
return promise; return promise;
} }
var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve; var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve;
var lib$es6$promise$$internal$$PROMISE_ID = Math.random().toString(36).substring(16);
function lib$es6$promise$$internal$$noop() {} function lib$es6$promise$$internal$$noop() {}
@ -3359,6 +3360,18 @@ return exports;
} }
} }
var lib$es6$promise$$internal$$id = 0;
function lib$es6$promise$$internal$$nextId() {
return lib$es6$promise$$internal$$id++;
}
function lib$es6$promise$$internal$$makePromise(promise) {
promise[lib$es6$promise$$internal$$PROMISE_ID] = lib$es6$promise$$internal$$id++;
promise._state = undefined;
promise._result = undefined;
promise._subscribers = [];
}
function lib$es6$promise$promise$all$$all(entries) { function lib$es6$promise$promise$all$$all(entries) {
return new lib$es6$promise$enumerator$$default(this, entries).promise; return new lib$es6$promise$enumerator$$default(this, entries).promise;
} }
@ -3367,28 +3380,18 @@ return exports;
/*jshint validthis:true */ /*jshint validthis:true */
var Constructor = this; var Constructor = this;
var promise = new Constructor(lib$es6$promise$$internal$$noop);
if (!lib$es6$promise$utils$$isArray(entries)) { if (!lib$es6$promise$utils$$isArray(entries)) {
lib$es6$promise$$internal$$reject(promise, new TypeError('You must pass an array to race.')); return new Constructor(function(resolve, reject) {
return promise; reject(new TypeError('You must pass an array to race.'));
} });
} else {
return new Constructor(function(resolve, reject) {
var length = entries.length; var length = entries.length;
for (var i = 0; i < length; i++) {
function onFulfillment(value) { Constructor.resolve(entries[i]).then(resolve, reject);
lib$es6$promise$$internal$$resolve(promise, value);
} }
});
function onRejection(reason) {
lib$es6$promise$$internal$$reject(promise, reason);
} }
for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {
lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);
}
return promise;
} }
var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race; var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race;
function lib$es6$promise$promise$reject$$reject(reason) { function lib$es6$promise$promise$reject$$reject(reason) {
@ -3400,7 +3403,6 @@ return exports;
} }
var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject; var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject;
var lib$es6$promise$promise$$counter = 0;
function lib$es6$promise$promise$$needsResolver() { function lib$es6$promise$promise$$needsResolver() {
throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
@ -3515,9 +3517,8 @@ return exports;
@constructor @constructor
*/ */
function lib$es6$promise$promise$$Promise(resolver) { function lib$es6$promise$promise$$Promise(resolver) {
this._id = lib$es6$promise$promise$$counter++; this[lib$es6$promise$$internal$$PROMISE_ID] = lib$es6$promise$$internal$$nextId();
this._state = undefined; this._result = this._state = undefined;
this._result = undefined;
this._subscribers = []; this._subscribers = [];
if (lib$es6$promise$$internal$$noop !== resolver) { if (lib$es6$promise$$internal$$noop !== resolver) {
@ -3768,7 +3769,11 @@ return exports;
this._instanceConstructor = Constructor; this._instanceConstructor = Constructor;
this.promise = new Constructor(lib$es6$promise$$internal$$noop); this.promise = new Constructor(lib$es6$promise$$internal$$noop);
if (Array.isArray(input)) { if (!this.promise[lib$es6$promise$$internal$$PROMISE_ID]) {
lib$es6$promise$$internal$$makePromise(this.promise);
}
if (lib$es6$promise$utils$$isArray(input)) {
this._input = input; this._input = input;
this.length = input.length; this.length = input.length;
this._remaining = input.length; this._remaining = input.length;
@ -3785,13 +3790,13 @@ return exports;
} }
} }
} else { } else {
lib$es6$promise$$internal$$reject(this.promise, this._validationError()); lib$es6$promise$$internal$$reject(this.promise, lib$es6$promise$enumerator$$validationError());
} }
} }
lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function() { function lib$es6$promise$enumerator$$validationError() {
return new Error('Array Methods must be provided an Array'); return new Error('Array Methods must be provided an Array');
}; }
lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() { lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() {
var length = this.length; var length = this.length;
@ -3902,12 +3907,40 @@ return exports;
// shim for using process in browser // shim for using process in browser
var process = module.exports = {}; var process = module.exports = {};
// cached from whatever global is present so that test runners that stub it
// don't break things. But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals. It's inside a
// function because try/catches deoptimize in certain engines.
var cachedSetTimeout;
var cachedClearTimeout;
(function () {
try {
cachedSetTimeout = setTimeout;
} catch (e) {
cachedSetTimeout = function () {
throw new Error('setTimeout is not defined');
}
}
try {
cachedClearTimeout = clearTimeout;
} catch (e) {
cachedClearTimeout = function () {
throw new Error('clearTimeout is not defined');
}
}
} ())
var queue = []; var queue = [];
var draining = false; var draining = false;
var currentQueue; var currentQueue;
var queueIndex = -1; var queueIndex = -1;
function cleanUpNextTick() { function cleanUpNextTick() {
if (!draining || !currentQueue) {
return;
}
draining = false; draining = false;
if (currentQueue.length) { if (currentQueue.length) {
queue = currentQueue.concat(queue); queue = currentQueue.concat(queue);
@ -3923,7 +3956,7 @@ function drainQueue() {
if (draining) { if (draining) {
return; return;
} }
var timeout = setTimeout(cleanUpNextTick); var timeout = cachedSetTimeout(cleanUpNextTick);
draining = true; draining = true;
var len = queue.length; var len = queue.length;
@ -3940,7 +3973,7 @@ function drainQueue() {
} }
currentQueue = null; currentQueue = null;
draining = false; draining = false;
clearTimeout(timeout); cachedClearTimeout(timeout);
} }
process.nextTick = function (fun) { process.nextTick = function (fun) {
@ -3952,7 +3985,7 @@ process.nextTick = function (fun) {
} }
queue.push(new Item(fun, args)); queue.push(new Item(fun, args));
if (queue.length === 1 && !draining) { if (queue.length === 1 && !draining) {
setTimeout(drainQueue, 0); cachedSetTimeout(drainQueue, 0);
} }
}; };
@ -4773,7 +4806,7 @@ exports.default = {
debug: false, debug: false,
show_version: true, show_version: true,
show_comment: true, show_comment: true,
versionstring: "OpenPGP.js v2.3.2", versionstring: "OpenPGP.js v2.3.3",
commentstring: "http://openpgpjs.org", commentstring: "http://openpgpjs.org",
keyserver: "https://keyserver.ubuntu.com", keyserver: "https://keyserver.ubuntu.com",
node_store: './openpgp.store' node_store: './openpgp.store'
@ -12865,21 +12898,15 @@ exports.HKP = exports.AsyncProxy = exports.Keyring = exports.crypto = exports.co
var _openpgp = require('./openpgp'); var _openpgp = require('./openpgp');
var _loop = function _loop(_key3) { Object.keys(_openpgp).forEach(function (key) {
if (_key3 === "default") return 'continue'; if (key === "default") return;
Object.defineProperty(exports, _key3, { Object.defineProperty(exports, key, {
enumerable: true, enumerable: true,
get: function get() { get: function get() {
return _openpgp[_key3]; return _openpgp[key];
} }
}); });
}; });
for (var _key3 in _openpgp) {
var _ret = _loop(_key3);
if (_ret === 'continue') continue;
}
var _util = require('./util'); var _util = require('./util');
@ -12991,9 +13018,9 @@ Object.defineProperty(exports, 'HKP', {
var openpgp = _interopRequireWildcard(_openpgp); var openpgp = _interopRequireWildcard(_openpgp);
var _key2 = require('./key'); var _key = require('./key');
var keyMod = _interopRequireWildcard(_key2); var keyMod = _interopRequireWildcard(_key);
var _message = require('./message'); var _message = require('./message');
@ -14751,9 +14778,9 @@ Message.prototype.getText = function () {
Message.prototype.encrypt = function (keys, passwords) { Message.prototype.encrypt = function (keys, passwords) {
var _this2 = this; var _this2 = this;
var symAlgo = undefined, var symAlgo = void 0,
msg = undefined, msg = void 0,
symEncryptedPacket = undefined; symEncryptedPacket = void 0;
return Promise.resolve().then(function () { return Promise.resolve().then(function () {
if (keys) { if (keys) {
symAlgo = keyModule.getPreferredSymAlgo(keys); symAlgo = keyModule.getPreferredSymAlgo(keys);
@ -14857,6 +14884,9 @@ Message.prototype.sign = function (privateKeys) {
} }
onePassSig.publicKeyAlgorithm = signingKeyPacket.algorithm; onePassSig.publicKeyAlgorithm = signingKeyPacket.algorithm;
onePassSig.signingKeyId = signingKeyPacket.getKeyId(); onePassSig.signingKeyId = signingKeyPacket.getKeyId();
if (i === privateKeys.length - 1) {
onePassSig.flags = 1;
}
packetlist.push(onePassSig); packetlist.push(onePassSig);
} }
@ -15107,7 +15137,7 @@ _es6Promise2.default.polyfill(); // load ES6 Promises polyfill
// // // //
////////////////////////// //////////////////////////
var asyncProxy = undefined; // instance of the asyncproxy var asyncProxy = void 0; // instance of the asyncproxy
/** /**
* Set the path for the web worker script and create an instance of the async proxy * Set the path for the web worker script and create an instance of the async proxy
@ -15528,7 +15558,7 @@ function toArray(param) {
* @return {Message} a message object * @return {Message} a message object
*/ */
function createMessage(data, filename) { function createMessage(data, filename) {
var msg = undefined; var msg = void 0;
if (_util2.default.isUint8Array(data)) { if (_util2.default.isUint8Array(data)) {
msg = messageLib.fromBinary(data, filename); msg = messageLib.fromBinary(data, filename);
} else if (_util2.default.isString(data)) { } else if (_util2.default.isString(data)) {
@ -18012,41 +18042,48 @@ function Signature() {
* @return {module:packet/signature} object representation * @return {module:packet/signature} object representation
*/ */
Signature.prototype.read = function (bytes) { Signature.prototype.read = function (bytes) {
var _this = this;
var i = 0; var i = 0;
this.version = bytes[i++]; this.version = bytes[i++];
// switch on version (3 and 4) // switch on version (3 and 4)
switch (this.version) { var sigpos;
var sigDataLength;
(function () {
switch (_this.version) {
case 3: case 3:
// One-octet length of following hashed material. MUST be 5. // One-octet length of following hashed material. MUST be 5.
if (bytes[i++] !== 5) { if (bytes[i++] !== 5) {
_util2.default.print_debug("packet/signature.js\n" + 'invalid One-octet length of following hashed material.' + 'MUST be 5. @:' + (i - 1)); _util2.default.print_debug("packet/signature.js\n" + 'invalid One-octet length of following hashed material.' + 'MUST be 5. @:' + (i - 1));
} }
var sigpos = i; sigpos = i;
// One-octet signature type. // One-octet signature type.
this.signatureType = bytes[i++];
_this.signatureType = bytes[i++];
// Four-octet creation time. // Four-octet creation time.
this.created = _util2.default.readDate(bytes.subarray(i, i + 4)); _this.created = _util2.default.readDate(bytes.subarray(i, i + 4));
i += 4; i += 4;
// storing data appended to data which gets verified // storing data appended to data which gets verified
this.signatureData = bytes.subarray(sigpos, i); _this.signatureData = bytes.subarray(sigpos, i);
// Eight-octet Key ID of signer. // Eight-octet Key ID of signer.
this.issuerKeyId.read(bytes.subarray(i, i + 8)); _this.issuerKeyId.read(bytes.subarray(i, i + 8));
i += 8; i += 8;
// One-octet public-key algorithm. // One-octet public-key algorithm.
this.publicKeyAlgorithm = bytes[i++]; _this.publicKeyAlgorithm = bytes[i++];
// One-octet hash algorithm. // One-octet hash algorithm.
this.hashAlgorithm = bytes[i++]; _this.hashAlgorithm = bytes[i++];
break; break;
case 4: case 4:
this.signatureType = bytes[i++]; _this.signatureType = bytes[i++];
this.publicKeyAlgorithm = bytes[i++]; _this.publicKeyAlgorithm = bytes[i++];
this.hashAlgorithm = bytes[i++]; _this.hashAlgorithm = bytes[i++];
var subpackets = function subpackets(bytes) { var subpackets = function subpackets(bytes) {
// Two-octet scalar octet count for following subpacket data. // Two-octet scalar octet count for following subpacket data.
@ -18071,7 +18108,7 @@ Signature.prototype.read = function (bytes) {
// hashed subpackets // hashed subpackets
i += subpackets.call(this, bytes.subarray(i, bytes.length), true); i += subpackets.call(_this, bytes.subarray(i, bytes.length), true);
// A V4 signature hashes the packet body // A V4 signature hashes the packet body
// starting from its first field, the version number, through the end // starting from its first field, the version number, through the end
@ -18079,19 +18116,22 @@ Signature.prototype.read = function (bytes) {
// signature version, the signature type, the public-key algorithm, the // signature version, the signature type, the public-key algorithm, the
// hash algorithm, the hashed subpacket length, and the hashed // hash algorithm, the hashed subpacket length, and the hashed
// subpacket body. // subpacket body.
this.signatureData = bytes.subarray(0, i); _this.signatureData = bytes.subarray(0, i);
var sigDataLength = i; sigDataLength = i;
// unhashed subpackets // unhashed subpackets
i += subpackets.call(this, bytes.subarray(i, bytes.length), false);
this.unhashedSubpackets = bytes.subarray(sigDataLength, i); i += subpackets.call(_this, bytes.subarray(i, bytes.length), false);
_this.unhashedSubpackets = bytes.subarray(sigDataLength, i);
break; break;
default: default:
throw new Error('Version ' + this.version + ' of the signature is unsupported.'); throw new Error('Version ' + _this.version + ' of the signature is unsupported.');
} }
// Two-octet field holding left 16 bits of signed hash value. // Two-octet field holding left 16 bits of signed hash value.
})();
this.signedHashValue = bytes.subarray(i, i + 2); this.signedHashValue = bytes.subarray(i, i + 2);
i += 2; i += 2;
@ -18803,7 +18843,7 @@ SymEncryptedIntegrityProtected.prototype.encrypt = function (sessionKeyAlgorithm
* @return {Promise} * @return {Promise}
*/ */
SymEncryptedIntegrityProtected.prototype.decrypt = function (sessionKeyAlgorithm, key) { SymEncryptedIntegrityProtected.prototype.decrypt = function (sessionKeyAlgorithm, key) {
var decrypted = undefined; var decrypted = void 0;
if (sessionKeyAlgorithm.substr(0, 3) === 'aes') { if (sessionKeyAlgorithm.substr(0, 3) === 'aes') {
// AES optimizations. Native code for node, asmCrypto for browser. // AES optimizations. Native code for node, asmCrypto for browser.
decrypted = aesDecrypt(sessionKeyAlgorithm, this.encrypted, key); decrypted = aesDecrypt(sessionKeyAlgorithm, this.encrypted, key);
@ -18845,7 +18885,7 @@ function aesEncrypt(algo, prefix, pt, key) {
} }
function aesDecrypt(algo, ct, key) { function aesDecrypt(algo, ct, key) {
var pt = undefined; var pt = void 0;
if (nodeCrypto) { if (nodeCrypto) {
// Node crypto library. // Node crypto library.
pt = nodeDecrypt(algo, ct, key); pt = nodeDecrypt(algo, ct, key);

20
dist/openpgp.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
/*! OpenPGP.js v2.3.2 - 2016-06-08 - this is LGPL licensed code, see LICENSE/our website http://openpgpjs.org/ for more information. */!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){function d(a){for(var b in a)h.config[b]=a[b]}function e(a){a instanceof Uint8Array||(a=new Uint8Array(a)),h.crypto.random.randomBuffer.set(a)}function f(a,b){return"function"!=typeof h[a]?void g({event:"method-return",err:"Unknown Worker Event"}):(b=h.packet.clone.parseClonedPackets(b,a),void h[a](b).then(function(a){g({event:"method-return",data:h.packet.clone.clonePackets(a)})})["catch"](function(a){g({event:"method-return",err:a.message})}))}function g(a){h.crypto.random.randomBuffer.size<i&&self.postMessage({event:"request-seed"}),self.postMessage(a,h.util.getTransferables.call(h.util,a.data))}self.window={},importScripts("openpgp.min.js");var h=window.openpgp,i=4e4,j=6e4;h.crypto.random.randomBuffer.init(j),self.onmessage=function(a){var b=a.data||{};switch(b.event){case"configure":d(b.config);break;case"seed-random":e(b.buf);break;default:f(b.event,b.options||{})}}},{}]},{},[1]); /*! OpenPGP.js v2.3.3 - 2016-08-17 - this is LGPL licensed code, see LICENSE/our website http://openpgpjs.org/ for more information. */!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){function d(a){for(var b in a)h.config[b]=a[b]}function e(a){a instanceof Uint8Array||(a=new Uint8Array(a)),h.crypto.random.randomBuffer.set(a)}function f(a,b){return"function"!=typeof h[a]?void g({event:"method-return",err:"Unknown Worker Event"}):(b=h.packet.clone.parseClonedPackets(b,a),void h[a](b).then(function(a){g({event:"method-return",data:h.packet.clone.clonePackets(a)})})["catch"](function(a){g({event:"method-return",err:a.message})}))}function g(a){h.crypto.random.randomBuffer.size<i&&self.postMessage({event:"request-seed"}),self.postMessage(a,h.util.getTransferables.call(h.util,a.data))}self.window={},importScripts("openpgp.min.js");var h=window.openpgp,i=4e4,j=6e4;h.crypto.random.randomBuffer.init(j),self.onmessage=function(a){var b=a.data||{};switch(b.event){case"configure":d(b.config);break;case"seed-random":e(b.buf);break;default:f(b.event,b.options||{})}}},{}]},{},[1]);

2
npm-shrinkwrap.json generated
View File

@ -1,6 +1,6 @@
{ {
"name": "openpgp", "name": "openpgp",
"version": "2.3.2", "version": "2.3.3",
"dependencies": { "dependencies": {
"asmcrypto-lite": { "asmcrypto-lite": {
"version": "1.1.0", "version": "1.1.0",

View File

@ -1,7 +1,7 @@
{ {
"name": "openpgp", "name": "openpgp",
"description": "OpenPGP.js is a Javascript implementation of the OpenPGP protocol. This is defined in RFC 4880.", "description": "OpenPGP.js is a Javascript implementation of the OpenPGP protocol. This is defined in RFC 4880.",
"version": "2.3.2", "version": "2.3.3",
"license": "LGPL-3.0+", "license": "LGPL-3.0+",
"homepage": "http://openpgpjs.org/", "homepage": "http://openpgpjs.org/",
"engines": { "engines": {