@@ -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