166 lines
6.8 KiB
TypeScript
166 lines
6.8 KiB
TypeScript
import { type CHash } from '@noble/hashes/utils.js';
|
|
import { type Signer, type TArg, type TRet } from './utils.ts';
|
|
/**
|
|
* * N: Security parameter (in bytes). W: Winternitz parameter
|
|
* * H: Hypertree height. D: Hypertree layers
|
|
* * K: FORS trees numbers. A: FORS trees height
|
|
*/
|
|
export type SphincsOpts = {
|
|
/** Security parameter in bytes. */
|
|
N: number;
|
|
/** Winternitz parameter. */
|
|
W: number;
|
|
/** Total hypertree height. */
|
|
H: number;
|
|
/** Number of hypertree layers. */
|
|
D: number;
|
|
/** Number of FORS trees. */
|
|
K: number;
|
|
/** Height of each FORS tree. */
|
|
A: number;
|
|
/** Target security level in bits. */
|
|
securityLevel: number;
|
|
};
|
|
/** Hash customization options for SLH-DSA context creation. */
|
|
export type SphincsHashOpts = {
|
|
/** Whether to use the compressed-address variant from the standard. */
|
|
isCompressed?: boolean;
|
|
/** Factory that binds one parameter set to one per-key hash context generator. */
|
|
getContext: GetContext;
|
|
};
|
|
/** Winternitz signature params. */
|
|
/**
|
|
* Built-in SLH-DSA Table 2 subset keyed by strength/profile.
|
|
* SHA2 and SHAKE pairs share the same numeric rows here, so the hash family is chosen separately.
|
|
* `securityLevel` stores 128/192/256-bit strengths for `checkHash(...)`,
|
|
* not Table 2's category labels 1/3/5.
|
|
* Other Table 2 columns such as `m`, public-key bytes, and signature bytes
|
|
* stay derived at the export layer.
|
|
*/
|
|
export declare const PARAMS: Record<string, SphincsOpts>;
|
|
/** Address byte array of size `ADDR_BYTES`. */
|
|
export type ADRS = Uint8Array;
|
|
/** Hash and tweakable-hash callbacks bound to one SLH-DSA keypair context. */
|
|
export type Context = {
|
|
/**
|
|
* Derive a PRF output for one address.
|
|
* @param addr - Address bytes.
|
|
* @returns PRF output bytes.
|
|
*/
|
|
PRFaddr: (addr: TArg<ADRS>) => TRet<Uint8Array>;
|
|
/**
|
|
* Derive the randomized message hash prefix.
|
|
* @param skPRF - Secret PRF seed.
|
|
* @param random - Per-signature randomness.
|
|
* @param msg - Message bytes.
|
|
* @returns PRF output bytes.
|
|
*/
|
|
PRFmsg: (skPRF: TArg<Uint8Array>, random: TArg<Uint8Array>, msg: TArg<Uint8Array>) => TRet<Uint8Array>;
|
|
/**
|
|
* Hash one randomized message transcript.
|
|
* @param R - Randomized message prefix.
|
|
* @param pk - Public key bytes.
|
|
* @param m - Message bytes.
|
|
* @param outLen - Output length in bytes.
|
|
* @returns Transcript hash bytes.
|
|
*/
|
|
Hmsg: (R: TArg<Uint8Array>, pk: TArg<Uint8Array>, m: TArg<Uint8Array>, outLen: number) => TRet<Uint8Array>;
|
|
/**
|
|
* Tweakable hash over one input block.
|
|
* @param input - Input block.
|
|
* @param addr - Address bytes.
|
|
* @returns Hash output bytes.
|
|
*/
|
|
thash1: (input: TArg<Uint8Array>, addr: TArg<ADRS>) => TRet<Uint8Array>;
|
|
/**
|
|
* Tweakable hash over multiple input blocks.
|
|
* @param blocks - Number of input blocks.
|
|
* @param input - Concatenated input bytes.
|
|
* @param addr - Address bytes.
|
|
* @returns Hash output bytes.
|
|
*/
|
|
thashN: (blocks: number, input: TArg<Uint8Array>, addr: TArg<ADRS>) => TRet<Uint8Array>;
|
|
/** Wipe any buffered hash state for the current context. */
|
|
clean: () => void;
|
|
};
|
|
/** Factory that creates a context generator for one SLH-DSA parameter set. */
|
|
export type GetContext = (opts: SphincsOpts) => (pub_seed: TArg<Uint8Array>, sk_seed?: TArg<Uint8Array>) => TRet<Context>;
|
|
/** Public SLH-DSA signer with prehash customization. */
|
|
export type SphincsSigner = Signer & {
|
|
internal: TRet<Signer>;
|
|
securityLevel: number;
|
|
prehash: (hash: TArg<CHash>) => TRet<Signer>;
|
|
};
|
|
/**
|
|
* SLH-DSA-SHAKE-128f: Table 2 row `n=16, h=66, d=22, h'=3, a=6, k=33, lg w=4, m=34`;
|
|
* lengths `publicKey=32`, `secretKey=64`, `signature=17088`, `seed=48`, `signRand=16`.
|
|
* Also exposes `.prehash(...)`.
|
|
*/
|
|
export declare const slh_dsa_shake_128f: TRet<SphincsSigner>;
|
|
/**
|
|
* SLH-DSA-SHAKE-128s: Table 2 row `n=16, h=63, d=7, h'=9, a=12, k=14, lg w=4, m=30`;
|
|
* lengths `publicKey=32`, `secretKey=64`, `signature=7856`, `seed=48`, `signRand=16`.
|
|
* Also exposes `.prehash(...)`.
|
|
*/
|
|
export declare const slh_dsa_shake_128s: TRet<SphincsSigner>;
|
|
/**
|
|
* SLH-DSA-SHAKE-192f: Table 2 row `n=24, h=66, d=22, h'=3, a=8, k=33, lg w=4, m=42`;
|
|
* lengths `publicKey=48`, `secretKey=96`, `signature=35664`, `seed=72`, `signRand=24`.
|
|
* Also exposes `.prehash(...)`.
|
|
*/
|
|
export declare const slh_dsa_shake_192f: TRet<SphincsSigner>;
|
|
/**
|
|
* SLH-DSA-SHAKE-192s: Table 2 row `n=24, h=63, d=7, h'=9, a=14, k=17, lg w=4, m=39`;
|
|
* lengths `publicKey=48`, `secretKey=96`, `signature=16224`, `seed=72`, `signRand=24`.
|
|
* Also exposes `.prehash(...)`.
|
|
*/
|
|
export declare const slh_dsa_shake_192s: TRet<SphincsSigner>;
|
|
/**
|
|
* SLH-DSA-SHAKE-256f: Table 2 row `n=32, h=68, d=17, h'=4, a=9, k=35, lg w=4, m=49`;
|
|
* lengths `publicKey=64`, `secretKey=128`, `signature=49856`, `seed=96`, `signRand=32`.
|
|
* Also exposes `.prehash(...)`.
|
|
*/
|
|
export declare const slh_dsa_shake_256f: TRet<SphincsSigner>;
|
|
/**
|
|
* SLH-DSA-SHAKE-256s: Table 2 row `n=32, h=64, d=8, h'=8, a=14, k=22, lg w=4, m=47`;
|
|
* lengths `publicKey=64`, `secretKey=128`, `signature=29792`, `seed=96`, `signRand=32`.
|
|
* Also exposes `.prehash(...)`.
|
|
*/
|
|
export declare const slh_dsa_shake_256s: TRet<SphincsSigner>;
|
|
/**
|
|
* SLH-DSA-SHA2-128f: Table 2 row `n=16, h=66, d=22, h'=3, a=6, k=33, lg w=4, m=34`;
|
|
* lengths `publicKey=32`, `secretKey=64`, `signature=17088`, `seed=48`, `signRand=16`.
|
|
* Also exposes `.prehash(...)`.
|
|
*/
|
|
export declare const slh_dsa_sha2_128f: TRet<SphincsSigner>;
|
|
/**
|
|
* SLH-DSA-SHA2-128s: Table 2 row `n=16, h=63, d=7, h'=9, a=12, k=14, lg w=4, m=30`;
|
|
* lengths `publicKey=32`, `secretKey=64`, `signature=7856`, `seed=48`, `signRand=16`.
|
|
* Also exposes `.prehash(...)`.
|
|
*/
|
|
export declare const slh_dsa_sha2_128s: TRet<SphincsSigner>;
|
|
/**
|
|
* SLH-DSA-SHA2-192f: Table 2 row `n=24, h=66, d=22, h'=3, a=8, k=33, lg w=4, m=42`;
|
|
* lengths `publicKey=48`, `secretKey=96`, `signature=35664`, `seed=72`, `signRand=24`.
|
|
* Also exposes `.prehash(...)`.
|
|
*/
|
|
export declare const slh_dsa_sha2_192f: TRet<SphincsSigner>;
|
|
/**
|
|
* SLH-DSA-SHA2-192s: Table 2 row `n=24, h=63, d=7, h'=9, a=14, k=17, lg w=4, m=39`;
|
|
* lengths `publicKey=48`, `secretKey=96`, `signature=16224`, `seed=72`, `signRand=24`.
|
|
* Also exposes `.prehash(...)`.
|
|
*/
|
|
export declare const slh_dsa_sha2_192s: TRet<SphincsSigner>;
|
|
/**
|
|
* SLH-DSA-SHA2-256f: Table 2 row `n=32, h=68, d=17, h'=4, a=9, k=35, lg w=4, m=49`;
|
|
* lengths `publicKey=64`, `secretKey=128`, `signature=49856`, `seed=96`, `signRand=32`.
|
|
* Also exposes `.prehash(...)`.
|
|
*/
|
|
export declare const slh_dsa_sha2_256f: TRet<SphincsSigner>;
|
|
/**
|
|
* SLH-DSA-SHA2-256s: Table 2 row `n=32, h=64, d=8, h'=8, a=14, k=22, lg w=4, m=47`;
|
|
* lengths `publicKey=64`, `secretKey=128`, `signature=29792`, `seed=96`, `signRand=32`.
|
|
* Also exposes `.prehash(...)`.
|
|
*/
|
|
export declare const slh_dsa_sha2_256s: TRet<SphincsSigner>;
|
|
//# sourceMappingURL=slh-dsa.d.ts.map
|