UNPKG

@li0ard/kalyna

Version:

Kalyna (DSTU 7624:2014) cipher implementation in pure TypeScript

25 lines (24 loc) 1.03 kB
import { xor } from "@li0ard/gost3413/dist/utils.js"; import { pad } from "../padding.js"; /** * Compute CMAC * @param cipherClass Initialized cipher class * @param in_ Data to be authenticated */ export const cmac = (cipherClass, data, q = 16) => { const zeroBlock = new Uint8Array(cipherClass.blockSize); if (data.length % cipherClass.blockSize !== 0) { data = pad(data, cipherClass.blockSize); zeroBlock[0] = 1; } const Kd = cipherClass.encrypt(zeroBlock); let c = new Uint8Array(cipherClass.blockSize); const numBlocks = data.length / cipherClass.blockSize; for (let i = 0; i < numBlocks - 1; i++) { const blockStart = i * cipherClass.blockSize; c = cipherClass.encrypt(xor(c, data.subarray(blockStart, blockStart + cipherClass.blockSize))); } const lastBlockStart = (numBlocks - 1) * cipherClass.blockSize; c = cipherClass.encrypt(xor(xor(c, data.subarray(lastBlockStart, lastBlockStart + cipherClass.blockSize)), Kd)); return c.slice(0, q); };