Last active
March 22, 2020 12:59
-
-
Save MaxGraey/bdae69755ae58c48c4172fdd35850d0a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// tslint:disable-next-line:no-reference | |
/// <reference path="../node_modules/assemblyscript/index.d.ts" /> | |
@sealed @unmanaged | |
class Ge { | |
x: Int64Array; | |
y: Int64Array; | |
z: Int64Array; | |
t: Int64Array; | |
@inline constructor() { | |
this.x = new Int64Array(16); | |
this.y = new Int64Array(16); | |
this.z = new Int64Array(16); | |
this.t = new Int64Array(16); | |
} | |
} | |
@inline function fe25519Cmov(p: Int64Array, q: Int64Array, b: i64): void { | |
let mask = ~(b - 1); | |
unchecked(p[0] ^= (p[0] ^ q[0]) & mask); | |
unchecked(p[1] ^= (p[1] ^ q[1]) & mask); | |
unchecked(p[2] ^= (p[2] ^ q[2]) & mask); | |
unchecked(p[3] ^= (p[3] ^ q[3]) & mask); | |
unchecked(p[4] ^= (p[4] ^ q[4]) & mask); | |
unchecked(p[5] ^= (p[5] ^ q[5]) & mask); | |
unchecked(p[6] ^= (p[6] ^ q[6]) & mask); | |
unchecked(p[7] ^= (p[7] ^ q[7]) & mask); | |
unchecked(p[8] ^= (p[8] ^ q[8]) & mask); | |
unchecked(p[9] ^= (p[9] ^ q[9]) & mask); | |
unchecked(p[10] ^= (p[10] ^ q[10]) & mask); | |
unchecked(p[11] ^= (p[11] ^ q[11]) & mask); | |
unchecked(p[12] ^= (p[12] ^ q[12]) & mask); | |
unchecked(p[13] ^= (p[13] ^ q[13]) & mask); | |
unchecked(p[14] ^= (p[14] ^ q[14]) & mask); | |
unchecked(p[15] ^= (p[15] ^ q[15]) & mask); | |
} | |
// @inline // -- comment out this @inline attr will cause to exponential compilation time | |
function cmov(p: Ge, q: Ge, b: i64): void { | |
fe25519Cmov(p.x, q.x, b); | |
fe25519Cmov(p.y, q.y, b); | |
fe25519Cmov(p.z, q.z, b); | |
fe25519Cmov(p.t, q.t, b); | |
} | |
export function scalarmult(p: Ge, s: Uint8Array, q: Ge): void { | |
let pc = [ | |
new Ge(), new Ge(), | |
new Ge(), new Ge(), | |
new Ge(), new Ge(), | |
new Ge(), new Ge(), | |
new Ge(), new Ge(), | |
new Ge(), new Ge(), | |
new Ge(), new Ge(), | |
new Ge(), new Ge() | |
]; | |
let t = new Ge(); | |
for (let i = 252; i >= 0; i -= 4) { | |
cmov(t, unchecked(pc[15]), i & 1); | |
cmov(t, unchecked(pc[14]), i & 1); | |
cmov(t, unchecked(pc[13]), i & 1); | |
cmov(t, unchecked(pc[12]), i & 1); | |
cmov(t, unchecked(pc[11]), i & 1); | |
cmov(t, unchecked(pc[10]), i & 1); | |
cmov(t, unchecked(pc[9]), i & 1); | |
cmov(t, unchecked(pc[8]), i & 1); | |
cmov(t, unchecked(pc[7]), i & 1); | |
cmov(t, unchecked(pc[6]), i & 1); | |
cmov(t, unchecked(pc[5]), i & 1); | |
cmov(t, unchecked(pc[4]), i & 1); | |
cmov(t, unchecked(pc[3]), i & 1); | |
cmov(t, unchecked(pc[2]), i & 1); | |
cmov(t, unchecked(pc[1]), i & 1); | |
cmov(t, unchecked(pc[0]), i & 1); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment