@@ -14,7 +14,7 @@ use sha3::{Digest, Keccak256};
14
14
#[ async_trait]
15
15
pub trait Signer : Send + Sync {
16
16
async fn sign ( & self , data : [ u8 ; 32 ] ) -> anyhow:: Result < [ u8 ; 65 ] > ;
17
- fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > ;
17
+ async fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > ;
18
18
}
19
19
20
20
#[ derive( Clone , Debug ) ]
@@ -73,6 +73,17 @@ impl FileSigner {
73
73
}
74
74
}
75
75
76
+ fn get_evm_public_key ( public_key : & PublicKey ) -> anyhow:: Result < [ u8 ; 20 ] > {
77
+ let pubkey_uncompressed = public_key. serialize_uncompressed ( ) ;
78
+ let pubkey_hash: [ u8 ; 32 ] = Keccak256 :: new_with_prefix ( & pubkey_uncompressed[ 1 ..] )
79
+ . finalize ( )
80
+ . into ( ) ;
81
+ let pubkey_evm: [ u8 ; 20 ] = pubkey_hash[ pubkey_hash. len ( ) - 20 ..]
82
+ . try_into ( )
83
+ . map_err ( |e| anyhow:: anyhow!( "Failed to convert public key hash to EVM format: {}" , e) ) ?;
84
+ Ok ( pubkey_evm)
85
+ }
86
+
76
87
#[ async_trait]
77
88
impl Signer for FileSigner {
78
89
async fn sign ( & self , data : [ u8 ; 32 ] ) -> anyhow:: Result < [ u8 ; 65 ] > {
@@ -86,19 +97,10 @@ impl Signer for FileSigner {
86
97
Ok ( signature)
87
98
}
88
99
89
- fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > {
100
+ async fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > {
90
101
let secp = Secp256k1 :: new ( ) ;
91
102
let public_key = self . secret_key . public_key ( & secp) ;
92
- let pubkey_uncompressed = public_key. serialize_uncompressed ( ) ;
93
- let pubkey_hash: [ u8 ; 32 ] = Keccak256 :: new_with_prefix ( & pubkey_uncompressed[ 1 ..] )
94
- . finalize ( )
95
- . into ( ) ;
96
- let pubkey_evm: [ u8 ; 20 ] =
97
- pubkey_hash[ pubkey_hash. len ( ) - 20 ..]
98
- . try_into ( )
99
- . map_err ( |e| {
100
- anyhow:: anyhow!( "Failed to convert public key hash to EVM format: {}" , e)
101
- } ) ?;
103
+ let pubkey_evm = get_evm_public_key ( & public_key) ?;
102
104
Ok ( ( public_key, pubkey_evm) )
103
105
}
104
106
}
@@ -142,7 +144,20 @@ impl Signer for KMSSigner {
142
144
} )
143
145
}
144
146
145
- fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > {
146
- todo ! ( )
147
+ async fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > {
148
+ let result = self
149
+ . client
150
+ . get_public_key ( )
151
+ . key_id ( self . arn . to_string ( ) )
152
+ . send ( )
153
+ . await
154
+ . map_err ( |e| anyhow:: anyhow!( "Failed to get public key from KMS: {}" , e) ) ?;
155
+ let public_key = result
156
+ . public_key
157
+ . ok_or ( anyhow:: anyhow!( "KMS did not return a public key" ) ) ?;
158
+ let public_key = PublicKey :: from_slice ( public_key. as_ref ( ) )
159
+ . map_err ( |e| anyhow:: anyhow!( "Failed to create PublicKey from KMS: {}" , e) ) ?;
160
+ let pubkey_evm = get_evm_public_key ( & public_key) ?;
161
+ Ok ( ( public_key, pubkey_evm) )
147
162
}
148
163
}
0 commit comments