@@ -13,6 +13,7 @@ import (
1313 "github.com/containerd/containerd/v2/core/content/proxy"
1414 "github.com/docker/buildx/util/confutil"
1515 "github.com/docker/buildx/util/progress"
16+ slsa1 "github.com/in-toto/in-toto-golang/in_toto/slsa_provenance/v1"
1617 controlapi "github.com/moby/buildkit/api/services/control"
1718 "github.com/moby/buildkit/client"
1819 provenancetypes "github.com/moby/buildkit/solver/llbsolver/provenance/types"
@@ -22,15 +23,6 @@ import (
2223 "golang.org/x/sync/errgroup"
2324)
2425
25- type provenancePredicate struct {
26- Builder * provenanceBuilder `json:"builder,omitempty"`
27- provenancetypes.ProvenancePredicateSLSA02
28- }
29-
30- type provenanceBuilder struct {
31- ID string `json:"id,omitempty"`
32- }
33-
3426func setRecordProvenance (ctx context.Context , c * client.Client , sr * client.SolveResponse , ref string , mode confutil.MetadataProvenanceMode , pw progress.Writer ) error {
3527 if mode == confutil .MetadataProvenanceModeDisabled {
3628 return nil
@@ -69,7 +61,7 @@ func fetchProvenance(ctx context.Context, c *client.Client, ref string, mode con
6961 continue
7062 }
7163 if ev .Record .Result != nil {
72- desc := lookupProvenance (ev .Record .Result )
64+ desc , predicateType := lookupProvenance (ev .Record .Result )
7365 if desc == nil {
7466 continue
7567 }
@@ -78,7 +70,7 @@ func fetchProvenance(ctx context.Context, c *client.Client, ref string, mode con
7870 if err != nil {
7971 return errors .Wrapf (err , "failed to load provenance blob from build record" )
8072 }
81- prv , err := encodeProvenance (dt , mode )
73+ prv , err := encodeProvenance (dt , predicateType , mode )
8274 if err != nil {
8375 return err
8476 }
@@ -92,7 +84,7 @@ func fetchProvenance(ctx context.Context, c *client.Client, ref string, mode con
9284 })
9385 } else if ev .Record .Results != nil {
9486 for platform , res := range ev .Record .Results {
95- desc := lookupProvenance (res )
87+ desc , predicateType := lookupProvenance (res )
9688 if desc == nil {
9789 continue
9890 }
@@ -101,7 +93,7 @@ func fetchProvenance(ctx context.Context, c *client.Client, ref string, mode con
10193 if err != nil {
10294 return errors .Wrapf (err , "failed to load provenance blob from build record" )
10395 }
104- prv , err := encodeProvenance (dt , mode )
96+ prv , err := encodeProvenance (dt , predicateType , mode )
10597 if err != nil {
10698 return err
10799 }
@@ -119,35 +111,37 @@ func fetchProvenance(ctx context.Context, c *client.Client, ref string, mode con
119111 return out , eg .Wait ()
120112}
121113
122- func lookupProvenance (res * controlapi.BuildResultInfo ) * ocispecs.Descriptor {
114+ func lookupProvenance (res * controlapi.BuildResultInfo ) ( * ocispecs.Descriptor , string ) {
123115 for _ , a := range res .Attestations {
124116 if a .MediaType == "application/vnd.in-toto+json" && strings .HasPrefix (a .Annotations ["in-toto.io/predicate-type" ], "https://slsa.dev/provenance/" ) {
125117 return & ocispecs.Descriptor {
126118 Digest : digest .Digest (a .Digest ),
127119 Size : a .Size ,
128120 MediaType : a .MediaType ,
129121 Annotations : a .Annotations ,
130- }
122+ }, a . Annotations [ "in-toto.io/predicate-type" ]
131123 }
132124 }
133- return nil
125+ return nil , ""
134126}
135127
136- func encodeProvenance (dt []byte , mode confutil.MetadataProvenanceMode ) (string , error ) {
137- var prv provenancePredicate
138- if err := json .Unmarshal (dt , & prv ); err != nil {
128+ func encodeProvenance (dt []byte , predicateType string , mode confutil.MetadataProvenanceMode ) (string , error ) {
129+ var pred * provenancetypes.ProvenancePredicateSLSA02
130+ if predicateType == slsa1 .PredicateSLSAProvenance {
131+ var pred1 * provenancetypes.ProvenancePredicateSLSA1
132+ if err := json .Unmarshal (dt , & pred1 ); err != nil {
133+ return "" , errors .Wrapf (err , "failed to unmarshal provenance" )
134+ }
135+ pred = pred1 .ConvertToSLSA02 ()
136+ } else if err := json .Unmarshal (dt , & pred ); err != nil {
139137 return "" , errors .Wrapf (err , "failed to unmarshal provenance" )
140138 }
141- if prv .Builder != nil && prv .Builder .ID == "" {
142- // reset builder if id is empty
143- prv .Builder = nil
144- }
145139 if mode == confutil .MetadataProvenanceModeMin {
146140 // reset fields for minimal provenance
147- prv .BuildConfig = nil
148- prv .Metadata = nil
141+ pred .BuildConfig = nil
142+ pred .Metadata = nil
149143 }
150- dtprv , err := json .Marshal (prv )
144+ dtprv , err := json .Marshal (pred )
151145 if err != nil {
152146 return "" , errors .Wrapf (err , "failed to marshal provenance" )
153147 }
0 commit comments