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
JavaScript
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,
});
}