123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- 'use strict';
- 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;
- 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);
- }
- 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;
- module.exports = parseKeys;
|