UNPKG

mima-kit

Version:

mima-kit is a cryptographic suite implemented in TypeScript. The goal is to provide an easy-to-use cryptographic library. mima-kit 是一个使用 TypeScript 实现的密码学套件。目标是提供一个简单易用的密码学库。

65 lines (64 loc) 1.89 kB
import { createHash } from '../core/hash'; import { KitError } from '../core/utils'; import { keccak_p_1600, sponge_1600 } from './keccak1600'; /** * turboSHAKE 填充函数 / Padding Function * * ```ts * M || D || 0x00* * ``` * * @param {number} rByte - 处理速率 / Rate * @param {number} D - 域分隔符 / Domain Separator */ function turboShakePadding(rByte, D) { return (M) => { const sig_byte = M.length + 1; const block = Math.ceil(sig_byte / rByte); const P = new Uint8Array(block * rByte); P.set(M); P[M.length] = D; P[P.length - 1] ^= 0x80; return P; }; } /** * TurboSHAKE128 * * @param {number} d - 输出长度 / Digest Size (bit) * @param {number} [D] - 域分隔符 / Domain Separator (range: 0x01 ~ 0x7F, default: 0x1F) */ export function turboshake128(d, D = 0x1F) { if (D < 0x01 || D > 0x7F) { throw new KitError('Invalid Domain Separator'); } const d_byte = d >> 3; const r_byte = 168; const f = keccak_p_1600(12); const pad = turboShakePadding(r_byte, D); return createHash((M) => sponge_1600(r_byte, d_byte, pad, f)(M), { ALGORITHM: `TurboSHAKE128/${d}`, BLOCK_SIZE: r_byte, DIGEST_SIZE: d_byte, }); } /** * TurboSHAKE256 * * @param {number} d - 输出长度 / Digest Size (bit) * @param {number} [D] - 域分隔符 / Domain Separator (range: 0x01 ~ 0x7F, default: 0x1F) */ export function turboshake256(d, D = 0x1F) { if (D < 0x01 || D > 0x7F) { throw new KitError('Invalid Domain Separator'); } const d_byte = d >> 3; const r_byte = 136; const f = keccak_p_1600(12); const pad = turboShakePadding(r_byte, D); return createHash((M) => sponge_1600(r_byte, d_byte, pad, f)(M), { ALGORITHM: `TurboSHAKE256/${d}`, BLOCK_SIZE: r_byte, DIGEST_SIZE: d_byte, }); }