upgrade/
ecdsa.rs

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}