|
@@ -3,7 +3,7 @@ use {
|
|
|
digest::Digest,
|
|
digest::Digest,
|
|
|
solana_precompile_error::PrecompileError,
|
|
solana_precompile_error::PrecompileError,
|
|
|
solana_secp256k1_program::{
|
|
solana_secp256k1_program::{
|
|
|
- construct_eth_pubkey, SecpSignatureOffsets, HASHED_PUBKEY_SERIALIZED_SIZE,
|
|
|
|
|
|
|
+ eth_address_from_pubkey, SecpSignatureOffsets, HASHED_PUBKEY_SERIALIZED_SIZE,
|
|
|
SIGNATURE_OFFSETS_SERIALIZED_SIZE, SIGNATURE_SERIALIZED_SIZE,
|
|
SIGNATURE_OFFSETS_SERIALIZED_SIZE, SIGNATURE_SERIALIZED_SIZE,
|
|
|
},
|
|
},
|
|
|
};
|
|
};
|
|
@@ -97,7 +97,7 @@ pub fn verify(
|
|
|
&recovery_id,
|
|
&recovery_id,
|
|
|
)
|
|
)
|
|
|
.map_err(|_| PrecompileError::InvalidSignature)?;
|
|
.map_err(|_| PrecompileError::InvalidSignature)?;
|
|
|
- let eth_address = construct_eth_pubkey(&pubkey);
|
|
|
|
|
|
|
+ let eth_address = eth_address_from_pubkey(&pubkey.serialize()[1..].try_into().unwrap());
|
|
|
|
|
|
|
|
if eth_address_slice != eth_address {
|
|
if eth_address_slice != eth_address {
|
|
|
return Err(PrecompileError::InvalidSignature);
|
|
return Err(PrecompileError::InvalidSignature);
|
|
@@ -133,7 +133,9 @@ pub mod tests {
|
|
|
crate::test_verify_with_alignment,
|
|
crate::test_verify_with_alignment,
|
|
|
rand0_7::{thread_rng, Rng},
|
|
rand0_7::{thread_rng, Rng},
|
|
|
solana_keccak_hasher as keccak,
|
|
solana_keccak_hasher as keccak,
|
|
|
- solana_secp256k1_program::{new_secp256k1_instruction, DATA_START},
|
|
|
|
|
|
|
+ solana_secp256k1_program::{
|
|
|
|
|
+ new_secp256k1_instruction_with_signature, sign_message, DATA_START,
|
|
|
|
|
+ },
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
fn test_case(
|
|
fn test_case(
|
|
@@ -306,7 +308,17 @@ pub mod tests {
|
|
|
|
|
|
|
|
let secp_privkey = libsecp256k1::SecretKey::random(&mut thread_rng());
|
|
let secp_privkey = libsecp256k1::SecretKey::random(&mut thread_rng());
|
|
|
let message_arr = b"hello";
|
|
let message_arr = b"hello";
|
|
|
- let mut instruction = new_secp256k1_instruction(&secp_privkey, message_arr);
|
|
|
|
|
|
|
+ let secp_pubkey = libsecp256k1::PublicKey::from_secret_key(&secp_privkey);
|
|
|
|
|
+ let eth_address =
|
|
|
|
|
+ eth_address_from_pubkey(&secp_pubkey.serialize()[1..].try_into().unwrap());
|
|
|
|
|
+ let (signature, recovery_id) =
|
|
|
|
|
+ sign_message(&secp_privkey.serialize(), message_arr).unwrap();
|
|
|
|
|
+ let mut instruction = new_secp256k1_instruction_with_signature(
|
|
|
|
|
+ message_arr,
|
|
|
|
|
+ &signature,
|
|
|
|
|
+ recovery_id,
|
|
|
|
|
+ ð_address,
|
|
|
|
|
+ );
|
|
|
let feature_set = FeatureSet::all_enabled();
|
|
let feature_set = FeatureSet::all_enabled();
|
|
|
assert!(test_verify_with_alignment(
|
|
assert!(test_verify_with_alignment(
|
|
|
verify,
|
|
verify,
|
|
@@ -334,7 +346,7 @@ pub mod tests {
|
|
|
|
|
|
|
|
let secret_key = libsecp256k1::SecretKey::random(&mut thread_rng());
|
|
let secret_key = libsecp256k1::SecretKey::random(&mut thread_rng());
|
|
|
let public_key = libsecp256k1::PublicKey::from_secret_key(&secret_key);
|
|
let public_key = libsecp256k1::PublicKey::from_secret_key(&secret_key);
|
|
|
- let eth_address = construct_eth_pubkey(&public_key);
|
|
|
|
|
|
|
+ let eth_address = eth_address_from_pubkey(&public_key.serialize()[1..].try_into().unwrap());
|
|
|
|
|
|
|
|
let message = b"hello";
|
|
let message = b"hello";
|
|
|
let message_hash = {
|
|
let message_hash = {
|