{"version":3,"file":"cell.cjs","sources":["../../../../../../../../../src/mods/tor/binary/cells/direct/relay/cell.ts"],"sourcesContent":["import { AesWasm } from \"@hazae41/aes.wasm\";\nimport { Opaque, Readable, Writable } from \"@hazae41/binary\";\nimport { Bytes, type Uint8Array } from \"@hazae41/bytes\";\nimport { Cursor } from \"@hazae41/cursor\";\nimport { Cell, } from \"mods/tor/binary/cells/cell.js\";\nimport { SecretCircuit } from \"mods/tor/circuit.js\";\nimport { SecretTorStreamDuplex } from \"mods/tor/stream.js\";\nimport { ExpectedCircuitError, ExpectedStreamError, InvalidRelayCommandError, UnexpectedStreamError, UnrecognisedRelayCellError } from \"../../errors.js\";\nimport { RelayDataCell } from \"../../relayed/relay_data/cell.js\";\n\nexport interface RelayCellable {\n  readonly rcommand: number,\n  readonly early: false,\n  readonly stream: boolean\n}\n\nexport namespace RelayCellable {\n\n  export interface Streamful {\n    readonly rcommand: number,\n    readonly early: false,\n    readonly stream: true\n  }\n\n  export interface Streamless {\n    readonly rcommand: number,\n    readonly early: false,\n    readonly stream: false\n  }\n\n}\n\nexport type RelayCell<T extends Writable> =\n  | RelayCell.Streamful<T>\n  | RelayCell.Streamless<T>\n\nexport namespace RelayCell {\n\n  export const HEAD_LEN = 1 + 2 + 2 + 4 + 2\n  export const DATA_LEN = Cell.PAYLOAD_LEN - HEAD_LEN\n\n  export const command = 3\n\n  export class Raw<T extends Writable> {\n\n    constructor(\n      readonly circuit: SecretCircuit,\n      readonly stream: number,\n      readonly rcommand: number,\n      readonly fragment: T,\n      readonly digest?: Uint8Array<20>\n    ) { }\n\n    unpackOrNull() {\n      if (this.stream === 0)\n        return new Streamless(this.circuit, undefined, this.rcommand, this.fragment, this.digest)\n\n      const stream = this.circuit.streams.get(this.stream)\n\n      if (stream == null)\n        return\n\n      return new Streamful(this.circuit, stream, this.rcommand, this.fragment, this.digest)\n    }\n\n    cellOrThrow() {\n      const cursor = new Cursor(new Uint8Array(Cell.PAYLOAD_LEN))\n\n      cursor.writeUint8OrThrow(this.rcommand)\n      cursor.writeUint16OrThrow(0)\n      cursor.writeUint16OrThrow(this.stream)\n\n      const digestOffset = cursor.offset\n\n      cursor.writeUint32OrThrow(0)\n\n      const size = this.fragment.sizeOrThrow()\n      cursor.writeUint16OrThrow(size)\n      this.fragment.writeOrThrow(cursor)\n\n      cursor.fillOrThrow(0, Math.min(cursor.remaining, 4))\n      cursor.writeOrThrow(Bytes.random(cursor.remaining))\n\n      const exit = this.circuit.targets[this.circuit.targets.length - 1]\n\n      exit.forward_digest.updateOrThrow(cursor.bytes)\n\n      using digest = exit.forward_digest.finalizeOrThrow()\n      const digest20 = digest.bytes.slice() as Uint8Array<20>\n\n      if (this.rcommand === RelayDataCell.rcommand) {\n        if (exit.package % 100 === 1)\n          exit.digests.push(digest20)\n        exit.package--\n      }\n\n      cursor.offset = digestOffset\n      cursor.writeOrThrow(digest20.subarray(0, 4))\n\n      using memory = new AesWasm.Memory(cursor.bytes)\n\n      for (let i = this.circuit.targets.length - 1; i >= 0; i--)\n        this.circuit.targets[i].forward_key.apply_keystream(memory)\n\n      const fragment = new Opaque(new Uint8Array(memory.bytes))\n\n      return new Cell.Circuitful(this.circuit, RelayCell.command, fragment)\n    }\n\n    static uncellOrThrow(cell: Cell<Opaque>) {\n      if (cell instanceof Cell.Circuitless)\n        throw new ExpectedCircuitError()\n\n      using memory = new AesWasm.Memory(cell.fragment.bytes)\n\n      for (const target of cell.circuit.targets) {\n        target.backward_key.apply_keystream(memory)\n\n        const cursor = new Cursor(memory.bytes)\n\n        const rcommand = cursor.readUint8OrThrow()\n        const recognised = cursor.readUint16OrThrow()\n\n        if (recognised !== 0)\n          continue\n\n        const stream = cursor.readUint16OrThrow()\n\n        const offset = cursor.offset\n        const digest4 = cursor.getAndCopyOrThrow(4)\n\n        cursor.writeUint32OrThrow(0)\n\n        using hasher = target.backward_digest.cloneOrThrow()\n        using digest = hasher.updateOrThrow(cursor.bytes).finalizeOrThrow()\n        const digest20 = digest.bytes.slice() as Uint8Array<20>\n\n        if (!Bytes.equals2(digest4, digest.bytes.subarray(0, 4))) {\n          cursor.offset = offset\n          cursor.writeOrThrow(digest4)\n          continue\n        }\n\n        target.backward_digest.updateOrThrow(cursor.bytes)\n\n        const length = cursor.readUint16OrThrow()\n        const bytes = cursor.readAndCopyOrThrow(length)\n        const data = new Opaque(bytes)\n\n        return new Raw<Opaque>(cell.circuit, stream, rcommand, data, digest20)\n      }\n\n      throw new UnrecognisedRelayCellError()\n    }\n\n  }\n\n  export class Streamful<T extends Writable> {\n    readonly #raw: Raw<T>\n\n    constructor(\n      readonly circuit: SecretCircuit,\n      readonly stream: SecretTorStreamDuplex,\n      readonly rcommand: number,\n      readonly fragment: T,\n      readonly digest?: Uint8Array<20>\n    ) {\n      this.#raw = new Raw(circuit, stream.id, rcommand, fragment)\n    }\n\n    static from<T extends RelayCellable.Streamful & Writable>(circuit: SecretCircuit, stream: SecretTorStreamDuplex, fragment: T) {\n      return new Streamful(circuit, stream, fragment.rcommand, fragment)\n    }\n\n    cellOrThrow() {\n      return this.#raw.cellOrThrow()\n    }\n\n    static intoOrThrow<T extends Writable>(cell: RelayCell<Opaque>, readable: RelayCellable.Streamful & Readable<T>) {\n      if (cell.rcommand !== readable.rcommand)\n        throw new InvalidRelayCommandError()\n      if (cell.stream == null)\n        throw new ExpectedStreamError()\n\n      const fragment = cell.fragment.readIntoOrThrow(readable)\n\n      return new Streamful(cell.circuit, cell.stream, readable.rcommand, fragment, cell.digest)\n    }\n\n  }\n\n  export class Streamless<T extends Writable> {\n    readonly #raw: Raw<T>\n\n    constructor(\n      readonly circuit: SecretCircuit,\n      readonly stream: undefined,\n      readonly rcommand: number,\n      readonly fragment: T,\n      readonly digest?: Uint8Array<20>\n    ) {\n      this.#raw = new Raw(circuit, 0, rcommand, fragment)\n    }\n\n    static from<T extends RelayCellable.Streamless & Writable>(circuit: SecretCircuit, stream: undefined, fragment: T) {\n      return new Streamless(circuit, stream, fragment.rcommand, fragment)\n    }\n\n    cellOrThrow(): Cell.Circuitful<Opaque> {\n      return this.#raw.cellOrThrow()\n    }\n\n    static intoOrThrow<T extends Writable>(cell: RelayCell<Opaque>, readable: RelayCellable.Streamless & Readable<T>) {\n      if (cell.rcommand !== readable.rcommand)\n        throw new InvalidRelayCommandError()\n      if (cell.stream != null)\n        throw new UnexpectedStreamError()\n\n      const fragment = cell.fragment.readIntoOrThrow(readable)\n\n      return new Streamless(cell.circuit, cell.stream, readable.rcommand, fragment, cell.digest)\n    }\n\n  }\n}"],"names":["RelayCell","Cell","cursor","Cursor","Bytes","RelayDataCell","__addDisposableResource","AesWasm","Opaque","cell","ExpectedCircuitError","bytes","UnrecognisedRelayCellError","InvalidRelayCommandError","ExpectedStreamError","UnexpectedStreamError"],"mappings":"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"}