{"version":3,"file":"cfb.mjs","sources":["../src/cfb.ts"],"sourcesContent":["import { assertIv, type BlockCipher, type ModeComponent, type PresetComponent, type Transform } from '@jscrypto/core';\n\nexport const cfb: ModeComponent<'CFB'> = {\n  kind: 'mode',\n  name: 'CFB',\n  requiresPadding: false,\n  getIvSize: (cipher) => cipher.blockSize,\n  createEncryptor({ cipher, iv, options }) {\n    assertIv(cipher.blockSize, iv, 'CFB');\n    return createCfbEncryptor(cipher, iv, getMutableInput(options));\n  },\n  createDecryptor({ cipher, iv, options }) {\n    assertIv(cipher.blockSize, iv, 'CFB');\n    return createCfbDecryptor(cipher, iv, getMutableInput(options));\n  },\n};\n\nexport const cfbPreset: PresetComponent<'cfb'> = {\n  kind: 'preset',\n  name: 'cfb',\n  components() {\n    return [cfb];\n  },\n};\n\nfunction createCfbEncryptor(cipher: BlockCipher, iv: Uint8Array, mutableInput: boolean): Transform {\n  return createCfbTransform(cipher, iv, true, mutableInput);\n}\n\nfunction createCfbDecryptor(cipher: BlockCipher, iv: Uint8Array, mutableInput: boolean): Transform {\n  return createCfbTransform(cipher, iv, false, mutableInput);\n}\n\nfunction createCfbTransform(cipher: BlockCipher, iv: Uint8Array, encrypting: boolean, mutableInput: boolean): Transform {\n  let feedback: Uint8Array = iv.slice();\n  let nextFeedback: Uint8Array = new Uint8Array(cipher.blockSize);\n  let keystream: Uint8Array = new Uint8Array(cipher.blockSize);\n  let position = 0;\n\n  return {\n    process(input) {\n      const output = mutableInput ? input : new Uint8Array(input.length);\n      let offset = 0;\n\n      if (position === 0) {\n        for (; offset + cipher.blockSize <= input.length; offset += cipher.blockSize) {\n          encryptFeedback(cipher, feedback, keystream);\n          for (let index = 0; index < cipher.blockSize; index++) {\n            const inputByte = input[offset + index];\n            const outputByte = inputByte ^ keystream[index];\n            output[offset + index] = outputByte;\n            nextFeedback[index] = encrypting ? outputByte : inputByte;\n          }\n          const previousFeedback = feedback;\n          feedback = nextFeedback;\n          nextFeedback = previousFeedback;\n        }\n      }\n\n      for (let i = offset; i < input.length; i++) {\n        if (position === 0) {\n          encryptFeedback(cipher, feedback, keystream);\n        }\n\n        const inputByte = input[i];\n        const outputByte = inputByte ^ keystream[position];\n        output[i] = outputByte;\n        nextFeedback[position] = encrypting ? outputByte : inputByte;\n        position++;\n\n        if (position === cipher.blockSize) {\n          const previousFeedback = feedback;\n          feedback = nextFeedback;\n          nextFeedback = previousFeedback;\n          position = 0;\n        }\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 encryptFeedback(cipher: BlockCipher, feedback: Uint8Array, keystream: Uint8Array): void {\n  if (cipher.encryptBlock) {\n    cipher.encryptBlock(feedback, 0, keystream, 0);\n  } else {\n    cipher.encrypt(feedback, keystream);\n  }\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":[],"mappings":"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"}