Skip to content

Commit 814619c

Browse files
committed
f - build_signed with error
1 parent 1d1e13c commit 814619c

File tree

1 file changed

+28
-12
lines changed

1 file changed

+28
-12
lines changed

lightning/src/offers/offer.rs

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use bitcoin::blockdata::constants::genesis_block;
1313
use bitcoin::hash_types::BlockHash;
1414
use bitcoin::hashes::{Hash, sha256};
1515
use bitcoin::network::constants::Network;
16-
use bitcoin::secp256k1::{Message, PublicKey};
16+
use bitcoin::secp256k1::{Message, PublicKey, Secp256k1, self};
1717
use bitcoin::secp256k1::schnorr::Signature;
1818
use core::num::NonZeroU64;
1919
use core::ops::{Bound, RangeBounds};
@@ -155,11 +155,10 @@ impl OfferBuilder {
155155
}
156156

157157
///
158-
pub fn build_signed<F: FnOnce(&Message) -> Signature>(self, sign: F) -> Offer {
159-
let mut offer = self.build();
160-
let digest = offer.to_message_digest();
161-
offer.signature = Some(sign(&digest));
162-
offer
158+
pub fn build_signed<F>(self, sign: F) -> Result<Offer, secp256k1::Error>
159+
where F: FnOnce(&Message) -> Signature
160+
{
161+
self.build().sign(sign)
163162
}
164163
}
165164

@@ -265,6 +264,20 @@ impl Offer {
265264
self.signature.as_ref()
266265
}
267266

267+
fn sign<F>(mut self, sign: F) -> Result<Self, secp256k1::Error>
268+
where F: FnOnce(&Message) -> Signature
269+
{
270+
let digest = self.to_message_digest();
271+
let signature = sign(&digest);
272+
273+
let secp_ctx = Secp256k1::verification_only();
274+
let pubkey = self.node_id();
275+
secp_ctx.verify_schnorr(&signature, &digest, &pubkey.into())?;
276+
277+
self.signature = Some(signature);
278+
Ok(self)
279+
}
280+
268281
fn to_message_digest(&self) -> Message {
269282
Self::message_digest(self.id)
270283
}
@@ -393,7 +406,7 @@ mod tests {
393406
}
394407

395408
fn privkey() -> SecretKey {
396-
SecretKey::from_slice(&[45; 32]).unwrap()
409+
SecretKey::from_slice(&[42; 32]).unwrap()
397410
}
398411

399412
fn blinded_pubkey(byte: u8) -> PublicKey {
@@ -448,13 +461,16 @@ mod tests {
448461
let pubkey = PublicKey::from(keys);
449462

450463
let offer = OfferBuilder::new("foo".into(), Destination::NodeId(pubkey))
451-
.build_signed(|digest| secp_ctx.sign_schnorr_no_aux_rand(digest, &keys));
464+
.build_signed(|digest| secp_ctx.sign_schnorr_no_aux_rand(digest, &keys))
465+
.unwrap();
452466
assert!(offer.signature().is_some());
453467

454-
let message_digest = offer.to_message_digest();
455-
let signature = offer.signature().unwrap();
456-
let x_only_pubkey = keys.x_only_public_key().0;
457-
assert!(secp_ctx.verify_schnorr(signature, &message_digest, &x_only_pubkey).is_ok());
468+
let wrong_keys = KeyPair::from_secret_key(&secp_ctx, &blinded_privkey(99));
469+
assert!(
470+
OfferBuilder::new("foo".into(), Destination::NodeId(pubkey))
471+
.build_signed(|digest| secp_ctx.sign_schnorr_no_aux_rand(digest, &wrong_keys))
472+
.is_err()
473+
);
458474
}
459475

460476
#[test]

0 commit comments

Comments
 (0)