Swap-Aggregator-Subgraph/node_modules/asmcrypto.js/dist_es8/aes/cmac.js
Richa-iitr d211083153 Revert "Revert "added handler""
This reverts commit c36ee8c5ca.
2022-07-03 07:30:05 +05:30

51 lines
1.6 KiB
JavaScript
Executable File

import { AES_ECB } from './ecb';
import { AES_CBC } from './cbc';
function mul2(data) {
const t = data[0] & 0x80;
for (let i = 0; i < 15; i++) {
data[i] = (data[i] << 1) ^ (data[i + 1] & 0x80 ? 1 : 0);
}
data[15] = (data[15] << 1) ^ (t ? 0x87 : 0);
}
export class AES_CMAC {
constructor(key) {
this.bufferLength = 0;
this.k = new AES_ECB(key).encrypt(new Uint8Array(16));
mul2(this.k);
this.cbc = new AES_CBC(key, new Uint8Array(16), false);
this.buffer = new Uint8Array(16);
this.result = null;
}
static bytes(data, key) {
return new AES_CMAC(key).process(data).finish().result;
}
process(data) {
if (this.bufferLength + data.length > 16) {
this.cbc.encrypt(this.buffer.subarray(0, this.bufferLength));
const offset = ((this.bufferLength + data.length - 1) & ~15) - this.bufferLength;
this.cbc.encrypt(data.subarray(0, offset));
this.buffer.set(data.subarray(offset));
this.bufferLength = data.length - offset;
}
else {
this.buffer.set(data, this.bufferLength);
this.bufferLength += data.length;
}
return this;
}
finish() {
if (this.bufferLength !== 16) {
this.buffer[this.bufferLength] = 0x80;
for (let i = this.bufferLength + 1; i < 16; i++) {
this.buffer[i] = 0;
}
mul2(this.k);
}
for (let i = 0; i < 16; i++) {
this.buffer[i] ^= this.k[i];
}
this.result = this.cbc.encrypt(this.buffer);
return this;
}
}