forked from browserify/browserify-rsa
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
35 lines (31 loc) · 1.06 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var BN = require('bn.js')
var randomBytes = require('randombytes')
function blind (priv) {
var r = getr(priv)
var blinder = r.toRed(BN.mont(priv.modulus)).redPow(new BN(priv.publicExponent)).fromRed()
return { blinder: blinder, unblinder: r.invm(priv.modulus) }
}
function getr (priv) {
var len = priv.modulus.byteLength()
var r
do {
r = new BN(randomBytes(len))
} while (r.cmp(priv.modulus) >= 0 || !r.umod(priv.prime1) || !r.umod(priv.prime2))
return r
}
function crt (msg, priv) {
var blinds = blind(priv)
var len = priv.modulus.byteLength()
var blinded = new BN(msg).mul(blinds.blinder).umod(priv.modulus)
var c1 = blinded.toRed(BN.mont(priv.prime1))
var c2 = blinded.toRed(BN.mont(priv.prime2))
var qinv = priv.coefficient
var p = priv.prime1
var q = priv.prime2
var m1 = c1.redPow(priv.exponent1).fromRed()
var m2 = c2.redPow(priv.exponent2).fromRed()
var h = m1.isub(m2).imul(qinv).umod(p).imul(q)
return m2.iadd(h).imul(blinds.unblinder).umod(priv.modulus).toArrayLike(Buffer, 'be', len)
}
crt.getr = getr
module.exports = crt