Skip to content

Instantly share code, notes, and snippets.

@MaxGraey
Last active March 22, 2020 12:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MaxGraey/bdae69755ae58c48c4172fdd35850d0a to your computer and use it in GitHub Desktop.
Save MaxGraey/bdae69755ae58c48c4172fdd35850d0a to your computer and use it in GitHub Desktop.
// 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