@@ -14,6 +14,9 @@ import (
1414)
1515
1616// implementation of Resolver that closes over attestations from an oci layout.
17+
18+ var _ Resolver = (* LayoutResolver )(nil )
19+
1720type LayoutResolver struct {
1821 * Manifest
1922 * oci.ImageSpec
@@ -86,38 +89,49 @@ func (r *LayoutResolver) ImagePlatform(_ context.Context) (*v1.Platform, error)
8689}
8790
8891func manifestFromOCILayout (path string , platform * v1.Platform ) (* Manifest , error ) {
89- idx , err := layout .ImageIndexFromPath (path )
92+ layoutIndex , err := layout .ImageIndexFromPath (path )
9093 if err != nil {
9194 return nil , err
9295 }
9396
94- idxm , err := idx .IndexManifest ()
97+ layoutIndexManifest , err := layoutIndex .IndexManifest ()
9598 if err != nil {
9699 return nil , fmt .Errorf ("failed to get digest: %w" , err )
97100 }
98101
99- idxDescriptor := idxm .Manifests [0 ]
100- idxDigest := idxDescriptor .Digest
101- subjectName := idxDescriptor .Annotations [ocispec .AnnotationRefName ]
102+ layoutDescriptor := layoutIndexManifest .Manifests [0 ]
103+ layoutDescriptorDigest := layoutDescriptor .Digest
104+ subjectName := layoutDescriptor .Annotations [ocispec .AnnotationRefName ]
102105 if _ , err := reference .ParseNamed (subjectName ); err != nil {
103106 // try the containerd annotation if the org.opencontainers.image.ref.name is not a full name
104- subjectName = idxDescriptor .Annotations [containerd .AnnotationImageName ]
107+ subjectName = layoutDescriptor .Annotations [containerd .AnnotationImageName ]
105108 if _ , err := reference .ParseNamed (subjectName ); err != nil {
106109 return nil , fmt .Errorf ("failed to find subject name in annotations" )
107110 }
108111 }
109112
110- mfs , err := idx .ImageIndex (idxDigest )
113+ // check if digest refers to an image or an index
114+ _ , err = layoutIndex .Image (layoutDescriptorDigest )
115+ if err == nil {
116+ return & Manifest {
117+ OriginalLayers : nil ,
118+ OriginalDescriptor : nil ,
119+ SubjectName : subjectName ,
120+ SubjectDescriptor : & layoutDescriptor ,
121+ }, nil
122+ }
123+
124+ subjectIndex , err := layoutIndex .ImageIndex (layoutDescriptorDigest )
111125 if err != nil {
112- return nil , fmt .Errorf ("failed to extract ImageIndex for digest %s: %w" , idxDigest .String (), err )
126+ return nil , fmt .Errorf ("failed to extract ImageIndex for digest %s: %w" , layoutDescriptorDigest .String (), err )
113127 }
114- mfs2 , err := mfs .IndexManifest ()
128+ subjectIndexManifest , err := subjectIndex .IndexManifest ()
115129 if err != nil {
116130 return nil , fmt .Errorf ("failed to extract IndexManifest from ImageIndex: %w" , err )
117131 }
118132 var subjectDescriptor * v1.Descriptor
119- for i := range mfs2 .Manifests {
120- manifest := & mfs2 .Manifests [i ]
133+ for i := range subjectIndexManifest .Manifests {
134+ manifest := & subjectIndexManifest .Manifests [i ]
121135 if manifest .Platform != nil {
122136 if manifest .Platform .Equals (* platform ) {
123137 subjectDescriptor = manifest
@@ -128,8 +142,8 @@ func manifestFromOCILayout(path string, platform *v1.Platform) (*Manifest, error
128142 if subjectDescriptor == nil {
129143 return nil , fmt .Errorf ("platform not found in index" )
130144 }
131- for i := range mfs2 .Manifests {
132- mf := & mfs2 .Manifests [i ]
145+ for i := range subjectIndexManifest .Manifests {
146+ mf := & subjectIndexManifest .Manifests [i ]
133147 if mf .Annotations [DockerReferenceType ] != AttestationManifestType {
134148 continue
135149 }
@@ -138,7 +152,7 @@ func manifestFromOCILayout(path string, platform *v1.Platform) (*Manifest, error
138152 continue
139153 }
140154
141- attestationImage , err := mfs .Image (mf .Digest )
155+ attestationImage , err := subjectIndex .Image (mf .Digest )
142156 if err != nil {
143157 return nil , fmt .Errorf ("failed to extract attestation image with digest %s: %w" , mf .Digest .String (), err )
144158 }
0 commit comments