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
|