react / wstein / node_modules / browserify / node_modules / crypto-browserify / node_modules / public-encrypt / publicEncrypt.js
80542 viewsvar parseKeys = require('parse-asn1');1var randomBytes = require('randombytes');2var createHash = require('create-hash');3var mgf = require('./mgf');4var xor = require('./xor');5var bn = require('bn.js');6var withPublic = require('./withPublic');7var crt = require('browserify-rsa');89var constants = {10RSA_PKCS1_OAEP_PADDING: 4,11RSA_PKCS1_PADDIN: 1,12RSA_NO_PADDING: 313};1415module.exports = function publicEncrypt(public_key, msg, reverse) {16var padding;17if (public_key.padding) {18padding = public_key.padding;19} else if (reverse) {20padding = 1;21} else {22padding = 4;23}24var key = parseKeys(public_key);25var paddedMsg;26if (padding === 4) {27paddedMsg = oaep(key, msg);28} else if (padding === 1) {29paddedMsg = pkcs1(key, msg, reverse);30} else if (padding === 3) {31paddedMsg = new bn(msg);32if (paddedMsg.cmp(key.modulus) >= 0) {33throw new Error('data too long for modulus');34}35} else {36throw new Error('unknown padding');37}38if (reverse) {39return crt(paddedMsg, key);40} else {41return withPublic(paddedMsg, key);42}43};4445function oaep(key, msg){46var k = key.modulus.byteLength();47var mLen = msg.length;48var iHash = createHash('sha1').update(new Buffer('')).digest();49var hLen = iHash.length;50var hLen2 = 2 * hLen;51if (mLen > k - hLen2 - 2) {52throw new Error('message too long');53}54var ps = new Buffer(k - mLen - hLen2 - 2);55ps.fill(0);56var dblen = k - hLen - 1;57var seed = randomBytes(hLen);58var maskedDb = xor(Buffer.concat([iHash, ps, new Buffer([1]), msg], dblen), mgf(seed, dblen));59var maskedSeed = xor(seed, mgf(maskedDb, hLen));60return new bn(Buffer.concat([new Buffer([0]), maskedSeed, maskedDb], k));61}62function pkcs1(key, msg, reverse){63var mLen = msg.length;64var k = key.modulus.byteLength();65if (mLen > k - 11) {66throw new Error('message too long');67}68var ps;69if (reverse) {70ps = new Buffer(k - mLen - 3);71ps.fill(0xff);72} else {73ps = nonZero(k - mLen - 3);74}75return new bn(Buffer.concat([new Buffer([0, reverse?1:2]), ps, new Buffer([0]), msg], k));76}77function nonZero(len, crypto) {78var out = new Buffer(len);79var i = 0;80var cache = randomBytes(len*2);81var cur = 0;82var num;83while (i < len) {84if (cur === cache.length) {85cache = randomBytes(len*2);86cur = 0;87}88num = cache[cur++];89if (num) {90out[i++] = num;91}92}93return out;94}9596