INNER CODE UNIT · TypeScript

avail

paulmillr/noble-ciphers · src/_arx.ts:399

    const avail = this.pos < this.blockLen ? this.blockLen - this.pos : 0;
    const blocks = Math.ceil(Math.max(0, len - avail) / this.blockLen);
    // Preflight overflow so failed reads don't partially consume keystream
    // and leave the PRG repeating blocks.
    if (blocks > 0 && this.ctr > MAX_COUNTER - blocks) throw new Error('arx: counter overflow');
    const out = new Uint8Array(len);
    let outPos = 0;
    // `out` starts zero-filled, and `buf.fill(0)` below does the same for leftovers: XOR-stream
    // ciphers then emit raw keystream bytes directly into those buffers.
    // Serve buffered leftovers first so split reads stay identical to one larger read.
    if (this.pos < this.blockLen) {
      const take = Math.min(len, this.blockLen - this.pos);
      out.set(this.buf.subarray(this.pos, this.pos + take), 0);
      this.pos += take;
      outPos += take;
      if (outPos === len) return out as TRet<Uint8Array>; // fast path
    }
    // Full blocks directly to out

View source record →

📰 Research Paper
Loading…
⏳ Fetching content…