Skip to content

Commit 33a1885

Browse files
committed
update
Signed-off-by: laurentsimon <[email protected]>
1 parent 0c60bac commit 33a1885

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
@@ -383,6 +383,101 @@ func Test_verifySourceURI(t *testing.T) {
383383
}
384384
}
385385

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

0 commit comments

Comments
 (0)