@freedomofpress/sigstore-browser 0.1.0

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 (193) hide show
  1. package/.github/workflows/conformance.yml +29 -0
  2. package/.github/workflows/publish.yml +45 -0
  3. package/README.md +10 -0
  4. package/dist/asn1/error.d.ts +5 -0
  5. package/dist/asn1/error.d.ts.map +1 -0
  6. package/dist/asn1/error.js +20 -0
  7. package/dist/asn1/error.js.map +1 -0
  8. package/dist/asn1/index.d.ts +2 -0
  9. package/dist/asn1/index.d.ts.map +1 -0
  10. package/dist/asn1/index.js +17 -0
  11. package/dist/asn1/index.js.map +1 -0
  12. package/dist/asn1/length.d.ts +4 -0
  13. package/dist/asn1/length.d.ts.map +1 -0
  14. package/dist/asn1/length.js +59 -0
  15. package/dist/asn1/length.js.map +1 -0
  16. package/dist/asn1/obj.d.ts +15 -0
  17. package/dist/asn1/obj.d.ts.map +1 -0
  18. package/dist/asn1/obj.js +153 -0
  19. package/dist/asn1/obj.js.map +1 -0
  20. package/dist/asn1/parse.d.ts +7 -0
  21. package/dist/asn1/parse.d.ts.map +1 -0
  22. package/dist/asn1/parse.js +118 -0
  23. package/dist/asn1/parse.js.map +1 -0
  24. package/dist/asn1/tag.d.ts +17 -0
  25. package/dist/asn1/tag.d.ts.map +1 -0
  26. package/dist/asn1/tag.js +86 -0
  27. package/dist/asn1/tag.js.map +1 -0
  28. package/dist/bundle.d.ts +87 -0
  29. package/dist/bundle.d.ts.map +1 -0
  30. package/dist/bundle.js +2 -0
  31. package/dist/bundle.js.map +1 -0
  32. package/dist/canonicalize.d.ts +2 -0
  33. package/dist/canonicalize.d.ts.map +1 -0
  34. package/dist/canonicalize.js +64 -0
  35. package/dist/canonicalize.js.map +1 -0
  36. package/dist/cli.d.ts +3 -0
  37. package/dist/cli.d.ts.map +1 -0
  38. package/dist/cli.js +217 -0
  39. package/dist/cli.js.map +1 -0
  40. package/dist/crypto.d.ts +5 -0
  41. package/dist/crypto.d.ts.map +1 -0
  42. package/dist/crypto.js +260 -0
  43. package/dist/crypto.js.map +1 -0
  44. package/dist/dsse.d.ts +2 -0
  45. package/dist/dsse.d.ts.map +1 -0
  46. package/dist/dsse.js +42 -0
  47. package/dist/dsse.js.map +1 -0
  48. package/dist/encoding.d.ts +17 -0
  49. package/dist/encoding.d.ts.map +1 -0
  50. package/dist/encoding.js +112 -0
  51. package/dist/encoding.js.map +1 -0
  52. package/dist/errors.d.ts +39 -0
  53. package/dist/errors.d.ts.map +1 -0
  54. package/dist/errors.js +79 -0
  55. package/dist/errors.js.map +1 -0
  56. package/dist/index.d.ts +8 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +5 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/interfaces.d.ts +104 -0
  61. package/dist/interfaces.d.ts.map +1 -0
  62. package/dist/interfaces.js +26 -0
  63. package/dist/interfaces.js.map +1 -0
  64. package/dist/oid.d.ts +5 -0
  65. package/dist/oid.d.ts.map +1 -0
  66. package/dist/oid.js +25 -0
  67. package/dist/oid.js.map +1 -0
  68. package/dist/pem.d.ts +3 -0
  69. package/dist/pem.d.ts.map +1 -0
  70. package/dist/pem.js +41 -0
  71. package/dist/pem.js.map +1 -0
  72. package/dist/rfc3161/error.d.ts +3 -0
  73. package/dist/rfc3161/error.d.ts.map +1 -0
  74. package/dist/rfc3161/error.js +18 -0
  75. package/dist/rfc3161/error.js.map +1 -0
  76. package/dist/rfc3161/index.d.ts +2 -0
  77. package/dist/rfc3161/index.d.ts.map +1 -0
  78. package/dist/rfc3161/index.js +17 -0
  79. package/dist/rfc3161/index.js.map +1 -0
  80. package/dist/rfc3161/timestamp.d.ts +36 -0
  81. package/dist/rfc3161/timestamp.d.ts.map +1 -0
  82. package/dist/rfc3161/timestamp.js +203 -0
  83. package/dist/rfc3161/timestamp.js.map +1 -0
  84. package/dist/rfc3161/tstinfo.d.ts +13 -0
  85. package/dist/rfc3161/tstinfo.d.ts.map +1 -0
  86. package/dist/rfc3161/tstinfo.js +47 -0
  87. package/dist/rfc3161/tstinfo.js.map +1 -0
  88. package/dist/sigstore.d.ts +33 -0
  89. package/dist/sigstore.d.ts.map +1 -0
  90. package/dist/sigstore.js +531 -0
  91. package/dist/sigstore.js.map +1 -0
  92. package/dist/stream.d.ts +22 -0
  93. package/dist/stream.d.ts.map +1 -0
  94. package/dist/stream.js +114 -0
  95. package/dist/stream.js.map +1 -0
  96. package/dist/timestamp/tsa.d.ts +24 -0
  97. package/dist/timestamp/tsa.d.ts.map +1 -0
  98. package/dist/timestamp/tsa.js +150 -0
  99. package/dist/timestamp/tsa.js.map +1 -0
  100. package/dist/tlog/body.d.ts +8 -0
  101. package/dist/tlog/body.d.ts.map +1 -0
  102. package/dist/tlog/body.js +45 -0
  103. package/dist/tlog/body.js.map +1 -0
  104. package/dist/tlog/checkpoint.d.ts +23 -0
  105. package/dist/tlog/checkpoint.d.ts.map +1 -0
  106. package/dist/tlog/checkpoint.js +187 -0
  107. package/dist/tlog/checkpoint.js.map +1 -0
  108. package/dist/tlog/dsse.d.ts +4 -0
  109. package/dist/tlog/dsse.d.ts.map +1 -0
  110. package/dist/tlog/dsse.js +85 -0
  111. package/dist/tlog/dsse.js.map +1 -0
  112. package/dist/tlog/hashedrekord.d.ts +4 -0
  113. package/dist/tlog/hashedrekord.d.ts.map +1 -0
  114. package/dist/tlog/hashedrekord.js +63 -0
  115. package/dist/tlog/hashedrekord.js.map +1 -0
  116. package/dist/tlog/intoto.d.ts +4 -0
  117. package/dist/tlog/intoto.d.ts.map +1 -0
  118. package/dist/tlog/intoto.js +50 -0
  119. package/dist/tlog/intoto.js.map +1 -0
  120. package/dist/tlog/merkle.d.ts +3 -0
  121. package/dist/tlog/merkle.d.ts.map +1 -0
  122. package/dist/tlog/merkle.js +112 -0
  123. package/dist/tlog/merkle.js.map +1 -0
  124. package/dist/trust/tuf-root.json +1 -0
  125. package/dist/trust/tuf.d.ts +95 -0
  126. package/dist/trust/tuf.d.ts.map +1 -0
  127. package/dist/trust/tuf.js +150 -0
  128. package/dist/trust/tuf.js.map +1 -0
  129. package/dist/x509/cert.d.ts +52 -0
  130. package/dist/x509/cert.d.ts.map +1 -0
  131. package/dist/x509/cert.js +256 -0
  132. package/dist/x509/cert.js.map +1 -0
  133. package/dist/x509/chain.d.ts +20 -0
  134. package/dist/x509/chain.d.ts.map +1 -0
  135. package/dist/x509/chain.js +141 -0
  136. package/dist/x509/chain.js.map +1 -0
  137. package/dist/x509/ext.d.ts +48 -0
  138. package/dist/x509/ext.d.ts.map +1 -0
  139. package/dist/x509/ext.js +164 -0
  140. package/dist/x509/ext.js.map +1 -0
  141. package/dist/x509/index.d.ts +4 -0
  142. package/dist/x509/index.d.ts.map +1 -0
  143. package/dist/x509/index.js +19 -0
  144. package/dist/x509/index.js.map +1 -0
  145. package/dist/x509/sct.d.ts +25 -0
  146. package/dist/x509/sct.d.ts.map +1 -0
  147. package/dist/x509/sct.js +123 -0
  148. package/dist/x509/sct.js.map +1 -0
  149. package/eslint.config.mjs +31 -0
  150. package/package.json +39 -0
  151. package/src/asn1/error.ts +18 -0
  152. package/src/asn1/index.ts +16 -0
  153. package/src/asn1/length.ts +71 -0
  154. package/src/asn1/obj.ts +184 -0
  155. package/src/asn1/parse.ts +146 -0
  156. package/src/asn1/tag.ts +105 -0
  157. package/src/bundle.ts +99 -0
  158. package/src/canonicalize.ts +61 -0
  159. package/src/cli.ts +285 -0
  160. package/src/crypto.ts +310 -0
  161. package/src/dsse.ts +49 -0
  162. package/src/encoding.ts +141 -0
  163. package/src/errors.ts +82 -0
  164. package/src/index.browser.test.ts +219 -0
  165. package/src/index.ts +14 -0
  166. package/src/interfaces.ts +118 -0
  167. package/src/oid.ts +28 -0
  168. package/src/pem.ts +48 -0
  169. package/src/rfc3161/error.ts +16 -0
  170. package/src/rfc3161/index.ts +17 -0
  171. package/src/rfc3161/timestamp.ts +270 -0
  172. package/src/rfc3161/tstinfo.ts +80 -0
  173. package/src/sigstore.ts +728 -0
  174. package/src/stream.ts +141 -0
  175. package/src/timestamp/tsa.ts +205 -0
  176. package/src/tlog/body.ts +65 -0
  177. package/src/tlog/checkpoint.ts +248 -0
  178. package/src/tlog/dsse.ts +147 -0
  179. package/src/tlog/hashedrekord.ts +130 -0
  180. package/src/tlog/intoto.ts +102 -0
  181. package/src/tlog/merkle.ts +152 -0
  182. package/src/trust/README.md +38 -0
  183. package/src/trust/tuf-root.json +1 -0
  184. package/src/trust/tuf.ts +223 -0
  185. package/src/types/tuf-browser.d.ts +13 -0
  186. package/src/x509/cert.ts +319 -0
  187. package/src/x509/chain.ts +212 -0
  188. package/src/x509/ext.ts +212 -0
  189. package/src/x509/index.ts +19 -0
  190. package/src/x509/sct.ts +154 -0
  191. package/tsconfig.json +18 -0
  192. package/vite.config.playwright.ts +26 -0
  193. package/vite.config.ts +18 -0
package/dist/stream.js ADDED
@@ -0,0 +1,114 @@
1
+ /*
2
+ Copyright 2023 The Sigstore Authors.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+ class StreamError extends Error {
17
+ }
18
+ export class ByteStream {
19
+ static BLOCK_SIZE = 1024;
20
+ buf;
21
+ view;
22
+ start = 0;
23
+ constructor(buffer) {
24
+ if (buffer) {
25
+ this.buf = buffer;
26
+ this.view = new Uint8Array(buffer);
27
+ }
28
+ else {
29
+ this.buf = new ArrayBuffer(0);
30
+ this.view = new Uint8Array(this.buf);
31
+ }
32
+ }
33
+ get buffer() {
34
+ return this.view.subarray(0, this.start);
35
+ }
36
+ get length() {
37
+ return this.view.byteLength;
38
+ }
39
+ get position() {
40
+ return this.start;
41
+ }
42
+ seek(position) {
43
+ this.start = position;
44
+ }
45
+ // Returns a Buffer containing the specified number of bytes starting at the
46
+ // given start position.
47
+ slice(start, len) {
48
+ const end = start + len;
49
+ if (end > this.length) {
50
+ throw new StreamError("request past end of buffer");
51
+ }
52
+ return this.view.subarray(start, end);
53
+ }
54
+ appendChar(char) {
55
+ this.ensureCapacity(1);
56
+ this.view[this.start] = char;
57
+ this.start += 1;
58
+ }
59
+ appendUint16(num) {
60
+ this.ensureCapacity(2);
61
+ const value = new Uint16Array([num]);
62
+ const view = new Uint8Array(value.buffer);
63
+ this.view[this.start] = view[1];
64
+ this.view[this.start + 1] = view[0];
65
+ this.start += 2;
66
+ }
67
+ appendUint24(num) {
68
+ this.ensureCapacity(3);
69
+ const value = new Uint32Array([num]);
70
+ const view = new Uint8Array(value.buffer);
71
+ this.view[this.start] = view[2];
72
+ this.view[this.start + 1] = view[1];
73
+ this.view[this.start + 2] = view[0];
74
+ this.start += 3;
75
+ }
76
+ appendView(view) {
77
+ this.ensureCapacity(view.length);
78
+ this.view.set(view, this.start);
79
+ this.start += view.length;
80
+ }
81
+ getBlock(size) {
82
+ if (size <= 0) {
83
+ return new Uint8Array(0);
84
+ }
85
+ if (this.start + size > this.view.length) {
86
+ throw new Error("request past end of buffer");
87
+ }
88
+ const result = this.view.subarray(this.start, this.start + size);
89
+ this.start += size;
90
+ return result;
91
+ }
92
+ getUint8() {
93
+ return this.getBlock(1)[0];
94
+ }
95
+ getUint16() {
96
+ const block = this.getBlock(2);
97
+ return (block[0] << 8) | block[1];
98
+ }
99
+ ensureCapacity(size) {
100
+ if (this.start + size > this.view.byteLength) {
101
+ const blockSize = ByteStream.BLOCK_SIZE + (size > ByteStream.BLOCK_SIZE ? size : 0);
102
+ this.realloc(this.view.byteLength + blockSize);
103
+ }
104
+ }
105
+ realloc(size) {
106
+ const newArray = new ArrayBuffer(size);
107
+ const newView = new Uint8Array(newArray);
108
+ // Copy the old buffer into the new one
109
+ newView.set(this.view);
110
+ this.buf = newArray;
111
+ this.view = newView;
112
+ }
113
+ }
114
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { RFC3161Timestamp } from "../rfc3161/index.js";
2
+ import type { RawTimestampAuthority } from "../interfaces.js";
3
+ /**
4
+ * Verifies an RFC3161 timestamp against a set of timestamp authorities
5
+ *
6
+ * @param timestamp - The RFC3161 timestamp to verify
7
+ * @param data - The data that was timestamped
8
+ * @param timestampAuthorities - List of trusted timestamp authorities
9
+ * @returns The verified signing time
10
+ * @throws Error if timestamp cannot be verified
11
+ */
12
+ export declare function verifyRFC3161Timestamp(timestamp: RFC3161Timestamp, data: Uint8Array, timestampAuthorities: RawTimestampAuthority[]): Promise<Date>;
13
+ /**
14
+ * Extracts the verified timestamp from a bundle's timestamp verification data
15
+ *
16
+ * New functionality for Sigstore bundle integration (not in sigstore-js reference)
17
+ *
18
+ * @param timestampData - The timestamp verification data from the bundle
19
+ * @param signature - The signature being verified
20
+ * @param timestampAuthorities - List of trusted timestamp authorities
21
+ * @returns The verified signing time, or undefined if no timestamp
22
+ */
23
+ export declare function verifyBundleTimestamp(timestampData: any, signature: Uint8Array, timestampAuthorities: RawTimestampAuthority[]): Promise<Date | undefined>;
24
+ //# sourceMappingURL=tsa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsa.d.ts","sourceRoot":"","sources":["../../src/timestamp/tsa.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAIvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE9D;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,gBAAgB,EAC3B,IAAI,EAAE,UAAU,EAChB,oBAAoB,EAAE,qBAAqB,EAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CAgCf;AAwFD;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,aAAa,EAAE,GAAG,EAClB,SAAS,EAAE,UAAU,EACrB,oBAAoB,EAAE,qBAAqB,EAAE,GAC5C,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAoC3B"}
@@ -0,0 +1,150 @@
1
+ /*
2
+ * TSA (Time-Stamping Authority) timestamp verification
3
+ *
4
+ * Based on sigstore-js:
5
+ * https://github.com/sigstore/sigstore-js/blob/main/packages/verify/src/timestamp/tsa.ts
6
+ *
7
+ * Key differences from sigstore-js:
8
+ * - Browser-compatible: uses Uint8Array instead of Buffer for binary data
9
+ * - Uses Web Crypto API for all cryptographic operations
10
+ * - Integrates with existing RFC3161 timestamp implementation
11
+ * - Uses CertificateChainVerifier for full X.509 path validation
12
+ * - Implements filterCertAuthorities inline (from sigstore-js/packages/verify/src/trust/filter.ts)
13
+ * - Adds verifyBundleTimestamp for Sigstore bundle integration (new functionality)
14
+ */
15
+ import { RFC3161Timestamp } from "../rfc3161/index.js";
16
+ import { X509Certificate, CertificateChainVerifier } from "../x509/index.js";
17
+ import { bufferEqual } from "../crypto.js";
18
+ import { base64ToUint8Array } from "../encoding.js";
19
+ /**
20
+ * Verifies an RFC3161 timestamp against a set of timestamp authorities
21
+ *
22
+ * @param timestamp - The RFC3161 timestamp to verify
23
+ * @param data - The data that was timestamped
24
+ * @param timestampAuthorities - List of trusted timestamp authorities
25
+ * @returns The verified signing time
26
+ * @throws Error if timestamp cannot be verified
27
+ */
28
+ export async function verifyRFC3161Timestamp(timestamp, data, timestampAuthorities) {
29
+ const signingTime = timestamp.signingTime;
30
+ // Filter for CAs which were valid at the time of signing
31
+ let validAuthorities = filterCertAuthorities(timestampAuthorities, signingTime);
32
+ // Filter for CAs which match serial and issuer embedded in the timestamp
33
+ validAuthorities = filterCAsBySerialAndIssuer(validAuthorities, {
34
+ serialNumber: timestamp.signerSerialNumber,
35
+ issuer: timestamp.signerIssuer,
36
+ });
37
+ // Check that we can verify the timestamp with AT LEAST ONE of the remaining CAs
38
+ const verificationResults = await Promise.allSettled(validAuthorities.map(ca => verifyTimestampForCA(timestamp, data, ca)));
39
+ const verified = verificationResults.some(result => result.status === "fulfilled");
40
+ if (!verified) {
41
+ const errors = verificationResults
42
+ .filter(r => r.status === "rejected")
43
+ .map(r => r.reason?.message || 'Unknown error');
44
+ throw new Error(`Timestamp could not be verified against any trusted authority. Errors: ${errors.join(', ')}`);
45
+ }
46
+ return signingTime;
47
+ }
48
+ /**
49
+ * Filters certificate authorities to those valid at a specific time
50
+ *
51
+ * Adapted from sigstore-js/packages/verify/src/trust/filter.ts
52
+ */
53
+ function filterCertAuthorities(authorities, validAt) {
54
+ return authorities.filter(ca => {
55
+ if (ca.validFor) {
56
+ const start = ca.validFor.start ? new Date(ca.validFor.start) : null;
57
+ const end = ca.validFor.end ? new Date(ca.validFor.end) : null;
58
+ if (start && validAt < start) {
59
+ return false;
60
+ }
61
+ if (end && validAt > end) {
62
+ return false;
63
+ }
64
+ }
65
+ return true;
66
+ });
67
+ }
68
+ /**
69
+ * Filters certificate authorities by serial number and issuer
70
+ *
71
+ * Only checks the LEAF certificate (TSA signing cert), not the entire chain.
72
+ * This matches the sigstore-js reference implementation.
73
+ */
74
+ function filterCAsBySerialAndIssuer(timestampAuthorities, criteria) {
75
+ return timestampAuthorities.filter(ca => {
76
+ if (!ca.certChain || ca.certChain.certificates.length === 0) {
77
+ return false;
78
+ }
79
+ const leafCert = X509Certificate.parse(base64ToUint8Array(ca.certChain.certificates[0].rawBytes));
80
+ return bufferEqual(leafCert.serialNumber, criteria.serialNumber) &&
81
+ bufferEqual(leafCert.issuer, criteria.issuer);
82
+ });
83
+ }
84
+ /**
85
+ * Verifies a timestamp against a specific certificate authority
86
+ */
87
+ async function verifyTimestampForCA(timestamp, data, ca) {
88
+ if (!ca.certChain || ca.certChain.certificates.length === 0) {
89
+ throw new Error("Certificate authority missing certificate chain");
90
+ }
91
+ const leafCert = X509Certificate.parse(base64ToUint8Array(ca.certChain.certificates[0].rawBytes));
92
+ const signingTime = timestamp.signingTime;
93
+ const trustedCerts = ca.certChain.certificates
94
+ .slice(1)
95
+ .map(cert => X509Certificate.parse(base64ToUint8Array(cert.rawBytes)));
96
+ try {
97
+ const verifier = new CertificateChainVerifier({
98
+ untrustedCert: leafCert,
99
+ trustedCerts: trustedCerts,
100
+ timestamp: signingTime,
101
+ });
102
+ await verifier.verify();
103
+ }
104
+ catch (e) {
105
+ throw new Error(`TSA certificate chain verification failed: ${e instanceof Error ? e.message : String(e)}`);
106
+ }
107
+ const publicKey = await leafCert.publicKeyObj;
108
+ await timestamp.verify(data, publicKey);
109
+ }
110
+ /**
111
+ * Extracts the verified timestamp from a bundle's timestamp verification data
112
+ *
113
+ * New functionality for Sigstore bundle integration (not in sigstore-js reference)
114
+ *
115
+ * @param timestampData - The timestamp verification data from the bundle
116
+ * @param signature - The signature being verified
117
+ * @param timestampAuthorities - List of trusted timestamp authorities
118
+ * @returns The verified signing time, or undefined if no timestamp
119
+ */
120
+ export async function verifyBundleTimestamp(timestampData, signature, timestampAuthorities) {
121
+ if (!timestampData?.rfc3161Timestamps?.length) {
122
+ return undefined;
123
+ }
124
+ // Check for duplicate timestamps
125
+ const seenTimestamps = new Set();
126
+ for (const tsData of timestampData.rfc3161Timestamps) {
127
+ if (seenTimestamps.has(tsData.signedTimestamp)) {
128
+ throw new Error("Duplicate TSA timestamp detected");
129
+ }
130
+ seenTimestamps.add(tsData.signedTimestamp);
131
+ }
132
+ // Process each RFC3161 timestamp
133
+ const errors = [];
134
+ for (const tsData of timestampData.rfc3161Timestamps) {
135
+ try {
136
+ // Decode the base64-encoded timestamp
137
+ const timestampBytes = base64ToUint8Array(tsData.signedTimestamp);
138
+ const timestamp = RFC3161Timestamp.parse(timestampBytes);
139
+ const signingTime = await verifyRFC3161Timestamp(timestamp, signature, timestampAuthorities);
140
+ return signingTime;
141
+ }
142
+ catch (e) {
143
+ // Continue to next timestamp if this one fails
144
+ errors.push(e instanceof Error ? e.message : String(e));
145
+ continue;
146
+ }
147
+ }
148
+ throw new Error(`No valid RFC3161 timestamps found. Errors: ${errors.join(', ')}`);
149
+ }
150
+ //# sourceMappingURL=tsa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsa.js","sourceRoot":"","sources":["../../src/timestamp/tsa.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { SigstoreBundle, TLogEntry } from "../bundle.js";
2
+ export interface RekorEntry {
3
+ apiVersion: string;
4
+ kind: string;
5
+ spec: unknown;
6
+ }
7
+ export declare function verifyTLogBody(entry: TLogEntry, bundle: SigstoreBundle): Promise<void>;
8
+ //# sourceMappingURL=body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.d.ts","sourceRoot":"","sources":["../../src/tlog/body.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9D,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC,CAqBf"}
@@ -0,0 +1,45 @@
1
+ /*
2
+ * Transparency log body verification
3
+ *
4
+ * Based on sigstore-js:
5
+ * https://github.com/sigstore/sigstore-js/blob/main/packages/verify/src/tlog/index.ts
6
+ *
7
+ * Key differences from sigstore-js:
8
+ * - Browser-compatible: uses Uint8Array instead of Buffer for binary data
9
+ * - Direct bundle comparison instead of SignatureContent abstraction
10
+ */
11
+ import { base64Decode } from "../encoding.js";
12
+ import { verifyHashedRekordBody } from "./hashedrekord.js";
13
+ import { verifyDSSEBody } from "./dsse.js";
14
+ import { verifyIntotoBody } from "./intoto.js";
15
+ export async function verifyTLogBody(entry, bundle) {
16
+ const rekorEntry = parseCanonicalBody(entry);
17
+ const { kind, version } = entry.kindVersion;
18
+ if (kind !== rekorEntry.kind || version !== rekorEntry.apiVersion) {
19
+ throw new Error(`kind/version mismatch - expected: ${kind}/${version}, received: ${rekorEntry.kind}/${rekorEntry.apiVersion}`);
20
+ }
21
+ switch (rekorEntry.kind) {
22
+ case "hashedrekord":
23
+ return verifyHashedRekordBody(rekorEntry, bundle);
24
+ case "dsse":
25
+ return verifyDSSEBody(rekorEntry, bundle);
26
+ case "intoto":
27
+ return verifyIntotoBody(rekorEntry, bundle);
28
+ default:
29
+ throw new Error(`Unsupported TLog entry kind: ${rekorEntry.kind}`);
30
+ }
31
+ }
32
+ function parseCanonicalBody(entry) {
33
+ try {
34
+ const decodedBody = base64Decode(entry.canonicalizedBody);
35
+ const rekorEntry = JSON.parse(decodedBody);
36
+ if (!rekorEntry.apiVersion || !rekorEntry.kind || !rekorEntry.spec) {
37
+ throw new Error("Invalid Rekor entry structure");
38
+ }
39
+ return rekorEntry;
40
+ }
41
+ catch (error) {
42
+ throw new Error(`Failed to parse canonicalized body: ${error instanceof Error ? error.message : String(error)}`);
43
+ }
44
+ }
45
+ //# sourceMappingURL=body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.js","sourceRoot":"","sources":["../../src/tlog/body.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,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,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAgB,EAChB,MAAsB;IAEtB,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,CAAC,CAAC;QACpD,KAAK,MAAM;YACT,OAAO,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC5C,KAAK,QAAQ;YACX,OAAO,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC9C;YACE,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,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"}
@@ -0,0 +1,23 @@
1
+ import type { TLogEntry } from "../bundle.js";
2
+ import type { RawLogs } from "../interfaces.js";
3
+ export interface TLogSignature {
4
+ name: string;
5
+ keyHint: Uint8Array;
6
+ signature: Uint8Array;
7
+ }
8
+ export declare class SignedNote {
9
+ readonly note: string;
10
+ readonly signatures: TLogSignature[];
11
+ constructor(note: string, signatures: TLogSignature[]);
12
+ static fromString(envelope: string): SignedNote;
13
+ }
14
+ export declare class LogCheckpoint {
15
+ readonly origin: string;
16
+ readonly logSize: bigint;
17
+ readonly logHash: Uint8Array;
18
+ readonly rest: string[];
19
+ constructor(origin: string, logSize: bigint, logHash: Uint8Array, rest: string[]);
20
+ static fromString(note: string): LogCheckpoint;
21
+ }
22
+ export declare function verifyCheckpoint(entry: TLogEntry, tlogs: RawLogs): Promise<void>;
23
+ //# sourceMappingURL=checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../../src/tlog/checkpoint.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAShD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,CAAC;IACpB,SAAS,EAAE,UAAU,CAAC;CACvB;AAGD,qBAAa,UAAU;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,aAAa,EAAE,CAAC;gBAEzB,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE;IAKrD,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU;CAoChD;AAGD,qBAAa,aAAa;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;gBAGtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,MAAM,EAAE;IAQhB,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;CAc/C;AAGD,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
@@ -0,0 +1,187 @@
1
+ /*
2
+ Checkpoint verification for transparency log entries.
3
+
4
+ Adapted from sigstore-js for browser compatibility:
5
+ https://github.com/sigstore/sigstore-js/blob/main/packages/verify/src/timestamp/checkpoint.ts
6
+
7
+ Key differences:
8
+ - Uses Uint8Array instead of Buffer
9
+ - Uses Web Crypto API instead of Node.js crypto module
10
+ - Manual handling of ED25519 (raw) vs ECDSA (DER) signature formats
11
+ - Inline key import from raw bytes
12
+
13
+ Additional functionality not in reference:
14
+ - filterTLogsByDate() - inlined from sigstore-js/packages/verify/src/trust/filter.ts
15
+ - importTLogKey() - new browser-compatible key import with multiple format support
16
+ - Special handling for Rekor v2 bundles without integratedTime
17
+
18
+ Follows the signed note format specification:
19
+ https://github.com/transparency-dev/formats/blob/main/log/README.md
20
+ */
21
+ import { base64ToUint8Array, stringToUint8Array, uint8ArrayEqual } from "../encoding.js";
22
+ import { importKey, verifySignature } from "../crypto.js";
23
+ // Signed note format per https://github.com/transparency-dev/formats
24
+ // Body is separated from signatures by a blank line
25
+ const CHECKPOINT_SEPARATOR = "\n\n";
26
+ // Signature lines format: "— <identity> <base64(key_hint+signature)>\n"
27
+ // \u2014 is the em-dash character (—)
28
+ const SIGNATURE_REGEX = /\u2014 (\S+) (\S+)\n/g;
29
+ // Signed checkpoint note with cryptographic signatures
30
+ export class SignedNote {
31
+ note;
32
+ signatures;
33
+ constructor(note, signatures) {
34
+ this.note = note;
35
+ this.signatures = signatures;
36
+ }
37
+ static fromString(envelope) {
38
+ if (!envelope.includes(CHECKPOINT_SEPARATOR)) {
39
+ throw new Error("Missing checkpoint separator");
40
+ }
41
+ // Split body from signature lines at blank line
42
+ const split = envelope.indexOf(CHECKPOINT_SEPARATOR);
43
+ const header = envelope.slice(0, split + 1);
44
+ const data = envelope.slice(split + CHECKPOINT_SEPARATOR.length);
45
+ // Parse signature lines: "— <identity> <base64(key_hint+signature)>\n"
46
+ const matches = data.matchAll(SIGNATURE_REGEX);
47
+ const signatures = [];
48
+ for (const match of matches) {
49
+ const [, name, signature] = match;
50
+ const sigBytes = base64ToUint8Array(signature);
51
+ // First 4 bytes are key hint (SHA256 hash prefix), rest is signature
52
+ if (sigBytes.length < 5) {
53
+ throw new Error("Malformed checkpoint signature");
54
+ }
55
+ signatures.push({
56
+ name,
57
+ keyHint: sigBytes.subarray(0, 4),
58
+ signature: sigBytes.subarray(4),
59
+ });
60
+ }
61
+ if (signatures.length === 0) {
62
+ throw new Error("No signatures found in checkpoint");
63
+ }
64
+ return new SignedNote(header, signatures);
65
+ }
66
+ }
67
+ // Parsed checkpoint containing tree state (origin, size, root hash)
68
+ export class LogCheckpoint {
69
+ origin;
70
+ logSize;
71
+ logHash;
72
+ rest;
73
+ constructor(origin, logSize, logHash, rest) {
74
+ this.origin = origin;
75
+ this.logSize = logSize;
76
+ this.logHash = logHash;
77
+ this.rest = rest;
78
+ }
79
+ static fromString(note) {
80
+ const lines = note.trimEnd().split("\n");
81
+ if (lines.length < 3) {
82
+ throw new Error("Too few lines in checkpoint header");
83
+ }
84
+ const origin = lines[0];
85
+ const logSize = BigInt(lines[1]);
86
+ const rootHash = base64ToUint8Array(lines[2]);
87
+ const rest = lines.slice(3);
88
+ return new LogCheckpoint(origin, logSize, rootHash, rest);
89
+ }
90
+ }
91
+ // Verifies checkpoint signature and ensures root hash matches inclusion proof
92
+ export async function verifyCheckpoint(entry, tlogs) {
93
+ if (!entry.inclusionProof?.checkpoint) {
94
+ throw new Error("Missing checkpoint in inclusion proof");
95
+ }
96
+ // Filter by log ID first (matches entry's log ID)
97
+ const entryLogId = base64ToUint8Array(entry.logId.keyId);
98
+ const matchingTLogs = tlogs.filter((tlog) => {
99
+ const tlogId = base64ToUint8Array(tlog.logId.keyId);
100
+ return uint8ArrayEqual(tlogId, entryLogId);
101
+ });
102
+ // Then filter by date if integratedTime is available
103
+ // For Rekor v2 bundles, integratedTime may be null, so we skip date filtering
104
+ const validTLogs = entry.integratedTime
105
+ ? filterTLogsByDate(matchingTLogs, new Date(Number(entry.integratedTime) * 1000))
106
+ : matchingTLogs;
107
+ const inclusionProof = entry.inclusionProof;
108
+ const signedNote = SignedNote.fromString(inclusionProof.checkpoint.envelope);
109
+ const checkpoint = LogCheckpoint.fromString(signedNote.note);
110
+ if (!(await verifySignedNote(signedNote, validTLogs))) {
111
+ throw new Error("Invalid checkpoint signature");
112
+ }
113
+ const rootHash = base64ToUint8Array(inclusionProof.rootHash);
114
+ if (!uint8ArrayEqual(checkpoint.logHash, rootHash)) {
115
+ throw new Error("Root hash mismatch between checkpoint and inclusion proof");
116
+ }
117
+ }
118
+ // Verifies checkpoint signatures using trusted TLog keys
119
+ async function verifySignedNote(signedNote, tlogs) {
120
+ const data = stringToUint8Array(signedNote.note);
121
+ // We need at least one valid signature from a known TLog
122
+ let hasValidSignature = false;
123
+ for (const signature of signedNote.signatures) {
124
+ // Match signature to TLog using key hint (first 4 bytes of key ID)
125
+ const tlog = tlogs.find((tlog) => {
126
+ const logId = base64ToUint8Array(tlog.logId.keyId);
127
+ return uint8ArrayEqual(logId.subarray(0, 4), signature.keyHint);
128
+ });
129
+ if (!tlog) {
130
+ // Skip unknown signatures (e.g., from witnesses we don't know about)
131
+ continue;
132
+ }
133
+ const publicKey = await importTLogKey(tlog);
134
+ // Both ED25519 and ECDSA verification are now handled by verifySignature
135
+ // ED25519 signatures are raw (64 bytes), ECDSA signatures are DER-encoded
136
+ const verified = await verifySignature(publicKey, data, signature.signature, tlog.hashAlgorithm);
137
+ if (verified) {
138
+ hasValidSignature = true;
139
+ }
140
+ }
141
+ return hasValidSignature;
142
+ }
143
+ // Inlined from sigstore-js/packages/verify/src/trust/filter.ts
144
+ function filterTLogsByDate(tlogs, targetDate) {
145
+ return tlogs.filter((tlog) => {
146
+ const start = new Date(tlog.publicKey.validFor.start);
147
+ const end = tlog.publicKey.validFor.end
148
+ ? new Date(tlog.publicKey.validFor.end)
149
+ : null;
150
+ return targetDate >= start && (!end || targetDate <= end);
151
+ });
152
+ }
153
+ // Browser-compatible key import supporting multiple formats (not in sigstore-js reference)
154
+ async function importTLogKey(tlog) {
155
+ // Parse keyDetails to extract key type and scheme
156
+ // Formats can be:
157
+ // - "PKIX_ECDSA_P256_SHA_256" (production format)
158
+ // - "PKIX_ED25519"
159
+ // - "ecdsa-sha2-nistp256" (SSH/test format)
160
+ const keyDetails = tlog.publicKey.keyDetails;
161
+ let keyType;
162
+ let scheme;
163
+ if (keyDetails === "ecdsa-sha2-nistp256") {
164
+ // SSH-style ECDSA P-256 format used in tests
165
+ keyType = "ecdsa";
166
+ scheme = "P256-SHA256";
167
+ }
168
+ else if (keyDetails.includes("ECDSA")) {
169
+ keyType = "ecdsa";
170
+ // Extract the curve and hash, e.g., "P256_SHA_256" from "PKIX_ECDSA_P256_SHA_256"
171
+ scheme = keyDetails.replace("PKIX_ECDSA_", "").replaceAll("_", "-");
172
+ }
173
+ else if (keyDetails.includes("ED25519")) {
174
+ keyType = "ed25519";
175
+ scheme = "ed25519";
176
+ }
177
+ else if (keyDetails.includes("RSA")) {
178
+ keyType = "rsa";
179
+ // Extract RSA details, e.g., "PSS_SHA_256" from "PKIX_RSA_PSS_SHA_256"
180
+ scheme = keyDetails.replace("PKIX_RSA_", "").replaceAll("_", "-");
181
+ }
182
+ else {
183
+ throw new Error(`Unsupported key type in keyDetails: ${keyDetails}`);
184
+ }
185
+ return importKey(keyType, scheme, tlog.publicKey.rawBytes);
186
+ }
187
+ //# sourceMappingURL=checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/tlog/checkpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { SigstoreBundle } from "../bundle.js";
2
+ import type { RekorEntry } from "./body.js";
3
+ export declare function verifyDSSEBody(entry: RekorEntry, bundle: SigstoreBundle): Promise<void>;
4
+ //# sourceMappingURL=dsse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsse.d.ts","sourceRoot":"","sources":["../../src/tlog/dsse.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAwB5C,wBAAsB,cAAc,CAClC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC,CAaf"}