Skip to content

Commit faf71d0

Browse files
committed
update
Signed-off-by: laurentsimon <[email protected]>
1 parent 668826e commit faf71d0

File tree

2 files changed

+109
-11
lines changed

2 files changed

+109
-11
lines changed

verifiers/internal/gha/provenance.go

+14-11
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,19 @@ func VerifyNpmPackageProvenance(env *dsselib.Envelope, workflow *WorkflowIdentit
277277
return nil
278278
}
279279

280+
func isValidDelegatorBuilderID(prov slsaprovenance.Provenance) error {
281+
// Verify the TRW was referenced at a proper tag by the user.
282+
id, err := prov.BuilderID()
283+
if err != nil {
284+
return err
285+
}
286+
parts := strings.Split(id, "@")
287+
if len(parts) != 2 {
288+
return fmt.Errorf("%w: %s", serrors.ErrorInvalidBuilderID, id)
289+
}
290+
return utils.IsValidBuilderTag(parts[1], false)
291+
}
292+
280293
func VerifyProvenance(env *dsselib.Envelope, provenanceOpts *options.ProvenanceOpts, byob bool,
281294
) error {
282295
prov, err := slsaprovenance.ProvenanceFromEnvelope(env)
@@ -286,19 +299,9 @@ func VerifyProvenance(env *dsselib.Envelope, provenanceOpts *options.ProvenanceO
286299

287300
// Verify Builder ID.
288301
if byob {
289-
// Verify the TRW was referenced at a proper tag by the user.
290-
id, err := prov.BuilderID()
291-
if err != nil {
292-
return err
293-
}
294-
parts := strings.Split(id, "@")
295-
if len(parts) != 2 {
296-
return fmt.Errorf("%w: %s", serrors.ErrorInvalidBuilderID, id)
297-
}
298-
if err := utils.IsValidBuilderTag(parts[1], false); err != nil {
302+
if err := isValidDelegatorBuilderID(prov); err != nil {
299303
return err
300304
}
301-
302305
// Note: `provenanceOpts.ExpectedBuilderID` is provided by the user.
303306
if err := verifyBuilderIDLooseMatch(prov, provenanceOpts.ExpectedBuilderID); err != nil {
304307
return err

verifiers/internal/gha/provenance_test.go

+95
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,101 @@ func Test_verifySourceURI(t *testing.T) {
382382
}
383383
}
384384

385+
func Test_isValidDelegatorBuilderID(t *testing.T) {
386+
t.Parallel()
387+
tests := []struct {
388+
name string
389+
prov *intoto.ProvenanceStatement
390+
err error
391+
}{
392+
{
393+
name: "no @",
394+
prov: &intoto.ProvenanceStatement{
395+
Predicate: slsa02.ProvenancePredicate{
396+
Builder: slsacommon.ProvenanceBuilder{
397+
ID: "some/builderID",
398+
},
399+
},
400+
},
401+
err: serrors.ErrorInvalidBuilderID,
402+
},
403+
{
404+
name: "invalid ref",
405+
prov: &intoto.ProvenanceStatement{
406+
Predicate: slsa02.ProvenancePredicate{
407+
Builder: slsacommon.ProvenanceBuilder{
408+
ID: "some/[email protected]",
409+
},
410+
},
411+
},
412+
err: serrors.ErrorInvalidRef,
413+
},
414+
{
415+
name: "invalid ref not tag",
416+
prov: &intoto.ProvenanceStatement{
417+
Predicate: slsa02.ProvenancePredicate{
418+
Builder: slsacommon.ProvenanceBuilder{
419+
ID: "some/builderID@refs/head/v1.2.3",
420+
},
421+
},
422+
},
423+
err: serrors.ErrorInvalidRef,
424+
},
425+
{
426+
name: "invalid ref not full semver",
427+
prov: &intoto.ProvenanceStatement{
428+
Predicate: slsa02.ProvenancePredicate{
429+
Builder: slsacommon.ProvenanceBuilder{
430+
ID: "some/builderID@refs/heads/v1.2",
431+
},
432+
},
433+
},
434+
err: serrors.ErrorInvalidRef,
435+
},
436+
{
437+
name: "valid builder",
438+
prov: &intoto.ProvenanceStatement{
439+
Predicate: slsa02.ProvenancePredicate{
440+
Builder: slsacommon.ProvenanceBuilder{
441+
ID: "some/builderID@refs/tags/v1.2.3",
442+
},
443+
},
444+
},
445+
},
446+
}
447+
for _, tt := range tests {
448+
tt := tt // Re-initializing variable so it is not changed while executing the closure below
449+
t.Run(tt.name, func(t *testing.T) {
450+
t.Parallel()
451+
452+
prov := &v02.ProvenanceV02{
453+
ProvenanceStatement: tt.prov,
454+
}
455+
456+
err := isValidDelegatorBuilderID(prov)
457+
if !errCmp(err, tt.err) {
458+
t.Errorf(cmp.Diff(err, tt.err))
459+
}
460+
461+
// Update to v1 SLSA provenance.
462+
prov1 := &v1.ProvenanceV1{
463+
Predicate: slsa1.ProvenancePredicate{
464+
RunDetails: slsa1.ProvenanceRunDetails{
465+
Builder: slsa1.Builder{
466+
ID: tt.prov.Predicate.Builder.ID,
467+
},
468+
},
469+
},
470+
}
471+
472+
err = isValidDelegatorBuilderID(prov1)
473+
if !errCmp(err, tt.err) {
474+
t.Errorf(cmp.Diff(err, tt.err))
475+
}
476+
})
477+
}
478+
}
479+
385480
func Test_verifyBuilderIDExactMatch(t *testing.T) {
386481
t.Parallel()
387482
tests := []struct {

0 commit comments

Comments
 (0)