1use solana_program::secp256k1_recover::{SECP256K1_PUBLIC_KEY_LENGTH, secp256k1_recover};
2use solana_program::{entrypoint::ProgramResult, msg};
3use crate::error::UpgradeError;
4
5pub fn verify_ecdsa_signature(hash: &[u8], sig: &[u8], reid: u8, target_key: [u8; SECP256K1_PUBLIC_KEY_LENGTH]) -> ProgramResult {
6 let recovered_key = secp256k1_recover(hash, reid, sig);
7 if recovered_key.is_err() {
8 return ProgramResult::Err(UpgradeError::InvalidSignature.into());
9 }
10
11 let key = recovered_key.unwrap().0;
12
13 msg!("Recovered public key from signature: {}", bs58::encode(key.as_ref()).into_string().as_str());
14 msg!("Required public key: {}", bs58::encode(target_key.as_ref()).into_string().as_str());
15
16 if key != target_key {
17 return ProgramResult::Err(UpgradeError::WrongSignature.into());
18 }
19
20 msg!("Public keys are equal");
21 Ok(())
22}