upgrade-program 1.0.1

Distributed Lab - Solana Program Library
Documentation
use solana_program::secp256k1_recover::{SECP256K1_PUBLIC_KEY_LENGTH, secp256k1_recover};
use solana_program::{entrypoint::ProgramResult, msg};
use crate::error::UpgradeError;

pub fn verify_ecdsa_signature(hash: &[u8], sig: &[u8], reid: u8, target_key: [u8; SECP256K1_PUBLIC_KEY_LENGTH]) -> ProgramResult {
    let recovered_key = secp256k1_recover(hash, reid, sig);
    if recovered_key.is_err() {
        return ProgramResult::Err(UpgradeError::InvalidSignature.into());
    }

    let key =  recovered_key.unwrap().0;

    msg!("Recovered public key from signature: {}", bs58::encode(key.as_ref()).into_string().as_str());
    msg!("Required public key: {}", bs58::encode(target_key.as_ref()).into_string().as_str());

    if key != target_key {
        return ProgramResult::Err(UpgradeError::WrongSignature.into());
    }

    msg!("Public keys are equal");
    Ok(())
}