Skip to content

Commit ed32618

Browse files
committed
history: slsa v1 support
Signed-off-by: CrazyMax <[email protected]>
1 parent ba782f1 commit ed32618

File tree

2 files changed

+31
-16
lines changed

2 files changed

+31
-16
lines changed

commands/history/inspect.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -426,23 +426,32 @@ workers0:
426426
}
427427

428428
provIndex := slices.IndexFunc(attachments, func(a attachment) bool {
429-
return descrType(a.descr) == slsa02.PredicateSLSAProvenance
429+
return strings.HasPrefix(descrType(a.descr), "https://slsa.dev/provenance/")
430430
})
431431
if provIndex != -1 {
432432
prov := attachments[provIndex]
433+
predType := descrType(prov.descr)
433434
dt, err := content.ReadBlob(ctx, store, prov.descr)
434435
if err != nil {
435436
return errors.Errorf("failed to read provenance %s: %v", prov.descr.Digest, err)
436437
}
437-
var pred provenancetypes.ProvenancePredicateSLSA02
438-
if err := json.Unmarshal(dt, &pred); err != nil {
438+
var pred *provenancetypes.ProvenancePredicateSLSA1
439+
if predType == slsa02.PredicateSLSAProvenance {
440+
var pred02 *provenancetypes.ProvenancePredicateSLSA02
441+
if err := json.Unmarshal(dt, pred02); err != nil {
442+
return errors.Errorf("failed to unmarshal provenance %s: %v", prov.descr.Digest, err)
443+
}
444+
pred = provenancetypes.ConvertSLSA02ToSLSA1(pred02)
445+
} else if err := json.Unmarshal(dt, pred); err != nil {
439446
return errors.Errorf("failed to unmarshal provenance %s: %v", prov.descr.Digest, err)
440447
}
441-
for _, m := range pred.Materials {
442-
out.Materials = append(out.Materials, materialOutput{
443-
URI: m.URI,
444-
Digests: digestSetToDigests(m.Digest),
445-
})
448+
if pred != nil {
449+
for _, m := range pred.BuildDefinition.ResolvedDependencies {
450+
out.Materials = append(out.Materials, materialOutput{
451+
URI: m.URI,
452+
Digests: digestSetToDigests(m.Digest),
453+
})
454+
}
446455
}
447456
}
448457

commands/history/inspect_attachment.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/docker/cli/cli/command"
1212
intoto "github.com/in-toto/in-toto-golang/in_toto"
1313
slsa02 "github.com/in-toto/in-toto-golang/in_toto/slsa_provenance/v0.2"
14+
slsa1 "github.com/in-toto/in-toto-golang/in_toto/slsa_provenance/v1"
1415
"github.com/opencontainers/go-digest"
1516
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
1617
"github.com/pkg/errors"
@@ -76,25 +77,30 @@ func runAttachment(ctx context.Context, dockerCli command.Cli, opts attachmentOp
7677
return err
7778
}
7879

79-
typ := opts.typ
80-
switch typ {
80+
types := make(map[string]struct{})
81+
switch opts.typ {
8182
case "index":
82-
typ = ocispecs.MediaTypeImageIndex
83+
types[ocispecs.MediaTypeImageIndex] = struct{}{}
8384
case "manifest":
84-
typ = ocispecs.MediaTypeImageManifest
85+
types[ocispecs.MediaTypeImageManifest] = struct{}{}
8586
case "image":
86-
typ = ocispecs.MediaTypeImageConfig
87+
types[ocispecs.MediaTypeImageConfig] = struct{}{}
8788
case "provenance":
88-
typ = slsa02.PredicateSLSAProvenance
89+
types[slsa1.PredicateSLSAProvenance] = struct{}{}
90+
types[slsa02.PredicateSLSAProvenance] = struct{}{}
8991
case "sbom":
90-
typ = intoto.PredicateSPDX
92+
types[intoto.PredicateSPDX] = struct{}{}
93+
default:
94+
if opts.typ != "" {
95+
types[opts.typ] = struct{}{}
96+
}
9197
}
9298

9399
for _, a := range attachments {
94100
if opts.platform != "" && (a.platform == nil || platforms.FormatAll(*a.platform) != opts.platform) {
95101
continue
96102
}
97-
if typ != "" && descrType(a.descr) != typ {
103+
if _, ok := types[descrType(a.descr)]; opts.typ != "" && !ok {
98104
continue
99105
}
100106
ra, err := store.ReaderAt(ctx, a.descr)

0 commit comments

Comments
 (0)