@li0ard/kalyna
Version:
Kalyna (DSTU 7624:2014) cipher implementation in pure TypeScript
29 lines (28 loc) • 1.12 kB
JavaScript
import { xor } from "@li0ard/gost3413/dist/utils";
import { pad } from "../padding";
/**
* Compute CMAC
* @param cipherClass Initialized cipher class
* @param in_ Data to be authenticated
*/
export const cmac = (cipherClass, in_, q = 16) => {
let data = in_.slice();
let zeroBlock = new Uint8Array(cipherClass.blockSize);
if (data.length % cipherClass.blockSize !== 0) {
data = pad(data, cipherClass.blockSize);
zeroBlock[0] = 1;
}
let 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;
const block = data.slice(blockStart, blockStart + cipherClass.blockSize);
c = xor(c, block);
c = cipherClass.encrypt(c);
}
const lastBlockStart = (numBlocks - 1) * cipherClass.blockSize;
const lastBlock = data.slice(lastBlockStart, lastBlockStart + cipherClass.blockSize);
c = cipherClass.encrypt(xor(xor(c, lastBlock), Kd));
return c.slice(0, q);
};