kbpgp
Version:
Keybase's PGP Implementation
576 lines (530 loc) • 17.3 kB
JavaScript
// Generated by IcedCoffeeScript 108.0.11
(function() {
var ASP, Avg, BigInteger, MRF, PrimeFinder, SRF, Timer, fermat2_test, fta, iced, make_esc, miller_rabin, naive_is_prime, native_rng, nbi, nbs, nbv, prime_search, prng, quickmod, random_prime, small_primes, _MR_inner, _MR_small_check, __iced_k, __iced_k_noop, _ref, _ref1;
iced = require('iced-runtime');
__iced_k = __iced_k_noop = function() {};
_ref = require('bn'), nbv = _ref.nbv, nbi = _ref.nbi, BigInteger = _ref.BigInteger;
prng = require('triplesec').prng;
native_rng = prng.native_rng;
small_primes = require('./primes').small_primes;
make_esc = require('iced-error').make_esc;
ASP = require('./util').ASP;
nbs = require('./bn').nbs;
_ref1 = require('./rand'), MRF = _ref1.MRF, SRF = _ref1.SRF;
Timer = (function() {
function Timer() {
this.start = Date.now();
}
Timer.prototype.stop = function() {
return Date.now() - this.start;
};
return Timer;
})();
Avg = (function() {
function Avg() {
this.tot = 0;
this.n = 0;
}
Avg.prototype.start = function() {
return this._t = Date.now();
};
Avg.prototype.stop = function() {
var s;
s = Date.now() - this._t;
console.log("ran in " + s);
this.tot += s;
return this.n++;
};
Avg.prototype.avg = function() {
return this.tot / this.n;
};
return Avg;
})();
quickmod = function(p, d) {
return p.modInt(d);
};
fta = new Avg();
fermat2_test = function(n) {
var Bl, bl, i, ret, t, _i;
t = nbv(1);
bl = n.bitLength();
bl--;
Bl = n.byteLength();
for (i = _i = bl; bl <= 0 ? _i <= 0 : _i >= 0; i = bl <= 0 ? ++_i : --_i) {
t = t.square();
if (t.byteLength() > Bl) {
t = t.mod(n);
}
if (n.testBit(i)) {
t = t.shiftLeft(1);
}
}
if (t.compareTo(n) > 0) {
t = t.mod(n);
}
ret = t.compareTo(nbv(2)) === 0;
return ret;
};
_MR_inner = function(_arg) {
var a, j, p, p1, r, s, y, _i, _ref2;
s = _arg.s, r = _arg.r, p = _arg.p, p1 = _arg.p1;
a = MRF().random_zn(p);
y = a.modPow(r, p);
if (y.compareTo(BigInteger.ONE) !== 0) {
for (j = _i = _ref2 = s - 1; _ref2 <= 0 ? _i <= 0 : _i >= 0; j = _ref2 <= 0 ? ++_i : --_i) {
if (!(y.compareTo(p1) !== 0)) {
continue;
}
if (j === 0) {
return false;
}
y = y.square().mod(p);
if (y.compareTo(BigInteger.ONE) === 0) {
return false;
}
}
}
return true;
};
_MR_small_check = function(_arg) {
var p, _ref2;
p = _arg.p;
if (p.compareTo(BigInteger.ZERO) <= 0) {
return false;
} else if (p.compareTo(nbv(7)) <= 0) {
return (_ref2 = p.intValue()) === 2 || _ref2 === 3 || _ref2 === 5 || _ref2 === 7;
} else if (!p.testBit(0)) {
return false;
} else {
return true;
}
};
miller_rabin = function(_arg, cb) {
var asp, esc, i, iter, p, p1, r, ret, s, ___iced_passed_deferral, __iced_deferrals, __iced_k;
__iced_k = __iced_k_noop;
___iced_passed_deferral = iced.findDeferral(arguments);
p = _arg.p, iter = _arg.iter, asp = _arg.asp;
asp || (asp = new ASP({}));
iter || (iter = 10);
esc = make_esc(cb, "miller_rabin");
ret = _MR_small_check({
p: p
});
(function(_this) {
return (function(__iced_k) {
if (ret) {
p1 = p.subtract(BigInteger.ONE);
s = p1.getLowestSetBit();
r = p1.shiftRight(s);
ret = true;
(function(__iced_k) {
var _begin, _end, _i, _positive, _results, _step, _while;
i = 0;
_begin = 0;
_end = iter;
if (_end > _begin) {
_step = 1;
} else {
_step = -1;
}
_positive = _end > _begin;
_while = function(__iced_k) {
var _break, _continue, _next;
_break = __iced_k;
_continue = function() {
return iced.trampoline(function() {
i += _step;
return _while(__iced_k);
});
};
_next = _continue;
if (!!((_positive === true && i >= iter) || (_positive === false && i <= iter))) {
return _break();
} else {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/primegen.iced"
});
asp.progress({
what: "mr",
i: i,
total: iter,
p: p
}, esc(__iced_deferrals.defer({
lineno: 122
})));
__iced_deferrals._fulfill();
})(function() {
(function(__iced_k) {
if (!_MR_inner({
s: s,
r: r,
p: p,
p1: p1
})) {
ret = false;
(function(__iced_k) {
_break()
})(__iced_k);
} else {
return __iced_k();
}
})(_next);
});
}
};
_while(__iced_k);
})(function() {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/primegen.iced"
});
asp.progress({
what: "mr",
i: iter,
total: iter,
p: p
}, esc(__iced_deferrals.defer({
lineno: 127
})));
__iced_deferrals._fulfill();
})(__iced_k);
});
} else {
return __iced_k();
}
});
})(this)((function(_this) {
return function() {
return cb(null, ret);
};
})(this));
};
PrimeFinder = (function() {
function PrimeFinder(p, sieve) {
this.p = p;
this.sieve = sieve;
this.inc = 0;
this.maxinc = -1;
this.sievepos = quickmod(this.p, this.sieve.length);
this.calcmods();
}
PrimeFinder.prototype.getp = function() {
return this.p;
};
PrimeFinder.prototype.setmax = function(i) {
if (this.maxinc !== -1) {
throw new Error("can only setmax() once");
}
return this.maxinc = i;
};
PrimeFinder.prototype.calcmods = function() {
var sp;
this.p = this.p.add(nbv(this.inc));
if (this.maxinc !== -1) {
this.maxinc -= this.inc;
}
this.inc = 0;
return this.mods = (function() {
var _i, _len, _results;
_results = [];
for (_i = 0, _len = small_primes.length; _i < _len; _i++) {
sp = small_primes[_i];
_results.push(quickmod(this.p, sp));
}
return _results;
}).call(this);
};
PrimeFinder.prototype.decrement_mods_find_divisor = function() {
var i, sp, _i, _len;
for (i = _i = 0, _len = small_primes.length; _i < _len; i = ++_i) {
sp = small_primes[i];
while (this.mods[i] + this.inc >= sp) {
this.mods[i] -= sp;
if ((this.mods[i] + this.inc) === 0) {
return true;
}
}
}
return false;
};
PrimeFinder.prototype.next_weak = function() {
var step;
while (true) {
step = this.sieve[this.sievepos];
this.sievepos = (this.sievepos + step) % this.sieve.length;
this.inc += step;
if (this.inc > this.maxinc && this.maxinc > 0) {
this.tmp = nbv(0);
return this.tmp;
}
if (this.inc < 0) {
this.calcmods();
}
if (!this.decrement_mods_find_divisor()) {
this.tmp = this.p.add(nbv(this.inc));
return this.tmp;
}
}
};
PrimeFinder.prototype.next_fermat = function() {
while (true) {
this.next_weak();
if (!this.tmp || fermat2_test(this.tmp)) {
return this.tmp;
}
}
};
PrimeFinder.prototype.next_strong = function(iter) {
if (iter == null) {
iter = 32;
}
while (true) {
this.next_weak();
if (!this.tmp || (fermat2_test(this.tmp) && probab_prime(this.tmp, iter))) {
return this.tmp;
}
}
};
return PrimeFinder;
})();
prime_search = function(_arg, cb) {
var asp, esc, i, is_prime, iters, p, pf, pp, pvec, range, ret, sieve, start, tmp, ___iced_passed_deferral, __iced_deferrals, __iced_k;
__iced_k = __iced_k_noop;
___iced_passed_deferral = iced.findDeferral(arguments);
start = _arg.start, range = _arg.range, sieve = _arg.sieve, asp = _arg.asp, iters = _arg.iters;
iters || (iters = 20);
pf = new PrimeFinder(start, sieve);
pf.setmax(range);
pvec = ((function() {
var _results;
_results = [];
while ((pp = pf.next_weak()).compareTo(BigInteger.ZERO) > 0) {
_results.push(pp);
}
return _results;
})());
esc = make_esc(cb, "prime_search");
ret = null;
(function(_this) {
return (function(__iced_k) {
var _while;
_while = function(__iced_k) {
var _break, _continue, _next;
_break = __iced_k;
_continue = function() {
return iced.trampoline(function() {
return _while(__iced_k);
});
};
_next = _continue;
if (!(pvec.length && (ret == null))) {
return _break();
} else {
i = MRF().random_word() % pvec.length;
p = pvec[i];
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/primegen.iced"
});
asp.progress({
what: "fermat",
p: p
}, esc(__iced_deferrals.defer({
lineno: 226
})));
__iced_deferrals._fulfill();
})(function() {
(function(__iced_k) {
if (!fermat2_test(p)) {
return __iced_k();
} else {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/primegen.iced"
});
miller_rabin({
p: p,
iters: iters,
asp: asp
}, esc(__iced_deferrals.defer({
assign_fn: (function() {
return function() {
return is_prime = arguments[0];
};
})(),
lineno: 229
})));
__iced_deferrals._fulfill();
})(function() {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/primegen.iced"
});
asp.progress({
what: "passed_mr",
p: p
}, esc(__iced_deferrals.defer({
lineno: 230
})));
__iced_deferrals._fulfill();
})(function() {
return __iced_k(is_prime ? ret = p : asp.progress({
what: "failed_mr",
p: p
}));
});
});
}
})(function() {
tmp = pvec.pop();
return _next(i < pvec.length ? pvec[i] = tmp : void 0);
});
});
}
};
_while(__iced_k);
});
})(this)((function(_this) {
return function() {
if (ret == null) {
ret = nbv(0);
}
return cb(null, ret);
};
})(this));
};
random_prime = function(_arg, cb) {
var asp, e, esc, go, iters, nbits, p, range, sieve, ___iced_passed_deferral, __iced_deferrals, __iced_k;
__iced_k = __iced_k_noop;
___iced_passed_deferral = iced.findDeferral(arguments);
nbits = _arg.nbits, iters = _arg.iters, asp = _arg.asp, e = _arg.e;
sieve = [1, 2];
go = true;
esc = make_esc(cb, "random_prime");
range = nbits;
p = null;
(function(_this) {
return (function(__iced_k) {
var _while;
_while = function(__iced_k) {
var _break, _continue, _next;
_break = __iced_k;
_continue = function() {
return iced.trampoline(function() {
return _while(__iced_k);
});
};
_next = _continue;
if (!go) {
return _break();
} else {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/primegen.iced"
});
SRF().random_nbit(nbits, __iced_deferrals.defer({
assign_fn: (function() {
return function() {
return p = arguments[0];
};
})(),
lineno: 262
}));
__iced_deferrals._fulfill();
})(function() {
p = p.setBit(0).setBit(nbits - 1).setBit(nbits - 2);
(function(__iced_k) {
if ((e == null) || p.subtract(BigInteger.ONE).gcd(e).compareTo(BigInteger.ONE) === 0) {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/primegen.iced"
});
asp.progress({
what: "guess",
p: p
}, esc(__iced_deferrals.defer({
lineno: 265
})));
__iced_deferrals._fulfill();
})(function() {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/primegen.iced"
});
prime_search({
start: p,
range: range,
sieve: sieve,
asp: asp,
iters: iters
}, esc(__iced_deferrals.defer({
assign_fn: (function() {
return function() {
return p = arguments[0];
};
})(),
lineno: 266
})));
__iced_deferrals._fulfill();
})(function() {
return __iced_k(go = (p == null) || (p.compareTo(BigInteger.ZERO) === 0));
});
});
} else {
return __iced_k();
}
})(_next);
});
}
};
_while(__iced_k);
});
})(this)((function(_this) {
return function() {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/primegen.iced"
});
asp.progress({
what: "found",
p: p
}, esc(__iced_deferrals.defer({
lineno: 269
})));
__iced_deferrals._fulfill();
})(function() {
return cb(null, p);
});
};
})(this));
};
exports.naive_is_prime = naive_is_prime = function(n) {
var biggest, p, _i, _len;
biggest = Math.floor(Math.sqrt(n));
for (_i = 0, _len = small_primes.length; _i < _len; _i++) {
p = small_primes[_i];
if (p > biggest) {
return true;
}
if ((n % p) === 0) {
return false;
}
}
return false;
};
exports.fermat2_test = fermat2_test;
exports.nbs = nbs;
exports.small_primes = small_primes;
exports.miller_rabin = miller_rabin;
exports.random_prime = random_prime;
}).call(this);