{"version":3,"file":"ofb.mjs","sources":["../src/ofb.ts"],"sourcesContent":["import { assertIv, type BlockCipher, type ModeComponent, type PresetComponent, type Transform } from '@jscrypto/core';\n\nexport const ofb: ModeComponent<'OFB'> = {\n  kind: 'mode',\n  name: 'OFB',\n  requiresPadding: false,\n  getIvSize: (cipher) => cipher.blockSize,\n  createEncryptor({ cipher, iv, options }) {\n    assertIv(cipher.blockSize, iv, 'OFB');\n    return createOfbTransform(cipher, iv, getMutableInput(options));\n  },\n  createDecryptor({ cipher, iv, options }) {\n    assertIv(cipher.blockSize, iv, 'OFB');\n    return createOfbTransform(cipher, iv, getMutableInput(options));\n  },\n};\n\nexport const ofbPreset: PresetComponent<'ofb'> = {\n  kind: 'preset',\n  name: 'ofb',\n  components() {\n    return [ofb];\n  },\n};\n\nfunction createOfbTransform(cipher: BlockCipher, iv: Uint8Array, mutableInput: boolean): Transform {\n  let feedback: Uint8Array = iv.slice();\n  let keystream: Uint8Array = new Uint8Array(cipher.blockSize);\n  let position = cipher.blockSize;\n\n  return {\n    process(input) {\n      const output = mutableInput ? input : new Uint8Array(input.length);\n      let offset = 0;\n\n      if (position === cipher.blockSize) {\n        for (; offset + cipher.blockSize <= input.length; offset += cipher.blockSize) {\n          encryptFeedback(cipher, feedback, keystream);\n          feedback.set(keystream);\n          for (let index = 0; index < cipher.blockSize; index++) {\n            output[offset + index] = input[offset + index] ^ keystream[index];\n          }\n        }\n      }\n\n      for (let i = offset; i < input.length; i++) {\n        if (position === cipher.blockSize) {\n          encryptFeedback(cipher, feedback, keystream);\n          feedback.set(keystream);\n          position = 0;\n        }\n\n        output[i] = input[i] ^ keystream[position];\n        position++;\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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"}