From 665d95554dbc0cb4788d951602ad3d84f9546c0b Mon Sep 17 00:00:00 2001 From: Sosthene Date: Wed, 21 Aug 2024 13:17:34 +0200 Subject: [PATCH] Add basic signature --- src/lib.rs | 1 + src/signature.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/signature.rs diff --git a/src/lib.rs b/src/lib.rs index e4247f8..12aa3a0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,3 +6,4 @@ pub mod error; pub mod network; pub mod process; pub mod silentpayments; +pub mod signature; diff --git a/src/signature.rs b/src/signature.rs new file mode 100644 index 0000000..b965962 --- /dev/null +++ b/src/signature.rs @@ -0,0 +1,45 @@ +use anyhow::Result; +use rand::{thread_rng, RngCore}; +use sp_client::bitcoin::key::Secp256k1; +use sp_client::bitcoin::secp256k1::schnorr::Signature; +use sp_client::bitcoin::secp256k1::{Keypair, Message, SecretKey, XOnlyPublicKey}; +use sp_client::bitcoin::hashes::{sha256t_hash_newtype, Hash, HashEngine}; + +sha256t_hash_newtype! { + pub struct AnkMessageTag = hash_str("4nk/Message"); + + #[hash_newtype(forward)] + pub struct AnkMessageHash(_); +} + +impl AnkMessageHash { + pub fn from_message(message: &[u8]) -> Self { + let mut eng = AnkMessageHash::engine(); + eng.input(&message); + AnkMessageHash::from_engine(eng) + } +} + +pub fn sign_message(message: &[u8], signing_key: SecretKey) -> Result { + let message_hash = AnkMessageHash::from_message(message); + + let secp = Secp256k1::signing_only(); + + let keypair = Keypair::from_secret_key(&secp, &signing_key); + + let mut aux_rand = [0u8; 32]; + + thread_rng().fill_bytes(&mut aux_rand); + + let sig = secp.sign_schnorr_with_aux_rand(&Message::from_digest(message_hash.to_byte_array()), &keypair, &aux_rand); + + Ok(sig) +} + +pub fn verify(sig: Signature, message: &[u8], x_only_key: XOnlyPublicKey) -> Result<()> { + let secp = Secp256k1::verification_only(); + let message_hash = AnkMessageHash::from_message(message); + secp.verify_schnorr(&sig, &Message::from_digest(message_hash.to_byte_array()), &x_only_key)?; + + Ok(()) +} \ No newline at end of file