{"version":3,"file":"cert.cjs","sources":["../../../../../../../../src/mods/tor/binary/certs/ed25519/cert.ts"],"sourcesContent":["import { Uint8Array } from \"@hazae41/bytes\";\nimport { Cursor } from \"@hazae41/cursor\";\nimport { Ed25519 } from \"@hazae41/ed25519\";\nimport { SignedWithEd25519Key } from \"mods/tor/binary/certs/ed25519/extensions/signer.js\";\nimport { ExpiredCertError, InvalidSignatureError } from \"mods/tor/certs/certs.js\";\n\nexport interface Extensions {\n  signer?: SignedWithEd25519Key\n}\n\nexport class UnknownCertExtensionError extends Error {\n  readonly #class = UnknownCertExtensionError\n  readonly name = this.#class.name\n\n  constructor(\n    readonly type: number\n  ) {\n    super(`Unknown certificate extension ${type}`)\n  }\n\n}\n\nexport class Ed25519Cert {\n\n  static readonly types = {\n    ED_TO_SIGN: 4,\n    SIGN_TO_TLS: 5,\n    SIGN_TO_AUTH: 6,\n  } as const\n\n  static readonly flags = {\n    AFFECTS_VALIDATION: 1\n  } as const\n\n  constructor(\n    readonly type: number,\n    readonly version: number,\n    readonly certType: number,\n    readonly expiration: Date,\n    readonly certKeyType: number,\n    readonly certKey: Uint8Array<32>,\n    readonly extensions: Extensions,\n    readonly payload: Uint8Array,\n    readonly signature: Uint8Array<64>\n  ) { }\n\n  async verifyOrThrow() {\n    const now = new Date()\n\n    if (now > this.expiration)\n      throw new ExpiredCertError()\n\n    if (!this.extensions.signer)\n      return true // TODO maybe do additionnal check?\n\n    using signer = await Ed25519.get().getOrThrow().VerifyingKey.importOrThrow(this.extensions.signer.key)\n    using signature = Ed25519.get().getOrThrow().Signature.importOrThrow(this.signature)\n\n    const verified = await signer.verifyOrThrow(this.payload, signature)\n\n    if (verified !== true)\n      throw new InvalidSignatureError()\n\n    return true\n  }\n\n  static readOrThrow(cursor: Cursor) {\n    const type = cursor.readUint8OrThrow()\n    const length = cursor.readUint16OrThrow() // TODO check length\n\n    const start = cursor.offset\n\n    const version = cursor.readUint8OrThrow()\n    const certType = cursor.readUint8OrThrow()\n\n    const expDateHours = cursor.readUint32OrThrow()\n    const expiration = new Date(expDateHours * 60 * 60 * 1000)\n\n    const certKeyType = cursor.readUint8OrThrow()\n    const certKey = cursor.readAndCopyOrThrow(32)\n\n    const nextensions = cursor.readUint8OrThrow()\n    const extensions: Extensions = {}\n\n    for (let i = 0; i < nextensions; i++) {\n      const length = cursor.readUint16OrThrow()\n      const type = cursor.readUint8OrThrow()\n      const flags = cursor.readUint8OrThrow()\n\n      if (type === SignedWithEd25519Key.type) {\n        extensions.signer = SignedWithEd25519Key.readOrThrow(cursor)\n        continue\n      }\n\n      if (flags === this.flags.AFFECTS_VALIDATION)\n        throw new UnknownCertExtensionError(type)\n\n      cursor.readOrThrow(length)\n    }\n\n    const content = cursor.offset - start\n\n    cursor.offset = start\n\n    const payload = cursor.readAndCopyOrThrow(content)\n    const signature = cursor.readAndCopyOrThrow(64)\n\n    return new Ed25519Cert(type, version, certType, expiration, certKeyType, certKey, extensions, payload, signature)\n  }\n\n}"],"names":["ExpiredCertError","__addDisposableResource","Ed25519","InvalidSignatureError","SignedWithEd25519Key"],"mappings":"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"}