react / wstein / node_modules / browserify / node_modules / crypto-browserify / node_modules / public-encrypt / node_modules / parse-asn1 / index.js
80555 viewsvar asn1 = require('./asn1');1var aesid = require('./aesid.json');2var fixProc = require('./fixProc');3var ciphers = require('browserify-aes');4var compat = require('pbkdf2');5module.exports = parseKeys;67function parseKeys(buffer) {8var password;9if (typeof buffer === 'object' && !Buffer.isBuffer(buffer)) {10password = buffer.passphrase;11buffer = buffer.key;12}13if (typeof buffer === 'string') {14buffer = new Buffer(buffer);15}1617var stripped = fixProc(buffer, password);1819var type = stripped.tag;20var data = stripped.data;21var subtype,ndata;22switch (type) {23case 'PUBLIC KEY':24ndata = asn1.PublicKey.decode(data, 'der');25subtype = ndata.algorithm.algorithm.join('.');26switch(subtype) {27case '1.2.840.113549.1.1.1':28return asn1.RSAPublicKey.decode(ndata.subjectPublicKey.data, 'der');29case '1.2.840.10045.2.1':30ndata.subjectPrivateKey = ndata.subjectPublicKey;31return {32type: 'ec',33data: ndata34};35case '1.2.840.10040.4.1':36ndata.algorithm.params.pub_key = asn1.DSAparam.decode(ndata.subjectPublicKey.data, 'der');37return {38type: 'dsa',39data: ndata.algorithm.params40};41default: throw new Error('unknown key id ' + subtype);42}43throw new Error('unknown key type ' + type);44case 'ENCRYPTED PRIVATE KEY':45data = asn1.EncryptedPrivateKey.decode(data, 'der');46data = decrypt(data, password);47//falling through48case 'PRIVATE KEY':49ndata = asn1.PrivateKey.decode(data, 'der');50subtype = ndata.algorithm.algorithm.join('.');51switch(subtype) {52case '1.2.840.113549.1.1.1':53return asn1.RSAPrivateKey.decode(ndata.subjectPrivateKey, 'der');54case '1.2.840.10045.2.1':55return {56curve: ndata.algorithm.curve,57privateKey: asn1.ECPrivateKey.decode(ndata.subjectPrivateKey, 'der').privateKey58};59case '1.2.840.10040.4.1':60ndata.algorithm.params.priv_key = asn1.DSAparam.decode(ndata.subjectPrivateKey, 'der');61return {62type: 'dsa',63params: ndata.algorithm.params64};65default: throw new Error('unknown key id ' + subtype);66}67throw new Error('unknown key type ' + type);68case 'RSA PUBLIC KEY':69return asn1.RSAPublicKey.decode(data, 'der');70case 'RSA PRIVATE KEY':71return asn1.RSAPrivateKey.decode(data, 'der');72case 'DSA PRIVATE KEY':73return {74type: 'dsa',75params: asn1.DSAPrivateKey.decode(data, 'der')76};77case 'EC PRIVATE KEY':78data = asn1.ECPrivateKey.decode(data, 'der');79return {80curve: data.parameters.value,81privateKey: data.privateKey82};83default: throw new Error('unknown key type ' + type);84}85}86parseKeys.signature = asn1.signature;87function decrypt(data, password) {88var salt = data.algorithm.decrypt.kde.kdeparams.salt;89var iters = parseInt(data.algorithm.decrypt.kde.kdeparams.iters.toString(), 10);90var algo = aesid[data.algorithm.decrypt.cipher.algo.join('.')];91var iv = data.algorithm.decrypt.cipher.iv;92var cipherText = data.subjectPrivateKey;93var keylen = parseInt(algo.split('-')[1], 10)/8;94var key = compat.pbkdf2Sync(password, salt, iters, keylen);95var cipher = ciphers.createDecipheriv(algo, key, iv);96var out = [];97out.push(cipher.update(cipherText));98out.push(cipher.final());99return Buffer.concat(out);100}101102103