{"version":3,"file":"cbc.mjs","sources":["../src/cbc.ts"],"sourcesContent":["import {\n  assertBlockMultiple as assertCoreBlockMultiple,\n  assertIv,\n  type BlockCipher,\n  type ModeComponent,\n  type PresetComponent,\n  type Transform,\n} from '@jscrypto/core';\n\nexport const cbc: ModeComponent<'CBC'> = {\n  kind: 'mode',\n  name: 'CBC',\n  requiresPadding: true,\n  getIvSize: (cipher) => cipher.blockSize,\n  createEncryptor({ cipher, iv, options }) {\n    assertIv(cipher.blockSize, iv, 'CBC');\n    return createCbcEncryptor(cipher, iv, getMutableInput(options));\n  },\n  createDecryptor({ cipher, iv, options }) {\n    assertIv(cipher.blockSize, iv, 'CBC');\n    return createCbcDecryptor(cipher, iv, getMutableInput(options));\n  },\n};\n\nexport const cbcPreset: PresetComponent<'cbc'> = {\n  kind: 'preset',\n  name: 'cbc',\n  components() {\n    return [cbc];\n  },\n};\n\nfunction createCbcEncryptor(cipher: BlockCipher, iv: Uint8Array, mutableInput: boolean): Transform {\n  let previous = iv;\n\n  return {\n    process(input) {\n      assertBlockMultiple(cipher.blockSize, input);\n      const output = mutableInput ? input : new Uint8Array(input.length);\n\n      for (let offset = 0; offset < input.length; offset += cipher.blockSize) {\n        for (let index = 0; index < cipher.blockSize; index++) {\n          output[offset + index] = input[offset + index] ^ previous[index];\n        }\n        if (cipher.encryptBlock) {\n          cipher.encryptBlock(output, offset, output, offset);\n        } else {\n          const encrypted = output.subarray(offset, offset + cipher.blockSize);\n          cipher.encrypt(encrypted, encrypted);\n        }\n        previous = output.subarray(offset, offset + cipher.blockSize);\n      }\n\n      return output;\n    },\n\n    finalize(input = new Uint8Array(0)) {\n      return input.length === 0 ? new Uint8Array(0) : this.process(input);\n    },\n  };\n}\n\nfunction createCbcDecryptor(cipher: BlockCipher, iv: Uint8Array, mutableInput: boolean): Transform {\n  let previous = iv.slice();\n  let current = new Uint8Array(cipher.blockSize);\n\n  return {\n    process(input) {\n      assertBlockMultiple(cipher.blockSize, input);\n      const output = mutableInput ? input : new Uint8Array(input.length);\n\n      for (let offset = 0; offset < input.length; offset += cipher.blockSize) {\n        current.set(input.subarray(offset, offset + cipher.blockSize));\n        if (cipher.decryptBlock) {\n          cipher.decryptBlock(input, offset, output, offset);\n        } else {\n          cipher.decrypt(\n            input.subarray(offset, offset + cipher.blockSize),\n            output.subarray(offset, offset + cipher.blockSize),\n          );\n        }\n        for (let index = 0; index < cipher.blockSize; index++) {\n          output[offset + index] ^= previous[index];\n        }\n        const nextPrevious = previous;\n        previous = current;\n        current = nextPrevious;\n      }\n\n      return output;\n    },\n\n    finalize(input = new Uint8Array(0)) {\n      return input.length === 0 ? new Uint8Array(0) : this.process(input);\n    },\n  };\n}\n\nfunction assertBlockMultiple(blockSize: number, input: Uint8Array): void {\n  assertCoreBlockMultiple(input, blockSize, 'CBC');\n}\n\nfunction getMutableInput(options: unknown): boolean {\n  if (typeof options !== 'object' || options === null) {\n    return false;\n  }\n  return 'mutableInput' in options && options.mutableInput === true;\n}\n"],"names":["assertCoreBlockMultiple"],"mappings":"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"}