Skip to content

Commit 10bd4be

Browse files
committed
Address comments
1 parent b2d5381 commit 10bd4be

File tree

2 files changed

+37
-52
lines changed

2 files changed

+37
-52
lines changed

src/main.rs

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -214,10 +214,7 @@ async fn run(run_options: config::RunOptions) {
214214
let api_client =
215215
ApiClient::try_new(run_options.server_url, None).expect("Failed to create API client");
216216

217-
let (pubkey, pubkey_evm) = signer
218-
.get_public_key()
219-
.await
220-
.expect("Failed to get public key");
217+
let (pubkey, pubkey_evm) = signer.get_public_key().expect("Failed to get public key");
221218
let evm_encded_public_key = format!("0x{}", hex::encode(pubkey_evm));
222219
tracing::info!(
223220
public_key = ?pubkey,
@@ -271,10 +268,7 @@ async fn main() {
271268
// Generate keypair (secret + public key)
272269
let (secret_key, _) = secp.generate_keypair(&mut rng);
273270
let signer = signer::FileSigner { secret_key };
274-
let (pubkey, pubkey_evm) = signer
275-
.get_public_key()
276-
.await
277-
.expect("Failed to get public key");
271+
let (pubkey, pubkey_evm) = signer.get_public_key().expect("Failed to get public key");
278272

279273
let guardian_key = GuardianKey {
280274
data: secret_key.secret_bytes().to_vec(),
@@ -520,13 +514,7 @@ mod tests {
520514
"f2f3127bff540c8441f99763f586858ef340c9962ad62b6181cd77203e81808f",
521515
);
522516
assert_eq!(
523-
hex::encode(
524-
signer
525-
.get_public_key()
526-
.await
527-
.expect("Failed to get public key")
528-
.1
529-
),
517+
hex::encode(signer.get_public_key().expect("Failed to get public key").1),
530518
"30e41be3f10d3ac813f91e49e189bbb948d030be",
531519
);
532520
}

src/signer.rs

Lines changed: 34 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use sha3::{Digest, Keccak256};
2222
#[async_trait]
2323
pub 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 {
117117
pub 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

123123
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+
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

Comments
 (0)