diff options
Diffstat (limited to 'packages/taler-util/src/talerCrypto.test.ts')
-rw-r--r-- | packages/taler-util/src/talerCrypto.test.ts | 86 |
1 files changed, 84 insertions, 2 deletions
diff --git a/packages/taler-util/src/talerCrypto.test.ts b/packages/taler-util/src/talerCrypto.test.ts index 70ad8a614..5e8f37d80 100644 --- a/packages/taler-util/src/talerCrypto.test.ts +++ b/packages/taler-util/src/talerCrypto.test.ts @@ -34,6 +34,10 @@ import { scalarMultBase25519, deriveSecrets, calcRBlind, + Edx25519, + getRandomBytes, + bigintToNaclArr, + bigintFromNaclArr, } from "./talerCrypto.js"; import { sha512, kdf } from "./kdf.js"; import * as nacl from "./nacl-fast.js"; @@ -44,6 +48,7 @@ import { initNodePrng } from "./prng-node.js"; initNodePrng(); import bigint from "big-integer"; import { AssertionError } from "assert"; +import BigInteger from "big-integer"; test("encoding", (t) => { const s = "Hello, World"; @@ -343,9 +348,86 @@ test("taler CS blind c", async (t) => { }; const sig = await csUnblind(bseed, rPub, pub, b, blindsig); - t.deepEqual(sig.s, decodeCrock("F4ZKMFW3Q7DFN0N94KAMG2JFFHAC362T0QZ6ZCVZ73RS8P91CR70")); - t.deepEqual(sig.rPub, decodeCrock("CHK7JC4SXZ4Y9RDA3881S82F7BP99H35Q361WR6RBXN5YN2ZM1M0")); + t.deepEqual( + sig.s, + decodeCrock("F4ZKMFW3Q7DFN0N94KAMG2JFFHAC362T0QZ6ZCVZ73RS8P91CR70"), + ); + t.deepEqual( + sig.rPub, + decodeCrock("CHK7JC4SXZ4Y9RDA3881S82F7BP99H35Q361WR6RBXN5YN2ZM1M0"), + ); const res = await csVerify(decodeCrock(msg_hash), sig, pub); t.deepEqual(res, true); }); + +test("bigint/nacl conversion", async (t) => { + const b1 = BigInteger(42); + const n1 = bigintToNaclArr(b1, 32); + t.is(n1[0], 42); + t.is(n1.length, 32); + const b2 = bigintFromNaclArr(n1); + t.true(b1.eq(b2)); +}); + +test("taler age restriction crypto", async (t) => { + const priv1 = await Edx25519.keyCreate(); + const pub1 = await Edx25519.getPublic(priv1); + + const seed = encodeCrock(getRandomBytes(32)); + + const priv2 = await Edx25519.privateKeyDerive(priv1, seed); + const pub2 = await Edx25519.publicKeyDerive(pub1, seed); + + const pub2Ref = await Edx25519.getPublic(priv2); + + t.is(pub2, pub2Ref); +}); + +test("edx signing", async (t) => { + const priv1 = await Edx25519.keyCreate(); + const pub1 = await Edx25519.getPublic(priv1); + + const msg = stringToBytes("hello world"); + + const sig = nacl.crypto_edx25519_sign_detached( + msg, + decodeCrock(priv1), + decodeCrock(pub1), + ); + + t.true( + nacl.crypto_edx25519_sign_detached_verify(msg, sig, decodeCrock(pub1)), + ); + + sig[0]++; + + t.false( + nacl.crypto_edx25519_sign_detached_verify(msg, sig, decodeCrock(pub1)), + ); +}); + +test("edx test vector", async (t) => { + // Generated by gnunet-crypto-tvg + const tv = { + operation: "edx25519_derive", + priv1_edx: + "216KF1XM46K4JN8TX3Z8HNRX1DX4WRMX1BTCQM3KBS83PYKFY1GV6XRNBYRC5YM02HVDX8BDR20V7A27YX4MZJ8X8K0ADPZ43BD1GXG", + pub1_edx: "RKGRRG74SZ8PKF8SYG5SSDY8VRCYYGY5N2AKAJCG0103Z3JK6HTG", + seed: "EFK7CYT98YWGPNZNHPP84VJZDMXD5A41PP3E94NSAQZXRCAKVVXHAQNXG9XM2MAND2FJ56ZM238KGDCF3B0KCWNZCYKKHKDB56X6QA0", + priv2_edx: + "JRV3S06REHQV90E4HJA1FAMCVDBZZAZP9C6N2WF01MSR3CD5KM28QM7HTGGAV6MBJZ73QJ8PSZFA0D6YENJ7YT97344FDVVCGVAFNER", + pub2_edx: "ZB546ZC7ZP16DB99AMK67WNZ67WZFPWMRY67Y4PZR9YR1D82GVZ0", + }; + + { + const pub1Prime = await Edx25519.getPublic(tv.priv1_edx); + t.is(pub1Prime, tv.pub1_edx); + } + + const pub2Prime = await Edx25519.publicKeyDerive(tv.pub1_edx, tv.seed); + t.is(pub2Prime, tv.pub2_edx); + + const priv2Prime = await Edx25519.privateKeyDerive(tv.priv1_edx, tv.seed); + t.is(priv2Prime, tv.priv2_edx); +}); |