import type { AffinePoint, WeierstrassPointCons } from "@noble/curves/abstract/weierstrass.js"; import type { CHash, TArg, TRet } from "@noble/hashes/utils.js"; export type CipherOrHashFunctionWrapper = (msg: TArg) => TRet; /** Cipher core */ export type Cipher = { /** Block size */ readonly blockSize: number; /** Key size */ readonly keySize: number; /** Encrypt block */ encrypt(plaintext: TArg): TRet; /** Decrypt block */ decrypt(ciphertext: TArg): TRet; }; /** Block mode for {@link Cipher} */ export type BlockMode = { /** Encrypt plaintext */ encrypt: (plaintext: TArg) => TRet; /** Decrypt ciphertext */ decrypt: (ciphertext: TArg) => TRet; }; /** Stream-like mode for {@link Cipher} */ export type StreamMode = { /** Proceed message */ crypt: CipherOrHashFunctionWrapper; }; /** MAC mode for {@link Cipher} */ export type MACMode = { /** Compute MAC */ compute: CipherOrHashFunctionWrapper; }; /** AEAD mode for {@link Cipher} */ export type AEADMode = { /** Seal plaintext and AAD */ seal: (plaintext: TArg, aad?: TArg) => TRet; /** Open ciphertext and AAD */ open: (ciphertext: TArg, aad?: TArg) => TRet; }; /** Key wrapping mode for {@link Cipher} */ export type WrapMode = { /** Wrap encryption key */ wrap: (key: TArg) => TRet; /** Unwrap encryption key */ unwrap: (wrapped: TArg) => TRet; }; /** Key wrapping mode (KWP) for Magma */ export type WrapModeMagma = { /** Wrap encryption key */ wrap: (ukm: TArg, cek: TArg) => TRet; /** Unwrap encryption key */ unwrap: (wrapped: TArg) => TRet; }; /** Keypair generator */ export type Keygen = (seed?: TArg, isCompressed?: boolean) => { secretKey: TRet; publicKey: TRet; }; /** GOST R 34.10 signer */ export type Signer = { getPublicKey: (secretKey: TArg, isCompressed?: boolean) => TRet; sign: (secretKey: TArg, digest: TArg, rand?: TArg) => TRet; verify: (publicKey: TArg, digest: TArg, signature: TArg) => boolean; keygen: Keygen; getSharedSecret: (hash: CHash, secretKeyA: TArg, publicKeyB: TArg, ukm: TArg) => TRet; Point: WeierstrassPointCons; utils: { uv2xy: (point: AffinePoint) => AffinePoint; xy2uv: (point: AffinePoint) => AffinePoint; swapPoint: (point: TArg) => TRet; }; };