@@ -12,7 +12,9 @@ mod yaml_generator;
1212
1313use aws_nitro_enclaves_image_format:: defs:: { EifBuildInfo , EifIdentityInfo , EIF_HDR_ARCH_ARM64 } ;
1414use aws_nitro_enclaves_image_format:: utils:: identity:: parse_custom_metadata;
15- use aws_nitro_enclaves_image_format:: utils:: { EifBuilder , SignEnclaveInfo } ;
15+ use aws_nitro_enclaves_image_format:: utils:: {
16+ EifBuilder , SignKeyData , SignKeyDataInfo , SignKeyInfo ,
17+ } ;
1618use docker:: DockerUtil ;
1719use serde_json:: json;
1820use sha2:: Digest ;
@@ -31,7 +33,7 @@ pub struct Docker2Eif<'a> {
3133 linuxkit_path : String ,
3234 artifacts_prefix : String ,
3335 output : & ' a mut File ,
34- sign_info : Option < SignEnclaveInfo > ,
36+ sign_info : Option < SignKeyData > ,
3537 img_name : Option < String > ,
3638 img_version : Option < String > ,
3739 metadata_path : Option < String > ,
@@ -70,6 +72,8 @@ impl<'a> Docker2Eif<'a> {
7072 artifacts_prefix : String ,
7173 certificate_path : & Option < String > ,
7274 key_path : & Option < String > ,
75+ kms_key_id : & Option < String > ,
76+ kms_key_region : & Option < String > ,
7377 img_name : Option < String > ,
7478 img_version : Option < String > ,
7579 metadata_path : Option < String > ,
@@ -98,15 +102,31 @@ impl<'a> Docker2Eif<'a> {
98102 }
99103 }
100104
101- let sign_info = match ( certificate_path , key_path) {
105+ let sign_key_info = match ( kms_key_id , key_path) {
102106 ( None , None ) => None ,
103- ( Some ( cert_path) , Some ( key_path) ) => Some (
104- SignEnclaveInfo :: new ( cert_path, key_path)
105- . map_err ( |err| Docker2EifError :: SignImageError ( format ! ( "{err:?}" ) ) ) ?,
106- ) ,
107+ ( Some ( kms_id) , None ) => Some ( SignKeyInfo :: KmsKeyInfo {
108+ id : kms_id. into ( ) ,
109+ region : kms_key_region. clone ( ) ,
110+ } ) ,
111+ ( None , Some ( key_path) ) => Some ( SignKeyInfo :: LocalPrivateKeyInfo {
112+ path : key_path. into ( ) ,
113+ } ) ,
107114 _ => return Err ( Docker2EifError :: SignArgsError ) ,
108115 } ;
109116
117+ let sign_info = sign_key_info
118+ . map ( |key_info| {
119+ SignKeyData :: new ( & SignKeyDataInfo {
120+ cert_path : certificate_path
121+ . as_ref ( )
122+ . ok_or ( Docker2EifError :: SignArgsError ) ?
123+ . into ( ) ,
124+ key_info,
125+ } )
126+ . map_err ( |_| Docker2EifError :: SignArgsError )
127+ } )
128+ . transpose ( ) ?;
129+
110130 Ok ( Docker2Eif {
111131 docker_image,
112132 docker,
@@ -275,10 +295,15 @@ impl<'a> Docker2Eif<'a> {
275295 _ => return Err ( Docker2EifError :: UnsupportedArchError ) ,
276296 } ;
277297
298+ // We cannot clone `sign_info` because it might contain a KmsKey object
299+ // which is not copyable. Since `create` is the last method called, we can
300+ // move it out of the struct.
301+ let sign_info = self . sign_info . take ( ) ;
302+
278303 let mut build = EifBuilder :: new (
279304 Path :: new ( & self . kernel_img_path ) ,
280305 self . cmdline . clone ( ) ,
281- self . sign_info . clone ( ) ,
306+ sign_info,
282307 sha2:: Sha384 :: new ( ) ,
283308 flags,
284309 self . generate_identity_info ( ) ?,
0 commit comments