@@ -22,7 +22,7 @@ use sha3::{Digest, Keccak256};
22
22
#[ async_trait]
23
23
pub trait Signer : Send + Sync {
24
24
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 ] ) > ;
26
26
}
27
27
28
28
#[ derive( Clone , Debug ) ]
@@ -105,7 +105,7 @@ impl Signer for FileSigner {
105
105
Ok ( signature)
106
106
}
107
107
108
- async fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > {
108
+ fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > {
109
109
let secp = Secp256k1 :: new ( ) ;
110
110
let public_key = self . secret_key . public_key ( & secp) ;
111
111
let pubkey_evm = get_evm_address ( & public_key) ?;
@@ -117,24 +117,44 @@ impl Signer for FileSigner {
117
117
pub struct KMSSigner {
118
118
client : aws_sdk_kms:: Client ,
119
119
arn : aws_arn:: ResourceName ,
120
- public_key : Option < ( PublicKey , [ u8 ; 20 ] ) > ,
120
+ public_key : ( PublicKey , [ u8 ; 20 ] ) ,
121
121
}
122
122
123
123
impl 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
+
124
149
pub async fn try_new ( arn_string : String ) -> anyhow:: Result < Self > {
125
150
let config = aws_config:: load_from_env ( ) . await ;
126
151
let client = aws_sdk_kms:: Client :: new ( & config) ;
127
152
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 ?,
129
155
client,
130
156
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
+ } )
138
158
}
139
159
}
140
160
@@ -193,7 +213,7 @@ impl Signer for KMSSigner {
193
213
signature[ ( 32 - r_bytes. len ( ) ) ..32 ] . copy_from_slice ( r_bytes) ;
194
214
signature[ ( 64 - s_bytes. len ( ) ) ..64 ] . copy_from_slice ( decoded_signature. s . as_bytes ( ) ) ;
195
215
196
- let public_key = self . get_public_key ( ) . await ?;
216
+ let public_key = self . get_public_key ( ) ?;
197
217
for raw_id in 0 ..4 {
198
218
let secp = Secp256k1 :: new ( ) ;
199
219
let recid = RecoveryId :: try_from ( raw_id)
@@ -214,30 +234,7 @@ impl Signer for KMSSigner {
214
234
) )
215
235
}
216
236
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 )
242
239
}
243
240
}
0 commit comments