| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | var parseKeys = require('parse-asn1')var randomBytes = require('randombytes')var createHash = require('create-hash')var mgf = require('./mgf')var xor = require('./xor')var BN = require('bn.js')var withPublic = require('./withPublic')var crt = require('browserify-rsa')var Buffer = require('safe-buffer').Buffermodule.exports = function publicEncrypt (publicKey, msg, reverse) {  var padding  if (publicKey.padding) {    padding = publicKey.padding  } else if (reverse) {    padding = 1  } else {    padding = 4  }  var key = parseKeys(publicKey)  var paddedMsg  if (padding === 4) {    paddedMsg = oaep(key, msg)  } else if (padding === 1) {    paddedMsg = pkcs1(key, msg, reverse)  } else if (padding === 3) {    paddedMsg = new BN(msg)    if (paddedMsg.cmp(key.modulus) >= 0) {      throw new Error('data too long for modulus')    }  } else {    throw new Error('unknown padding')  }  if (reverse) {    return crt(paddedMsg, key)  } else {    return withPublic(paddedMsg, key)  }}function oaep (key, msg) {  var k = key.modulus.byteLength()  var mLen = msg.length  var iHash = createHash('sha1').update(Buffer.alloc(0)).digest()  var hLen = iHash.length  var hLen2 = 2 * hLen  if (mLen > k - hLen2 - 2) {    throw new Error('message too long')  }  var ps = Buffer.alloc(k - mLen - hLen2 - 2)  var dblen = k - hLen - 1  var seed = randomBytes(hLen)  var maskedDb = xor(Buffer.concat([iHash, ps, Buffer.alloc(1, 1), msg], dblen), mgf(seed, dblen))  var maskedSeed = xor(seed, mgf(maskedDb, hLen))  return new BN(Buffer.concat([Buffer.alloc(1), maskedSeed, maskedDb], k))}function pkcs1 (key, msg, reverse) {  var mLen = msg.length  var k = key.modulus.byteLength()  if (mLen > k - 11) {    throw new Error('message too long')  }  var ps  if (reverse) {    ps = Buffer.alloc(k - mLen - 3, 0xff)  } else {    ps = nonZero(k - mLen - 3)  }  return new BN(Buffer.concat([Buffer.from([0, reverse ? 1 : 2]), ps, Buffer.alloc(1), msg], k))}function nonZero (len) {  var out = Buffer.allocUnsafe(len)  var i = 0  var cache = randomBytes(len * 2)  var cur = 0  var num  while (i < len) {    if (cur === cache.length) {      cache = randomBytes(len * 2)      cur = 0    }    num = cache[cur++]    if (num) {      out[i++] = num    }  }  return out}
 |