@@ -51,6 +51,7 @@ use crate::types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
51
51
use crate::ln::channel::{self, Channel, ChannelError, ChannelUpdateStatus, FundedChannel, ShutdownResult, UpdateFulfillCommitFetch, OutboundV1Channel, ReconnectionMsg, InboundV1Channel, WithChannelContext};
52
52
#[cfg(any(dual_funding, splicing))]
53
53
use crate::ln::channel::PendingV2Channel;
54
+ use crate::ln::our_peer_storage::OurPeerStorage;
54
55
use crate::ln::channel_state::ChannelDetails;
55
56
use crate::types::features::{Bolt12InvoiceFeatures, ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures};
56
57
#[cfg(any(feature = "_test_utils", test))]
@@ -78,8 +79,8 @@ use crate::onion_message::async_payments::{AsyncPaymentsMessage, HeldHtlcAvailab
78
79
use crate::onion_message::dns_resolution::HumanReadableName;
79
80
use crate::onion_message::messenger::{Destination, MessageRouter, Responder, ResponseInstruction, MessageSendInstructions};
80
81
use crate::onion_message::offers::{OffersMessage, OffersMessageHandler};
81
- use crate::sign::{EntropySource, NodeSigner, Recipient, SignerProvider};
82
82
use crate::sign::ecdsa::EcdsaChannelSigner;
83
+ use crate::sign::{EntropySource, NodeSigner, Recipient, SignerProvider};
83
84
use crate::util::config::{ChannelConfig, ChannelConfigUpdate, ChannelConfigOverrides, UserConfig};
84
85
use crate::util::wakers::{Future, Notifier};
85
86
use crate::util::scid_utils::fake_scid;
@@ -8296,15 +8297,37 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
8296
8297
}
8297
8298
}
8298
8299
8299
- fn internal_peer_storage_retrieval(&self, counterparty_node_id: PublicKey, _msg : msgs::PeerStorageRetrieval) -> Result<(), MsgHandleErrInternal> {
8300
- // TODO: Decrypt and check if have any stale or missing ChannelMonitor.
8300
+ fn internal_peer_storage_retrieval(&self, counterparty_node_id: PublicKey, msg : msgs::PeerStorageRetrieval) -> Result<(), MsgHandleErrInternal> {
8301
+ // TODO: Check if have any stale or missing ChannelMonitor.
8301
8302
let logger = WithContext::from(&self.logger, Some(counterparty_node_id), None, None);
8302
8303
8303
- log_debug!(logger, "Received unexpected peer_storage_retrieval from {}. This is unusual since we do not yet distribute peer storage. Sending a warning.", log_pubkey!(counterparty_node_id));
8304
+ if msg.data.len() < 16 {
8305
+ log_debug!(logger, "Invalid YourPeerStorage received from {}", log_pubkey!(counterparty_node_id));
8306
+ return Err(MsgHandleErrInternal::from_chan_no_close(ChannelError::Warn(
8307
+ "Invalid peer_storage_retrieval message received.".into(),
8308
+ ), ChannelId([0; 32])));
8309
+ }
8310
+
8311
+ let mut res = vec![0; msg.data.len() - 16];
8312
+ let our_peerstorage_encryption_key = self.node_signer.get_peer_storage_key();
8313
+ let mut cyphertext_with_key = Vec::with_capacity(msg.data.len() + our_peerstorage_encryption_key.len());
8314
+ cyphertext_with_key.extend(msg.data.clone());
8315
+ cyphertext_with_key.extend_from_slice(&our_peerstorage_encryption_key);
8304
8316
8305
- Err(MsgHandleErrInternal::from_chan_no_close(ChannelError::Warn(
8306
- "Invalid peer_storage_retrieval message received.".into(),
8307
- ), ChannelId([0; 32])))
8317
+ match OurPeerStorage::decrypt_our_peer_storage(&mut res, cyphertext_with_key.as_slice()) {
8318
+ Ok(()) => {
8319
+ // Decryption successful, the plaintext is now stored in `res`.
8320
+ log_debug!(logger, "Received a peer storage from peer {}", log_pubkey!(counterparty_node_id));
8321
+ }
8322
+ Err(_) => {
8323
+ log_debug!(logger, "Invalid YourPeerStorage received from {}", log_pubkey!(counterparty_node_id));
8324
+
8325
+ return Err(MsgHandleErrInternal::from_chan_no_close(ChannelError::Warn(
8326
+ "Invalid peer_storage_retrieval message received.".into(),
8327
+ ), ChannelId([0; 32])));
8328
+ }
8329
+ }
8330
+ Ok(())
8308
8331
}
8309
8332
8310
8333
fn internal_peer_storage(&self, counterparty_node_id: PublicKey, msg: msgs::PeerStorage) -> Result<(), MsgHandleErrInternal> {
0 commit comments