@freedomofpress/sigstore-browser 0.1.15 → 0.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/dist/bundle.d.ts +2 -3
  2. package/dist/bundle.js.map +1 -1
  3. package/dist/cli.d.ts +0 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/dsse.d.ts +0 -1
  6. package/dist/dsse.js +4 -9
  7. package/dist/dsse.js.map +1 -1
  8. package/dist/errors.d.ts +0 -1
  9. package/dist/errors.js.map +1 -1
  10. package/dist/index.d.ts +9 -10
  11. package/dist/index.js +5 -5
  12. package/dist/index.js.map +1 -1
  13. package/dist/interfaces.d.ts +1 -2
  14. package/dist/interfaces.js +1 -1
  15. package/dist/interfaces.js.map +1 -1
  16. package/dist/oid.d.ts +0 -1
  17. package/dist/oid.js.map +1 -1
  18. package/dist/policy.d.ts +0 -1
  19. package/dist/policy.js +1 -1
  20. package/dist/policy.js.map +1 -1
  21. package/dist/rfc3161/error.d.ts +0 -1
  22. package/dist/rfc3161/error.js.map +1 -1
  23. package/dist/rfc3161/index.d.ts +0 -1
  24. package/dist/rfc3161/index.js.map +1 -1
  25. package/dist/rfc3161/timestamp.d.ts +0 -1
  26. package/dist/rfc3161/timestamp.js +3 -3
  27. package/dist/rfc3161/timestamp.js.map +1 -1
  28. package/dist/rfc3161/tstinfo.d.ts +0 -1
  29. package/dist/rfc3161/tstinfo.js +2 -3
  30. package/dist/rfc3161/tstinfo.js.map +1 -1
  31. package/dist/sigstore.d.ts +2 -3
  32. package/dist/sigstore.js +11 -14
  33. package/dist/sigstore.js.map +1 -1
  34. package/dist/timestamp/tsa.d.ts +1 -2
  35. package/dist/timestamp/tsa.js +1 -1
  36. package/dist/timestamp/tsa.js.map +1 -1
  37. package/dist/tlog/body.d.ts +0 -1
  38. package/dist/tlog/body.js +1 -1
  39. package/dist/tlog/body.js.map +1 -1
  40. package/dist/tlog/checkpoint.d.ts +0 -1
  41. package/dist/tlog/checkpoint.js.map +1 -1
  42. package/dist/tlog/dsse.d.ts +0 -1
  43. package/dist/tlog/dsse.js +6 -4
  44. package/dist/tlog/dsse.js.map +1 -1
  45. package/dist/tlog/hashedrekord.d.ts +0 -1
  46. package/dist/tlog/hashedrekord.js.map +1 -1
  47. package/dist/tlog/intoto.d.ts +0 -1
  48. package/dist/tlog/intoto.js +2 -3
  49. package/dist/tlog/intoto.js.map +1 -1
  50. package/dist/tlog/merkle.d.ts +0 -1
  51. package/dist/tlog/merkle.js +8 -102
  52. package/dist/tlog/merkle.js.map +1 -1
  53. package/dist/trust/tuf-root.d.ts +0 -1
  54. package/dist/trust/tuf-root.js.map +1 -1
  55. package/dist/trust/tuf.d.ts +0 -1
  56. package/dist/trust/tuf.js +2 -5
  57. package/dist/trust/tuf.js.map +1 -1
  58. package/dist/x509/cert.d.ts +0 -1
  59. package/dist/x509/cert.js +2 -2
  60. package/dist/x509/cert.js.map +1 -1
  61. package/dist/x509/chain.d.ts +0 -1
  62. package/dist/x509/chain.js +2 -2
  63. package/dist/x509/chain.js.map +1 -1
  64. package/dist/x509/ext.d.ts +0 -1
  65. package/dist/x509/ext.js.map +1 -1
  66. package/dist/x509/index.d.ts +1 -2
  67. package/dist/x509/index.js +1 -1
  68. package/dist/x509/index.js.map +1 -1
  69. package/dist/x509/sct.d.ts +0 -1
  70. package/dist/x509/sct.js.map +1 -1
  71. package/package.json +16 -9
  72. package/.github/workflows/conformance.yml +0 -29
  73. package/.github/workflows/publish.yml +0 -47
  74. package/dist/bundle.d.ts.map +0 -1
  75. package/dist/cli.d.ts.map +0 -1
  76. package/dist/dsse.d.ts.map +0 -1
  77. package/dist/errors.d.ts.map +0 -1
  78. package/dist/index.d.ts.map +0 -1
  79. package/dist/interfaces.d.ts.map +0 -1
  80. package/dist/oid.d.ts.map +0 -1
  81. package/dist/policy.d.ts.map +0 -1
  82. package/dist/rfc3161/error.d.ts.map +0 -1
  83. package/dist/rfc3161/index.d.ts.map +0 -1
  84. package/dist/rfc3161/timestamp.d.ts.map +0 -1
  85. package/dist/rfc3161/tstinfo.d.ts.map +0 -1
  86. package/dist/sigstore.d.ts.map +0 -1
  87. package/dist/timestamp/tsa.d.ts.map +0 -1
  88. package/dist/tlog/body.d.ts.map +0 -1
  89. package/dist/tlog/checkpoint.d.ts.map +0 -1
  90. package/dist/tlog/dsse.d.ts.map +0 -1
  91. package/dist/tlog/hashedrekord.d.ts.map +0 -1
  92. package/dist/tlog/intoto.d.ts.map +0 -1
  93. package/dist/tlog/merkle.d.ts.map +0 -1
  94. package/dist/trust/tuf-root.d.ts.map +0 -1
  95. package/dist/trust/tuf.d.ts.map +0 -1
  96. package/dist/x509/cert.d.ts.map +0 -1
  97. package/dist/x509/chain.d.ts.map +0 -1
  98. package/dist/x509/ext.d.ts.map +0 -1
  99. package/dist/x509/index.d.ts.map +0 -1
  100. package/dist/x509/sct.d.ts.map +0 -1
  101. package/eslint.config.mjs +0 -31
  102. package/src/bundle.ts +0 -186
  103. package/src/cli.ts +0 -290
  104. package/src/dsse.ts +0 -49
  105. package/src/ed25519.browser.test.ts +0 -76
  106. package/src/errors.ts +0 -82
  107. package/src/index.browser.test.ts +0 -301
  108. package/src/index.ts +0 -93
  109. package/src/interfaces.ts +0 -150
  110. package/src/oid.ts +0 -34
  111. package/src/policy.ts +0 -476
  112. package/src/rfc3161/error.ts +0 -16
  113. package/src/rfc3161/index.ts +0 -17
  114. package/src/rfc3161/timestamp.ts +0 -268
  115. package/src/rfc3161/tstinfo.ts +0 -78
  116. package/src/security.browser.test.ts +0 -249
  117. package/src/sigstore.ts +0 -605
  118. package/src/timestamp/tsa.ts +0 -212
  119. package/src/tlog/body.ts +0 -84
  120. package/src/tlog/checkpoint.ts +0 -154
  121. package/src/tlog/dsse.ts +0 -153
  122. package/src/tlog/hashedrekord.ts +0 -136
  123. package/src/tlog/intoto.ts +0 -109
  124. package/src/tlog/merkle.ts +0 -152
  125. package/src/trust/README.md +0 -38
  126. package/src/trust/tuf-root.ts +0 -3
  127. package/src/trust/tuf.ts +0 -233
  128. package/src/verify.browser.test.ts +0 -281
  129. package/src/x509/cert.ts +0 -569
  130. package/src/x509/chain.ts +0 -212
  131. package/src/x509/ext.ts +0 -356
  132. package/src/x509/index.ts +0 -19
  133. package/src/x509/sct.ts +0 -156
  134. package/test/fixtures/rekor2.ts +0 -14
  135. package/test/fixtures/sigstore.ts +0 -13
  136. package/tsconfig.json +0 -18
  137. package/vite.config.playwright.ts +0 -14
  138. package/vite.config.ts +0 -18
@@ -1,8 +1,8 @@
1
- import { X509Certificate } from "./x509/index.js";
2
1
  import { SigstoreBundle } from "./bundle.js";
3
2
  import { CertAuthority, CTLog, RawCAs, RawLogs, RekorKeyInfo, TrustedRoot } from "./interfaces.js";
4
- import { TrustedRootProvider } from "./trust/tuf.js";
5
3
  import type { VerificationPolicy } from "./policy.js";
4
+ import { TrustedRootProvider } from "./trust/tuf.js";
5
+ import { X509Certificate } from "./x509/index.js";
6
6
  export interface SigstoreVerifierOptions {
7
7
  tlogThreshold?: number;
8
8
  ctlogThreshold?: number;
@@ -51,4 +51,3 @@ export declare class SigstoreVerifier {
51
51
  payload: Uint8Array;
52
52
  }>;
53
53
  }
54
- //# sourceMappingURL=sigstore.d.ts.map
package/dist/sigstore.js CHANGED
@@ -1,15 +1,14 @@
1
- import { base64ToUint8Array, ByteStream, canonicalize, importKey, stringToUint8Array, uint8ArrayEqual, Uint8ArrayToHex, Uint8ArrayToString, verifySignature, verifySignatureOverDigest, } from "@freedomofpress/crypto-browser";
2
- import { HashAlgorithms } from "./interfaces.js";
3
- import { CertificateChainVerifier, EXTENSION_OID_SCT, X509Certificate, X509SCTExtension, } from "./x509/index.js";
1
+ import { base64ToUint8Array, ByteStream, canonicalizeJCS, importKey, sha256, stringToUint8Array, uint8ArrayEqual, Uint8ArrayToHex, Uint8ArrayToString, verifySignature, verifySignatureOverDigest } from "@freedomofpress/crypto-browser";
4
2
  import { assertBundle } from "./bundle.js";
5
3
  import { preAuthEncoding } from "./dsse.js";
6
4
  import { parseValidityPeriod, SigstoreRoots, } from "./interfaces.js";
7
- import { verifyMerkleInclusion } from "./tlog/merkle.js";
8
- import { verifyCheckpoint } from "./tlog/checkpoint.js";
9
- import { verifyTLogBody } from "./tlog/body.js";
5
+ import { AllOf, AnyOf, Identity, OIDCIssuer, OIDCIssuerV2 } from "./policy.js";
10
6
  import { verifyBundleTimestamp } from "./timestamp/tsa.js";
7
+ import { verifyTLogBody } from "./tlog/body.js";
8
+ import { verifyCheckpoint } from "./tlog/checkpoint.js";
9
+ import { verifyMerkleInclusion } from "./tlog/merkle.js";
11
10
  import { TrustedRootProvider } from "./trust/tuf.js";
12
- import { AnyOf, AllOf, OIDCIssuer, OIDCIssuerV2, Identity } from "./policy.js";
11
+ import { CertificateChainVerifier, EXTENSION_OID_SCT, X509Certificate, X509SCTExtension, } from "./x509/index.js";
13
12
  const MEDIA_TYPE_BASE = "application/vnd.dev.sigstore.bundle";
14
13
  // Upper bounds on in-toto subjects and digests, matching sigstore-go.
15
14
  const MAX_SUBJECTS = 1024;
@@ -108,7 +107,7 @@ export class SigstoreVerifier {
108
107
  lastError = err;
109
108
  }
110
109
  }
111
- throw new Error(`Failed to verify certificate chain: ${lastError?.message || 'No valid CAs found'}`);
110
+ throw new Error(`Failed to verify certificate chain: ${lastError instanceof Error ? lastError.message : 'No valid CAs found'}`);
112
111
  }
113
112
  // Loads every Fulcio CA; verifyCertificateChain() selects CAs by the observer timestamp.
114
113
  loadCA(cas) {
@@ -186,7 +185,7 @@ export class SigstoreVerifier {
186
185
  // https://www.rfc-editor.org/rfc/rfc6962#section-3.2
187
186
  const preCert = new ByteStream();
188
187
  // Calculate hash of the issuer's public key
189
- const issuerId = new Uint8Array(await crypto.subtle.digest(HashAlgorithms.SHA256, issuer.publicKey));
188
+ const issuerId = await sha256(issuer.publicKey);
190
189
  preCert.appendView(issuerId);
191
190
  // Re-encodes the certificate to DER after removing the SCT extension
192
191
  const tbs = clone.tbsCertificate.toDER();
@@ -233,7 +232,7 @@ export class SigstoreVerifier {
233
232
  if (integratedDate < log.validFor.start || integratedDate > log.validFor.end) {
234
233
  throw new Error("Rekor key was not valid at the integrated time.");
235
234
  }
236
- const signed = stringToUint8Array(canonicalize({
235
+ const signed = stringToUint8Array(canonicalizeJCS({
237
236
  body: entry.canonicalizedBody,
238
237
  integratedTime,
239
238
  logIndex: Number(entry.logIndex),
@@ -345,7 +344,7 @@ export class SigstoreVerifier {
345
344
  }
346
345
  else {
347
346
  // data is the file content, compute the digest
348
- artifactDigest = Uint8ArrayToHex(new Uint8Array(await crypto.subtle.digest(HashAlgorithms.SHA256, data)));
347
+ artifactDigest = Uint8ArrayToHex(await sha256(data));
349
348
  }
350
349
  // Every subject must carry a bounded digest map; any one of them may match the artifact.
351
350
  let matchedSubject = false;
@@ -370,9 +369,7 @@ export class SigstoreVerifier {
370
369
  else {
371
370
  // The bundle's message digest must be the digest of the artifact being verified.
372
371
  const { messageDigest } = bundle.messageSignature;
373
- const digest = isDigestOnly
374
- ? data
375
- : new Uint8Array(await crypto.subtle.digest(HashAlgorithms.SHA256, data));
372
+ const digest = isDigestOnly ? data : await sha256(data);
376
373
  if (messageDigest.algorithm !== "SHA2_256" || !uint8ArrayEqual(digest, base64ToUint8Array(messageDigest.digest))) {
377
374
  throw new Error("Artifact digest does not match the bundle message digest");
378
375
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sigstore.js","sourceRoot":"","sources":["../src/sigstore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sigstore.js","sourceRoot":"","sources":["../src/sigstore.ts"],"names":[],"mappings":"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","sourcesContent":["import { base64ToUint8Array, ByteStream, canonicalizeJCS, importKey, sha256, stringToUint8Array, uint8ArrayEqual, Uint8ArrayToHex, Uint8ArrayToString, verifySignature, verifySignatureOverDigest } from \"@freedomofpress/crypto-browser\";\n\nimport { assertBundle, SigstoreBundle, TLogEntry } from \"./bundle.js\";\nimport { preAuthEncoding } from \"./dsse.js\";\nimport {\n CertAuthority,\n CTLog,\n parseValidityPeriod,\n RawCAs,\n RawLogs,\n RekorKeyInfo,\n Sigstore,\n SigstoreRoots,\n TrustedRoot,\n} from \"./interfaces.js\";\nimport type { VerificationPolicy } from \"./policy.js\";\nimport { AllOf, AnyOf, Identity, OIDCIssuer, OIDCIssuerV2 } from \"./policy.js\";\nimport { verifyBundleTimestamp } from \"./timestamp/tsa.js\";\nimport { verifyTLogBody } from \"./tlog/body.js\";\nimport { verifyCheckpoint } from \"./tlog/checkpoint.js\";\nimport { verifyMerkleInclusion } from \"./tlog/merkle.js\";\nimport { TrustedRootProvider } from \"./trust/tuf.js\";\nimport {\n CertificateChainVerifier,\n EXTENSION_OID_SCT,\n X509Certificate,\n X509SCTExtension,\n} from \"./x509/index.js\";\n\nconst MEDIA_TYPE_BASE = \"application/vnd.dev.sigstore.bundle\";\n// Upper bounds on in-toto subjects and digests, matching sigstore-go.\nconst MAX_SUBJECTS = 1024;\nconst MAX_SUBJECT_DIGESTS = 32;\n\n// Unknown operators can satisfy threshold one, but add no independence to named operators.\nfunction countOperators(operators: Set<string>): number {\n if (operators.size === 0) return 0;\n return Math.max(1, operators.size - (operators.has(\"\") ? 1 : 0));\n}\n\n/**\n * Extract bundle version from mediaType string\n * Reference: https://github.com/sigstore/sigstore-go/blob/main/pkg/bundle/bundle.go#L159-L177\n */\nfunction getBundleVersion(mediaType: string): string {\n switch (mediaType) {\n case `${MEDIA_TYPE_BASE}+json;version=0.1`:\n return \"0.1\";\n case `${MEDIA_TYPE_BASE}+json;version=0.2`:\n return \"0.2\";\n case `${MEDIA_TYPE_BASE}+json;version=0.3`:\n return \"0.3\";\n }\n\n // New format: \"application/vnd.dev.sigstore.bundle.v0.3+json\"\n if (mediaType.startsWith(`${MEDIA_TYPE_BASE}.v`) && mediaType.endsWith(\"+json\")) {\n const version = mediaType\n .replace(`${MEDIA_TYPE_BASE}.v`, \"\")\n .replace(\"+json\", \"\");\n // Only the versions this verifier implements are accepted.\n if (/^0\\.[123]$/.test(version)) {\n return version;\n }\n }\n\n throw new Error(`Unsupported bundle media type: ${mediaType}`);\n}\n\nexport interface SigstoreVerifierOptions {\n tlogThreshold?: number;\n ctlogThreshold?: number;\n tsaThreshold?: number;\n}\n\nexport class SigstoreVerifier {\n private root: Sigstore | undefined;\n private rawRoot: TrustedRoot | undefined;\n private options: Required<SigstoreVerifierOptions>;\n\n constructor(options: SigstoreVerifierOptions = {}) {\n this.root = undefined;\n this.rawRoot = undefined;\n this.options = {\n tlogThreshold: options.tlogThreshold ?? 1,\n ctlogThreshold: options.ctlogThreshold ?? 1,\n tsaThreshold: options.tsaThreshold ?? 0,\n };\n for (const [name, threshold] of Object.entries(this.options)) {\n if (!Number.isSafeInteger(threshold) || threshold < 0) {\n throw new Error(`${name} must be a non-negative safe integer`);\n }\n }\n }\n\n // Loads every Rekor key; entries select theirs by log ID and SETs are checked against its validity window.\n async loadLog(logs: RawLogs): Promise<RekorKeyInfo[]> {\n return Promise.all(\n logs.map(async (log) => ({\n publicKey: await importKey(\n log.publicKey.keyDetails,\n log.publicKey.keyDetails,\n log.publicKey.rawBytes,\n ),\n logId: base64ToUint8Array(log.logId.keyId),\n hashAlgorithm: log.hashAlgorithm,\n // Empty means unknown; countOperators never adds it to the named operator count.\n operator: log.operator || \"\",\n validFor: parseValidityPeriod(log.publicKey.validFor),\n })),\n );\n }\n\n // Loads every CT log; SCTs select their log by ID and are checked against its validity window.\n async loadCTLogs(ctlogs: RawLogs): Promise<CTLog[]> {\n if (ctlogs.length === 0) {\n throw new Error(\"Could not find any CT logs in sigstore root.\");\n }\n return Promise.all(\n ctlogs.map(async (log) => ({\n logID: base64ToUint8Array(log.logId.keyId),\n publicKey: await importKey(\n log.publicKey.keyDetails,\n log.publicKey.keyDetails,\n log.publicKey.rawBytes,\n ),\n operator: log.operator || \"\",\n validFor: parseValidityPeriod(log.publicKey.validFor),\n })),\n );\n }\n\n // Adapted from https://github.com/sigstore/sigstore-js/blob/main/packages/verify/src/key/certificate.ts#L22-L53\n // Verifies that the leaf certificate chains to a trusted CA and is valid at the given timestamp.\n // Differences from sigstore-js:\n // - This is async (uses await) because our CertificateChainVerifier.verify() is async\n // - sigstore-js filters CAs using filterCertAuthorities() before calling this function,\n // we do the timestamp filtering inline within this function\n async verifyCertificateChain(\n timestamp: Date,\n leaf: X509Certificate,\n certificateAuthorities: CertAuthority[]\n ): Promise<X509Certificate[]> {\n let lastError: unknown;\n\n for (const ca of certificateAuthorities) {\n // Check if this CA is valid for the given timestamp\n if (timestamp < ca.validFor.start || timestamp > ca.validFor.end) {\n continue;\n }\n\n try {\n const verifier = new CertificateChainVerifier({\n trustedCerts: ca.certChain,\n untrustedCert: leaf,\n timestamp,\n });\n return await verifier.verify();\n } catch (err) {\n lastError = err;\n }\n }\n\n throw new Error(`Failed to verify certificate chain: ${lastError instanceof Error ? lastError.message : 'No valid CAs found'}`);\n }\n\n // Loads every Fulcio CA; verifyCertificateChain() selects CAs by the observer timestamp.\n loadCA(cas: RawCAs): CertAuthority[] {\n return cas\n .filter((ca) => ca.certChain.certificates.length > 0)\n .map((ca) => ({\n certChain: ca.certChain.certificates.map((cert) =>\n X509Certificate.parse(base64ToUint8Array(cert.rawBytes)),\n ),\n validFor: parseValidityPeriod(ca.validFor),\n }));\n }\n\n async loadSigstoreRoot(rawRoot: TrustedRoot) {\n rawRoot.timestampAuthorities?.forEach((authority) =>\n parseValidityPeriod(authority.validFor),\n );\n const root = {\n rekor: await this.loadLog(rawRoot[SigstoreRoots.tlogs]),\n ctlogs: await this.loadCTLogs(rawRoot[SigstoreRoots.ctlogs]),\n certificateAuthorities: this.loadCA(rawRoot[SigstoreRoots.certificateAuthorities]),\n };\n this.rawRoot = rawRoot;\n this.root = root;\n }\n\n /**\n * Load Sigstore trusted root via TUF\n * Uses The Update Framework for secure, verified updates of trusted root metadata\n *\n * @param tufProvider Optional TrustedRootProvider instance. If not provided, uses default Sigstore TUF repository\n */\n async loadSigstoreRootWithTUF(tufProvider?: TrustedRootProvider): Promise<void> {\n const provider = tufProvider || new TrustedRootProvider();\n const trustedRoot = await provider.getTrustedRoot();\n await this.loadSigstoreRoot(trustedRoot);\n }\n\n // Adapted from https://github.com/sigstore/sigstore-js/blob/main/packages/verify/src/key/sct.ts\n // Key differences:\n // - Adds duplicate SCT detection (not in reference)\n // - Inline CT log filtering by logID and validity period (reference uses filterTLogAuthorities)\n // - Returns the distinct operators of the logs whose SCTs verified, for threshold checking\n async verifySCT(\n cert: X509Certificate,\n issuer: X509Certificate,\n ctlogs: CTLog[],\n ): Promise<Set<string>> {\n let extSCT: X509SCTExtension | undefined;\n\n // Verifying the SCT requires that we remove the SCT extension and\n // re-encode the TBS structure to DER -- this value is part of the data\n // over which the signature is calculated. Since this is a destructive action\n // we create a copy of the certificate so we can remove the SCT extension\n // without affecting the original certificate.\n const clone = cert.clone();\n\n // Intentionally not using the findExtension method here because we want to\n // remove the the SCT extension from the certificate before calculating the\n // PreCert structure\n for (let i = 0; i < clone.extensions.length; i++) {\n const ext = clone.extensions[i];\n\n if (ext.subs[0].toOID() === EXTENSION_OID_SCT) {\n extSCT = new X509SCTExtension(ext);\n\n // Remove the extension from the certificate\n clone.extensions.splice(i, 1);\n break;\n }\n }\n\n // No SCT extension found - fail verification\n if (!extSCT) {\n throw new Error(\"Certificate is missing required SCT extension\");\n }\n\n // Found an SCT extension but it has no SCTs - fail verification\n if (extSCT.signedCertificateTimestamps.length === 0) {\n throw new Error(\"SCT extension is present but contains no SCTs\");\n }\n\n // Check for duplicate SCTs (same log ID)\n const seenLogIds = new Set<string>();\n for (const sct of extSCT.signedCertificateTimestamps) {\n const logIdHex = Uint8ArrayToHex(sct.logID);\n if (seenLogIds.has(logIdHex)) {\n throw new Error(`Duplicate SCT found for log ID: ${logIdHex}`);\n }\n seenLogIds.add(logIdHex);\n }\n\n // Construct the PreCert structure\n // https://www.rfc-editor.org/rfc/rfc6962#section-3.2\n const preCert = new ByteStream();\n\n // Calculate hash of the issuer's public key\n const issuerId = await sha256(issuer.publicKey);\n preCert.appendView(issuerId);\n\n // Re-encodes the certificate to DER after removing the SCT extension\n const tbs = clone.tbsCertificate.toDER();\n preCert.appendUint24(tbs.length);\n preCert.appendView(tbs);\n\n // Calculate and return the verification results for each SCT\n // Unlike sigstore-go which counts verified SCTs and checks threshold at the end,\n // sigstore-js throws immediately if any SCT fails verification\n const operators = new Set<string>();\n\n for (const sct of extSCT.signedCertificateTimestamps) {\n // Find the CT log that matches this SCT's log ID and is valid for the SCT datetime\n const validCTLogs = ctlogs.filter((log) => {\n // Check if log IDs match\n if (!uint8ArrayEqual(log.logID, sct.logID)) return false;\n // Check that the SCT datetime is within the log's validity period\n return log.validFor.start <= sct.datetime && sct.datetime <= log.validFor.end;\n });\n\n // See if the SCT is valid for any of the CT logs\n const verified = await (async () => {\n for (const log of validCTLogs) {\n try {\n if (await sct.verify(preCert.buffer, log.publicKey)) {\n return log;\n }\n } catch {\n // Continue trying other logs\n }\n }\n return undefined;\n })();\n\n if (!verified) {\n throw new Error(\"SCT verification failed\");\n }\n\n operators.add(verified.operator);\n }\n\n return operators;\n }\n\n // Verifies the signed entry timestamp and returns the integrated time it binds.\n private async verifySET(entry: TLogEntry, promise: string, log: RekorKeyInfo): Promise<Date> {\n const integratedTime = Number(entry.integratedTime);\n const integratedDate = new Date(integratedTime * 1000);\n if (integratedDate < log.validFor.start || integratedDate > log.validFor.end) {\n throw new Error(\"Rekor key was not valid at the integrated time.\");\n }\n const signed = stringToUint8Array(\n canonicalizeJCS({\n body: entry.canonicalizedBody,\n integratedTime,\n logIndex: Number(entry.logIndex),\n logID: Uint8ArrayToHex(log.logId),\n }),\n );\n if (!(await verifySignature(log.publicKey, signed, base64ToUint8Array(promise), log.hashAlgorithm))) {\n throw new Error(\"Failed to verify the inclusion promise in the provided bundle.\");\n }\n return integratedDate;\n }\n\n // Fully verifies every entry from a trusted log and returns the SET-bound integrated times.\n // Entries from unknown logs are ignored; the threshold counts distinct log operators that verified.\n private async verifyTlogEntries(\n cert: X509Certificate,\n bundle: SigstoreBundle,\n rekor: RekorKeyInfo[],\n ): Promise<Date[]> {\n const entries = bundle.verificationMaterial.tlogEntries;\n // Only v0.1 bundles may rely on an inclusion promise alone.\n const requireProof = getBundleVersion(bundle.mediaType) !== \"0.1\";\n const operators = new Set<string>();\n const integratedTimes: Date[] = [];\n\n for (const entry of entries) {\n const logId = base64ToUint8Array(entry.logId.keyId);\n const log = rekor.find((l) => uint8ArrayEqual(l.logId, logId));\n if (!log) continue;\n\n const promise = entry.inclusionPromise?.signedEntryTimestamp;\n if (!entry.inclusionProof && (requireProof || !promise)) {\n throw new Error(\"Transparency log entry requires an inclusion proof.\");\n }\n if (promise) {\n integratedTimes.push(await this.verifySET(entry, promise, log));\n }\n if (entry.inclusionProof) {\n await verifyMerkleInclusion(entry);\n await verifyCheckpoint(entry, log);\n }\n if (entry.integratedTime && !cert.validForDate(new Date(Number(entry.integratedTime) * 1000))) {\n throw new Error(\"Artifact signing was logged outside of the certificate validity.\");\n }\n await verifyTLogBody(entry, bundle, cert);\n operators.add(log.operator);\n }\n\n const verifiedOperators = countOperators(operators);\n if (verifiedOperators < this.options.tlogThreshold) {\n throw new Error(`Not enough verified transparency logs: ${verifiedOperators} < ${this.options.tlogThreshold}`);\n }\n return integratedTimes;\n }\n\n // Shared checks: policy, transparency log, timestamps, chain at every observer time, SCTs.\n // Returns the signing certificate and the bundle's signature.\n private async verifyBundle(\n bundle: SigstoreBundle,\n policy: VerificationPolicy,\n ): Promise<{ signingCert: X509Certificate; signature: Uint8Array }> {\n assertBundle(bundle);\n if (!this.root || !this.rawRoot) {\n throw new Error(\"Sigstore root is undefined\");\n }\n\n const cert = bundle.verificationMaterial.certificate ||\n bundle.verificationMaterial.x509CertificateChain?.certificates[0];\n if (!cert) {\n throw new Error(\"No certificate found in bundle\");\n }\n const signingCert = X509Certificate.parse(base64ToUint8Array(cert.rawBytes));\n const signature = base64ToUint8Array(\n bundle.messageSignature ? bundle.messageSignature.signature : bundle.dsseEnvelope.signatures[0].sig,\n );\n\n await policy.verify(signingCert);\n\n // Observer timestamps come from SET-bound integrated times and verified RFC 3161 timestamps.\n // Rekor v2 entries carry no integrated time, so they need a TSA timestamp to be anchored at all.\n const integratedTimes = await this.verifyTlogEntries(signingCert, bundle, this.root.rekor);\n const timestamps = await verifyBundleTimestamp(\n bundle.verificationMaterial.timestampVerificationData,\n signature,\n this.rawRoot.timestampAuthorities || [],\n );\n const tsaOperators = countOperators(new Set(timestamps.map((t) => t.operator)));\n if (tsaOperators < this.options.tsaThreshold) {\n throw new Error(`Not enough verified TSA operators: ${tsaOperators} < ${this.options.tsaThreshold}`);\n }\n const observerTimes = [...integratedTimes, ...timestamps.map((t) => t.signingTime)];\n if (observerTimes.length === 0) {\n throw new Error(\"No verified observer timestamp anchors the signature in time.\");\n }\n\n // The CA window and the whole chain are checked at every observer time, never at the leaf's own notBefore.\n let certPath: X509Certificate[] = [];\n for (const ts of observerTimes) {\n certPath = await this.verifyCertificateChain(ts, signingCert, this.root.certificateAuthorities);\n }\n const issuerCert = certPath.length > 1 ? certPath[1] : certPath[0];\n const ctOperators = countOperators(await this.verifySCT(signingCert, issuerCert, this.root.ctlogs));\n if (ctOperators < this.options.ctlogThreshold) {\n throw new Error(`Not enough verified CT log operators: ${ctOperators} < ${this.options.ctlogThreshold}`);\n }\n\n return { signingCert, signature };\n }\n\n public async verifyArtifactPolicy(\n policy: VerificationPolicy,\n bundle: SigstoreBundle,\n data: Uint8Array,\n isDigestOnly: boolean = false,\n ): Promise<boolean> {\n if (isDigestOnly && data.byteLength !== 32) {\n throw new Error(\"SHA-256 digest must be exactly 32 bytes\");\n }\n const { signingCert, signature } = await this.verifyBundle(bundle, policy);\n\n // # 7 Revocation *skipping* not really a thing (unsurprisingly)\n\n // # 8 verify the signed data\n if (bundle.dsseEnvelope) {\n // Only in-toto statements are understood; other payload types must not be read as one.\n if (bundle.dsseEnvelope.payloadType !== \"application/vnd.in-toto+json\") {\n throw new Error(`Unsupported DSSE payload type: ${bundle.dsseEnvelope.payloadType}`);\n }\n const payloadBytes = base64ToUint8Array(bundle.dsseEnvelope.payload);\n const payload = JSON.parse(Uint8ArrayToString(payloadBytes));\n\n // Verify the artifact digest matches a subject in the in-toto statement\n if (!Array.isArray(payload?.subject) || payload.subject.length === 0 || payload.subject.length > MAX_SUBJECTS) {\n throw new Error(`DSSE payload must have between 1 and ${MAX_SUBJECTS} subjects`);\n }\n // Compute or extract the artifact digest\n let artifactDigest: string;\n if (isDigestOnly) {\n // data is already the digest bytes\n artifactDigest = Uint8ArrayToHex(data);\n } else {\n // data is the file content, compute the digest\n artifactDigest = Uint8ArrayToHex(await sha256(data));\n }\n\n // Every subject must carry a bounded digest map; any one of them may match the artifact.\n let matchedSubject = false;\n for (const subject of payload.subject) {\n const digests = subject?.digest;\n if (!digests || typeof digests !== \"object\" || Array.isArray(digests) || Object.keys(digests).length > MAX_SUBJECT_DIGESTS) {\n throw new Error(`Invalid DSSE subject digest map (maximum ${MAX_SUBJECT_DIGESTS} digests)`);\n }\n matchedSubject ||= typeof digests.sha256 === \"string\" && artifactDigest === digests.sha256.toLowerCase();\n }\n\n if (!matchedSubject) {\n throw new Error(\n `Artifact digest ${artifactDigest} does not match any subject in DSSE payload`\n );\n }\n\n // Create PAE (Pre-Authentication Encoding) for signature verification\n const pae = preAuthEncoding(bundle.dsseEnvelope.payloadType, payloadBytes);\n\n const publicKey = await signingCert.publicKeyObj;\n const verified = await verifySignature(publicKey, pae, signature);\n if (!verified) {\n throw new Error(\"DSSE signature verification failed\");\n }\n } else {\n // The bundle's message digest must be the digest of the artifact being verified.\n const { messageDigest } = bundle.messageSignature;\n const digest = isDigestOnly ? data : await sha256(data);\n if (messageDigest.algorithm !== \"SHA2_256\" || !uint8ArrayEqual(digest, base64ToUint8Array(messageDigest.digest))) {\n throw new Error(\"Artifact digest does not match the bundle message digest\");\n }\n const publicKey = await signingCert.publicKeyObj;\n\n if (isDigestOnly) {\n // For hashedrekord bundles, verify signature over the digest directly.\n // Uses the same elliptic.js workaround as sigstore-js conformance CLI.\n const verified = await verifySignatureOverDigest(publicKey, data, signature);\n if (!verified) {\n throw new Error(\"Error verifying signature over digest\");\n }\n } else {\n // For regular bundles, verify the signature over the artifact data\n const verified = await verifySignature(publicKey, data, signature);\n if (!verified) {\n const keyAlg = publicKey.algorithm.name || 'unknown';\n throw new Error(`Error verifying artifact signature. Key algorithm: ${keyAlg}, Data length: ${data.length}, Signature length: ${signature.length}`);\n }\n }\n }\n\n return true;\n }\n\npublic async verifyArtifact(\n identity: string,\n issuer: string,\n bundle: SigstoreBundle,\n data: Uint8Array,\n isDigestOnly: boolean = false,\n): Promise<boolean> {\n\n const policy = new AllOf([\n new Identity({ identity }),\n new AnyOf([\n new OIDCIssuerV2(issuer),\n new OIDCIssuer(issuer),\n ]),\n ]);\n\n return this.verifyArtifactPolicy(\n policy,\n bundle,\n data,\n isDigestOnly,\n );\n}\n\n \n\n /**\n * Verify a DSSE bundle using a verification policy.\n * This matches sigstore-python's verify_dsse API.\n *\n * Reference: https://github.com/sigstore/sigstore-python/blob/main/sigstore/verify/verifier.py#L388\n *\n * Unlike verify_artifact which verifies an artifact against a bundle,\n * this method verifies the DSSE envelope itself and returns the payload.\n * The caller is responsible for checking that the payload matches their\n * expected artifact (e.g., by checking subjects in an in-toto statement).\n *\n * @param bundle - The Sigstore bundle containing the DSSE envelope\n * @param policy - A verification policy to apply to the signing certificate\n * @returns The payload type and payload bytes from the verified envelope\n */\n public async verifyDsse(\n bundle: SigstoreBundle,\n policy: VerificationPolicy,\n ): Promise<{ payloadType: string; payload: Uint8Array }> {\n const { signingCert, signature } = await this.verifyBundle(bundle, policy);\n if (!bundle.dsseEnvelope) {\n throw new Error(\"Bundle does not contain a DSSE envelope\");\n }\n\n // (7) Verify the DSSE envelope signature\n const payloadBytes = base64ToUint8Array(bundle.dsseEnvelope.payload);\n const pae = preAuthEncoding(bundle.dsseEnvelope.payloadType, payloadBytes);\n\n const publicKey = await signingCert.publicKeyObj;\n const verified = await verifySignature(publicKey, pae, signature);\n if (!verified) {\n throw new Error(\"DSSE signature verification failed\");\n }\n\n // (8) Every entry MUST be of type \"dsse\" for DSSE verification\n for (const entry of bundle.verificationMaterial.tlogEntries) {\n if (entry.kindVersion.kind !== \"dsse\") {\n throw new Error(`Expected entry type dsse, got ${entry.kindVersion.kind}`);\n }\n }\n\n // Return the verified payload\n return {\n payloadType: bundle.dsseEnvelope.payloadType,\n payload: payloadBytes,\n };\n }\n}\n"]}
@@ -26,5 +26,4 @@ export interface VerifiedTimestamp {
26
26
  * @returns The verified signing times and their operators (empty if no timestamps present)
27
27
  * @throws Error if any timestamp fails verification or duplicates are found
28
28
  */
29
- export declare function verifyBundleTimestamp(timestampData: any, signature: Uint8Array, timestampAuthorities: RawTimestampAuthority[]): Promise<VerifiedTimestamp[]>;
30
- //# sourceMappingURL=tsa.d.ts.map
29
+ export declare function verifyBundleTimestamp(timestampData: unknown, signature: Uint8Array, timestampAuthorities: RawTimestampAuthority[]): Promise<VerifiedTimestamp[]>;
@@ -14,9 +14,9 @@
14
14
  */
15
15
  import { base64ToUint8Array, uint8ArrayEqual } from "@freedomofpress/crypto-browser";
16
16
  import { assertTimestampVerificationData } from "../bundle.js";
17
- import { CertificateChainVerifier, X509Certificate } from "../x509/index.js";
18
17
  import { parseValidityPeriod } from "../interfaces.js";
19
18
  import { RFC3161Timestamp } from "../rfc3161/index.js";
19
+ import { CertificateChainVerifier, X509Certificate } from "../x509/index.js";
20
20
  /**
21
21
  * Verifies an RFC3161 timestamp against a set of timestamp authorities
22
22
  *
@@ -1 +1 @@
1
- {"version":3,"file":"tsa.js","sourceRoot":"","sources":["../../src/timestamp/tsa.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tsa.js","sourceRoot":"","sources":["../../src/timestamp/tsa.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * TSA (Time-Stamping Authority) timestamp verification\n *\n * Based on sigstore-js:\n * https://github.com/sigstore/sigstore-js/blob/main/packages/verify/src/timestamp/tsa.ts\n *\n * Key differences from sigstore-js:\n * - Browser-compatible: uses Uint8Array instead of Buffer for binary data\n * - Uses Web Crypto API for all cryptographic operations\n * - Integrates with existing RFC3161 timestamp implementation\n * - Uses CertificateChainVerifier for full X.509 path validation\n * - Implements filterCertAuthorities inline (from sigstore-js/packages/verify/src/trust/filter.ts)\n * - Adds verifyBundleTimestamp for Sigstore bundle integration (new functionality)\n */\n\nimport { base64ToUint8Array, uint8ArrayEqual } from \"@freedomofpress/crypto-browser\";\n\nimport { assertTimestampVerificationData } from \"../bundle.js\";\nimport { parseValidityPeriod, RawTimestampAuthority } from \"../interfaces.js\";\nimport { RFC3161Timestamp } from \"../rfc3161/index.js\";\nimport { CertificateChainVerifier, X509Certificate } from \"../x509/index.js\";\n\n/**\n * Verifies an RFC3161 timestamp against a set of timestamp authorities\n *\n * @param timestamp - The RFC3161 timestamp to verify\n * @param data - The data that was timestamped\n * @param timestampAuthorities - List of trusted timestamp authorities\n * @returns The verified signing time\n * @throws Error if timestamp cannot be verified\n */\nexport async function verifyRFC3161Timestamp(\n timestamp: RFC3161Timestamp,\n data: Uint8Array,\n timestampAuthorities: RawTimestampAuthority[]\n): Promise<Date> {\n return (await verifyTimestamp(timestamp, data, timestampAuthorities)).signingTime;\n}\n\nexport interface VerifiedTimestamp {\n signingTime: Date;\n // Empty means unknown, which cannot add independence to named operators.\n operator: string;\n}\n\nasync function verifyTimestamp(\n timestamp: RFC3161Timestamp,\n data: Uint8Array,\n timestampAuthorities: RawTimestampAuthority[]\n): Promise<VerifiedTimestamp> {\n const signingTime = timestamp.signingTime;\n\n // Filter for CAs which were valid at the time of signing\n let validAuthorities = filterCertAuthorities(\n timestampAuthorities,\n signingTime\n );\n\n // Filter for CAs which match serial and issuer embedded in the timestamp\n validAuthorities = filterCAsBySerialAndIssuer(validAuthorities, {\n serialNumber: timestamp.signerSerialNumber,\n issuer: timestamp.signerIssuer,\n });\n\n // Check that we can verify the timestamp with AT LEAST ONE of the remaining CAs\n const verificationResults = await Promise.allSettled(\n validAuthorities.map(ca => verifyTimestampForCA(timestamp, data, ca))\n );\n\n const verified = verificationResults.findIndex(\n result => result.status === \"fulfilled\"\n );\n\n if (verified < 0) {\n const errors = verificationResults\n .filter(r => r.status === \"rejected\")\n .map(r => (r as PromiseRejectedResult).reason?.message || 'Unknown error');\n throw new Error(`Timestamp could not be verified against any trusted authority. Errors: ${errors.join(', ')}`);\n }\n\n const ca = validAuthorities[verified];\n return { signingTime, operator: ca.operator || \"\" };\n}\n\n/**\n * Filters certificate authorities to those valid at a specific time\n *\n * Adapted from sigstore-js/packages/verify/src/trust/filter.ts\n */\nfunction filterCertAuthorities(\n authorities: RawTimestampAuthority[],\n validAt: Date\n): RawTimestampAuthority[] {\n return authorities.filter(ca => {\n const { start, end } = parseValidityPeriod(ca.validFor);\n return start <= validAt && validAt <= end;\n });\n}\n\n/**\n * Filters certificate authorities by serial number and issuer\n *\n * Only checks the LEAF certificate (TSA signing cert), not the entire chain.\n * This matches the sigstore-js reference implementation.\n */\nfunction filterCAsBySerialAndIssuer(\n timestampAuthorities: RawTimestampAuthority[],\n criteria: { serialNumber: Uint8Array; issuer: Uint8Array }\n): RawTimestampAuthority[] {\n return timestampAuthorities.filter(ca => {\n if (!ca.certChain || ca.certChain.certificates.length === 0) {\n return false;\n }\n\n const leafCert = X509Certificate.parse(\n base64ToUint8Array(ca.certChain.certificates[0].rawBytes)\n );\n\n return uint8ArrayEqual(leafCert.serialNumber, criteria.serialNumber) &&\n uint8ArrayEqual(leafCert.issuer, criteria.issuer);\n });\n}\n\n/**\n * Verifies a timestamp against a specific certificate authority\n */\nasync function verifyTimestampForCA(\n timestamp: RFC3161Timestamp,\n data: Uint8Array,\n ca: RawTimestampAuthority\n): Promise<void> {\n if (!ca.certChain || ca.certChain.certificates.length === 0) {\n throw new Error(\"Certificate authority missing certificate chain\");\n }\n\n const leafCert = X509Certificate.parse(\n base64ToUint8Array(ca.certChain.certificates[0].rawBytes)\n );\n const signingTime = timestamp.signingTime;\n\n const trustedCerts = ca.certChain.certificates\n .slice(1)\n .map(cert => X509Certificate.parse(base64ToUint8Array(cert.rawBytes)));\n\n try {\n const verifier = new CertificateChainVerifier({\n untrustedCert: leafCert,\n trustedCerts: trustedCerts,\n timestamp: signingTime,\n });\n await verifier.verify();\n } catch (e) {\n throw new Error(`TSA certificate chain verification failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n const publicKey = await leafCert.publicKeyObj;\n\n await timestamp.verify(data, publicKey);\n}\n\n/**\n * Verifies all timestamps in a bundle's timestamp verification data\n *\n * Matches sigstore-js behavior: all timestamps must successfully verify.\n * Reference: https://github.com/sigstore/sigstore-js/blob/main/packages/verify/src/verifier.ts#L64-L108\n *\n * @param timestampData - The timestamp verification data from the bundle\n * @param signature - The signature being verified\n * @param timestampAuthorities - List of trusted timestamp authorities\n * @returns The verified signing times and their operators (empty if no timestamps present)\n * @throws Error if any timestamp fails verification or duplicates are found\n */\nexport async function verifyBundleTimestamp(\n timestampData: unknown,\n signature: Uint8Array,\n timestampAuthorities: RawTimestampAuthority[]\n): Promise<VerifiedTimestamp[]> {\n assertTimestampVerificationData(timestampData);\n if (!timestampData?.rfc3161Timestamps?.length) {\n return [];\n }\n\n // Verify ALL timestamps - each must succeed (matches sigstore-js behavior)\n // Collect verification results for duplicate checking after verification\n // Reference: https://github.com/sigstore/sigstore-js/blob/main/packages/verify/src/verifier.ts#L86-L92\n const verifiedResults: Array<VerifiedTimestamp & { signerSerialNumber: string }> = [];\n\n for (const tsData of timestampData.rfc3161Timestamps) {\n // Decode the base64-encoded timestamp\n const timestampBytes = base64ToUint8Array(tsData.signedTimestamp);\n const timestamp = RFC3161Timestamp.parse(timestampBytes);\n\n verifiedResults.push({\n ...(await verifyTimestamp(timestamp, signature, timestampAuthorities)),\n signerSerialNumber: Array.from(timestamp.signerSerialNumber).join(','),\n });\n }\n\n // Check for duplicate timestamps using deep equality on parsed values\n // sigstore-js uses isDeepStrictEqual on {type, logID, timestamp} objects\n for (let i = 0; i < verifiedResults.length; i++) {\n for (let j = i + 1; j < verifiedResults.length; j++) {\n if (\n verifiedResults[i].signingTime.getTime() === verifiedResults[j].signingTime.getTime() &&\n verifiedResults[i].signerSerialNumber === verifiedResults[j].signerSerialNumber\n ) {\n throw new Error(\"Duplicate TSA timestamp detected\");\n }\n }\n }\n\n return verifiedResults;\n}\n"]}
@@ -7,4 +7,3 @@ export interface RekorEntry {
7
7
  }
8
8
  export declare function verifyTLogBody(entry: TLogEntry, bundle: SigstoreBundle, cert: X509Certificate): Promise<void>;
9
9
  export declare function assertLoggedCertificate(cert: X509Certificate, encoded: unknown, pem: boolean): void;
10
- //# sourceMappingURL=body.d.ts.map
package/dist/tlog/body.js CHANGED
@@ -10,8 +10,8 @@
10
10
  */
11
11
  import { base64Decode, base64ToUint8Array, Uint8ArrayToString } from "@freedomofpress/crypto-browser";
12
12
  import { X509Certificate } from "../x509/cert.js";
13
- import { verifyHashedRekordBody } from "./hashedrekord.js";
14
13
  import { verifyDSSEBody } from "./dsse.js";
14
+ import { verifyHashedRekordBody } from "./hashedrekord.js";
15
15
  import { verifyIntotoBody } from "./intoto.js";
16
16
  // Checks that the entry body matches the bundle content and was logged under the signing certificate.
17
17
  export async function verifyTLogBody(entry, bundle, cert) {
@@ -1 +1 @@
1
- {"version":3,"file":"body.js","sourceRoot":"","sources":["../../src/tlog/body.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEtG,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAQ/C,sGAAsG;AACtG,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAgB,EAChB,MAAsB,EACtB,IAAqB;IAErB,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAE7C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC;IAE5C,IAAI,IAAI,KAAK,UAAU,CAAC,IAAI,IAAI,OAAO,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CACb,qCAAqC,IAAI,IAAI,OAAO,eAAe,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,UAAU,EAAE,CAC9G,CAAC;IACJ,CAAC;IAED,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,cAAc;YACjB,OAAO,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC1D,KAAK,MAAM;YACT,OAAO,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAClD,KAAK,QAAQ;YACX,OAAO,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACpD;YACE,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,wHAAwH;AACxH,MAAM,UAAU,uBAAuB,CACrC,IAAqB,EACrB,OAAgB,EAChB,GAAY;IAEZ,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAgB;IAC1C,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAe,CAAC;QAEzD,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,uCAAuC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAChG,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"body.js","sourceRoot":"","sources":["../../src/tlog/body.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGtG,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAQ/C,sGAAsG;AACtG,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAgB,EAChB,MAAsB,EACtB,IAAqB;IAErB,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAE7C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC;IAE5C,IAAI,IAAI,KAAK,UAAU,CAAC,IAAI,IAAI,OAAO,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CACb,qCAAqC,IAAI,IAAI,OAAO,eAAe,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,UAAU,EAAE,CAC9G,CAAC;IACJ,CAAC;IAED,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,cAAc;YACjB,OAAO,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC1D,KAAK,MAAM;YACT,OAAO,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAClD,KAAK,QAAQ;YACX,OAAO,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACpD;YACE,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,wHAAwH;AACxH,MAAM,UAAU,uBAAuB,CACrC,IAAqB,EACrB,OAAgB,EAChB,GAAY;IAEZ,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAgB;IAC1C,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAe,CAAC;QAEzD,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,uCAAuC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAChG,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["/*\n * Transparency log body verification\n *\n * Based on sigstore-js:\n * https://github.com/sigstore/sigstore-js/blob/main/packages/verify/src/tlog/index.ts\n *\n * Key differences from sigstore-js:\n * - Browser-compatible: uses Uint8Array instead of Buffer for binary data\n * - Direct bundle comparison instead of SignatureContent abstraction\n */\n\nimport { base64Decode, base64ToUint8Array, Uint8ArrayToString } from \"@freedomofpress/crypto-browser\";\n\nimport type { SigstoreBundle, TLogEntry } from \"../bundle.js\";\nimport { X509Certificate } from \"../x509/cert.js\";\nimport { verifyDSSEBody } from \"./dsse.js\";\nimport { verifyHashedRekordBody } from \"./hashedrekord.js\";\nimport { verifyIntotoBody } from \"./intoto.js\";\n\nexport interface RekorEntry {\n apiVersion: string;\n kind: string;\n spec: unknown;\n}\n\n// Checks that the entry body matches the bundle content and was logged under the signing certificate.\nexport async function verifyTLogBody(\n entry: TLogEntry,\n bundle: SigstoreBundle,\n cert: X509Certificate,\n): Promise<void> {\n const rekorEntry = parseCanonicalBody(entry);\n\n const { kind, version } = entry.kindVersion;\n\n if (kind !== rekorEntry.kind || version !== rekorEntry.apiVersion) {\n throw new Error(\n `kind/version mismatch - expected: ${kind}/${version}, received: ${rekorEntry.kind}/${rekorEntry.apiVersion}`\n );\n }\n\n switch (rekorEntry.kind) {\n case \"hashedrekord\":\n return verifyHashedRekordBody(rekorEntry, bundle, cert);\n case \"dsse\":\n return verifyDSSEBody(rekorEntry, bundle, cert);\n case \"intoto\":\n return verifyIntotoBody(rekorEntry, bundle, cert);\n default:\n throw new Error(`Unsupported TLog entry kind: ${rekorEntry.kind}`);\n }\n}\n\n// Compares the certificate recorded in the entry (base64 DER, or base64 PEM for Rekor v1) with the signing certificate.\nexport function assertLoggedCertificate(\n cert: X509Certificate,\n encoded: unknown,\n pem: boolean,\n): void {\n if (typeof encoded !== \"string\" || encoded === \"\") {\n throw new Error(\"TLog entry does not record the signing certificate\");\n }\n const bytes = base64ToUint8Array(encoded);\n const logged = X509Certificate.parse(pem ? Uint8ArrayToString(bytes) : bytes);\n if (!cert.equals(logged)) {\n throw new Error(\"Certificate in TLog entry does not match the signing certificate\");\n }\n}\n\nfunction parseCanonicalBody(entry: TLogEntry): RekorEntry {\n try {\n const decodedBody = base64Decode(entry.canonicalizedBody);\n const rekorEntry = JSON.parse(decodedBody) as RekorEntry;\n\n if (!rekorEntry.apiVersion || !rekorEntry.kind || !rekorEntry.spec) {\n throw new Error(\"Invalid Rekor entry structure\");\n }\n\n return rekorEntry;\n } catch (error) {\n throw new Error(\n `Failed to parse canonicalized body: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n"]}
@@ -20,4 +20,3 @@ export declare class LogCheckpoint {
20
20
  static fromString(note: string): LogCheckpoint;
21
21
  }
22
22
  export declare function verifyCheckpoint(entry: TLogEntry, log: RekorKeyInfo): Promise<void>;
23
- //# sourceMappingURL=checkpoint.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/tlog/checkpoint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/tlog/checkpoint.ts"],"names":[],"mappings":"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","sourcesContent":["/*\nCheckpoint verification for transparency log entries.\n\nAdapted from sigstore-js for browser compatibility:\nhttps://github.com/sigstore/sigstore-js/blob/main/packages/verify/src/timestamp/checkpoint.ts\n\nKey differences:\n- Uses Uint8Array instead of Buffer\n- Uses Web Crypto API instead of Node.js crypto module\n\nFollows the signed note format specification:\nhttps://github.com/transparency-dev/formats/blob/main/log/README.md\n*/\n\nimport {\n base64ToUint8Array,\n stringToUint8Array,\n uint8ArrayEqual,\n verifySignature,\n} from \"@freedomofpress/crypto-browser\";\n\nimport type { TLogEntry } from \"../bundle.js\";\nimport type { RekorKeyInfo } from \"../interfaces.js\";\n\n// Signed note format per https://github.com/transparency-dev/formats\n// Body is separated from signatures by a blank line\nconst CHECKPOINT_SEPARATOR = \"\\n\\n\";\n// Signature lines format: \"— <identity> <base64(key_hint+signature)>\\n\"\n// \\u2014 is the em-dash character (—)\nconst SIGNATURE_REGEX = /\\u2014 (\\S+) (\\S+)\\n/g;\n\nexport interface TLogSignature {\n name: string;\n keyHint: Uint8Array;\n signature: Uint8Array;\n}\n\n// Signed checkpoint note with cryptographic signatures\nexport class SignedNote {\n readonly note: string;\n readonly signatures: TLogSignature[];\n\n constructor(note: string, signatures: TLogSignature[]) {\n this.note = note;\n this.signatures = signatures;\n }\n\n static fromString(envelope: string): SignedNote {\n if (!envelope.includes(CHECKPOINT_SEPARATOR)) {\n throw new Error(\"Missing checkpoint separator\");\n }\n\n // Split body from signature lines at blank line\n const split = envelope.indexOf(CHECKPOINT_SEPARATOR);\n const header = envelope.slice(0, split + 1);\n const data = envelope.slice(split + CHECKPOINT_SEPARATOR.length);\n\n // Parse signature lines: \"— <identity> <base64(key_hint+signature)>\\n\"\n const matches = data.matchAll(SIGNATURE_REGEX);\n\n const signatures: TLogSignature[] = [];\n for (const match of matches) {\n const [, name, signature] = match;\n const sigBytes = base64ToUint8Array(signature);\n\n // First 4 bytes are key hint (SHA256 hash prefix), rest is signature\n if (sigBytes.length < 5) {\n throw new Error(\"Malformed checkpoint signature\");\n }\n\n signatures.push({\n name,\n keyHint: sigBytes.subarray(0, 4),\n signature: sigBytes.subarray(4),\n });\n }\n\n if (signatures.length === 0) {\n throw new Error(\"No signatures found in checkpoint\");\n }\n\n return new SignedNote(header, signatures);\n }\n}\n\n// Parsed checkpoint containing tree state (origin, size, root hash)\nexport class LogCheckpoint {\n readonly origin: string;\n readonly logSize: bigint;\n readonly logHash: Uint8Array;\n readonly rest: string[];\n\n constructor(\n origin: string,\n logSize: bigint,\n logHash: Uint8Array,\n rest: string[]\n ) {\n this.origin = origin;\n this.logSize = logSize;\n this.logHash = logHash;\n this.rest = rest;\n }\n\n static fromString(note: string): LogCheckpoint {\n const lines = note.trimEnd().split(\"\\n\");\n\n if (lines.length < 3) {\n throw new Error(\"Too few lines in checkpoint header\");\n }\n\n const origin = lines[0];\n const logSize = BigInt(lines[1]);\n const rootHash = base64ToUint8Array(lines[2]);\n const rest = lines.slice(3);\n\n return new LogCheckpoint(origin, logSize, rootHash, rest);\n }\n}\n\n// Verifies that the checkpoint is signed by the entry's log and describes the same tree as the inclusion proof.\nexport async function verifyCheckpoint(\n entry: TLogEntry,\n log: RekorKeyInfo\n): Promise<void> {\n const proof = entry.inclusionProof;\n if (!proof?.checkpoint?.envelope) {\n throw new Error(\"Missing checkpoint in inclusion proof\");\n }\n\n const signedNote = SignedNote.fromString(proof.checkpoint.envelope);\n const checkpoint = LogCheckpoint.fromString(signedNote.note);\n const data = stringToUint8Array(signedNote.note);\n\n // Signatures from other parties (e.g. witnesses) are ignored; the key hint is the first 4 bytes of the log ID.\n let valid = false;\n for (const sig of signedNote.signatures) {\n if (\n uint8ArrayEqual(sig.keyHint, log.logId.subarray(0, 4)) &&\n (await verifySignature(log.publicKey, data, sig.signature, log.hashAlgorithm))\n ) {\n valid = true;\n }\n }\n if (!valid) {\n throw new Error(\"Invalid checkpoint signature\");\n }\n\n if (\n checkpoint.logSize !== BigInt(proof.treeSize) ||\n !uint8ArrayEqual(checkpoint.logHash, base64ToUint8Array(proof.rootHash))\n ) {\n throw new Error(\"Checkpoint does not match inclusion proof\");\n }\n}\n"]}
@@ -2,4 +2,3 @@ import type { SigstoreBundle } from "../bundle.js";
2
2
  import type { X509Certificate } from "../x509/cert.js";
3
3
  import { type RekorEntry } from "./body.js";
4
4
  export declare function verifyDSSEBody(entry: RekorEntry, bundle: SigstoreBundle, cert: X509Certificate): Promise<void>;
5
- //# sourceMappingURL=dsse.d.ts.map
package/dist/tlog/dsse.js CHANGED
@@ -7,10 +7,9 @@
7
7
  * Key differences from sigstore-js:
8
8
  * - Browser-compatible: uses Uint8Array instead of Buffer for binary data
9
9
  * - Direct bundle field comparison instead of SignatureContent abstraction
10
- * - Uses crypto.subtle.digest for hash computation instead of Node.js crypto
11
10
  * - Adds verifyDSSE002Body() - new functionality (reference only supports v0.0.1)
12
11
  */
13
- import { base64ToUint8Array, hexToUint8Array, uint8ArrayEqual } from "@freedomofpress/crypto-browser";
12
+ import { base64ToUint8Array, digest, hexToUint8Array, uint8ArrayEqual } from "@freedomofpress/crypto-browser";
14
13
  import { getHashAlgorithm } from "../interfaces.js";
15
14
  import { assertLoggedCertificate } from "./body.js";
16
15
  export async function verifyDSSEBody(entry, bundle, cert) {
@@ -47,7 +46,7 @@ async function verifyDSSE001Body(entry, bundle, cert) {
47
46
  const hashAlg = getHashAlgorithm(entry.spec.payloadHash.algorithm);
48
47
  const tlogHashBytes = hexToUint8Array(entry.spec.payloadHash.value);
49
48
  const payloadBytes = base64ToUint8Array(bundle.dsseEnvelope.payload);
50
- const bundleHashBytes = new Uint8Array(await crypto.subtle.digest(hashAlg, payloadBytes));
49
+ const bundleHashBytes = await digest(hashAlg, payloadBytes);
51
50
  if (!uint8ArrayEqual(tlogHashBytes, bundleHashBytes)) {
52
51
  throw new Error("DSSE payload hash mismatch between TLog entry and bundle");
53
52
  }
@@ -66,6 +65,9 @@ async function verifyDSSE002Body(entry, bundle, cert) {
66
65
  }
67
66
  assertLoggedCertificate(cert, spec.signatures[0].verifier?.x509Certificate?.rawBytes, false);
68
67
  const tlogSig = spec.signatures[0].content;
68
+ if (typeof tlogSig !== "string") {
69
+ throw new Error("DSSE v0.0.2 entry signature missing content");
70
+ }
69
71
  const tlogSigBytes = base64ToUint8Array(tlogSig);
70
72
  if (bundle.dsseEnvelope.signatures.length === 0) {
71
73
  throw new Error("Bundle DSSE envelope missing signatures");
@@ -80,7 +82,7 @@ async function verifyDSSE002Body(entry, bundle, cert) {
80
82
  const hashAlg = getHashAlgorithm(spec.payloadHash.algorithm);
81
83
  const tlogHashBytes = base64ToUint8Array(spec.payloadHash.digest);
82
84
  const payloadBytes = base64ToUint8Array(bundle.dsseEnvelope.payload);
83
- const bundleHashBytes = new Uint8Array(await crypto.subtle.digest(hashAlg, payloadBytes));
85
+ const bundleHashBytes = await digest(hashAlg, payloadBytes);
84
86
  if (!uint8ArrayEqual(tlogHashBytes, bundleHashBytes)) {
85
87
  throw new Error("DSSE payload hash mismatch between TLog entry and bundle (v0.0.2)");
86
88
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dsse.js","sourceRoot":"","sources":["../../src/tlog/dsse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dsse.js","sourceRoot":"","sources":["../../src/tlog/dsse.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * DSSE transparency log entry verification\n *\n * Based on sigstore-js:\n * https://github.com/sigstore/sigstore-js/blob/main/packages/verify/src/tlog/dsse.ts\n *\n * Key differences from sigstore-js:\n * - Browser-compatible: uses Uint8Array instead of Buffer for binary data\n * - Direct bundle field comparison instead of SignatureContent abstraction\n * - Adds verifyDSSE002Body() - new functionality (reference only supports v0.0.1)\n */\n\nimport { base64ToUint8Array, digest, hexToUint8Array, uint8ArrayEqual } from \"@freedomofpress/crypto-browser\";\n\nimport type { SigstoreBundle } from \"../bundle.js\";\nimport { getHashAlgorithm } from \"../interfaces.js\";\nimport type { X509Certificate } from \"../x509/cert.js\";\nimport { assertLoggedCertificate, type RekorEntry } from \"./body.js\";\n\n// Shape of the Rekor v2 dsse_v002 entry spec, validated field by field below.\ntype DsseV002Spec = {\n payloadHash?: { algorithm?: string; digest?: string };\n signatures?: { content?: string; verifier?: { x509Certificate?: { rawBytes?: string } } }[];\n};\n\ninterface DSSESpec {\n signatures?: Array<{\n signature: string;\n verifier?: string;\n keyid?: string;\n }>;\n payloadHash?: {\n algorithm: string;\n value: string;\n };\n envelopeHash?: {\n algorithm: string;\n value: string;\n };\n}\n\ninterface DSSEEntry extends RekorEntry {\n apiVersion: \"0.0.1\" | \"0.0.2\";\n kind: \"dsse\";\n spec: DSSESpec;\n}\n\nexport async function verifyDSSEBody(\n entry: RekorEntry,\n bundle: SigstoreBundle,\n cert: X509Certificate,\n): Promise<void> {\n const dsseEntry = entry as DSSEEntry;\n\n switch (dsseEntry.apiVersion) {\n case \"0.0.1\":\n return verifyDSSE001Body(dsseEntry, bundle, cert);\n case \"0.0.2\":\n return verifyDSSE002Body(dsseEntry, bundle, cert);\n default:\n throw new Error(\n `Unsupported dsse version: ${dsseEntry.apiVersion}`\n );\n }\n}\n\nasync function verifyDSSE001Body(\n entry: DSSEEntry,\n bundle: SigstoreBundle,\n cert: X509Certificate,\n): Promise<void> {\n if (!bundle.dsseEnvelope) {\n throw new Error(\"Bundle missing dsseEnvelope for DSSE entry\");\n }\n\n if (!entry.spec.signatures || entry.spec.signatures.length !== 1) {\n throw new Error(\"DSSE entry must have exactly one signature\");\n }\n assertLoggedCertificate(cert, entry.spec.signatures[0].verifier, true);\n\n const tlogSig = entry.spec.signatures[0].signature;\n const tlogSigBytes = base64ToUint8Array(tlogSig);\n\n if (bundle.dsseEnvelope.signatures.length === 0) {\n throw new Error(\"Bundle DSSE envelope missing signatures\");\n }\n\n const bundleSigBytes = base64ToUint8Array(bundle.dsseEnvelope.signatures[0].sig);\n\n if (!uint8ArrayEqual(tlogSigBytes, bundleSigBytes)) {\n throw new Error(\"DSSE signature mismatch between TLog entry and bundle\");\n }\n\n if (!entry.spec.payloadHash?.value || !entry.spec.payloadHash?.algorithm) {\n throw new Error(\"DSSE entry missing payloadHash or algorithm\");\n }\n\n const hashAlg = getHashAlgorithm(entry.spec.payloadHash.algorithm);\n const tlogHashBytes = hexToUint8Array(entry.spec.payloadHash.value);\n\n const payloadBytes = base64ToUint8Array(bundle.dsseEnvelope.payload);\n const bundleHashBytes = await digest(hashAlg, payloadBytes);\n\n if (!uint8ArrayEqual(tlogHashBytes, bundleHashBytes)) {\n throw new Error(\"DSSE payload hash mismatch between TLog entry and bundle\");\n }\n}\n\n// New functionality for DSSE v0.0.2 (not in sigstore-js reference, which only supports v0.0.1)\nasync function verifyDSSE002Body(\n entry: DSSEEntry,\n bundle: SigstoreBundle,\n cert: X509Certificate,\n): Promise<void> {\n if (!bundle.dsseEnvelope) {\n throw new Error(\"Bundle missing dsseEnvelope for DSSE v0.0.2 entry\");\n }\n\n const spec = (entry.spec as { dsseV002?: DsseV002Spec }).dsseV002;\n if (!spec) {\n throw new Error(\"DSSE v0.0.2 entry missing dsseV002 spec\");\n }\n\n if (!spec.signatures || spec.signatures.length !== 1) {\n throw new Error(\"DSSE v0.0.2 entry must have exactly one signature\");\n }\n assertLoggedCertificate(cert, spec.signatures[0].verifier?.x509Certificate?.rawBytes, false);\n\n const tlogSig = spec.signatures[0].content;\n if (typeof tlogSig !== \"string\") {\n throw new Error(\"DSSE v0.0.2 entry signature missing content\");\n }\n const tlogSigBytes = base64ToUint8Array(tlogSig);\n\n if (bundle.dsseEnvelope.signatures.length === 0) {\n throw new Error(\"Bundle DSSE envelope missing signatures\");\n }\n\n const bundleSigBytes = base64ToUint8Array(bundle.dsseEnvelope.signatures[0].sig);\n\n if (!uint8ArrayEqual(tlogSigBytes, bundleSigBytes)) {\n throw new Error(\"DSSE signature mismatch between TLog entry and bundle (v0.0.2)\");\n }\n\n if (!spec.payloadHash?.digest || !spec.payloadHash?.algorithm) {\n throw new Error(\"DSSE v0.0.2 entry missing payloadHash or algorithm\");\n }\n\n const hashAlg = getHashAlgorithm(spec.payloadHash.algorithm);\n const tlogHashBytes = base64ToUint8Array(spec.payloadHash.digest);\n\n const payloadBytes = base64ToUint8Array(bundle.dsseEnvelope.payload);\n const bundleHashBytes = await digest(hashAlg, payloadBytes);\n\n if (!uint8ArrayEqual(tlogHashBytes, bundleHashBytes)) {\n throw new Error(\"DSSE payload hash mismatch between TLog entry and bundle (v0.0.2)\");\n }\n}\n"]}
@@ -2,4 +2,3 @@ import type { SigstoreBundle } from "../bundle.js";
2
2
  import type { X509Certificate } from "../x509/cert.js";
3
3
  import { type RekorEntry } from "./body.js";
4
4
  export declare function verifyHashedRekordBody(entry: RekorEntry, bundle: SigstoreBundle, cert: X509Certificate): Promise<void>;
5
- //# sourceMappingURL=hashedrekord.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hashedrekord.js","sourceRoot":"","sources":["../../src/tlog/hashedrekord.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hashedrekord.js","sourceRoot":"","sources":["../../src/tlog/hashedrekord.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * HashedRekord transparency log entry verification\n *\n * Based on sigstore-js:\n * https://github.com/sigstore/sigstore-js/blob/main/packages/verify/src/tlog/hashedrekord.ts\n *\n * Key differences from sigstore-js:\n * - Browser-compatible: uses Uint8Array instead of Buffer for binary data\n * - Direct bundle field comparison instead of SignatureContent abstraction\n * - Adds verifyHashedRekordV002Body() - new functionality (reference only supports v0.0.1)\n */\n\nimport { base64ToUint8Array, hexToUint8Array, uint8ArrayEqual } from \"@freedomofpress/crypto-browser\";\n\nimport type { SigstoreBundle } from \"../bundle.js\";\nimport type { X509Certificate } from \"../x509/cert.js\";\nimport { assertLoggedCertificate, type RekorEntry } from \"./body.js\";\n\ninterface HashedRekordSpec {\n signature: {\n content: string;\n publicKey: {\n content: string;\n };\n };\n data: {\n hash: {\n algorithm: string;\n value: string;\n };\n };\n}\n\ninterface HashedRekordEntry extends RekorEntry {\n apiVersion: \"0.0.1\" | \"0.0.2\";\n kind: \"hashedrekord\";\n spec: HashedRekordSpec | HashedRekordV002Spec;\n}\n\ninterface HashedRekordV002Spec {\n hashedRekordV002: {\n signature: {\n content: string;\n verifier?: {\n x509Certificate?: {\n rawBytes: string;\n };\n };\n };\n data: {\n algorithm: string;\n digest: string;\n };\n };\n}\n\nexport async function verifyHashedRekordBody(\n entry: RekorEntry,\n bundle: SigstoreBundle,\n cert: X509Certificate,\n): Promise<void> {\n const hashedRekordEntry = entry as HashedRekordEntry;\n\n switch (hashedRekordEntry.apiVersion) {\n case \"0.0.1\":\n return verifyHashedRekordV001Body(hashedRekordEntry, bundle, cert);\n case \"0.0.2\":\n return verifyHashedRekordV002Body(hashedRekordEntry, bundle, cert);\n default:\n throw new Error(\n `Unsupported hashedrekord version: ${hashedRekordEntry.apiVersion}`\n );\n }\n}\n\nfunction verifyHashedRekordV001Body(\n entry: HashedRekordEntry,\n bundle: SigstoreBundle,\n cert: X509Certificate,\n): void {\n const spec = entry.spec as HashedRekordSpec;\n if (!bundle.messageSignature) {\n throw new Error(\"Bundle missing messageSignature for hashedrekord entry\");\n }\n assertLoggedCertificate(cert, spec.signature?.publicKey?.content, true);\n\n const tlogSig = spec.signature.content || \"\";\n const tlogSigBytes = base64ToUint8Array(tlogSig);\n const bundleSigBytes = base64ToUint8Array(bundle.messageSignature.signature);\n\n if (!uint8ArrayEqual(tlogSigBytes, bundleSigBytes)) {\n throw new Error(\"Signature mismatch between TLog entry and bundle\");\n }\n\n const tlogDigest = spec.data.hash?.value || \"\";\n const tlogDigestBytes = hexToUint8Array(tlogDigest);\n const bundleDigestBytes = base64ToUint8Array(\n bundle.messageSignature.messageDigest.digest\n );\n\n if (!uint8ArrayEqual(tlogDigestBytes, bundleDigestBytes)) {\n throw new Error(\"Digest mismatch between TLog entry and bundle\");\n }\n}\n\n// New functionality for HashedRekord v0.0.2 (not in sigstore-js reference, which only supports v0.0.1)\nfunction verifyHashedRekordV002Body(\n entry: HashedRekordEntry,\n bundle: SigstoreBundle,\n cert: X509Certificate,\n): void {\n const spec = (entry.spec as HashedRekordV002Spec).hashedRekordV002;\n if (!bundle.messageSignature) {\n throw new Error(\"Bundle missing messageSignature for hashedrekord v0.0.2 entry\");\n }\n assertLoggedCertificate(cert, spec?.signature?.verifier?.x509Certificate?.rawBytes, false);\n\n // NOTE: HashedRekord v0.0.2 uses single base64 encoding (unlike intoto which is double-encoded)\n // Verified against Sigstore conformance test suite bundles\n const tlogSig = spec.signature.content || \"\";\n const tlogSigBytes = base64ToUint8Array(tlogSig);\n const bundleSigBytes = base64ToUint8Array(bundle.messageSignature.signature);\n\n if (!uint8ArrayEqual(tlogSigBytes, bundleSigBytes)) {\n throw new Error(\"Signature mismatch between TLog entry and bundle (v0.0.2)\");\n }\n\n const tlogDigest = spec.data.digest || \"\";\n const tlogDigestBytes = base64ToUint8Array(tlogDigest);\n const bundleDigestBytes = base64ToUint8Array(\n bundle.messageSignature.messageDigest.digest\n );\n\n if (!uint8ArrayEqual(tlogDigestBytes, bundleDigestBytes)) {\n throw new Error(\"Digest mismatch between TLog entry and bundle (v0.0.2)\");\n }\n}\n"]}
@@ -2,4 +2,3 @@ import type { SigstoreBundle } from "../bundle.js";
2
2
  import type { X509Certificate } from "../x509/cert.js";
3
3
  import { type RekorEntry } from "./body.js";
4
4
  export declare function verifyIntotoBody(entry: RekorEntry, bundle: SigstoreBundle, cert: X509Certificate): Promise<void>;
5
- //# sourceMappingURL=intoto.d.ts.map
@@ -7,9 +7,8 @@
7
7
  * Key differences from sigstore-js:
8
8
  * - Browser-compatible: uses Uint8Array instead of Buffer for binary data
9
9
  * - Direct bundle field comparison instead of SignatureContent abstraction
10
- * - Uses crypto.subtle.digest for hash computation instead of Node.js crypto
11
10
  */
12
- import { base64Decode, base64ToUint8Array, hexToUint8Array, uint8ArrayEqual } from "@freedomofpress/crypto-browser";
11
+ import { base64Decode, base64ToUint8Array, digest, hexToUint8Array, uint8ArrayEqual } from "@freedomofpress/crypto-browser";
13
12
  import { getHashAlgorithm } from "../interfaces.js";
14
13
  import { assertLoggedCertificate } from "./body.js";
15
14
  export async function verifyIntotoBody(entry, bundle, cert) {
@@ -46,7 +45,7 @@ export async function verifyIntotoBody(entry, bundle, cert) {
46
45
  const hashAlg = getHashAlgorithm(intotoEntry.spec.content.payloadHash.algorithm);
47
46
  const tlogHashBytes = hexToUint8Array(intotoEntry.spec.content.payloadHash.value);
48
47
  const payloadBytes = base64ToUint8Array(bundle.dsseEnvelope.payload);
49
- const bundleHashBytes = new Uint8Array(await crypto.subtle.digest(hashAlg, payloadBytes));
48
+ const bundleHashBytes = await digest(hashAlg, payloadBytes);
50
49
  if (!uint8ArrayEqual(tlogHashBytes, bundleHashBytes)) {
51
50
  throw new Error("Intoto payload hash mismatch between TLog entry and bundle");
52
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"intoto.js","sourceRoot":"","sources":["../../src/tlog/intoto.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACpH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,uBAAuB,EAAmB,MAAM,WAAW,CAAC;AAiCrE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAiB,EACjB,MAAsB,EACtB,IAAqB;IAErB,MAAM,WAAW,GAAG,KAAoB,CAAC;IAEzC,IAAI,WAAW,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,+BAA+B,WAAW,CAAC,UAAU,EAAE,CACxD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAEvD,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,uBAAuB,CAAC,IAAI,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE1E,mEAAmE;IACnE,qDAAqD;IACrD,sEAAsE;IACtE,0DAA0D;IAC1D,MAAM,aAAa,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACrD,MAAM,cAAc,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,+DAA+D;IACnH,MAAM,YAAY,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC,4CAA4C;IAErG,IAAI,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEjF,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACjF,MAAM,aAAa,GAAG,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAElF,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACrE,MAAM,eAAe,GAAG,IAAI,UAAU,CACpC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,YAA4B,CAAC,CAClE,CAAC;QAEF,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,eAAe,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"intoto.js","sourceRoot":"","sources":["../../src/tlog/intoto.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAG5H,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,uBAAuB,EAAmB,MAAM,WAAW,CAAC;AAiCrE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAiB,EACjB,MAAsB,EACtB,IAAqB;IAErB,MAAM,WAAW,GAAG,KAAoB,CAAC;IAEzC,IAAI,WAAW,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,+BAA+B,WAAW,CAAC,UAAU,EAAE,CACxD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAEvD,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,uBAAuB,CAAC,IAAI,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE1E,mEAAmE;IACnE,qDAAqD;IACrD,sEAAsE;IACtE,0DAA0D;IAC1D,MAAM,aAAa,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACrD,MAAM,cAAc,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,+DAA+D;IACnH,MAAM,YAAY,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC,4CAA4C;IAErG,IAAI,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEjF,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACjF,MAAM,aAAa,GAAG,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAElF,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACrE,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAE5D,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,eAAe,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["/*\n * Intoto transparency log entry verification\n *\n * Based on sigstore-js:\n * https://github.com/sigstore/sigstore-js/blob/main/packages/verify/src/tlog/intoto.ts\n *\n * Key differences from sigstore-js:\n * - Browser-compatible: uses Uint8Array instead of Buffer for binary data\n * - Direct bundle field comparison instead of SignatureContent abstraction\n */\n\nimport { base64Decode, base64ToUint8Array, digest, hexToUint8Array, uint8ArrayEqual } from \"@freedomofpress/crypto-browser\";\n\nimport type { SigstoreBundle } from \"../bundle.js\";\nimport { getHashAlgorithm } from \"../interfaces.js\";\nimport type { X509Certificate } from \"../x509/cert.js\";\nimport { assertLoggedCertificate, type RekorEntry } from \"./body.js\";\n\ninterface IntotoEnvelope {\n payload: string;\n payloadType: string;\n signatures: Array<{\n keyid?: string;\n sig: string;\n publicKey?: string;\n }>;\n}\n\ninterface IntotoSpec {\n content: {\n envelope: IntotoEnvelope;\n hash?: {\n algorithm: string;\n value: string;\n };\n payloadHash?: {\n algorithm: string;\n value: string;\n };\n };\n publicKey?: string;\n}\n\ninterface IntotoEntry extends RekorEntry {\n apiVersion: \"0.0.2\";\n kind: \"intoto\";\n spec: IntotoSpec;\n}\n\nexport async function verifyIntotoBody(\n entry: RekorEntry,\n bundle: SigstoreBundle,\n cert: X509Certificate,\n): Promise<void> {\n const intotoEntry = entry as IntotoEntry;\n\n if (intotoEntry.apiVersion !== \"0.0.2\") {\n throw new Error(\n `Unsupported intoto version: ${intotoEntry.apiVersion}`\n );\n }\n\n if (!bundle.dsseEnvelope) {\n throw new Error(\"Bundle missing dsseEnvelope for intoto entry\");\n }\n\n const tlogEnvelope = intotoEntry.spec.content.envelope;\n\n if (!tlogEnvelope.signatures || tlogEnvelope.signatures.length !== 1) {\n throw new Error(\"Intoto entry must have exactly one signature\");\n }\n assertLoggedCertificate(cert, tlogEnvelope.signatures[0].publicKey, true);\n\n // The signature in the intoto tlog entry is double-base64-encoded:\n // 1. Raw signature bytes are base64-encoded (normal)\n // 2. That base64 string is base64-encoded again (for storage in JSON)\n // So we decode twice: base64 -> string -> base64 -> bytes\n const tlogSigBase64 = tlogEnvelope.signatures[0].sig;\n const tlogSigDecoded = base64Decode(tlogSigBase64); // First decode: base64 -> UTF-8 string (which contains base64)\n const tlogSigBytes = base64ToUint8Array(tlogSigDecoded); // Second decode: base64 string -> raw bytes\n\n if (bundle.dsseEnvelope.signatures.length === 0) {\n throw new Error(\"Bundle DSSE envelope missing signatures\");\n }\n\n const bundleSigBytes = base64ToUint8Array(bundle.dsseEnvelope.signatures[0].sig);\n\n if (!uint8ArrayEqual(tlogSigBytes, bundleSigBytes)) {\n throw new Error(\"Intoto signature mismatch between TLog entry and bundle\");\n }\n\n if (intotoEntry.spec.content.payloadHash) {\n if (!intotoEntry.spec.content.payloadHash.algorithm) {\n throw new Error(\"Intoto entry missing payloadHash algorithm\");\n }\n\n const hashAlg = getHashAlgorithm(intotoEntry.spec.content.payloadHash.algorithm);\n const tlogHashBytes = hexToUint8Array(intotoEntry.spec.content.payloadHash.value);\n\n const payloadBytes = base64ToUint8Array(bundle.dsseEnvelope.payload);\n const bundleHashBytes = await digest(hashAlg, payloadBytes);\n\n if (!uint8ArrayEqual(tlogHashBytes, bundleHashBytes)) {\n throw new Error(\"Intoto payload hash mismatch between TLog entry and bundle\");\n }\n }\n}\n"]}
@@ -1,3 +1,2 @@
1
1
  import type { TLogEntry } from "../bundle.js";
2
2
  export declare function verifyMerkleInclusion(entry: TLogEntry): Promise<void>;
3
- //# sourceMappingURL=merkle.d.ts.map