@@ -14,13 +14,15 @@ import (
1414 "github.com/docker/attest/oci"
1515 "github.com/docker/attest/policy"
1616 "github.com/docker/attest/tuf"
17+ "github.com/docker/attest/version"
1718 intoto "github.com/in-toto/in-toto-golang/in_toto"
1819)
1920
2021type ImageVerifier struct {
2122 opts * policy.Options
2223 tufClient tuf.Downloader
2324 attestationVerifier attestation.Verifier
25+ versionFetcher version.Fetcher
2426}
2527
2628func NewImageVerifier (ctx context.Context , opts * policy.Options ) (* ImageVerifier , error ) {
@@ -46,6 +48,7 @@ func NewImageVerifier(ctx context.Context, opts *policy.Options) (*ImageVerifier
4648 opts : opts ,
4749 tufClient : tufClient ,
4850 attestationVerifier : attestationVerifier ,
51+ versionFetcher : version .NewGoVersionFetcher (),
4952 }, nil
5053}
5154
@@ -93,7 +96,7 @@ func (verifier *ImageVerifier) Verify(ctx context.Context, src *oci.ImageSpec) (
9396 return nil , fmt .Errorf ("failed to create attestation resolver: %w" , err )
9497 }
9598 evaluator := policy .NewRegoEvaluator (verifier .opts .Debug , verifier .attestationVerifier )
96- result , err = verifyAttestations (ctx , resolver , evaluator , resolvedPolicy , verifier . opts )
99+ result , err = verifier . verifyAttestations (ctx , resolver , evaluator , resolvedPolicy )
97100 if err != nil {
98101 return nil , fmt .Errorf ("failed to evaluate policy: %w" , err )
99102 }
@@ -141,7 +144,7 @@ func defaultLocalTargetsDir() (string, error) {
141144 return filepath .Join (homeDir , ".docker" , "tuf" ), nil
142145}
143146
144- func toVerificationResult (p * policy.Policy , input * policy.Input , result * policy.Result ) (* VerificationResult , error ) {
147+ func toVerificationResult (p * policy.Policy , input * policy.Input , result * policy.Result , versionFetcher version. Fetcher ) (* VerificationResult , error ) {
145148 dgst , err := oci .SplitDigest (input .Digest )
146149 if err != nil {
147150 return nil , fmt .Errorf ("failed to split digest: %w" , err )
@@ -168,6 +171,10 @@ func toVerificationResult(p *policy.Policy, input *policy.Input, result *policy.
168171 }
169172
170173 vsaPolicy := attestation.VSAPolicy {URI : result .Summary .PolicyURI , DownloadLocation : p .URI , Digest : p .Digest }
174+ attestVersion , err := attestation .GetVerifierVersion (versionFetcher )
175+ if err != nil {
176+ return nil , fmt .Errorf ("failed to get verifier version: %w" , err )
177+ }
171178
172179 return & VerificationResult {
173180 Policy : p ,
@@ -182,7 +189,8 @@ func toVerificationResult(p *policy.Policy, input *policy.Input, result *policy.
182189 },
183190 Predicate : attestation.VSAPredicate {
184191 Verifier : attestation.VSAVerifier {
185- ID : result .Summary .Verifier ,
192+ ID : result .Summary .Verifier ,
193+ Version : attestVersion ,
186194 },
187195 TimeVerified : time .Now ().UTC ().Format (time .RFC3339 ),
188196 ResourceURI : resourceURI ,
@@ -195,7 +203,7 @@ func toVerificationResult(p *policy.Policy, input *policy.Input, result *policy.
195203 }, nil
196204}
197205
198- func verifyAttestations (ctx context.Context , resolver attestation.Resolver , evaluator policy.Evaluator , resolvedPolicy * policy.Policy , opts * policy. Options ) (* VerificationResult , error ) {
206+ func ( verifier * ImageVerifier ) verifyAttestations (ctx context.Context , resolver attestation.Resolver , evaluator policy.Evaluator , resolvedPolicy * policy.Policy ) (* VerificationResult , error ) {
199207 desc , err := resolver .ImageDescriptor (ctx )
200208 if err != nil {
201209 return nil , fmt .Errorf ("failed to get image descriptor: %w" , err )
@@ -247,7 +255,7 @@ func verifyAttestations(ctx context.Context, resolver attestation.Resolver, eval
247255 Domain : reference .Domain (ref ),
248256 NormalizedName : reference .Path (ref ),
249257 FamiliarName : reference .FamiliarName (ref ),
250- Parameters : opts .Parameters ,
258+ Parameters : verifier . opts .Parameters ,
251259 }
252260 // rego has null strings
253261 if tag != "" {
@@ -257,7 +265,7 @@ func verifyAttestations(ctx context.Context, resolver attestation.Resolver, eval
257265 if err != nil {
258266 return nil , fmt .Errorf ("policy evaluation failed: %w" , err )
259267 }
260- verificationResult , err := toVerificationResult (resolvedPolicy , input , result )
268+ verificationResult , err := toVerificationResult (resolvedPolicy , input , result , verifier . versionFetcher )
261269 if err != nil {
262270 return nil , fmt .Errorf ("failed to convert to policy result: %w" , err )
263271 }
0 commit comments