@@ -29,6 +29,7 @@ import (
2929 "path/filepath"
3030
3131 "github.com/google/go-containerregistry/pkg/name"
32+ "github.com/in-toto/in-toto-golang/in_toto"
3233 "github.com/sigstore/cosign/v2/cmd/cosign/cli/fulcio"
3334 "github.com/sigstore/cosign/v2/cmd/cosign/cli/options"
3435 "github.com/sigstore/cosign/v2/cmd/cosign/cli/rekor"
@@ -41,7 +42,9 @@ import (
4142 "github.com/sigstore/cosign/v2/pkg/cosign/pivkey"
4243 "github.com/sigstore/cosign/v2/pkg/cosign/pkcs11key"
4344 "github.com/sigstore/cosign/v2/pkg/oci"
45+ "github.com/sigstore/cosign/v2/pkg/oci/static"
4446 sigs "github.com/sigstore/cosign/v2/pkg/signature"
47+ "github.com/sigstore/protobuf-specs/gen/pb-go/dsse"
4548 "github.com/sigstore/sigstore-go/pkg/root"
4649 "github.com/sigstore/sigstore/pkg/cryptoutils"
4750 "github.com/sigstore/sigstore/pkg/signature"
@@ -344,6 +347,11 @@ func (c *VerifyCommand) Exec(ctx context.Context, images []string) (err error) {
344347 if err != nil {
345348 return err
346349 }
350+
351+ verifiedOutput , err := transformOutput (verified , ref .Name ())
352+ if err == nil {
353+ verified = verifiedOutput
354+ }
347355 } else {
348356 ref , err = sign .GetAttachedImageRef (ref , c .Attachment , ociremoteOpts ... )
349357 if err != nil {
@@ -633,3 +641,56 @@ func loadCertsKeylessVerification(certChainFile string,
633641
634642 return nil
635643}
644+
645+ func transformOutput (verified []oci.Signature , name string ) (verifiedOutput []oci.Signature , err error ) {
646+ for _ , v := range verified {
647+ dssePayload , err := v .Payload ()
648+ if err != nil {
649+ return nil , err
650+ }
651+ var dsseEnvelope dsse.Envelope
652+ err = json .Unmarshal (dssePayload , & dsseEnvelope )
653+ if err != nil {
654+ return nil , err
655+ }
656+ if dsseEnvelope .PayloadType != in_toto .PayloadType {
657+ return nil , fmt .Errorf ("unable to understand payload type %s" , dsseEnvelope .PayloadType )
658+ }
659+ var intotoStatement in_toto.StatementHeader
660+ err = json .Unmarshal (dsseEnvelope .Payload , & intotoStatement )
661+ if err != nil {
662+ return nil , err
663+ }
664+ if len (intotoStatement .Subject ) < 1 || len (intotoStatement .Subject [0 ].Digest ) < 1 {
665+ return nil , fmt .Errorf ("no intoto subject or digest found" )
666+ }
667+
668+ var digest string
669+ for k , v := range intotoStatement .Subject [0 ].Digest {
670+ digest = k + ":" + v
671+ }
672+
673+ sci := payload.SimpleContainerImage {
674+ Critical : payload.Critical {
675+ Identity : payload.Identity {
676+ DockerReference : name ,
677+ },
678+ Image : payload.Image {
679+ DockerManifestDigest : digest ,
680+ },
681+ Type : intotoStatement .PredicateType ,
682+ },
683+ }
684+ p , err := json .Marshal (sci )
685+ if err != nil {
686+ return nil , err
687+ }
688+ att , err := static .NewAttestation (p )
689+ if err != nil {
690+ return nil , err
691+ }
692+ verifiedOutput = append (verifiedOutput , att )
693+ }
694+
695+ return verifiedOutput , nil
696+ }
0 commit comments