Skip to content

Commit 2dd5fd4

Browse files
committed
improve manifest selection logic in OCI image crafter
Signed-off-by: Jeff Rescignano <jeffr@defenseunicorns.com>
1 parent fd616e7 commit 2dd5fd4

1 file changed

Lines changed: 24 additions & 15 deletions

File tree

pkg/attestation/crafter/materials/oci_image.go

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -353,10 +353,10 @@ func (i *OCIImageCrafter) craftFromLayout(_ context.Context, layoutPath, digestS
353353
}
354354

355355
// Select the manifest based on digest selector
356-
var manifest v1.Descriptor
356+
// If a specific digest is requested, find it
357357
if digestSelector != "" {
358-
// Find manifest with matching digest
359358
found := false
359+
var manifest v1.Descriptor
360360
for _, m := range indexManifest.Manifests {
361361
if m.Digest.String() == digestSelector {
362362
manifest = m
@@ -368,21 +368,30 @@ func (i *OCIImageCrafter) craftFromLayout(_ context.Context, layoutPath, digestS
368368
return nil, fmt.Errorf("digest %s not found in OCI layout", digestSelector)
369369
}
370370
i.logger.Debug().Str("digest", digestSelector).Msg("selected image by digest")
371-
} else {
372-
// If multiple images exist, require explicit selection to avoid mistakes
373-
if len(indexManifest.Manifests) > 1 {
374-
var digests []string
375-
for _, m := range indexManifest.Manifests {
376-
digests = append(digests, m.Digest.String())
377-
}
378-
return nil, fmt.Errorf("OCI layout contains %d images, please specify which one to use with @digest. Available digests: %s",
379-
len(indexManifest.Manifests), strings.Join(digests, ", "))
371+
372+
return i.buildMaterialFromManifest(layoutPath, manifest, indexManifest.Manifests)
373+
}
374+
375+
// No digest specified - if multiple images exist, require explicit selection
376+
if len(indexManifest.Manifests) > 1 {
377+
var digests []string
378+
for _, m := range indexManifest.Manifests {
379+
digests = append(digests, m.Digest.String())
380380
}
381-
// Only one image, safe to use it
382-
manifest = indexManifest.Manifests[0]
383-
i.logger.Debug().Msg("using only image in layout")
381+
return nil, fmt.Errorf("OCI layout contains %d images, please specify which one to use with @digest. Available digests: %s",
382+
len(indexManifest.Manifests), strings.Join(digests, ", "))
384383
}
385384

385+
// Only one image, safe to use it
386+
manifest := indexManifest.Manifests[0]
387+
i.logger.Debug().Msg("using only image in layout")
388+
389+
return i.buildMaterialFromManifest(layoutPath, manifest, indexManifest.Manifests)
390+
}
391+
392+
// buildMaterialFromManifest constructs the attestation material from a manifest descriptor.
393+
func (i *OCIImageCrafter) buildMaterialFromManifest(layoutPath string, manifest v1.Descriptor, allManifests []v1.Descriptor) (*api.Attestation_Material, error) {
394+
386395
digest := manifest.Digest.String()
387396

388397
// Extract repository name from annotations if available
@@ -416,7 +425,7 @@ func (i *OCIImageCrafter) craftFromLayout(_ context.Context, layoutPath, digestS
416425
i.logger.Debug().Str("path", layoutPath).Str("digest", digest).Msg("OCI layout image resolved")
417426

418427
// Check for signatures in the layout
419-
signatureInfo := i.checkForSignatureInLayout(indexManifest.Manifests, digest)
428+
signatureInfo := i.checkForSignatureInLayout(allManifests, digest)
420429

421430
containerImage := &api.Attestation_Material_ContainerImage{
422431
Id: i.input.Name,

0 commit comments

Comments
 (0)