node12.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. var crypto = require('crypto');
  2. var constants = require('constants');
  3. var schemes = require('../schemes/schemes.js');
  4. module.exports = function (keyPair, options) {
  5. var jsEngine = require('./js.js')(keyPair, options);
  6. var pkcs1Scheme = schemes.pkcs1.makeScheme(keyPair, options);
  7. return {
  8. encrypt: function (buffer, usePrivate) {
  9. if (usePrivate) {
  10. return jsEngine.encrypt(buffer, usePrivate);
  11. }
  12. var padding = constants.RSA_PKCS1_OAEP_PADDING;
  13. if (options.encryptionScheme === 'pkcs1') {
  14. padding = constants.RSA_PKCS1_PADDING;
  15. }
  16. if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) {
  17. padding = options.encryptionSchemeOptions.padding;
  18. }
  19. var data = buffer;
  20. if (padding === constants.RSA_NO_PADDING) {
  21. data = pkcs1Scheme.pkcs0pad(buffer);
  22. }
  23. return crypto.publicEncrypt({
  24. key: options.rsaUtils.exportKey('public'),
  25. padding: padding
  26. }, data);
  27. },
  28. decrypt: function (buffer, usePublic) {
  29. if (usePublic) {
  30. return jsEngine.decrypt(buffer, usePublic);
  31. }
  32. var padding = constants.RSA_PKCS1_OAEP_PADDING;
  33. if (options.encryptionScheme === 'pkcs1') {
  34. padding = constants.RSA_PKCS1_PADDING;
  35. }
  36. if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) {
  37. padding = options.encryptionSchemeOptions.padding;
  38. }
  39. var res = crypto.privateDecrypt({
  40. key: options.rsaUtils.exportKey('private'),
  41. padding: padding
  42. }, buffer);
  43. if (padding === constants.RSA_NO_PADDING) {
  44. return pkcs1Scheme.pkcs0unpad(res);
  45. }
  46. return res;
  47. }
  48. };
  49. };