scalarmult: import curve methods; be standard
This commit is contained in:
parent
8aae7efea2
commit
67a4ba77cb
@ -1,3 +1,5 @@
|
|||||||
|
const { _9, _121665, gf, inv25519, pack25519, unpack25519, sel25519, A, M, Z, S } = require('./ed25519.js')
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
crypto_scalarmult,
|
crypto_scalarmult,
|
||||||
crypto_scalarmult_base,
|
crypto_scalarmult_base,
|
||||||
@ -5,60 +7,60 @@ module.exports = {
|
|||||||
crypto_scalarmult_SCALARBYTES
|
crypto_scalarmult_SCALARBYTES
|
||||||
}
|
}
|
||||||
|
|
||||||
function crypto_scalarmult(q, n, p) {
|
function crypto_scalarmult (q, n, p) {
|
||||||
check(q, crypto_scalarmult_BYTES)
|
check(q, crypto_scalarmult_BYTES)
|
||||||
check(n, crypto_scalarmult_SCALARBYTES)
|
check(n, crypto_scalarmult_SCALARBYTES)
|
||||||
check(p, crypto_scalarmult_BYTES)
|
check(p, crypto_scalarmult_BYTES)
|
||||||
var z = new Uint8Array(32);
|
var z = new Uint8Array(32)
|
||||||
var x = new Float64Array(80), r, i;
|
var x = new Float64Array(80), r, i
|
||||||
var a = gf(), b = gf(), c = gf(),
|
var a = gf(), b = gf(), c = gf(),
|
||||||
d = gf(), e = gf(), f = gf();
|
d = gf(), e = gf(), f = gf()
|
||||||
for (i = 0; i < 31; i++) z[i] = n[i];
|
for (i = 0; i < 31; i++) z[i] = n[i]
|
||||||
z[31]=(n[31]&127)|64;
|
z[31] = (n[31] & 127) | 64
|
||||||
z[0]&=248;
|
z[0] &= 248
|
||||||
unpack25519(x,p);
|
unpack25519(x, p)
|
||||||
for (i = 0; i < 16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
b[i]=x[i];
|
b[i] = x[i]
|
||||||
d[i]=a[i]=c[i]=0;
|
d[i] = a[i] = c[i] = 0
|
||||||
}
|
}
|
||||||
a[0]=d[0]=1;
|
a[0] = d[0] = 1
|
||||||
for (i=254; i>=0; --i) {
|
for (i = 254; i >= 0; --i) {
|
||||||
r=(z[i>>>3]>>>(i&7))&1;
|
r = (z[i >>> 3] >>> (i & 7)) & 1
|
||||||
sel25519(a,b,r);
|
sel25519(a, b, r)
|
||||||
sel25519(c,d,r);
|
sel25519(c, d, r)
|
||||||
A(e,a,c);
|
A(e, a, c)
|
||||||
Z(a,a,c);
|
Z(a, a, c)
|
||||||
A(c,b,d);
|
A(c, b, d)
|
||||||
Z(b,b,d);
|
Z(b, b, d)
|
||||||
S(d,e);
|
S(d, e)
|
||||||
S(f,a);
|
S(f, a)
|
||||||
M(a,c,a);
|
M(a, c, a)
|
||||||
M(c,b,e);
|
M(c, b, e)
|
||||||
A(e,a,c);
|
A(e, a, c)
|
||||||
Z(a,a,c);
|
Z(a, a, c)
|
||||||
S(b,a);
|
S(b, a)
|
||||||
Z(c,d,f);
|
Z(c, d, f)
|
||||||
M(a,c,_121665);
|
M(a, c, _121665)
|
||||||
A(a,a,d);
|
A(a, a, d)
|
||||||
M(c,c,a);
|
M(c, c, a)
|
||||||
M(a,d,f);
|
M(a, d, f)
|
||||||
M(d,b,x);
|
M(d, b, x)
|
||||||
S(b,e);
|
S(b, e)
|
||||||
sel25519(a,b,r);
|
sel25519(a, b, r)
|
||||||
sel25519(c,d,r);
|
sel25519(c, d, r)
|
||||||
}
|
}
|
||||||
for (i = 0; i < 16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
x[i+16]=a[i];
|
x[i + 16] = a[i]
|
||||||
x[i+32]=c[i];
|
x[i + 32] = c[i]
|
||||||
x[i+48]=b[i];
|
x[i + 48] = b[i]
|
||||||
x[i+64]=d[i];
|
x[i + 64] = d[i]
|
||||||
}
|
}
|
||||||
var x32 = x.subarray(32);
|
var x32 = x.subarray(32)
|
||||||
var x16 = x.subarray(16);
|
var x16 = x.subarray(16)
|
||||||
inv25519(x32,x32);
|
inv25519(x32, x32)
|
||||||
M(x16,x16,x32);
|
M(x16, x16, x32)
|
||||||
pack25519(q,x16);
|
pack25519(q, x16)
|
||||||
return 0;
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
@ -68,15 +70,14 @@ module.exports = {
|
|||||||
crypto_scalarmult_SCALARBYTES
|
crypto_scalarmult_SCALARBYTES
|
||||||
}
|
}
|
||||||
|
|
||||||
function crypto_scalarmult_base(q, n) {
|
function crypto_scalarmult_base (q, n) {
|
||||||
return crypto_scalarmult(q, n, _9);
|
return crypto_scalarmult(q, n, _9)
|
||||||
}
|
}
|
||||||
|
|
||||||
function check (buf, len) {
|
function check (buf, len) {
|
||||||
if (!buf || (len && buf.length < len)) throw new Error('Argument must be a buffer' + (len ? ' of length ' + len : ''))
|
if (!buf || (len && buf.length < len)) throw new Error('Argument must be a buffer' + (len ? ' of length ' + len : ''))
|
||||||
}
|
}
|
||||||
|
var crypto_scalarmult_BYTES = 32
|
||||||
var crypto_scalarmult_BYTES,
|
var crypto_scalarmult_SCALARBYTES = 32
|
||||||
crypto_scalarmult_SCALARBYTES = 32,
|
var crypto_scalarmult_BYTES = 32
|
||||||
crypto_scalarmult_BYTES,
|
var crypto_scalarmult_SCALARBYTES = 32
|
||||||
crypto_scalarmult_SCALARBYTES = 32
|
|
||||||
|
Loading…
Reference in New Issue
Block a user