X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning-invoice%2Fsrc%2Flib.rs;h=e427bf3ccb99965a4ba50d8609c3dad186cf3658;hb=21fee20a6d1e79a18a371e51e842da4b953ee070;hp=20eaf7a82d27a7970872883536f7edce1da55c69;hpb=9ca22800b4eefde53776e8fbbc2e187e07f393da;p=rust-lightning diff --git a/lightning-invoice/src/lib.rs b/lightning-invoice/src/lib.rs index 20eaf7a82..e427bf3cc 100644 --- a/lightning-invoice/src/lib.rs +++ b/lightning-invoice/src/lib.rs @@ -42,8 +42,8 @@ extern crate serde; use std::time::SystemTime; use bech32::u5; -use bitcoin::{Address, Network, PubkeyHash, ScriptHash}; -use bitcoin::address::{Payload, WitnessProgram, WitnessVersion}; +use bitcoin::{Address, Network, PubkeyHash, ScriptHash, WitnessProgram, WitnessVersion}; +use bitcoin::address::Payload; use bitcoin::hashes::{Hash, sha256}; use lightning::ln::features::Bolt11InvoiceFeatures; use lightning::util::invoice::construct_invoice_preimage; @@ -65,7 +65,7 @@ use core::str; use serde::{Deserialize, Deserializer,Serialize, Serializer, de::Error}; #[doc(no_inline)] -pub use lightning::ln::PaymentSecret; +pub use lightning::ln::types::PaymentSecret; #[doc(no_inline)] pub use lightning::routing::router::{RouteHint, RouteHintHop}; #[doc(no_inline)] @@ -162,7 +162,7 @@ pub const DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA: u64 = 18; /// use secp256k1::Secp256k1; /// use secp256k1::SecretKey; /// -/// use lightning::ln::PaymentSecret; +/// use lightning::ln::types::PaymentSecret; /// /// use lightning_invoice::{Currency, InvoiceBuilder}; /// @@ -577,7 +577,13 @@ impl Self { - let amount = amount_msat * 10; // Invoices are denominated in "pico BTC" + let amount = match amount_msat.checked_mul(10) { // Invoices are denominated in "pico BTC" + Some(amt) => amt, + None => { + self.error = Some(CreationError::InvalidAmount); + return self + } + }; let biggest_possible_si_prefix = SiPrefix::values_desc() .iter() .find(|prefix| amount % prefix.multiplier() == 0) @@ -872,8 +878,7 @@ impl SignedRawBolt11Invoice { /// Recovers the public key used for signing the invoice from the recoverable signature. pub fn recover_payee_pub_key(&self) -> Result { - let hash = Message::from_slice(&self.hash[..]) - .expect("Hash is 32 bytes long, same as MESSAGE_SIZE"); + let hash = Message::from_digest(self.hash); Ok(PayeePubKey(Secp256k1::new().recover_ecdsa( &hash, @@ -898,8 +903,7 @@ impl SignedRawBolt11Invoice { let pub_key = included_pub_key.or(recovered_pub_key.as_ref()) .expect("One is always present"); - let hash = Message::from_slice(&self.hash[..]) - .expect("Hash is 32 bytes long, same as MESSAGE_SIZE"); + let hash = Message::from_digest(self.hash); let secp_context = Secp256k1::new(); let verification_result = secp_context.verify_ecdsa( @@ -993,8 +997,7 @@ impl RawBolt11Invoice { where F: FnOnce(&Message) -> Result { let raw_hash = self.signable_hash(); - let hash = Message::from_slice(&raw_hash[..]) - .expect("Hash is 32 bytes long, same as MESSAGE_SIZE"); + let hash = Message::from_digest(raw_hash); let signature = sign_method(&hash)?; Ok(SignedRawBolt11Invoice { @@ -1068,9 +1071,10 @@ impl RawBolt11Invoice { find_all_extract!(self.known_tagged_fields(), TaggedField::PrivateRoute(ref x), x).collect() } + /// Returns `None` if no amount is set or on overflow. pub fn amount_pico_btc(&self) -> Option { - self.hrp.raw_amount.map(|v| { - v * self.hrp.si_prefix.as_ref().map_or(1_000_000_000_000, |si| { si.multiplier() }) + self.hrp.raw_amount.and_then(|v| { + v.checked_mul(self.hrp.si_prefix.as_ref().map_or(1_000_000_000_000, |si| { si.multiplier() })) }) } @@ -1876,7 +1880,7 @@ mod test { Bolt11SemanticError}; let private_key = SecretKey::from_slice(&[42; 32]).unwrap(); - let payment_secret = lightning::ln::PaymentSecret([21; 32]); + let payment_secret = lightning::ln::types::PaymentSecret([21; 32]); let invoice_template = RawBolt11Invoice { hrp: RawHrp { currency: Currency::Bitcoin,