/** * Utilities for hex, bytes, CSPRNG. * @module */ /*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */ /** * Bytes API type helpers for old + new TypeScript. * * TS 5.6 has `Uint8Array`, while TS 5.9+ made it generic `Uint8Array`. * We can't use specific return type, because TS 5.6 will error. * We can't use generic return type, because most TS 5.9 software will expect specific type. * * Maps typed-array input leaves to broad forms. * These are compatibility adapters, not ownership guarantees. * * - `TArg` keeps byte inputs broad. * - `TRet` marks byte outputs for TS 5.6 and TS 5.9+ compatibility. */ export type TypedArg = T extends BigInt64Array ? BigInt64Array : T extends BigUint64Array ? BigUint64Array : T extends Float32Array ? Float32Array : T extends Float64Array ? Float64Array : T extends Int16Array ? Int16Array : T extends Int32Array ? Int32Array : T extends Int8Array ? Int8Array : T extends Uint16Array ? Uint16Array : T extends Uint32Array ? Uint32Array : T extends Uint8ClampedArray ? Uint8ClampedArray : T extends Uint8Array ? Uint8Array : never; /** Maps typed-array output leaves to narrow TS-compatible forms. */ export type TypedRet = T extends BigInt64Array ? ReturnType : T extends BigUint64Array ? ReturnType : T extends Float32Array ? ReturnType : T extends Float64Array ? ReturnType : T extends Int16Array ? ReturnType : T extends Int32Array ? ReturnType : T extends Int8Array ? ReturnType : T extends Uint16Array ? ReturnType : T extends Uint32Array ? ReturnType : T extends Uint8ClampedArray ? ReturnType : T extends Uint8Array ? ReturnType : never; /** Recursively adapts byte-carrying API input types. See {@link TypedArg}. */ export type TArg = T | ([TypedArg] extends [never] ? T extends (...args: infer A) => infer R ? ((...args: { [K in keyof A]: TRet; }) => TArg) & { [K in keyof T]: T[K] extends (...args: any) => any ? T[K] : TArg; } : T extends [infer A, ...infer R] ? [TArg, ...{ [K in keyof R]: TArg; }] : T extends readonly [infer A, ...infer R] ? readonly [TArg, ...{ [K in keyof R]: TArg; }] : T extends (infer A)[] ? TArg[] : T extends readonly (infer A)[] ? readonly TArg[] : T extends Promise ? Promise> : T extends object ? { [K in keyof T]: TArg; } : T : TypedArg); /** Recursively adapts byte-carrying API output types. See {@link TypedArg}. */ export type TRet = T extends unknown ? T & ([TypedRet] extends [never] ? T extends (...args: infer A) => infer R ? ((...args: { [K in keyof A]: TArg; }) => TRet) & { [K in keyof T]: T[K] extends (...args: any) => any ? T[K] : TRet; } : T extends [infer A, ...infer R] ? [TRet, ...{ [K in keyof R]: TRet; }] : T extends readonly [infer A, ...infer R] ? readonly [TRet, ...{ [K in keyof R]: TRet; }] : T extends (infer A)[] ? TRet[] : T extends readonly (infer A)[] ? readonly TRet[] : T extends Promise ? Promise> : T extends object ? { [K in keyof T]: TRet; } : T : TypedRet) : never; /** * Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. * @param a - value to test * @returns `true` when the value is a Uint8Array-compatible view. * @example * Check whether a value is a Uint8Array-compatible view. * ```ts * isBytes(new Uint8Array([1, 2, 3])); * ``` */ export declare function isBytes(a: unknown): a is Uint8Array; /** * Asserts something is a non-negative integer. * @param n - number to validate * @param title - label included in thrown errors * @throws On wrong argument types. {@link TypeError} * @throws On wrong argument ranges or values. {@link RangeError} * @example * Validate a non-negative integer option. * ```ts * anumber(32, 'length'); * ``` */ export declare function anumber(n: number, title?: string): void; /** * Asserts something is Uint8Array. * @param value - value to validate * @param length - optional exact length constraint * @param title - label included in thrown errors * @returns The validated byte array. * @throws On wrong argument types. {@link TypeError} * @throws On wrong argument ranges or values. {@link RangeError} * @example * Validate that a value is a byte array. * ```ts * abytes(new Uint8Array([1, 2, 3])); * ``` */ export declare function abytes(value: TArg, length?: number, title?: string): TRet; /** * Copies bytes into a fresh Uint8Array. * Buffer-style slices can alias the same backing store, so callers that need ownership should copy. * @param bytes - source bytes to clone * @returns Freshly allocated copy of `bytes`. * @throws On wrong argument types. {@link TypeError} * @example * Clone a byte array before mutating it. * ```ts * const copy = copyBytes(new Uint8Array([1, 2, 3])); * ``` */ export declare function copyBytes(bytes: TArg): TRet; /** * Asserts something is a wrapped hash constructor. * @param h - hash constructor to validate * @throws On wrong argument types or invalid hash wrapper shape. {@link TypeError} * @throws On invalid hash metadata ranges or values. {@link RangeError} * @throws If the hash metadata allows empty outputs or block sizes. {@link Error} * @example * Validate a callable hash wrapper. * ```ts * import { ahash } from '@noble/hashes/utils.js'; * import { sha256 } from '@noble/hashes/sha2.js'; * ahash(sha256); * ``` */ export declare function ahash(h: TArg): void; /** * Asserts a hash instance has not been destroyed or finished. * @param instance - hash instance to validate * @param checkFinished - whether to reject finalized instances * @throws If the hash instance has already been destroyed or finalized. {@link Error} * @example * Validate that a hash instance is still usable. * ```ts * import { aexists } from '@noble/hashes/utils.js'; * import { sha256 } from '@noble/hashes/sha2.js'; * const hash = sha256.create(); * aexists(hash); * ``` */ export declare function aexists(instance: any, checkFinished?: boolean): void; /** * Asserts output is a sufficiently-sized byte array. * @param out - destination buffer * @param instance - hash instance providing output length * Oversized buffers are allowed; downstream code only promises to fill the first `outputLen` bytes. * @throws On wrong argument types. {@link TypeError} * @throws On wrong argument ranges or values. {@link RangeError} * @example * Validate a caller-provided digest buffer. * ```ts * import { aoutput } from '@noble/hashes/utils.js'; * import { sha256 } from '@noble/hashes/sha2.js'; * const hash = sha256.create(); * aoutput(new Uint8Array(hash.outputLen), hash); * ``` */ export declare function aoutput(out: any, instance: any): void; /** Generic type encompassing 8/16/32-byte array views, but not 64-bit variants. */ export type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array | Uint16Array | Int16Array | Uint32Array | Int32Array; /** * Casts a typed array view to Uint8Array. * @param arr - source typed array * @returns Uint8Array view over the same buffer. * @example * Reinterpret a typed array as bytes. * ```ts * u8(new Uint32Array([1, 2])); * ``` */ export declare function u8(arr: TArg): TRet; /** * Casts a typed array view to Uint32Array. * `arr.byteOffset` must already be 4-byte aligned or the platform * Uint32Array constructor will throw. * @param arr - source typed array * @returns Uint32Array view over the same buffer. * @example * Reinterpret a byte array as 32-bit words. * ```ts * u32(new Uint8Array(8)); * ``` */ export declare function u32(arr: TArg): TRet; /** * Zeroizes typed arrays in place. Warning: JS provides no guarantees. * @param arrays - arrays to overwrite with zeros * @example * Zeroize sensitive buffers in place. * ```ts * clean(new Uint8Array([1, 2, 3])); * ``` */ export declare function clean(...arrays: TArg): void; /** * Creates a DataView for byte-level manipulation. * @param arr - source typed array * @returns DataView over the same buffer region. * @example * Create a DataView over an existing buffer. * ```ts * createView(new Uint8Array(4)); * ``` */ export declare function createView(arr: TArg): DataView; /** * Rotate-right operation for uint32 values. * @param word - source word * @param shift - shift amount in bits * @returns Rotated word. * @example * Rotate a 32-bit word to the right. * ```ts * rotr(0x12345678, 8); * ``` */ export declare function rotr(word: number, shift: number): number; /** * Rotate-left operation for uint32 values. * @param word - source word * @param shift - shift amount in bits * @returns Rotated word. * @example * Rotate a 32-bit word to the left. * ```ts * rotl(0x12345678, 8); * ``` */ export declare function rotl(word: number, shift: number): number; /** Whether the current platform is little-endian. */ export declare const isLE: boolean; /** * Byte-swap operation for uint32 values. * @param word - source word * @returns Word with reversed byte order. * @example * Reverse the byte order of a 32-bit word. * ```ts * byteSwap(0x11223344); * ``` */ export declare function byteSwap(word: number): number; /** * Conditionally byte-swaps one 32-bit word on big-endian platforms. * @param n - source word * @returns Original or byte-swapped word depending on platform endianness. * @example * Normalize a 32-bit word for host endianness. * ```ts * swap8IfBE(0x11223344); * ``` */ export declare const swap8IfBE: (n: number) => number; /** * Byte-swaps every word of a Uint32Array in place. * @param arr - array to mutate * @returns The same array after mutation; callers pass live state arrays here. * @example * Reverse the byte order of every word in place. * ```ts * byteSwap32(new Uint32Array([0x11223344])); * ``` */ export declare function byteSwap32(arr: TArg): TRet; /** * Conditionally byte-swaps a Uint32Array on big-endian platforms. * @param u - array to normalize for host endianness * @returns Original or byte-swapped array depending on platform endianness. * On big-endian runtimes this mutates `u` in place via `byteSwap32(...)`. * @example * Normalize a word array for host endianness. * ```ts * swap32IfBE(new Uint32Array([0x11223344])); * ``` */ export declare const swap32IfBE: (u: TArg) => TRet; /** * Convert byte array to hex string. * Uses the built-in function when available and assumes it matches the tested * fallback semantics. * @param bytes - bytes to encode * @returns Lowercase hexadecimal string. * @throws On wrong argument types. {@link TypeError} * @example * Convert bytes to lowercase hexadecimal. * ```ts * bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])); // 'cafe0123' * ``` */ export declare function bytesToHex(bytes: TArg): string; /** * Convert hex string to byte array. Uses built-in function, when available. * @param hex - hexadecimal string to decode * @returns Decoded bytes. * @throws On wrong argument types. {@link TypeError} * @throws On wrong argument ranges or values. {@link RangeError} * @example * Decode lowercase hexadecimal into bytes. * ```ts * hexToBytes('cafe0123'); // Uint8Array.from([0xca, 0xfe, 0x01, 0x23]) * ``` */ export declare function hexToBytes(hex: string): TRet; /** * There is no setImmediate in browser and setTimeout is slow. * This yields to the Promise/microtask scheduler queue, not to timers or the * full macrotask event loop. * @example * Yield to the next scheduler tick. * ```ts * await nextTick(); * ``` */ export declare const nextTick: () => Promise; /** * Returns control to the Promise/microtask scheduler every `tick` * milliseconds to avoid blocking long loops. * @param iters - number of loop iterations to run * @param tick - maximum time slice in milliseconds * @param cb - callback executed on each iteration * @example * Run a loop that periodically yields back to the event loop. * ```ts * await asyncLoop(2, 0, () => {}); * ``` */ export declare function asyncLoop(iters: number, tick: number, cb: (i: number) => void): Promise; /** * Converts string to bytes using UTF8 encoding. * Built-in doesn't validate input to be string: we do the check. * Non-ASCII details are delegated to the platform `TextEncoder`. * @param str - string to encode * @returns UTF-8 encoded bytes. * @throws On wrong argument types. {@link TypeError} * @example * Encode a string as UTF-8 bytes. * ```ts * utf8ToBytes('abc'); // Uint8Array.from([97, 98, 99]) * ``` */ export declare function utf8ToBytes(str: string): TRet; /** KDFs can accept string or Uint8Array for user convenience. */ export type KDFInput = string | Uint8Array; /** * Helper for KDFs: consumes Uint8Array or string. * String inputs are UTF-8 encoded; byte-array inputs stay aliased to the caller buffer. * @param data - user-provided KDF input * @param errorTitle - label included in thrown errors * @returns Byte representation of the input. * @throws On wrong argument types. {@link TypeError} * @example * Normalize KDF input to bytes. * ```ts * kdfInputToBytes('password'); * ``` */ export declare function kdfInputToBytes(data: TArg, errorTitle?: string): TRet; /** * Copies several Uint8Arrays into one. * @param arrays - arrays to concatenate * @returns Concatenated byte array. * @throws On wrong argument types. {@link TypeError} * @example * Concatenate multiple byte arrays. * ```ts * concatBytes(new Uint8Array([1]), new Uint8Array([2])); * ``` */ export declare function concatBytes(...arrays: TArg): TRet; type EmptyObj = {}; /** * Merges default options and passed options. * @param defaults - base option object * @param opts - user overrides * @returns Merged option object. The merge mutates `defaults` in place. * @throws On wrong argument types. {@link TypeError} * @example * Merge user overrides onto default options. * ```ts * checkOpts({ dkLen: 32 }, { asyncTick: 10 }); * ``` */ export declare function checkOpts(defaults: T1, opts?: T2): T1 & T2; /** Common interface for all hash instances. */ export interface Hash { /** Bytes processed per compression block. */ blockLen: number; /** Bytes produced by `digest()`. */ outputLen: number; /** Whether the instance supports XOF-style variable-length output via `xof()` / `xofInto()`. */ canXOF: boolean; /** * Absorbs more message bytes into the running hash state. * @param buf - message chunk to absorb * @returns The same hash instance for chaining. */ update(buf: TArg): this; /** * Finalizes the hash into a caller-provided buffer. * @param buf - destination buffer * @returns Nothing. Implementations write into `buf` in place. */ digestInto(buf: TArg): void; /** * Finalizes the hash and returns a freshly allocated digest. * @returns Digest bytes. */ digest(): TRet; /** Wipes internal state and makes the instance unusable. */ destroy(): void; /** * Copies the current hash state into an existing or new instance. * @param to - Optional destination instance to reuse. * @returns Cloned hash state. */ _cloneInto(to?: T): T; /** * Creates an independent copy of the current hash state. * @returns Cloned hash instance. */ clone(): T; } /** Pseudorandom generator interface. */ export interface PRG { /** * Mixes more entropy into the generator state. * @param seed - fresh entropy bytes * @returns Nothing. Implementations update internal state in place. */ addEntropy(seed: TArg): void; /** * Generates pseudorandom output bytes. * @param length - number of bytes to generate * @returns Generated pseudorandom bytes. */ randomBytes(length: number): TRet; /** Wipes generator state and makes the instance unusable. */ clean(): void; } /** * XOF: streaming API to read digest in chunks. * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name. * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot * destroy state, next call can require more bytes. */ export type HashXOF> = Hash & { /** * Reads more bytes from the XOF stream. * @param bytes - number of bytes to read * @returns Requested digest bytes. */ xof(bytes: number): TRet; /** * Reads more bytes from the XOF stream into a caller-provided buffer. * @param buf - destination buffer * @returns Filled output buffer. */ xofInto(buf: TArg): TRet; }; /** Hash constructor or factory type. */ export type HasherCons = Opts extends undefined ? () => T : (opts?: Opts) => T; /** Optional hash metadata. */ export type HashInfo = { /** DER-encoded object identifier bytes for the hash algorithm. */ oid?: TRet; }; /** Callable hash function type. */ export type CHash = Hash, Opts = undefined> = { /** Digest size in bytes. */ outputLen: number; /** Input block size in bytes. */ blockLen: number; /** Whether `.create()` returns a hash instance that can be used as an XOF stream. */ canXOF: boolean; } & HashInfo & (Opts extends undefined ? { (msg: TArg): TRet; create(): T; } : { (msg: TArg, opts?: TArg): TRet; create(opts?: Opts): T; }); /** Callable extendable-output hash function type. */ export type CHashXOF = HashXOF, Opts = undefined> = CHash; /** * Creates a callable hash function from a stateful class constructor. * @param hashCons - hash constructor or factory * @param info - optional metadata such as DER OID * @returns Frozen callable hash wrapper with `.create()`. * Wrapper construction eagerly calls `hashCons(undefined)` once to read * `outputLen` / `blockLen`, so constructor side effects happen at module * init time. * @example * Wrap a stateful hash constructor into a callable helper. * ```ts * import { createHasher } from '@noble/hashes/utils.js'; * import { sha256 } from '@noble/hashes/sha2.js'; * const wrapped = createHasher(sha256.create, { oid: sha256.oid }); * wrapped(new Uint8Array([1])); * ``` */ export declare function createHasher, Opts = undefined>(hashCons: HasherCons, info?: TArg): TRet>; /** * Cryptographically secure PRNG backed by `crypto.getRandomValues`. * @param bytesLength - number of random bytes to generate * @returns Random bytes. * The platform `getRandomValues()` implementation still defines any * single-call length cap, and this helper rejects oversize requests * with a stable library `RangeError` instead of host-specific errors. * @throws On wrong argument types. {@link TypeError} * @throws On wrong argument ranges or values. {@link RangeError} * @throws If the current runtime does not provide `crypto.getRandomValues`. {@link Error} * @example * Generate a fresh random key or nonce. * ```ts * const key = randomBytes(16); * ``` */ export declare function randomBytes(bytesLength?: number): TRet; /** * Creates OID metadata for NIST hashes with prefix `06 09 60 86 48 01 65 03 04 02`. * @param suffix - final OID byte for the selected hash. * The helper accepts any byte even though only the documented NIST hash * suffixes are meaningful downstream. * @returns Object containing the DER-encoded OID. * @example * Build OID metadata for a NIST hash. * ```ts * oidNist(0x01); * ``` */ export declare const oidNist: (suffix: number) => TRet>; export {}; //# sourceMappingURL=utils.d.ts.map