use secp256k1::{Secp256k1, Message, PublicKey, SecretKey};
use secp256k1::ecdsa::Signature;
use sha2::{Sha256, Digest}; use rand::rngs::OsRng;
use rand::RngCore;
pub fn sign_message(message: &[u8], secret_key: &SecretKey) -> Signature {
let secp = Secp256k1::signing_only();
let hashed_message = Sha256::digest(message);
let message = Message::from_slice(&hashed_message).expect("32-byte message expected");
secp.sign_ecdsa(&message, secret_key)
}
pub fn verify_signature(message: &[u8], signature: &Signature, pubkey: &PublicKey) -> bool {
let secp = Secp256k1::verification_only();
let hashed_message = Sha256::digest(message);
let message = Message::from_slice(&hashed_message).expect("32-byte message expected");
secp.verify_ecdsa(&message, signature, pubkey).is_ok()
}
fn main() {
let secp = Secp256k1::new();
let mut rng = OsRng;
let mut secret_key_bytes = [0u8; 32];
rng.fill_bytes(&mut secret_key_bytes);
let secret_key = SecretKey::from_slice(&secret_key_bytes).expect("32-byte key expected");
let public_key = PublicKey::from_secret_key(&secp, &secret_key);
let message = b"Example message to sign";
let signature = sign_message(message, &secret_key);
let is_valid = verify_signature(message, &signature, &public_key);
println!("Signature valid: {}", is_valid);
}