PHP WebShell

Текущая директория: /opt/BitGoJS/node_modules/@bitcoinerlab/secp256k1/test

Просмотр файла: schnorr.js

import test from "tape";
import { fromHex, toHex } from "./util.js";
import fschnorr from "./fixtures/schnorr.json";

export function parseBip340Vector(f) {
  return {
    ...(f.d ? { d: fromHex(f.d), e: fromHex(f.e) } : {}),
    ...(f.exception ? { exception: f.exception } : { v: f.v }),
    Q: fromHex(f.Q),
    m: fromHex(f.m),
    s: fromHex(f.s),
    comment: f.comment,
  };
}

export function parseTweakAddVector(f) {
  return {
    pubkey: fromHex(f.pubkey),
    tweak: fromHex(f.tweak),
    parity: f.parity,
    result: f.result ? fromHex(f.result) : f.result,
  };
}

export default function (secp256k1) {
  const rand = () => Math.floor(Math.random() * 254) + 1; // [1..254];
  const randPubKey = () =>
    secp256k1.xOnlyPointFromScalar(new Uint8Array(32).fill(rand()));

  test("sign schnorr", (t) => {
    for (const fHex of fschnorr.bip340testvectors) {
      if (fHex.d) {
        const f = parseBip340Vector(fHex);
        t.same(
          secp256k1.signSchnorr(f.m, f.d, f.e),
          f.s,
          `signSchnorr(${fHex.m}, ...) == ${fHex.s}`
        );
      }
    }

    t.end();
  });

  test("verify schnorr", (t) => {
    for (const fHex of fschnorr.bip340testvectors) {
      const f = parseBip340Vector(fHex);
      if (f.exception) {
        t.throws(
          () => {
            secp256k1.verifySchnorr(f.m, f.Q, f.s);
          },
          new RegExp(f.exception),
          `${f.comment} throws ${f.exception}`
        );
      } else {
        const resultVerify = secp256k1.verifySchnorr(f.m, f.Q, f.s);
        t.same(resultVerify, f.v, `verifySchnorr(${fHex.m}, ...) == ${fHex.v}`);
      }
    }

    t.end();
  });

  test("scalar to xOnlyPubkey", (t) => {
    for (const fHex of fschnorr.bip340testvectors) {
      if (fHex.d) {
        const f = parseBip340Vector(fHex);
        t.same(
          secp256k1.xOnlyPointFromScalar(f.d),
          f.Q,
          `xOnlyPointFromScalar(${fHex.d}) == ${fHex.Q}`
        );
      }
    }

    t.end();
  });

  test("pubkey to xOnlyPubkey", (t) => {
    for (const fHex of fschnorr.bip340testvectors) {
      if (fHex.d) {
        const f = parseBip340Vector(fHex);
        const pubkey1 = secp256k1.pointFromScalar(f.d, true);
        const pubkey2 = secp256k1.pointFromScalar(f.d, false);
        t.same(
          secp256k1.xOnlyPointFromPoint(pubkey1),
          f.Q,
          `xOnlyPointFromPoint(${toHex(pubkey1)}) == ${fHex.Q}`
        );
        t.same(
          secp256k1.xOnlyPointFromPoint(pubkey2),
          f.Q,
          `xOnlyPointFromPoint(${toHex(pubkey2)}) == ${fHex.Q}`
        );
      }
    }

    t.end();
  });

  test("xonly pubkey tweak add schnorr", (t) => {
    for (const fHex of fschnorr.tweakaddvectors) {
      const f = parseTweakAddVector(fHex);
      const res = secp256k1.xOnlyPointAddTweak(f.pubkey, f.tweak);
      if (f.result === null) {
        t.same(
          res,
          f.result,
          `xOnlyPointAddTweak returns null when G pubkey and n - 1 tweak used`
        );
        continue;
      }
      const { parity, xOnlyPubkey: result } = res;
      t.same(
        result,
        f.result,
        `xOnlyPointAddTweak(${fHex.pubkey},${fHex.tweak}) == ${fHex.result} result`
      );
      t.same(
        parity,
        f.parity,
        `xOnlyPointAddTweak(${fHex.pubkey},${fHex.tweak}) == ${fHex.parity} parity`
      );
      //      // test check method
      //      t.ok(
      //        secp256k1.xOnlyPointAddTweakCheck(
      //          f.pubkey,
      //          f.tweak,
      //          f.result,
      //          f.parity
      //        ),
      //        `xOnlyPointAddTweakCheck(${fHex.pubkey},${fHex.tweak},${fHex.result},${fHex.parity}) == true`
      //      );
      //      t.ok(
      //        secp256k1.xOnlyPointAddTweakCheck(f.pubkey, f.tweak, f.result),
      //        `xOnlyPointAddTweakCheck(${fHex.pubkey},${fHex.tweak},${fHex.result}) == true`
      //      );
      //      const dummyKey = randPubKey();
      //      t.notOk(
      //        secp256k1.xOnlyPointAddTweakCheck(
      //          f.pubkey,
      //          f.tweak,
      //          dummyKey,
      //          f.parity
      //        ),
      //        `xOnlyPointAddTweakCheck(${fHex.pubkey},${fHex.tweak},${toHex(
      //          dummyKey
      //        )},${fHex.parity}) == false`
      //      );
      //      t.notOk(
      //        secp256k1.xOnlyPointAddTweakCheck(f.pubkey, f.tweak, dummyKey),
      //        `xOnlyPointAddTweakCheck(${fHex.pubkey},${fHex.tweak},${toHex(
      //          dummyKey
      //        )}) == false`
      //      );
    }

    t.end();
  });
}

Выполнить команду


Для локальной разработки. Не используйте в интернете!