| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 | /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */import { AffinePoint, BasicCurve, Group, GroupConstructor } from './curve.js';import * as mod from './modular.js';import { CHash, Hex, PrivKey } from './utils.js';export type { AffinePoint };type HmacFnSync = (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array;type EndomorphismOpts = {    beta: bigint;    splitScalar: (k: bigint) => {        k1neg: boolean;        k1: bigint;        k2neg: boolean;        k2: bigint;    };};export type BasicWCurve<T> = BasicCurve<T> & {    a: T;    b: T;    allowedPrivateKeyLengths?: readonly number[];    wrapPrivateKey?: boolean;    endo?: EndomorphismOpts;    isTorsionFree?: (c: ProjConstructor<T>, point: ProjPointType<T>) => boolean;    clearCofactor?: (c: ProjConstructor<T>, point: ProjPointType<T>) => ProjPointType<T>;};type Entropy = Hex | boolean;export type SignOpts = {    lowS?: boolean;    extraEntropy?: Entropy;    prehash?: boolean;};export type VerOpts = {    lowS?: boolean;    prehash?: boolean;};/** * ### Design rationale for types * * * Interaction between classes from different curves should fail: *   `k256.Point.BASE.add(p256.Point.BASE)` * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime * * Different calls of `curve()` would return different classes - *   `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve, *   it won't affect others * * TypeScript can't infer types for classes created inside a function. Classes is one instance of nominative types in TypeScript and interfaces only check for shape, so it's hard to create unique type for every function call. * * We can use generic types via some param, like curve opts, but that would: *     1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params) *     which is hard to debug. *     2. Params can be generic and we can't enforce them to be constant value: *     if somebody creates curve from non-constant params, *     it would be allowed to interact with other curves with non-constant params * * TODO: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol */export interface ProjPointType<T> extends Group<ProjPointType<T>> {    readonly px: T;    readonly py: T;    readonly pz: T;    get x(): T;    get y(): T;    multiply(scalar: bigint): ProjPointType<T>;    toAffine(iz?: T): AffinePoint<T>;    isTorsionFree(): boolean;    clearCofactor(): ProjPointType<T>;    assertValidity(): void;    hasEvenY(): boolean;    toRawBytes(isCompressed?: boolean): Uint8Array;    toHex(isCompressed?: boolean): string;    multiplyUnsafe(scalar: bigint): ProjPointType<T>;    multiplyAndAddUnsafe(Q: ProjPointType<T>, a: bigint, b: bigint): ProjPointType<T> | undefined;    _setWindowSize(windowSize: number): void;}export interface ProjConstructor<T> extends GroupConstructor<ProjPointType<T>> {    new (x: T, y: T, z: T): ProjPointType<T>;    fromAffine(p: AffinePoint<T>): ProjPointType<T>;    fromHex(hex: Hex): ProjPointType<T>;    fromPrivateKey(privateKey: PrivKey): ProjPointType<T>;    normalizeZ(points: ProjPointType<T>[]): ProjPointType<T>[];}export type CurvePointsType<T> = BasicWCurve<T> & {    fromBytes?: (bytes: Uint8Array) => AffinePoint<T>;    toBytes?: (c: ProjConstructor<T>, point: ProjPointType<T>, isCompressed: boolean) => Uint8Array;};declare function validatePointOpts<T>(curve: CurvePointsType<T>): Readonly<{    readonly nBitLength: number;    readonly nByteLength: number;    readonly Fp: mod.IField<T>;    readonly n: bigint;    readonly h: bigint;    readonly hEff?: bigint;    readonly Gx: T;    readonly Gy: T;    readonly allowInfinityPoint?: boolean;    readonly a: T;    readonly b: T;    readonly allowedPrivateKeyLengths?: readonly number[];    readonly wrapPrivateKey?: boolean;    readonly endo?: EndomorphismOpts;    readonly isTorsionFree?: ((c: ProjConstructor<T>, point: ProjPointType<T>) => boolean) | undefined;    readonly clearCofactor?: ((c: ProjConstructor<T>, point: ProjPointType<T>) => ProjPointType<T>) | undefined;    readonly fromBytes?: ((bytes: Uint8Array) => AffinePoint<T>) | undefined;    readonly toBytes?: ((c: ProjConstructor<T>, point: ProjPointType<T>, isCompressed: boolean) => Uint8Array) | undefined;    readonly p: bigint;}>;export type CurvePointsRes<T> = {    CURVE: ReturnType<typeof validatePointOpts<T>>;    ProjectivePoint: ProjConstructor<T>;    normPrivateKeyToScalar: (key: PrivKey) => bigint;    weierstrassEquation: (x: T) => T;    isWithinCurveOrder: (num: bigint) => boolean;};export declare const DER: {    Err: {        new (m?: string): {            name: string;            message: string;            stack?: string;        };    };    _parseInt(data: Uint8Array): {        d: bigint;        l: Uint8Array;    };    toSig(hex: string | Uint8Array): {        r: bigint;        s: bigint;    };    hexFromSig(sig: {        r: bigint;        s: bigint;    }): string;};export declare function weierstrassPoints<T>(opts: CurvePointsType<T>): CurvePointsRes<T>;export interface SignatureType {    readonly r: bigint;    readonly s: bigint;    readonly recovery?: number;    assertValidity(): void;    addRecoveryBit(recovery: number): RecoveredSignatureType;    hasHighS(): boolean;    normalizeS(): SignatureType;    recoverPublicKey(msgHash: Hex): ProjPointType<bigint>;    toCompactRawBytes(): Uint8Array;    toCompactHex(): string;    toDERRawBytes(isCompressed?: boolean): Uint8Array;    toDERHex(isCompressed?: boolean): string;}export type RecoveredSignatureType = SignatureType & {    readonly recovery: number;};export type SignatureConstructor = {    new (r: bigint, s: bigint): SignatureType;    fromCompact(hex: Hex): SignatureType;    fromDER(hex: Hex): SignatureType;};type SignatureLike = {    r: bigint;    s: bigint;};export type PubKey = Hex | ProjPointType<bigint>;export type CurveType = BasicWCurve<bigint> & {    hash: CHash;    hmac: HmacFnSync;    randomBytes: (bytesLength?: number) => Uint8Array;    lowS?: boolean;    bits2int?: (bytes: Uint8Array) => bigint;    bits2int_modN?: (bytes: Uint8Array) => bigint;};declare function validateOpts(curve: CurveType): Readonly<{    readonly nBitLength: number;    readonly nByteLength: number;    readonly Fp: mod.IField<bigint>;    readonly n: bigint;    readonly h: bigint;    readonly hEff?: bigint;    readonly Gx: bigint;    readonly Gy: bigint;    readonly allowInfinityPoint?: boolean;    readonly a: bigint;    readonly b: bigint;    readonly allowedPrivateKeyLengths?: readonly number[];    readonly wrapPrivateKey?: boolean;    readonly endo?: EndomorphismOpts;    readonly isTorsionFree?: ((c: ProjConstructor<bigint>, point: ProjPointType<bigint>) => boolean) | undefined;    readonly clearCofactor?: ((c: ProjConstructor<bigint>, point: ProjPointType<bigint>) => ProjPointType<bigint>) | undefined;    readonly hash: CHash;    readonly hmac: HmacFnSync;    readonly randomBytes: (bytesLength?: number) => Uint8Array;    lowS: boolean;    readonly bits2int?: (bytes: Uint8Array) => bigint;    readonly bits2int_modN?: (bytes: Uint8Array) => bigint;    readonly p: bigint;}>;export type CurveFn = {    CURVE: ReturnType<typeof validateOpts>;    getPublicKey: (privateKey: PrivKey, isCompressed?: boolean) => Uint8Array;    getSharedSecret: (privateA: PrivKey, publicB: Hex, isCompressed?: boolean) => Uint8Array;    sign: (msgHash: Hex, privKey: PrivKey, opts?: SignOpts) => RecoveredSignatureType;    verify: (signature: Hex | SignatureLike, msgHash: Hex, publicKey: Hex, opts?: VerOpts) => boolean;    ProjectivePoint: ProjConstructor<bigint>;    Signature: SignatureConstructor;    utils: {        normPrivateKeyToScalar: (key: PrivKey) => bigint;        isValidPrivateKey(privateKey: PrivKey): boolean;        randomPrivateKey: () => Uint8Array;        precompute: (windowSize?: number, point?: ProjPointType<bigint>) => ProjPointType<bigint>;    };};export declare function weierstrass(curveDef: CurveType): CurveFn;/** * Implementation of the Shallue and van de Woestijne method for any weierstrass curve. * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular. * b = True and y = sqrt(u / v) if (u / v) is square in F, and * b = False and y = sqrt(Z * (u / v)) otherwise. * @param Fp * @param Z * @returns */export declare function SWUFpSqrtRatio<T>(Fp: mod.IField<T>, Z: T): (u: T, v: T) => {    isValid: boolean;    value: T;};/** * Simplified Shallue-van de Woestijne-Ulas Method * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2 */export declare function mapToCurveSimpleSWU<T>(Fp: mod.IField<T>, opts: {    A: T;    B: T;    Z: T;}): (u: T) => {    x: T;    y: T;};//# sourceMappingURL=weierstrass.d.ts.map
 |