let b: number\r
const m: Float64Array = this.gf()\r
const t: Float64Array = this.gf()\r
- for (let i = 0; i < 16; i++) {\r
- t[i] = n[i]\r
- }\r
+ t.set(n.slice(0, 16), 0)\r
this.car25519(t)\r
this.car25519(t)\r
this.car25519(t)\r
}\r
\r
static M (o: Float64Array, a: Float64Array, b: Float64Array): void {\r
- let v, c, s = 1 << 16, t = new Array(31)\r
+ let v, c, s = 1 << 16\r
+ const t = new Array(31)\r
t.fill(0)\r
\r
// init t values\r
t[0] += 38 * (c - 1)\r
\r
// assign result to output\r
- for (let i = 0; i < 16; i++) {\r
- o[i] = t[i]\r
- }\r
+ o.set(t.slice(0, 16), 0)\r
}\r
\r
static S (o: Float64Array, a: Float64Array): void {\r
\r
static inv25519 (o: Float64Array, i: Float64Array): void {\r
const c: Float64Array = new Float64Array(16)\r
- for (let a = 0; a < 16; a++) {\r
- c[a] = i[a]\r
- }\r
+ c.set(i.slice(0, 16), 0)\r
for (let a = 253; a >= 0; a--) {\r
this.S(c, c)\r
- if (a !== 2 && a !== 4) this.M(c, c, i)\r
- }\r
- for (let a = 0; a < 16; a++) {\r
- o[a] = c[a]\r
+ if (a !== 2 && a !== 4) {\r
+ this.M(c, c, i)\r
+ }\r
}\r
+ o.set(c, 0)\r
}\r
\r
static pow2523 (o: Float64Array, i: Float64Array): void {\r
const c: Float64Array = this.gf()\r
- for (let a = 0; a < 16; a++) {\r
- c[a] = i[a]\r
- }\r
+ c.set(i.slice(0, 16), 0)\r
for (let a = 250; a >= 0; a--) {\r
this.S(c, c)\r
- if (a !== 1) this.M(c, c, i)\r
- }\r
- for (let a = 0; a < 16; a++) {\r
- o[a] = c[a]\r
- }\r
- }\r
-\r
- // Note: difference from TweetNaCl - BLAKE2b used to hash instead of SHA-512.\r
- static crypto_hash (out: Uint8Array, m: Uint8Array): number {\r
- const hash = new Blake2b(64).update(m).digest()\r
- for (let i = 0; i < 64; ++i) {\r
- out[i] = hash[i]\r
+ if (a !== 1) {\r
+ this.M(c, c, i)\r
+ }\r
}\r
- return 0\r
+ o.set(c, 0)\r
}\r
\r
static add (p: Float64Array[], q: Float64Array[]): void {\r
\r
static reduce (r: Uint8Array): void {\r
let x = new Float64Array(64)\r
- for (let i = 0; i < 64; i++) {\r
- x[i] = r[i]\r
- }\r
- for (let i = 0; i < 64; i++) {\r
- r[i] = 0\r
- }\r
+ x.set(r.slice(0, 64), 0)\r
+ r.fill(0, 0, 64)\r
this.modL(r, x)\r
}\r
\r
// Note: difference from C - smlen returned, not passed as argument.\r
static crypto_sign (sm: Uint8Array, m: Uint8Array, n: number, sk: Uint8Array, pk: Uint8Array): number {\r
- const x = new Float64Array(64)\r
const p: Float64Array[] = [this.gf(), this.gf(), this.gf(), this.gf()]\r
\r
const d = new Blake2b(64).update(sk).digest()\r
d[31] |= 64\r
\r
const smlen = n + 64\r
- for (let i = 0; i < n; i++) {\r
- sm[64 + i] = m[i]\r
- }\r
- for (let i = 0; i < 32; i++) {\r
- sm[32 + i] = d[32 + i]\r
- }\r
+ sm.set(m.subarray(0, n), 64)\r
+ sm.set(d.subarray(32, 64), 32)\r
\r
const r = new Blake2b(64).update(sm.subarray(32)).digest()\r
this.reduce(r)\r
this.scalarbase(p, r)\r
this.pack(sm, p)\r
\r
- for (let i = 0; i < 32; i++) {\r
- sm[i + 32] = pk[i]\r
- }\r
+ sm.set(pk, 32)\r
const h = new Blake2b(64).update(sm).digest()\r
this.reduce(h)\r
\r
- for (let i = 0; i < 64; i++) {\r
- x[i] = 0\r
- }\r
- for (let i = 0; i < 32; i++) {\r
- x[i] = r[i]\r
- }\r
+ const x = new Float64Array(64)\r
+ x.set(r.subarray(0, 32))\r
for (let i = 0; i < 32; i++) {\r
for (let j = 0; j < 32; j++) {\r
x[i + j] += h[i] * d[j]\r
\r
if (this.unpackneg(q, pk)) return -1\r
\r
- for (let i = 0; i < n; i++) {\r
- m[i] = sm[i]\r
- }\r
- for (let i = 0; i < 32; i++) {\r
- m[i + 32] = pk[i]\r
- }\r
+ m.set(sm.slice(0, n), 0)\r
+ m.set(pk.slice(0, 32), 32)\r
const h = new Blake2b(64).update(m).digest()\r
this.reduce(h)\r
this.scalarmult(p, q, h)\r
\r
n -= 64\r
if (this.crypto_verify_32(sm, 0, t, 0)) {\r
- for (let i = 0; i < n; i++) {\r
- m[i] = 0\r
- }\r
+ m.fill(0, 0, n)\r
return -1\r
}\r
-\r
- for (let i = 0; i < n; i++) {\r
- m[i] = sm[i + 64]\r
- }\r
+ m.set(sm.slice(64, n + 64), 0)\r
return n\r
}\r
\r
}\r
const sm = new Uint8Array(this.crypto_sign_BYTES + msg.length)\r
const m = new Uint8Array(this.crypto_sign_BYTES + msg.length)\r
- for (let i = 0; i < this.crypto_sign_BYTES; i++) {\r
- sm[i] = sig[i]\r
- }\r
- for (let i = 0; i < msg.length; i++) {\r
- sm[i + this.crypto_sign_BYTES] = msg[i]\r
- }\r
+ sm.set(sig, 0)\r
+ sm.set(msg, this.crypto_sign_BYTES)\r
return (this.crypto_sign_open(m, sm, sm.length, pub) >= 0)\r
} catch (err) {\r
throw new Error('Failed to sign and return signature', { cause: err })\r