@freedomofpress/sigstore-browser 0.1.4 → 0.1.6

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.
package/dist/policy.js ADDED
@@ -0,0 +1,371 @@
1
+ /**
2
+ * Adapted from sigstore-python sigstore/verify/policy.py
3
+ *
4
+ * This module provides policy verification for checking certificate identity claims.
5
+ * Each policy class verifies a specific X.509 extension value against an expected value.
6
+ *
7
+ * There are two types of extension formats:
8
+ * - V1 extensions: Raw OCTET STRING containing the value directly
9
+ * - V2 extensions: DER-encoded UTF8String (RFC 5280 compliant)
10
+ *
11
+ * Policies can be combined using:
12
+ * - AllOf: All child policies must pass (logical AND)
13
+ * - AnyOf: At least one child policy must pass (logical OR)
14
+ * - Identity: Verifies SAN with optional issuer check
15
+ */
16
+ import { PolicyError } from "./errors.js";
17
+ import { EXTENSION_OID_FULCIO_ISSUER_V1, EXTENSION_OID_GITHUB_WORKFLOW_TRIGGER, EXTENSION_OID_GITHUB_WORKFLOW_SHA, EXTENSION_OID_GITHUB_WORKFLOW_NAME, EXTENSION_OID_GITHUB_WORKFLOW_REPOSITORY, EXTENSION_OID_GITHUB_WORKFLOW_REF, EXTENSION_OID_OTHERNAME, EXTENSION_OID_FULCIO_ISSUER_V2, EXTENSION_OID_BUILD_SIGNER_URI, EXTENSION_OID_BUILD_SIGNER_DIGEST, EXTENSION_OID_RUNNER_ENVIRONMENT, EXTENSION_OID_SOURCE_REPOSITORY_URI, EXTENSION_OID_SOURCE_REPOSITORY_DIGEST, EXTENSION_OID_SOURCE_REPOSITORY_REF, EXTENSION_OID_SOURCE_REPOSITORY_IDENTIFIER, EXTENSION_OID_SOURCE_REPOSITORY_OWNER_URI, EXTENSION_OID_SOURCE_REPOSITORY_OWNER_IDENTIFIER, EXTENSION_OID_BUILD_CONFIG_URI, EXTENSION_OID_BUILD_CONFIG_DIGEST, EXTENSION_OID_BUILD_TRIGGER, EXTENSION_OID_RUN_INVOCATION_URI, EXTENSION_OID_SOURCE_REPOSITORY_VISIBILITY, } from "./x509/cert.js";
18
+ // Standard GitHub Actions OIDC issuer
19
+ // https://docs.github.com/en/actions/security-for-github-actions/security-hardening-your-deployments/about-security-hardening-with-openid-connect
20
+ export const GITHUB_OIDC_ISSUER = "https://token.actions.githubusercontent.com";
21
+ /**
22
+ * Base class for V1 extension policies (raw OCTET STRING value).
23
+ */
24
+ class SingleX509ExtPolicyV1 {
25
+ expectedValue;
26
+ constructor(value) {
27
+ this.expectedValue = value;
28
+ }
29
+ verify(cert) {
30
+ const extValue = this.getExtensionValue(cert);
31
+ if (extValue === undefined) {
32
+ throw new PolicyError(`Certificate does not contain ${this.name} (${this.oid}) extension`);
33
+ }
34
+ if (extValue !== this.expectedValue) {
35
+ throw new PolicyError(`Certificate's ${this.name} does not match ` +
36
+ `(got '${extValue}', expected '${this.expectedValue}')`);
37
+ }
38
+ }
39
+ }
40
+ /**
41
+ * Base class for V2 extension policies (DER-encoded UTF8String).
42
+ * Uses the same verify logic as V1 since our extension classes handle the parsing.
43
+ */
44
+ class SingleX509ExtPolicyV2 extends SingleX509ExtPolicyV1 {
45
+ }
46
+ // ============================================================================
47
+ // V1 Extension Policies (OID 1.3.6.1.4.1.57264.1.1 - 1.3.6.1.4.1.57264.1.6)
48
+ // ============================================================================
49
+ /**
50
+ * Verifies the certificate's OIDC issuer (V1 format).
51
+ * OID: 1.3.6.1.4.1.57264.1.1
52
+ */
53
+ export class OIDCIssuer extends SingleX509ExtPolicyV1 {
54
+ oid = EXTENSION_OID_FULCIO_ISSUER_V1;
55
+ name = "OIDCIssuer";
56
+ getExtensionValue(cert) {
57
+ return cert.extFulcioIssuerV1?.issuer;
58
+ }
59
+ }
60
+ /**
61
+ * Verifies the certificate's GitHub Actions workflow trigger.
62
+ * OID: 1.3.6.1.4.1.57264.1.2
63
+ */
64
+ export class GitHubWorkflowTrigger extends SingleX509ExtPolicyV1 {
65
+ oid = EXTENSION_OID_GITHUB_WORKFLOW_TRIGGER;
66
+ name = "GitHubWorkflowTrigger";
67
+ getExtensionValue(cert) {
68
+ return cert.extGitHubWorkflowTrigger?.workflowTrigger;
69
+ }
70
+ }
71
+ /**
72
+ * Verifies the certificate's GitHub Actions workflow commit SHA.
73
+ * OID: 1.3.6.1.4.1.57264.1.3
74
+ */
75
+ export class GitHubWorkflowSHA extends SingleX509ExtPolicyV1 {
76
+ oid = EXTENSION_OID_GITHUB_WORKFLOW_SHA;
77
+ name = "GitHubWorkflowSHA";
78
+ getExtensionValue(cert) {
79
+ return cert.extGitHubWorkflowSHA?.workflowSHA;
80
+ }
81
+ }
82
+ /**
83
+ * Verifies the certificate's GitHub Actions workflow name.
84
+ * OID: 1.3.6.1.4.1.57264.1.4
85
+ */
86
+ export class GitHubWorkflowName extends SingleX509ExtPolicyV1 {
87
+ oid = EXTENSION_OID_GITHUB_WORKFLOW_NAME;
88
+ name = "GitHubWorkflowName";
89
+ getExtensionValue(cert) {
90
+ return cert.extGitHubWorkflowName?.workflowName;
91
+ }
92
+ }
93
+ /**
94
+ * Verifies the certificate's GitHub Actions workflow repository.
95
+ * OID: 1.3.6.1.4.1.57264.1.5
96
+ */
97
+ export class GitHubWorkflowRepository extends SingleX509ExtPolicyV1 {
98
+ oid = EXTENSION_OID_GITHUB_WORKFLOW_REPOSITORY;
99
+ name = "GitHubWorkflowRepository";
100
+ getExtensionValue(cert) {
101
+ return cert.extGitHubWorkflowRepository?.workflowRepository;
102
+ }
103
+ }
104
+ /**
105
+ * Verifies the certificate's GitHub Actions workflow ref.
106
+ * OID: 1.3.6.1.4.1.57264.1.6
107
+ */
108
+ export class GitHubWorkflowRef extends SingleX509ExtPolicyV1 {
109
+ oid = EXTENSION_OID_GITHUB_WORKFLOW_REF;
110
+ name = "GitHubWorkflowRef";
111
+ getExtensionValue(cert) {
112
+ return cert.extGitHubWorkflowRef?.workflowRef;
113
+ }
114
+ }
115
+ // ============================================================================
116
+ // V2 Extension Policies (OID 1.3.6.1.4.1.57264.1.8 - 1.3.6.1.4.1.57264.1.22)
117
+ // ============================================================================
118
+ /**
119
+ * Verifies the certificate's OIDC issuer (V2 format, DER-encoded).
120
+ * OID: 1.3.6.1.4.1.57264.1.8
121
+ */
122
+ export class OIDCIssuerV2 extends SingleX509ExtPolicyV2 {
123
+ oid = EXTENSION_OID_FULCIO_ISSUER_V2;
124
+ name = "OIDCIssuerV2";
125
+ getExtensionValue(cert) {
126
+ return cert.extFulcioIssuerV2?.issuer;
127
+ }
128
+ }
129
+ /**
130
+ * Verifies the certificate's Build Signer URI.
131
+ * OID: 1.3.6.1.4.1.57264.1.9
132
+ */
133
+ export class OIDCBuildSignerURI extends SingleX509ExtPolicyV2 {
134
+ oid = EXTENSION_OID_BUILD_SIGNER_URI;
135
+ name = "OIDCBuildSignerURI";
136
+ getExtensionValue(cert) {
137
+ return cert.extBuildSignerURI?.buildSignerURI;
138
+ }
139
+ }
140
+ /**
141
+ * Verifies the certificate's Build Signer Digest.
142
+ * OID: 1.3.6.1.4.1.57264.1.10
143
+ */
144
+ export class OIDCBuildSignerDigest extends SingleX509ExtPolicyV2 {
145
+ oid = EXTENSION_OID_BUILD_SIGNER_DIGEST;
146
+ name = "OIDCBuildSignerDigest";
147
+ getExtensionValue(cert) {
148
+ return cert.extBuildSignerDigest?.buildSignerDigest;
149
+ }
150
+ }
151
+ /**
152
+ * Verifies the certificate's Runner Environment.
153
+ * OID: 1.3.6.1.4.1.57264.1.11
154
+ */
155
+ export class OIDCRunnerEnvironment extends SingleX509ExtPolicyV2 {
156
+ oid = EXTENSION_OID_RUNNER_ENVIRONMENT;
157
+ name = "OIDCRunnerEnvironment";
158
+ getExtensionValue(cert) {
159
+ return cert.extRunnerEnvironment?.runnerEnvironment;
160
+ }
161
+ }
162
+ /**
163
+ * Verifies the certificate's Source Repository URI.
164
+ * OID: 1.3.6.1.4.1.57264.1.12
165
+ */
166
+ export class OIDCSourceRepositoryURI extends SingleX509ExtPolicyV2 {
167
+ oid = EXTENSION_OID_SOURCE_REPOSITORY_URI;
168
+ name = "OIDCSourceRepositoryURI";
169
+ getExtensionValue(cert) {
170
+ return cert.extSourceRepositoryURI?.sourceRepositoryURI;
171
+ }
172
+ }
173
+ /**
174
+ * Verifies the certificate's Source Repository Digest.
175
+ * OID: 1.3.6.1.4.1.57264.1.13
176
+ */
177
+ export class OIDCSourceRepositoryDigest extends SingleX509ExtPolicyV2 {
178
+ oid = EXTENSION_OID_SOURCE_REPOSITORY_DIGEST;
179
+ name = "OIDCSourceRepositoryDigest";
180
+ getExtensionValue(cert) {
181
+ return cert.extSourceRepositoryDigest?.sourceRepositoryDigest;
182
+ }
183
+ }
184
+ /**
185
+ * Verifies the certificate's Source Repository Ref.
186
+ * OID: 1.3.6.1.4.1.57264.1.14
187
+ */
188
+ export class OIDCSourceRepositoryRef extends SingleX509ExtPolicyV2 {
189
+ oid = EXTENSION_OID_SOURCE_REPOSITORY_REF;
190
+ name = "OIDCSourceRepositoryRef";
191
+ getExtensionValue(cert) {
192
+ return cert.extSourceRepositoryRef?.sourceRepositoryRef;
193
+ }
194
+ }
195
+ /**
196
+ * Verifies the certificate's Source Repository Identifier.
197
+ * OID: 1.3.6.1.4.1.57264.1.15
198
+ */
199
+ export class OIDCSourceRepositoryIdentifier extends SingleX509ExtPolicyV2 {
200
+ oid = EXTENSION_OID_SOURCE_REPOSITORY_IDENTIFIER;
201
+ name = "OIDCSourceRepositoryIdentifier";
202
+ getExtensionValue(cert) {
203
+ return cert.extSourceRepositoryIdentifier?.sourceRepositoryIdentifier;
204
+ }
205
+ }
206
+ /**
207
+ * Verifies the certificate's Source Repository Owner URI.
208
+ * OID: 1.3.6.1.4.1.57264.1.16
209
+ */
210
+ export class OIDCSourceRepositoryOwnerURI extends SingleX509ExtPolicyV2 {
211
+ oid = EXTENSION_OID_SOURCE_REPOSITORY_OWNER_URI;
212
+ name = "OIDCSourceRepositoryOwnerURI";
213
+ getExtensionValue(cert) {
214
+ return cert.extSourceRepositoryOwnerURI?.sourceRepositoryOwnerURI;
215
+ }
216
+ }
217
+ /**
218
+ * Verifies the certificate's Source Repository Owner Identifier.
219
+ * OID: 1.3.6.1.4.1.57264.1.17
220
+ */
221
+ export class OIDCSourceRepositoryOwnerIdentifier extends SingleX509ExtPolicyV2 {
222
+ oid = EXTENSION_OID_SOURCE_REPOSITORY_OWNER_IDENTIFIER;
223
+ name = "OIDCSourceRepositoryOwnerIdentifier";
224
+ getExtensionValue(cert) {
225
+ return cert.extSourceRepositoryOwnerIdentifier?.sourceRepositoryOwnerIdentifier;
226
+ }
227
+ }
228
+ /**
229
+ * Verifies the certificate's Build Config URI.
230
+ * OID: 1.3.6.1.4.1.57264.1.18
231
+ */
232
+ export class OIDCBuildConfigURI extends SingleX509ExtPolicyV2 {
233
+ oid = EXTENSION_OID_BUILD_CONFIG_URI;
234
+ name = "OIDCBuildConfigURI";
235
+ getExtensionValue(cert) {
236
+ return cert.extBuildConfigURI?.buildConfigURI;
237
+ }
238
+ }
239
+ /**
240
+ * Verifies the certificate's Build Config Digest.
241
+ * OID: 1.3.6.1.4.1.57264.1.19
242
+ */
243
+ export class OIDCBuildConfigDigest extends SingleX509ExtPolicyV2 {
244
+ oid = EXTENSION_OID_BUILD_CONFIG_DIGEST;
245
+ name = "OIDCBuildConfigDigest";
246
+ getExtensionValue(cert) {
247
+ return cert.extBuildConfigDigest?.buildConfigDigest;
248
+ }
249
+ }
250
+ /**
251
+ * Verifies the certificate's Build Trigger.
252
+ * OID: 1.3.6.1.4.1.57264.1.20
253
+ */
254
+ export class OIDCBuildTrigger extends SingleX509ExtPolicyV2 {
255
+ oid = EXTENSION_OID_BUILD_TRIGGER;
256
+ name = "OIDCBuildTrigger";
257
+ getExtensionValue(cert) {
258
+ return cert.extBuildTrigger?.buildTrigger;
259
+ }
260
+ }
261
+ /**
262
+ * Verifies the certificate's Run Invocation URI.
263
+ * OID: 1.3.6.1.4.1.57264.1.21
264
+ */
265
+ export class OIDCRunInvocationURI extends SingleX509ExtPolicyV2 {
266
+ oid = EXTENSION_OID_RUN_INVOCATION_URI;
267
+ name = "OIDCRunInvocationURI";
268
+ getExtensionValue(cert) {
269
+ return cert.extRunInvocationURI?.runInvocationURI;
270
+ }
271
+ }
272
+ /**
273
+ * Verifies the certificate's Source Repository Visibility at signing.
274
+ * OID: 1.3.6.1.4.1.57264.1.22
275
+ */
276
+ export class OIDCSourceRepositoryVisibility extends SingleX509ExtPolicyV2 {
277
+ oid = EXTENSION_OID_SOURCE_REPOSITORY_VISIBILITY;
278
+ name = "OIDCSourceRepositoryVisibility";
279
+ getExtensionValue(cert) {
280
+ return cert.extSourceRepositoryVisibility?.sourceRepositoryVisibility;
281
+ }
282
+ }
283
+ // ============================================================================
284
+ // Policy Combinators
285
+ // ============================================================================
286
+ /**
287
+ * The "any of" policy, corresponding to a logical OR between child policies.
288
+ * An empty list of child policies is considered trivially invalid.
289
+ */
290
+ export class AnyOf {
291
+ children;
292
+ constructor(children) {
293
+ this.children = children;
294
+ }
295
+ verify(cert) {
296
+ for (const child of this.children) {
297
+ try {
298
+ child.verify(cert);
299
+ return;
300
+ }
301
+ catch {
302
+ // Continue to next policy
303
+ }
304
+ }
305
+ throw new PolicyError(`0 of ${this.children.length} policies succeeded`);
306
+ }
307
+ }
308
+ /**
309
+ * The "all of" policy, corresponding to a logical AND between child policies.
310
+ * An empty list of child policies is considered trivially invalid.
311
+ */
312
+ export class AllOf {
313
+ children;
314
+ constructor(children) {
315
+ this.children = children;
316
+ }
317
+ verify(cert) {
318
+ if (this.children.length < 1) {
319
+ throw new PolicyError("no child policies to verify");
320
+ }
321
+ for (const child of this.children) {
322
+ child.verify(cert);
323
+ }
324
+ }
325
+ }
326
+ // ============================================================================
327
+ // Identity Policy
328
+ // ============================================================================
329
+ /**
330
+ * Verifies the certificate's "identity", corresponding to the X.509v3 SAN.
331
+ *
332
+ * Identities can be verified modulo an OIDC issuer, to prevent an unexpected
333
+ * issuer from offering a particular identity.
334
+ *
335
+ * Supported SAN types include emails, URIs, and Sigstore-specific "other names".
336
+ */
337
+ export class Identity {
338
+ identity;
339
+ issuerPolicy;
340
+ constructor(options) {
341
+ this.identity = options.identity;
342
+ this.issuerPolicy = options.issuer ? new OIDCIssuer(options.issuer) : null;
343
+ }
344
+ verify(cert) {
345
+ if (this.issuerPolicy) {
346
+ this.issuerPolicy.verify(cert);
347
+ }
348
+ const sanExt = cert.extSubjectAltName;
349
+ if (!sanExt) {
350
+ throw new PolicyError("Certificate does not contain SubjectAlternativeName extension");
351
+ }
352
+ const allSans = new Set();
353
+ // Add email (rfc822Name)
354
+ if (sanExt.rfc822Name) {
355
+ allSans.add(sanExt.rfc822Name);
356
+ }
357
+ // Add URI
358
+ if (sanExt.uri) {
359
+ allSans.add(sanExt.uri);
360
+ }
361
+ // Add Sigstore-specific otherName
362
+ const otherName = sanExt.otherName(EXTENSION_OID_OTHERNAME);
363
+ if (otherName) {
364
+ allSans.add(otherName);
365
+ }
366
+ if (!allSans.has(this.identity)) {
367
+ throw new PolicyError(`Certificate's SANs do not match ${this.identity}; actual SANs: ${Array.from(allSans).join(", ")}`);
368
+ }
369
+ }
370
+ }
371
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}