Skip to content

Commit 989f68b

Browse files
committed
fix: use Alloy address recovery
1 parent 628b3e3 commit 989f68b

File tree

3 files changed

+12
-29
lines changed

3 files changed

+12
-29
lines changed

relay_rpc/Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ license = "Apache-2.0"
77
[features]
88
default = ["cacao"]
99
cacao = [
10-
"dep:k256",
1110
"dep:alloy-provider",
1211
"dep:alloy-primitives",
1312
"dep:erc6492",
@@ -35,7 +34,6 @@ chrono = { version = "0.4", default-features = false, features = [
3534
regex = "1.7"
3635
once_cell = "1.16"
3736
jsonwebtoken = "8.1"
38-
k256 = { version = "0.13", optional = true }
3937
sha2 = { version = "0.10.6" }
4038
url = "2"
4139
alloy-provider = { git = "https://github.com/alloy-rs/alloy.git", rev = "d68a6b7", optional = true }
@@ -44,6 +42,7 @@ erc6492 = { git = "https://github.com/WalletConnect/erc6492.git", optional = tru
4442
strum = { version = "0.26", features = ["strum_macros", "derive"] }
4543

4644
[dev-dependencies]
45+
k256 = "0.13"
4746
tokio = { version = "1.35.1", features = ["test-util", "macros"] }
4847

4948
[lints.clippy]

relay_rpc/src/auth/cacao/signature/eip191.rs

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,20 @@
11
use {
22
super::CacaoError,
3-
alloy_primitives::{Address, FixedBytes},
3+
alloy_primitives::{Address, Signature},
44
};
55

66
pub const EIP191: &str = "eip191";
77

8-
pub fn eip191_bytes(message: &str) -> Vec<u8> {
9-
format!(
10-
"\u{0019}Ethereum Signed Message:\n{}{}",
11-
message.as_bytes().len(),
12-
message
13-
)
14-
.into()
15-
}
16-
178
pub fn verify_eip191(
189
signature: &[u8],
1910
address: &Address,
20-
hash: FixedBytes<32>,
11+
message: &[u8],
2112
) -> Result<(), CacaoError> {
22-
use k256::ecdsa::{RecoveryId, Signature as Sig, VerifyingKey};
23-
24-
let sig = Sig::try_from(signature.get(..64).ok_or(CacaoError::Verification)?)
25-
.map_err(|_| CacaoError::Verification)?;
26-
let recovery_id = RecoveryId::try_from(signature.get(64).ok_or(CacaoError::Verification)? % 27)
13+
let signature = Signature::try_from(signature).map_err(|_| CacaoError::Verification)?;
14+
let add = signature
15+
.recover_address_from_msg(message)
2716
.map_err(|_| CacaoError::Verification)?;
2817

29-
let recovered_key = VerifyingKey::recover_from_prehash(hash.as_slice(), &sig, recovery_id)
30-
.map_err(|_| CacaoError::Verification)?;
31-
32-
let add = Address::from_public_key(&recovered_key);
33-
3418
if &add == address {
3519
Ok(())
3620
} else {
@@ -61,7 +45,7 @@ mod tests {
6145
let message = "xxx";
6246
let signature = sign_message(message, &private_key);
6347
let address = Address::from_private_key(&private_key);
64-
verify_eip191(&signature, &address, eip191_hash_message(message)).unwrap();
48+
verify_eip191(&signature, &address, message.as_bytes()).unwrap();
6549
}
6650

6751
#[test]
@@ -71,7 +55,7 @@ mod tests {
7155
let mut signature = sign_message(message, &private_key);
7256
*signature.first_mut().unwrap() = signature.first().unwrap().wrapping_add(1);
7357
let address = Address::from_private_key(&private_key);
74-
assert!(verify_eip191(&signature, &address, eip191_hash_message(message)).is_err());
58+
assert!(verify_eip191(&signature, &address, message.as_bytes()).is_err());
7559
}
7660

7761
#[test]
@@ -81,7 +65,7 @@ mod tests {
8165
let signature = sign_message(message, &private_key);
8266
let mut address = Address::from_private_key(&private_key);
8367
*address.0.first_mut().unwrap() = address.0.first().unwrap().wrapping_add(1);
84-
assert!(verify_eip191(&signature, &address, eip191_hash_message(message)).is_err());
68+
assert!(verify_eip191(&signature, &address, message.as_bytes()).is_err());
8569
}
8670

8771
#[test]
@@ -91,6 +75,6 @@ mod tests {
9175
let signature = sign_message(message, &private_key);
9276
let address = Address::from_private_key(&private_key);
9377
let message2 = "yyy";
94-
assert!(verify_eip191(&signature, &address, eip191_hash_message(message2)).is_err());
78+
assert!(verify_eip191(&signature, &address, message2.as_bytes()).is_err());
9579
}
9680
}

relay_rpc/src/auth/cacao/signature/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use {
44
get_rpc_url::GetRpcUrl,
55
},
66
super::{Cacao, CacaoError},
7-
alloy_primitives::{eip191_hash_message, hex::FromHex, Address, Bytes},
7+
alloy_primitives::{hex::FromHex, Address, Bytes},
88
alloy_provider::{network::Ethereum, ReqwestProvider},
99
erc6492::verify_signature,
1010
serde::{Deserialize, Serialize},
@@ -39,7 +39,7 @@ impl Signature {
3939
EIP191 => {
4040
// Technically we can use EIP-6492 to verify EIP-191 signatures as well,
4141
// but since we know the signature type we can avoid an RPC request.
42-
verify_eip191(&signature, &address, eip191_hash_message(message))
42+
verify_eip191(&signature, &address, message.as_bytes())
4343
}
4444
EIP1271 | EIP6492 => {
4545
if let Some(provider) = provider {

0 commit comments

Comments
 (0)