@@ -19,10 +19,13 @@ import (
19
19
"github.com/sigstore/cosign/v2/pkg/oci"
20
20
"github.com/sigstore/cosign/v2/pkg/oci/signature"
21
21
sig "github.com/sigstore/cosign/v2/pkg/signature"
22
+ rekor "github.com/sigstore/rekor/pkg/client"
22
23
"github.com/sigstore/sigstore/pkg/cryptoutils"
23
24
sigtuf "github.com/sigstore/sigstore/pkg/tuf"
24
25
)
25
26
27
+ const DEFAULT_REKOR_URL string = "https://rekor.sigstore.dev"
28
+
26
29
type Configuration struct {
27
30
ImageDigest string `json:"ImageDigest"`
28
31
RootsOfTrust []RootOfTrust `json:"RootsOfTrust"`
@@ -159,6 +162,10 @@ func generateCosignSignatureObjects(sigData SignatureData) ([]oci.Signature, err
159
162
return signatures , nil
160
163
}
161
164
165
+ func printWarningLine (message string ) {
166
+ fmt .Printf ("\033 [33m%s\033 [0m\n " , message )
167
+ }
168
+
162
169
func verify (imgDigest v1.Hash , rootOfTrust RootOfTrust , sigs []oci.Signature , proxy Proxy ) (satisfiedVerifiers []string , err error ) {
163
170
ctx := context .Background ()
164
171
cosignOptions := cosign.CheckOpts {ClaimVerifier : cosign .SimpleClaimVerifier }
@@ -169,22 +176,35 @@ func verify(imgDigest v1.Hash, rootOfTrust RootOfTrust, sigs []oci.Signature, pr
169
176
for _ , verifier := range rootOfTrust .Verifiers {
170
177
cosignOptions .SigVerifier = nil
171
178
cosignOptions .Identities = nil
179
+
172
180
fmt .Printf (">> checking verifier %s\n " , verifier .Name )
173
181
err = setVerifierCosignOptions (& cosignOptions , verifier , rootOfTrust , ctx )
174
182
if err != nil {
175
183
fmt .Printf ("ERROR: %s\n " , err .Error ())
176
- } else {
177
- for i , signature := range sigs {
178
- fmt .Printf ("verifying signature %d\n " , i )
179
- _ , err := cosign .VerifyImageSignature (ctx , signature , imgDigest , & cosignOptions )
180
- if err != nil {
181
- // the image is not signed by this verifier
182
- fmt .Printf ("signature not verified: %s\n " , err .Error ())
183
- } else {
184
- fmt .Printf ("signature %d satisfies verifier %s\n " , i , verifier .Name )
185
- satisfiedVerifiers = append (satisfiedVerifiers , fmt .Sprintf ("%s/%s" , rootOfTrust .Name , verifier .Name ))
186
- break
187
- }
184
+ fmt .Println ("could not create valid cosign options for verifier, skipping verifier" )
185
+ continue
186
+ }
187
+
188
+ for i , signature := range sigs {
189
+ bundle , err := signature .Bundle ()
190
+ if err != nil {
191
+ fmt .Printf ("error when retrieving bundle for signature, skipping signature: %s\n " , err .Error ())
192
+ continue
193
+ }
194
+ if bundle == nil {
195
+ printWarningLine ("no bundle found, any tlog verification must happen through network" )
196
+ } else {
197
+ fmt .Printf ("signature bundle: %s\n " , bundle .Payload .LogID )
198
+ }
199
+ fmt .Printf ("verifying signature %d\n " , i )
200
+ _ , err = cosign .VerifyImageSignature (ctx , signature , imgDigest , & cosignOptions )
201
+ if err != nil {
202
+ // the image is not signed by this verifier
203
+ fmt .Printf ("signature not verified: %s\n " , err .Error ())
204
+ } else {
205
+ fmt .Printf ("signature %d satisfies verifier %s\n " , i , verifier .Name )
206
+ satisfiedVerifiers = append (satisfiedVerifiers , fmt .Sprintf ("%s/%s" , rootOfTrust .Name , verifier .Name ))
207
+ break
188
208
}
189
209
}
190
210
}
@@ -319,6 +339,12 @@ func setVerifierCosignOptions(cosignOptions *cosign.CheckOpts, verifier Verifier
319
339
if rootOfTrust .SCTPublicKey == "" {
320
340
cosignOptions .IgnoreSCT = true
321
341
}
342
+ } else {
343
+ rekorClient , err := rekor .GetRekorClient (DEFAULT_REKOR_URL )
344
+ if err != nil {
345
+ return fmt .Errorf ("could not get rekor client for online tlog validation: %s" , err .Error ())
346
+ }
347
+ cosignOptions .RekorClient = rekorClient
322
348
}
323
349
if rootOfTrust .RootlessKeypairsOnly {
324
350
cosignOptions .IgnoreSCT = true
0 commit comments