parse-asn1
Advanced tools
Comparing version 5.1.6 to 5.1.7
201
asn1.js
// from https://github.com/indutny/self-signed/blob/gh-pages/lib/asn1.js | ||
// Fedor, you are amazing. | ||
'use strict' | ||
var asn1 = require('asn1.js') | ||
'use strict'; | ||
exports.certificate = require('./certificate') | ||
var asn1 = require('asn1.js'); | ||
exports.certificate = require('./certificate'); | ||
var RSAPrivateKey = asn1.define('RSAPrivateKey', function () { | ||
this.seq().obj( | ||
this.key('version').int(), | ||
this.key('modulus').int(), | ||
this.key('publicExponent').int(), | ||
this.key('privateExponent').int(), | ||
this.key('prime1').int(), | ||
this.key('prime2').int(), | ||
this.key('exponent1').int(), | ||
this.key('exponent2').int(), | ||
this.key('coefficient').int() | ||
) | ||
}) | ||
exports.RSAPrivateKey = RSAPrivateKey | ||
this.seq().obj( | ||
this.key('version')['int'](), | ||
this.key('modulus')['int'](), | ||
this.key('publicExponent')['int'](), | ||
this.key('privateExponent')['int'](), | ||
this.key('prime1')['int'](), | ||
this.key('prime2')['int'](), | ||
this.key('exponent1')['int'](), | ||
this.key('exponent2')['int'](), | ||
this.key('coefficient')['int']() | ||
); | ||
}); | ||
exports.RSAPrivateKey = RSAPrivateKey; | ||
var RSAPublicKey = asn1.define('RSAPublicKey', function () { | ||
this.seq().obj( | ||
this.key('modulus').int(), | ||
this.key('publicExponent').int() | ||
) | ||
}) | ||
exports.RSAPublicKey = RSAPublicKey | ||
this.seq().obj( | ||
this.key('modulus')['int'](), | ||
this.key('publicExponent')['int']() | ||
); | ||
}); | ||
exports.RSAPublicKey = RSAPublicKey; | ||
var AlgorithmIdentifier = asn1.define('AlgorithmIdentifier', function () { | ||
this.seq().obj( | ||
this.key('algorithm').objid(), | ||
this.key('none').null_().optional(), | ||
this.key('curve').objid().optional(), | ||
this.key('params').seq().obj( | ||
this.key('p')['int'](), | ||
this.key('q')['int'](), | ||
this.key('g')['int']() | ||
).optional() | ||
); | ||
}); | ||
var PublicKey = asn1.define('SubjectPublicKeyInfo', function () { | ||
this.seq().obj( | ||
this.key('algorithm').use(AlgorithmIdentifier), | ||
this.key('subjectPublicKey').bitstr() | ||
) | ||
}) | ||
exports.PublicKey = PublicKey | ||
this.seq().obj( | ||
this.key('algorithm').use(AlgorithmIdentifier), | ||
this.key('subjectPublicKey').bitstr() | ||
); | ||
}); | ||
exports.PublicKey = PublicKey; | ||
var AlgorithmIdentifier = asn1.define('AlgorithmIdentifier', function () { | ||
this.seq().obj( | ||
this.key('algorithm').objid(), | ||
this.key('none').null_().optional(), | ||
this.key('curve').objid().optional(), | ||
this.key('params').seq().obj( | ||
this.key('p').int(), | ||
this.key('q').int(), | ||
this.key('g').int() | ||
).optional() | ||
) | ||
}) | ||
var PrivateKeyInfo = asn1.define('PrivateKeyInfo', function () { | ||
this.seq().obj( | ||
this.key('version').int(), | ||
this.key('algorithm').use(AlgorithmIdentifier), | ||
this.key('subjectPrivateKey').octstr() | ||
) | ||
}) | ||
exports.PrivateKey = PrivateKeyInfo | ||
this.seq().obj( | ||
this.key('version')['int'](), | ||
this.key('algorithm').use(AlgorithmIdentifier), | ||
this.key('subjectPrivateKey').octstr() | ||
); | ||
}); | ||
exports.PrivateKey = PrivateKeyInfo; | ||
var EncryptedPrivateKeyInfo = asn1.define('EncryptedPrivateKeyInfo', function () { | ||
this.seq().obj( | ||
this.key('algorithm').seq().obj( | ||
this.key('id').objid(), | ||
this.key('decrypt').seq().obj( | ||
this.key('kde').seq().obj( | ||
this.key('id').objid(), | ||
this.key('kdeparams').seq().obj( | ||
this.key('salt').octstr(), | ||
this.key('iters').int() | ||
) | ||
), | ||
this.key('cipher').seq().obj( | ||
this.key('algo').objid(), | ||
this.key('iv').octstr() | ||
) | ||
) | ||
), | ||
this.key('subjectPrivateKey').octstr() | ||
) | ||
}) | ||
this.seq().obj( | ||
this.key('algorithm').seq().obj( | ||
this.key('id').objid(), | ||
this.key('decrypt').seq().obj( | ||
this.key('kde').seq().obj( | ||
this.key('id').objid(), | ||
this.key('kdeparams').seq().obj( | ||
this.key('salt').octstr(), | ||
this.key('iters')['int']() | ||
) | ||
), | ||
this.key('cipher').seq().obj( | ||
this.key('algo').objid(), | ||
this.key('iv').octstr() | ||
) | ||
) | ||
), | ||
this.key('subjectPrivateKey').octstr() | ||
); | ||
}); | ||
exports.EncryptedPrivateKey = EncryptedPrivateKeyInfo | ||
exports.EncryptedPrivateKey = EncryptedPrivateKeyInfo; | ||
var DSAPrivateKey = asn1.define('DSAPrivateKey', function () { | ||
this.seq().obj( | ||
this.key('version').int(), | ||
this.key('p').int(), | ||
this.key('q').int(), | ||
this.key('g').int(), | ||
this.key('pub_key').int(), | ||
this.key('priv_key').int() | ||
) | ||
}) | ||
exports.DSAPrivateKey = DSAPrivateKey | ||
this.seq().obj( | ||
this.key('version')['int'](), | ||
this.key('p')['int'](), | ||
this.key('q')['int'](), | ||
this.key('g')['int'](), | ||
this.key('pub_key')['int'](), | ||
this.key('priv_key')['int']() | ||
); | ||
}); | ||
exports.DSAPrivateKey = DSAPrivateKey; | ||
exports.DSAparam = asn1.define('DSAparam', function () { | ||
this.int() | ||
}) | ||
this['int'](); | ||
}); | ||
var ECParameters = asn1.define('ECParameters', function () { | ||
this.choice({ | ||
namedCurve: this.objid() | ||
}); | ||
}); | ||
var ECPrivateKey = asn1.define('ECPrivateKey', function () { | ||
this.seq().obj( | ||
this.key('version').int(), | ||
this.key('privateKey').octstr(), | ||
this.key('parameters').optional().explicit(0).use(ECParameters), | ||
this.key('publicKey').optional().explicit(1).bitstr() | ||
) | ||
}) | ||
exports.ECPrivateKey = ECPrivateKey | ||
this.seq().obj( | ||
this.key('version')['int'](), | ||
this.key('privateKey').octstr(), | ||
this.key('parameters').optional().explicit(0).use(ECParameters), | ||
this.key('publicKey').optional().explicit(1).bitstr() | ||
); | ||
}); | ||
exports.ECPrivateKey = ECPrivateKey; | ||
var ECParameters = asn1.define('ECParameters', function () { | ||
this.choice({ | ||
namedCurve: this.objid() | ||
}) | ||
}) | ||
exports.signature = asn1.define('signature', function () { | ||
this.seq().obj( | ||
this.key('r').int(), | ||
this.key('s').int() | ||
) | ||
}) | ||
this.seq().obj( | ||
this.key('r')['int'](), | ||
this.key('s')['int']() | ||
); | ||
}); |
// from https://github.com/Rantanen/node-dtls/blob/25a7dc861bda38cfeac93a723500eea4f0ac2e86/Certificate.js | ||
// thanks to @Rantanen | ||
'use strict' | ||
'use strict'; | ||
var asn = require('asn1.js') | ||
var asn = require('asn1.js'); | ||
var Time = asn.define('Time', function () { | ||
this.choice({ | ||
utcTime: this.utctime(), | ||
generalTime: this.gentime() | ||
}) | ||
}) | ||
this.choice({ | ||
utcTime: this.utctime(), | ||
generalTime: this.gentime() | ||
}); | ||
}); | ||
var AttributeTypeValue = asn.define('AttributeTypeValue', function () { | ||
this.seq().obj( | ||
this.key('type').objid(), | ||
this.key('value').any() | ||
) | ||
}) | ||
this.seq().obj( | ||
this.key('type').objid(), | ||
this.key('value').any() | ||
); | ||
}); | ||
var AlgorithmIdentifier = asn.define('AlgorithmIdentifier', function () { | ||
this.seq().obj( | ||
this.key('algorithm').objid(), | ||
this.key('parameters').optional(), | ||
this.key('curve').objid().optional() | ||
) | ||
}) | ||
this.seq().obj( | ||
this.key('algorithm').objid(), | ||
this.key('parameters').optional(), | ||
this.key('curve').objid().optional() | ||
); | ||
}); | ||
var SubjectPublicKeyInfo = asn.define('SubjectPublicKeyInfo', function () { | ||
this.seq().obj( | ||
this.key('algorithm').use(AlgorithmIdentifier), | ||
this.key('subjectPublicKey').bitstr() | ||
) | ||
}) | ||
this.seq().obj( | ||
this.key('algorithm').use(AlgorithmIdentifier), | ||
this.key('subjectPublicKey').bitstr() | ||
); | ||
}); | ||
var RelativeDistinguishedName = asn.define('RelativeDistinguishedName', function () { | ||
this.setof(AttributeTypeValue) | ||
}) | ||
this.setof(AttributeTypeValue); | ||
}); | ||
var RDNSequence = asn.define('RDNSequence', function () { | ||
this.seqof(RelativeDistinguishedName) | ||
}) | ||
this.seqof(RelativeDistinguishedName); | ||
}); | ||
var Name = asn.define('Name', function () { | ||
this.choice({ | ||
rdnSequence: this.use(RDNSequence) | ||
}) | ||
}) | ||
this.choice({ | ||
rdnSequence: this.use(RDNSequence) | ||
}); | ||
}); | ||
var Validity = asn.define('Validity', function () { | ||
this.seq().obj( | ||
this.key('notBefore').use(Time), | ||
this.key('notAfter').use(Time) | ||
) | ||
}) | ||
this.seq().obj( | ||
this.key('notBefore').use(Time), | ||
this.key('notAfter').use(Time) | ||
); | ||
}); | ||
var Extension = asn.define('Extension', function () { | ||
this.seq().obj( | ||
this.key('extnID').objid(), | ||
this.key('critical').bool().def(false), | ||
this.key('extnValue').octstr() | ||
) | ||
}) | ||
this.seq().obj( | ||
this.key('extnID').objid(), | ||
this.key('critical').bool().def(false), | ||
this.key('extnValue').octstr() | ||
); | ||
}); | ||
var TBSCertificate = asn.define('TBSCertificate', function () { | ||
this.seq().obj( | ||
this.key('version').explicit(0).int().optional(), | ||
this.key('serialNumber').int(), | ||
this.key('signature').use(AlgorithmIdentifier), | ||
this.key('issuer').use(Name), | ||
this.key('validity').use(Validity), | ||
this.key('subject').use(Name), | ||
this.key('subjectPublicKeyInfo').use(SubjectPublicKeyInfo), | ||
this.key('issuerUniqueID').implicit(1).bitstr().optional(), | ||
this.key('subjectUniqueID').implicit(2).bitstr().optional(), | ||
this.key('extensions').explicit(3).seqof(Extension).optional() | ||
) | ||
}) | ||
this.seq().obj( | ||
this.key('version').explicit(0)['int']().optional(), | ||
this.key('serialNumber')['int'](), | ||
this.key('signature').use(AlgorithmIdentifier), | ||
this.key('issuer').use(Name), | ||
this.key('validity').use(Validity), | ||
this.key('subject').use(Name), | ||
this.key('subjectPublicKeyInfo').use(SubjectPublicKeyInfo), | ||
this.key('issuerUniqueID').implicit(1).bitstr().optional(), | ||
this.key('subjectUniqueID').implicit(2).bitstr().optional(), | ||
this.key('extensions').explicit(3).seqof(Extension).optional() | ||
); | ||
}); | ||
var X509Certificate = asn.define('X509Certificate', function () { | ||
this.seq().obj( | ||
this.key('tbsCertificate').use(TBSCertificate), | ||
this.key('signatureAlgorithm').use(AlgorithmIdentifier), | ||
this.key('signatureValue').bitstr() | ||
) | ||
}) | ||
this.seq().obj( | ||
this.key('tbsCertificate').use(TBSCertificate), | ||
this.key('signatureAlgorithm').use(AlgorithmIdentifier), | ||
this.key('signatureValue').bitstr() | ||
); | ||
}); | ||
module.exports = X509Certificate | ||
module.exports = X509Certificate; |
@@ -0,31 +1,33 @@ | ||
'use strict'; | ||
// adapted from https://github.com/apatil/pemstrip | ||
var findProc = /Proc-Type: 4,ENCRYPTED[\n\r]+DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)[\n\r]+([0-9A-z\n\r+/=]+)[\n\r]+/m | ||
var startRegex = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----/m | ||
var fullRegex = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----([0-9A-z\n\r+/=]+)-----END \1-----$/m | ||
var evp = require('evp_bytestokey') | ||
var ciphers = require('browserify-aes') | ||
var Buffer = require('safe-buffer').Buffer | ||
var findProc = /Proc-Type: 4,ENCRYPTED[\n\r]+DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)[\n\r]+([0-9A-z\n\r+/=]+)[\n\r]+/m; | ||
var startRegex = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----/m; | ||
var fullRegex = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----([0-9A-z\n\r+/=]+)-----END \1-----$/m; | ||
var evp = require('evp_bytestokey'); | ||
var ciphers = require('browserify-aes'); | ||
var Buffer = require('safe-buffer').Buffer; | ||
module.exports = function (okey, password) { | ||
var key = okey.toString() | ||
var match = key.match(findProc) | ||
var decrypted | ||
if (!match) { | ||
var match2 = key.match(fullRegex) | ||
decrypted = Buffer.from(match2[2].replace(/[\r\n]/g, ''), 'base64') | ||
} else { | ||
var suite = 'aes' + match[1] | ||
var iv = Buffer.from(match[2], 'hex') | ||
var cipherText = Buffer.from(match[3].replace(/[\r\n]/g, ''), 'base64') | ||
var cipherKey = evp(password, iv.slice(0, 8), parseInt(match[1], 10)).key | ||
var out = [] | ||
var cipher = ciphers.createDecipheriv(suite, cipherKey, iv) | ||
out.push(cipher.update(cipherText)) | ||
out.push(cipher.final()) | ||
decrypted = Buffer.concat(out) | ||
} | ||
var tag = key.match(startRegex)[1] | ||
return { | ||
tag: tag, | ||
data: decrypted | ||
} | ||
} | ||
var key = okey.toString(); | ||
var match = key.match(findProc); | ||
var decrypted; | ||
if (!match) { | ||
var match2 = key.match(fullRegex); | ||
decrypted = Buffer.from(match2[2].replace(/[\r\n]/g, ''), 'base64'); | ||
} else { | ||
var suite = 'aes' + match[1]; | ||
var iv = Buffer.from(match[2], 'hex'); | ||
var cipherText = Buffer.from(match[3].replace(/[\r\n]/g, ''), 'base64'); | ||
var cipherKey = evp(password, iv.slice(0, 8), parseInt(match[1], 10)).key; | ||
var out = []; | ||
var cipher = ciphers.createDecipheriv(suite, cipherKey, iv); | ||
out.push(cipher.update(cipherText)); | ||
out.push(cipher['final']()); | ||
decrypted = Buffer.concat(out); | ||
} | ||
var tag = key.match(startRegex)[1]; | ||
return { | ||
tag: tag, | ||
data: decrypted | ||
}; | ||
}; |
210
index.js
@@ -1,107 +0,111 @@ | ||
var asn1 = require('./asn1') | ||
var aesid = require('./aesid.json') | ||
var fixProc = require('./fixProc') | ||
var ciphers = require('browserify-aes') | ||
var compat = require('pbkdf2') | ||
var Buffer = require('safe-buffer').Buffer | ||
module.exports = parseKeys | ||
'use strict'; | ||
function parseKeys (buffer) { | ||
var password | ||
if (typeof buffer === 'object' && !Buffer.isBuffer(buffer)) { | ||
password = buffer.passphrase | ||
buffer = buffer.key | ||
} | ||
if (typeof buffer === 'string') { | ||
buffer = Buffer.from(buffer) | ||
} | ||
var asn1 = require('./asn1'); | ||
var aesid = require('./aesid.json'); | ||
var fixProc = require('./fixProc'); | ||
var ciphers = require('browserify-aes'); | ||
var compat = require('pbkdf2'); | ||
var Buffer = require('safe-buffer').Buffer; | ||
var stripped = fixProc(buffer, password) | ||
function decrypt(data, password) { | ||
var salt = data.algorithm.decrypt.kde.kdeparams.salt; | ||
var iters = parseInt(data.algorithm.decrypt.kde.kdeparams.iters.toString(), 10); | ||
var algo = aesid[data.algorithm.decrypt.cipher.algo.join('.')]; | ||
var iv = data.algorithm.decrypt.cipher.iv; | ||
var cipherText = data.subjectPrivateKey; | ||
var keylen = parseInt(algo.split('-')[1], 10) / 8; | ||
var key = compat.pbkdf2Sync(password, salt, iters, keylen, 'sha1'); | ||
var cipher = ciphers.createDecipheriv(algo, key, iv); | ||
var out = []; | ||
out.push(cipher.update(cipherText)); | ||
out.push(cipher['final']()); | ||
return Buffer.concat(out); | ||
} | ||
var type = stripped.tag | ||
var data = stripped.data | ||
var subtype, ndata | ||
switch (type) { | ||
case 'CERTIFICATE': | ||
ndata = asn1.certificate.decode(data, 'der').tbsCertificate.subjectPublicKeyInfo | ||
// falls through | ||
case 'PUBLIC KEY': | ||
if (!ndata) { | ||
ndata = asn1.PublicKey.decode(data, 'der') | ||
} | ||
subtype = ndata.algorithm.algorithm.join('.') | ||
switch (subtype) { | ||
case '1.2.840.113549.1.1.1': | ||
return asn1.RSAPublicKey.decode(ndata.subjectPublicKey.data, 'der') | ||
case '1.2.840.10045.2.1': | ||
ndata.subjectPrivateKey = ndata.subjectPublicKey | ||
return { | ||
type: 'ec', | ||
data: ndata | ||
} | ||
case '1.2.840.10040.4.1': | ||
ndata.algorithm.params.pub_key = asn1.DSAparam.decode(ndata.subjectPublicKey.data, 'der') | ||
return { | ||
type: 'dsa', | ||
data: ndata.algorithm.params | ||
} | ||
default: throw new Error('unknown key id ' + subtype) | ||
} | ||
// throw new Error('unknown key type ' + type) | ||
case 'ENCRYPTED PRIVATE KEY': | ||
data = asn1.EncryptedPrivateKey.decode(data, 'der') | ||
data = decrypt(data, password) | ||
// falls through | ||
case 'PRIVATE KEY': | ||
ndata = asn1.PrivateKey.decode(data, 'der') | ||
subtype = ndata.algorithm.algorithm.join('.') | ||
switch (subtype) { | ||
case '1.2.840.113549.1.1.1': | ||
return asn1.RSAPrivateKey.decode(ndata.subjectPrivateKey, 'der') | ||
case '1.2.840.10045.2.1': | ||
return { | ||
curve: ndata.algorithm.curve, | ||
privateKey: asn1.ECPrivateKey.decode(ndata.subjectPrivateKey, 'der').privateKey | ||
} | ||
case '1.2.840.10040.4.1': | ||
ndata.algorithm.params.priv_key = asn1.DSAparam.decode(ndata.subjectPrivateKey, 'der') | ||
return { | ||
type: 'dsa', | ||
params: ndata.algorithm.params | ||
} | ||
default: throw new Error('unknown key id ' + subtype) | ||
} | ||
// throw new Error('unknown key type ' + type) | ||
case 'RSA PUBLIC KEY': | ||
return asn1.RSAPublicKey.decode(data, 'der') | ||
case 'RSA PRIVATE KEY': | ||
return asn1.RSAPrivateKey.decode(data, 'der') | ||
case 'DSA PRIVATE KEY': | ||
return { | ||
type: 'dsa', | ||
params: asn1.DSAPrivateKey.decode(data, 'der') | ||
} | ||
case 'EC PRIVATE KEY': | ||
data = asn1.ECPrivateKey.decode(data, 'der') | ||
return { | ||
curve: data.parameters.value, | ||
privateKey: data.privateKey | ||
} | ||
default: throw new Error('unknown key type ' + type) | ||
} | ||
function parseKeys(buffer) { | ||
var password; | ||
if (typeof buffer === 'object' && !Buffer.isBuffer(buffer)) { | ||
password = buffer.passphrase; | ||
buffer = buffer.key; | ||
} | ||
if (typeof buffer === 'string') { | ||
buffer = Buffer.from(buffer); | ||
} | ||
var stripped = fixProc(buffer, password); | ||
var type = stripped.tag; | ||
var data = stripped.data; | ||
var subtype, ndata; | ||
switch (type) { | ||
case 'CERTIFICATE': | ||
ndata = asn1.certificate.decode(data, 'der').tbsCertificate.subjectPublicKeyInfo; | ||
// falls through | ||
case 'PUBLIC KEY': | ||
if (!ndata) { | ||
ndata = asn1.PublicKey.decode(data, 'der'); | ||
} | ||
subtype = ndata.algorithm.algorithm.join('.'); | ||
switch (subtype) { | ||
case '1.2.840.113549.1.1.1': | ||
return asn1.RSAPublicKey.decode(ndata.subjectPublicKey.data, 'der'); | ||
case '1.2.840.10045.2.1': | ||
ndata.subjectPrivateKey = ndata.subjectPublicKey; | ||
return { | ||
type: 'ec', | ||
data: ndata | ||
}; | ||
case '1.2.840.10040.4.1': | ||
ndata.algorithm.params.pub_key = asn1.DSAparam.decode(ndata.subjectPublicKey.data, 'der'); | ||
return { | ||
type: 'dsa', | ||
data: ndata.algorithm.params | ||
}; | ||
default: throw new Error('unknown key id ' + subtype); | ||
} | ||
// throw new Error('unknown key type ' + type) | ||
case 'ENCRYPTED PRIVATE KEY': | ||
data = asn1.EncryptedPrivateKey.decode(data, 'der'); | ||
data = decrypt(data, password); | ||
// falls through | ||
case 'PRIVATE KEY': | ||
ndata = asn1.PrivateKey.decode(data, 'der'); | ||
subtype = ndata.algorithm.algorithm.join('.'); | ||
switch (subtype) { | ||
case '1.2.840.113549.1.1.1': | ||
return asn1.RSAPrivateKey.decode(ndata.subjectPrivateKey, 'der'); | ||
case '1.2.840.10045.2.1': | ||
return { | ||
curve: ndata.algorithm.curve, | ||
privateKey: asn1.ECPrivateKey.decode(ndata.subjectPrivateKey, 'der').privateKey | ||
}; | ||
case '1.2.840.10040.4.1': | ||
ndata.algorithm.params.priv_key = asn1.DSAparam.decode(ndata.subjectPrivateKey, 'der'); | ||
return { | ||
type: 'dsa', | ||
params: ndata.algorithm.params | ||
}; | ||
default: throw new Error('unknown key id ' + subtype); | ||
} | ||
// throw new Error('unknown key type ' + type) | ||
case 'RSA PUBLIC KEY': | ||
return asn1.RSAPublicKey.decode(data, 'der'); | ||
case 'RSA PRIVATE KEY': | ||
return asn1.RSAPrivateKey.decode(data, 'der'); | ||
case 'DSA PRIVATE KEY': | ||
return { | ||
type: 'dsa', | ||
params: asn1.DSAPrivateKey.decode(data, 'der') | ||
}; | ||
case 'EC PRIVATE KEY': | ||
data = asn1.ECPrivateKey.decode(data, 'der'); | ||
return { | ||
curve: data.parameters.value, | ||
privateKey: data.privateKey | ||
}; | ||
default: throw new Error('unknown key type ' + type); | ||
} | ||
} | ||
parseKeys.signature = asn1.signature | ||
function decrypt (data, password) { | ||
var salt = data.algorithm.decrypt.kde.kdeparams.salt | ||
var iters = parseInt(data.algorithm.decrypt.kde.kdeparams.iters.toString(), 10) | ||
var algo = aesid[data.algorithm.decrypt.cipher.algo.join('.')] | ||
var iv = data.algorithm.decrypt.cipher.iv | ||
var cipherText = data.subjectPrivateKey | ||
var keylen = parseInt(algo.split('-')[1], 10) / 8 | ||
var key = compat.pbkdf2Sync(password, salt, iters, keylen, 'sha1') | ||
var cipher = ciphers.createDecipheriv(algo, key, iv) | ||
var out = [] | ||
out.push(cipher.update(cipherText)) | ||
out.push(cipher.final()) | ||
return Buffer.concat(out) | ||
} | ||
parseKeys.signature = asn1.signature; | ||
module.exports = parseKeys; |
{ | ||
"name": "parse-asn1", | ||
"version": "5.1.6", | ||
"description": "utility library for parsing asn1 files for use with browserify-sign.", | ||
"main": "index.js", | ||
"files": [ | ||
"asn1.js", | ||
"aesid.json", | ||
"certificate.js", | ||
"fixProc.js", | ||
"index.js" | ||
], | ||
"scripts": { | ||
"unit": "node ./test", | ||
"standard": "standard", | ||
"test": "npm run standard && npm run unit" | ||
}, | ||
"repository": { | ||
"type": "git", | ||
"url": "git://github.com/crypto-browserify/parse-asn1.git" | ||
}, | ||
"author": "", | ||
"license": "ISC", | ||
"dependencies": { | ||
"asn1.js": "^5.2.0", | ||
"browserify-aes": "^1.0.0", | ||
"evp_bytestokey": "^1.0.0", | ||
"pbkdf2": "^3.0.3", | ||
"safe-buffer": "^5.1.1" | ||
}, | ||
"devDependencies": { | ||
"standard": "^14.3.4", | ||
"tape": "^5.0.1" | ||
} | ||
"name": "parse-asn1", | ||
"version": "5.1.7", | ||
"description": "utility library for parsing asn1 files for use with browserify-sign.", | ||
"main": "index.js", | ||
"scripts": { | ||
"prepack": "npmignore --auto --commentLines=autogenerated", | ||
"prepublish": "not-in-publish || npm run prepublishOnly", | ||
"prepublishOnly": "safe-publish-latest", | ||
"lint": "eslint --ext=js,mjs .", | ||
"tests-only": "tape 'test/**/*.js'", | ||
"pretest": "npm run lint", | ||
"test": "npm run tests-only", | ||
"posttest": "aud --production", | ||
"version": "auto-changelog && git add CHANGELOG.md", | ||
"postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"" | ||
}, | ||
"repository": { | ||
"type": "git", | ||
"url": "git://github.com/crypto-browserify/parse-asn1.git" | ||
}, | ||
"author": "", | ||
"license": "ISC", | ||
"dependencies": { | ||
"asn1.js": "^4.10.1", | ||
"browserify-aes": "^1.2.0", | ||
"evp_bytestokey": "^1.0.3", | ||
"hash-base": "~3.0", | ||
"pbkdf2": "^3.1.2", | ||
"safe-buffer": "^5.2.1" | ||
}, | ||
"devDependencies": { | ||
"@ljharb/eslint-config": "^21.1.0", | ||
"aud": "^2.0.4", | ||
"auto-changelog": "^2.4.0", | ||
"eslint": "=8.8.0", | ||
"in-publish": "^2.0.1", | ||
"npmignore": "^0.3.1", | ||
"safe-publish-latest": "^2.0.0", | ||
"tape": "^5.7.5" | ||
}, | ||
"engines": { | ||
"node": ">= 0.10" | ||
}, | ||
"auto-changelog": { | ||
"output": "CHANGELOG.md", | ||
"template": "keepachangelog", | ||
"unreleased": false, | ||
"commitLimit": false, | ||
"backfillLimit": false, | ||
"hideCredit": true | ||
}, | ||
"publishConfig": { | ||
"ignore": [ | ||
".github/workflows", | ||
"test" | ||
] | ||
} | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
24748
11
333
6
8
2
+ Addedhash-base@~3.0
+ Addedasn1.js@4.10.1(transitive)
+ Addedhash-base@3.0.4(transitive)
- Removedasn1.js@5.4.1(transitive)
- Removedhash-base@3.1.0(transitive)
- Removedreadable-stream@3.6.2(transitive)
- Removedsafer-buffer@2.1.2(transitive)
- Removedstring_decoder@1.3.0(transitive)
- Removedutil-deprecate@1.0.2(transitive)
Updatedasn1.js@^4.10.1
Updatedbrowserify-aes@^1.2.0
Updatedevp_bytestokey@^1.0.3
Updatedpbkdf2@^3.1.2
Updatedsafe-buffer@^5.2.1