@@ -22,7 +22,7 @@ use sha3::{Digest, Keccak256};
2222#[ async_trait]
2323pub trait Signer : Send + Sync {
2424 async fn sign ( & self , data : [ u8 ; 32 ] ) -> anyhow:: Result < [ u8 ; 65 ] > ;
25- async fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > ;
25+ fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > ;
2626}
2727
2828#[ derive( Clone , Debug ) ]
@@ -105,7 +105,7 @@ impl Signer for FileSigner {
105105 Ok ( signature)
106106 }
107107
108- async fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > {
108+ fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > {
109109 let secp = Secp256k1 :: new ( ) ;
110110 let public_key = self . secret_key . public_key ( & secp) ;
111111 let pubkey_evm = get_evm_address ( & public_key) ?;
@@ -117,24 +117,44 @@ impl Signer for FileSigner {
117117pub struct KMSSigner {
118118 client : aws_sdk_kms:: Client ,
119119 arn : aws_arn:: ResourceName ,
120- public_key : Option < ( PublicKey , [ u8 ; 20 ] ) > ,
120+ public_key : ( PublicKey , [ u8 ; 20 ] ) ,
121121}
122122
123123impl KMSSigner {
124+ async fn fetch_public_key (
125+ client : & aws_sdk_kms:: Client ,
126+ arn : & aws_arn:: ResourceName ,
127+ ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > {
128+ let result = client
129+ . get_public_key ( )
130+ . key_id ( arn. to_string ( ) )
131+ . send ( )
132+ . await
133+ . map_err ( |e| anyhow:: anyhow!( "Failed to get public key from KMS: {}" , e) ) ?;
134+ let public_key = result
135+ . public_key
136+ . ok_or ( anyhow:: anyhow!( "KMS did not return a public key" ) ) ?;
137+ let decoded_algorithm_identifier = SubjectPublicKeyInfo :: from_der ( public_key. as_ref ( ) )
138+ . map_err ( |e| {
139+ anyhow:: anyhow!( "Failed to decode SubjectPublicKeyInfo from KMS: {}" , e)
140+ } ) ?;
141+ let public_key =
142+ PublicKey :: from_slice ( decoded_algorithm_identifier. subject_public_key . raw_bytes ( ) )
143+ . map_err ( |e| anyhow:: anyhow!( "Failed to create PublicKey from KMS: {}" , e) ) ?;
144+ let pubkey_evm = get_evm_address ( & public_key) ?;
145+
146+ Ok ( ( public_key, pubkey_evm) )
147+ }
148+
124149 pub async fn try_new ( arn_string : String ) -> anyhow:: Result < Self > {
125150 let config = aws_config:: load_from_env ( ) . await ;
126151 let client = aws_sdk_kms:: Client :: new ( & config) ;
127152 let arn = aws_arn:: ResourceName :: from_str ( & arn_string) ?;
128- let mut signer = KMSSigner {
153+ Ok ( KMSSigner {
154+ public_key : Self :: fetch_public_key ( & client, & arn) . await ?,
129155 client,
130156 arn,
131- public_key : None ,
132- } ;
133-
134- let ( public_key, pubkey_evm) = signer. get_public_key ( ) . await ?;
135- signer. public_key = Some ( ( public_key, pubkey_evm) ) ;
136-
137- Ok ( signer)
157+ } )
138158 }
139159}
140160
@@ -193,7 +213,7 @@ impl Signer for KMSSigner {
193213 signature[ ( 32 - r_bytes. len ( ) ) ..32 ] . copy_from_slice ( r_bytes) ;
194214 signature[ ( 64 - s_bytes. len ( ) ) ..64 ] . copy_from_slice ( decoded_signature. s . as_bytes ( ) ) ;
195215
196- let public_key = self . get_public_key ( ) . await ?;
216+ let public_key = self . get_public_key ( ) ?;
197217 for raw_id in 0 ..4 {
198218 let secp = Secp256k1 :: new ( ) ;
199219 let recid = RecoveryId :: try_from ( raw_id)
@@ -214,30 +234,7 @@ impl Signer for KMSSigner {
214234 ) )
215235 }
216236
217- async fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > {
218- if let Some ( ( public_key, pubkey_evm) ) = & self . public_key {
219- return Ok ( ( * public_key, * pubkey_evm) ) ;
220- }
221-
222- let result = self
223- . client
224- . get_public_key ( )
225- . key_id ( self . arn . to_string ( ) )
226- . send ( )
227- . await
228- . map_err ( |e| anyhow:: anyhow!( "Failed to get public key from KMS: {}" , e) ) ?;
229- let public_key = result
230- . public_key
231- . ok_or ( anyhow:: anyhow!( "KMS did not return a public key" ) ) ?;
232- let decoded_algorithm_identifier = SubjectPublicKeyInfo :: from_der ( public_key. as_ref ( ) )
233- . map_err ( |e| {
234- anyhow:: anyhow!( "Failed to decode SubjectPublicKeyInfo from KMS: {}" , e)
235- } ) ?;
236- let public_key =
237- PublicKey :: from_slice ( decoded_algorithm_identifier. subject_public_key . raw_bytes ( ) )
238- . map_err ( |e| anyhow:: anyhow!( "Failed to create PublicKey from KMS: {}" , e) ) ?;
239- let pubkey_evm = get_evm_address ( & public_key) ?;
240-
241- Ok ( ( public_key, pubkey_evm) )
237+ fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > {
238+ Ok ( self . public_key )
242239 }
243240}
0 commit comments