UNPKG

@coolwallet/sol

Version:
63 lines (53 loc) 1.81 kB
/* eslint-disable */ import nacl from 'tweetnacl'; // @ts-ignore let naclLowLevel = nacl.lowlevel; function neq25519(a: any, b: any) { var c = new Uint8Array(32), d = new Uint8Array(32); naclLowLevel.pack25519(c, a); naclLowLevel.pack25519(d, b); return naclLowLevel.crypto_verify_32(c, 0, d, 0); } // Check that a pubkey is on the curve. // This function and its dependents were sourced from: // https://github.com/dchest/tweetnacl-js/blob/f1ec050ceae0861f34280e62498b1d3ed9c350c6/nacl.js#L792 function is_on_curve(p: any) { var r = [naclLowLevel.gf(), naclLowLevel.gf(), naclLowLevel.gf(), naclLowLevel.gf()]; var t = naclLowLevel.gf(), chk = naclLowLevel.gf(), num = naclLowLevel.gf(), den = naclLowLevel.gf(), den2 = naclLowLevel.gf(), den4 = naclLowLevel.gf(), den6 = naclLowLevel.gf(); naclLowLevel.set25519(r[2], gf1); naclLowLevel.unpack25519(r[1], p); naclLowLevel.S(num, r[1]); naclLowLevel.M(den, num, naclLowLevel.D); naclLowLevel.Z(num, num, r[2]); naclLowLevel.A(den, r[2], den); naclLowLevel.S(den2, den); naclLowLevel.S(den4, den2); naclLowLevel.M(den6, den4, den2); naclLowLevel.M(t, den6, num); naclLowLevel.M(t, t, den); naclLowLevel.pow2523(t, t); naclLowLevel.M(t, t, num); naclLowLevel.M(t, t, den); naclLowLevel.M(t, t, den); naclLowLevel.M(r[0], t, den); naclLowLevel.S(chk, r[0]); naclLowLevel.M(chk, chk, den); if (neq25519(chk, num)) naclLowLevel.M(r[0], r[0], I); naclLowLevel.S(chk, r[0]); naclLowLevel.M(chk, chk, den); if (neq25519(chk, num)) return 0; return 1; } let gf1 = naclLowLevel.gf([1]); let I = naclLowLevel.gf([ 0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83, ]); export { is_on_curve };