@@ -10,6 +10,7 @@ import (
1010 "github.com/docker/attest/internal/test"
1111 "github.com/docker/attest/pkg/attest"
1212 "github.com/docker/attest/pkg/attestation"
13+ "github.com/docker/attest/pkg/config"
1314 "github.com/docker/attest/pkg/mirror"
1415 "github.com/docker/attest/pkg/oci"
1516 "github.com/docker/attest/pkg/policy"
@@ -21,21 +22,29 @@ import (
2122)
2223
2324var (
24- UnsignedTestImage = filepath .Join (".." , ".." , "test" , "testdata" , "unsigned-test-image" )
25- NoProvenanceImage = filepath .Join (".." , ".." , "test" , "testdata" , "no-provenance-image" )
26- PassPolicyDir = filepath .Join (".." , ".." , "test" , "testdata" , "local-policy-pass" )
27- PassNoTLPolicyDir = filepath .Join (".." , ".." , "test" , "testdata" , "local-policy-no-tl" )
28- FailPolicyDir = filepath .Join (".." , ".." , "test" , "testdata" , "local-policy-fail" )
29- TestTempDir = "attest-sign-test"
25+ UnsignedTestImage = filepath .Join (".." , ".." , "test" , "testdata" , "unsigned-test-image" )
26+ NoProvenanceImage = filepath .Join (".." , ".." , "test" , "testdata" , "no-provenance-image" )
27+ PassPolicyDir = filepath .Join (".." , ".." , "test" , "testdata" , "local-policy-pass" )
28+ LocalPolicy = filepath .Join (".." , ".." , "test" , "testdata" , "local-policy" )
29+ LocalPolicyAttached = filepath .Join (".." , ".." , "test" , "testdata" , "local-policy-attached" )
30+ PassNoTLPolicyDir = filepath .Join (".." , ".." , "test" , "testdata" , "local-policy-no-tl" )
31+ FailPolicyDir = filepath .Join (".." , ".." , "test" , "testdata" , "local-policy-fail" )
32+ TestTempDir = "attest-sign-test"
3033)
3134
3235func TestAttestationReferenceTypes (t * testing.T ) {
3336 ctx , signer := test .Setup (t )
37+ ctx = policy .WithPolicyEvaluator (ctx , policy .NewRegoEvaluator (true ))
3438 platforms := []string {"linux/amd64" , "linux/arm64" }
3539 for _ , tc := range []struct {
36- server * httptest.Server
37- skipSubject bool
38- useDigest bool
40+ server * httptest.Server
41+ referrersServer * httptest.Server
42+ skipSubject bool
43+ useDigest bool
44+ referrersRepo string
45+ attestationSource config.AttestationStyle
46+ expectFailure bool
47+ policyDir string
3948 }{
4049 {
4150 server : httptest .NewServer (registry .New (registry .WithReferrersSupport (true ))),
@@ -44,76 +53,135 @@ func TestAttestationReferenceTypes(t *testing.T) {
4453 server : httptest .NewServer (registry .New ()),
4554 },
4655 {
47- server : httptest .NewServer (registry .New (registry .WithReferrersSupport (true ))),
48- skipSubject : true ,
56+ server : httptest .NewServer (registry .New (registry .WithReferrersSupport (true ))),
57+ skipSubject : true ,
58+ attestationSource : config .AttestationStyleAttached ,
4959 },
5060 {
5161 server : httptest .NewServer (registry .New (registry .WithReferrersSupport (true ))),
5262 useDigest : true ,
5363 },
64+ {
65+ server : httptest .NewServer (registry .New (registry .WithReferrersSupport (true ))),
66+ expectFailure : true , //mismatched args
67+ attestationSource : config .AttestationStyleAttached ,
68+ referrersRepo : "referrers" ,
69+ },
70+ {
71+ server : httptest .NewServer (registry .New (registry .WithReferrersSupport (true ))),
72+ expectFailure : true , // no policy
73+ attestationSource : config .AttestationStyleReferrers ,
74+ referrersRepo : "referrers" ,
75+ },
76+ {
77+ server : httptest .NewServer (registry .New (registry .WithReferrersSupport (true ))),
78+ attestationSource : config .AttestationStyleReferrers ,
79+ },
80+ {
81+ server : httptest .NewServer (registry .New (registry .WithReferrersSupport (false ))),
82+ attestationSource : config .AttestationStyleReferrers ,
83+ referrersServer : httptest .NewServer (registry .New (registry .WithReferrersSupport (true ))),
84+ },
5485 } {
55- s := tc .server
56- defer s .Close ()
57- u , err := url .Parse (s .URL )
58- require .NoError (t , err )
59-
60- opts := & attestation.SigningOptions {
61- Replace : true ,
62- SkipSubject : tc .skipSubject ,
63- }
64- attIdx , err := oci .SubjectIndexFromPath (UnsignedTestImage )
65- require .NoError (t , err )
66- signedIndex , err := attest .Sign (ctx , attIdx .Index , signer , opts )
67- require .NoError (t , err )
86+ t .Run (fmt .Sprint (tc ), func (t * testing.T ) {
87+ s := tc .server
88+ defer s .Close ()
6889
69- indexName := fmt .Sprintf ("%s/repo:root" , u .Host )
70- require .NoError (t , err )
71- err = mirror .PushIndexToRegistry (signedIndex , indexName )
72-
73- for _ , platform := range platforms {
74- // can eval policy in the normal way
75- ref := indexName
76- if tc .useDigest {
77- options := oci .WithOptions (ctx , nil )
78- subjectRef , err := name .ParseReference (indexName )
79- require .NoError (t , err )
80- desc , err := remote .Index (subjectRef , options ... )
81- require .NoError (t , err )
82- idxDigest , err := desc .Digest ()
83- require .NoError (t , err )
84- ref = fmt .Sprintf ("%s/repo@%s" , u .Host , idxDigest .String ())
90+ if tc .referrersServer != nil {
91+ defer tc .referrersServer .Close ()
8592 }
93+ u , err := url .Parse (s .URL )
94+ require .NoError (t , err )
8695
87- policyOpts := & policy.PolicyOptions {
88- LocalPolicyDir : PassPolicyDir ,
96+ opts := & attestation.SigningOptions {
97+ Replace : true ,
98+ SkipSubject : tc .skipSubject ,
8999 }
90- src , err := oci .ParseImageSpec ( ref , oci . WithPlatform ( platform ) )
100+ attIdx , err := oci .SubjectIndexFromPath ( UnsignedTestImage )
91101 require .NoError (t , err )
92- results , err := attest .Verify (ctx , src , policyOpts )
102+
103+ indexName := fmt .Sprintf ("%s/repo:root" , u .Host )
93104 require .NoError (t , err )
94- assert .Equal (t , attest .OutcomeSuccess , results .Outcome )
95105
96- if ! tc .skipSubject {
97- // can evaluate policy using referrers
98- if tc .useDigest {
99- p , err := oci .ParsePlatform (platform )
106+ if tc .referrersServer != nil {
107+ ru , err := url .Parse (s .URL )
108+ require .NoError (t , err )
109+ repo := fmt .Sprintf ("%s/referrers" , ru .Host )
110+ tc .referrersRepo = repo
111+ images , err := attest .SignedAttestationImages (ctx , attIdx .Index , signer , opts )
112+ require .NoError (t , err )
113+ err = mirror .PushIndexToRegistry (attIdx .Index , indexName )
114+ for _ , img := range images {
115+ err = mirror .PushImageToRegistry (img .Image , fmt .Sprintf ("%s:tag-does-not-matter" , repo ))
100116 require .NoError (t , err )
101- options := oci .WithOptions (ctx , p )
117+ }
118+ } else {
119+ signedIndex , err := attest .Sign (ctx , attIdx .Index , signer , opts )
120+ require .NoError (t , err )
121+ err = mirror .PushIndexToRegistry (signedIndex , indexName )
122+ require .NoError (t , err )
123+ }
124+
125+ for _ , platform := range platforms {
126+ // can eval policy in the normal way
127+ ref := indexName
128+ if tc .useDigest {
129+ options := oci .WithOptions (ctx , nil )
102130 subjectRef , err := name .ParseReference (indexName )
103131 require .NoError (t , err )
104- desc , err := remote .Image (subjectRef , options ... )
132+ desc , err := remote .Index (subjectRef , options ... )
105133 require .NoError (t , err )
106- subjectDigest , err := desc .Digest ()
134+ idxDigest , err := desc .Digest ()
107135 require .NoError (t , err )
108- ref = fmt .Sprintf ("%s/repo@%s" , u .Host , subjectDigest .String ())
136+ ref = fmt .Sprintf ("%s/repo@%s" , u .Host , idxDigest .String ())
137+ }
138+
139+ policyOpts := & policy.PolicyOptions {
140+ LocalPolicyDir : LocalPolicy ,
141+ }
142+ if tc .policyDir != "" {
143+ policyOpts .LocalPolicyDir = tc .policyDir
144+ }
145+
146+ if tc .referrersRepo != "" {
147+ policyOpts .ReferrersRepo = tc .referrersRepo
148+ }
149+
150+ if tc .attestationSource != "" {
151+ policyOpts .AttestationStyle = tc .attestationSource
109152 }
110153 src , err := oci .ParseImageSpec (ref , oci .WithPlatform (platform ))
111154 require .NoError (t , err )
112- results , err = attest .Verify (ctx , src , policyOpts )
155+ results , err := attest .Verify (ctx , src , policyOpts )
156+ if tc .expectFailure {
157+ require .Error (t , err )
158+ continue
159+ }
113160 require .NoError (t , err )
114161 assert .Equal (t , attest .OutcomeSuccess , results .Outcome )
162+
163+ if ! tc .skipSubject {
164+ // can evaluate policy using referrers
165+ if tc .useDigest {
166+ p , err := oci .ParsePlatform (platform )
167+ require .NoError (t , err )
168+ options := oci .WithOptions (ctx , p )
169+ subjectRef , err := name .ParseReference (indexName )
170+ require .NoError (t , err )
171+ desc , err := remote .Image (subjectRef , options ... )
172+ require .NoError (t , err )
173+ subjectDigest , err := desc .Digest ()
174+ require .NoError (t , err )
175+ ref = fmt .Sprintf ("%s/repo@%s" , u .Host , subjectDigest .String ())
176+ }
177+ src , err := oci .ParseImageSpec (ref , oci .WithPlatform (platform ))
178+ require .NoError (t , err )
179+ results , err = attest .Verify (ctx , src , policyOpts )
180+ require .NoError (t , err )
181+ assert .Equal (t , attest .OutcomeSuccess , results .Outcome )
182+ }
115183 }
116- }
184+ })
117185 }
118186}
119187
0 commit comments