{"version":3,"file":"rc4.mjs","names":["RC4: CipherObj","RC4Drop: CipherObj"],"sources":["../src/rc4.ts"],"sourcesContent":["import {\n  StreamCipher,\n  CipherObj,\n  CipherCfg,\n  WordArray,\n} from './cipher-core';\n\ninterface RC4DropCfg extends CipherCfg {\n  drop?: number;\n}\n\n\n/**\n * RC4 stream cipher algorithm.\n */\nexport class RC4Algo extends StreamCipher {\n  static keySize = 256 / 32;\n  static ivSize = 0;\n\n  protected _S!: number[];\n  protected _i!: number;\n  protected _j!: number;\n\n  protected generateKeystreamWord(): number {\n    // Shortcuts\n    const S = this._S;\n    let i = this._i;\n    let j = this._j;\n\n    // Generate keystream word\n    let keystreamWord = 0;\n    for (let n = 0; n < 4; n += 1) {\n      i = (i + 1) % 256;\n      j = (j + S[i]) % 256;\n\n      // Swap\n      const t = S[i];\n      S[i] = S[j];\n      S[j] = t;\n\n      keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);\n    }\n\n    // Update counters\n    this._i = i;\n    this._j = j;\n\n    return keystreamWord;\n  }\n\n  protected _doReset(): void {\n    // Shortcuts\n    const key = this._key;\n    const keyWords = key.words;\n    const keySigBytes = key.sigBytes;\n\n    // Init sbox\n    this._S = [];\n    const S = this._S;\n    for (let i = 0; i < 256; i += 1) {\n      S[i] = i;\n    }\n\n    // Key setup\n    for (let i = 0, j = 0; i < 256; i += 1) {\n      const keyByteIndex = i % keySigBytes;\n      const keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;\n\n      j = (j + S[i] + keyByte) % 256;\n\n      // Swap\n      const t = S[i];\n      S[i] = S[j];\n      S[j] = t;\n    }\n\n    // Counters\n    this._j = 0;\n    this._i = this._j;\n  }\n\n  protected _doProcessBlock(M: number[], offset: number): void {\n    const _M = M;\n\n    _M[offset] ^= this.generateKeystreamWord();\n  }\n}\n\n/**\n * Shortcut functions to the cipher's object interface.\n *\n * @example\n *\n *     var ciphertext = RC4.encrypt(message, key, cfg);\n *     var plaintext  = RC4.decrypt(ciphertext, key, cfg);\n */\nexport const RC4: CipherObj = StreamCipher._createHelper(RC4Algo);\n\n/**\n * Modified RC4 stream cipher algorithm.\n */\nexport class RC4DropAlgo extends RC4Algo {\n  declare cfg: RC4DropCfg;\n  \n  constructor(xformMode: number, key: WordArray, cfg?: RC4DropCfg) {\n    super(xformMode, key, cfg);\n\n    /**\n     * Configuration options.\n     *\n     * @property {number} drop The number of keystream words to drop. Default 192\n     */\n    // Only set default drop if not provided in cfg\n    if (this.cfg.drop === undefined) {\n      this.cfg.drop = 192;\n    }\n  }\n\n  protected _doReset(): void {\n    super._doReset();\n\n    // Drop\n    const dropCount = this.cfg.drop || 192;\n    for (let i = dropCount; i > 0; i -= 1) {\n      this.generateKeystreamWord();\n    }\n  }\n}\n\n/**\n * Shortcut functions to the cipher's object interface.\n *\n * @example\n *\n *     var ciphertext = RC4Drop.encrypt(message, key, cfg);\n *     var plaintext  = RC4Drop.decrypt(ciphertext, key, cfg);\n */\nexport const RC4Drop: CipherObj = StreamCipher._createHelper(RC4DropAlgo);"],"mappings":";;;;;;AAeA,IAAa,UAAb,cAA6B,aAAa;CACxC,OAAO,UAAU,MAAM;CACvB,OAAO,SAAS;CAEhB,AAAU;CACV,AAAU;CACV,AAAU;CAEV,AAAU,wBAAgC;EAExC,MAAM,IAAI,KAAK;EACf,IAAI,IAAI,KAAK;EACb,IAAI,IAAI,KAAK;EAGb,IAAI,gBAAgB;AACpB,OAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;AAC7B,QAAK,IAAI,KAAK;AACd,QAAK,IAAI,EAAE,MAAM;GAGjB,MAAM,IAAI,EAAE;AACZ,KAAE,KAAK,EAAE;AACT,KAAE,KAAK;AAEP,oBAAiB,GAAG,EAAE,KAAK,EAAE,MAAM,QAAS,KAAK,IAAI;EACtD;AAGD,OAAK,KAAK;AACV,OAAK,KAAK;AAEV,SAAO;CACR;CAED,AAAU,WAAiB;EAEzB,MAAM,MAAM,KAAK;EACjB,MAAM,WAAW,IAAI;EACrB,MAAM,cAAc,IAAI;AAGxB,OAAK,KAAK,EAAE;EACZ,MAAM,IAAI,KAAK;AACf,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,EAC5B,GAAE,KAAK;AAIT,OAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG;GACtC,MAAM,eAAe,IAAI;GACzB,MAAM,UAAW,SAAS,iBAAiB,OAAQ,KAAM,eAAe,IAAK,IAAM;AAEnF,QAAK,IAAI,EAAE,KAAK,WAAW;GAG3B,MAAM,IAAI,EAAE;AACZ,KAAE,KAAK,EAAE;AACT,KAAE,KAAK;EACR;AAGD,OAAK,KAAK;AACV,OAAK,KAAK,KAAK;CAChB;CAED,AAAU,gBAAgB,GAAa,QAAsB;EAC3D,MAAM,KAAK;AAEX,KAAG,WAAW,KAAK;CACpB;AACF;;;;;;;;;AAUD,MAAaA,MAAiB,aAAa,cAAc;;;;AAKzD,IAAa,cAAb,cAAiC,QAAQ;CAGvC,YAAY,WAAmB,KAAgB,KAAkB;AAC/D,QAAM,WAAW,KAAK;;;;;;AAQtB,MAAI,KAAK,IAAI,SAAS,OACpB,MAAK,IAAI,OAAO;CAEnB;CAED,AAAU,WAAiB;AACzB,QAAM;EAGN,MAAM,YAAY,KAAK,IAAI,QAAQ;AACnC,OAAK,IAAI,IAAI,WAAW,IAAI,GAAG,KAAK,EAClC,MAAK;CAER;AACF;;;;;;;;;AAUD,MAAaC,UAAqB,aAAa,cAAc"}