{"version":3,"file":"circuit.cjs","sources":["../../../../../src/mods/tor/circuit.ts"],"sourcesContent":["import { Aes128Ctr128BEKey, AesWasm } from \"@hazae41/aes.wasm\";\nimport { Base64 } from \"@hazae41/base64\";\nimport { Opaque } from \"@hazae41/binary\";\nimport { Bitset } from \"@hazae41/bitset\";\nimport { Bytes } from \"@hazae41/bytes\";\nimport { Future } from \"@hazae41/future\";\nimport { Option } from \"@hazae41/option\";\nimport { CloseEvents, ErrorEvents, Plume, SuperEventTarget } from \"@hazae41/plume\";\nimport { Sha1 } from \"@hazae41/sha1\";\nimport { X25519 } from \"@hazae41/x25519\";\nimport { Console } from \"mods/console/index.js\";\nimport { Ntor } from \"mods/tor/algorithms/ntor/index.js\";\nimport { DestroyCell } from \"mods/tor/binary/cells/direct/destroy/cell.js\";\nimport { RelayBeginCell } from \"mods/tor/binary/cells/relayed/relay_begin/cell.js\";\nimport { RelayDataCell } from \"mods/tor/binary/cells/relayed/relay_data/cell.js\";\nimport { RelayEndCell } from \"mods/tor/binary/cells/relayed/relay_end/cell.js\";\nimport { RelayExtend2Cell } from \"mods/tor/binary/cells/relayed/relay_extend2/cell.js\";\nimport { RelayExtend2Link, RelayExtend2LinkIPv4, RelayExtend2LinkIPv6, RelayExtend2LinkLegacyID, RelayExtend2LinkModernID } from \"mods/tor/binary/cells/relayed/relay_extend2/link.js\";\nimport { RelayExtended2Cell } from \"mods/tor/binary/cells/relayed/relay_extended2/cell.js\";\nimport { RelayTruncateCell } from \"mods/tor/binary/cells/relayed/relay_truncate/cell.js\";\nimport { RelayTruncatedCell } from \"mods/tor/binary/cells/relayed/relay_truncated/cell.js\";\nimport { SecretTorClientDuplex } from \"mods/tor/client.js\";\nimport { SecretTorStreamDuplex, TorStreamDuplex } from \"mods/tor/stream.js\";\nimport { Target } from \"mods/tor/target.js\";\nimport { InvalidNtorAuthError, NtorResult } from \"./algorithms/ntor/ntor.js\";\nimport { Cell } from \"./binary/cells/cell.js\";\nimport { RelayCell } from \"./binary/cells/direct/relay/cell.js\";\nimport { RelayEarlyCell } from \"./binary/cells/direct/relay_early/cell.js\";\nimport { RelayBeginDirCell } from \"./binary/cells/relayed/relay_begin_dir/cell.js\";\nimport { Consensus } from \"./consensus/consensus.js\";\nimport { HASH_LEN } from \"./constants.js\";\n\nexport const IPv6 = {\n  always: 3,\n  preferred: 2,\n  avoided: 1,\n  never: 0\n} as const\n\nexport interface CircuitOpenParams {\n  /**\n   * Wait RELAY_CONNECTED\n   */\n  readonly wait?: boolean\n\n  /**\n   * IPv6 preference\n   */\n  readonly ipv6?: keyof typeof IPv6\n}\n\nexport class UnknownProtocolError extends Error {\n  readonly #class = UnknownProtocolError\n  readonly name = this.#class.name\n\n  constructor(\n    readonly protocol: string\n  ) {\n    super(`Unknown protocol \"${protocol}\"`)\n  }\n\n}\n\nexport class DestroyedError extends Error {\n  readonly #class = DestroyedError\n  readonly name = this.#class.name\n\n  constructor(\n    readonly reason: number\n  ) {\n    super(`Circuit destroyed`, { cause: reason })\n  }\n\n}\n\nexport class ExtendError extends Error {\n  readonly #class = ExtendError\n  readonly name = this.#class.name\n\n  constructor(options: ErrorOptions) {\n    super(`Could not extend`, options)\n  }\n\n  static from(cause: unknown) {\n    return new ExtendError({ cause })\n  }\n\n}\n\nexport class OpenError extends Error {\n  readonly #class = OpenError\n  readonly name = this.#class.name\n\n  constructor(options: ErrorOptions) {\n    super(`Could not open`, options)\n  }\n\n  static from(cause: unknown) {\n    return new OpenError({ cause })\n  }\n\n}\n\nexport class TruncateError extends Error {\n  readonly #class = TruncateError\n  readonly name = this.#class.name\n\n  constructor(options: ErrorOptions) {\n    super(`Could not truncate`, options)\n  }\n\n  static from(cause: unknown) {\n    return new TruncateError({ cause })\n  }\n\n}\n\nexport class Circuit {\n\n  readonly events = new SuperEventTarget<CloseEvents & ErrorEvents>()\n\n  readonly #secret: SecretCircuit\n\n  constructor(secret: SecretCircuit) {\n    this.#secret = secret\n\n    const onClose = this.#onClose.bind(this)\n    this.#secret.events.on(\"close\", onClose)\n\n    const onError = this.#onError.bind(this)\n    this.#secret.events.on(\"error\", onError)\n  }\n\n  [Symbol.dispose]() {\n    this.#secret[Symbol.dispose]()\n  }\n\n  async [Symbol.asyncDispose]() {\n    this.#secret[Symbol.asyncDispose]()\n  }\n\n  get id() {\n    return this.#secret.id\n  }\n\n  get closed() {\n    return Boolean(this.#secret.closed)\n  }\n\n  async #onClose() {\n    return await this.events.emit(\"close\", [undefined])\n  }\n\n  async #onError(reason?: unknown) {\n    return await this.events.emit(\"error\", [reason])\n  }\n\n  async extendOrThrow(microdesc: Consensus.Microdesc, signal = new AbortController().signal) {\n    return await this.#secret.extendOrThrow(microdesc, signal)\n  }\n\n  async openOrThrow(hostname: string, port: number, params?: CircuitOpenParams, signal = new AbortController().signal) {\n    return await this.#secret.openOrThrow(hostname, port, params, signal)\n  }\n\n  async openDirOrThrow(params?: CircuitOpenParams, signal = new AbortController().signal) {\n    return await this.#secret.openDirOrThrow(params, signal)\n  }\n\n  async close() {\n    return await this.#secret.close()\n  }\n\n}\n\nexport type SecretCircuitEvents = CloseEvents & ErrorEvents & {\n  /**\n   * Streamless\n   */\n  \"RELAY_EXTENDED2\": (cell: RelayCell.Streamless<RelayExtended2Cell<Opaque>>) => void\n  \"RELAY_TRUNCATED\": (cell: RelayCell.Streamless<RelayTruncatedCell>) => void\n\n  /**\n   * Streamful\n   */\n  \"RELAY_CONNECTED\": (cell: RelayCell.Streamful<Opaque>) => void\n  \"RELAY_DATA\": (cell: RelayCell.Streamful<RelayDataCell<Opaque>>) => void\n  \"RELAY_END\": (cell: RelayCell.Streamful<RelayEndCell>) => void\n}\n\nexport class SecretCircuit {\n  readonly #class = SecretCircuit\n\n  readonly events = new SuperEventTarget<SecretCircuitEvents>()\n\n  readonly targets = new Array<Target>()\n  readonly streams = new Map<number, SecretTorStreamDuplex>()\n\n  #streamId = 1\n\n  #closed?: { reason?: unknown }\n\n  #onClean: () => void\n\n  constructor(\n    readonly id: number,\n    readonly tor: SecretTorClientDuplex\n  ) {\n    const onClose = this.#onTorClose.bind(this)\n    const onError = this.#onTorError.bind(this)\n\n    const onDestroyCell = this.#onDestroyCell.bind(this)\n\n    const onRelayExtended2Cell = this.#onRelayExtended2Cell.bind(this)\n    const onRelayTruncatedCell = this.#onRelayTruncatedCell.bind(this)\n\n    const onRelayConnectedCell = this.#onRelayConnectedCell.bind(this)\n    const onRelayDataCell = this.#onRelayDataCell.bind(this)\n    const onRelayEndCell = this.#onRelayEndCell.bind(this)\n\n    this.tor.events.on(\"close\", onClose, { passive: true })\n    this.tor.events.on(\"error\", onError, { passive: true })\n\n    this.tor.events.on(\"DESTROY\", onDestroyCell, { passive: true })\n\n    this.tor.events.on(\"RELAY_EXTENDED2\", onRelayExtended2Cell, { passive: true })\n    this.tor.events.on(\"RELAY_TRUNCATED\", onRelayTruncatedCell, { passive: true })\n\n    this.tor.events.on(\"RELAY_CONNECTED\", onRelayConnectedCell, { passive: true })\n    this.tor.events.on(\"RELAY_DATA\", onRelayDataCell, { passive: true })\n    this.tor.events.on(\"RELAY_END\", onRelayEndCell, { passive: true })\n\n    this.#onClean = () => {\n      for (const stream of this.streams.values())\n        stream[Symbol.dispose]()\n\n      for (const target of this.targets)\n        target[Symbol.dispose]()\n\n      this.tor.events.off(\"close\", onClose)\n      this.tor.events.off(\"error\", onError)\n\n      this.tor.events.off(\"DESTROY\", onDestroyCell)\n\n      this.tor.events.off(\"RELAY_EXTENDED2\", onRelayExtended2Cell)\n      this.tor.events.off(\"RELAY_TRUNCATED\", onRelayTruncatedCell)\n\n      this.tor.events.off(\"RELAY_CONNECTED\", onRelayConnectedCell)\n      this.tor.events.off(\"RELAY_DATA\", onRelayDataCell)\n      this.tor.events.off(\"RELAY_END\", onRelayEndCell)\n\n      this.tor.circuits.inner.delete(this.id)\n\n      this.#onClean = () => { }\n    }\n\n  }\n\n  [Symbol.dispose]() {\n    this.close().catch(console.error)\n  }\n\n  async [Symbol.asyncDispose]() {\n    await this.close()\n  }\n\n  get closed() {\n    return this.#closed\n  }\n\n  #onCloseOrError(reason?: unknown) {\n    if (this.#closed)\n      return\n    this.#closed = { reason }\n    this.#onClean()\n  }\n\n  async close(reason: number = DestroyCell.reasons.NONE) {\n    const error = new DestroyedError(reason)\n\n    // TODO: send destroy cell\n\n    this.#onCloseOrError(error)\n\n    if (reason === DestroyCell.reasons.NONE)\n      await this.events.emit(\"close\", [error])\n    else\n      await this.events.emit(\"error\", [error])\n  }\n\n  async #onTorClose() {\n    Console.debug(`${this.#class.name}.onTorClose`)\n\n    this.#onCloseOrError()\n\n    await this.events.emit(\"close\", [undefined])\n  }\n\n  async #onTorError(reason?: unknown) {\n    Console.debug(`${this.#class.name}.onReadError`, { reason })\n\n    await this.events.emit(\"error\", [reason])\n\n    this.#onCloseOrError(reason)\n  }\n\n  async #onDestroyCell(cell: Cell.Circuitful<DestroyCell>) {\n    if (cell.circuit !== this)\n      return\n\n    Console.debug(`${this.#class.name}.onDestroyCell`, cell)\n\n    const error = new DestroyedError(cell.fragment.reason)\n\n    this.#onCloseOrError(error)\n\n    if (cell.fragment.reason === DestroyCell.reasons.NONE)\n      await this.events.emit(\"close\", [error])\n    else\n      await this.events.emit(\"error\", [error])\n  }\n\n  async #onRelayExtended2Cell(cell: RelayCell.Streamless<RelayExtended2Cell<Opaque>>) {\n    if (cell.circuit !== this)\n      return\n\n    Console.debug(`${this.#class.name}.onRelayExtended2Cell`, cell)\n\n    await this.events.emit(\"RELAY_EXTENDED2\", cell)\n  }\n\n  async #onRelayTruncatedCell(cell: RelayCell.Streamless<RelayTruncatedCell>) {\n    if (cell.circuit !== this)\n      return\n\n    Console.debug(`${this.#class.name}.onRelayTruncatedCell`, cell)\n\n    const error = new DestroyedError(cell.fragment.reason)\n\n    this.#onCloseOrError(error)\n\n    if (cell.fragment.reason === RelayTruncateCell.reasons.NONE)\n      await this.events.emit(\"close\", [error])\n    else\n      await this.events.emit(\"error\", [error])\n\n    await this.events.emit(\"RELAY_TRUNCATED\", cell)\n  }\n\n  async #onRelayConnectedCell(cell: RelayCell.Streamful<Opaque>) {\n    if (cell.circuit !== this)\n      return\n\n    Console.debug(`${this.#class.name}.onRelayConnectedCell`, cell)\n\n    await this.events.emit(\"RELAY_CONNECTED\", cell)\n  }\n\n  async #onRelayDataCell(cell: RelayCell.Streamful<RelayDataCell<Opaque>>) {\n    if (cell.circuit !== this)\n      return\n\n    Console.debug(`${this.#class.name}.onRelayDataCell`, cell)\n\n    await this.events.emit(\"RELAY_DATA\", cell)\n  }\n\n  async #onRelayEndCell(cell: RelayCell.Streamful<RelayEndCell>) {\n    if (cell.circuit !== this)\n      return\n\n    Console.debug(`${this.#class.name}.onRelayEndCell`, cell)\n\n    this.streams.delete(cell.stream.id)\n\n    await this.events.emit(\"RELAY_END\", cell)\n  }\n\n  async extendOrThrow(microdesc: Consensus.Microdesc, signal = new AbortController().signal) {\n    if (this.closed != null)\n      throw this.closed.reason\n\n    using relayid_rsa_x = Base64.get().getOrThrow().decodeUnpaddedOrThrow(microdesc.identity)\n    const relayid_rsa = Bytes.castOrThrow(relayid_rsa_x.bytes.slice(), HASH_LEN)\n\n    using ntor_key_x = Base64.get().getOrThrow().decodeUnpaddedOrThrow(microdesc.ntorOnionKey)\n    const ntor_key = Bytes.castOrThrow(ntor_key_x.bytes.slice(), 32)\n\n    const relayid_ed = Option.wrap(microdesc.idEd25519).mapSync(x => {\n      using memory = Base64.get().getOrThrow().decodeUnpaddedOrThrow(x)\n      return memory.bytes.slice()\n    }).getOrNull()\n\n    const links = new Array<RelayExtend2Link>()\n\n    links.push(new RelayExtend2LinkIPv4(microdesc.hostname, Number(microdesc.orport)))\n\n    if (microdesc.ipv6 != null)\n      links.push(RelayExtend2LinkIPv6.from(microdesc.ipv6))\n\n    links.push(new RelayExtend2LinkLegacyID(relayid_rsa))\n\n    if (relayid_ed != null)\n      links.push(new RelayExtend2LinkModernID(relayid_ed))\n\n    using wasm_secret_x = await X25519.get().getOrThrow().PrivateKey.randomOrThrow()\n    using wasm_public_x = wasm_secret_x.getPublicKeyOrThrow()\n\n    using public_x_memory = await wasm_public_x.exportOrThrow()\n\n    const public_x = Bytes.castOrThrow(public_x_memory.bytes.slice(), 32)\n    const public_b = ntor_key\n\n    const ntor_request = new Ntor.NtorRequest(public_x, relayid_rsa, public_b)\n    const relay_extend2 = new RelayExtend2Cell(RelayExtend2Cell.types.NTOR, links, ntor_request)\n    this.tor.output.enqueue(RelayEarlyCell.Streamless.from(this, undefined, relay_extend2).cellOrThrow())\n\n    const msg_extended2 = await Plume.waitWithCloseAndErrorOrThrow(this.events, \"RELAY_EXTENDED2\", (future: Future<RelayCell.Streamless<RelayExtended2Cell<Opaque>>>, e) => {\n      future.resolve(e)\n    }, signal)\n\n    const response = msg_extended2.fragment.fragment.readIntoOrThrow(Ntor.NtorResponse)\n\n    const { public_y } = response\n\n    using wasm_public_y = await X25519.get().getOrThrow().PublicKey.importOrThrow(public_y)\n    using wasm_public_b = await X25519.get().getOrThrow().PublicKey.importOrThrow(public_b)\n\n    using wasm_shared_xy = await wasm_secret_x.computeOrThrow(wasm_public_y)\n    using wasm_shared_xb = await wasm_secret_x.computeOrThrow(wasm_public_b)\n\n    using shared_xy_memory = wasm_shared_xy.exportOrThrow()\n    using shared_xb_memory = wasm_shared_xb.exportOrThrow()\n\n    const shared_xy = Bytes.castOrThrow(shared_xy_memory.bytes.slice(), 32)\n    const shared_xb = Bytes.castOrThrow(shared_xb_memory.bytes.slice(), 32)\n\n    const result = await NtorResult.finalizeOrThrow(shared_xy, shared_xb, relayid_rsa, public_b, public_x, public_y)\n\n    if (!Bytes.equals(response.auth, result.auth))\n      throw new InvalidNtorAuthError()\n\n    const forward_digest = Sha1.get().getOrThrow().Hasher.createOrThrow()\n    const backward_digest = Sha1.get().getOrThrow().Hasher.createOrThrow()\n\n    forward_digest.updateOrThrow(result.forwardDigest)\n    backward_digest.updateOrThrow(result.backwardDigest)\n\n    using forwardKeyMemory = new AesWasm.Memory(result.forwardKey)\n    using forwardIvMemory = new AesWasm.Memory(new Uint8Array(16))\n\n    using backwardKeyMemory = new AesWasm.Memory(result.backwardKey)\n    using backwardIvMemory = new AesWasm.Memory(new Uint8Array(16))\n\n    const forwardKey = new Aes128Ctr128BEKey(forwardKeyMemory, forwardIvMemory)\n    const backwardKey = new Aes128Ctr128BEKey(backwardKeyMemory, backwardIvMemory)\n\n    const target = new Target(relayid_rsa, this, forward_digest, backward_digest, forwardKey, backwardKey)\n\n    this.targets.push(target)\n  }\n\n  async truncateOrThrow(reason: number = RelayTruncateCell.reasons.NONE, signal = new AbortController().signal) {\n    if (this.closed != null)\n      throw this.closed.reason\n\n    const relay_truncate = new RelayTruncateCell(reason)\n    const relay_truncate_cell = RelayCell.Streamless.from(this, undefined, relay_truncate)\n    this.tor.output.enqueue(relay_truncate_cell.cellOrThrow())\n\n    await Plume.waitWithCloseAndErrorOrThrow(this.events, \"RELAY_TRUNCATED\", (future: Future<RelayCell.Streamless<RelayTruncatedCell>>, e) => {\n      future.resolve(e)\n    }, signal)\n  }\n\n  async openDirOrThrow(params: CircuitOpenParams = {}, signal = new AbortController().signal) {\n    if (this.closed != null)\n      throw this.closed.reason\n\n    const stream = new SecretTorStreamDuplex(\"directory\", this.#streamId++, this)\n\n    this.streams.set(stream.id, stream)\n\n    const begin = new RelayBeginDirCell()\n    const begin_cell = RelayCell.Streamful.from(this, stream, begin)\n    this.tor.output.enqueue(begin_cell.cellOrThrow())\n\n    if (!params.wait)\n      return new TorStreamDuplex(stream)\n\n    await Plume.waitWithCloseAndErrorOrThrow(stream.events, \"connected\", (future: Future<void>) => {\n      future.resolve()\n    }, signal)\n\n    return new TorStreamDuplex(stream)\n  }\n\n  async openOrThrow(hostname: string, port: number, params: CircuitOpenParams = {}, signal = new AbortController().signal) {\n    if (this.closed != null)\n      throw this.closed.reason\n\n    const { ipv6 = \"preferred\" } = params\n\n    const stream = new SecretTorStreamDuplex(\"external\", this.#streamId++, this)\n\n    this.streams.set(stream.id, stream)\n\n    const flags = new Bitset(0, 32)\n      .setLE(RelayBeginCell.flags.IPV6_OK, IPv6[ipv6] !== IPv6.never)\n      .setLE(RelayBeginCell.flags.IPV4_NOT_OK, IPv6[ipv6] === IPv6.always)\n      .setLE(RelayBeginCell.flags.IPV6_PREFER, IPv6[ipv6] > IPv6.avoided)\n      .unsign()\n      .value\n\n    const begin = RelayBeginCell.create(`${hostname}:${port}`, flags)\n    const begin_cell = RelayCell.Streamful.from(this, stream, begin)\n    this.tor.output.enqueue(begin_cell.cellOrThrow())\n\n    if (!params.wait)\n      return new TorStreamDuplex(stream)\n\n    await Plume.waitWithCloseAndErrorOrThrow(stream.events, \"connected\", (future: Future<void>) => {\n      future.resolve()\n    }, signal)\n\n    return new TorStreamDuplex(stream)\n  }\n\n}"],"names":["SuperEventTarget","DestroyCell","Console","cell","RelayTruncateCell","__addDisposableResource","Base64","Bytes","HASH_LEN","Option","RelayExtend2LinkIPv4","RelayExtend2LinkIPv6","RelayExtend2LinkLegacyID","RelayExtend2LinkModernID","X25519","Ntor.NtorRequest","RelayExtend2Cell","RelayEarlyCell","Plume","Ntor.NtorResponse","NtorResult","InvalidNtorAuthError","Sha1","AesWasm","Aes128Ctr128BEKey","target","Target","RelayCell","stream","SecretTorStreamDuplex","RelayBeginDirCell","TorStreamDuplex","Bitset","RelayBeginCell"],"mappings":"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"}