@li0ard/kalyna
Version:
Kalyna (DSTU 7624:2014) cipher implementation in pure TypeScript
25 lines (24 loc) • 1.03 kB
JavaScript
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);
};