rustywallet_signer/
lib.rs

1//! # rustywallet-signer
2//!
3//! ECDSA and Schnorr message signing and verification for Bitcoin and Ethereum.
4//!
5//! ## Features
6//!
7//! - Sign arbitrary messages with ECDSA secp256k1
8//! - Sign messages with BIP340 Schnorr signatures
9//! - Verify signatures against public keys
10//! - Bitcoin message signing (BIP-137 compatible)
11//! - Ethereum personal_sign (EIP-191)
12//! - Recoverable signatures for public key recovery
13//!
14//! ## Quick Start (ECDSA)
15//!
16//! ```rust
17//! use rustywallet_keys::private_key::PrivateKey;
18//! use rustywallet_signer::prelude::*;
19//! use sha2::{Sha256, Digest};
20//!
21//! // Generate a key
22//! let key = PrivateKey::random();
23//! let pubkey = key.public_key();
24//!
25//! // Sign a message hash
26//! let hash: [u8; 32] = Sha256::digest(b"hello world").into();
27//! let signature = sign(&key, &hash).unwrap();
28//!
29//! // Verify the signature
30//! assert!(verify(&pubkey, &hash, &signature));
31//! ```
32//!
33//! ## Schnorr Signing (BIP340)
34//!
35//! ```rust
36//! use rustywallet_keys::private_key::PrivateKey;
37//! use rustywallet_signer::schnorr::{SchnorrSigner, SchnorrVerifier};
38//! use sha2::{Sha256, Digest};
39//!
40//! // Generate a key
41//! let key = PrivateKey::random();
42//!
43//! // Sign a message hash with Schnorr
44//! let hash: [u8; 32] = Sha256::digest(b"hello world").into();
45//! let signature = key.sign_schnorr(&hash).unwrap();
46//!
47//! // Get x-only public key and verify
48//! let xonly = key.x_only_public_key();
49//! assert!(xonly.verify_schnorr(&signature, &hash));
50//! ```
51//!
52//! ## Bitcoin Message Signing
53//!
54//! ```rust
55//! use rustywallet_keys::private_key::PrivateKey;
56//! use rustywallet_signer::bitcoin::sign_bitcoin_message;
57//!
58//! let key = PrivateKey::random();
59//! let signature = sign_bitcoin_message(&key, "Hello Bitcoin!").unwrap();
60//! println!("Base64 signature: {}", signature);
61//! ```
62//!
63//! ## Ethereum Personal Sign
64//!
65//! ```rust
66//! use rustywallet_keys::private_key::PrivateKey;
67//! use rustywallet_signer::ethereum::{sign_ethereum_message, public_key_to_address, format_address};
68//!
69//! let key = PrivateKey::random();
70//! let address = public_key_to_address(&key.public_key());
71//! let signature = sign_ethereum_message(&key, b"Hello Ethereum!").unwrap();
72//!
73//! println!("Address: {}", format_address(&address));
74//! println!("Signature: {}", signature.to_ethereum_hex());
75//! ```
76
77pub mod bitcoin;
78pub mod error;
79pub mod ethereum;
80pub mod prelude;
81pub mod recovery;
82pub mod schnorr;
83pub mod signature;
84pub mod signer;
85pub mod verifier;
86
87// Re-export main types at crate root
88pub use error::SignerError;
89pub use recovery::recover_public_key;
90pub use signature::{RecoverableSignature, Signature};
91pub use signer::{sign, sign_recoverable};
92pub use verifier::{verify, verify_strict};
93
94// Re-export Schnorr types from rustywallet-taproot for convenience
95pub use rustywallet_taproot::{SchnorrSignature, XOnlyPublicKey};
96
97// Re-export Schnorr signing functions
98pub use schnorr::{sign_schnorr, verify_schnorr, SchnorrSigner, SchnorrVerifier};