publicEncrypt.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/__node_modules/public-encrypt/publicEncrypt.js';
  5. var __require = nodeEnv ? function (request) {
  6. return cc.require(request);
  7. } : function (request) {
  8. return __quick_compile_project__.require(request, __filename);
  9. };
  10. function __define (exports, require, module) {
  11. if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}var parseKeys = require('parse-asn1')
  12. var randomBytes = require('randombytes')
  13. var createHash = require('create-hash')
  14. var mgf = require('./mgf')
  15. var xor = require('./xor')
  16. var BN = require('bn.js')
  17. var withPublic = require('./withPublic')
  18. var crt = require('browserify-rsa')
  19. var Buffer = require('safe-buffer').Buffer
  20. module.exports = function publicEncrypt (publicKey, msg, reverse) {
  21. var padding
  22. if (publicKey.padding) {
  23. padding = publicKey.padding
  24. } else if (reverse) {
  25. padding = 1
  26. } else {
  27. padding = 4
  28. }
  29. var key = parseKeys(publicKey)
  30. var paddedMsg
  31. if (padding === 4) {
  32. paddedMsg = oaep(key, msg)
  33. } else if (padding === 1) {
  34. paddedMsg = pkcs1(key, msg, reverse)
  35. } else if (padding === 3) {
  36. paddedMsg = new BN(msg)
  37. if (paddedMsg.cmp(key.modulus) >= 0) {
  38. throw new Error('data too long for modulus')
  39. }
  40. } else {
  41. throw new Error('unknown padding')
  42. }
  43. if (reverse) {
  44. return crt(paddedMsg, key)
  45. } else {
  46. return withPublic(paddedMsg, key)
  47. }
  48. }
  49. function oaep (key, msg) {
  50. var k = key.modulus.byteLength()
  51. var mLen = msg.length
  52. var iHash = createHash('sha1').update(Buffer.alloc(0)).digest()
  53. var hLen = iHash.length
  54. var hLen2 = 2 * hLen
  55. if (mLen > k - hLen2 - 2) {
  56. throw new Error('message too long')
  57. }
  58. var ps = Buffer.alloc(k - mLen - hLen2 - 2)
  59. var dblen = k - hLen - 1
  60. var seed = randomBytes(hLen)
  61. var maskedDb = xor(Buffer.concat([iHash, ps, Buffer.alloc(1, 1), msg], dblen), mgf(seed, dblen))
  62. var maskedSeed = xor(seed, mgf(maskedDb, hLen))
  63. return new BN(Buffer.concat([Buffer.alloc(1), maskedSeed, maskedDb], k))
  64. }
  65. function pkcs1 (key, msg, reverse) {
  66. var mLen = msg.length
  67. var k = key.modulus.byteLength()
  68. if (mLen > k - 11) {
  69. throw new Error('message too long')
  70. }
  71. var ps
  72. if (reverse) {
  73. ps = Buffer.alloc(k - mLen - 3, 0xff)
  74. } else {
  75. ps = nonZero(k - mLen - 3)
  76. }
  77. return new BN(Buffer.concat([Buffer.from([0, reverse ? 1 : 2]), ps, Buffer.alloc(1), msg], k))
  78. }
  79. function nonZero (len) {
  80. var out = Buffer.allocUnsafe(len)
  81. var i = 0
  82. var cache = randomBytes(len * 2)
  83. var cur = 0
  84. var num
  85. while (i < len) {
  86. if (cur === cache.length) {
  87. cache = randomBytes(len * 2)
  88. cur = 0
  89. }
  90. num = cache[cur++]
  91. if (num) {
  92. out[i++] = num
  93. }
  94. }
  95. return out
  96. }
  97. }
  98. if (nodeEnv) {
  99. __define(__module.exports, __require, __module);
  100. }
  101. else {
  102. __quick_compile_project__.registerModuleFunc(__filename, function () {
  103. __define(__module.exports, __require, __module);
  104. });
  105. }
  106. })();