fixProc.js 1.2 KB

123456789101112131415161718192021222324252627282930313233
  1. 'use strict';
  2. // adapted from https://github.com/apatil/pemstrip
  3. 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;
  4. var startRegex = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----/m;
  5. var fullRegex = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----([0-9A-z\n\r+/=]+)-----END \1-----$/m;
  6. var evp = require('evp_bytestokey');
  7. var ciphers = require('browserify-aes');
  8. var Buffer = require('safe-buffer').Buffer;
  9. module.exports = function (okey, password) {
  10. var key = okey.toString();
  11. var match = key.match(findProc);
  12. var decrypted;
  13. if (!match) {
  14. var match2 = key.match(fullRegex);
  15. decrypted = Buffer.from(match2[2].replace(/[\r\n]/g, ''), 'base64');
  16. } else {
  17. var suite = 'aes' + match[1];
  18. var iv = Buffer.from(match[2], 'hex');
  19. var cipherText = Buffer.from(match[3].replace(/[\r\n]/g, ''), 'base64');
  20. var cipherKey = evp(password, iv.slice(0, 8), parseInt(match[1], 10)).key;
  21. var out = [];
  22. var cipher = ciphers.createDecipheriv(suite, cipherKey, iv);
  23. out.push(cipher.update(cipherText));
  24. out.push(cipher['final']());
  25. decrypted = Buffer.concat(out);
  26. }
  27. var tag = key.match(startRegex)[1];
  28. return {
  29. tag: tag,
  30. data: decrypted
  31. };
  32. };