index.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. 'use strict';
  2. var asn1 = require('./asn1');
  3. var aesid = require('./aesid.json');
  4. var fixProc = require('./fixProc');
  5. var ciphers = require('browserify-aes');
  6. var compat = require('pbkdf2');
  7. var Buffer = require('safe-buffer').Buffer;
  8. function decrypt(data, password) {
  9. var salt = data.algorithm.decrypt.kde.kdeparams.salt;
  10. var iters = parseInt(data.algorithm.decrypt.kde.kdeparams.iters.toString(), 10);
  11. var algo = aesid[data.algorithm.decrypt.cipher.algo.join('.')];
  12. var iv = data.algorithm.decrypt.cipher.iv;
  13. var cipherText = data.subjectPrivateKey;
  14. var keylen = parseInt(algo.split('-')[1], 10) / 8;
  15. var key = compat.pbkdf2Sync(password, salt, iters, keylen, 'sha1');
  16. var cipher = ciphers.createDecipheriv(algo, key, iv);
  17. var out = [];
  18. out.push(cipher.update(cipherText));
  19. out.push(cipher['final']());
  20. return Buffer.concat(out);
  21. }
  22. function parseKeys(buffer) {
  23. var password;
  24. if (typeof buffer === 'object' && !Buffer.isBuffer(buffer)) {
  25. password = buffer.passphrase;
  26. buffer = buffer.key;
  27. }
  28. if (typeof buffer === 'string') {
  29. buffer = Buffer.from(buffer);
  30. }
  31. var stripped = fixProc(buffer, password);
  32. var type = stripped.tag;
  33. var data = stripped.data;
  34. var subtype, ndata;
  35. switch (type) {
  36. case 'CERTIFICATE':
  37. ndata = asn1.certificate.decode(data, 'der').tbsCertificate.subjectPublicKeyInfo;
  38. // falls through
  39. case 'PUBLIC KEY':
  40. if (!ndata) {
  41. ndata = asn1.PublicKey.decode(data, 'der');
  42. }
  43. subtype = ndata.algorithm.algorithm.join('.');
  44. switch (subtype) {
  45. case '1.2.840.113549.1.1.1':
  46. return asn1.RSAPublicKey.decode(ndata.subjectPublicKey.data, 'der');
  47. case '1.2.840.10045.2.1':
  48. ndata.subjectPrivateKey = ndata.subjectPublicKey;
  49. return {
  50. type: 'ec',
  51. data: ndata
  52. };
  53. case '1.2.840.10040.4.1':
  54. ndata.algorithm.params.pub_key = asn1.DSAparam.decode(ndata.subjectPublicKey.data, 'der');
  55. return {
  56. type: 'dsa',
  57. data: ndata.algorithm.params
  58. };
  59. default: throw new Error('unknown key id ' + subtype);
  60. }
  61. // throw new Error('unknown key type ' + type)
  62. case 'ENCRYPTED PRIVATE KEY':
  63. data = asn1.EncryptedPrivateKey.decode(data, 'der');
  64. data = decrypt(data, password);
  65. // falls through
  66. case 'PRIVATE KEY':
  67. ndata = asn1.PrivateKey.decode(data, 'der');
  68. subtype = ndata.algorithm.algorithm.join('.');
  69. switch (subtype) {
  70. case '1.2.840.113549.1.1.1':
  71. return asn1.RSAPrivateKey.decode(ndata.subjectPrivateKey, 'der');
  72. case '1.2.840.10045.2.1':
  73. return {
  74. curve: ndata.algorithm.curve,
  75. privateKey: asn1.ECPrivateKey.decode(ndata.subjectPrivateKey, 'der').privateKey
  76. };
  77. case '1.2.840.10040.4.1':
  78. ndata.algorithm.params.priv_key = asn1.DSAparam.decode(ndata.subjectPrivateKey, 'der');
  79. return {
  80. type: 'dsa',
  81. params: ndata.algorithm.params
  82. };
  83. default: throw new Error('unknown key id ' + subtype);
  84. }
  85. // throw new Error('unknown key type ' + type)
  86. case 'RSA PUBLIC KEY':
  87. return asn1.RSAPublicKey.decode(data, 'der');
  88. case 'RSA PRIVATE KEY':
  89. return asn1.RSAPrivateKey.decode(data, 'der');
  90. case 'DSA PRIVATE KEY':
  91. return {
  92. type: 'dsa',
  93. params: asn1.DSAPrivateKey.decode(data, 'der')
  94. };
  95. case 'EC PRIVATE KEY':
  96. data = asn1.ECPrivateKey.decode(data, 'der');
  97. return {
  98. curve: data.parameters.value,
  99. privateKey: data.privateKey
  100. };
  101. default: throw new Error('unknown key type ' + type);
  102. }
  103. }
  104. parseKeys.signature = asn1.signature;
  105. module.exports = parseKeys;