@@ -14,7 +14,7 @@ use sha3::{Digest, Keccak256};
1414#[ async_trait]
1515pub trait Signer : Send + Sync {
1616 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 ] ) > ;
1818}
1919
2020#[ derive( Clone , Debug ) ]
@@ -73,6 +73,17 @@ impl FileSigner {
7373 }
7474}
7575
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+
7687#[ async_trait]
7788impl Signer for FileSigner {
7889 async fn sign ( & self , data : [ u8 ; 32 ] ) -> anyhow:: Result < [ u8 ; 65 ] > {
@@ -86,19 +97,10 @@ impl Signer for FileSigner {
8697 Ok ( signature)
8798 }
8899
89- fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > {
100+ async fn get_public_key ( & self ) -> anyhow:: Result < ( PublicKey , [ u8 ; 20 ] ) > {
90101 let secp = Secp256k1 :: new ( ) ;
91102 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) ?;
102104 Ok ( ( public_key, pubkey_evm) )
103105 }
104106}
@@ -142,7 +144,20 @@ impl Signer for KMSSigner {
142144 } )
143145 }
144146
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) )
147162 }
148163}
0 commit comments