X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Futil%2Fmessage_signing.rs;h=593b01dff90d9b5a36bad535a2269a5e73a7c496;hb=997e75a65a98c6e72d6306d1a4d8c15bce5de095;hp=2055b4087749ada5b3baef731770608baceb629e;hpb=e75d41be7a22e4d9477c52842b8adff8983eeafb;p=rust-lightning diff --git a/lightning/src/util/message_signing.rs b/lightning/src/util/message_signing.rs index 2055b408..593b01df 100644 --- a/lightning/src/util/message_signing.rs +++ b/lightning/src/util/message_signing.rs @@ -23,7 +23,7 @@ use prelude::*; use crate::util::zbase32; use bitcoin::hashes::{sha256d, Hash}; -use bitcoin::secp256k1::recovery::{RecoverableSignature, RecoveryId}; +use bitcoin::secp256k1::ecdsa::{RecoverableSignature, RecoveryId}; use bitcoin::secp256k1::{Error, Message, PublicKey, Secp256k1, SecretKey}; static LN_MESSAGE_PREFIX: &[u8] = b"Lightning Signed Message:"; @@ -36,6 +36,11 @@ fn sigrec_encode(sig_rec: RecoverableSignature) -> Vec { } fn sigrec_decode(sig_rec: Vec) -> Result { + // Signature must be 64 + 1 bytes long (compact signature + recovery id) + if sig_rec.len() != 65 { + return Err(Error::InvalidSignature); + } + let rsig = &sig_rec[1..]; let rid = sig_rec[0] as i32 - 31; @@ -52,7 +57,7 @@ pub fn sign(msg: &[u8], sk: &SecretKey) -> Result { let secp_ctx = Secp256k1::signing_only(); let msg_hash = sha256d::Hash::hash(&[LN_MESSAGE_PREFIX, msg].concat()); - let sig = secp_ctx.sign_recoverable(&Message::from_slice(&msg_hash)?, sk); + let sig = secp_ctx.sign_ecdsa_recoverable(&Message::from_slice(&msg_hash)?, sk); Ok(zbase32::encode(&sigrec_encode(sig))) } @@ -64,7 +69,7 @@ pub fn recover_pk(msg: &[u8], sig: &str) -> Result { match zbase32::decode(&sig) { Ok(sig_rec) => { match sigrec_decode(sig_rec) { - Ok(sig) => secp_ctx.recover(&Message::from_slice(&msg_hash)?, &sig), + Ok(sig) => secp_ctx.recover_ecdsa(&Message::from_slice(&msg_hash)?, &sig), Err(e) => Err(e) } }, @@ -85,7 +90,7 @@ pub fn verify(msg: &[u8], sig: &str, pk: &PublicKey) -> bool { mod test { use core::str::FromStr; use util::message_signing::{sign, recover_pk, verify}; - use bitcoin::secp256k1::key::ONE_KEY; + use bitcoin::secp256k1::ONE_KEY; use bitcoin::secp256k1::{PublicKey, Secp256k1}; #[test]