From e28f7567889c6c983d6aa45ef833d6fa165c50df Mon Sep 17 00:00:00 2001 From: Elichai Turkel Date: Mon, 28 Oct 2019 22:09:59 +0200 Subject: [PATCH] Added an example for signing and verification --- .travis.yml | 1 + Cargo.toml | 3 +++ examples/sign_verify.rs | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 examples/sign_verify.rs diff --git a/.travis.yml b/.travis.yml index a6c6fb2..0501078 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,6 +36,7 @@ script: - cargo test --verbose - cargo build --verbose --release - cargo test --verbose --release + - cargo run --example sign_verify - cargo run --example generate_keys --features=rand - if [ ${TRAVIS_RUST_VERSION} == "stable" ]; then cargo doc --verbose --features="rand,serde,recovery,endomorphism"; fi - if [ ${TRAVIS_RUST_VERSION} == "nightly" ]; then cargo test --verbose --benches --features=unstable; fi diff --git a/Cargo.toml b/Cargo.toml index aaf3797..78e4ce8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -51,6 +51,9 @@ version = "1.0" optional = true default-features = false +[[example]] +name = "sign_verify" + [[example]] name = "generate_keys" required-features = ["rand"] \ No newline at end of file diff --git a/examples/sign_verify.rs b/examples/sign_verify.rs new file mode 100644 index 0000000..ca474a8 --- /dev/null +++ b/examples/sign_verify.rs @@ -0,0 +1,35 @@ +extern crate bitcoin_hashes; +extern crate secp256k1; + +use bitcoin_hashes::{sha256, Hash}; +use secp256k1::{Error, Message, PublicKey, Secp256k1, SecretKey, Signature, Signing, Verification}; + +fn verify(secp: &Secp256k1, msg: &[u8], sig: [u8; 64], pubkey: [u8; 33]) -> Result { + let msg = sha256::Hash::hash(msg); + let msg = Message::from_slice(&msg)?; + let sig = Signature::from_compact(&sig)?; + let pubkey = PublicKey::from_slice(&pubkey)?; + + Ok(secp.verify(&msg, &sig, &pubkey).is_ok()) +} + +fn sign(secp: &Secp256k1, msg: &[u8], seckey: [u8; 32]) -> Result { + let msg = sha256::Hash::hash(msg); + let msg = Message::from_slice(&msg)?; + let seckey = SecretKey::from_slice(&seckey)?; + Ok(secp.sign(&msg, &seckey)) +} + +fn main() { + let secp = Secp256k1::new(); + + let seckey = [59, 148, 11, 85, 134, 130, 61, 253, 2, 174, 59, 70, 27, 180, 51, 107, 94, 203, 174, 253, 102, 39, 170, 146, 46, 252, 4, 143, 236, 12, 136, 28]; + let pubkey = [2, 29, 21, 35, 7, 198, 183, 43, 14, 208, 65, 139, 14, 112, 205, 128, 231, 245, 41, 91, 141, 134, 245, 114, 45, 63, 82, 19, 251, 210, 57, 79, 54]; + let msg = b"This is some message"; + + let signature = sign(&secp, msg, seckey).unwrap(); + + let serialize_sig = signature.serialize_compact(); + + assert!(verify(&secp, msg, serialize_sig, pubkey).unwrap()); +}