@@ -25,11 +25,10 @@ import (
2525
2626 jsoniter "github.com/json-iterator/go"
2727
28+ slsa01 "github.com/in-toto/attestation/go/predicates/provenance/v01"
29+ slsa02 "github.com/in-toto/attestation/go/predicates/provenance/v02"
2830 slsa1 "github.com/in-toto/attestation/go/predicates/provenance/v1"
2931 attestationv1 "github.com/in-toto/attestation/go/v1"
30- scommon "github.com/in-toto/in-toto-golang/in_toto/slsa_provenance/common"
31- slsa01 "github.com/in-toto/in-toto-golang/in_toto/slsa_provenance/v0.1"
32- slsa02 "github.com/in-toto/in-toto-golang/in_toto/slsa_provenance/v0.2"
3332 "github.com/jeremywohl/flatten"
3433 "google.golang.org/protobuf/encoding/protojson"
3534
@@ -46,6 +45,8 @@ import (
4645// - An IsOccurence input spec which will generate a predicate for each occurence
4746
4847const PredicateSLSAProvenancev1 = "https://slsa.dev/provenance/v1"
48+ const PredicateSLSAProvenancev01 = "https://slsa.dev/provenance/v0.1"
49+ const PredicateSLSAProvenancev02 = "https://slsa.dev/provenance/v0.2"
4950
5051var ErrMetadataNil = errors .New ("SLSA Metadata is nil" )
5152var ErrBuilderNil = errors .New ("SLSA Builder is nil" )
@@ -61,8 +62,8 @@ type slsaEntity struct {
6162}
6263
6364type slsaParser struct {
64- pred01 * slsa01.ProvenancePredicate
65- pred02 * slsa02.ProvenancePredicate
65+ pred01 * slsa01.Provenance
66+ pred02 * slsa02.Provenance
6667 pred1 * slsa1.Provenance
6768 smt * attestationv1.Statement
6869 subjects []* slsaEntity
@@ -89,7 +90,6 @@ func (s *slsaParser) initializeSLSAParser() {
8990 s .subjects = make ([]* slsaEntity , 0 )
9091 s .materials = make ([]* slsaEntity , 0 )
9192 s .bareMaterials = make ([]* model.ArtifactInputSpec , 0 )
92- s .bareMaterials = make ([]* model.ArtifactInputSpec , 0 )
9393 s .builder = nil
9494 s .slsaAttestation = nil
9595 s .identifierStrings = & common.IdentifierStrings {}
@@ -131,12 +131,12 @@ func (s *slsaParser) getSubject() error {
131131
132132func (s * slsaParser ) getMaterials () error {
133133 switch s .smt .PredicateType {
134- case slsa01 . PredicateSLSAProvenance :
135- if err := s .getMaterials0 (s .pred01 .Materials ); err != nil {
134+ case PredicateSLSAProvenancev01 :
135+ if err := s .getMaterials01 (s .pred01 .Materials ); err != nil {
136136 return err
137137 }
138- case slsa02 . PredicateSLSAProvenance :
139- if err := s .getMaterials0 (s .pred02 .Materials ); err != nil {
138+ case PredicateSLSAProvenancev02 :
139+ if err := s .getMaterials02 (s .pred02 .Materials ); err != nil {
140140 return err
141141 }
142142 case PredicateSLSAProvenancev1 :
@@ -174,11 +174,24 @@ func (s *slsaParser) getMaterials1(rds []*attestationv1.ResourceDescriptor) erro
174174 return nil
175175}
176176
177- func (s * slsaParser ) getMaterials0 (materials []scommon.ProvenanceMaterial ) error {
177+ func (s * slsaParser ) getMaterials01 (materials []* slsa01.Material ) error {
178+ // append dependency nodes for the materials
179+ for _ , mat := range materials {
180+ s .identifierStrings .UnclassifiedStrings = append (s .identifierStrings .UnclassifiedStrings , mat .Uri )
181+ se , err := getSlsaEntity ("" , mat .Uri , mat .Digest )
182+ if err != nil {
183+ return err
184+ }
185+ s .materials = append (s .materials , se )
186+ }
187+ return nil
188+ }
189+
190+ func (s * slsaParser ) getMaterials02 (materials []* slsa02.Material ) error {
178191 // append dependency nodes for the materials
179192 for _ , mat := range materials {
180- s .identifierStrings .UnclassifiedStrings = append (s .identifierStrings .UnclassifiedStrings , mat .URI )
181- se , err := getSlsaEntity ("" , mat .URI , mat .Digest )
193+ s .identifierStrings .UnclassifiedStrings = append (s .identifierStrings .UnclassifiedStrings , mat .Uri )
194+ se , err := getSlsaEntity ("" , mat .Uri , mat .Digest )
182195 if err != nil {
183196 return err
184197 }
@@ -187,7 +200,7 @@ func (s *slsaParser) getMaterials0(materials []scommon.ProvenanceMaterial) error
187200 return nil
188201}
189202
190- func getArtifacts (digests scommon. DigestSet ) []* model.ArtifactInputSpec {
203+ func getArtifacts (digests map [ string ] string ) []* model.ArtifactInputSpec {
191204 var artifacts []* model.ArtifactInputSpec
192205 for alg , ds := range digests {
193206 artifacts = append (artifacts , & model.ArtifactInputSpec {
@@ -198,7 +211,7 @@ func getArtifacts(digests scommon.DigestSet) []*model.ArtifactInputSpec {
198211 return artifacts
199212}
200213
201- func getSlsaEntity (name , uri string , digests scommon. DigestSet ) (* slsaEntity , error ) {
214+ func getSlsaEntity (name , uri string , digests map [ string ] string ) (* slsaEntity , error ) {
202215 artifacts := getArtifacts (digests )
203216 slsa := & slsaEntity {
204217 artifacts : artifacts ,
@@ -231,33 +244,39 @@ func getSlsaEntity(name, uri string, digests scommon.DigestSet) (*slsaEntity, er
231244 return nil , fmt .Errorf ("%w unable to get Guac Generic Purl, this should not happen" , err )
232245}
233246
234- func fillSLSA01 (inp * model.SLSAInputSpec , pred * slsa01.ProvenancePredicate ) error {
235- inp .BuildType = pred .Recipe .Type
247+ func fillSLSA01 (inp * model.SLSAInputSpec , pred * slsa01.Provenance ) error {
248+ if pred .Recipe != nil {
249+ inp .BuildType = pred .Recipe .Type
250+ }
236251
237252 if pred .Metadata == nil {
238253 return ErrMetadataNil
239254 }
240255 if pred .Metadata .BuildStartedOn != nil {
241- inp .StartedOn = pred .Metadata .BuildStartedOn
256+ startTimePB := time .Unix (pred .Metadata .BuildStartedOn .GetSeconds (), int64 (pred .Metadata .BuildStartedOn .GetNanos ()))
257+ inp .StartedOn = & startTimePB
242258 }
243259 if pred .Metadata .BuildFinishedOn != nil {
244- inp .FinishedOn = pred .Metadata .BuildFinishedOn
260+ finishTimePB := time .Unix (pred .Metadata .BuildFinishedOn .GetSeconds (), int64 (pred .Metadata .BuildFinishedOn .GetNanos ()))
261+ inp .FinishedOn = & finishTimePB
245262 }
246263
247264 return nil
248265}
249266
250- func fillSLSA02 (inp * model.SLSAInputSpec , pred * slsa02.ProvenancePredicate ) error {
267+ func fillSLSA02 (inp * model.SLSAInputSpec , pred * slsa02.Provenance ) error {
251268 inp .BuildType = pred .BuildType
252269
253270 if pred .Metadata == nil {
254271 return ErrMetadataNil
255272 }
256273 if pred .Metadata .BuildStartedOn != nil {
257- inp .StartedOn = pred .Metadata .BuildStartedOn
274+ startTimePB := time .Unix (pred .Metadata .BuildStartedOn .GetSeconds (), int64 (pred .Metadata .BuildStartedOn .GetNanos ()))
275+ inp .StartedOn = & startTimePB
258276 }
259277 if pred .Metadata .BuildFinishedOn != nil {
260- inp .FinishedOn = pred .Metadata .BuildStartedOn
278+ finishTimePB := time .Unix (pred .Metadata .BuildFinishedOn .GetSeconds (), int64 (pred .Metadata .BuildFinishedOn .GetNanos ()))
279+ inp .FinishedOn = & finishTimePB
261280 }
262281 return nil
263282}
@@ -272,7 +291,7 @@ func fillSLSA1(inp *model.SLSAInputSpec, pred *slsa1.Provenance) error {
272291 inp .StartedOn = & startTimePB
273292 }
274293 if pred .RunDetails .Metadata .FinishedOn != nil {
275- finishTimePB := time .Unix (pred .RunDetails .Metadata .StartedOn .GetSeconds (), int64 (pred .RunDetails .Metadata .StartedOn .GetNanos ()))
294+ finishTimePB := time .Unix (pred .RunDetails .Metadata .FinishedOn .GetSeconds (), int64 (pred .RunDetails .Metadata .FinishedOn .GetNanos ()))
276295 inp .FinishedOn = & finishTimePB
277296 }
278297 return nil
@@ -286,18 +305,18 @@ func (s *slsaParser) getSLSA() error {
286305 var data []byte
287306 var err error
288307 switch s .smt .PredicateType {
289- case slsa01 . PredicateSLSAProvenance :
308+ case PredicateSLSAProvenancev01 :
290309 if err := fillSLSA01 (inp , s .pred01 ); err != nil {
291310 return fmt .Errorf ("could not fill SLSA01: %w" , err )
292311 }
293- if data , err = json .Marshal (s .pred01 ); err != nil {
312+ if data , err = protojson .Marshal (s .pred01 ); err != nil {
294313 return fmt .Errorf ("could not marshal SLSA01: %w" , err )
295314 }
296- case slsa02 . PredicateSLSAProvenance :
315+ case PredicateSLSAProvenancev02 :
297316 if err := fillSLSA02 (inp , s .pred02 ); err != nil {
298317 return fmt .Errorf ("could not fill SLSA02: %w" , err )
299318 }
300- if data , err = json .Marshal (s .pred02 ); err != nil {
319+ if data , err = protojson .Marshal (s .pred02 ); err != nil {
301320 return fmt .Errorf ("could not marshal SLSA02: %w" , err )
302321 }
303322 case PredicateSLSAProvenancev1 :
@@ -335,10 +354,10 @@ func (s *slsaParser) getSLSA() error {
335354func (s * slsaParser ) getBuilder () error {
336355 s .builder = & model.BuilderInputSpec {}
337356 switch s .smt .PredicateType {
338- case slsa01 . PredicateSLSAProvenance :
339- s .builder .Uri = s .pred01 .Builder .ID
340- case slsa02 . PredicateSLSAProvenance :
341- s .builder .Uri = s .pred02 .Builder .ID
357+ case PredicateSLSAProvenancev01 :
358+ s .builder .Uri = s .pred01 .Builder .Id
359+ case PredicateSLSAProvenancev02 :
360+ s .builder .Uri = s .pred02 .Builder .Id
342361 case PredicateSLSAProvenancev1 :
343362 if s .pred1 .RunDetails == nil || s .pred1 .RunDetails .Builder == nil {
344363 return ErrBuilderNil
@@ -360,14 +379,14 @@ func (s *slsaParser) parseSlsaPredicate(p []byte) error {
360379 }
361380
362381 switch s .smt .PredicateType {
363- case slsa01 . PredicateSLSAProvenance :
364- s .pred01 = & slsa01.ProvenancePredicate {}
365- if err := json .Unmarshal (predBytes , s .pred01 ); err != nil {
382+ case PredicateSLSAProvenancev01 :
383+ s .pred01 = & slsa01.Provenance {}
384+ if err := protojson .Unmarshal (predBytes , s .pred01 ); err != nil {
366385 return fmt .Errorf ("Could not unmarshal v0.1 SLSA provenance statement : %w" , err )
367386 }
368- case slsa02 . PredicateSLSAProvenance :
369- s .pred02 = & slsa02.ProvenancePredicate {}
370- if err := json .Unmarshal (predBytes , s .pred02 ); err != nil {
387+ case PredicateSLSAProvenancev02 :
388+ s .pred02 = & slsa02.Provenance {}
389+ if err := protojson .Unmarshal (predBytes , s .pred02 ); err != nil {
371390 return fmt .Errorf ("Could not unmarshal v0.2 SLSA provenance statement : %w" , err )
372391 }
373392 case PredicateSLSAProvenancev1 :
0 commit comments