{"version":3,"file":"aes-cmac.cjs","sources":["../src/BufferTools.ts","../src/AesCmac.ts"],"sourcesContent":["export class BufferTools {\n  public static bitShiftLeft(input: Uint8Array): Uint8Array {\n    const output = new Uint8Array(input.length);\n    let overflow = 0;\n    for (let i = input.length - 1; i >= 0; i--) {\n      output[i] = (input[i] << 1) | overflow;\n      overflow = input[i] & 0x80 ? 1 : 0;\n    }\n    return output;\n  }\n\n  public static xor(a: Uint8Array, b: Uint8Array): Uint8Array {\n    const length = Math.min(a.length, b.length);\n    const output = new Uint8Array(length);\n    for (let i = 0; i < length; i++) {\n      output[i] = a[i] ^ b[i];\n    }\n    return output;\n  }\n\n  public static toBinaryString(buffer: Uint8Array): string {\n    let binary = \"\";\n    for (let i = 0; i < buffer.length; i++) {\n      for (let b = 7; b >= 0; b--) {\n        binary += buffer[i] & (1 << b) ? \"1\" : \"0\";\n      }\n    }\n    return binary;\n  }\n}\n","import { webcrypto } from \"one-webcrypto\";\nimport { BufferTools } from \"./BufferTools\";\n\nexport class AesCmac {\n  private readonly blockSize = 16;\n  private readonly supportedLengths = [16, 24, 32];\n\n  private subkeys?: { key1: Uint8Array; key2: Uint8Array };\n  private key: CryptoKey | PromiseLike<CryptoKey>;\n\n  public constructor(key: Uint8Array) {\n    if (key instanceof Uint8Array === false) {\n      throw new Error(\"The key must be provided as a Uint8Array.\");\n    }\n\n    if (this.supportedLengths.includes(key.length) === false) {\n      throw new Error(\"Key size must be 128, 192, or 256 bits.\");\n    }\n\n    this.key = webcrypto.subtle.importKey(\"raw\", key, \"AES-CBC\", false, [\"encrypt\"]); // note that this is a Promise<CryptoKey> at this point, which we await in aes()\n  }\n\n  private async generateSubkeys(): Promise<{\n    key1: Uint8Array;\n    key2: Uint8Array;\n  }> {\n    const rb = Uint8Array.from([\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87,\n    ]);\n\n    const z = new Uint8Array(this.blockSize);\n    const l = await this.aes(z);\n\n    let key1 = BufferTools.bitShiftLeft(l);\n    if (l[0] & 0x80) {\n      key1 = BufferTools.xor(key1, rb);\n    }\n\n    let key2 = BufferTools.bitShiftLeft(key1);\n    if (key1[0] & 0x80) {\n      key2 = BufferTools.xor(key2, rb);\n    }\n\n    return { key1, key2 };\n  }\n\n  public async getSubKeys(): Promise<{ key1: Uint8Array; key2: Uint8Array }> {\n    // subkeys are generated lazily because we cannot await in a constructor\n    if (!this.subkeys) {\n      this.subkeys = await this.generateSubkeys();\n    }\n\n    const key1 = new Uint8Array(this.blockSize);\n    key1.set(this.subkeys.key1);\n\n    const key2 = new Uint8Array(this.blockSize);\n    key2.set(this.subkeys.key2);\n\n    return { key1, key2 };\n  }\n\n  public async calculate(message: Uint8Array): Promise<Uint8Array> {\n    if (message instanceof Uint8Array === false) {\n      throw new Error(\"The message must be provided as a Uint8Array.\");\n    }\n\n    const blockCount = this.getBlockCount(message);\n\n    let x = new Uint8Array(this.blockSize);\n    let y = new Uint8Array(0);\n\n    for (let i = 0; i < blockCount - 1; i++) {\n      const from = i * this.blockSize;\n      const block = message.slice(from, from + this.blockSize);\n      y = BufferTools.xor(x, block);\n      x = await this.aes(y);\n    }\n\n    y = BufferTools.xor(x, await this.getLastBlock(message));\n    x = await this.aes(y);\n\n    return x;\n  }\n\n  private getBlockCount(message: Uint8Array): number {\n    const blockCount = Math.ceil(message.length / this.blockSize);\n    return blockCount === 0 ? 1 : blockCount;\n  }\n\n  private async aes(message: Uint8Array): Promise<Uint8Array> {\n    const iv = new Uint8Array(this.blockSize);\n\n    /// because constructors cannot be async, we await the key import here\n    if (\"then\" in this.key) {\n      this.key = await this.key;\n    }\n\n    const aesCiphertext = (await webcrypto.subtle.encrypt({ name: \"AES-CBC\", iv }, this.key, message)) as ArrayBuffer;\n\n    return new Uint8Array(aesCiphertext.slice(0, 16));\n  }\n\n  private async getLastBlock(message: Uint8Array): Promise<Uint8Array> {\n    if (!this.subkeys) {\n      this.subkeys = await this.generateSubkeys();\n    }\n\n    const blockCount = this.getBlockCount(message);\n    const paddedBlock = this.padding(message, blockCount - 1);\n\n    let complete = false;\n    if (message.length > 0) {\n      complete = message.length % this.blockSize === 0;\n    }\n\n    const key = complete ? this.subkeys.key1 : this.subkeys.key2;\n    return BufferTools.xor(paddedBlock, key);\n  }\n\n  private padding(message: Uint8Array, blockIndex: number): Uint8Array {\n    const block = new Uint8Array(this.blockSize);\n\n    const from = blockIndex * this.blockSize;\n\n    const slice = message.slice(from, from + this.blockSize);\n    block.set(slice);\n\n    if (slice.length !== this.blockSize) {\n      block[slice.length] = 0x80;\n    }\n\n    return block;\n  }\n}\n"],"names":["webcrypto"],"mappings":"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"}