Fix fuzzer-found underflow
[rust-lightning] / lightning / src / onion_message / messenger.rs
index 7eba3cdd254af6418132fc29bfac3cde59bd2292..044248961973099560fae9853e8a86cca3037a98 100644 (file)
@@ -13,7 +13,7 @@
 use bitcoin::hashes::{Hash, HashEngine};
 use bitcoin::hashes::hmac::{Hmac, HmacEngine};
 use bitcoin::hashes::sha256::Hash as Sha256;
-use bitcoin::secp256k1::{self, PublicKey, Secp256k1, SecretKey};
+use bitcoin::secp256k1::{self, PublicKey, Scalar, Secp256k1, SecretKey};
 
 use chain::keysinterface::{InMemorySigner, KeysInterface, KeysManager, Recipient, Sign};
 use ln::msgs;
@@ -196,7 +196,7 @@ impl<Signer: Sign, K: Deref, L: Deref> OnionMessenger<Signer, K, L>
                                Hmac::from_engine(hmac).into_inner()
                        };
                        match self.keys_manager.ecdh(Recipient::Node, &msg.onion_routing_packet.public_key,
-                               Some(&blinding_factor))
+                               Some(&Scalar::from_be_bytes(blinding_factor).unwrap()))
                        {
                                Ok(ss) => ss.secret_bytes(),
                                Err(()) => {
@@ -249,11 +249,13 @@ impl<Signer: Sign, K: Deref, L: Deref> OnionMessenger<Signer, K, L>
                                                                        Sha256::from_engine(sha).into_inner()
                                                                };
                                                                let mut next_blinding_point = msg.blinding_point;
-                                                               if let Err(e) = next_blinding_point.mul_assign(&self.secp_ctx, &blinding_factor[..]) {
-                                                                       log_trace!(self.logger, "Failed to compute next blinding point: {}", e);
-                                                                       return
+                                                               match next_blinding_point.mul_tweak(&self.secp_ctx, &Scalar::from_be_bytes(blinding_factor).unwrap()) {
+                                                                       Ok(bp) => bp,
+                                                                       Err(e) => {
+                                                                               log_trace!(self.logger, "Failed to compute next blinding point: {}", e);
+                                                                               return
+                                                                       }
                                                                }
-                                                               next_blinding_point
                                                        },
                                                },
                                                onion_routing_packet: outgoing_packet,