UNPKG

blocktrail-sdk

Version:

BlockTrail's Developer Friendly API binding for NodeJS

64 lines (49 loc) 1.65 kB
/** * Generate RSA key pair * * @param bitlen desired modulus length, default is 2048 * @param e public exponent, default is 65537 */ function RSA_generateKey ( bitlen, e ) { bitlen = bitlen || 2048; e = e || 65537; if ( bitlen < 512 ) throw new IllegalArgumentError("bit length is too small"); if ( is_string(e) ) e = string_to_bytes(e); if ( is_buffer(e) ) e = new Uint8Array(e); if ( is_bytes(e) || is_number(e) || is_big_number(e) ) { e = new BigNumber(e); } else { throw new TypeError("unexpected exponent type"); } if ( ( e.limbs[0] & 1 ) === 0 ) throw new IllegalArgumentError("exponent must be an odd number"); var m, e, d, p, q, p1, q1, dp, dq, u; p = BigNumber_randomProbablePrime( bitlen >> 1, function ( p ) { p1 = new BigNumber(p); p1.limbs[0] -= 1; return BigNumber_extGCD( p1, e ).gcd.valueOf() == 1; } ); q = BigNumber_randomProbablePrime( bitlen - (bitlen >> 1), function ( q ) { m = new Modulus( p.multiply(q) ); if ( !( m.limbs[ ( (bitlen + 31) >> 5 ) - 1 ] >>> ( (bitlen - 1) & 31) ) ) return false; q1 = new BigNumber(q); q1.limbs[0] -= 1; return BigNumber_extGCD( q1, e ).gcd.valueOf() == 1; } ); d = new Modulus( p1.multiply(q1) ).inverse(e); dp = d.divide(p1).remainder, dq = d.divide(q1).remainder; p = new Modulus(p), q = new Modulus(q); var u = p.inverse(q); return [ m, e, d, p, q, dp, dq, u ]; } RSA.generateKey = RSA_generateKey;