mirror of
https://github.com/Instadapp/Swap-Aggregator-Subgraph.git
synced 2024-07-29 21:57:12 +00:00
53 lines
899 B
JavaScript
53 lines
899 B
JavaScript
var asn = require('asn1.js')
|
|
var crypto = require('crypto')
|
|
var BN = asn.bignum
|
|
|
|
var zero = new BN(0)
|
|
var one = new BN(1)
|
|
var two = new BN(2)
|
|
|
|
function rand(low, high) {
|
|
do {
|
|
var b = new BN(crypto.randomBytes(high.byteLength()))
|
|
} while(b.cmp(low) <= 0 || b.cmp(high) >= 0)
|
|
return b
|
|
}
|
|
|
|
function odd(n) {
|
|
if (n.cmp(zero) === 0) { return zero }
|
|
var r = n
|
|
while (r.isEven()) {
|
|
r = r.div(two)
|
|
}
|
|
return r
|
|
}
|
|
|
|
function rootOne(x, r, n) {
|
|
var i = x.toRed(BN.red(n)).redPow(r).fromRed()
|
|
var o = zero
|
|
while (i.cmp(one) !== 0) {
|
|
o = i
|
|
i = i.mul(i).mod(n)
|
|
}
|
|
if (o.cmp(n.sub(one)) === 0) {
|
|
return zero
|
|
}
|
|
return o
|
|
}
|
|
|
|
function factor(e, d, n) {
|
|
var k = e.mul(d).sub(one)
|
|
var r = odd(k)
|
|
do {
|
|
var y = rootOne(rand(two, n), r, n)
|
|
} while (y.cmp(zero) === 0)
|
|
|
|
var p = y.sub(one).gcd(n)
|
|
return {
|
|
p: p,
|
|
q: n.div(p)
|
|
}
|
|
}
|
|
|
|
module.exports = factor
|