X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Futil%2Fmessage_signing.rs;h=aa1fdfcee156216f6edcc79b3563a6b2f3f4e5e7;hb=30b9d9fbeaa62537beb8d3ea0b2866703d0d7c92;hp=2055b4087749ada5b3baef731770608baceb629e;hpb=96a738aa5379d5993a7881203c5a643cff3e7933;p=rust-lightning diff --git a/lightning/src/util/message_signing.rs b/lightning/src/util/message_signing.rs index 2055b408..aa1fdfce 100644 --- a/lightning/src/util/message_signing.rs +++ b/lightning/src/util/message_signing.rs @@ -20,10 +20,10 @@ //! //! -use prelude::*; +use crate::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) } }, @@ -84,8 +89,8 @@ pub fn verify(msg: &[u8], sig: &str, pk: &PublicKey) -> bool { #[cfg(test)] mod test { use core::str::FromStr; - use util::message_signing::{sign, recover_pk, verify}; - use bitcoin::secp256k1::key::ONE_KEY; + use crate::util::message_signing::{sign, recover_pk, verify}; + use bitcoin::secp256k1::ONE_KEY; use bitcoin::secp256k1::{PublicKey, Secp256k1}; #[test]