UNPKG

@noble/post-quantum

Version:

Auditable & minimal JS implementation of post-quantum cryptography: FIPS 203, 204, 205, Falcon

120 lines 4.74 kB
import type { TypedArray } from '@noble/hashes/utils.js'; import { type BytesCoderLen, type Coder, type TRet } from './utils.ts'; /** Extendable-output reader used by the CRYSTALS implementations. */ export type XOF = (seed: Uint8Array, blockLen?: number) => { /** * Read diagnostic counters for the current XOF session. * @returns Current call and XOF block counters. */ stats: () => { calls: number; xofs: number; }; /** * Select one `(x, y)` coordinate pair and get a block reader for it. * Only one coordinate stream is live at a time: a later `get(...)` call rebinds the shared * SHAKE state and invalidates older readers. * Each squeeze aliases one mutable internal output buffer, so callers must copy blocks they * want to retain before the next read. * @param x - First matrix coordinate. * @param y - Second matrix coordinate. * @returns Lazy block reader for that coordinate pair. */ get: (x: number, y: number) => () => Uint8Array; /** Wipe any buffered state once the reader is no longer needed. */ clean: () => void; }; /** CRYSTALS (ml-kem, ml-dsa) options */ /** Shared polynomial and NTT parameters for CRYSTALS algorithms. */ export type CrystalOpts<T extends TypedArray> = { /** * Allocate one zeroed polynomial/vector container. * @param n - Number of coefficients to allocate. * @returns Fresh typed container. */ newPoly: TypedCons<T>; /** Polynomial size, typically `256`. */ N: number; /** Prime modulus used for all coefficient arithmetic. */ Q: number; /** Inverse transform normalization factor: * `256**-1 mod q` for Dilithium, `128**-1 mod q` for Kyber. */ F: number; /** Principal root of unity for the transform domain. */ ROOT_OF_UNITY: number; /** Number of bits used for bit-reversal ordering. */ brvBits: number; /** `true` for Kyber/ML-KEM mode, `false` for Dilithium/ML-DSA mode. */ isKyber: boolean; }; /** Constructor function for typed polynomial containers. */ export type TypedCons<T extends TypedArray> = (n: number) => T; type Crystals<T extends TypedArray> = { mod: (a: number, modulo?: number) => number; smod: (a: number, modulo?: number) => number; nttZetas: T; NTT: { /** Forward transform in place. Mutates and returns `r`. */ encode: (r: T) => T; /** Inverse transform in place. Mutates and returns `r`. */ decode: (r: T) => T; }; bitsCoder: (d: number, c: Coder<number, number>) => BytesCoderLen<T>; }; /** * Creates shared modular arithmetic, NTT, and packing helpers for CRYSTALS schemes. * @param opts - Polynomial and transform parameters. See {@link CrystalOpts}. * @returns CRYSTALS arithmetic and encoding helpers. * @example * Create shared modular arithmetic and NTT helpers for a CRYSTALS parameter set. * ```ts * const crystals = genCrystals({ * newPoly: (n) => new Uint16Array(n), * N: 256, * Q: 3329, * F: 3303, * ROOT_OF_UNITY: 17, * brvBits: 7, * isKyber: true, * }); * const reduced = crystals.mod(-1); * ``` */ export declare const genCrystals: <T extends TypedArray>(opts: CrystalOpts<T>) => TRet<Crystals<T>>; /** * SHAKE128-based extendable-output reader factory used by ML-KEM. * `get(x, y)` selects one coordinate pair at a time; calling it again invalidates previously * returned readers, and each squeeze reuses one mutable internal output buffer. * @param seed - Seed bytes for the reader. * @param blockLen - Optional output block length. * @returns Stateful XOF reader. * @example * Build the ML-KEM SHAKE128 matrix expander and read one block. * ```ts * import { randomBytes } from '@noble/post-quantum/utils.js'; * import { XOF128 } from '@noble/post-quantum/_crystals.js'; * const reader = XOF128(randomBytes(32)); * const block = reader.get(0, 0)(); * ``` */ export declare const XOF128: TRet<XOF>; /** * SHAKE256-based extendable-output reader factory used by ML-DSA. * `get(x, y)` appends raw one-byte coordinates to the seed, invalidates previously returned * readers, and reuses one mutable internal output buffer for each squeeze. * @param seed - Seed bytes for the reader. * @param blockLen - Optional output block length. * @returns Stateful XOF reader. * @example * Build the ML-DSA SHAKE256 coefficient expander and read one block. * ```ts * import { randomBytes } from '@noble/post-quantum/utils.js'; * import { XOF256 } from '@noble/post-quantum/_crystals.js'; * const reader = XOF256(randomBytes(32)); * const block = reader.get(0, 0)(); * ``` */ export declare const XOF256: TRet<XOF>; export {}; //# sourceMappingURL=_crystals.d.ts.map