{"version":3,"file":"rc4.mjs","sources":["../src/rc4.ts"],"sourcesContent":["import type { PresetComponent, StreamCipherComponent, Transform } from '@jscrypto/core';\n\nexport interface Rc4Options {\n  readonly drop?: number;\n}\n\nexport const rc4: StreamCipherComponent<'RC4'> = {\n  kind: 'cipher',\n  name: 'RC4',\n  type: 'stream',\n  createEncryptor({ key, options }) {\n    return createRc4Transform(key, getDrop(options, 0));\n  },\n  createDecryptor({ key, options }) {\n    return createRc4Transform(key, getDrop(options, 0));\n  },\n};\n\nexport const rc4Drop: StreamCipherComponent<'RC4Drop'> = {\n  kind: 'cipher',\n  name: 'RC4Drop',\n  type: 'stream',\n  createEncryptor({ key, options }) {\n    return createRc4Transform(key, getDrop(options, 192));\n  },\n  createDecryptor({ key, options }) {\n    return createRc4Transform(key, getDrop(options, 192));\n  },\n};\n\nexport const rc4Preset: PresetComponent<'rc4'> = {\n  kind: 'preset',\n  name: 'rc4',\n  components() {\n    return [rc4, rc4Drop];\n  },\n};\n\nexport function createRc4Transform(key: Uint8Array, drop = 0): Transform {\n  assertKey(key);\n  assertDrop(drop);\n\n  const state = createInitialState(key);\n  for (let n = 0; n < drop; n++) {\n    nextByte(state);\n  }\n\n  let finalized = false;\n\n  const processInput = (input: Uint8Array): Uint8Array => {\n      const output = new Uint8Array(input.length);\n      for (let i = 0; i < input.length; i++) {\n        output[i] = input[i] ^ nextByte(state);\n      }\n      return output;\n  };\n\n  return {\n    process(input) {\n      assertNotFinalized(finalized);\n      return processInput(input);\n    },\n\n    finalize(input = new Uint8Array(0)) {\n      assertNotFinalized(finalized);\n      finalized = true;\n      return input.length === 0 ? new Uint8Array(0) : processInput(input);\n    },\n  };\n}\n\ninterface Rc4State {\n  readonly s: Uint8Array;\n  i: number;\n  j: number;\n}\n\nfunction createInitialState(key: Uint8Array): Rc4State {\n  const s = new Uint8Array(256);\n  for (let i = 0; i < s.length; i++) {\n    s[i] = i;\n  }\n\n  let j = 0;\n  for (let i = 0; i < s.length; i++) {\n    j = (j + s[i] + key[i % key.length]) & 0xff;\n    swap(s, i, j);\n  }\n\n  return { s, i: 0, j: 0 };\n}\n\nfunction nextByte(state: Rc4State): number {\n  const { s } = state;\n  state.i = (state.i + 1) & 0xff;\n  state.j = (state.j + s[state.i]) & 0xff;\n  swap(s, state.i, state.j);\n  return s[(s[state.i] + s[state.j]) & 0xff];\n}\n\nfunction swap(bytes: Uint8Array, a: number, b: number): void {\n  const value = bytes[a];\n  bytes[a] = bytes[b];\n  bytes[b] = value;\n}\n\nfunction getDrop(options: unknown, defaultDrop: number): number {\n  if (!isRc4Options(options) || options.drop === undefined) {\n    return defaultDrop;\n  }\n  return options.drop;\n}\n\nfunction isRc4Options(options: unknown): options is Rc4Options {\n  return typeof options === 'object' && options !== null;\n}\n\nfunction assertKey(key: Uint8Array): void {\n  if (key.length < 5) {\n    throw new Error('RC4 key should be greater or equal than 40 bits.');\n  }\n}\n\nfunction assertDrop(drop: number): void {\n  if (!Number.isInteger(drop) || drop < 0) {\n    throw new RangeError('RC4 drop must be a non-negative integer.');\n  }\n}\n\nfunction assertNotFinalized(finalized: boolean): void {\n  if (finalized) {\n    throw new Error('Transform is already finalized.');\n  }\n}\n"],"names":[],"mappings":";;;;;AAMO,MAAM,GAAG,GAAiC;AAC/C,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,IAAI,EAAE,KAAK;AACX,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAA;QAC9B,OAAO,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;AACD,IAAA,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAA;QAC9B,OAAO,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;;AAGI,MAAM,OAAO,GAAqC;AACvD,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,IAAI,EAAE,SAAS;AACf,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAA;QAC9B,OAAO,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;AACD,IAAA,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAA;QAC9B,OAAO,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;;AAGI,MAAM,SAAS,GAA2B;AAC/C,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,IAAI,EAAE,KAAK;IACX,UAAU,GAAA;AACR,QAAA,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC;IACvB,CAAC;;SAGa,kBAAkB,CAAC,GAAe,EAAE,IAAI,GAAG,CAAC,EAAA;IAC1D,SAAS,CAAC,GAAG,CAAC;IACd,UAAU,CAAC,IAAI,CAAC;AAEhB,IAAA,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC;AACrC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;QAC7B,QAAQ,CAAC,KAAK,CAAC;IACjB;IAEA,IAAI,SAAS,GAAG,KAAK;AAErB,IAAA,MAAM,YAAY,GAAG,CAAC,KAAiB,KAAgB;QACnD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;AAC3C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;QACxC;AACA,QAAA,OAAO,MAAM;AACjB,IAAA,CAAC;IAED,OAAO;AACL,QAAA,OAAO,CAAC,KAAK,EAAA;YACX,kBAAkB,CAAC,SAAS,CAAC;AAC7B,YAAA,OAAO,YAAY,CAAC,KAAK,CAAC;QAC5B,CAAC;AAED,QAAA,QAAQ,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAA;YAChC,kBAAkB,CAAC,SAAS,CAAC;YAC7B,SAAS,GAAG,IAAI;YAChB,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;QACrE,CAAC;KACF;AACH;AAQA,SAAS,kBAAkB,CAAC,GAAe,EAAA;AACzC,IAAA,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC;AAC7B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACjC,QAAA,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACV;IAEA,IAAI,CAAC,GAAG,CAAC;AACT,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACjC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI;AAC3C,QAAA,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACf;IAEA,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAC1B;AAEA,SAAS,QAAQ,CAAC,KAAe,EAAA;AAC/B,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,KAAK;AACnB,IAAA,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI;AAC9B,IAAA,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;IACvC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACzB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5C;AAEA,SAAS,IAAI,CAAC,KAAiB,EAAE,CAAS,EAAE,CAAS,EAAA;AACnD,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;IACtB,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AACnB,IAAA,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK;AAClB;AAEA,SAAS,OAAO,CAAC,OAAgB,EAAE,WAAmB,EAAA;AACpD,IAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE;AACxD,QAAA,OAAO,WAAW;IACpB;IACA,OAAO,OAAO,CAAC,IAAI;AACrB;AAEA,SAAS,YAAY,CAAC,OAAgB,EAAA;IACpC,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;AACxD;AAEA,SAAS,SAAS,CAAC,GAAe,EAAA;AAChC,IAAA,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;AAClB,QAAA,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC;IACrE;AACF;AAEA,SAAS,UAAU,CAAC,IAAY,EAAA;AAC9B,IAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE;AACvC,QAAA,MAAM,IAAI,UAAU,CAAC,0CAA0C,CAAC;IAClE;AACF;AAEA,SAAS,kBAAkB,CAAC,SAAkB,EAAA;IAC5C,IAAI,SAAS,EAAE;AACb,QAAA,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC;IACpD;AACF;;;;"}