@@ -15,6 +15,7 @@ import (
15
15
intoto "github.com/in-toto/in-toto-golang/in_toto"
16
16
"github.com/secure-systems-lab/go-securesystemslib/dsse"
17
17
serrors "github.com/slsa-framework/slsa-verifier/v2/errors"
18
+ "github.com/slsa-framework/slsa-verifier/v2/options"
18
19
"github.com/slsa-framework/slsa-verifier/v2/verifiers/internal/gha/slsaprovenance"
19
20
"github.com/slsa-framework/slsa-verifier/v2/verifiers/internal/gha/slsaprovenance/common"
20
21
"github.com/slsa-framework/slsa-verifier/v2/verifiers/utils"
@@ -68,6 +69,7 @@ func (b *BundleBytes) UnmarshalJSON(data []byte) error {
68
69
type Npm struct {
69
70
ctx context.Context
70
71
root * TrustedRoot
72
+ verifiedBuilderID * utils.TrustedBuilderID
71
73
verifiedProvenanceAtt * SignedAttestation
72
74
verifiedPublishAtt * SignedAttestation
73
75
provenanceAttestation * attestation
@@ -93,8 +95,9 @@ func NpmNew(ctx context.Context, root *TrustedRoot, attestationBytes []byte) (*N
93
95
return nil , err
94
96
}
95
97
return & Npm {
96
- ctx : ctx ,
97
- root : root ,
98
+ ctx : ctx ,
99
+ root : root ,
100
+
98
101
provenanceAttestation : prov ,
99
102
publishAttestation : pub ,
100
103
}, nil
@@ -251,7 +254,7 @@ func (n *Npm) verifyPackageName(name *string) error {
251
254
}
252
255
253
256
// Verify subject name in provenance.
254
- if err := verifyProvenanceSubjectName (n .verifiedProvenanceAtt , * name ); err != nil {
257
+ if err := verifyProvenanceSubjectName (n .verifiedBuilderID , n . verifiedProvenanceAtt , * name ); err != nil {
255
258
return err
256
259
}
257
260
@@ -274,7 +277,7 @@ func (n *Npm) verifyPackageVersion(version *string) error {
274
277
}
275
278
276
279
// Verify subject version in provenance.
277
- if err := verifyProvenanceSubjectVersion (n .verifiedProvenanceAtt , * version ); err != nil {
280
+ if err := verifyProvenanceSubjectVersion (n .verifiedBuilderID , n . verifiedProvenanceAtt , * version ); err != nil {
278
281
return err
279
282
}
280
283
@@ -291,6 +294,25 @@ func (n *Npm) verifyPackageVersion(version *string) error {
291
294
return nil
292
295
}
293
296
297
+ func (n * Npm ) verifyBuilderID (
298
+ provenanceOpts * options.ProvenanceOpts ,
299
+ builderOpts * options.BuilderOpts ,
300
+ defaultBuilders map [string ]bool ,
301
+ ) (* utils.TrustedBuilderID , error ) {
302
+ // Verify certificate information.
303
+ builder , err := verifyNpmEnvAndCert (
304
+ n .ProvenanceEnvelope (),
305
+ n .ProvenanceLeafCertificate (),
306
+ provenanceOpts , builderOpts ,
307
+ defaultBuilders ,
308
+ )
309
+ if err != nil {
310
+ return nil , err
311
+ }
312
+ n .verifiedBuilderID = builder
313
+ return builder , err
314
+ }
315
+
294
316
func verifyPublishPredicateVersion (att * SignedAttestation , expectedVersion string ) error {
295
317
_ , version , err := getPublishPredicateData (att )
296
318
if err != nil {
@@ -336,8 +358,8 @@ func getPublishPredicateData(att *SignedAttestation) (string, string, error) {
336
358
return statement .Predicate .Name , statement .Predicate .Version , nil
337
359
}
338
360
339
- func verifyProvenanceSubjectVersion (att * SignedAttestation , expectedVersion string ) error {
340
- subject , err := getSubject (att )
361
+ func verifyProvenanceSubjectVersion (b * utils. TrustedBuilderID , att * SignedAttestation , expectedVersion string ) error {
362
+ subject , err := getSubject (b , att )
341
363
if err != nil {
342
364
return err
343
365
}
@@ -378,15 +400,15 @@ func verifyPublishSubjectName(att *SignedAttestation, expectedName string) error
378
400
return verifyName (name , expectedName )
379
401
}
380
402
381
- func verifyProvenanceSubjectName (att * SignedAttestation , expectedName string ) error {
382
- prov , err := slsaprovenance .ProvenanceFromEnvelope (att .Envelope )
403
+ func verifyProvenanceSubjectName (b * utils. TrustedBuilderID , att * SignedAttestation , expectedName string ) error {
404
+ prov , err := slsaprovenance .ProvenanceFromEnvelope (b . Name (), att .Envelope )
383
405
if err != nil {
384
- return nil
406
+ return fmt . Errorf ( "reading provenance: %w" , err )
385
407
}
386
408
387
409
subjects , err := prov .Subjects ()
388
410
if err != nil {
389
- return fmt .Errorf ("%w" , serrors .ErrorInvalidDssePayload )
411
+ return fmt .Errorf ("%w: %w " , serrors .ErrorInvalidDssePayload , err )
390
412
}
391
413
if len (subjects ) != 1 {
392
414
return fmt .Errorf ("%w: expected 1 subject, got %v" , serrors .ErrorInvalidDssePayload , len (subjects ))
@@ -443,8 +465,8 @@ func getPackageNameAndVersion(name string) (string, string, error) {
443
465
return pkgname , pkgtag , nil
444
466
}
445
467
446
- func getSubject (att * SignedAttestation ) (string , error ) {
447
- prov , err := slsaprovenance .ProvenanceFromEnvelope (att .Envelope )
468
+ func getSubject (b * utils. TrustedBuilderID , att * SignedAttestation ) (string , error ) {
469
+ prov , err := slsaprovenance .ProvenanceFromEnvelope (b . Name (), att .Envelope )
448
470
if err != nil {
449
471
return "" , err
450
472
}
0 commit comments