documentation fixes
This commit is contained in:
parent
d3f42b2fc1
commit
08da24de27
|
@ -307,7 +307,6 @@ module.exports = {
|
||||||
"error",
|
"error",
|
||||||
"never"
|
"never"
|
||||||
],
|
],
|
||||||
"valid-jsdoc": "off",
|
|
||||||
"wrap-iife": "error",
|
"wrap-iife": "error",
|
||||||
"wrap-regex": "off",
|
"wrap-regex": "off",
|
||||||
"yield-star-spacing": "error",
|
"yield-star-spacing": "error",
|
||||||
|
@ -338,6 +337,7 @@ module.exports = {
|
||||||
"indent": [ 0, 2, { "SwitchCase": 1 } ],
|
"indent": [ 0, 2, { "SwitchCase": 1 } ],
|
||||||
|
|
||||||
// TODO Consider fixing these:
|
// TODO Consider fixing these:
|
||||||
|
"valid-jsdoc": 0,
|
||||||
"new-cap": [ 0, { "properties": false, "capIsNewExceptionPattern": "^type_.*" }],
|
"new-cap": [ 0, { "properties": false, "capIsNewExceptionPattern": "^type_.*" }],
|
||||||
"no-lonely-if": 0,
|
"no-lonely-if": 0,
|
||||||
"no-fallthrough": 0,
|
"no-fallthrough": 0,
|
||||||
|
|
26
Gruntfile.js
26
Gruntfile.js
|
@ -1,29 +1,5 @@
|
||||||
module.exports = function(grunt) {
|
module.exports = function(grunt) {
|
||||||
|
|
||||||
var lintFiles = [
|
|
||||||
'src/config/**/*.js',
|
|
||||||
'src/crypto/cipher/aes.js',
|
|
||||||
'src/crypto/cipher/blowfish.js',
|
|
||||||
'src/crypto/cipher/cast5.js',
|
|
||||||
'src/crypto/cipher/des.js',
|
|
||||||
'src/crypto/cipher/index.js',
|
|
||||||
'src/crypto/hash/index.js',
|
|
||||||
'src/crypto/hash/md5.js',
|
|
||||||
'src/crypto/public_key/dsa.js',
|
|
||||||
'src/crypto/public_key/elgamal.js',
|
|
||||||
'src/crypto/public_key/index.js',
|
|
||||||
'src/crypto/public_key/rsa.js',
|
|
||||||
'src/crypto/public_key/elliptic/*.js',
|
|
||||||
'src/crypto/*.js',
|
|
||||||
'src/encoding/**/*.js',
|
|
||||||
'src/hkp/**/*.js',
|
|
||||||
'src/keyring/**/*.js',
|
|
||||||
'src/packet/**/*.js',
|
|
||||||
'src/type/**/*.js',
|
|
||||||
'src/worker/**/*.js',
|
|
||||||
'src/*.js'
|
|
||||||
]; // add more over time ... goal should be 100% coverage
|
|
||||||
|
|
||||||
var version = grunt.option('release');
|
var version = grunt.option('release');
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var browser_capabilities;
|
var browser_capabilities;
|
||||||
|
@ -179,7 +155,7 @@ module.exports = function(grunt) {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
eslint: {
|
eslint: {
|
||||||
target: lintFiles,
|
target: ['src/**/*.js'],
|
||||||
options: { configFile: '.eslintrc.js' }
|
options: { configFile: '.eslintrc.js' }
|
||||||
},
|
},
|
||||||
jsdoc: {
|
jsdoc: {
|
||||||
|
|
27
README.md
27
README.md
|
@ -112,7 +112,7 @@ openpgp.encrypt(options).then(function(ciphertext) {
|
||||||
```js
|
```js
|
||||||
options = {
|
options = {
|
||||||
message: openpgp.message.read(encrypted), // parse encrypted bytes
|
message: openpgp.message.read(encrypted), // parse encrypted bytes
|
||||||
password: 'secret stuff', // decrypt with password
|
passwords: ['secret stuff'], // decrypt with password
|
||||||
format: 'binary' // output as Uint8Array
|
format: 'binary' // output as Uint8Array
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -131,12 +131,12 @@ var privkey = '-----BEGIN PGP PRIVATE KEY BLOCK ... END PGP PRIVATE KEY BLOCK---
|
||||||
var passphrase = 'secret passphrase'; //what the privKey is encrypted with
|
var passphrase = 'secret passphrase'; //what the privKey is encrypted with
|
||||||
|
|
||||||
var privKeyObj = openpgp.key.readArmored(privkey).keys[0];
|
var privKeyObj = openpgp.key.readArmored(privkey).keys[0];
|
||||||
privKeyObj.decrypt(passphrase);
|
await privKeyObj.decrypt(passphrase);
|
||||||
|
|
||||||
options = {
|
options = {
|
||||||
data: 'Hello, World!', // input as String (or Uint8Array)
|
data: 'Hello, World!', // input as String (or Uint8Array)
|
||||||
publicKeys: openpgp.key.readArmored(pubkey).keys, // for encryption
|
publicKeys: openpgp.key.readArmored(pubkey).keys, // for encryption
|
||||||
privateKeys: privKeyObj // for signing (optional)
|
privateKeys: [privKeyObj] // for signing (optional)
|
||||||
};
|
};
|
||||||
|
|
||||||
openpgp.encrypt(options).then(function(ciphertext) {
|
openpgp.encrypt(options).then(function(ciphertext) {
|
||||||
|
@ -148,7 +148,7 @@ openpgp.encrypt(options).then(function(ciphertext) {
|
||||||
options = {
|
options = {
|
||||||
message: openpgp.message.readArmored(encrypted), // parse armored message
|
message: openpgp.message.readArmored(encrypted), // parse armored message
|
||||||
publicKeys: openpgp.key.readArmored(pubkey).keys, // for verification (optional)
|
publicKeys: openpgp.key.readArmored(pubkey).keys, // for verification (optional)
|
||||||
privateKey: privKeyObj // for decryption
|
privateKeys: [privKeyObj] // for decryption
|
||||||
};
|
};
|
||||||
|
|
||||||
openpgp.decrypt(options).then(function(plaintext) {
|
openpgp.decrypt(options).then(function(plaintext) {
|
||||||
|
@ -171,9 +171,7 @@ options = {
|
||||||
compression: openpgp.enums.compression.zip // compress the data with zip
|
compression: openpgp.enums.compression.zip // compress the data with zip
|
||||||
};
|
};
|
||||||
|
|
||||||
openpgp.encrypt(options).then(function(ciphertext) {
|
ciphertext = await openpgp.encrypt(options); // use ciphertext
|
||||||
// use ciphertext
|
|
||||||
});
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Or, override the config to enable compression:
|
Or, override the config to enable compression:
|
||||||
|
@ -200,10 +198,15 @@ var options = {
|
||||||
```
|
```
|
||||||
|
|
||||||
ECC keys:
|
ECC keys:
|
||||||
|
|
||||||
|
Possible values for curve are curve25519, ed25519, p256, p384, p521, or secp256k1.
|
||||||
|
Note that options both curve25519 and ed25519 generate a primary key for signing using Ed25519
|
||||||
|
and a subkey for encryption using Curve25519.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
var options = {
|
var options = {
|
||||||
userIds: [{ name:'Jon Smith', email:'jon@example.com' }], // multiple user IDs
|
userIds: [{ name:'Jon Smith', email:'jon@example.com' }], // multiple user IDs
|
||||||
curve: "ed25519", // ECC curve (curve25519, p256, p384, p521, or secp256k1)
|
curve: "ed25519", // ECC curve name
|
||||||
passphrase: 'super long and hard to guess secret' // protects the private key
|
passphrase: 'super long and hard to guess secret' // protects the private key
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
@ -249,13 +252,13 @@ var privkey = '-----BEGIN PGP PRIVATE KEY BLOCK ... END PGP PRIVATE KEY BLOCK---
|
||||||
var passphrase = 'secret passphrase'; //what the privKey is encrypted with
|
var passphrase = 'secret passphrase'; //what the privKey is encrypted with
|
||||||
|
|
||||||
var privKeyObj = openpgp.key.readArmored(privkey).keys[0];
|
var privKeyObj = openpgp.key.readArmored(privkey).keys[0];
|
||||||
privKeyObj.decrypt(passphrase);
|
await privKeyObj.decrypt(passphrase);
|
||||||
```
|
```
|
||||||
|
|
||||||
```js
|
```js
|
||||||
options = {
|
options = {
|
||||||
data: 'Hello, World!', // input as String (or Uint8Array)
|
data: 'Hello, World!', // input as String (or Uint8Array)
|
||||||
privateKeys: privKeyObj // for signing
|
privateKeys: [privKeyObj] // for signing
|
||||||
};
|
};
|
||||||
|
|
||||||
openpgp.sign(options).then(function(signed) {
|
openpgp.sign(options).then(function(signed) {
|
||||||
|
@ -287,13 +290,13 @@ var privkey = '-----BEGIN PGP PRIVATE KEY BLOCK ... END PGP PRIVATE KEY BLOCK---
|
||||||
var passphrase = 'secret passphrase'; //what the privKey is encrypted with
|
var passphrase = 'secret passphrase'; //what the privKey is encrypted with
|
||||||
|
|
||||||
var privKeyObj = openpgp.key.readArmored(privkey).keys[0];
|
var privKeyObj = openpgp.key.readArmored(privkey).keys[0];
|
||||||
privKeyObj.decrypt(passphrase);
|
await privKeyObj.decrypt(passphrase);
|
||||||
```
|
```
|
||||||
|
|
||||||
```js
|
```js
|
||||||
options = {
|
options = {
|
||||||
data: 'Hello, World!', // input as String (or Uint8Array)
|
data: 'Hello, World!', // input as String (or Uint8Array)
|
||||||
privateKeys: privKeyObj, // for signing
|
privateKeys: [privKeyObj], // for signing
|
||||||
detached: true
|
detached: true
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,6 @@ import { createVerificationObjects, createSignaturePackets } from './message';
|
||||||
* @param {String} text The cleartext of the signed message
|
* @param {String} text The cleartext of the signed message
|
||||||
* @param {module:signature} signature The detached signature or an empty signature if message not yet signed
|
* @param {module:signature} signature The detached signature or an empty signature if message not yet signed
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export function CleartextMessage(text, signature) {
|
export function CleartextMessage(text, signature) {
|
||||||
if (!(this instanceof CleartextMessage)) {
|
if (!(this instanceof CleartextMessage)) {
|
||||||
return new CleartextMessage(text, signature);
|
return new CleartextMessage(text, signature);
|
||||||
|
@ -53,7 +52,7 @@ export function CleartextMessage(text, signature) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the key IDs of the keys that signed the cleartext message
|
* Returns the key IDs of the keys that signed the cleartext message
|
||||||
* @return {Array<module:type/keyid>} array of keyid objects
|
* @returns {Array<module:type/keyid>} array of keyid objects
|
||||||
*/
|
*/
|
||||||
CleartextMessage.prototype.getSigningKeyIds = function() {
|
CleartextMessage.prototype.getSigningKeyIds = function() {
|
||||||
const keyIds = [];
|
const keyIds = [];
|
||||||
|
@ -69,7 +68,8 @@ CleartextMessage.prototype.getSigningKeyIds = function() {
|
||||||
* @param {Array<module:key~Key>} privateKeys private keys with decrypted secret key data for signing
|
* @param {Array<module:key~Key>} privateKeys private keys with decrypted secret key data for signing
|
||||||
* @param {Signature} signature (optional) any existing detached signature
|
* @param {Signature} signature (optional) any existing detached signature
|
||||||
* @param {Date} date (optional) The creation time of the signature that should be created
|
* @param {Date} date (optional) The creation time of the signature that should be created
|
||||||
* @return {module:message~CleartextMessage} new cleartext message with signed content
|
* @returns {Promise<module:message~CleartextMessage>} new cleartext message with signed content
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
CleartextMessage.prototype.sign = async function(privateKeys, signature=null, date=new Date()) {
|
CleartextMessage.prototype.sign = async function(privateKeys, signature=null, date=new Date()) {
|
||||||
return new CleartextMessage(this.text, await this.signDetached(privateKeys, signature, date));
|
return new CleartextMessage(this.text, await this.signDetached(privateKeys, signature, date));
|
||||||
|
@ -80,7 +80,8 @@ CleartextMessage.prototype.sign = async function(privateKeys, signature=null, da
|
||||||
* @param {Array<module:key~Key>} privateKeys private keys with decrypted secret key data for signing
|
* @param {Array<module:key~Key>} privateKeys private keys with decrypted secret key data for signing
|
||||||
* @param {Signature} signature (optional) any existing detached signature
|
* @param {Signature} signature (optional) any existing detached signature
|
||||||
* @param {Date} date (optional) The creation time of the signature that should be created
|
* @param {Date} date (optional) The creation time of the signature that should be created
|
||||||
* @return {module:signature~Signature} new detached signature of message content
|
* @returns {Promise<module:signature~Signature>} new detached signature of message content
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
CleartextMessage.prototype.signDetached = async function(privateKeys, signature=null, date=new Date()) {
|
CleartextMessage.prototype.signDetached = async function(privateKeys, signature=null, date=new Date()) {
|
||||||
const literalDataPacket = new packet.Literal();
|
const literalDataPacket = new packet.Literal();
|
||||||
|
@ -93,7 +94,8 @@ CleartextMessage.prototype.signDetached = async function(privateKeys, signature=
|
||||||
* Verify signatures of cleartext signed message
|
* Verify signatures of cleartext signed message
|
||||||
* @param {Array<module:key~Key>} keys array of keys to verify signatures
|
* @param {Array<module:key~Key>} keys array of keys to verify signatures
|
||||||
* @param {Date} date (optional) Verify the signature against the given date, i.e. check signature creation time < date < expiration time
|
* @param {Date} date (optional) Verify the signature against the given date, i.e. check signature creation time < date < expiration time
|
||||||
* @return {Array<{keyid: module:type/keyid, valid: Boolean}>} list of signer's keyid and validity of signature
|
* @returns {Promise<Array<{keyid: module:type/keyid, valid: Boolean}>>} list of signer's keyid and validity of signature
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
CleartextMessage.prototype.verify = function(keys, date=new Date()) {
|
CleartextMessage.prototype.verify = function(keys, date=new Date()) {
|
||||||
return this.verifyDetached(this.signature, keys, date);
|
return this.verifyDetached(this.signature, keys, date);
|
||||||
|
@ -103,7 +105,8 @@ CleartextMessage.prototype.verify = function(keys, date=new Date()) {
|
||||||
* Verify signatures of cleartext signed message
|
* Verify signatures of cleartext signed message
|
||||||
* @param {Array<module:key~Key>} keys array of keys to verify signatures
|
* @param {Array<module:key~Key>} keys array of keys to verify signatures
|
||||||
* @param {Date} date (optional) Verify the signature against the given date, i.e. check signature creation time < date < expiration time
|
* @param {Date} date (optional) Verify the signature against the given date, i.e. check signature creation time < date < expiration time
|
||||||
* @return {Array<{keyid: module:type/keyid, valid: Boolean}>} list of signer's keyid and validity of signature
|
* @returns {Promise<Array<{keyid: module:type/keyid, valid: Boolean}>>} list of signer's keyid and validity of signature
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
CleartextMessage.prototype.verifyDetached = function(signature, keys, date=new Date()) {
|
CleartextMessage.prototype.verifyDetached = function(signature, keys, date=new Date()) {
|
||||||
const signatureList = signature.packets;
|
const signatureList = signature.packets;
|
||||||
|
@ -115,7 +118,7 @@ CleartextMessage.prototype.verifyDetached = function(signature, keys, date=new D
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get cleartext
|
* Get cleartext
|
||||||
* @return {String} cleartext of message
|
* @returns {String} cleartext of message
|
||||||
*/
|
*/
|
||||||
CleartextMessage.prototype.getText = function() {
|
CleartextMessage.prototype.getText = function() {
|
||||||
// normalize end of line to \n
|
// normalize end of line to \n
|
||||||
|
@ -124,7 +127,7 @@ CleartextMessage.prototype.getText = function() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns ASCII armored text of cleartext signed message
|
* Returns ASCII armored text of cleartext signed message
|
||||||
* @return {String} ASCII armor
|
* @returns {String} ASCII armor
|
||||||
*/
|
*/
|
||||||
CleartextMessage.prototype.armor = function() {
|
CleartextMessage.prototype.armor = function() {
|
||||||
let hashes = this.signature.packets.map(function(packet) {
|
let hashes = this.signature.packets.map(function(packet) {
|
||||||
|
@ -143,7 +146,7 @@ CleartextMessage.prototype.armor = function() {
|
||||||
/**
|
/**
|
||||||
* reads an OpenPGP cleartext signed message and returns a CleartextMessage object
|
* reads an OpenPGP cleartext signed message and returns a CleartextMessage object
|
||||||
* @param {String} armoredText text to be parsed
|
* @param {String} armoredText text to be parsed
|
||||||
* @return {module:cleartext~CleartextMessage} new cleartext message object
|
* @returns {module:cleartext~CleartextMessage} new cleartext message object
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
export function readArmored(armoredText) {
|
export function readArmored(armoredText) {
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* @module config/config
|
* @module config/config
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import enums from '../enums.js';
|
import enums from '../enums';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
/** @property {Integer} prefer_hash_algorithm Default hash algorithm {@link module:enums.hash} */
|
/** @property {Integer} prefer_hash_algorithm Default hash algorithm {@link module:enums.hash} */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/**
|
/**
|
||||||
|
* @fileoverview This object contains global configuration values.
|
||||||
* @see module:config/config
|
* @see module:config/config
|
||||||
* @module config
|
* @module config
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
/**
|
/**
|
||||||
* This object storing and retrieving configuration from HTML5 local storage.
|
|
||||||
* @module config/localStorage
|
* @module config/localStorage
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* This object is used for storing and retrieving configuration from HTML5 local storage.
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function LocalStorage() {}
|
function LocalStorage() {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads the config out of the HTML5 local storage
|
* Reads the config out of the HTML5 local storage
|
||||||
|
@ -30,3 +30,5 @@ LocalStorage.prototype.read = function () {
|
||||||
LocalStorage.prototype.write = function () {
|
LocalStorage.prototype.write = function () {
|
||||||
window.localStorage.setItem("config", JSON.stringify(this.config));
|
window.localStorage.setItem("config", JSON.stringify(this.config));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default LocalStorage;
|
||||||
|
|
|
@ -40,7 +40,7 @@ export default {
|
||||||
* IV should be used or not. The encrypteddatapacket uses the
|
* IV should be used or not. The encrypteddatapacket uses the
|
||||||
* "old" style with a resync. Encryption within an
|
* "old" style with a resync. Encryption within an
|
||||||
* encryptedintegrityprotecteddata packet is not resyncing the IV.
|
* encryptedintegrityprotecteddata packet is not resyncing the IV.
|
||||||
* @return {Uint8Array} encrypted data
|
* @returns {Uint8Array} encrypted data
|
||||||
*/
|
*/
|
||||||
encrypt: function(prefixrandom, cipherfn, plaintext, key, resync) {
|
encrypt: function(prefixrandom, cipherfn, plaintext, key, resync) {
|
||||||
cipherfn = new cipher[cipherfn](key);
|
cipherfn = new cipher[cipherfn](key);
|
||||||
|
@ -133,7 +133,7 @@ export default {
|
||||||
* @param {Uint8Array} key Uint8Array representation of key to be used to check the mdc
|
* @param {Uint8Array} key Uint8Array representation of key to be used to check the mdc
|
||||||
* This will be passed to the cipherfn
|
* This will be passed to the cipherfn
|
||||||
* @param {Uint8Array} ciphertext The encrypted data
|
* @param {Uint8Array} ciphertext The encrypted data
|
||||||
* @return {Uint8Array} plaintext Data of D(ciphertext) with blocksize length +2
|
* @returns {Uint8Array} plaintext Data of D(ciphertext) with blocksize length +2
|
||||||
*/
|
*/
|
||||||
mdc: function(cipherfn, key, ciphertext) {
|
mdc: function(cipherfn, key, ciphertext) {
|
||||||
cipherfn = new cipher[cipherfn](key);
|
cipherfn = new cipher[cipherfn](key);
|
||||||
|
@ -175,7 +175,7 @@ export default {
|
||||||
* IV should be used or not. The encrypteddatapacket uses the
|
* IV should be used or not. The encrypteddatapacket uses the
|
||||||
* "old" style with a resync. Decryption within an
|
* "old" style with a resync. Decryption within an
|
||||||
* encryptedintegrityprotecteddata packet is not resyncing the IV.
|
* encryptedintegrityprotecteddata packet is not resyncing the IV.
|
||||||
* @return {Uint8Array} the plaintext data
|
* @returns {Uint8Array} the plaintext data
|
||||||
*/
|
*/
|
||||||
|
|
||||||
decrypt: function(cipherfn, key, ciphertext, resync) {
|
decrypt: function(cipherfn, key, ciphertext, resync) {
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
import { AES_ECB } from 'asmcrypto.js/src/aes/ecb/exports';
|
import { AES_ECB } from 'asmcrypto.js/src/aes/ecb/exports';
|
||||||
|
|
||||||
// TODO use webCrypto or nodeCrypto when possible.
|
// TODO use webCrypto or nodeCrypto when possible.
|
||||||
export default function aes(length) {
|
function aes(length) {
|
||||||
const c = function(key) {
|
const c = function(key) {
|
||||||
this.key = Uint8Array.from(key);
|
this.key = Uint8Array.from(key);
|
||||||
|
|
||||||
|
@ -26,3 +26,5 @@ export default function aes(length) {
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default aes;
|
||||||
|
|
|
@ -388,7 +388,7 @@ Blowfish.prototype.init = function(key) {
|
||||||
|
|
||||||
// added by Recurity Labs
|
// added by Recurity Labs
|
||||||
|
|
||||||
export default function BF(key) {
|
function BF(key) {
|
||||||
this.bf = new Blowfish();
|
this.bf = new Blowfish();
|
||||||
this.bf.init(key);
|
this.bf.init(key);
|
||||||
|
|
||||||
|
@ -396,5 +396,8 @@ export default function BF(key) {
|
||||||
return this.bf.encrypt_block(block);
|
return this.bf.encrypt_block(block);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
BF.keySize = BF.prototype.keySize = 16;
|
BF.keySize = BF.prototype.keySize = 16;
|
||||||
BF.blockSize = BF.prototype.blockSize = 16;
|
BF.blockSize = BF.prototype.blockSize = 16;
|
||||||
|
|
||||||
|
export default BF;
|
||||||
|
|
|
@ -597,7 +597,7 @@ function OpenpgpSymencCast5() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function Cast5(key) {
|
function Cast5(key) {
|
||||||
this.cast5 = new OpenpgpSymencCast5();
|
this.cast5 = new OpenpgpSymencCast5();
|
||||||
this.cast5.setKey(key);
|
this.cast5.setKey(key);
|
||||||
|
|
||||||
|
@ -608,3 +608,5 @@ export default function Cast5(key) {
|
||||||
|
|
||||||
Cast5.blockSize = Cast5.prototype.blockSize = 8;
|
Cast5.blockSize = Cast5.prototype.blockSize = 8;
|
||||||
Cast5.keySize = Cast5.prototype.keySize = 16;
|
Cast5.keySize = Cast5.prototype.keySize = 16;
|
||||||
|
|
||||||
|
export default Cast5;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/**
|
/**
|
||||||
|
* @fileoverview Symmetric cryptography functions
|
||||||
* @requires crypto/cipher/aes
|
* @requires crypto/cipher/aes
|
||||||
* @requires crypto/cipher/des
|
* @requires crypto/cipher/des
|
||||||
* @requires crypto/cipher/cast5
|
* @requires crypto/cipher/cast5
|
||||||
|
|
|
@ -337,7 +337,7 @@ function createTwofish() {
|
||||||
|
|
||||||
// added by Recurity Labs
|
// added by Recurity Labs
|
||||||
|
|
||||||
export default function TF(key) {
|
function TF(key) {
|
||||||
this.tf = createTwofish();
|
this.tf = createTwofish();
|
||||||
this.tf.open(toArray(key), 0);
|
this.tf.open(toArray(key), 0);
|
||||||
|
|
||||||
|
@ -357,3 +357,5 @@ function toArray(typedArray) {
|
||||||
|
|
||||||
TF.keySize = TF.prototype.keySize = 32;
|
TF.keySize = TF.prototype.keySize = 32;
|
||||||
TF.blockSize = TF.prototype.blockSize = 16;
|
TF.blockSize = TF.prototype.blockSize = 16;
|
||||||
|
|
||||||
|
export default TF;
|
||||||
|
|
|
@ -59,8 +59,9 @@ export default {
|
||||||
module:type/kdf_params>} pub_params Algorithm-specific public key parameters
|
module:type/kdf_params>} pub_params Algorithm-specific public key parameters
|
||||||
* @param {module:type/mpi} data Data to be encrypted as MPI
|
* @param {module:type/mpi} data Data to be encrypted as MPI
|
||||||
* @param {String} fingerprint Recipient fingerprint
|
* @param {String} fingerprint Recipient fingerprint
|
||||||
* @return {Array<module:type/mpi|
|
* @returns {Array<module:type/mpi|
|
||||||
module:type/ecdh_symkey>} encrypted session key parameters
|
* module:type/ecdh_symkey>} encrypted session key parameters
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
publicKeyEncrypt: async function(algo, pub_params, data, fingerprint) {
|
publicKeyEncrypt: async function(algo, pub_params, data, fingerprint) {
|
||||||
const types = this.getEncSessionKeyParamTypes(algo);
|
const types = this.getEncSessionKeyParamTypes(algo);
|
||||||
|
@ -107,7 +108,8 @@ export default {
|
||||||
module:type/ecdh_symkey>}
|
module:type/ecdh_symkey>}
|
||||||
data_params encrypted session key parameters
|
data_params encrypted session key parameters
|
||||||
* @param {String} fingerprint Recipient fingerprint
|
* @param {String} fingerprint Recipient fingerprint
|
||||||
* @return {module:type/mpi} An MPI containing the decrypted data
|
* @returns {module:type/mpi} An MPI containing the decrypted data
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
publicKeyDecrypt: async function(algo, key_params, data_params, fingerprint) {
|
publicKeyDecrypt: async function(algo, key_params, data_params, fingerprint) {
|
||||||
return new type_mpi(await (async function() {
|
return new type_mpi(await (async function() {
|
||||||
|
@ -147,7 +149,7 @@ export default {
|
||||||
|
|
||||||
/** Returns the types comprising the private key of an algorithm
|
/** Returns the types comprising the private key of an algorithm
|
||||||
* @param {String} algo The public key algorithm
|
* @param {String} algo The public key algorithm
|
||||||
* @return {Array<String>} The array of types
|
* @returns {Array<String>} The array of types
|
||||||
*/
|
*/
|
||||||
getPrivKeyParamTypes: function(algo) {
|
getPrivKeyParamTypes: function(algo) {
|
||||||
switch (algo) {
|
switch (algo) {
|
||||||
|
@ -181,7 +183,7 @@ export default {
|
||||||
|
|
||||||
/** Returns the types comprising the public key of an algorithm
|
/** Returns the types comprising the public key of an algorithm
|
||||||
* @param {String} algo The public key algorithm
|
* @param {String} algo The public key algorithm
|
||||||
* @return {Array<String>} The array of types
|
* @returns {Array<String>} The array of types
|
||||||
*/
|
*/
|
||||||
getPubKeyParamTypes: function(algo) {
|
getPubKeyParamTypes: function(algo) {
|
||||||
switch (algo) {
|
switch (algo) {
|
||||||
|
@ -224,7 +226,7 @@ export default {
|
||||||
|
|
||||||
/** Returns the types comprising the encrypted session key of an algorithm
|
/** Returns the types comprising the encrypted session key of an algorithm
|
||||||
* @param {String} algo The public key algorithm
|
* @param {String} algo The public key algorithm
|
||||||
* @return {Array<String>} The array of types
|
* @returns {Array<String>} The array of types
|
||||||
*/
|
*/
|
||||||
getEncSessionKeyParamTypes: function(algo) {
|
getEncSessionKeyParamTypes: function(algo) {
|
||||||
switch (algo) {
|
switch (algo) {
|
||||||
|
@ -253,7 +255,8 @@ export default {
|
||||||
* @param {String} algo The public key algorithm
|
* @param {String} algo The public key algorithm
|
||||||
* @param {Integer} bits Bit length for RSA keys
|
* @param {Integer} bits Bit length for RSA keys
|
||||||
* @param {module:type/oid} oid Object identifier for ECC keys
|
* @param {module:type/oid} oid Object identifier for ECC keys
|
||||||
* @return {Array} The array of parameters
|
* @returns {Array} The array of parameters
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
generateParams: function(algo, bits, oid) {
|
generateParams: function(algo, bits, oid) {
|
||||||
const types = [].concat(this.getPubKeyParamTypes(algo), this.getPrivKeyParamTypes(algo));
|
const types = [].concat(this.getPubKeyParamTypes(algo), this.getPrivKeyParamTypes(algo));
|
||||||
|
@ -288,8 +291,8 @@ export default {
|
||||||
* Generates a random byte prefix for the specified algorithm
|
* Generates a random byte prefix for the specified algorithm
|
||||||
* See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2} for algorithms.
|
* See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2} for algorithms.
|
||||||
* @param {module:enums.symmetric} algo Symmetric encryption algorithm
|
* @param {module:enums.symmetric} algo Symmetric encryption algorithm
|
||||||
* @return {Uint8Array} Random bytes with length equal to the block
|
* @returns {Uint8Array} Random bytes with length equal to the block size of the cipher
|
||||||
* size of the cipher
|
* @async
|
||||||
*/
|
*/
|
||||||
getPrefixRandom: function(algo) {
|
getPrefixRandom: function(algo) {
|
||||||
return random.getRandomBytes(cipher[algo].blockSize);
|
return random.getRandomBytes(cipher[algo].blockSize);
|
||||||
|
@ -297,8 +300,10 @@ export default {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generating a session key for the specified symmetric algorithm
|
* Generating a session key for the specified symmetric algorithm
|
||||||
* @param {module:enums.symmetric} algo Algorithm to use (see {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2})
|
* See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2} for algorithms.
|
||||||
* @return {Uint8Array} Random bytes as a string to be used as a key
|
* @param {module:enums.symmetric} algo Symmetric encryption algorithm
|
||||||
|
* @returns {Uint8Array} Random bytes as a string to be used as a key
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
generateSessionKey: function(algo) {
|
generateSessionKey: function(algo) {
|
||||||
return random.getRandomBytes(cipher[algo].keySize);
|
return random.getRandomBytes(cipher[algo].keySize);
|
||||||
|
|
|
@ -42,7 +42,7 @@ const ALGO = 'AES-GCM';
|
||||||
* @param {Uint8Array} plaintext The cleartext input to be encrypted
|
* @param {Uint8Array} plaintext The cleartext input to be encrypted
|
||||||
* @param {Uint8Array} key The encryption key
|
* @param {Uint8Array} key The encryption key
|
||||||
* @param {Uint8Array} iv The initialization vector (12 bytes)
|
* @param {Uint8Array} iv The initialization vector (12 bytes)
|
||||||
* @return {Promise<Uint8Array>} The ciphertext output
|
* @returns {Promise<Uint8Array>} The ciphertext output
|
||||||
*/
|
*/
|
||||||
function encrypt(cipher, plaintext, key, iv) {
|
function encrypt(cipher, plaintext, key, iv) {
|
||||||
if (cipher.substr(0, 3) !== 'aes') {
|
if (cipher.substr(0, 3) !== 'aes') {
|
||||||
|
@ -63,7 +63,7 @@ function encrypt(cipher, plaintext, key, iv) {
|
||||||
* @param {Uint8Array} ciphertext The ciphertext input to be decrypted
|
* @param {Uint8Array} ciphertext The ciphertext input to be decrypted
|
||||||
* @param {Uint8Array} key The encryption key
|
* @param {Uint8Array} key The encryption key
|
||||||
* @param {Uint8Array} iv The initialization vector (12 bytes)
|
* @param {Uint8Array} iv The initialization vector (12 bytes)
|
||||||
* @return {Promise<Uint8Array>} The plaintext output
|
* @returns {Promise<Uint8Array>} The plaintext output
|
||||||
*/
|
*/
|
||||||
function decrypt(cipher, ciphertext, key, iv) {
|
function decrypt(cipher, ciphertext, key, iv) {
|
||||||
if (cipher.substr(0, 3) !== 'aes') {
|
if (cipher.substr(0, 3) !== 'aes') {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/**
|
/**
|
||||||
|
* @fileoverview Hashing functions
|
||||||
* @requires rusha
|
* @requires rusha
|
||||||
* @requires asmcrypto.js
|
* @requires asmcrypto.js
|
||||||
* @requires hash.js
|
* @requires hash.js
|
||||||
|
@ -81,7 +82,7 @@ export default {
|
||||||
* Create a hash on the specified data using the specified algorithm
|
* Create a hash on the specified data using the specified algorithm
|
||||||
* @param {module:enums.hash} algo Hash algorithm type (see {@link https://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4})
|
* @param {module:enums.hash} algo Hash algorithm type (see {@link https://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4})
|
||||||
* @param {Uint8Array} data Data to be hashed
|
* @param {Uint8Array} data Data to be hashed
|
||||||
* @return {Uint8Array} hash value
|
* @returns {Uint8Array} hash value
|
||||||
*/
|
*/
|
||||||
digest: function(algo, data) {
|
digest: function(algo, data) {
|
||||||
switch (algo) {
|
switch (algo) {
|
||||||
|
@ -114,7 +115,7 @@ export default {
|
||||||
/**
|
/**
|
||||||
* Returns the hash size in bytes of the specified hash algorithm type
|
* Returns the hash size in bytes of the specified hash algorithm type
|
||||||
* @param {module:enums.hash} algo Hash algorithm type (See {@link https://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4})
|
* @param {module:enums.hash} algo Hash algorithm type (See {@link https://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4})
|
||||||
* @return {Integer} Size in bytes of the resulting hash
|
* @returns {Integer} Size in bytes of the resulting hash
|
||||||
*/
|
*/
|
||||||
getHashByteLength: function(algo) {
|
getHashByteLength: function(algo) {
|
||||||
switch (algo) {
|
switch (algo) {
|
||||||
|
|
|
@ -17,16 +17,15 @@
|
||||||
* @module crypto/hash/md5
|
* @module crypto/hash/md5
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import util from '../../util.js';
|
import util from '../../util';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MD5 hash
|
* MD5 hash
|
||||||
* @param {String} entree string to hash
|
* @param {String} entree string to hash
|
||||||
*/
|
*/
|
||||||
export default function(entree) {
|
function md5(entree) {
|
||||||
const hex = md5(util.Uint8Array_to_str(entree));
|
const digest = md51(util.Uint8Array_to_str(entree));
|
||||||
const bin = util.str_to_Uint8Array(util.hex_to_str(hex));
|
return util.hex_to_Uint8Array(hex(digest));
|
||||||
return bin;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function md5cycle(x, k) {
|
function md5cycle(x, k) {
|
||||||
|
@ -197,10 +196,6 @@ function hex(x) {
|
||||||
return x.join('');
|
return x.join('');
|
||||||
}
|
}
|
||||||
|
|
||||||
function md5(s) {
|
|
||||||
return hex(md51(s));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* this function is much faster,
|
/* this function is much faster,
|
||||||
so if possible we use it. Some IEs
|
so if possible we use it. Some IEs
|
||||||
are the only ones I know of that
|
are the only ones I know of that
|
||||||
|
@ -210,3 +205,5 @@ generated by an if clause. */
|
||||||
function add32(a, b) {
|
function add32(a, b) {
|
||||||
return (a + b) & 0xFFFFFFFF;
|
return (a + b) & 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default md5;
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
/**
|
/**
|
||||||
|
* @fileoverview Provides access to all cryptographic primitives used in OpenPGP.js
|
||||||
* @see module:crypto/crypto
|
* @see module:crypto/crypto
|
||||||
|
* @see module:crypto/signature
|
||||||
|
* @see module:crypto/public_key
|
||||||
|
* @see module:crypto/cipher
|
||||||
|
* @see module:crypto/random
|
||||||
|
* @see module:crypto/hash
|
||||||
* @module crypto
|
* @module crypto
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -11,9 +17,9 @@ import publicKey from './public_key';
|
||||||
import signature from './signature';
|
import signature from './signature';
|
||||||
import random from './random';
|
import random from './random';
|
||||||
import pkcs1 from './pkcs1';
|
import pkcs1 from './pkcs1';
|
||||||
import pkcs5 from './pkcs5.js';
|
import pkcs5 from './pkcs5';
|
||||||
import crypto from './crypto.js';
|
import crypto from './crypto';
|
||||||
import aes_kw from './aes_kw.js';
|
import aes_kw from './aes_kw';
|
||||||
|
|
||||||
// TODO move cfb and gcm to cipher
|
// TODO move cfb and gcm to cipher
|
||||||
const mod = {
|
const mod = {
|
||||||
|
|
|
@ -48,7 +48,8 @@ hash_headers[11] = [0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01,
|
||||||
* Create padding with secure random data
|
* Create padding with secure random data
|
||||||
* @private
|
* @private
|
||||||
* @param {Integer} length Length of the padding in bytes
|
* @param {Integer} length Length of the padding in bytes
|
||||||
* @return {String} Padding as string
|
* @returns {String} Padding as string
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
async function getPkcs1Padding(length) {
|
async function getPkcs1Padding(length) {
|
||||||
let result = '';
|
let result = '';
|
||||||
|
@ -71,7 +72,8 @@ export default {
|
||||||
* create a EME-PKCS1-v1_5 padding (See {@link https://tools.ietf.org/html/rfc4880#section-13.1.1|RFC 4880 13.1.1})
|
* create a EME-PKCS1-v1_5 padding (See {@link https://tools.ietf.org/html/rfc4880#section-13.1.1|RFC 4880 13.1.1})
|
||||||
* @param {String} M message to be encoded
|
* @param {String} M message to be encoded
|
||||||
* @param {Integer} k the length in octets of the key modulus
|
* @param {Integer} k the length in octets of the key modulus
|
||||||
* @return {Promise<String>} EME-PKCS1 padded message
|
* @returns {Promise<String>} EME-PKCS1 padded message
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
encode: async function(M, k) {
|
encode: async function(M, k) {
|
||||||
const mLen = M.length;
|
const mLen = M.length;
|
||||||
|
@ -93,7 +95,7 @@ export default {
|
||||||
/**
|
/**
|
||||||
* decodes a EME-PKCS1-v1_5 padding (See {@link https://tools.ietf.org/html/rfc4880#section-13.1.2|RFC 4880 13.1.2})
|
* decodes a EME-PKCS1-v1_5 padding (See {@link https://tools.ietf.org/html/rfc4880#section-13.1.2|RFC 4880 13.1.2})
|
||||||
* @param {String} EM encoded message, an octet string
|
* @param {String} EM encoded message, an octet string
|
||||||
* @return {String} message, an octet string
|
* @returns {String} message, an octet string
|
||||||
*/
|
*/
|
||||||
decode: function(EM) {
|
decode: function(EM) {
|
||||||
// leading zeros truncated by bn.js
|
// leading zeros truncated by bn.js
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
/**
|
/**
|
||||||
* Add pkcs5 padding to a text.
|
* Add pkcs5 padding to a text.
|
||||||
* @param {String} msg Text to add padding
|
* @param {String} msg Text to add padding
|
||||||
* @return {String} Text with padding added
|
* @returns {String} Text with padding added
|
||||||
*/
|
*/
|
||||||
function encode(msg) {
|
function encode(msg) {
|
||||||
const c = 8 - (msg.length % 8);
|
const c = 8 - (msg.length % 8);
|
||||||
|
@ -31,7 +31,7 @@ function encode(msg) {
|
||||||
/**
|
/**
|
||||||
* Remove pkcs5 padding from a string.
|
* Remove pkcs5 padding from a string.
|
||||||
* @param {String} msg Text to remove padding from
|
* @param {String} msg Text to remove padding from
|
||||||
* @return {String} Text with padding removed
|
* @returns {String} Text with padding removed
|
||||||
*/
|
*/
|
||||||
function decode(msg) {
|
function decode(msg) {
|
||||||
const len = msg.length;
|
const len = msg.length;
|
||||||
|
|
|
@ -42,11 +42,16 @@ const zero = new BN(0);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
/*
|
/**
|
||||||
* hash_algo is integer
|
* DSA Sign function
|
||||||
* m is string
|
* @param {Integer} hash_algo
|
||||||
* g, p, q, x are all BN
|
* @param {String} m
|
||||||
* returns { r: BN, s: BN }
|
* @param {BN} g
|
||||||
|
* @param {BN} p
|
||||||
|
* @param {BN} q
|
||||||
|
* @param {BN} x
|
||||||
|
* @returns {{ r: BN, s: BN }}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
sign: async function(hash_algo, m, g, p, q, x) {
|
sign: async function(hash_algo, m, g, p, q, x) {
|
||||||
let k;
|
let k;
|
||||||
|
@ -90,14 +95,20 @@ export default {
|
||||||
s: s.toArrayLike(Uint8Array) };
|
s: s.toArrayLike(Uint8Array) };
|
||||||
},
|
},
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* hash_algo is integer
|
* DSA Verify function
|
||||||
* r, s are both BN
|
* @param {Integer} hash_algo
|
||||||
* m is string
|
* @param {BN} r
|
||||||
* p, q, g, y are all BN
|
* @param {BN} s
|
||||||
* returns BN
|
* @param {String} m
|
||||||
|
* @param {BN} g
|
||||||
|
* @param {BN} p
|
||||||
|
* @param {BN} q
|
||||||
|
* @param {BN} y
|
||||||
|
* @returns BN
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
verify: async function(hash_algo, r, s, m, p, q, g, y) {
|
verify: async function(hash_algo, r, s, m, g, p, q, y) {
|
||||||
if (zero.ucmp(r) >= 0 || r.ucmp(q) >= 0 ||
|
if (zero.ucmp(r) >= 0 || r.ucmp(q) >= 0 ||
|
||||||
zero.ucmp(s) >= 0 || s.ucmp(q) >= 0) {
|
zero.ucmp(s) >= 0 || s.ucmp(q) >= 0) {
|
||||||
util.print_debug("invalid DSA Signature");
|
util.print_debug("invalid DSA Signature");
|
||||||
|
|
|
@ -29,9 +29,14 @@ import random from '../random';
|
||||||
const zero = new BN(0);
|
const zero = new BN(0);
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
/*
|
/**
|
||||||
* m, p, g, y are all BN
|
* ElGamal Encryption function
|
||||||
* returns { c1: BN, c2: BN }
|
* @param {BN} m
|
||||||
|
* @param {BN} p
|
||||||
|
* @param {BN} g
|
||||||
|
* @param {BN} y
|
||||||
|
* @returns {{ c1: BN, c2: BN }}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
encrypt: async function(m, p, g, y) {
|
encrypt: async function(m, p, g, y) {
|
||||||
const redp = new BN.red(p);
|
const redp = new BN.red(p);
|
||||||
|
@ -46,9 +51,14 @@ export default {
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* c1, c2, p, x are all BN
|
* ElGamal Encryption function
|
||||||
* returns BN
|
* @param {BN} c1
|
||||||
|
* @param {BN} c2
|
||||||
|
* @param {BN} p
|
||||||
|
* @param {BN} x
|
||||||
|
* @returns BN
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
decrypt: async function(c1, c2, p, x) {
|
decrypt: async function(c1, c2, p, x) {
|
||||||
const redp = new BN.red(p);
|
const redp = new BN.red(p);
|
||||||
|
|
|
@ -15,16 +15,15 @@
|
||||||
// License along with this library; if not, write to the Free Software
|
// License along with this library; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
// Wrapper of an instance of an Elliptic Curve
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @fileoverview Wrapper of an instance of an Elliptic Curve
|
||||||
* @requires bn.js
|
* @requires bn.js
|
||||||
* @requires elliptic
|
* @requires elliptic
|
||||||
* @requires crypto/public_key/elliptic/key
|
* @requires crypto/public_key/elliptic/key
|
||||||
* @requires crypto/random
|
* @requires crypto/random
|
||||||
* @requires type/oid
|
|
||||||
* @requires enums
|
* @requires enums
|
||||||
* @requires util
|
* @requires util
|
||||||
|
* @requires type/oid
|
||||||
* @module crypto/public_key/elliptic/curve
|
* @module crypto/public_key/elliptic/curve
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -112,7 +111,10 @@ const curves = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function Curve(oid_or_name, params) {
|
/**
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
function Curve(oid_or_name, params) {
|
||||||
try {
|
try {
|
||||||
if (util.isArray(oid_or_name) ||
|
if (util.isArray(oid_or_name) ||
|
||||||
util.isUint8Array(oid_or_name)) {
|
util.isUint8Array(oid_or_name)) {
|
||||||
|
@ -206,11 +208,12 @@ function getPreferredHashAlgo(oid) {
|
||||||
return curves[enums.write(enums.curve, oid.toHex())].hash;
|
return curves[enums.write(enums.curve, oid.toHex())].hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default Curve;
|
||||||
|
|
||||||
export {
|
export {
|
||||||
curves, webCurves, nodeCurves, generate, getPreferredHashAlgo
|
curves, webCurves, nodeCurves, generate, getPreferredHashAlgo
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////
|
//////////////////////////
|
||||||
// //
|
// //
|
||||||
// Helper functions //
|
// Helper functions //
|
||||||
|
|
|
@ -15,9 +15,8 @@
|
||||||
// License along with this library; if not, write to the Free Software
|
// License along with this library; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
// Key encryption and decryption for RFC 6637 ECDH
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @fileoverview Key encryption and decryption for RFC 6637 ECDH
|
||||||
* @requires crypto/public_key/elliptic/curves
|
* @requires crypto/public_key/elliptic/curves
|
||||||
* @requires crypto/aes_kw
|
* @requires crypto/aes_kw
|
||||||
* @requires crypto/cipher
|
* @requires crypto/cipher
|
||||||
|
@ -70,7 +69,8 @@ function kdf(hash_algo, X, length, param) {
|
||||||
* @param {module:type/mpi} m Value derived from session key (RFC 6637)
|
* @param {module:type/mpi} m Value derived from session key (RFC 6637)
|
||||||
* @param {Uint8Array} Q Recipient public key
|
* @param {Uint8Array} Q Recipient public key
|
||||||
* @param {String} fingerprint Recipient fingerprint
|
* @param {String} fingerprint Recipient fingerprint
|
||||||
* @return {{V: BN, C: BN}} Returns ephemeral key and encoded session key
|
* @returns {{V: BN, C: BN}} Returns ephemeral key and encoded session key
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
async function encrypt(oid, cipher_algo, hash_algo, m, Q, fingerprint) {
|
async function encrypt(oid, cipher_algo, hash_algo, m, Q, fingerprint) {
|
||||||
fingerprint = util.hex_to_Uint8Array(fingerprint);
|
fingerprint = util.hex_to_Uint8Array(fingerprint);
|
||||||
|
@ -98,7 +98,8 @@ async function encrypt(oid, cipher_algo, hash_algo, m, Q, fingerprint) {
|
||||||
* @param {Uint8Array} C Encrypted and wrapped value derived from session key
|
* @param {Uint8Array} C Encrypted and wrapped value derived from session key
|
||||||
* @param {Uint8Array} d Recipient private key
|
* @param {Uint8Array} d Recipient private key
|
||||||
* @param {String} fingerprint Recipient fingerprint
|
* @param {String} fingerprint Recipient fingerprint
|
||||||
* @return {Uint8Array} Value derived from session
|
* @returns {Uint8Array} Value derived from session
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
async function decrypt(oid, cipher_algo, hash_algo, V, C, d, fingerprint) {
|
async function decrypt(oid, cipher_algo, hash_algo, V, C, d, fingerprint) {
|
||||||
fingerprint = util.hex_to_Uint8Array(fingerprint);
|
fingerprint = util.hex_to_Uint8Array(fingerprint);
|
||||||
|
|
|
@ -15,9 +15,8 @@
|
||||||
// License along with this library; if not, write to the Free Software
|
// License along with this library; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
// Implementation of ECDSA following RFC6637 for Openpgpjs
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @fileoverview Implementation of ECDSA following RFC6637 for Openpgpjs
|
||||||
* @requires crypto/hash
|
* @requires crypto/hash
|
||||||
* @requires crypto/public_key/elliptic/curves
|
* @requires crypto/public_key/elliptic/curves
|
||||||
* @module crypto/public_key/elliptic/ecdsa
|
* @module crypto/public_key/elliptic/ecdsa
|
||||||
|
@ -32,8 +31,9 @@ import Curve from './curves';
|
||||||
* @param {enums.hash} hash_algo Hash algorithm used to sign
|
* @param {enums.hash} hash_algo Hash algorithm used to sign
|
||||||
* @param {Uint8Array} m Message to sign
|
* @param {Uint8Array} m Message to sign
|
||||||
* @param {Uint8Array} d Private key used to sign the message
|
* @param {Uint8Array} d Private key used to sign the message
|
||||||
* @return {{r: Uint8Array,
|
* @returns {{r: Uint8Array,
|
||||||
s: Uint8Array}} Signature of the message
|
* s: Uint8Array}} Signature of the message
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
async function sign(oid, hash_algo, m, d) {
|
async function sign(oid, hash_algo, m, d) {
|
||||||
const curve = new Curve(oid);
|
const curve = new Curve(oid);
|
||||||
|
@ -51,7 +51,8 @@ async function sign(oid, hash_algo, m, d) {
|
||||||
s: Uint8Array}} signature Signature to verify
|
s: Uint8Array}} signature Signature to verify
|
||||||
* @param {Uint8Array} m Message to verify
|
* @param {Uint8Array} m Message to verify
|
||||||
* @param {Uint8Array} Q Public key used to verify the message
|
* @param {Uint8Array} Q Public key used to verify the message
|
||||||
* @return {Boolean}
|
* @returns {Boolean}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
async function verify(oid, hash_algo, signature, m, Q) {
|
async function verify(oid, hash_algo, signature, m, Q) {
|
||||||
const curve = new Curve(oid);
|
const curve = new Curve(oid);
|
||||||
|
|
|
@ -15,9 +15,8 @@
|
||||||
// License along with this library; if not, write to the Free Software
|
// License along with this library; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
// Implementation of EdDSA following RFC4880bis-03 for OpenPGP
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @fileoverview Implementation of EdDSA following RFC4880bis-03 for OpenPGP
|
||||||
* @requires bn.js
|
* @requires bn.js
|
||||||
* @requires crypto/hash
|
* @requires crypto/hash
|
||||||
* @requires crypto/public_key/elliptic/curves
|
* @requires crypto/public_key/elliptic/curves
|
||||||
|
@ -34,8 +33,9 @@ import Curve from './curves';
|
||||||
* @param {enums.hash} hash_algo Hash algorithm used to sign
|
* @param {enums.hash} hash_algo Hash algorithm used to sign
|
||||||
* @param {Uint8Array} m Message to sign
|
* @param {Uint8Array} m Message to sign
|
||||||
* @param {Uint8Array} d Private key used to sign
|
* @param {Uint8Array} d Private key used to sign
|
||||||
* @return {{R: Uint8Array,
|
* @returns {{R: Uint8Array,
|
||||||
S: Uint8Array}} Signature of the message
|
* S: Uint8Array}} Signature of the message
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
async function sign(oid, hash_algo, m, d) {
|
async function sign(oid, hash_algo, m, d) {
|
||||||
const curve = new Curve(oid);
|
const curve = new Curve(oid);
|
||||||
|
@ -54,7 +54,8 @@ async function sign(oid, hash_algo, m, d) {
|
||||||
S: Uint8Array}} signature Signature to verify the message
|
S: Uint8Array}} signature Signature to verify the message
|
||||||
* @param {Uint8Array} m Message to verify
|
* @param {Uint8Array} m Message to verify
|
||||||
* @param {Uint8Array} Q Public key used to verify the message
|
* @param {Uint8Array} Q Public key used to verify the message
|
||||||
* @return {Boolean}
|
* @returns {Boolean}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
async function verify(oid, hash_algo, signature, m, Q) {
|
async function verify(oid, hash_algo, signature, m, Q) {
|
||||||
const curve = new Curve(oid);
|
const curve = new Curve(oid);
|
||||||
|
|
|
@ -15,13 +15,12 @@
|
||||||
// License along with this library; if not, write to the Free Software
|
// License along with this library; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
// Function to access Elliptic Curve Cryptography
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @requires crypto/public_key/elliptic/curve
|
* @fileoverview Functions to access Elliptic Curve Cryptography
|
||||||
* @requires crypto/public_key/elliptic/ecdh
|
* @see module:crypto/public_key/elliptic/curve
|
||||||
* @requires crypto/public_key/elliptic/ecdsa
|
* @see module:crypto/public_key/elliptic/ecdh
|
||||||
* @requires crypto/public_key/elliptic/eddsa
|
* @see module:crypto/public_key/elliptic/ecdsa
|
||||||
|
* @see module:crypto/public_key/elliptic/eddsa
|
||||||
* @module crypto/public_key/elliptic
|
* @module crypto/public_key/elliptic
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -15,15 +15,13 @@
|
||||||
// License along with this library; if not, write to the Free Software
|
// License along with this library; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
// Wrapper for a KeyPair of an Elliptic Curve
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @fileoverview Wrapper for a KeyPair of an Elliptic Curve
|
||||||
* @requires bn.js
|
* @requires bn.js
|
||||||
* @requires crypto/public_key/elliptic/curves
|
* @requires crypto/public_key/elliptic/curves
|
||||||
* @requires crypto/hash
|
* @requires crypto/hash
|
||||||
* @requires util
|
* @requires util
|
||||||
* @requires enums
|
* @requires enums
|
||||||
* @requires jwk-to-pem
|
|
||||||
* @requires asn1.js
|
* @requires asn1.js
|
||||||
* @module crypto/public_key/elliptic/key
|
* @module crypto/public_key/elliptic/key
|
||||||
*/
|
*/
|
||||||
|
@ -37,7 +35,10 @@ import enums from '../../../enums';
|
||||||
const webCrypto = util.getWebCrypto();
|
const webCrypto = util.getWebCrypto();
|
||||||
const nodeCrypto = util.getNodeCrypto();
|
const nodeCrypto = util.getNodeCrypto();
|
||||||
|
|
||||||
export default function KeyPair(curve, options) {
|
/**
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
function KeyPair(curve, options) {
|
||||||
this.curve = curve;
|
this.curve = curve;
|
||||||
this.keyType = curve.curve.type === 'edwards' ? enums.publicKey.eddsa : enums.publicKey.ecdsa;
|
this.keyType = curve.curve.type === 'edwards' ? enums.publicKey.eddsa : enums.publicKey.ecdsa;
|
||||||
this.keyPair = this.curve.curve.keyPair(options);
|
this.keyPair = this.curve.curve.keyPair(options);
|
||||||
|
@ -97,6 +98,7 @@ KeyPair.prototype.getPrivate = function () {
|
||||||
return this.keyPair.getPrivate().toArray();
|
return this.keyPair.getPrivate().toArray();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default KeyPair;
|
||||||
|
|
||||||
//////////////////////////
|
//////////////////////////
|
||||||
// //
|
// //
|
||||||
|
@ -224,6 +226,9 @@ async function nodeVerify(curve, hash_algo, { r, s }, message, publicKey) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Originally written by Owen Smith https://github.com/omsmith
|
||||||
|
// Adapted on Feb 2018 from https://github.com/Brightspace/node-jwk-to-pem/
|
||||||
|
|
||||||
const asn1 = nodeCrypto ? require('asn1.js') : undefined;
|
const asn1 = nodeCrypto ? require('asn1.js') : undefined;
|
||||||
|
|
||||||
const ECDSASignature = nodeCrypto ?
|
const ECDSASignature = nodeCrypto ?
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
/**
|
/**
|
||||||
* @requires crypto/public_key/dsa
|
* @fileoverview Asymmetric cryptography functions
|
||||||
* @requires crypto/public_key/elgamal
|
* @see module:crypto/public_key/dsa
|
||||||
* @requires crypto/public_key/elliptic
|
* @see module:crypto/public_key/elgamal
|
||||||
* @requires crypto/public_key/rsa
|
* @see module:crypto/public_key/elliptic
|
||||||
|
* @see module:crypto/public_key/rsa
|
||||||
* @module crypto/public_key
|
* @module crypto/public_key
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -15,9 +15,8 @@
|
||||||
// License along with this library; if not, write to the Free Software
|
// License along with this library; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
// Algorithms for probabilistic random prime generation
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @fileoverview Algorithms for probabilistic random prime generation
|
||||||
* @requires bn.js
|
* @requires bn.js
|
||||||
* @requires crypto/random
|
* @requires crypto/random
|
||||||
* @module crypto/public_key/prime
|
* @module crypto/public_key/prime
|
||||||
|
@ -35,7 +34,8 @@ export default {
|
||||||
* @param {Integer} bits Bit length of the prime
|
* @param {Integer} bits Bit length of the prime
|
||||||
* @param {BN} e Optional RSA exponent to check against the prime
|
* @param {BN} e Optional RSA exponent to check against the prime
|
||||||
* @param {Integer} k Optional number of iterations of Miller-Rabin test
|
* @param {Integer} k Optional number of iterations of Miller-Rabin test
|
||||||
* @return BN
|
* @returns BN
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
async function randomProbablePrime(bits, e, k) {
|
async function randomProbablePrime(bits, e, k) {
|
||||||
const min = new BN(1).shln(bits - 1);
|
const min = new BN(1).shln(bits - 1);
|
||||||
|
@ -69,7 +69,8 @@ async function randomProbablePrime(bits, e, k) {
|
||||||
* @param {BN} n Number to test
|
* @param {BN} n Number to test
|
||||||
* @param {BN} e Optional RSA exponent to check against the prime
|
* @param {BN} e Optional RSA exponent to check against the prime
|
||||||
* @param {Integer} k Optional number of iterations of Miller-Rabin test
|
* @param {Integer} k Optional number of iterations of Miller-Rabin test
|
||||||
* @return {boolean}
|
* @returns {boolean}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
async function isProbablePrime(n, e, k) {
|
async function isProbablePrime(n, e, k) {
|
||||||
if (e && !n.subn(1).gcd(e).eqn(1)) {
|
if (e && !n.subn(1).gcd(e).eqn(1)) {
|
||||||
|
@ -94,7 +95,7 @@ async function isProbablePrime(n, e, k) {
|
||||||
* Fails if b^(n-1) mod n === 1.
|
* Fails if b^(n-1) mod n === 1.
|
||||||
* @param {BN} n Number to test
|
* @param {BN} n Number to test
|
||||||
* @param {Integer} b Optional Fermat test base
|
* @param {Integer} b Optional Fermat test base
|
||||||
* @return {boolean}
|
* @returns {boolean}
|
||||||
*/
|
*/
|
||||||
function fermat(n, b) {
|
function fermat(n, b) {
|
||||||
b = b || new BN(2);
|
b = b || new BN(2);
|
||||||
|
@ -226,7 +227,8 @@ const small_primes = [
|
||||||
* @param {BN} n Number to test
|
* @param {BN} n Number to test
|
||||||
* @param {Integer} k Optional number of iterations of Miller-Rabin test
|
* @param {Integer} k Optional number of iterations of Miller-Rabin test
|
||||||
* @param {Function} rand Optional function to generate potential witnesses
|
* @param {Function} rand Optional function to generate potential witnesses
|
||||||
* @return {boolean}
|
* @returns {boolean}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
async function millerRabin(n, k, rand) {
|
async function millerRabin(n, k, rand) {
|
||||||
const len = n.bitLength();
|
const len = n.bitLength();
|
||||||
|
|
|
@ -53,7 +53,8 @@ export default {
|
||||||
* @param n public MPI part as BN
|
* @param n public MPI part as BN
|
||||||
* @param e public MPI part as BN
|
* @param e public MPI part as BN
|
||||||
* @param d private MPI part as BN
|
* @param d private MPI part as BN
|
||||||
* @return BN
|
* @returns BN
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
sign: async function(m, n, e, d) {
|
sign: async function(m, n, e, d) {
|
||||||
if (n.cmp(m) <= 0) {
|
if (n.cmp(m) <= 0) {
|
||||||
|
@ -68,7 +69,8 @@ export default {
|
||||||
* @param s signature as BN
|
* @param s signature as BN
|
||||||
* @param n public MPI part as BN
|
* @param n public MPI part as BN
|
||||||
* @param e public MPI part as BN
|
* @param e public MPI part as BN
|
||||||
* @return BN
|
* @returns BN
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
verify: async function(s, n, e) {
|
verify: async function(s, n, e) {
|
||||||
if (n.cmp(s) <= 0) {
|
if (n.cmp(s) <= 0) {
|
||||||
|
@ -83,7 +85,8 @@ export default {
|
||||||
* @param m message as BN
|
* @param m message as BN
|
||||||
* @param n public MPI part as BN
|
* @param n public MPI part as BN
|
||||||
* @param e public MPI part as BN
|
* @param e public MPI part as BN
|
||||||
* @return BN
|
* @returns BN
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
encrypt: async function(m, n, e) {
|
encrypt: async function(m, n, e) {
|
||||||
if (n.cmp(m) <= 0) {
|
if (n.cmp(m) <= 0) {
|
||||||
|
@ -102,7 +105,8 @@ export default {
|
||||||
* @param p RSA p as BN
|
* @param p RSA p as BN
|
||||||
* @param q RSA q as BN
|
* @param q RSA q as BN
|
||||||
* @param u RSA u as BN
|
* @param u RSA u as BN
|
||||||
* @return {BN} The decrypted value of the message
|
* @returns {BN} The decrypted value of the message
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
decrypt: async function(m, n, e, d, p, q, u) {
|
decrypt: async function(m, n, e, d, p, q, u) {
|
||||||
if (n.cmp(m) <= 0) {
|
if (n.cmp(m) <= 0) {
|
||||||
|
@ -140,9 +144,10 @@ export default {
|
||||||
* Generate a new random private key B bits long with public exponent E
|
* Generate a new random private key B bits long with public exponent E
|
||||||
* @param {Integer} B RSA bit length
|
* @param {Integer} B RSA bit length
|
||||||
* @param {String} E RSA public exponent in hex string
|
* @param {String} E RSA public exponent in hex string
|
||||||
* @return {{n: BN, e: BN, d: BN,
|
* @returns {{n: BN, e: BN, d: BN,
|
||||||
p: BN, q: BN, u: BN}} RSA public modulus, RSA public exponent, RSA private exponent,
|
* p: BN, q: BN, u: BN}} RSA public modulus, RSA public exponent, RSA private exponent,
|
||||||
RSA private prime p, RSA private prime q, u = q ** -1 mod p
|
* RSA private prime p, RSA private prime q, u = q ** -1 mod p
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
generate: async function(B, E) {
|
generate: async function(B, E) {
|
||||||
let key;
|
let key;
|
||||||
|
|
|
@ -35,7 +35,8 @@ export default {
|
||||||
/**
|
/**
|
||||||
* Retrieve secure random byte array of the specified length
|
* Retrieve secure random byte array of the specified length
|
||||||
* @param {Integer} length Length in bytes to generate
|
* @param {Integer} length Length in bytes to generate
|
||||||
* @return {Uint8Array} Random byte array
|
* @returns {Uint8Array} Random byte array
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
getRandomBytes: async function(length) {
|
getRandomBytes: async function(length) {
|
||||||
const buf = new Uint8Array(length);
|
const buf = new Uint8Array(length);
|
||||||
|
@ -58,7 +59,8 @@ export default {
|
||||||
* Create a secure random MPI that is greater than or equal to min and less than max.
|
* Create a secure random MPI that is greater than or equal to min and less than max.
|
||||||
* @param {module:type/mpi} min Lower bound, included
|
* @param {module:type/mpi} min Lower bound, included
|
||||||
* @param {module:type/mpi} max Upper bound, excluded
|
* @param {module:type/mpi} max Upper bound, excluded
|
||||||
* @return {module:BN} Random MPI
|
* @returns {module:BN} Random MPI
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
getRandomBN: async function(min, max) {
|
getRandomBN: async function(min, max) {
|
||||||
if (max.cmp(min) <= 0) {
|
if (max.cmp(min) <= 0) {
|
||||||
|
|
|
@ -24,7 +24,8 @@ export default {
|
||||||
* @param {Array<module:type/mpi>} msg_MPIs Algorithm-specific signature parameters
|
* @param {Array<module:type/mpi>} msg_MPIs Algorithm-specific signature parameters
|
||||||
* @param {Array<module:type/mpi>} pub_MPIs Algorithm-specific public key parameters
|
* @param {Array<module:type/mpi>} pub_MPIs Algorithm-specific public key parameters
|
||||||
* @param {Uint8Array} data Data for which the signature was created
|
* @param {Uint8Array} data Data for which the signature was created
|
||||||
* @return {Boolean} True if signature is valid
|
* @returns {Boolean} True if signature is valid
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
verify: async function(algo, hash_algo, msg_MPIs, pub_MPIs, data) {
|
verify: async function(algo, hash_algo, msg_MPIs, pub_MPIs, data) {
|
||||||
switch (algo) {
|
switch (algo) {
|
||||||
|
@ -45,7 +46,7 @@ export default {
|
||||||
const q = pub_MPIs[1].toBN();
|
const q = pub_MPIs[1].toBN();
|
||||||
const g = pub_MPIs[2].toBN();
|
const g = pub_MPIs[2].toBN();
|
||||||
const y = pub_MPIs[3].toBN();
|
const y = pub_MPIs[3].toBN();
|
||||||
return publicKey.dsa.verify(hash_algo, r, s, data, p, q, g, y);
|
return publicKey.dsa.verify(hash_algo, r, s, data, g, p, q, y);
|
||||||
}
|
}
|
||||||
case enums.publicKey.ecdsa: {
|
case enums.publicKey.ecdsa: {
|
||||||
const oid = pub_MPIs[0];
|
const oid = pub_MPIs[0];
|
||||||
|
@ -76,7 +77,8 @@ export default {
|
||||||
* @param {module:enums.hash} hash_algo Hash algorithm
|
* @param {module:enums.hash} hash_algo Hash algorithm
|
||||||
* @param {Array<module:type/mpi>} key_params Algorithm-specific public and private key parameters
|
* @param {Array<module:type/mpi>} key_params Algorithm-specific public and private key parameters
|
||||||
* @param {Uint8Array} data Data to be signed
|
* @param {Uint8Array} data Data to be signed
|
||||||
* @return {Uint8Array} Signature
|
* @returns {Uint8Array} Signature
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
sign: async function(algo, hash_algo, key_params, data) {
|
sign: async function(algo, hash_algo, key_params, data) {
|
||||||
switch (algo) {
|
switch (algo) {
|
||||||
|
|
|
@ -111,7 +111,7 @@ function addheader() {
|
||||||
/**
|
/**
|
||||||
* Calculates a checksum over the given data and returns it base64 encoded
|
* Calculates a checksum over the given data and returns it base64 encoded
|
||||||
* @param {String} data Data to create a CRC-24 checksum for
|
* @param {String} data Data to create a CRC-24 checksum for
|
||||||
* @return {String} Base64 encoded checksum
|
* @returns {String} Base64 encoded checksum
|
||||||
*/
|
*/
|
||||||
function getCheckSum(data) {
|
function getCheckSum(data) {
|
||||||
const c = createcrc24(data);
|
const c = createcrc24(data);
|
||||||
|
@ -124,7 +124,7 @@ function getCheckSum(data) {
|
||||||
* given base64 encoded checksum
|
* given base64 encoded checksum
|
||||||
* @param {String} data Data to create a CRC-24 checksum for
|
* @param {String} data Data to create a CRC-24 checksum for
|
||||||
* @param {String} checksum Base64 encoded checksum
|
* @param {String} checksum Base64 encoded checksum
|
||||||
* @return {Boolean} True if the given checksum is correct; otherwise false
|
* @returns {Boolean} True if the given checksum is correct; otherwise false
|
||||||
*/
|
*/
|
||||||
function verifyCheckSum(data, checksum) {
|
function verifyCheckSum(data, checksum) {
|
||||||
const c = getCheckSum(data);
|
const c = getCheckSum(data);
|
||||||
|
@ -134,7 +134,7 @@ function verifyCheckSum(data, checksum) {
|
||||||
/**
|
/**
|
||||||
* Internal function to calculate a CRC-24 checksum over a given string (data)
|
* Internal function to calculate a CRC-24 checksum over a given string (data)
|
||||||
* @param {String} data Data to create a CRC-24 checksum for
|
* @param {String} data Data to create a CRC-24 checksum for
|
||||||
* @return {Integer} The CRC-24 checksum as number
|
* @returns {Integer} The CRC-24 checksum as number
|
||||||
*/
|
*/
|
||||||
const crc_table = [
|
const crc_table = [
|
||||||
0x00000000, 0x00864cfb, 0x018ad50d, 0x010c99f6, 0x0393e6e1, 0x0315aa1a, 0x021933ec, 0x029f7f17, 0x07a18139,
|
0x00000000, 0x00864cfb, 0x018ad50d, 0x010c99f6, 0x0393e6e1, 0x0315aa1a, 0x021933ec, 0x029f7f17, 0x07a18139,
|
||||||
|
|
10
src/hkp.js
10
src/hkp.js
|
@ -29,7 +29,7 @@ import config from './config';
|
||||||
* @param {String} keyServerBaseUrl (optional) The HKP key server base url including
|
* @param {String} keyServerBaseUrl (optional) The HKP key server base url including
|
||||||
* the protocol to use e.g. https://pgp.mit.edu
|
* the protocol to use e.g. https://pgp.mit.edu
|
||||||
*/
|
*/
|
||||||
export default function HKP(keyServerBaseUrl) {
|
function HKP(keyServerBaseUrl) {
|
||||||
this._baseUrl = keyServerBaseUrl || config.keyserver;
|
this._baseUrl = keyServerBaseUrl || config.keyserver;
|
||||||
this._fetch = typeof window !== 'undefined' ? window.fetch : require('node-fetch');
|
this._fetch = typeof window !== 'undefined' ? window.fetch : require('node-fetch');
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,8 @@ export default function HKP(keyServerBaseUrl) {
|
||||||
* @param {String} options.keyID The long public key ID.
|
* @param {String} options.keyID The long public key ID.
|
||||||
* @param {String} options.query This can be any part of the key user ID such as name
|
* @param {String} options.query This can be any part of the key user ID such as name
|
||||||
* or email address.
|
* or email address.
|
||||||
* @return {Promise<String>} The ascii armored public key.
|
* @returns {Promise<String>} The ascii armored public key.
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
HKP.prototype.lookup = function(options) {
|
HKP.prototype.lookup = function(options) {
|
||||||
let uri = this._baseUrl + '/pks/lookup?op=get&options=mr&search=';
|
let uri = this._baseUrl + '/pks/lookup?op=get&options=mr&search=';
|
||||||
|
@ -68,7 +69,8 @@ HKP.prototype.lookup = function(options) {
|
||||||
/**
|
/**
|
||||||
* Upload a public key to the server.
|
* Upload a public key to the server.
|
||||||
* @param {String} publicKeyArmored An ascii armored public key to be uploaded.
|
* @param {String} publicKeyArmored An ascii armored public key to be uploaded.
|
||||||
* @return {Promise}
|
* @returns {Promise}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
HKP.prototype.upload = function(publicKeyArmored) {
|
HKP.prototype.upload = function(publicKeyArmored) {
|
||||||
const uri = this._baseUrl + '/pks/add';
|
const uri = this._baseUrl + '/pks/add';
|
||||||
|
@ -82,3 +84,5 @@ HKP.prototype.upload = function(publicKeyArmored) {
|
||||||
body: 'keytext=' + encodeURIComponent(publicKeyArmored)
|
body: 'keytext=' + encodeURIComponent(publicKeyArmored)
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default HKP;
|
||||||
|
|
49
src/key.js
49
src/key.js
|
@ -263,8 +263,9 @@ function isValidSigningKeyPacket(keyPacket, signature, date=new Date()) {
|
||||||
* Returns first key packet or key packet by given keyId that is available for signing and verification
|
* Returns first key packet or key packet by given keyId that is available for signing and verification
|
||||||
* @param {module:type/keyid} keyId, optional
|
* @param {module:type/keyid} keyId, optional
|
||||||
* @param {Date} date use the given date for verification instead of the current time
|
* @param {Date} date use the given date for verification instead of the current time
|
||||||
* @returns {(module:packet/secret_subkey|
|
* @returns {Promise<module:packet/secret_subkey|
|
||||||
module:packet/secret_key|null)} key packet or null if no signing key has been found
|
module:packet/secret_key|null>} key packet or null if no signing key has been found
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Key.prototype.getSigningKeyPacket = async function (keyId=null, date=new Date()) {
|
Key.prototype.getSigningKeyPacket = async function (keyId=null, date=new Date()) {
|
||||||
const primaryKey = this.primaryKey;
|
const primaryKey = this.primaryKey;
|
||||||
|
@ -305,10 +306,11 @@ function isValidEncryptionKeyPacket(keyPacket, signature, date=new Date()) {
|
||||||
* Returns first key packet or key packet by given keyId that is available for encryption or decryption
|
* Returns first key packet or key packet by given keyId that is available for encryption or decryption
|
||||||
* @param {module:type/keyid} keyId, optional
|
* @param {module:type/keyid} keyId, optional
|
||||||
* @param {Date} date, optional
|
* @param {Date} date, optional
|
||||||
* @returns {(module:packet/public_subkey|
|
* @returns {Promise<module:packet/public_subkey|
|
||||||
* module:packet/secret_subkey|
|
* module:packet/secret_subkey|
|
||||||
* module:packet/secret_key|
|
* module:packet/secret_key|
|
||||||
* module:packet/public_key|null)} key packet or null if no encryption key has been found
|
* module:packet/public_key|null>} key packet or null if no encryption key has been found
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Key.prototype.getEncryptionKeyPacket = async function(keyId, date=new Date()) {
|
Key.prototype.getEncryptionKeyPacket = async function(keyId, date=new Date()) {
|
||||||
const primaryKey = this.primaryKey;
|
const primaryKey = this.primaryKey;
|
||||||
|
@ -340,6 +342,7 @@ Key.prototype.getEncryptionKeyPacket = async function(keyId, date=new Date()) {
|
||||||
* @param {module:type/keyid} keyId
|
* @param {module:type/keyid} keyId
|
||||||
* @param {String} passphrase
|
* @param {String} passphrase
|
||||||
* @returns {Promise<Array<module:packet/secret_key|module:packet/secret_subkey>>}
|
* @returns {Promise<Array<module:packet/secret_key|module:packet/secret_subkey>>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Key.prototype.encrypt = async function(passphrase, keyId=null) {
|
Key.prototype.encrypt = async function(passphrase, keyId=null) {
|
||||||
if (!this.isPrivate()) {
|
if (!this.isPrivate()) {
|
||||||
|
@ -358,6 +361,7 @@ Key.prototype.encrypt = async function(passphrase, keyId=null) {
|
||||||
* @param {String} passphrase
|
* @param {String} passphrase
|
||||||
* @param {module:type/keyid} keyId
|
* @param {module:type/keyid} keyId
|
||||||
* @returns {Promise<Boolean>} true if all matching key and subkey packets decrypted successfully
|
* @returns {Promise<Boolean>} true if all matching key and subkey packets decrypted successfully
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Key.prototype.decrypt = async function(passphrase, keyId=null) {
|
Key.prototype.decrypt = async function(passphrase, keyId=null) {
|
||||||
if (!this.isPrivate()) {
|
if (!this.isPrivate()) {
|
||||||
|
@ -380,6 +384,7 @@ Key.prototype.decrypt = async function(passphrase, keyId=null) {
|
||||||
* module:packet/secret_key} key, optional The key to verify the signature
|
* module:packet/secret_key} key, optional The key to verify the signature
|
||||||
* @param {Date} date Use the given date instead of the current time
|
* @param {Date} date Use the given date instead of the current time
|
||||||
* @returns {Promise<Boolean>} True if the certificate is revoked
|
* @returns {Promise<Boolean>} True if the certificate is revoked
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Key.prototype.isRevoked = async function(signature, key, date=new Date()) {
|
Key.prototype.isRevoked = async function(signature, key, date=new Date()) {
|
||||||
return isDataRevoked(
|
return isDataRevoked(
|
||||||
|
@ -394,6 +399,7 @@ Key.prototype.isRevoked = async function(signature, key, date=new Date()) {
|
||||||
* @param {type/keyid} keyId
|
* @param {type/keyid} keyId
|
||||||
* @param {Date} date Use the given date instead of the current time
|
* @param {Date} date Use the given date instead of the current time
|
||||||
* @returns {Promise<module:packet/packetlist>}
|
* @returns {Promise<module:packet/packetlist>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Key.prototype.verifyKeyPackets = async function(keyId=null, date=new Date()) {
|
Key.prototype.verifyKeyPackets = async function(keyId=null, date=new Date()) {
|
||||||
const packets = new packet.List();
|
const packets = new packet.List();
|
||||||
|
@ -418,6 +424,7 @@ Key.prototype.verifyKeyPackets = async function(keyId=null, date=new Date()) {
|
||||||
* and valid self signature
|
* and valid self signature
|
||||||
* @param {Date} date (optional) use the given date for verification instead of the current time
|
* @param {Date} date (optional) use the given date for verification instead of the current time
|
||||||
* @returns {Promise<module:enums.keyStatus>} The status of the primary key
|
* @returns {Promise<module:enums.keyStatus>} The status of the primary key
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Key.prototype.verifyPrimaryKey = async function(date=new Date()) {
|
Key.prototype.verifyPrimaryKey = async function(date=new Date()) {
|
||||||
const primaryKey = this.primaryKey;
|
const primaryKey = this.primaryKey;
|
||||||
|
@ -446,7 +453,8 @@ Key.prototype.verifyPrimaryKey = async function(date=new Date()) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the expiration time of the primary key or Infinity if key does not expire
|
* Returns the expiration time of the primary key or Infinity if key does not expire
|
||||||
* @returns {Date}
|
* @returns {Promise<Date>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Key.prototype.getExpirationTime = async function() {
|
Key.prototype.getExpirationTime = async function() {
|
||||||
if (this.primaryKey.version === 3) {
|
if (this.primaryKey.version === 3) {
|
||||||
|
@ -466,7 +474,9 @@ Key.prototype.getExpirationTime = async function() {
|
||||||
* - if multiple primary users exist, returns the one with the latest self signature
|
* - if multiple primary users exist, returns the one with the latest self signature
|
||||||
* - otherwise, returns the user with the latest self signature
|
* - otherwise, returns the user with the latest self signature
|
||||||
* @param {Date} date use the given date for verification instead of the current time
|
* @param {Date} date use the given date for verification instead of the current time
|
||||||
* @returns {{user: Array<module:packet/User>, selfCertification: Array<module:packet/signature>}|null} The primary user and the self signature
|
* @returns {Promise<{user: Array<module:packet/User>,
|
||||||
|
* selfCertification: Array<module:packet/signature>}|undefined>} The primary user and the self signature
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Key.prototype.getPrimaryUser = async function(date=new Date()) {
|
Key.prototype.getPrimaryUser = async function(date=new Date()) {
|
||||||
const { primaryKey } = this;
|
const { primaryKey } = this;
|
||||||
|
@ -615,6 +625,7 @@ Key.prototype.revoke = function() {
|
||||||
* Signs primary user of key
|
* Signs primary user of key
|
||||||
* @param {Array<module:key~Key>} privateKey decrypted private keys for signing
|
* @param {Array<module:key~Key>} privateKey decrypted private keys for signing
|
||||||
* @returns {Promise<module:key~Key>} new public key with new certificate signature
|
* @returns {Promise<module:key~Key>} new public key with new certificate signature
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Key.prototype.signPrimaryUser = async function(privateKeys) {
|
Key.prototype.signPrimaryUser = async function(privateKeys) {
|
||||||
const { index, user } = await this.getPrimaryUser() || {};
|
const { index, user } = await this.getPrimaryUser() || {};
|
||||||
|
@ -631,6 +642,7 @@ Key.prototype.signPrimaryUser = async function(privateKeys) {
|
||||||
* Signs all users of key
|
* Signs all users of key
|
||||||
* @param {Array<module:key~Key>} privateKeys decrypted private keys for signing
|
* @param {Array<module:key~Key>} privateKeys decrypted private keys for signing
|
||||||
* @returns {Promise<module:key~Key>} new public key with new certificate signature
|
* @returns {Promise<module:key~Key>} new public key with new certificate signature
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Key.prototype.signAllUsers = async function(privateKeys) {
|
Key.prototype.signAllUsers = async function(privateKeys) {
|
||||||
const that = this;
|
const that = this;
|
||||||
|
@ -648,6 +660,7 @@ Key.prototype.signAllUsers = async function(privateKeys) {
|
||||||
* @param {Array<module:key~Key>} keys array of keys to verify certificate signatures
|
* @param {Array<module:key~Key>} keys array of keys to verify certificate signatures
|
||||||
* @returns {Promise<Array<{keyid: module:type/keyid,
|
* @returns {Promise<Array<{keyid: module:type/keyid,
|
||||||
* valid: Boolean}>>} List of signer's keyid and validity of signature
|
* valid: Boolean}>>} List of signer's keyid and validity of signature
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Key.prototype.verifyPrimaryUser = async function(keys) {
|
Key.prototype.verifyPrimaryUser = async function(keys) {
|
||||||
const primaryKey = this.primaryKey;
|
const primaryKey = this.primaryKey;
|
||||||
|
@ -668,6 +681,7 @@ Key.prototype.verifyPrimaryUser = async function(keys) {
|
||||||
* @returns {Promise<Array<{userid: String,
|
* @returns {Promise<Array<{userid: String,
|
||||||
* keyid: module:type/keyid,
|
* keyid: module:type/keyid,
|
||||||
* valid: Boolean}>>} list of userid, signer's keyid and validity of signature
|
* valid: Boolean}>>} list of userid, signer's keyid and validity of signature
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Key.prototype.verifyAllUsers = async function(keys) {
|
Key.prototype.verifyAllUsers = async function(keys) {
|
||||||
const results = [];
|
const results = [];
|
||||||
|
@ -720,6 +734,7 @@ User.prototype.toPacketlist = function() {
|
||||||
* module:packet/public_key} primaryKey The primary key packet
|
* module:packet/public_key} primaryKey The primary key packet
|
||||||
* @param {Array<module:key~Key>} privateKeys Decrypted private keys for signing
|
* @param {Array<module:key~Key>} privateKeys Decrypted private keys for signing
|
||||||
* @returns {Promise<module:key~Key>} New user with new certificate signatures
|
* @returns {Promise<module:key~Key>} New user with new certificate signatures
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
User.prototype.sign = async function(primaryKey, privateKeys) {
|
User.prototype.sign = async function(primaryKey, privateKeys) {
|
||||||
const dataToSign = { userid: this.userId || this.userAttribute, key: primaryKey };
|
const dataToSign = { userid: this.userId || this.userAttribute, key: primaryKey };
|
||||||
|
@ -764,6 +779,7 @@ User.prototype.sign = async function(primaryKey, privateKeys) {
|
||||||
* module:packet/secret_key} key, optional The key to verify the signature
|
* module:packet/secret_key} key, optional The key to verify the signature
|
||||||
* @param {Date} date Use the given date instead of the current time
|
* @param {Date} date Use the given date instead of the current time
|
||||||
* @returns {Promise<Boolean>} True if the certificate is revoked
|
* @returns {Promise<Boolean>} True if the certificate is revoked
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
User.prototype.isRevoked = async function(primaryKey, certificate, key, date=new Date()) {
|
User.prototype.isRevoked = async function(primaryKey, certificate, key, date=new Date()) {
|
||||||
return isDataRevoked(
|
return isDataRevoked(
|
||||||
|
@ -782,6 +798,7 @@ User.prototype.isRevoked = async function(primaryKey, certificate, key, date=new
|
||||||
* @param {Array<module:key~Key>} keys Array of keys to verify certificate signatures
|
* @param {Array<module:key~Key>} keys Array of keys to verify certificate signatures
|
||||||
* @param {Date} date Use the given date instead of the current time
|
* @param {Date} date Use the given date instead of the current time
|
||||||
* @returns {Promise<module:enums.keyStatus>} status of the certificate
|
* @returns {Promise<module:enums.keyStatus>} status of the certificate
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
User.prototype.verifyCertificate = async function(primaryKey, certificate, keys, date=new Date()) {
|
User.prototype.verifyCertificate = async function(primaryKey, certificate, keys, date=new Date()) {
|
||||||
const that = this;
|
const that = this;
|
||||||
|
@ -811,6 +828,7 @@ User.prototype.verifyCertificate = async function(primaryKey, certificate, keys,
|
||||||
* @param {Array<module:key~Key>} keys Array of keys to verify certificate signatures
|
* @param {Array<module:key~Key>} keys Array of keys to verify certificate signatures
|
||||||
* @returns {Promise<Array<{keyid: module:type/keyid,
|
* @returns {Promise<Array<{keyid: module:type/keyid,
|
||||||
* valid: Boolean}>>} List of signer's keyid and validity of signature
|
* valid: Boolean}>>} List of signer's keyid and validity of signature
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
User.prototype.verifyAllCertifications = async function(primaryKey, keys) {
|
User.prototype.verifyAllCertifications = async function(primaryKey, keys) {
|
||||||
const that = this;
|
const that = this;
|
||||||
|
@ -830,6 +848,7 @@ User.prototype.verifyAllCertifications = async function(primaryKey, keys) {
|
||||||
* @param {module:packet/secret_key|
|
* @param {module:packet/secret_key|
|
||||||
* module:packet/public_key} primaryKey The primary key packet
|
* module:packet/public_key} primaryKey The primary key packet
|
||||||
* @returns {Promise<module:enums.keyStatus>} Status of user
|
* @returns {Promise<module:enums.keyStatus>} Status of user
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
User.prototype.verify = async function(primaryKey) {
|
User.prototype.verify = async function(primaryKey) {
|
||||||
if (!this.selfCertifications.length) {
|
if (!this.selfCertifications.length) {
|
||||||
|
@ -911,6 +930,7 @@ SubKey.prototype.toPacketlist = function() {
|
||||||
* module:packet/secret_key} key, optional The key to verify the signature
|
* module:packet/secret_key} key, optional The key to verify the signature
|
||||||
* @param {Date} date Use the given date instead of the current time
|
* @param {Date} date Use the given date instead of the current time
|
||||||
* @returns {Promise<Boolean>} True if the binding signature is revoked
|
* @returns {Promise<Boolean>} True if the binding signature is revoked
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
SubKey.prototype.isRevoked = async function(primaryKey, signature, key, date=new Date()) {
|
SubKey.prototype.isRevoked = async function(primaryKey, signature, key, date=new Date()) {
|
||||||
return isDataRevoked(
|
return isDataRevoked(
|
||||||
|
@ -928,6 +948,7 @@ SubKey.prototype.isRevoked = async function(primaryKey, signature, key, date=new
|
||||||
* module:packet/public_key} primaryKey The primary key packet
|
* module:packet/public_key} primaryKey The primary key packet
|
||||||
* @param {Date} date Use the given date instead of the current time
|
* @param {Date} date Use the given date instead of the current time
|
||||||
* @returns {Promise<module:enums.keyStatus>} The status of the subkey
|
* @returns {Promise<module:enums.keyStatus>} The status of the subkey
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
SubKey.prototype.verify = async function(primaryKey, date=new Date()) {
|
SubKey.prototype.verify = async function(primaryKey, date=new Date()) {
|
||||||
const that = this;
|
const that = this;
|
||||||
|
@ -1021,7 +1042,8 @@ SubKey.prototype.update = async function(subKey, primaryKey) {
|
||||||
/**
|
/**
|
||||||
* Reads an unarmored OpenPGP key list and returns one or multiple key objects
|
* Reads an unarmored OpenPGP key list and returns one or multiple key objects
|
||||||
* @param {Uint8Array} data to be parsed
|
* @param {Uint8Array} data to be parsed
|
||||||
* @returns {{keys: Array<module:key~Key>, err: (Array<Error>|null)}} result object with key and error arrays
|
* @returns {{keys: Array<module:key~Key>,
|
||||||
|
* err: (Array<Error>|null)}} result object with key and error arrays
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
export function read(data) {
|
export function read(data) {
|
||||||
|
@ -1055,7 +1077,7 @@ export function read(data) {
|
||||||
* Reads an OpenPGP armored text and returns one or multiple key objects
|
* Reads an OpenPGP armored text and returns one or multiple key objects
|
||||||
* @param {String} armoredText text to be parsed
|
* @param {String} armoredText text to be parsed
|
||||||
* @returns {{keys: Array<module:key~Key>,
|
* @returns {{keys: Array<module:key~Key>,
|
||||||
err: (Array<Error>|null)}} result object with key and error arrays
|
* err: (Array<Error>|null)}} result object with key and error arrays
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
export function readArmored(armoredText) {
|
export function readArmored(armoredText) {
|
||||||
|
@ -1083,7 +1105,8 @@ export function readArmored(armoredText) {
|
||||||
* @param {String} options.passphrase The passphrase used to encrypt the resulting private key
|
* @param {String} options.passphrase The passphrase used to encrypt the resulting private key
|
||||||
* @param {Boolean} [options.unlocked=false] The secret part of the generated key is unlocked
|
* @param {Boolean} [options.unlocked=false] The secret part of the generated key is unlocked
|
||||||
* @param {Number} [options.keyExpirationTime=0] The number of seconds after the key creation time that the key expires
|
* @param {Number} [options.keyExpirationTime=0] The number of seconds after the key creation time that the key expires
|
||||||
* @returns {module:key~Key}
|
* @returns {Promise<module:key~Key>}
|
||||||
|
* @async
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
export function generate(options) {
|
export function generate(options) {
|
||||||
|
@ -1159,6 +1182,7 @@ export function generate(options) {
|
||||||
* @param {Boolean} [options.unlocked=false] The secret part of the generated key is unlocked
|
* @param {Boolean} [options.unlocked=false] The secret part of the generated key is unlocked
|
||||||
* @param {Number} [options.keyExpirationTime=0] The number of seconds after the key creation time that the key expires
|
* @param {Number} [options.keyExpirationTime=0] The number of seconds after the key creation time that the key expires
|
||||||
* @returns {Promise<module:key~Key>}
|
* @returns {Promise<module:key~Key>}
|
||||||
|
* @async
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
export async function reformat(options) {
|
export async function reformat(options) {
|
||||||
|
@ -1304,6 +1328,7 @@ async function wrapKeyObject(secretKeyPacket, secretSubkeyPacket, options) {
|
||||||
* module:packet/secret_key} key, optional The key packet to check the signature
|
* module:packet/secret_key} key, optional The key packet to check the signature
|
||||||
* @param {Date} date Use the given date instead of the current time
|
* @param {Date} date Use the given date instead of the current time
|
||||||
* @returns {Promise<Boolean>} True if the signature revokes the data
|
* @returns {Promise<Boolean>} True if the signature revokes the data
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
async function isDataRevoked(primaryKey, dataToVerify, revocations, signature, key, date=new Date()) {
|
async function isDataRevoked(primaryKey, dataToVerify, revocations, signature, key, date=new Date()) {
|
||||||
key = key || primaryKey;
|
key = key || primaryKey;
|
||||||
|
@ -1353,7 +1378,8 @@ function getExpirationTime(keyPacket, signature) {
|
||||||
/**
|
/**
|
||||||
* Returns the preferred signature hash algorithm of a key
|
* Returns the preferred signature hash algorithm of a key
|
||||||
* @param {object} key
|
* @param {object} key
|
||||||
* @returns {String}
|
* @returns {Promise<String>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
export async function getPreferredHashAlgo(key) {
|
export async function getPreferredHashAlgo(key) {
|
||||||
let hash_algo = config.prefer_hash_algorithm;
|
let hash_algo = config.prefer_hash_algorithm;
|
||||||
|
@ -1387,7 +1413,8 @@ export async function getPreferredHashAlgo(key) {
|
||||||
/**
|
/**
|
||||||
* Returns the preferred symmetric algorithm for a set of keys
|
* Returns the preferred symmetric algorithm for a set of keys
|
||||||
* @param {Array<module:key~Key>} keys Set of keys
|
* @param {Array<module:key~Key>} keys Set of keys
|
||||||
* @returns {enums.symmetric} Preferred symmetric algorithm
|
* @returns {Promise<module:enums.symmetric>} Preferred symmetric algorithm
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
export async function getPreferredSymAlgo(keys) {
|
export async function getPreferredSymAlgo(keys) {
|
||||||
const prioMap = {};
|
const prioMap = {};
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
/**
|
/**
|
||||||
|
* @fileoverview Functions dealing with storage of the keyring.
|
||||||
* @see module:keyring/keyring
|
* @see module:keyring/keyring
|
||||||
|
* @see module:keyring/localstore
|
||||||
* @module keyring
|
* @module keyring
|
||||||
*/
|
*/
|
||||||
import Keyring from './keyring.js';
|
import Keyring from './keyring.js';
|
||||||
|
|
|
@ -16,23 +16,21 @@
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The class that deals with storage of the keyring. Currently the only option is to use HTML5 local storage.
|
|
||||||
* @requires key
|
* @requires key
|
||||||
* @requires keyring/localstore
|
* @requires keyring/localstore
|
||||||
* @module keyring/keyring
|
* @module keyring/keyring
|
||||||
* @param {keyring/localstore} [storeHandler] class implementing loadPublic(), loadPrivate(), storePublic(), and storePrivate() methods
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { readArmored } from '../key';
|
import { readArmored } from '../key';
|
||||||
import LocalStore from './localstore';
|
import LocalStore from './localstore';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialization routine for the keyring. This method reads the
|
* Initialization routine for the keyring.
|
||||||
* keyring from HTML5 local storage and initializes this instance.
|
* This method reads the keyring from HTML5 local storage and initializes this instance.
|
||||||
* @constructor
|
* @constructor
|
||||||
* @param {keyring/localstore} [storeHandler] class implementing loadPublic(), loadPrivate(), storePublic(), and storePrivate() methods
|
* @param {keyring/localstore} [storeHandler] class implementing loadPublic(), loadPrivate(), storePublic(), and storePrivate() methods
|
||||||
*/
|
*/
|
||||||
export default function Keyring(storeHandler) {
|
function Keyring(storeHandler) {
|
||||||
this.storeHandler = storeHandler || new LocalStore();
|
this.storeHandler = storeHandler || new LocalStore();
|
||||||
this.publicKeys = new KeyArray(this.storeHandler.loadPublic());
|
this.publicKeys = new KeyArray(this.storeHandler.loadPublic());
|
||||||
this.privateKeys = new KeyArray(this.storeHandler.loadPrivate());
|
this.privateKeys = new KeyArray(this.storeHandler.loadPrivate());
|
||||||
|
@ -59,7 +57,7 @@ Keyring.prototype.clear = function() {
|
||||||
* @param {String} keyId provided as string of lowercase hex number
|
* @param {String} keyId provided as string of lowercase hex number
|
||||||
* withouth 0x prefix (can be 16-character key ID or fingerprint)
|
* withouth 0x prefix (can be 16-character key ID or fingerprint)
|
||||||
* @param {Boolean} deep if true search also in subkeys
|
* @param {Boolean} deep if true search also in subkeys
|
||||||
* @return {Array<module:key~Key>|null} keys found or null
|
* @returns {Array<module:key~Key>|null} keys found or null
|
||||||
*/
|
*/
|
||||||
Keyring.prototype.getKeysForId = function (keyId, deep) {
|
Keyring.prototype.getKeysForId = function (keyId, deep) {
|
||||||
let result = [];
|
let result = [];
|
||||||
|
@ -72,7 +70,7 @@ Keyring.prototype.getKeysForId = function (keyId, deep) {
|
||||||
* Removes keys having the specified key id from the keyring
|
* Removes keys having the specified key id from the keyring
|
||||||
* @param {String} keyId provided as string of lowercase hex number
|
* @param {String} keyId provided as string of lowercase hex number
|
||||||
* withouth 0x prefix (can be 16-character key ID or fingerprint)
|
* withouth 0x prefix (can be 16-character key ID or fingerprint)
|
||||||
* @return {Array<module:key~Key>|null} keys found or null
|
* @returns {Array<module:key~Key>|null} keys found or null
|
||||||
*/
|
*/
|
||||||
Keyring.prototype.removeKeysForId = function (keyId) {
|
Keyring.prototype.removeKeysForId = function (keyId) {
|
||||||
let result = [];
|
let result = [];
|
||||||
|
@ -83,7 +81,7 @@ Keyring.prototype.removeKeysForId = function (keyId) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get all public and private keys
|
* Get all public and private keys
|
||||||
* @return {Array<module:key~Key>} all keys
|
* @returns {Array<module:key~Key>} all keys
|
||||||
*/
|
*/
|
||||||
Keyring.prototype.getAllKeys = function () {
|
Keyring.prototype.getAllKeys = function () {
|
||||||
return this.publicKeys.keys.concat(this.privateKeys.keys);
|
return this.publicKeys.keys.concat(this.privateKeys.keys);
|
||||||
|
@ -100,7 +98,7 @@ function KeyArray(keys) {
|
||||||
/**
|
/**
|
||||||
* Searches all keys in the KeyArray matching the address or address part of the user ids
|
* Searches all keys in the KeyArray matching the address or address part of the user ids
|
||||||
* @param {String} email email address to search for
|
* @param {String} email email address to search for
|
||||||
* @return {Array<module:key~Key>} The public keys associated with provided email address.
|
* @returns {Array<module:key~Key>} The public keys associated with provided email address.
|
||||||
*/
|
*/
|
||||||
KeyArray.prototype.getForAddress = function(email) {
|
KeyArray.prototype.getForAddress = function(email) {
|
||||||
const results = [];
|
const results = [];
|
||||||
|
@ -117,7 +115,7 @@ KeyArray.prototype.getForAddress = function(email) {
|
||||||
* @private
|
* @private
|
||||||
* @param {String} email email address to search for
|
* @param {String} email email address to search for
|
||||||
* @param {module:key~Key} key The key to be checked.
|
* @param {module:key~Key} key The key to be checked.
|
||||||
* @return {Boolean} True if the email address is defined in the specified key
|
* @returns {Boolean} True if the email address is defined in the specified key
|
||||||
*/
|
*/
|
||||||
function emailCheck(email, key) {
|
function emailCheck(email, key) {
|
||||||
email = email.toLowerCase();
|
email = email.toLowerCase();
|
||||||
|
@ -140,7 +138,7 @@ function emailCheck(email, key) {
|
||||||
* @param {String} keyId provided as string of lowercase hex number
|
* @param {String} keyId provided as string of lowercase hex number
|
||||||
* withouth 0x prefix (can be 16-character key ID or fingerprint)
|
* withouth 0x prefix (can be 16-character key ID or fingerprint)
|
||||||
* @param {module:packet/secret_key|public_key|public_subkey|secret_subkey} keypacket The keypacket to be checked
|
* @param {module:packet/secret_key|public_key|public_subkey|secret_subkey} keypacket The keypacket to be checked
|
||||||
* @return {Boolean} True if keypacket has the specified keyid
|
* @returns {Boolean} True if keypacket has the specified keyid
|
||||||
*/
|
*/
|
||||||
function keyIdCheck(keyId, keypacket) {
|
function keyIdCheck(keyId, keypacket) {
|
||||||
if (keyId.length === 16) {
|
if (keyId.length === 16) {
|
||||||
|
@ -154,7 +152,7 @@ function keyIdCheck(keyId, keypacket) {
|
||||||
* @param {String} keyId provided as string of lowercase hex number
|
* @param {String} keyId provided as string of lowercase hex number
|
||||||
* withouth 0x prefix (can be 16-character key ID or fingerprint)
|
* withouth 0x prefix (can be 16-character key ID or fingerprint)
|
||||||
* @param {Boolean} deep if true search also in subkeys
|
* @param {Boolean} deep if true search also in subkeys
|
||||||
* @return {module:key~Key|null} key found or null
|
* @returns {module:key~Key|null} key found or null
|
||||||
*/
|
*/
|
||||||
KeyArray.prototype.getForId = function (keyId, deep) {
|
KeyArray.prototype.getForId = function (keyId, deep) {
|
||||||
for (let i = 0; i < this.keys.length; i++) {
|
for (let i = 0; i < this.keys.length; i++) {
|
||||||
|
@ -175,28 +173,31 @@ KeyArray.prototype.getForId = function (keyId, deep) {
|
||||||
/**
|
/**
|
||||||
* Imports a key from an ascii armored message
|
* Imports a key from an ascii armored message
|
||||||
* @param {String} armored message to read the keys/key from
|
* @param {String} armored message to read the keys/key from
|
||||||
* @return {Array<Error>|null} array of error objects or null
|
* @returns {Promise<Array<Error>|null>} array of error objects or null
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
KeyArray.prototype.importKey = function (armored) {
|
KeyArray.prototype.importKey = async function (armored) {
|
||||||
const imported = readArmored(armored);
|
const imported = readArmored(armored);
|
||||||
const that = this;
|
const that = this;
|
||||||
imported.keys.forEach(async function(key) {
|
for (let i = 0; i < imported.keys.length; i++) {
|
||||||
|
const key = imported.keys[i];
|
||||||
// check if key already in key array
|
// check if key already in key array
|
||||||
const keyidHex = key.primaryKey.getKeyId().toHex();
|
const keyidHex = key.primaryKey.getKeyId().toHex();
|
||||||
const keyFound = that.getForId(keyidHex);
|
const keyFound = that.getForId(keyidHex);
|
||||||
if (keyFound) {
|
if (keyFound) {
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
await keyFound.update(key);
|
await keyFound.update(key);
|
||||||
} else {
|
} else {
|
||||||
that.push(key);
|
that.push(key);
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
return imported.err ? imported.err : null;
|
return imported.err ? imported.err : null;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add key to KeyArray
|
* Add key to KeyArray
|
||||||
* @param {module:key~Key} key The key that will be added to the keyring
|
* @param {module:key~Key} key The key that will be added to the keyring
|
||||||
* @return {Number} The new length of the KeyArray
|
* @returns {Number} The new length of the KeyArray
|
||||||
*/
|
*/
|
||||||
KeyArray.prototype.push = function (key) {
|
KeyArray.prototype.push = function (key) {
|
||||||
return this.keys.push(key);
|
return this.keys.push(key);
|
||||||
|
@ -206,7 +207,7 @@ KeyArray.prototype.push = function (key) {
|
||||||
* Removes a key with the specified keyid from the keyring
|
* Removes a key with the specified keyid from the keyring
|
||||||
* @param {String} keyId provided as string of lowercase hex number
|
* @param {String} keyId provided as string of lowercase hex number
|
||||||
* withouth 0x prefix (can be 16-character key ID or fingerprint)
|
* withouth 0x prefix (can be 16-character key ID or fingerprint)
|
||||||
* @return {module:key~Key|null} The key object which has been removed or null
|
* @returns {module:key~Key|null} The key object which has been removed or null
|
||||||
*/
|
*/
|
||||||
KeyArray.prototype.removeForId = function (keyId) {
|
KeyArray.prototype.removeForId = function (keyId) {
|
||||||
for (let i = 0; i < this.keys.length; i++) {
|
for (let i = 0; i < this.keys.length; i++) {
|
||||||
|
@ -216,3 +217,5 @@ KeyArray.prototype.removeForId = function (keyId) {
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default Keyring;
|
||||||
|
|
|
@ -16,19 +16,23 @@
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The class that deals with storage of the keyring. Currently the only option is to use HTML5 local storage.
|
|
||||||
* @requires config
|
* @requires config
|
||||||
* @requires key
|
* @requires key
|
||||||
* @requires util
|
* @requires util
|
||||||
* @module keyring/localstore
|
* @module keyring/localstore
|
||||||
* @param {String} prefix prefix for itemnames in localstore
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import config from '../config';
|
import config from '../config';
|
||||||
import { readArmored } from '../key';
|
import { readArmored } from '../key';
|
||||||
import util from '../util';
|
import util from '../util';
|
||||||
|
|
||||||
export default function LocalStore(prefix) {
|
/**
|
||||||
|
* The class that deals with storage of the keyring.
|
||||||
|
* Currently the only option is to use HTML5 local storage.
|
||||||
|
* @constructor
|
||||||
|
* @param {String} prefix prefix for itemnames in localstore
|
||||||
|
*/
|
||||||
|
function LocalStore(prefix) {
|
||||||
prefix = prefix || 'openpgp-';
|
prefix = prefix || 'openpgp-';
|
||||||
this.publicKeysItem = prefix + this.publicKeysItem;
|
this.publicKeysItem = prefix + this.publicKeysItem;
|
||||||
this.privateKeysItem = prefix + this.privateKeysItem;
|
this.privateKeysItem = prefix + this.privateKeysItem;
|
||||||
|
@ -47,7 +51,7 @@ LocalStore.prototype.privateKeysItem = 'private-keys';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load the public keys from HTML5 local storage.
|
* Load the public keys from HTML5 local storage.
|
||||||
* @return {Array<module:key~Key>} array of keys retrieved from localstore
|
* @returns {Array<module:key~Key>} array of keys retrieved from localstore
|
||||||
*/
|
*/
|
||||||
LocalStore.prototype.loadPublic = function () {
|
LocalStore.prototype.loadPublic = function () {
|
||||||
return loadKeys(this.storage, this.publicKeysItem);
|
return loadKeys(this.storage, this.publicKeysItem);
|
||||||
|
@ -55,7 +59,7 @@ LocalStore.prototype.loadPublic = function () {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load the private keys from HTML5 local storage.
|
* Load the private keys from HTML5 local storage.
|
||||||
* @return {Array<module:key~Key>} array of keys retrieved from localstore
|
* @returns {Array<module:key~Key>} array of keys retrieved from localstore
|
||||||
*/
|
*/
|
||||||
LocalStore.prototype.loadPrivate = function () {
|
LocalStore.prototype.loadPrivate = function () {
|
||||||
return loadKeys(this.storage, this.privateKeysItem);
|
return loadKeys(this.storage, this.privateKeysItem);
|
||||||
|
@ -107,3 +111,5 @@ function storeKeys(storage, itemname, keys) {
|
||||||
storage.removeItem(itemname);
|
storage.removeItem(itemname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default LocalStore;
|
||||||
|
|
|
@ -94,6 +94,7 @@ Message.prototype.getSigningKeyIds = function() {
|
||||||
* @param {Array<String>} passwords (optional) passwords used to decrypt
|
* @param {Array<String>} passwords (optional) passwords used to decrypt
|
||||||
* @param {Array<Object>} sessionKeys (optional) session keys in the form: { data:Uint8Array, algorithm:String }
|
* @param {Array<Object>} sessionKeys (optional) session keys in the form: { data:Uint8Array, algorithm:String }
|
||||||
* @returns {Promise<Message>} new message with decrypted content
|
* @returns {Promise<Message>} new message with decrypted content
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Message.prototype.decrypt = async function(privateKeys, passwords, sessionKeys) {
|
Message.prototype.decrypt = async function(privateKeys, passwords, sessionKeys) {
|
||||||
const keyObjs = sessionKeys || await this.decryptSessionKeys(privateKeys, passwords);
|
const keyObjs = sessionKeys || await this.decryptSessionKeys(privateKeys, passwords);
|
||||||
|
@ -140,6 +141,7 @@ Message.prototype.decrypt = async function(privateKeys, passwords, sessionKeys)
|
||||||
* @param {Array<String>} passwords (optional) passwords used to decrypt
|
* @param {Array<String>} passwords (optional) passwords used to decrypt
|
||||||
* @returns {Promise<Array<{ data: Uint8Array,
|
* @returns {Promise<Array<{ data: Uint8Array,
|
||||||
algorithm: String }>>} array of object with potential sessionKey, algorithm pairs
|
algorithm: String }>>} array of object with potential sessionKey, algorithm pairs
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Message.prototype.decryptSessionKeys = async function(privateKeys, passwords) {
|
Message.prototype.decryptSessionKeys = async function(privateKeys, passwords) {
|
||||||
let keyPackets = [];
|
let keyPackets = [];
|
||||||
|
@ -241,6 +243,7 @@ Message.prototype.getText = function() {
|
||||||
* @param {Boolean} wildcard (optional) use a key ID of 0 instead of the public key IDs
|
* @param {Boolean} wildcard (optional) use a key ID of 0 instead of the public key IDs
|
||||||
* @param {Date} date (optional) override the creation date of the literal package
|
* @param {Date} date (optional) override the creation date of the literal package
|
||||||
* @returns {Promise<Message>} new message with encrypted content
|
* @returns {Promise<Message>} new message with encrypted content
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Message.prototype.encrypt = async function(keys, passwords, sessionKey, wildcard=false, date=new Date()) {
|
Message.prototype.encrypt = async function(keys, passwords, sessionKey, wildcard=false, date=new Date()) {
|
||||||
let symAlgo;
|
let symAlgo;
|
||||||
|
@ -297,6 +300,7 @@ Message.prototype.encrypt = async function(keys, passwords, sessionKey, wildcard
|
||||||
* @param {Boolean} wildcard (optional) use a key ID of 0 instead of the public key IDs
|
* @param {Boolean} wildcard (optional) use a key ID of 0 instead of the public key IDs
|
||||||
* @param {Date} date (optional) override the creation date signature
|
* @param {Date} date (optional) override the creation date signature
|
||||||
* @returns {Promise<Message>} new message with encrypted content
|
* @returns {Promise<Message>} new message with encrypted content
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
export async function encryptSessionKey(sessionKey, symAlgo, publicKeys, passwords, wildcard=false, date=new Date()) {
|
export async function encryptSessionKey(sessionKey, symAlgo, publicKeys, passwords, wildcard=false, date=new Date()) {
|
||||||
const packetlist = new packet.List();
|
const packetlist = new packet.List();
|
||||||
|
@ -361,6 +365,7 @@ export async function encryptSessionKey(sessionKey, symAlgo, publicKeys, passwor
|
||||||
* @param {Signature} signature (optional) any existing detached signature to add to the message
|
* @param {Signature} signature (optional) any existing detached signature to add to the message
|
||||||
* @param {Date} date} (optional) override the creation time of the signature
|
* @param {Date} date} (optional) override the creation time of the signature
|
||||||
* @returns {Promise<Message>} new message with signed content
|
* @returns {Promise<Message>} new message with signed content
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Message.prototype.sign = async function(privateKeys=[], signature=null, date=new Date()) {
|
Message.prototype.sign = async function(privateKeys=[], signature=null, date=new Date()) {
|
||||||
const packetlist = new packet.List();
|
const packetlist = new packet.List();
|
||||||
|
@ -446,6 +451,7 @@ Message.prototype.compress = function(compression) {
|
||||||
* @param {Signature} signature (optional) any existing detached signature
|
* @param {Signature} signature (optional) any existing detached signature
|
||||||
* @param {Date} date (optional) override the creation time of the signature
|
* @param {Date} date (optional) override the creation time of the signature
|
||||||
* @returns {Promise<module:signature~Signature>} new detached signature of message content
|
* @returns {Promise<module:signature~Signature>} new detached signature of message content
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Message.prototype.signDetached = async function(privateKeys=[], signature=null, date=new Date()) {
|
Message.prototype.signDetached = async function(privateKeys=[], signature=null, date=new Date()) {
|
||||||
const literalDataPacket = this.packets.findPacket(enums.packet.literal);
|
const literalDataPacket = this.packets.findPacket(enums.packet.literal);
|
||||||
|
@ -462,6 +468,7 @@ Message.prototype.signDetached = async function(privateKeys=[], signature=null,
|
||||||
* @param {Signature} signature (optional) any existing detached signature to append
|
* @param {Signature} signature (optional) any existing detached signature to append
|
||||||
* @param {Date} date (optional) override the creationtime of the signature
|
* @param {Date} date (optional) override the creationtime of the signature
|
||||||
* @returns {Promise<module:packet/packetlist>} list of signature packets
|
* @returns {Promise<module:packet/packetlist>} list of signature packets
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
export async function createSignaturePackets(literalDataPacket, privateKeys, signature=null, date=new Date()) {
|
export async function createSignaturePackets(literalDataPacket, privateKeys, signature=null, date=new Date()) {
|
||||||
const packetlist = new packet.List();
|
const packetlist = new packet.List();
|
||||||
|
@ -503,7 +510,8 @@ export async function createSignaturePackets(literalDataPacket, privateKeys, sig
|
||||||
* Verify message signatures
|
* Verify message signatures
|
||||||
* @param {Array<module:key~Key>} keys array of keys to verify signatures
|
* @param {Array<module:key~Key>} keys array of keys to verify signatures
|
||||||
* @param {Date} date (optional) Verify the signature against the given date, i.e. check signature creation time < date < expiration time
|
* @param {Date} date (optional) Verify the signature against the given date, i.e. check signature creation time < date < expiration time
|
||||||
* @returns {Array<({keyid: module:type/keyid, valid: Boolean})>} list of signer's keyid and validity of signature
|
* @returns {Promise<Array<({keyid: module:type/keyid, valid: Boolean})>>} list of signer's keyid and validity of signature
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Message.prototype.verify = function(keys, date=new Date()) {
|
Message.prototype.verify = function(keys, date=new Date()) {
|
||||||
const msg = this.unwrapCompressed();
|
const msg = this.unwrapCompressed();
|
||||||
|
@ -520,7 +528,8 @@ Message.prototype.verify = function(keys, date=new Date()) {
|
||||||
* @param {Array<module:key~Key>} keys array of keys to verify signatures
|
* @param {Array<module:key~Key>} keys array of keys to verify signatures
|
||||||
* @param {Signature} signature
|
* @param {Signature} signature
|
||||||
* @param {Date} date Verify the signature against the given date, i.e. check signature creation time < date < expiration time
|
* @param {Date} date Verify the signature against the given date, i.e. check signature creation time < date < expiration time
|
||||||
* @returns {Array<({keyid: module:type/keyid, valid: Boolean})>} list of signer's keyid and validity of signature
|
* @returns {Promise<Array<({keyid: module:type/keyid, valid: Boolean})>>} list of signer's keyid and validity of signature
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Message.prototype.verifyDetached = function(signature, keys, date=new Date()) {
|
Message.prototype.verifyDetached = function(signature, keys, date=new Date()) {
|
||||||
const msg = this.unwrapCompressed();
|
const msg = this.unwrapCompressed();
|
||||||
|
@ -541,6 +550,7 @@ Message.prototype.verifyDetached = function(signature, keys, date=new Date()) {
|
||||||
* i.e. check signature creation time < date < expiration time
|
* i.e. check signature creation time < date < expiration time
|
||||||
* @returns {Promise<Array<{keyid: module:type/keyid,
|
* @returns {Promise<Array<{keyid: module:type/keyid,
|
||||||
* valid: Boolean}>>} list of signer's keyid and validity of signature
|
* valid: Boolean}>>} list of signer's keyid and validity of signature
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
export async function createVerificationObjects(signatureList, literalDataList, keys, date=new Date()) {
|
export async function createVerificationObjects(signatureList, literalDataList, keys, date=new Date()) {
|
||||||
return Promise.all(signatureList.map(async function(signature) {
|
return Promise.all(signatureList.map(async function(signature) {
|
||||||
|
|
|
@ -99,6 +99,7 @@ export function destroyWorker() {
|
||||||
* @param {Number} keyExpirationTime (optional) The number of seconds after the key creation time that the key expires
|
* @param {Number} keyExpirationTime (optional) The number of seconds after the key creation time that the key expires
|
||||||
* @returns {Promise<Object>} The generated key object in the form:
|
* @returns {Promise<Object>} The generated key object in the form:
|
||||||
* { key:Key, privateKeyArmored:String, publicKeyArmored:String }
|
* { key:Key, privateKeyArmored:String, publicKeyArmored:String }
|
||||||
|
* @async
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -136,6 +137,7 @@ export function generateKey({
|
||||||
* @param {Number} keyExpirationTime (optional) The number of seconds after the key creation time that the key expires
|
* @param {Number} keyExpirationTime (optional) The number of seconds after the key creation time that the key expires
|
||||||
* @returns {Promise<Object>} The generated key object in the form:
|
* @returns {Promise<Object>} The generated key object in the form:
|
||||||
* { key:Key, privateKeyArmored:String, publicKeyArmored:String }
|
* { key:Key, privateKeyArmored:String, publicKeyArmored:String }
|
||||||
|
* @async
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
export function reformatKey({
|
export function reformatKey({
|
||||||
|
@ -165,6 +167,7 @@ export function reformatKey({
|
||||||
* @param {Key} privateKey the private key that is to be decrypted
|
* @param {Key} privateKey the private key that is to be decrypted
|
||||||
* @param {String} passphrase the user's passphrase chosen during key generation
|
* @param {String} passphrase the user's passphrase chosen during key generation
|
||||||
* @returns {Promise<Object>} the unlocked key object in the form: { key:Key }
|
* @returns {Promise<Object>} the unlocked key object in the form: { key:Key }
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
export function decryptKey({ privateKey, passphrase }) {
|
export function decryptKey({ privateKey, passphrase }) {
|
||||||
if (asyncProxy) { // use web worker if available
|
if (asyncProxy) { // use web worker if available
|
||||||
|
@ -185,6 +188,7 @@ export function decryptKey({ privateKey, passphrase }) {
|
||||||
* @param {Key} privateKey the private key that is to be decrypted
|
* @param {Key} privateKey the private key that is to be decrypted
|
||||||
* @param {String} passphrase the user's passphrase chosen during key generation
|
* @param {String} passphrase the user's passphrase chosen during key generation
|
||||||
* @returns {Promise<Object>} the locked key object in the form: { key:Key }
|
* @returns {Promise<Object>} the locked key object in the form: { key:Key }
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
export function encryptKey({ privateKey, passphrase }) {
|
export function encryptKey({ privateKey, passphrase }) {
|
||||||
if (asyncProxy) { // use web worker if available
|
if (asyncProxy) { // use web worker if available
|
||||||
|
@ -227,6 +231,7 @@ export function encryptKey({ privateKey, passphrase }) {
|
||||||
* @returns {Promise<Object>} encrypted (and optionally signed message) in the form:
|
* @returns {Promise<Object>} encrypted (and optionally signed message) in the form:
|
||||||
* {data: ASCII armored message if 'armor' is true,
|
* {data: ASCII armored message if 'armor' is true,
|
||||||
* message: full Message object if 'armor' is false, signature: detached signature if 'detached' is true}
|
* message: full Message object if 'armor' is false, signature: detached signature if 'detached' is true}
|
||||||
|
* @async
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
export function encrypt({ data, publicKeys, privateKeys, passwords, sessionKey, filename, compression=config.compression, armor=true, detached=false, signature=null, returnSessionKey=false, wildcard=false, date=new Date()}) {
|
export function encrypt({ data, publicKeys, privateKeys, passwords, sessionKey, filename, compression=config.compression, armor=true, detached=false, signature=null, returnSessionKey=false, wildcard=false, date=new Date()}) {
|
||||||
|
@ -278,6 +283,7 @@ export function encrypt({ data, publicKeys, privateKeys, passwords, sessionKey,
|
||||||
* @param {Date} date (optional) use the given date for verification instead of the current time
|
* @param {Date} date (optional) use the given date for verification instead of the current time
|
||||||
* @returns {Promise<Object>} decrypted and verified message in the form:
|
* @returns {Promise<Object>} decrypted and verified message in the form:
|
||||||
* { data:Uint8Array|String, filename:String, signatures:[{ keyid:String, valid:Boolean }] }
|
* { data:Uint8Array|String, filename:String, signatures:[{ keyid:String, valid:Boolean }] }
|
||||||
|
* @async
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
export function decrypt({ message, privateKeys, passwords, sessionKeys, publicKeys, format='utf8', signature=null, date=new Date() }) {
|
export function decrypt({ message, privateKeys, passwords, sessionKeys, publicKeys, format='utf8', signature=null, date=new Date() }) {
|
||||||
|
@ -318,6 +324,7 @@ export function decrypt({ message, privateKeys, passwords, sessionKeys, publicKe
|
||||||
* @returns {Promise<Object>} signed cleartext in the form:
|
* @returns {Promise<Object>} signed cleartext in the form:
|
||||||
* {data: ASCII armored message if 'armor' is true,
|
* {data: ASCII armored message if 'armor' is true,
|
||||||
* message: full Message object if 'armor' is false, signature: detached signature if 'detached' is true}
|
* message: full Message object if 'armor' is false, signature: detached signature if 'detached' is true}
|
||||||
|
* @async
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
export function sign({
|
export function sign({
|
||||||
|
@ -359,6 +366,7 @@ export function sign({
|
||||||
* @param {Date} date (optional) use the given date for verification instead of the current time
|
* @param {Date} date (optional) use the given date for verification instead of the current time
|
||||||
* @returns {Promise<Object>} cleartext with status of verified signatures in the form of:
|
* @returns {Promise<Object>} cleartext with status of verified signatures in the form of:
|
||||||
* { data:String, signatures: [{ keyid:String, valid:Boolean }] }
|
* { data:String, signatures: [{ keyid:String, valid:Boolean }] }
|
||||||
|
* @async
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
export function verify({ message, publicKeys, signature=null, date=new Date() }) {
|
export function verify({ message, publicKeys, signature=null, date=new Date() }) {
|
||||||
|
@ -396,6 +404,7 @@ export function verify({ message, publicKeys, signature=null, date=new Date() })
|
||||||
* @param {String|Array<String>} passwords (optional) passwords for the message
|
* @param {String|Array<String>} passwords (optional) passwords for the message
|
||||||
* @param {Boolean} wildcard (optional) use a key ID of 0 instead of the public key IDs
|
* @param {Boolean} wildcard (optional) use a key ID of 0 instead of the public key IDs
|
||||||
* @returns {Promise<Message>} the encrypted session key packets contained in a message object
|
* @returns {Promise<Message>} the encrypted session key packets contained in a message object
|
||||||
|
* @async
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
export function encryptSessionKey({ data, algorithm, publicKeys, passwords, wildcard=false }) {
|
export function encryptSessionKey({ data, algorithm, publicKeys, passwords, wildcard=false }) {
|
||||||
|
@ -421,6 +430,7 @@ export function encryptSessionKey({ data, algorithm, publicKeys, passwords, wild
|
||||||
* @returns {Promise<Object|undefined>} Array of decrypted session key, algorithm pairs in form:
|
* @returns {Promise<Object|undefined>} Array of decrypted session key, algorithm pairs in form:
|
||||||
* { data:Uint8Array, algorithm:String }
|
* { data:Uint8Array, algorithm:String }
|
||||||
* or 'undefined' if no key packets found
|
* or 'undefined' if no key packets found
|
||||||
|
* @async
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
export function decryptSessionKeys({ message, privateKeys, passwords }) {
|
export function decryptSessionKeys({ message, privateKeys, passwords }) {
|
||||||
|
|
|
@ -41,7 +41,7 @@ import util from '../util';
|
||||||
/**
|
/**
|
||||||
* Create a packetlist from the correspoding object types.
|
* Create a packetlist from the correspoding object types.
|
||||||
* @param {Object} options the object passed to and from the web worker
|
* @param {Object} options the object passed to and from the web worker
|
||||||
* @return {Object} a mutated version of the options optject
|
* @returns {Object} a mutated version of the options optject
|
||||||
*/
|
*/
|
||||||
export function clonePackets(options) {
|
export function clonePackets(options) {
|
||||||
if (options.publicKeys) {
|
if (options.publicKeys) {
|
||||||
|
@ -89,7 +89,7 @@ function verificationObjectToClone(verObject) {
|
||||||
* Creates an object with the correct prototype from a corresponding packetlist.
|
* Creates an object with the correct prototype from a corresponding packetlist.
|
||||||
* @param {Object} options the object passed to and from the web worker
|
* @param {Object} options the object passed to and from the web worker
|
||||||
* @param {String} method the public api function name to be delegated to the worker
|
* @param {String} method the public api function name to be delegated to the worker
|
||||||
* @return {Object} a mutated version of the options optject
|
* @returns {Object} a mutated version of the options optject
|
||||||
*/
|
*/
|
||||||
export function parseClonedPackets(options) {
|
export function parseClonedPackets(options) {
|
||||||
if (options.publicKeys) {
|
if (options.publicKeys) {
|
||||||
|
|
|
@ -89,7 +89,7 @@ if (nodeZlib) { // Use Node native zlib for DEFLATE compression/decompression
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function Compressed() {
|
function Compressed() {
|
||||||
/**
|
/**
|
||||||
* Packet type
|
* Packet type
|
||||||
* @type {module:enums.packet}
|
* @type {module:enums.packet}
|
||||||
|
@ -130,7 +130,7 @@ Compressed.prototype.read = function (bytes) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the compressed packet.
|
* Return the compressed packet.
|
||||||
* @return {String} binary compressed packet
|
* @returns {String} binary compressed packet
|
||||||
*/
|
*/
|
||||||
Compressed.prototype.write = function () {
|
Compressed.prototype.write = function () {
|
||||||
if (this.compressed === null) {
|
if (this.compressed === null) {
|
||||||
|
@ -165,3 +165,5 @@ Compressed.prototype.compress = function () {
|
||||||
|
|
||||||
this.compressed = compress_fns[this.algorithm](this.packets.write());
|
this.compressed = compress_fns[this.algorithm](this.packets.write());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default Compressed;
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview OpenPGP packet types
|
||||||
|
* @see module:packet/all_packets
|
||||||
|
* @see module:packet/packetlist
|
||||||
|
* @see module:packet/clone
|
||||||
|
* @module packet
|
||||||
|
*/
|
||||||
|
|
||||||
import * as packets from './all_packets.js';
|
import * as packets from './all_packets.js';
|
||||||
import * as clone from './clone.js';
|
import * as clone from './clone.js';
|
||||||
import List from './packetlist.js';
|
import List from './packetlist.js';
|
||||||
|
|
|
@ -33,7 +33,7 @@ import enums from '../enums.js';
|
||||||
* @param {Date} date the creation date of the literal package
|
* @param {Date} date the creation date of the literal package
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function Literal(date=new Date()) {
|
function Literal(date=new Date()) {
|
||||||
this.tag = enums.packet.literal;
|
this.tag = enums.packet.literal;
|
||||||
this.format = 'utf8'; // default format for literal data packets
|
this.format = 'utf8'; // default format for literal data packets
|
||||||
this.date = util.normalizeDate(date);
|
this.date = util.normalizeDate(date);
|
||||||
|
@ -56,7 +56,7 @@ Literal.prototype.setText = function(text) {
|
||||||
/**
|
/**
|
||||||
* Returns literal data packets as native JavaScript string
|
* Returns literal data packets as native JavaScript string
|
||||||
* with normalized end of line to \n
|
* with normalized end of line to \n
|
||||||
* @return {String} literal data as text
|
* @returns {String} literal data as text
|
||||||
*/
|
*/
|
||||||
Literal.prototype.getText = function() {
|
Literal.prototype.getText = function() {
|
||||||
// decode UTF8
|
// decode UTF8
|
||||||
|
@ -107,7 +107,7 @@ Literal.prototype.getFilename = function() {
|
||||||
* Parsing function for a literal data packet (tag 11).
|
* Parsing function for a literal data packet (tag 11).
|
||||||
*
|
*
|
||||||
* @param {Uint8Array} input Payload of a tag 11 packet
|
* @param {Uint8Array} input Payload of a tag 11 packet
|
||||||
* @return {module:packet/literal} object representation
|
* @returns {module:packet/literal} object representation
|
||||||
*/
|
*/
|
||||||
Literal.prototype.read = function(bytes) {
|
Literal.prototype.read = function(bytes) {
|
||||||
// - A one-octet field that describes how the data is formatted.
|
// - A one-octet field that describes how the data is formatted.
|
||||||
|
@ -126,7 +126,7 @@ Literal.prototype.read = function(bytes) {
|
||||||
/**
|
/**
|
||||||
* Creates a string representation of the packet
|
* Creates a string representation of the packet
|
||||||
*
|
*
|
||||||
* @return {Uint8Array} Uint8Array representation of the packet
|
* @returns {Uint8Array} Uint8Array representation of the packet
|
||||||
*/
|
*/
|
||||||
Literal.prototype.write = function() {
|
Literal.prototype.write = function() {
|
||||||
const filename = util.str_to_Uint8Array(util.encode_utf8(this.filename));
|
const filename = util.str_to_Uint8Array(util.encode_utf8(this.filename));
|
||||||
|
@ -138,3 +138,5 @@ Literal.prototype.write = function() {
|
||||||
|
|
||||||
return util.concatUint8Array([format, filename_length, filename, date, data]);
|
return util.concatUint8Array([format, filename_length, filename, date, data]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default Literal;
|
||||||
|
|
|
@ -34,7 +34,7 @@ import enums from '../enums.js';
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function Marker() {
|
function Marker() {
|
||||||
this.tag = enums.packet.marker;
|
this.tag = enums.packet.marker;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ export default function Marker() {
|
||||||
* @param {Integer} len
|
* @param {Integer} len
|
||||||
* Length of the packet or the remaining length of
|
* Length of the packet or the remaining length of
|
||||||
* input at position
|
* input at position
|
||||||
* @return {module:packet/marker} Object representation
|
* @returns {module:packet/marker} Object representation
|
||||||
*/
|
*/
|
||||||
Marker.prototype.read = function (bytes) {
|
Marker.prototype.read = function (bytes) {
|
||||||
if (bytes[0] === 0x50 && // P
|
if (bytes[0] === 0x50 && // P
|
||||||
|
@ -58,3 +58,5 @@ Marker.prototype.read = function (bytes) {
|
||||||
// marker packet does not contain "PGP"
|
// marker packet does not contain "PGP"
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default Marker;
|
||||||
|
|
|
@ -37,7 +37,7 @@ import type_keyid from '../type/keyid.js';
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function OnePassSignature() {
|
function OnePassSignature() {
|
||||||
this.tag = enums.packet.onePassSignature; // The packet type
|
this.tag = enums.packet.onePassSignature; // The packet type
|
||||||
this.version = null; // A one-octet version number. The current version is 3.
|
this.version = null; // A one-octet version number. The current version is 3.
|
||||||
this.type = null; // A one-octet signature type. Signature types are described in {@link https://tools.ietf.org/html/rfc4880#section-5.2.1|RFC4880 Section 5.2.1}.
|
this.type = null; // A one-octet signature type. Signature types are described in {@link https://tools.ietf.org/html/rfc4880#section-5.2.1|RFC4880 Section 5.2.1}.
|
||||||
|
@ -50,7 +50,7 @@ export default function OnePassSignature() {
|
||||||
/**
|
/**
|
||||||
* parsing function for a one-pass signature packet (tag 4).
|
* parsing function for a one-pass signature packet (tag 4).
|
||||||
* @param {Uint8Array} bytes payload of a tag 4 packet
|
* @param {Uint8Array} bytes payload of a tag 4 packet
|
||||||
* @return {module:packet/one_pass_signature} object representation
|
* @returns {module:packet/one_pass_signature} object representation
|
||||||
*/
|
*/
|
||||||
OnePassSignature.prototype.read = function (bytes) {
|
OnePassSignature.prototype.read = function (bytes) {
|
||||||
let mypos = 0;
|
let mypos = 0;
|
||||||
|
@ -82,7 +82,7 @@ OnePassSignature.prototype.read = function (bytes) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* creates a string representation of a one-pass signature packet
|
* creates a string representation of a one-pass signature packet
|
||||||
* @return {Uint8Array} a Uint8Array representation of a one-pass signature packet
|
* @returns {Uint8Array} a Uint8Array representation of a one-pass signature packet
|
||||||
*/
|
*/
|
||||||
OnePassSignature.prototype.write = function () {
|
OnePassSignature.prototype.write = function () {
|
||||||
const start = new Uint8Array([3, enums.write(enums.signature, this.type),
|
const start = new Uint8Array([3, enums.write(enums.signature, this.type),
|
||||||
|
@ -100,3 +100,5 @@ OnePassSignature.prototype.write = function () {
|
||||||
OnePassSignature.prototype.postCloneTypeFix = function() {
|
OnePassSignature.prototype.postCloneTypeFix = function() {
|
||||||
this.signingKeyId = type_keyid.fromClone(this.signingKeyId);
|
this.signingKeyId = type_keyid.fromClone(this.signingKeyId);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default OnePassSignature;
|
||||||
|
|
|
@ -52,7 +52,7 @@ export default {
|
||||||
* string
|
* string
|
||||||
*
|
*
|
||||||
* @param {Integer} length The length to encode
|
* @param {Integer} length The length to encode
|
||||||
* @return {Uint8Array} String with openpgp length representation
|
* @returns {Uint8Array} String with openpgp length representation
|
||||||
*/
|
*/
|
||||||
writeSimpleLength: function(length) {
|
writeSimpleLength: function(length) {
|
||||||
if (length < 192) {
|
if (length < 192) {
|
||||||
|
@ -73,7 +73,7 @@ export default {
|
||||||
*
|
*
|
||||||
* @param {Integer} tag_type Tag type
|
* @param {Integer} tag_type Tag type
|
||||||
* @param {Integer} length Length of the payload
|
* @param {Integer} length Length of the payload
|
||||||
* @return {String} String of the header
|
* @returns {String} String of the header
|
||||||
*/
|
*/
|
||||||
writeHeader: function(tag_type, length) {
|
writeHeader: function(tag_type, length) {
|
||||||
/* we're only generating v4 packet headers here */
|
/* we're only generating v4 packet headers here */
|
||||||
|
@ -86,7 +86,7 @@ export default {
|
||||||
*
|
*
|
||||||
* @param {Integer} tag_type Tag type
|
* @param {Integer} tag_type Tag type
|
||||||
* @param {Integer} length Length of the payload
|
* @param {Integer} length Length of the payload
|
||||||
* @return {String} String of the header
|
* @returns {String} String of the header
|
||||||
*/
|
*/
|
||||||
writeOldHeader: function(tag_type, length) {
|
writeOldHeader: function(tag_type, length) {
|
||||||
if (length < 256) {
|
if (length < 256) {
|
||||||
|
@ -103,7 +103,7 @@ export default {
|
||||||
* @param {String} input Input stream as string
|
* @param {String} input Input stream as string
|
||||||
* @param {integer} position Position to start parsing
|
* @param {integer} position Position to start parsing
|
||||||
* @param {integer} len Length of the input from position on
|
* @param {integer} len Length of the input from position on
|
||||||
* @return {Object} Returns a parsed module:packet/packet
|
* @returns {Object} Returns a parsed module:packet/packet
|
||||||
*/
|
*/
|
||||||
read: function(input, position, len) {
|
read: function(input, position, len) {
|
||||||
// some sanity checks
|
// some sanity checks
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
/* eslint-disable callback-return */
|
/* eslint-disable callback-return */
|
||||||
/**
|
/**
|
||||||
* This class represents a list of openpgp packets.
|
|
||||||
* Take care when iterating over it - the packets themselves
|
|
||||||
* are stored as numerical indices.
|
|
||||||
* @requires util
|
* @requires util
|
||||||
* @requires enums
|
* @requires enums
|
||||||
* @requires packet
|
* @requires packet
|
||||||
|
@ -17,14 +14,19 @@ import enums from '../enums.js';
|
||||||
import config from '../config';
|
import config from '../config';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* This class represents a list of openpgp packets.
|
||||||
|
* Take care when iterating over it - the packets themselves
|
||||||
|
* are stored as numerical indices.
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function Packetlist() {
|
function Packetlist() {
|
||||||
/** The number of packets contained within the list.
|
/**
|
||||||
|
* The number of packets contained within the list.
|
||||||
* @readonly
|
* @readonly
|
||||||
* @type {Integer} */
|
* @type {Integer} */
|
||||||
this.length = 0;
|
this.length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads a stream of binary data and interprents it as a list of packets.
|
* Reads a stream of binary data and interprents it as a list of packets.
|
||||||
* @param {Uint8Array} A Uint8Array of bytes.
|
* @param {Uint8Array} A Uint8Array of bytes.
|
||||||
|
@ -166,6 +168,7 @@ Packetlist.prototype.map = function (callback) {
|
||||||
* until it finds one where callback returns a truthy value
|
* until it finds one where callback returns a truthy value
|
||||||
* @param {Function} callback
|
* @param {Function} callback
|
||||||
* @returns {Promise<Boolean>}
|
* @returns {Promise<Boolean>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Packetlist.prototype.some = async function (callback) {
|
Packetlist.prototype.some = async function (callback) {
|
||||||
for (let i = 0; i < this.length; i++) {
|
for (let i = 0; i < this.length; i++) {
|
||||||
|
@ -274,3 +277,5 @@ Packetlist.fromStructuredClone = function(packetlistClone) {
|
||||||
}
|
}
|
||||||
return packetlist;
|
return packetlist;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default Packetlist;
|
||||||
|
|
|
@ -38,7 +38,7 @@ import type_mpi from '../type/mpi';
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function PublicKey() {
|
function PublicKey() {
|
||||||
this.tag = enums.packet.publicKey;
|
this.tag = enums.packet.publicKey;
|
||||||
this.version = 4;
|
this.version = 4;
|
||||||
/** Key creation date.
|
/** Key creation date.
|
||||||
|
@ -64,7 +64,7 @@ export default function PublicKey() {
|
||||||
* Internal Parser for public keys as specified in {@link https://tools.ietf.org/html/rfc4880#section-5.5.2|RFC 4880 section 5.5.2 Public-Key Packet Formats}
|
* Internal Parser for public keys as specified in {@link https://tools.ietf.org/html/rfc4880#section-5.5.2|RFC 4880 section 5.5.2 Public-Key Packet Formats}
|
||||||
* called by read_tag<num>
|
* called by read_tag<num>
|
||||||
* @param {Uint8Array} bytes Input array to read the packet from
|
* @param {Uint8Array} bytes Input array to read the packet from
|
||||||
* @return {Object} This object with attributes set by the parser
|
* @returns {Object} This object with attributes set by the parser
|
||||||
*/
|
*/
|
||||||
PublicKey.prototype.read = function (bytes) {
|
PublicKey.prototype.read = function (bytes) {
|
||||||
let pos = 0;
|
let pos = 0;
|
||||||
|
@ -113,7 +113,7 @@ PublicKey.prototype.readPublicKey = PublicKey.prototype.read;
|
||||||
/**
|
/**
|
||||||
* Same as write_private_key, but has less information because of
|
* Same as write_private_key, but has less information because of
|
||||||
* public key.
|
* public key.
|
||||||
* @return {Uint8Array} OpenPGP packet body contents,
|
* @returns {Uint8Array} OpenPGP packet body contents,
|
||||||
*/
|
*/
|
||||||
PublicKey.prototype.write = function () {
|
PublicKey.prototype.write = function () {
|
||||||
const arr = [];
|
const arr = [];
|
||||||
|
@ -151,7 +151,7 @@ PublicKey.prototype.writeOld = function () {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculates the key id of the key
|
* Calculates the key id of the key
|
||||||
* @return {String} A 8 byte key id
|
* @returns {String} A 8 byte key id
|
||||||
*/
|
*/
|
||||||
PublicKey.prototype.getKeyId = function () {
|
PublicKey.prototype.getKeyId = function () {
|
||||||
if (this.keyid) {
|
if (this.keyid) {
|
||||||
|
@ -169,7 +169,7 @@ PublicKey.prototype.getKeyId = function () {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculates the fingerprint of the key
|
* Calculates the fingerprint of the key
|
||||||
* @return {String} A string containing the fingerprint in lowercase hex
|
* @returns {String} A string containing the fingerprint in lowercase hex
|
||||||
*/
|
*/
|
||||||
PublicKey.prototype.getFingerprint = function () {
|
PublicKey.prototype.getFingerprint = function () {
|
||||||
if (this.fingerprint) {
|
if (this.fingerprint) {
|
||||||
|
@ -193,7 +193,7 @@ PublicKey.prototype.getFingerprint = function () {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns algorithm information
|
* Returns algorithm information
|
||||||
* @return {Promise<Object>} An object of the form {algorithm: String, bits:int, curve:String}
|
* @returns {Promise<Object>} An object of the form {algorithm: String, bits:int, curve:String}
|
||||||
*/
|
*/
|
||||||
PublicKey.prototype.getAlgorithmInfo = function () {
|
PublicKey.prototype.getAlgorithmInfo = function () {
|
||||||
const result = {};
|
const result = {};
|
||||||
|
@ -220,3 +220,5 @@ PublicKey.prototype.postCloneTypeFix = function() {
|
||||||
this.keyid = type_keyid.fromClone(this.keyid);
|
this.keyid = type_keyid.fromClone(this.keyid);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default PublicKey;
|
||||||
|
|
|
@ -49,7 +49,7 @@ import crypto from '../crypto';
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function PublicKeyEncryptedSessionKey() {
|
function PublicKeyEncryptedSessionKey() {
|
||||||
this.tag = enums.packet.publicKeyEncryptedSessionKey;
|
this.tag = enums.packet.publicKeyEncryptedSessionKey;
|
||||||
this.version = 3;
|
this.version = 3;
|
||||||
|
|
||||||
|
@ -104,6 +104,7 @@ PublicKeyEncryptedSessionKey.prototype.write = function () {
|
||||||
* Encrypt session key packet
|
* Encrypt session key packet
|
||||||
* @param {module:packet/public_key} key Public key
|
* @param {module:packet/public_key} key Public key
|
||||||
* @returns {Promise<Boolean>}
|
* @returns {Promise<Boolean>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
PublicKeyEncryptedSessionKey.prototype.encrypt = async function (key) {
|
PublicKeyEncryptedSessionKey.prototype.encrypt = async function (key) {
|
||||||
let data = String.fromCharCode(enums.write(enums.symmetric, this.sessionKeyAlgorithm));
|
let data = String.fromCharCode(enums.write(enums.symmetric, this.sessionKeyAlgorithm));
|
||||||
|
@ -132,6 +133,7 @@ PublicKeyEncryptedSessionKey.prototype.encrypt = async function (key) {
|
||||||
* @param {module:packet/secret_key} key
|
* @param {module:packet/secret_key} key
|
||||||
* Private key with secret params unlocked
|
* Private key with secret params unlocked
|
||||||
* @returns {Promise<Boolean>}
|
* @returns {Promise<Boolean>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
PublicKeyEncryptedSessionKey.prototype.decrypt = async function (key) {
|
PublicKeyEncryptedSessionKey.prototype.decrypt = async function (key) {
|
||||||
const algo = enums.write(enums.publicKey, this.publicKeyAlgorithm);
|
const algo = enums.write(enums.publicKey, this.publicKeyAlgorithm);
|
||||||
|
@ -170,3 +172,5 @@ PublicKeyEncryptedSessionKey.prototype.postCloneTypeFix = function() {
|
||||||
this.encrypted[i] = types[i].fromClone(this.encrypted[i]);
|
this.encrypted[i] = types[i].fromClone(this.encrypted[i]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default PublicKeyEncryptedSessionKey;
|
||||||
|
|
|
@ -28,10 +28,12 @@ import enums from '../enums.js';
|
||||||
* @constructor
|
* @constructor
|
||||||
* @extends module:packet/public_key
|
* @extends module:packet/public_key
|
||||||
*/
|
*/
|
||||||
export default function PublicSubkey() {
|
function PublicSubkey() {
|
||||||
publicKey.call(this);
|
publicKey.call(this);
|
||||||
this.tag = enums.packet.publicSubkey;
|
this.tag = enums.packet.publicSubkey;
|
||||||
}
|
}
|
||||||
|
|
||||||
PublicSubkey.prototype = new publicKey();
|
PublicSubkey.prototype = new publicKey();
|
||||||
PublicSubkey.prototype.constructor = PublicSubkey;
|
PublicSubkey.prototype.constructor = PublicSubkey;
|
||||||
|
|
||||||
|
export default PublicSubkey;
|
||||||
|
|
|
@ -42,7 +42,7 @@ import type_keyid from '../type/keyid.js';
|
||||||
* @constructor
|
* @constructor
|
||||||
* @extends module:packet/public_key
|
* @extends module:packet/public_key
|
||||||
*/
|
*/
|
||||||
export default function SecretKey() {
|
function SecretKey() {
|
||||||
publicKey.call(this);
|
publicKey.call(this);
|
||||||
this.tag = enums.packet.secretKey;
|
this.tag = enums.packet.secretKey;
|
||||||
// encrypted secret-key data
|
// encrypted secret-key data
|
||||||
|
@ -173,6 +173,7 @@ SecretKey.prototype.write = function () {
|
||||||
* This can be used to remove passphrase protection after calling decrypt().
|
* This can be used to remove passphrase protection after calling decrypt().
|
||||||
* @param {String} passphrase
|
* @param {String} passphrase
|
||||||
* @returns {Promise<Boolean>}
|
* @returns {Promise<Boolean>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
SecretKey.prototype.encrypt = async function (passphrase) {
|
SecretKey.prototype.encrypt = async function (passphrase) {
|
||||||
if (this.isDecrypted && !passphrase) {
|
if (this.isDecrypted && !passphrase) {
|
||||||
|
@ -213,6 +214,7 @@ function produceEncryptionKey(s2k, passphrase, algorithm) {
|
||||||
*
|
*
|
||||||
* @param {String} passphrase The passphrase for this private key as string
|
* @param {String} passphrase The passphrase for this private key as string
|
||||||
* @returns {Promise<Boolean>}
|
* @returns {Promise<Boolean>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
SecretKey.prototype.decrypt = async function (passphrase) {
|
SecretKey.prototype.decrypt = async function (passphrase) {
|
||||||
if (this.isDecrypted) {
|
if (this.isDecrypted) {
|
||||||
|
@ -306,3 +308,5 @@ SecretKey.prototype.postCloneTypeFix = function() {
|
||||||
this.keyid = type_keyid.fromClone(this.keyid);
|
this.keyid = type_keyid.fromClone(this.keyid);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default SecretKey;
|
||||||
|
|
|
@ -28,10 +28,12 @@ import enums from '../enums.js';
|
||||||
* @constructor
|
* @constructor
|
||||||
* @extends module:packet/secret_key
|
* @extends module:packet/secret_key
|
||||||
*/
|
*/
|
||||||
export default function SecretSubkey() {
|
function SecretSubkey() {
|
||||||
secretKey.call(this);
|
secretKey.call(this);
|
||||||
this.tag = enums.packet.secretSubkey;
|
this.tag = enums.packet.secretSubkey;
|
||||||
}
|
}
|
||||||
|
|
||||||
SecretSubkey.prototype = new secretKey();
|
SecretSubkey.prototype = new secretKey();
|
||||||
SecretSubkey.prototype.constructor = SecretSubkey;
|
SecretSubkey.prototype.constructor = SecretSubkey;
|
||||||
|
|
||||||
|
export default SecretSubkey;
|
||||||
|
|
|
@ -42,7 +42,7 @@ import type_keyid from '../type/keyid.js';
|
||||||
* @constructor
|
* @constructor
|
||||||
* @param {Date} date the creation date of the signature
|
* @param {Date} date the creation date of the signature
|
||||||
*/
|
*/
|
||||||
export default function Signature(date=new Date()) {
|
function Signature(date=new Date()) {
|
||||||
this.tag = enums.packet.signature;
|
this.tag = enums.packet.signature;
|
||||||
this.version = 4;
|
this.version = 4;
|
||||||
this.signatureType = null;
|
this.signatureType = null;
|
||||||
|
@ -94,7 +94,7 @@ export default function Signature(date=new Date()) {
|
||||||
* @param {String} bytes payload of a tag 2 packet
|
* @param {String} bytes payload of a tag 2 packet
|
||||||
* @param {Integer} position position to start reading from the bytes string
|
* @param {Integer} position position to start reading from the bytes string
|
||||||
* @param {Integer} len length of the packet or the remaining length of bytes at position
|
* @param {Integer} len length of the packet or the remaining length of bytes at position
|
||||||
* @return {module:packet/signature} object representation
|
* @returns {module:packet/signature} object representation
|
||||||
*/
|
*/
|
||||||
Signature.prototype.read = function (bytes) {
|
Signature.prototype.read = function (bytes) {
|
||||||
let i = 0;
|
let i = 0;
|
||||||
|
@ -213,6 +213,7 @@ Signature.prototype.write = function () {
|
||||||
* @param {module:packet/secret_key} key private key used to sign the message.
|
* @param {module:packet/secret_key} key private key used to sign the message.
|
||||||
* @param {Object} data Contains packets to be signed.
|
* @param {Object} data Contains packets to be signed.
|
||||||
* @returns {Promise<Boolean>}
|
* @returns {Promise<Boolean>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Signature.prototype.sign = async function (key, data) {
|
Signature.prototype.sign = async function (key, data) {
|
||||||
const signatureType = enums.write(enums.signature, this.signatureType);
|
const signatureType = enums.write(enums.signature, this.signatureType);
|
||||||
|
@ -254,7 +255,7 @@ Signature.prototype.sign = async function (key, data) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates string of bytes with all subpacket data
|
* Creates string of bytes with all subpacket data
|
||||||
* @return {String} a string-representation of a all subpacket data
|
* @returns {String} a string-representation of a all subpacket data
|
||||||
*/
|
*/
|
||||||
Signature.prototype.write_all_sub_packets = function () {
|
Signature.prototype.write_all_sub_packets = function () {
|
||||||
const sub = enums.signatureSubpacket;
|
const sub = enums.signatureSubpacket;
|
||||||
|
@ -366,7 +367,7 @@ Signature.prototype.write_all_sub_packets = function () {
|
||||||
* @param {Integer} type subpacket signature type. Signature types as described
|
* @param {Integer} type subpacket signature type. Signature types as described
|
||||||
* in {@link https://tools.ietf.org/html/rfc4880#section-5.2.3.2|RFC4880 Section 5.2.3.2}
|
* in {@link https://tools.ietf.org/html/rfc4880#section-5.2.3.2|RFC4880 Section 5.2.3.2}
|
||||||
* @param {String} data data to be included
|
* @param {String} data data to be included
|
||||||
* @return {String} a string-representation of a sub signature packet (See {@link https://tools.ietf.org/html/rfc4880#section-5.2.3.1|RFC 4880 5.2.3.1})
|
* @returns {String} a string-representation of a sub signature packet (See {@link https://tools.ietf.org/html/rfc4880#section-5.2.3.1|RFC 4880 5.2.3.1})
|
||||||
*/
|
*/
|
||||||
function write_sub_packet(type, data) {
|
function write_sub_packet(type, data) {
|
||||||
const arr = [];
|
const arr = [];
|
||||||
|
@ -618,7 +619,8 @@ Signature.prototype.calculateTrailer = function () {
|
||||||
* @param {String|Object} data data which on the signature applies
|
* @param {String|Object} data data which on the signature applies
|
||||||
* @param {module:packet/public_subkey|module:packet/public_key|
|
* @param {module:packet/public_subkey|module:packet/public_key|
|
||||||
* module:packet/secret_subkey|module:packet/secret_key} key the public key to verify the signature
|
* module:packet/secret_subkey|module:packet/secret_key} key the public key to verify the signature
|
||||||
* @return {Promise<Boolean>} True if message is verified, else false.
|
* @returns {Promise<Boolean>} True if message is verified, else false.
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
Signature.prototype.verify = async function (key, data) {
|
Signature.prototype.verify = async function (key, data) {
|
||||||
const signatureType = enums.write(enums.signature, this.signatureType);
|
const signatureType = enums.write(enums.signature, this.signatureType);
|
||||||
|
@ -664,7 +666,7 @@ Signature.prototype.verify = async function (key, data) {
|
||||||
/**
|
/**
|
||||||
* Verifies signature expiration date
|
* Verifies signature expiration date
|
||||||
* @param {Date} date (optional) use the given date for verification instead of the current time
|
* @param {Date} date (optional) use the given date for verification instead of the current time
|
||||||
* @return {Boolean} true if expired
|
* @returns {Boolean} true if expired
|
||||||
*/
|
*/
|
||||||
Signature.prototype.isExpired = function (date=new Date()) {
|
Signature.prototype.isExpired = function (date=new Date()) {
|
||||||
const normDate = util.normalizeDate(date);
|
const normDate = util.normalizeDate(date);
|
||||||
|
@ -681,3 +683,5 @@ Signature.prototype.isExpired = function (date=new Date()) {
|
||||||
Signature.prototype.postCloneTypeFix = function() {
|
Signature.prototype.postCloneTypeFix = function() {
|
||||||
this.issuerKeyId = type_keyid.fromClone(this.issuerKeyId);
|
this.issuerKeyId = type_keyid.fromClone(this.issuerKeyId);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default Signature;
|
||||||
|
|
|
@ -16,21 +16,24 @@
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of the Symmetrically Encrypted Authenticated Encryption with Additional Data (AEAD) Protected Data Packet
|
* Implementation of the Symmetrically Encrypted Authenticated Encryption with
|
||||||
* {@link https://tools.ietf.org/html/draft-ford-openpgp-format-00#section-2.1}: AEAD Protected Data Packet
|
* Additional Data (AEAD) Protected Data Packet
|
||||||
|
*
|
||||||
|
* {@link https://tools.ietf.org/html/draft-ford-openpgp-format-00#section-2.1}:
|
||||||
|
* AEAD Protected Data Packet
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import util from '../util.js';
|
import util from '../util';
|
||||||
import crypto from '../crypto';
|
import crypto from '../crypto';
|
||||||
import enums from '../enums.js';
|
import enums from '../enums';
|
||||||
|
|
||||||
const VERSION = 1; // A one-octet version number of the data packet.
|
const VERSION = 1; // A one-octet version number of the data packet.
|
||||||
const IV_LEN = crypto.gcm.ivLength; // currently only AES-GCM is supported
|
const IV_LEN = crypto.gcm.ivLength; // currently only AES-GCM is supported
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @class
|
||||||
*/
|
*/
|
||||||
export default function SymEncryptedAEADProtected() {
|
function SymEncryptedAEADProtected() {
|
||||||
this.tag = enums.packet.symEncryptedAEADProtected;
|
this.tag = enums.packet.symEncryptedAEADProtected;
|
||||||
this.version = VERSION;
|
this.version = VERSION;
|
||||||
this.iv = null;
|
this.iv = null;
|
||||||
|
@ -38,6 +41,8 @@ export default function SymEncryptedAEADProtected() {
|
||||||
this.packets = null;
|
this.packets = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default SymEncryptedAEADProtected;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse an encrypted payload of bytes in the order: version, IV, ciphertext (see specification)
|
* Parse an encrypted payload of bytes in the order: version, IV, ciphertext (see specification)
|
||||||
*/
|
*/
|
||||||
|
@ -54,7 +59,7 @@ SymEncryptedAEADProtected.prototype.read = function (bytes) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write the encrypted payload of bytes in the order: version, IV, ciphertext (see specification)
|
* Write the encrypted payload of bytes in the order: version, IV, ciphertext (see specification)
|
||||||
* @return {Uint8Array} The encrypted payload
|
* @returns {Uint8Array} The encrypted payload
|
||||||
*/
|
*/
|
||||||
SymEncryptedAEADProtected.prototype.write = function () {
|
SymEncryptedAEADProtected.prototype.write = function () {
|
||||||
return util.concatUint8Array([new Uint8Array([this.version]), this.iv, this.encrypted]);
|
return util.concatUint8Array([new Uint8Array([this.version]), this.iv, this.encrypted]);
|
||||||
|
@ -64,7 +69,8 @@ SymEncryptedAEADProtected.prototype.write = function () {
|
||||||
* Decrypt the encrypted payload.
|
* Decrypt the encrypted payload.
|
||||||
* @param {String} sessionKeyAlgorithm The session key's cipher algorithm e.g. 'aes128'
|
* @param {String} sessionKeyAlgorithm The session key's cipher algorithm e.g. 'aes128'
|
||||||
* @param {Uint8Array} key The session key used to encrypt the payload
|
* @param {Uint8Array} key The session key used to encrypt the payload
|
||||||
* @return {Promise<Boolean>}
|
* @returns {Promise<Boolean>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
SymEncryptedAEADProtected.prototype.decrypt = async function (sessionKeyAlgorithm, key) {
|
SymEncryptedAEADProtected.prototype.decrypt = async function (sessionKeyAlgorithm, key) {
|
||||||
this.packets.read(await crypto.gcm.decrypt(sessionKeyAlgorithm, this.encrypted, key, this.iv));
|
this.packets.read(await crypto.gcm.decrypt(sessionKeyAlgorithm, this.encrypted, key, this.iv));
|
||||||
|
@ -75,7 +81,8 @@ SymEncryptedAEADProtected.prototype.decrypt = async function (sessionKeyAlgorith
|
||||||
* Encrypt the packet list payload.
|
* Encrypt the packet list payload.
|
||||||
* @param {String} sessionKeyAlgorithm The session key's cipher algorithm e.g. 'aes128'
|
* @param {String} sessionKeyAlgorithm The session key's cipher algorithm e.g. 'aes128'
|
||||||
* @param {Uint8Array} key The session key used to encrypt the payload
|
* @param {Uint8Array} key The session key used to encrypt the payload
|
||||||
* @return {Promise<Boolean>}
|
* @returns {Promise<Boolean>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
SymEncryptedAEADProtected.prototype.encrypt = async function (sessionKeyAlgorithm, key) {
|
SymEncryptedAEADProtected.prototype.encrypt = async function (sessionKeyAlgorithm, key) {
|
||||||
this.iv = await crypto.random.getRandomBytes(IV_LEN); // generate new random IV
|
this.iv = await crypto.random.getRandomBytes(IV_LEN); // generate new random IV
|
||||||
|
|
|
@ -44,7 +44,7 @@ const VERSION = 1; // A one-octet version number of the data packet.
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function SymEncryptedIntegrityProtected() {
|
function SymEncryptedIntegrityProtected() {
|
||||||
this.tag = enums.packet.symEncryptedIntegrityProtected;
|
this.tag = enums.packet.symEncryptedIntegrityProtected;
|
||||||
this.version = VERSION;
|
this.version = VERSION;
|
||||||
/** The encrypted payload. */
|
/** The encrypted payload. */
|
||||||
|
@ -79,7 +79,8 @@ SymEncryptedIntegrityProtected.prototype.write = function () {
|
||||||
* Encrypt the payload in the packet.
|
* Encrypt the payload in the packet.
|
||||||
* @param {String} sessionKeyAlgorithm The selected symmetric encryption algorithm to be used e.g. 'aes128'
|
* @param {String} sessionKeyAlgorithm The selected symmetric encryption algorithm to be used e.g. 'aes128'
|
||||||
* @param {Uint8Array} key The key of cipher blocksize length to be used
|
* @param {Uint8Array} key The key of cipher blocksize length to be used
|
||||||
* @return {Promise<Boolean>}
|
* @returns {Promise<Boolean>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
SymEncryptedIntegrityProtected.prototype.encrypt = async function (sessionKeyAlgorithm, key) {
|
SymEncryptedIntegrityProtected.prototype.encrypt = async function (sessionKeyAlgorithm, key) {
|
||||||
const bytes = this.packets.write();
|
const bytes = this.packets.write();
|
||||||
|
@ -105,7 +106,8 @@ SymEncryptedIntegrityProtected.prototype.encrypt = async function (sessionKeyAlg
|
||||||
* Decrypts the encrypted data contained in the packet.
|
* Decrypts the encrypted data contained in the packet.
|
||||||
* @param {String} sessionKeyAlgorithm The selected symmetric encryption algorithm to be used e.g. 'aes128'
|
* @param {String} sessionKeyAlgorithm The selected symmetric encryption algorithm to be used e.g. 'aes128'
|
||||||
* @param {Uint8Array} key The key of cipher blocksize length to be used
|
* @param {Uint8Array} key The key of cipher blocksize length to be used
|
||||||
* @return {Promise<Boolean>}
|
* @returns {Promise<Boolean>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
SymEncryptedIntegrityProtected.prototype.decrypt = async function (sessionKeyAlgorithm, key) {
|
SymEncryptedIntegrityProtected.prototype.decrypt = async function (sessionKeyAlgorithm, key) {
|
||||||
let decrypted;
|
let decrypted;
|
||||||
|
@ -132,6 +134,8 @@ SymEncryptedIntegrityProtected.prototype.decrypt = async function (sessionKeyAlg
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default SymEncryptedIntegrityProtected;
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////
|
//////////////////////////
|
||||||
// //
|
// //
|
||||||
|
|
|
@ -45,7 +45,7 @@ import crypto from '../crypto';
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function SymEncryptedSessionKey() {
|
function SymEncryptedSessionKey() {
|
||||||
this.tag = enums.packet.symEncryptedSessionKey;
|
this.tag = enums.packet.symEncryptedSessionKey;
|
||||||
this.version = 4;
|
this.version = 4;
|
||||||
this.sessionKey = null;
|
this.sessionKey = null;
|
||||||
|
@ -63,7 +63,7 @@ export default function SymEncryptedSessionKey() {
|
||||||
* @param {Integer} len
|
* @param {Integer} len
|
||||||
* Length of the packet or the remaining length of
|
* Length of the packet or the remaining length of
|
||||||
* input at position
|
* input at position
|
||||||
* @return {module:packet/sym_encrypted_session_key} Object representation
|
* @returns {module:packet/sym_encrypted_session_key} Object representation
|
||||||
*/
|
*/
|
||||||
SymEncryptedSessionKey.prototype.read = function(bytes) {
|
SymEncryptedSessionKey.prototype.read = function(bytes) {
|
||||||
// A one-octet version number. The only currently defined version is 4.
|
// A one-octet version number. The only currently defined version is 4.
|
||||||
|
@ -104,7 +104,8 @@ SymEncryptedSessionKey.prototype.write = function() {
|
||||||
/**
|
/**
|
||||||
* Decrypts the session key
|
* Decrypts the session key
|
||||||
* @param {String} passphrase The passphrase in string form
|
* @param {String} passphrase The passphrase in string form
|
||||||
* @return {Promise<Boolean>}
|
* @returns {Promise<Boolean>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
SymEncryptedSessionKey.prototype.decrypt = async function(passphrase) {
|
SymEncryptedSessionKey.prototype.decrypt = async function(passphrase) {
|
||||||
const algo = this.sessionKeyEncryptionAlgorithm !== null ?
|
const algo = this.sessionKeyEncryptionAlgorithm !== null ?
|
||||||
|
@ -128,7 +129,8 @@ SymEncryptedSessionKey.prototype.decrypt = async function(passphrase) {
|
||||||
/**
|
/**
|
||||||
* Encrypts the session key
|
* Encrypts the session key
|
||||||
* @param {String} passphrase The passphrase in string form
|
* @param {String} passphrase The passphrase in string form
|
||||||
* @return {Promise<Boolean>}
|
* @returns {Promise<Boolean>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
SymEncryptedSessionKey.prototype.encrypt = async function(passphrase) {
|
SymEncryptedSessionKey.prototype.encrypt = async function(passphrase) {
|
||||||
const algo = this.sessionKeyEncryptionAlgorithm !== null ?
|
const algo = this.sessionKeyEncryptionAlgorithm !== null ?
|
||||||
|
@ -160,3 +162,5 @@ SymEncryptedSessionKey.prototype.encrypt = async function(passphrase) {
|
||||||
SymEncryptedSessionKey.prototype.postCloneTypeFix = function() {
|
SymEncryptedSessionKey.prototype.postCloneTypeFix = function() {
|
||||||
this.s2k = type_s2k.fromClone(this.s2k);
|
this.s2k = type_s2k.fromClone(this.s2k);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default SymEncryptedSessionKey;
|
||||||
|
|
|
@ -36,7 +36,7 @@ import config from '../config';
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function SymmetricallyEncrypted() {
|
function SymmetricallyEncrypted() {
|
||||||
this.tag = enums.packet.symmetricallyEncrypted;
|
this.tag = enums.packet.symmetricallyEncrypted;
|
||||||
this.encrypted = null;
|
this.encrypted = null;
|
||||||
/** Decrypted packets contained within.
|
/** Decrypted packets contained within.
|
||||||
|
@ -59,6 +59,7 @@ SymmetricallyEncrypted.prototype.write = function () {
|
||||||
* Symmetric key algorithm to use // See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC4880 9.2}
|
* Symmetric key algorithm to use // See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC4880 9.2}
|
||||||
* @param {Uint8Array} key The key of cipher blocksize length to be used
|
* @param {Uint8Array} key The key of cipher blocksize length to be used
|
||||||
* @returns {Promise<Boolean>}
|
* @returns {Promise<Boolean>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
SymmetricallyEncrypted.prototype.decrypt = async function (sessionKeyAlgorithm, key) {
|
SymmetricallyEncrypted.prototype.decrypt = async function (sessionKeyAlgorithm, key) {
|
||||||
const decrypted = crypto.cfb.decrypt(sessionKeyAlgorithm, key, this.encrypted, true);
|
const decrypted = crypto.cfb.decrypt(sessionKeyAlgorithm, key, this.encrypted, true);
|
||||||
|
@ -80,6 +81,7 @@ SymmetricallyEncrypted.prototype.decrypt = async function (sessionKeyAlgorithm,
|
||||||
* Symmetric key algorithm to use // See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC4880 9.2}
|
* Symmetric key algorithm to use // See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC4880 9.2}
|
||||||
* @param {Uint8Array} key The key of cipher blocksize length to be used
|
* @param {Uint8Array} key The key of cipher blocksize length to be used
|
||||||
* @returns {Promise<Boolean>}
|
* @returns {Promise<Boolean>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
SymmetricallyEncrypted.prototype.encrypt = async function (algo, key) {
|
SymmetricallyEncrypted.prototype.encrypt = async function (algo, key) {
|
||||||
const data = this.packets.write();
|
const data = this.packets.write();
|
||||||
|
@ -88,3 +90,5 @@ SymmetricallyEncrypted.prototype.encrypt = async function (algo, key) {
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default SymmetricallyEncrypted;
|
||||||
|
|
|
@ -8,13 +8,15 @@ import enums from '../enums.js';
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function Trust() {
|
function Trust() {
|
||||||
this.tag = enums.packet.trust;
|
this.tag = enums.packet.trust;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parsing function for a trust packet (tag 12).
|
* Parsing function for a trust packet (tag 12).
|
||||||
* Currently empty as we ignore trust packets
|
* Currently not implemented as we ignore trust packets
|
||||||
* @param {String} byptes payload of a tag 12 packet
|
* @param {String} byptes payload of a tag 12 packet
|
||||||
*/
|
*/
|
||||||
Trust.prototype.read = function () {};
|
Trust.prototype.read = function () {}; // TODO
|
||||||
|
|
||||||
|
export default Trust;
|
||||||
|
|
|
@ -43,7 +43,7 @@ import enums from '../enums.js';
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function UserAttribute() {
|
function UserAttribute() {
|
||||||
this.tag = enums.packet.userAttribute;
|
this.tag = enums.packet.userAttribute;
|
||||||
this.attributes = [];
|
this.attributes = [];
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ UserAttribute.prototype.read = function(bytes) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a binary representation of the user attribute packet
|
* Creates a binary representation of the user attribute packet
|
||||||
* @return {Uint8Array} string representation
|
* @returns {Uint8Array} string representation
|
||||||
*/
|
*/
|
||||||
UserAttribute.prototype.write = function() {
|
UserAttribute.prototype.write = function() {
|
||||||
const arr = [];
|
const arr = [];
|
||||||
|
@ -79,7 +79,7 @@ UserAttribute.prototype.write = function() {
|
||||||
/**
|
/**
|
||||||
* Compare for equality
|
* Compare for equality
|
||||||
* @param {module:user_attribute~UserAttribute} usrAttr
|
* @param {module:user_attribute~UserAttribute} usrAttr
|
||||||
* @return {Boolean} true if equal
|
* @returns {Boolean} true if equal
|
||||||
*/
|
*/
|
||||||
UserAttribute.prototype.equals = function(usrAttr) {
|
UserAttribute.prototype.equals = function(usrAttr) {
|
||||||
if (!usrAttr || !(usrAttr instanceof UserAttribute)) {
|
if (!usrAttr || !(usrAttr instanceof UserAttribute)) {
|
||||||
|
@ -89,3 +89,5 @@ UserAttribute.prototype.equals = function(usrAttr) {
|
||||||
return attr === usrAttr.attributes[index];
|
return attr === usrAttr.attributes[index];
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default UserAttribute;
|
||||||
|
|
|
@ -34,7 +34,7 @@ import enums from '../enums.js';
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function Userid() {
|
function Userid() {
|
||||||
this.tag = enums.packet.userid;
|
this.tag = enums.packet.userid;
|
||||||
/** A string containing the user id. Usually in the form
|
/** A string containing the user id. Usually in the form
|
||||||
* John Doe <john@example.com>
|
* John Doe <john@example.com>
|
||||||
|
@ -53,8 +53,10 @@ Userid.prototype.read = function (bytes) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a binary representation of the user id packet
|
* Creates a binary representation of the user id packet
|
||||||
* @return {Uint8Array} binary representation
|
* @returns {Uint8Array} binary representation
|
||||||
*/
|
*/
|
||||||
Userid.prototype.write = function () {
|
Userid.prototype.write = function () {
|
||||||
return util.str_to_Uint8Array(util.encode_utf8(this.userid));
|
return util.str_to_Uint8Array(util.encode_utf8(this.userid));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default Userid;
|
||||||
|
|
|
@ -16,16 +16,15 @@
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @requires crypto
|
|
||||||
* @requires encoding/armor
|
|
||||||
* @requires enums
|
* @requires enums
|
||||||
* @requires packet
|
* @requires packet
|
||||||
|
* @requires encoding/armor
|
||||||
* @module signature
|
* @module signature
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import packet from './packet';
|
import packet from './packet';
|
||||||
import enums from './enums.js';
|
import enums from './enums';
|
||||||
import armor from './encoding/armor.js';
|
import armor from './encoding/armor';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @class
|
* @class
|
||||||
|
@ -43,7 +42,7 @@ export function Signature(packetlist) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns ASCII armored text of signature
|
* Returns ASCII armored text of signature
|
||||||
* @return {String} ASCII armor
|
* @returns {String} ASCII armor
|
||||||
*/
|
*/
|
||||||
Signature.prototype.armor = function() {
|
Signature.prototype.armor = function() {
|
||||||
return armor.encode(enums.armor.signature, this.packets.write());
|
return armor.encode(enums.armor.signature, this.packets.write());
|
||||||
|
@ -52,7 +51,7 @@ Signature.prototype.armor = function() {
|
||||||
/**
|
/**
|
||||||
* reads an OpenPGP armored signature and returns a signature object
|
* reads an OpenPGP armored signature and returns a signature object
|
||||||
* @param {String} armoredText text to be parsed
|
* @param {String} armoredText text to be parsed
|
||||||
* @return {Signature} new signature object
|
* @returns {Signature} new signature object
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
export function readArmored(armoredText) {
|
export function readArmored(armoredText) {
|
||||||
|
@ -63,7 +62,7 @@ export function readArmored(armoredText) {
|
||||||
/**
|
/**
|
||||||
* reads an OpenPGP signature as byte array and returns a signature object
|
* reads an OpenPGP signature as byte array and returns a signature object
|
||||||
* @param {Uint8Array} input binary signature
|
* @param {Uint8Array} input binary signature
|
||||||
* @return {Signature} new signature object
|
* @returns {Signature} new signature object
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
export function read(input) {
|
export function read(input) {
|
||||||
|
|
|
@ -27,7 +27,7 @@ import util from '../util';
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function ECDHSymmetricKey(data) {
|
function ECDHSymmetricKey(data) {
|
||||||
if (typeof data === 'undefined') {
|
if (typeof data === 'undefined') {
|
||||||
data = new Uint8Array([]);
|
data = new Uint8Array([]);
|
||||||
} else if (util.isString(data)) {
|
} else if (util.isString(data)) {
|
||||||
|
@ -41,7 +41,7 @@ export default function ECDHSymmetricKey(data) {
|
||||||
/**
|
/**
|
||||||
* Read an ECDHSymmetricKey from an Uint8Array
|
* Read an ECDHSymmetricKey from an Uint8Array
|
||||||
* @param {Uint8Array} input Where to read the encoded symmetric key from
|
* @param {Uint8Array} input Where to read the encoded symmetric key from
|
||||||
* @return {Number} Number of read bytes
|
* @returns {Number} Number of read bytes
|
||||||
*/
|
*/
|
||||||
ECDHSymmetricKey.prototype.read = function (input) {
|
ECDHSymmetricKey.prototype.read = function (input) {
|
||||||
if (input.length >= 1) {
|
if (input.length >= 1) {
|
||||||
|
@ -56,7 +56,7 @@ ECDHSymmetricKey.prototype.read = function (input) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write an ECDHSymmetricKey as an Uint8Array
|
* Write an ECDHSymmetricKey as an Uint8Array
|
||||||
* @return {Uint8Array} An array containing the value
|
* @returns {Uint8Array} An array containing the value
|
||||||
*/
|
*/
|
||||||
ECDHSymmetricKey.prototype.write = function () {
|
ECDHSymmetricKey.prototype.write = function () {
|
||||||
return util.concatUint8Array([new Uint8Array([this.data.length]), this.data]);
|
return util.concatUint8Array([new Uint8Array([this.data.length]), this.data]);
|
||||||
|
@ -65,3 +65,5 @@ ECDHSymmetricKey.prototype.write = function () {
|
||||||
ECDHSymmetricKey.fromClone = function (clone) {
|
ECDHSymmetricKey.fromClone = function (clone) {
|
||||||
return new ECDHSymmetricKey(clone.data);
|
return new ECDHSymmetricKey(clone.data);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default ECDHSymmetricKey;
|
||||||
|
|
|
@ -16,8 +16,13 @@
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of type KDF parameters RFC 6637
|
* Implementation of type KDF parameters
|
||||||
*
|
*
|
||||||
|
* {@link https://tools.ietf.org/html/rfc6637#section-7|RFC 6637 7}:
|
||||||
|
* A key derivation function (KDF) is necessary to implement the EC
|
||||||
|
* encryption. The Concatenation Key Derivation Function (Approved
|
||||||
|
* Alternative 1) [NIST-SP800-56A] with the KDF hash function that is
|
||||||
|
* SHA2-256 [FIPS-180-3] or stronger is REQUIRED.
|
||||||
* @requires enums
|
* @requires enums
|
||||||
* @module type/kdf_params
|
* @module type/kdf_params
|
||||||
*/
|
*/
|
||||||
|
@ -42,7 +47,7 @@ function KDFParams(data) {
|
||||||
/**
|
/**
|
||||||
* Read KDFParams from an Uint8Array
|
* Read KDFParams from an Uint8Array
|
||||||
* @param {Uint8Array} input Where to read the KDFParams from
|
* @param {Uint8Array} input Where to read the KDFParams from
|
||||||
* @return {Number} Number of read bytes
|
* @returns {Number} Number of read bytes
|
||||||
*/
|
*/
|
||||||
KDFParams.prototype.read = function (input) {
|
KDFParams.prototype.read = function (input) {
|
||||||
if (input.length < 4 || input[0] !== 3 || input[1] !== 1) {
|
if (input.length < 4 || input[0] !== 3 || input[1] !== 1) {
|
||||||
|
@ -55,7 +60,7 @@ KDFParams.prototype.read = function (input) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write KDFParams to an Uint8Array
|
* Write KDFParams to an Uint8Array
|
||||||
* @return {Uint8Array} Array with the KDFParams value
|
* @returns {Uint8Array} Array with the KDFParams value
|
||||||
*/
|
*/
|
||||||
KDFParams.prototype.write = function () {
|
KDFParams.prototype.write = function () {
|
||||||
return new Uint8Array([3, 1, this.hash, this.cipher]);
|
return new Uint8Array([3, 1, this.hash, this.cipher]);
|
||||||
|
|
|
@ -32,7 +32,7 @@ import util from '../util.js';
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function Keyid() {
|
function Keyid() {
|
||||||
this.bytes = '';
|
this.bytes = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,3 +90,5 @@ Keyid.wildcard = function () {
|
||||||
keyid.read(new Uint8Array(8));
|
keyid.read(new Uint8Array(8));
|
||||||
return keyid;
|
return keyid;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default Keyid;
|
||||||
|
|
|
@ -39,7 +39,7 @@ import util from '../util';
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function MPI(data) {
|
function MPI(data) {
|
||||||
/** An implementation dependent integer */
|
/** An implementation dependent integer */
|
||||||
if (data instanceof MPI) {
|
if (data instanceof MPI) {
|
||||||
this.data = data.data;
|
this.data = data.data;
|
||||||
|
@ -58,7 +58,7 @@ export default function MPI(data) {
|
||||||
* Parsing function for a MPI ({@link https://tools.ietf.org/html/rfc4880#section-3.2|RFC 4880 3.2}).
|
* Parsing function for a MPI ({@link https://tools.ietf.org/html/rfc4880#section-3.2|RFC 4880 3.2}).
|
||||||
* @param {Uint8Array} input Payload of MPI data
|
* @param {Uint8Array} input Payload of MPI data
|
||||||
* @param {String} endian Endianness of the data; 'be' for big-endian or 'le' for little-endian
|
* @param {String} endian Endianness of the data; 'be' for big-endian or 'le' for little-endian
|
||||||
* @return {Integer} Length of data read
|
* @returns {Integer} Length of data read
|
||||||
*/
|
*/
|
||||||
MPI.prototype.read = function (bytes, endian='be') {
|
MPI.prototype.read = function (bytes, endian='be') {
|
||||||
if (util.isString(bytes)) {
|
if (util.isString(bytes)) {
|
||||||
|
@ -79,7 +79,7 @@ MPI.prototype.read = function (bytes, endian='be') {
|
||||||
* {@link https://tools.ietf.org/html/rfc4880#section-3.2|RFC4880 3.2}
|
* {@link https://tools.ietf.org/html/rfc4880#section-3.2|RFC4880 3.2}
|
||||||
* @param {String} endian Endianness of the payload; 'be' for big-endian or 'le' for little-endian
|
* @param {String} endian Endianness of the payload; 'be' for big-endian or 'le' for little-endian
|
||||||
* @param {Integer} length Length of the data part of the MPI
|
* @param {Integer} length Length of the data part of the MPI
|
||||||
* @return {Uint8Aray} mpi Byte representation
|
* @returns {Uint8Aray} mpi Byte representation
|
||||||
*/
|
*/
|
||||||
MPI.prototype.write = function (endian, length) {
|
MPI.prototype.write = function (endian, length) {
|
||||||
return util.Uint8Array_to_MPI(this.toUint8Array(endian, length));
|
return util.Uint8Array_to_MPI(this.toUint8Array(endian, length));
|
||||||
|
@ -139,3 +139,5 @@ MPI.prototype.fromBN = function (bn) {
|
||||||
MPI.fromClone = function (clone) {
|
MPI.fromClone = function (clone) {
|
||||||
return new MPI(clone.data);
|
return new MPI(clone.data);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default MPI;
|
||||||
|
|
|
@ -40,7 +40,7 @@ import enums from '../enums';
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function OID(oid) {
|
function OID(oid) {
|
||||||
if (oid instanceof OID) {
|
if (oid instanceof OID) {
|
||||||
this.oid = oid.oid;
|
this.oid = oid.oid;
|
||||||
} else if (util.isArray(oid) ||
|
} else if (util.isArray(oid) ||
|
||||||
|
@ -58,7 +58,7 @@ export default function OID(oid) {
|
||||||
/**
|
/**
|
||||||
* Method to read an OID object
|
* Method to read an OID object
|
||||||
* @param {Uint8Array} input Where to read the OID from
|
* @param {Uint8Array} input Where to read the OID from
|
||||||
* @return {Number} Number of read bytes
|
* @returns {Number} Number of read bytes
|
||||||
*/
|
*/
|
||||||
OID.prototype.read = function (input) {
|
OID.prototype.read = function (input) {
|
||||||
if (input.length >= 1) {
|
if (input.length >= 1) {
|
||||||
|
@ -73,7 +73,7 @@ OID.prototype.read = function (input) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serialize an OID object
|
* Serialize an OID object
|
||||||
* @return {Uint8Array} Array with the serialized value the OID
|
* @returns {Uint8Array} Array with the serialized value the OID
|
||||||
*/
|
*/
|
||||||
OID.prototype.write = function () {
|
OID.prototype.write = function () {
|
||||||
return util.concatUint8Array([new Uint8Array([this.oid.length]), this.oid]);
|
return util.concatUint8Array([new Uint8Array([this.oid.length]), this.oid]);
|
||||||
|
@ -81,7 +81,7 @@ OID.prototype.write = function () {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serialize an OID object as a hex string
|
* Serialize an OID object as a hex string
|
||||||
* @return {string} String with the hex value of the OID
|
* @returns {string} String with the hex value of the OID
|
||||||
*/
|
*/
|
||||||
OID.prototype.toHex = function() {
|
OID.prototype.toHex = function() {
|
||||||
return util.Uint8Array_to_hex(this.oid);
|
return util.Uint8Array_to_hex(this.oid);
|
||||||
|
@ -89,7 +89,7 @@ OID.prototype.toHex = function() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If a known curve object identifier, return the canonical name of the curve
|
* If a known curve object identifier, return the canonical name of the curve
|
||||||
* @return {string} String with the canonical name of the curve
|
* @returns {string} String with the canonical name of the curve
|
||||||
*/
|
*/
|
||||||
OID.prototype.getName = function() {
|
OID.prototype.getName = function() {
|
||||||
const hex = this.toHex();
|
const hex = this.toHex();
|
||||||
|
@ -103,3 +103,5 @@ OID.prototype.getName = function() {
|
||||||
OID.fromClone = function (clone) {
|
OID.fromClone = function (clone) {
|
||||||
return new OID(clone.oid);
|
return new OID(clone.oid);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default OID;
|
||||||
|
|
|
@ -37,7 +37,7 @@ import crypto from '../crypto';
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export default function S2K() {
|
function S2K() {
|
||||||
/** @type {module:enums.hash} */
|
/** @type {module:enums.hash} */
|
||||||
this.algorithm = 'sha256';
|
this.algorithm = 'sha256';
|
||||||
/** @type {module:enums.s2k} */
|
/** @type {module:enums.s2k} */
|
||||||
|
@ -59,7 +59,7 @@ S2K.prototype.get_count = function () {
|
||||||
/**
|
/**
|
||||||
* Parsing function for a string-to-key specifier ({@link https://tools.ietf.org/html/rfc4880#section-3.7|RFC 4880 3.7}).
|
* Parsing function for a string-to-key specifier ({@link https://tools.ietf.org/html/rfc4880#section-3.7|RFC 4880 3.7}).
|
||||||
* @param {String} input Payload of string-to-key specifier
|
* @param {String} input Payload of string-to-key specifier
|
||||||
* @return {Integer} Actual length of the object
|
* @returns {Integer} Actual length of the object
|
||||||
*/
|
*/
|
||||||
S2K.prototype.read = function (bytes) {
|
S2K.prototype.read = function (bytes) {
|
||||||
let i = 0;
|
let i = 0;
|
||||||
|
@ -108,7 +108,7 @@ S2K.prototype.read = function (bytes) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serializes s2k information
|
* Serializes s2k information
|
||||||
* @return {Uint8Array} binary representation of s2k
|
* @returns {Uint8Array} binary representation of s2k
|
||||||
*/
|
*/
|
||||||
S2K.prototype.write = function () {
|
S2K.prototype.write = function () {
|
||||||
const arr = [new Uint8Array([enums.write(enums.s2k, this.type), enums.write(enums.hash, this.algorithm)])];
|
const arr = [new Uint8Array([enums.write(enums.s2k, this.type), enums.write(enums.hash, this.algorithm)])];
|
||||||
|
@ -136,7 +136,7 @@ S2K.prototype.write = function () {
|
||||||
* Produces a key using the specified passphrase and the defined
|
* Produces a key using the specified passphrase and the defined
|
||||||
* hashAlgorithm
|
* hashAlgorithm
|
||||||
* @param {String} passphrase Passphrase containing user input
|
* @param {String} passphrase Passphrase containing user input
|
||||||
* @return {Uint8Array} Produced key with a length corresponding to
|
* @returns {Uint8Array} Produced key with a length corresponding to
|
||||||
* hashAlgorithm hash length
|
* hashAlgorithm hash length
|
||||||
*/
|
*/
|
||||||
S2K.prototype.produce_key = function (passphrase, numBytes) {
|
S2K.prototype.produce_key = function (passphrase, numBytes) {
|
||||||
|
@ -203,3 +203,5 @@ S2K.fromClone = function (clone) {
|
||||||
s2k.salt = clone.salt;
|
s2k.salt = clone.salt;
|
||||||
return s2k;
|
return s2k;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default S2K;
|
||||||
|
|
42
src/util.js
42
src/util.js
|
@ -43,7 +43,7 @@ const util = {
|
||||||
* Get transferable objects to pass buffers with zero copy (similar to "pass by reference" in C++)
|
* Get transferable objects to pass buffers with zero copy (similar to "pass by reference" in C++)
|
||||||
* See: https://developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage
|
* See: https://developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage
|
||||||
* @param {Object} obj the options object to be passed to the web worker
|
* @param {Object} obj the options object to be passed to the web worker
|
||||||
* @return {Array<ArrayBuffer>} an array of binary data to be passed
|
* @returns {Array<ArrayBuffer>} an array of binary data to be passed
|
||||||
*/
|
*/
|
||||||
getTransferables: function(obj) {
|
getTransferables: function(obj) {
|
||||||
if (config.zero_copy && Object.prototype.isPrototypeOf(obj)) {
|
if (config.zero_copy && Object.prototype.isPrototypeOf(obj)) {
|
||||||
|
@ -104,7 +104,7 @@ const util = {
|
||||||
/**
|
/**
|
||||||
* Create hex string from a binary
|
* Create hex string from a binary
|
||||||
* @param {String} str String to convert
|
* @param {String} str String to convert
|
||||||
* @return {String} String containing the hexadecimal values
|
* @returns {String} String containing the hexadecimal values
|
||||||
*/
|
*/
|
||||||
str_to_hex: function (str) {
|
str_to_hex: function (str) {
|
||||||
if (str === null) {
|
if (str === null) {
|
||||||
|
@ -127,7 +127,7 @@ const util = {
|
||||||
/**
|
/**
|
||||||
* Create binary string from a hex encoded string
|
* Create binary string from a hex encoded string
|
||||||
* @param {String} str Hex string to convert
|
* @param {String} str Hex string to convert
|
||||||
* @return {String}
|
* @returns {String}
|
||||||
*/
|
*/
|
||||||
hex_to_str: function (hex) {
|
hex_to_str: function (hex) {
|
||||||
let str = '';
|
let str = '';
|
||||||
|
@ -143,7 +143,7 @@ const util = {
|
||||||
* @see {@link module:type/mpi/MPI.fromUint8Array}
|
* @see {@link module:type/mpi/MPI.fromUint8Array}
|
||||||
* @see {@link module:type/mpi/MPI.toUint8Array}
|
* @see {@link module:type/mpi/MPI.toUint8Array}
|
||||||
* @param {Uint8Array} bin An array of 8-bit integers to convert
|
* @param {Uint8Array} bin An array of 8-bit integers to convert
|
||||||
* @return {Uint8Array} MPI-formatted Uint8Array
|
* @returns {Uint8Array} MPI-formatted Uint8Array
|
||||||
*/
|
*/
|
||||||
Uint8Array_to_MPI: function (bin) {
|
Uint8Array_to_MPI: function (bin) {
|
||||||
const size = (bin.length - 1) * 8 + util.nbits(bin[0]);
|
const size = (bin.length - 1) * 8 + util.nbits(bin[0]);
|
||||||
|
@ -156,7 +156,7 @@ const util = {
|
||||||
*
|
*
|
||||||
* Note: accepts both Radix-64 and URL-safe strings
|
* Note: accepts both Radix-64 and URL-safe strings
|
||||||
* @param {String} base64 Base-64 encoded string to convert
|
* @param {String} base64 Base-64 encoded string to convert
|
||||||
* @return {Uint8Array} An array of 8-bit integers
|
* @returns {Uint8Array} An array of 8-bit integers
|
||||||
*/
|
*/
|
||||||
b64_to_Uint8Array: function (base64) {
|
b64_to_Uint8Array: function (base64) {
|
||||||
// atob(base64.replace(/\-/g, '+').replace(/_/g, '/'));
|
// atob(base64.replace(/\-/g, '+').replace(/_/g, '/'));
|
||||||
|
@ -167,7 +167,7 @@ const util = {
|
||||||
* Convert an array of 8-bit integer to a Base-64 encoded string
|
* Convert an array of 8-bit integer to a Base-64 encoded string
|
||||||
* @param {Uint8Array} bytes An array of 8-bit integers to convert
|
* @param {Uint8Array} bytes An array of 8-bit integers to convert
|
||||||
* @param {bool} url If true, output is URL-safe
|
* @param {bool} url If true, output is URL-safe
|
||||||
* @return {String} Base-64 encoded string
|
* @returns {String} Base-64 encoded string
|
||||||
*/
|
*/
|
||||||
Uint8Array_to_b64: function (bytes, url) {
|
Uint8Array_to_b64: function (bytes, url) {
|
||||||
// btoa(util.Uint8Array_to_str(bytes)).replace(/\+/g, '-').replace(/\//g, '_');
|
// btoa(util.Uint8Array_to_str(bytes)).replace(/\+/g, '-').replace(/\//g, '_');
|
||||||
|
@ -177,7 +177,7 @@ const util = {
|
||||||
/**
|
/**
|
||||||
* Convert a hex string to an array of 8-bit integers
|
* Convert a hex string to an array of 8-bit integers
|
||||||
* @param {String} hex A hex string to convert
|
* @param {String} hex A hex string to convert
|
||||||
* @return {Uint8Array} An array of 8-bit integers
|
* @returns {Uint8Array} An array of 8-bit integers
|
||||||
*/
|
*/
|
||||||
hex_to_Uint8Array: function (hex) {
|
hex_to_Uint8Array: function (hex) {
|
||||||
const result = new Uint8Array(hex.length >> 1);
|
const result = new Uint8Array(hex.length >> 1);
|
||||||
|
@ -190,7 +190,7 @@ const util = {
|
||||||
/**
|
/**
|
||||||
* Convert an array of 8-bit integers to a hex string
|
* Convert an array of 8-bit integers to a hex string
|
||||||
* @param {Uint8Array} bytes Array of 8-bit integers to convert
|
* @param {Uint8Array} bytes Array of 8-bit integers to convert
|
||||||
* @return {String} Hexadecimal representation of the array
|
* @returns {String} Hexadecimal representation of the array
|
||||||
*/
|
*/
|
||||||
Uint8Array_to_hex: function (bytes) {
|
Uint8Array_to_hex: function (bytes) {
|
||||||
const r = [];
|
const r = [];
|
||||||
|
@ -210,7 +210,7 @@ const util = {
|
||||||
/**
|
/**
|
||||||
* Convert a string to an array of 8-bit integers
|
* Convert a string to an array of 8-bit integers
|
||||||
* @param {String} str String to convert
|
* @param {String} str String to convert
|
||||||
* @return {Uint8Array} An array of 8-bit integers
|
* @returns {Uint8Array} An array of 8-bit integers
|
||||||
*/
|
*/
|
||||||
str_to_Uint8Array: function (str) {
|
str_to_Uint8Array: function (str) {
|
||||||
if (!util.isString(str)) {
|
if (!util.isString(str)) {
|
||||||
|
@ -227,7 +227,7 @@ const util = {
|
||||||
/**
|
/**
|
||||||
* Convert an array of 8-bit integers to a string
|
* Convert an array of 8-bit integers to a string
|
||||||
* @param {Uint8Array} bytes An array of 8-bit integers to convert
|
* @param {Uint8Array} bytes An array of 8-bit integers to convert
|
||||||
* @return {String} String representation of the array
|
* @returns {String} String representation of the array
|
||||||
*/
|
*/
|
||||||
Uint8Array_to_str: function (bytes) {
|
Uint8Array_to_str: function (bytes) {
|
||||||
bytes = new Uint8Array(bytes);
|
bytes = new Uint8Array(bytes);
|
||||||
|
@ -244,7 +244,7 @@ const util = {
|
||||||
/**
|
/**
|
||||||
* Convert a native javascript string to a string of utf8 bytes
|
* Convert a native javascript string to a string of utf8 bytes
|
||||||
* @param {String} str The string to convert
|
* @param {String} str The string to convert
|
||||||
* @return {String} A valid squence of utf8 bytes
|
* @returns {String} A valid squence of utf8 bytes
|
||||||
*/
|
*/
|
||||||
encode_utf8: function (str) {
|
encode_utf8: function (str) {
|
||||||
return unescape(encodeURIComponent(str));
|
return unescape(encodeURIComponent(str));
|
||||||
|
@ -253,7 +253,7 @@ const util = {
|
||||||
/**
|
/**
|
||||||
* Convert a string of utf8 bytes to a native javascript string
|
* Convert a string of utf8 bytes to a native javascript string
|
||||||
* @param {String} utf8 A valid squence of utf8 bytes
|
* @param {String} utf8 A valid squence of utf8 bytes
|
||||||
* @return {String} A native javascript string
|
* @returns {String} A native javascript string
|
||||||
*/
|
*/
|
||||||
decode_utf8: function (utf8) {
|
decode_utf8: function (utf8) {
|
||||||
if (typeof utf8 !== 'string') {
|
if (typeof utf8 !== 'string') {
|
||||||
|
@ -269,7 +269,7 @@ const util = {
|
||||||
/**
|
/**
|
||||||
* Concat Uint8arrays
|
* Concat Uint8arrays
|
||||||
* @param {Array<Uint8array>} Array of Uint8Arrays to concatenate
|
* @param {Array<Uint8array>} Array of Uint8Arrays to concatenate
|
||||||
* @return {Uint8array} Concatenated array
|
* @returns {Uint8array} Concatenated array
|
||||||
*/
|
*/
|
||||||
concatUint8Array: function (arrays) {
|
concatUint8Array: function (arrays) {
|
||||||
let totalLength = 0;
|
let totalLength = 0;
|
||||||
|
@ -294,7 +294,7 @@ const util = {
|
||||||
/**
|
/**
|
||||||
* Deep copy Uint8Array
|
* Deep copy Uint8Array
|
||||||
* @param {Uint8Array} Array to copy
|
* @param {Uint8Array} Array to copy
|
||||||
* @return {Uint8Array} new Uint8Array
|
* @returns {Uint8Array} new Uint8Array
|
||||||
*/
|
*/
|
||||||
copyUint8Array: function (array) {
|
copyUint8Array: function (array) {
|
||||||
if (!util.isUint8Array(array)) {
|
if (!util.isUint8Array(array)) {
|
||||||
|
@ -310,7 +310,7 @@ const util = {
|
||||||
* Check Uint8Array equality
|
* Check Uint8Array equality
|
||||||
* @param {Uint8Array} first array
|
* @param {Uint8Array} first array
|
||||||
* @param {Uint8Array} second array
|
* @param {Uint8Array} second array
|
||||||
* @return {Boolean} equality
|
* @returns {Boolean} equality
|
||||||
*/
|
*/
|
||||||
equalsUint8Array: function (array1, array2) {
|
equalsUint8Array: function (array1, array2) {
|
||||||
if (!util.isUint8Array(array1) || !util.isUint8Array(array2)) {
|
if (!util.isUint8Array(array1) || !util.isUint8Array(array2)) {
|
||||||
|
@ -333,7 +333,7 @@ const util = {
|
||||||
* Calculates a 16bit sum of a Uint8Array by adding each character
|
* Calculates a 16bit sum of a Uint8Array by adding each character
|
||||||
* codes modulus 65535
|
* codes modulus 65535
|
||||||
* @param {Uint8Array} Uint8Array to create a sum of
|
* @param {Uint8Array} Uint8Array to create a sum of
|
||||||
* @return {Integer} An integer containing the sum of all character
|
* @returns {Integer} An integer containing the sum of all character
|
||||||
* codes % 65535
|
* codes % 65535
|
||||||
*/
|
*/
|
||||||
calc_checksum: function (text) {
|
calc_checksum: function (text) {
|
||||||
|
@ -422,7 +422,7 @@ const util = {
|
||||||
* @param {String} value The string to shift
|
* @param {String} value The string to shift
|
||||||
* @param {Integer} bitcount Amount of bits to shift (MUST be smaller
|
* @param {Integer} bitcount Amount of bits to shift (MUST be smaller
|
||||||
* than 9)
|
* than 9)
|
||||||
* @return {String} Resulting string.
|
* @returns {String} Resulting string.
|
||||||
*/
|
*/
|
||||||
shiftRight: function (value, bitcount) {
|
shiftRight: function (value, bitcount) {
|
||||||
const temp = util.str_to_Uint8Array(value);
|
const temp = util.str_to_Uint8Array(value);
|
||||||
|
@ -443,7 +443,7 @@ const util = {
|
||||||
* Get native Web Cryptography api, only the current version of the spec.
|
* Get native Web Cryptography api, only the current version of the spec.
|
||||||
* The default configuration is to use the api when available. But it can
|
* The default configuration is to use the api when available. But it can
|
||||||
* be deactivated with config.use_native
|
* be deactivated with config.use_native
|
||||||
* @return {Object} The SubtleCrypto api or 'undefined'
|
* @returns {Object} The SubtleCrypto api or 'undefined'
|
||||||
*/
|
*/
|
||||||
getWebCrypto: function() {
|
getWebCrypto: function() {
|
||||||
if (!config.use_native) {
|
if (!config.use_native) {
|
||||||
|
@ -458,7 +458,7 @@ const util = {
|
||||||
* implementations of the spec e.g IE11 and Safari 8/9. The default
|
* implementations of the spec e.g IE11 and Safari 8/9. The default
|
||||||
* configuration is to use the api when available. But it can be deactivated
|
* configuration is to use the api when available. But it can be deactivated
|
||||||
* with config.use_native
|
* with config.use_native
|
||||||
* @return {Object} The SubtleCrypto api or 'undefined'
|
* @returns {Object} The SubtleCrypto api or 'undefined'
|
||||||
*/
|
*/
|
||||||
getWebCryptoAll: function() {
|
getWebCryptoAll: function() {
|
||||||
if (!config.use_native) {
|
if (!config.use_native) {
|
||||||
|
@ -485,7 +485,7 @@ const util = {
|
||||||
/**
|
/**
|
||||||
* Get native Node.js crypto api. The default configuration is to use
|
* Get native Node.js crypto api. The default configuration is to use
|
||||||
* the api when available. But it can also be deactivated with config.use_native
|
* the api when available. But it can also be deactivated with config.use_native
|
||||||
* @return {Object} The crypto module or 'undefined'
|
* @returns {Object} The crypto module or 'undefined'
|
||||||
*/
|
*/
|
||||||
getNodeCrypto: function() {
|
getNodeCrypto: function() {
|
||||||
if (!util.detectNode() || !config.use_native) {
|
if (!util.detectNode() || !config.use_native) {
|
||||||
|
@ -498,7 +498,7 @@ const util = {
|
||||||
/**
|
/**
|
||||||
* Get native Node.js Buffer constructor. This should be used since
|
* Get native Node.js Buffer constructor. This should be used since
|
||||||
* Buffer is not available under browserify.
|
* Buffer is not available under browserify.
|
||||||
* @return {Function} The Buffer constructor or 'undefined'
|
* @returns {Function} The Buffer constructor or 'undefined'
|
||||||
*/
|
*/
|
||||||
getNodeBuffer: function() {
|
getNodeBuffer: function() {
|
||||||
if (!util.detectNode()) {
|
if (!util.detectNode()) {
|
||||||
|
|
|
@ -57,7 +57,7 @@ function handleMessage(workerId) {
|
||||||
* @param {Object} config config The worker configuration
|
* @param {Object} config config The worker configuration
|
||||||
* @param {Array<Object>} worker alternative to path parameter: web worker initialized with 'openpgp.worker.js'
|
* @param {Array<Object>} worker alternative to path parameter: web worker initialized with 'openpgp.worker.js'
|
||||||
*/
|
*/
|
||||||
export default function AsyncProxy({ path='openpgp.worker.js', n = 1, workers = [], config } = {}) {
|
function AsyncProxy({ path='openpgp.worker.js', n = 1, workers = [], config } = {}) {
|
||||||
|
|
||||||
if (workers.length) {
|
if (workers.length) {
|
||||||
this.workers = workers;
|
this.workers = workers;
|
||||||
|
@ -89,7 +89,7 @@ export default function AsyncProxy({ path='openpgp.worker.js', n = 1, workers =
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get new request ID
|
* Get new request ID
|
||||||
* @return {integer} New unique request ID
|
* @returns {integer} New unique request ID
|
||||||
*/
|
*/
|
||||||
AsyncProxy.prototype.getID = function() {
|
AsyncProxy.prototype.getID = function() {
|
||||||
return this.currentID++;
|
return this.currentID++;
|
||||||
|
@ -117,7 +117,7 @@ AsyncProxy.prototype.terminate = function() {
|
||||||
* Generic proxy function that handles all commands from the public api.
|
* Generic proxy function that handles all commands from the public api.
|
||||||
* @param {String} method the public api function to be delegated to the worker thread
|
* @param {String} method the public api function to be delegated to the worker thread
|
||||||
* @param {Object} options the api function's options
|
* @param {Object} options the api function's options
|
||||||
* @return {Promise} see the corresponding public api functions for their return types
|
* @returns {Promise} see the corresponding public api functions for their return types
|
||||||
*/
|
*/
|
||||||
AsyncProxy.prototype.delegate = function(method, options) {
|
AsyncProxy.prototype.delegate = function(method, options) {
|
||||||
|
|
||||||
|
@ -140,3 +140,5 @@ AsyncProxy.prototype.delegate = function(method, options) {
|
||||||
this.tasks[id] = { resolve: data => resolve(packet.clone.parseClonedPackets(data, method)), reject };
|
this.tasks[id] = { resolve: data => resolve(packet.clone.parseClonedPackets(data, method)), reject };
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default AsyncProxy;
|
||||||
|
|
|
@ -32,7 +32,7 @@ var MIN_SIZE_RANDOM_REQUEST = 20000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle random buffer exhaustion by requesting more random bytes from the main window
|
* Handle random buffer exhaustion by requesting more random bytes from the main window
|
||||||
* @return {Promise<Object>} Empty promise whose resolution indicates that the buffer has been refilled
|
* @returns {Promise<Object>} Empty promise whose resolution indicates that the buffer has been refilled
|
||||||
*/
|
*/
|
||||||
function randomCallback() {
|
function randomCallback() {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user