X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fln%2Fmsgs.rs;h=5d4767721dbb08a550b919c94cb6196c20390e41;hb=11e5975523147ae7024b03f05445c78c9b695752;hp=898d30d94aa70c705f26bb7b2348d9000d63fa77;hpb=fd141bbed2a900070cbecf7ef9f22e377e1f353f;p=rust-lightning diff --git a/src/ln/msgs.rs b/src/ln/msgs.rs index 898d30d9..5d476772 100644 --- a/src/ln/msgs.rs +++ b/src/ln/msgs.rs @@ -1,6 +1,5 @@ use secp256k1::key::PublicKey; use secp256k1::{Secp256k1, Signature}; -use bitcoin::util::uint::Uint256; use bitcoin::util::hash::Sha256dHash; use bitcoin::network::serialize::{deserialize,serialize}; use bitcoin::blockdata::script::Script; @@ -32,10 +31,15 @@ pub enum DecodeError { BadPublicKey, /// Failed to decode a signature (ie it's invalid) BadSignature, - /// Buffer not of right length (either too short or too long) - WrongLength, + /// Value expected to be text wasn't decodable as text + BadText, + /// Buffer too short + ShortRead, /// node_announcement included more than one address of a given type! ExtraAddressesPerType, + /// A length descriptor in the packet didn't describe the later data correctly + /// (currently only generated in node_announcement) + BadLengthDescriptor, } pub trait MsgDecodable: Sized { fn decode(v: &[u8]) -> Result; @@ -139,6 +143,11 @@ pub struct Init { pub local_features: LocalFeatures, } +pub struct ErrorMessage { + pub channel_id: [u8; 32], + pub data: String, +} + pub struct Ping { pub ponglen: u16, pub byteslen: u16, @@ -150,7 +159,7 @@ pub struct Pong { pub struct OpenChannel { pub chain_hash: Sha256dHash, - pub temporary_channel_id: Uint256, + pub temporary_channel_id: [u8; 32], pub funding_satoshis: u64, pub push_msat: u64, pub dust_limit_satoshis: u64, @@ -171,7 +180,7 @@ pub struct OpenChannel { } pub struct AcceptChannel { - pub temporary_channel_id: Uint256, + pub temporary_channel_id: [u8; 32], pub dust_limit_satoshis: u64, pub max_htlc_value_in_flight_msat: u64, pub channel_reserve_satoshis: u64, @@ -189,36 +198,36 @@ pub struct AcceptChannel { } pub struct FundingCreated { - pub temporary_channel_id: Uint256, + pub temporary_channel_id: [u8; 32], pub funding_txid: Sha256dHash, pub funding_output_index: u16, pub signature: Signature, } pub struct FundingSigned { - pub channel_id: Uint256, + pub channel_id: [u8; 32], pub signature: Signature, } pub struct FundingLocked { - pub channel_id: Uint256, + pub channel_id: [u8; 32], pub next_per_commitment_point: PublicKey, } pub struct Shutdown { - pub channel_id: Uint256, + pub channel_id: [u8; 32], pub scriptpubkey: Script, } pub struct ClosingSigned { - pub channel_id: Uint256, + pub channel_id: [u8; 32], pub fee_satoshis: u64, pub signature: Signature, } #[derive(Clone)] pub struct UpdateAddHTLC { - pub channel_id: Uint256, + pub channel_id: [u8; 32], pub htlc_id: u64, pub amount_msat: u64, pub payment_hash: [u8; 32], @@ -228,21 +237,21 @@ pub struct UpdateAddHTLC { #[derive(Clone)] pub struct UpdateFulfillHTLC { - pub channel_id: Uint256, + pub channel_id: [u8; 32], pub htlc_id: u64, pub payment_preimage: [u8; 32], } #[derive(Clone)] pub struct UpdateFailHTLC { - pub channel_id: Uint256, + pub channel_id: [u8; 32], pub htlc_id: u64, pub reason: OnionErrorPacket, } #[derive(Clone)] pub struct UpdateFailMalformedHTLC { - pub channel_id: Uint256, + pub channel_id: [u8; 32], pub htlc_id: u64, pub sha256_of_onion: [u8; 32], pub failure_code: u16, @@ -250,24 +259,24 @@ pub struct UpdateFailMalformedHTLC { #[derive(Clone)] pub struct CommitmentSigned { - pub channel_id: Uint256, + pub channel_id: [u8; 32], pub signature: Signature, pub htlc_signatures: Vec, } pub struct RevokeAndACK { - pub channel_id: Uint256, + pub channel_id: [u8; 32], pub per_commitment_secret: [u8; 32], pub next_per_commitment_point: PublicKey, } pub struct UpdateFee { - pub channel_id: Uint256, + pub channel_id: [u8; 32], pub feerate_per_kw: u32, } pub struct ChannelReestablish { - pub channel_id: Uint256, + pub channel_id: [u8; 32], pub next_local_commitment_number: u64, pub next_remote_commitment_number: u64, pub your_last_per_commitment_secret: Option<[u8; 32]>, @@ -276,7 +285,7 @@ pub struct ChannelReestablish { #[derive(Clone)] pub struct AnnouncementSignatures { - pub channel_id: Uint256, + pub channel_id: [u8; 32], pub short_channel_id: u64, pub node_signature: Signature, pub bitcoin_signature: Signature, @@ -373,14 +382,20 @@ pub enum ErrorAction { msg: UpdateFailHTLC }, /// The peer took some action which made us think they were useless. Disconnect them. - DisconnectPeer, + DisconnectPeer { + msg: Option + }, /// The peer did something harmless that we weren't able to process, just log and ignore IgnoreError, + /// The peer did something incorrect. Tell them. + SendErrorMessage { + msg: ErrorMessage + }, } pub struct HandleError { //TODO: rename me pub err: &'static str, - pub action: Option, //TODO: Make this required and rename it + pub action: Option, //TODO: Make this required } /// Struct used to return values from revoke_and_ack messages, containing a bunch of commitment @@ -487,8 +502,10 @@ impl Error for DecodeError { DecodeError::UnknownRealmByte => "Unknown realm byte in Onion packet", DecodeError::BadPublicKey => "Invalid public key in packet", DecodeError::BadSignature => "Invalid signature in packet", - DecodeError::WrongLength => "Data was wrong length for packet", + DecodeError::BadText => "Invalid text in packet", + DecodeError::ShortRead => "Packet extended beyond the provided bytes", DecodeError::ExtraAddressesPerType => "More than one address of a single type", + DecodeError::BadLengthDescriptor => "A length descriptor in the packet didn't describe the later data correctly", } } } @@ -524,9 +541,9 @@ macro_rules! secp_signature { impl MsgDecodable for LocalFeatures { fn decode(v: &[u8]) -> Result { - if v.len() < 2 { return Err(DecodeError::WrongLength); } + if v.len() < 2 { return Err(DecodeError::ShortRead); } let len = byte_utils::slice_to_be16(&v[0..2]) as usize; - if v.len() < len + 2 { return Err(DecodeError::WrongLength); } + if v.len() < len + 2 { return Err(DecodeError::ShortRead); } let mut flags = Vec::with_capacity(len); flags.extend_from_slice(&v[2..2 + len]); Ok(Self { @@ -546,9 +563,9 @@ impl MsgEncodable for LocalFeatures { impl MsgDecodable for GlobalFeatures { fn decode(v: &[u8]) -> Result { - if v.len() < 2 { return Err(DecodeError::WrongLength); } + if v.len() < 2 { return Err(DecodeError::ShortRead); } let len = byte_utils::slice_to_be16(&v[0..2]) as usize; - if v.len() < len + 2 { return Err(DecodeError::WrongLength); } + if v.len() < len + 2 { return Err(DecodeError::ShortRead); } let mut flags = Vec::with_capacity(len); flags.extend_from_slice(&v[2..2 + len]); Ok(Self { @@ -570,7 +587,7 @@ impl MsgDecodable for Init { fn decode(v: &[u8]) -> Result { let global_features = GlobalFeatures::decode(v)?; if v.len() < global_features.flags.len() + 4 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let local_features = LocalFeatures::decode(&v[global_features.flags.len() + 2..])?; Ok(Self { @@ -591,12 +608,12 @@ impl MsgEncodable for Init { impl MsgDecodable for Ping { fn decode(v: &[u8]) -> Result { if v.len() < 4 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let ponglen = byte_utils::slice_to_be16(&v[0..2]); let byteslen = byte_utils::slice_to_be16(&v[2..4]); if v.len() < 4 + byteslen as usize { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } Ok(Self { ponglen, @@ -616,11 +633,11 @@ impl MsgEncodable for Ping { impl MsgDecodable for Pong { fn decode(v: &[u8]) -> Result { if v.len() < 2 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let byteslen = byte_utils::slice_to_be16(&v[0..2]); if v.len() < 2 + byteslen as usize { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } Ok(Self { byteslen @@ -639,7 +656,7 @@ impl MsgEncodable for Pong { impl MsgDecodable for OpenChannel { fn decode(v: &[u8]) -> Result { if v.len() < 2*32+6*8+4+2*2+6*33+1 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let ctx = Secp256k1::without_caps(); @@ -647,11 +664,9 @@ impl MsgDecodable for OpenChannel { if v.len() >= 321 { let len = byte_utils::slice_to_be16(&v[319..321]) as usize; if v.len() < 321+len { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } shutdown_scriptpubkey = Some(Script::from(v[321..321+len].to_vec())); - } else if v.len() != 2*32+6*8+4+2*2+6*33+1 { // Message cant have 1 extra byte - return Err(DecodeError::WrongLength); } Ok(OpenChannel { @@ -712,7 +727,7 @@ impl MsgEncodable for OpenChannel { impl MsgDecodable for AcceptChannel { fn decode(v: &[u8]) -> Result { if v.len() < 32+4*8+4+2*2+6*33 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let ctx = Secp256k1::without_caps(); @@ -720,15 +735,15 @@ impl MsgDecodable for AcceptChannel { if v.len() >= 272 { let len = byte_utils::slice_to_be16(&v[270..272]) as usize; if v.len() < 272+len { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } shutdown_scriptpubkey = Some(Script::from(v[272..272+len].to_vec())); - } else if v.len() != 32+4*8+4+2*2+6*33 { // Message cant have 1 extra byte - return Err(DecodeError::WrongLength); } + let mut temporary_channel_id = [0; 32]; + temporary_channel_id[..].copy_from_slice(&v[0..32]); Ok(Self { - temporary_channel_id: deserialize(&v[0..32]).unwrap(), + temporary_channel_id, dust_limit_satoshis: byte_utils::slice_to_be64(&v[32..40]), max_htlc_value_in_flight_msat: byte_utils::slice_to_be64(&v[40..48]), channel_reserve_satoshis: byte_utils::slice_to_be64(&v[48..56]), @@ -752,7 +767,7 @@ impl MsgEncodable for AcceptChannel { &Some(ref script) => Vec::with_capacity(270 + 2 + script.len()), &None => Vec::with_capacity(270), }; - res.extend_from_slice(&serialize(&self.temporary_channel_id).unwrap()[..]); + res.extend_from_slice(&self.temporary_channel_id); res.extend_from_slice(&byte_utils::be64_to_array(self.dust_limit_satoshis)); res.extend_from_slice(&byte_utils::be64_to_array(self.max_htlc_value_in_flight_msat)); res.extend_from_slice(&byte_utils::be64_to_array(self.channel_reserve_satoshis)); @@ -777,11 +792,13 @@ impl MsgEncodable for AcceptChannel { impl MsgDecodable for FundingCreated { fn decode(v: &[u8]) -> Result { if v.len() < 32+32+2+64 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let ctx = Secp256k1::without_caps(); + let mut temporary_channel_id = [0; 32]; + temporary_channel_id[..].copy_from_slice(&v[0..32]); Ok(Self { - temporary_channel_id: deserialize(&v[0..32]).unwrap(), + temporary_channel_id, funding_txid: deserialize(&v[32..64]).unwrap(), funding_output_index: byte_utils::slice_to_be16(&v[64..66]), signature: secp_signature!(&ctx, &v[66..130]), @@ -791,7 +808,7 @@ impl MsgDecodable for FundingCreated { impl MsgEncodable for FundingCreated { fn encode(&self) -> Vec { let mut res = Vec::with_capacity(32+32+2+64); - res.extend_from_slice(&serialize(&self.temporary_channel_id).unwrap()[..]); + res.extend_from_slice(&self.temporary_channel_id); res.extend_from_slice(&serialize(&self.funding_txid).unwrap()[..]); res.extend_from_slice(&byte_utils::be16_to_array(self.funding_output_index)); let secp_ctx = Secp256k1::without_caps(); @@ -803,11 +820,13 @@ impl MsgEncodable for FundingCreated { impl MsgDecodable for FundingSigned { fn decode(v: &[u8]) -> Result { if v.len() < 32+64 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let ctx = Secp256k1::without_caps(); + let mut channel_id = [0; 32]; + channel_id[..].copy_from_slice(&v[0..32]); Ok(Self { - channel_id: deserialize(&v[0..32]).unwrap(), + channel_id, signature: secp_signature!(&ctx, &v[32..96]), }) } @@ -815,7 +834,7 @@ impl MsgDecodable for FundingSigned { impl MsgEncodable for FundingSigned { fn encode(&self) -> Vec { let mut res = Vec::with_capacity(32+64); - res.extend_from_slice(&serialize(&self.channel_id).unwrap()); + res.extend_from_slice(&self.channel_id); res.extend_from_slice(&self.signature.serialize_compact(&Secp256k1::without_caps())); res } @@ -824,11 +843,13 @@ impl MsgEncodable for FundingSigned { impl MsgDecodable for FundingLocked { fn decode(v: &[u8]) -> Result { if v.len() < 32+33 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let ctx = Secp256k1::without_caps(); + let mut channel_id = [0; 32]; + channel_id[..].copy_from_slice(&v[0..32]); Ok(Self { - channel_id: deserialize(&v[0..32]).unwrap(), + channel_id, next_per_commitment_point: secp_pubkey!(&ctx, &v[32..65]), }) } @@ -836,7 +857,7 @@ impl MsgDecodable for FundingLocked { impl MsgEncodable for FundingLocked { fn encode(&self) -> Vec { let mut res = Vec::with_capacity(32+33); - res.extend_from_slice(&serialize(&self.channel_id).unwrap()); + res.extend_from_slice(&self.channel_id); res.extend_from_slice(&self.next_per_commitment_point.serialize()); res } @@ -845,14 +866,16 @@ impl MsgEncodable for FundingLocked { impl MsgDecodable for Shutdown { fn decode(v: &[u8]) -> Result { if v.len() < 32 + 2 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let scriptlen = byte_utils::slice_to_be16(&v[32..34]) as usize; if v.len() < 32 + 2 + scriptlen { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } + let mut channel_id = [0; 32]; + channel_id[..].copy_from_slice(&v[0..32]); Ok(Self { - channel_id: deserialize(&v[0..32]).unwrap(), + channel_id, scriptpubkey: Script::from(v[34..34 + scriptlen].to_vec()), }) } @@ -860,7 +883,7 @@ impl MsgDecodable for Shutdown { impl MsgEncodable for Shutdown { fn encode(&self) -> Vec { let mut res = Vec::with_capacity(32 + 2 + self.scriptpubkey.len()); - res.extend_from_slice(&serialize(&self.channel_id).unwrap()); + res.extend_from_slice(&self.channel_id); res.extend_from_slice(&byte_utils::be16_to_array(self.scriptpubkey.len() as u16)); res.extend_from_slice(&self.scriptpubkey[..]); res @@ -870,11 +893,13 @@ impl MsgEncodable for Shutdown { impl MsgDecodable for ClosingSigned { fn decode(v: &[u8]) -> Result { if v.len() < 32 + 8 + 64 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let secp_ctx = Secp256k1::without_caps(); + let mut channel_id = [0; 32]; + channel_id[..].copy_from_slice(&v[0..32]); Ok(Self { - channel_id: deserialize(&v[0..32]).unwrap(), + channel_id, fee_satoshis: byte_utils::slice_to_be64(&v[32..40]), signature: secp_signature!(&secp_ctx, &v[40..104]), }) @@ -883,7 +908,7 @@ impl MsgDecodable for ClosingSigned { impl MsgEncodable for ClosingSigned { fn encode(&self) -> Vec { let mut res = Vec::with_capacity(32+8+64); - res.extend_from_slice(&serialize(&self.channel_id).unwrap()); + res.extend_from_slice(&self.channel_id); res.extend_from_slice(&byte_utils::be64_to_array(self.fee_satoshis)); let secp_ctx = Secp256k1::without_caps(); res.extend_from_slice(&self.signature.serialize_compact(&secp_ctx)); @@ -894,12 +919,14 @@ impl MsgEncodable for ClosingSigned { impl MsgDecodable for UpdateAddHTLC { fn decode(v: &[u8]) -> Result { if v.len() < 32+8+8+32+4+1+33+20*65+32 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } + let mut channel_id = [0; 32]; + channel_id[..].copy_from_slice(&v[0..32]); let mut payment_hash = [0; 32]; payment_hash.copy_from_slice(&v[48..80]); Ok(Self{ - channel_id: deserialize(&v[0..32]).unwrap(), + channel_id, htlc_id: byte_utils::slice_to_be64(&v[32..40]), amount_msat: byte_utils::slice_to_be64(&v[40..48]), payment_hash, @@ -910,8 +937,8 @@ impl MsgDecodable for UpdateAddHTLC { } impl MsgEncodable for UpdateAddHTLC { fn encode(&self) -> Vec { - let mut res = Vec::with_capacity(32+8+8+32+4+1+1366); - res.extend_from_slice(&serialize(&self.channel_id).unwrap()); + let mut res = Vec::with_capacity(32+8+8+32+4+1366); + res.extend_from_slice(&self.channel_id); res.extend_from_slice(&byte_utils::be64_to_array(self.htlc_id)); res.extend_from_slice(&byte_utils::be64_to_array(self.amount_msat)); res.extend_from_slice(&self.payment_hash); @@ -924,12 +951,14 @@ impl MsgEncodable for UpdateAddHTLC { impl MsgDecodable for UpdateFulfillHTLC { fn decode(v: &[u8]) -> Result { if v.len() < 32+8+32 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } + let mut channel_id = [0; 32]; + channel_id[..].copy_from_slice(&v[0..32]); let mut payment_preimage = [0; 32]; payment_preimage.copy_from_slice(&v[40..72]); Ok(Self{ - channel_id: deserialize(&v[0..32]).unwrap(), + channel_id, htlc_id: byte_utils::slice_to_be64(&v[32..40]), payment_preimage, }) @@ -938,7 +967,7 @@ impl MsgDecodable for UpdateFulfillHTLC { impl MsgEncodable for UpdateFulfillHTLC { fn encode(&self) -> Vec { let mut res = Vec::with_capacity(32+8+32); - res.extend_from_slice(&serialize(&self.channel_id).unwrap()); + res.extend_from_slice(&self.channel_id); res.extend_from_slice(&byte_utils::be64_to_array(self.htlc_id)); res.extend_from_slice(&self.payment_preimage); res @@ -948,10 +977,12 @@ impl MsgEncodable for UpdateFulfillHTLC { impl MsgDecodable for UpdateFailHTLC { fn decode(v: &[u8]) -> Result { if v.len() < 32+8 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } + let mut channel_id = [0; 32]; + channel_id[..].copy_from_slice(&v[0..32]); Ok(Self{ - channel_id: deserialize(&v[0..32]).unwrap(), + channel_id, htlc_id: byte_utils::slice_to_be64(&v[32..40]), reason: OnionErrorPacket::decode(&v[40..])?, }) @@ -961,7 +992,7 @@ impl MsgEncodable for UpdateFailHTLC { fn encode(&self) -> Vec { let reason = self.reason.encode(); let mut res = Vec::with_capacity(32+8+reason.len()); - res.extend_from_slice(&serialize(&self.channel_id).unwrap()); + res.extend_from_slice(&self.channel_id); res.extend_from_slice(&byte_utils::be64_to_array(self.htlc_id)); res.extend_from_slice(&reason[..]); res @@ -971,12 +1002,14 @@ impl MsgEncodable for UpdateFailHTLC { impl MsgDecodable for UpdateFailMalformedHTLC { fn decode(v: &[u8]) -> Result { if v.len() < 32+8+32+2 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } + let mut channel_id = [0; 32]; + channel_id[..].copy_from_slice(&v[0..32]); let mut sha256_of_onion = [0; 32]; sha256_of_onion.copy_from_slice(&v[40..72]); Ok(Self{ - channel_id: deserialize(&v[0..32]).unwrap(), + channel_id, htlc_id: byte_utils::slice_to_be64(&v[32..40]), sha256_of_onion, failure_code: byte_utils::slice_to_be16(&v[72..74]), @@ -986,7 +1019,7 @@ impl MsgDecodable for UpdateFailMalformedHTLC { impl MsgEncodable for UpdateFailMalformedHTLC { fn encode(&self) -> Vec { let mut res = Vec::with_capacity(32+8+32+2); - res.extend_from_slice(&serialize(&self.channel_id).unwrap()); + res.extend_from_slice(&self.channel_id); res.extend_from_slice(&byte_utils::be64_to_array(self.htlc_id)); res.extend_from_slice(&self.sha256_of_onion); res.extend_from_slice(&byte_utils::be16_to_array(self.failure_code)); @@ -997,11 +1030,14 @@ impl MsgEncodable for UpdateFailMalformedHTLC { impl MsgDecodable for CommitmentSigned { fn decode(v: &[u8]) -> Result { if v.len() < 32+64+2 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } + let mut channel_id = [0; 32]; + channel_id[..].copy_from_slice(&v[0..32]); + let htlcs = byte_utils::slice_to_be16(&v[96..98]) as usize; if v.len() < 32+64+2+htlcs*64 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let mut htlc_signatures = Vec::with_capacity(htlcs); let secp_ctx = Secp256k1::without_caps(); @@ -1009,7 +1045,7 @@ impl MsgDecodable for CommitmentSigned { htlc_signatures.push(secp_signature!(&secp_ctx, &v[98+i*64..98+(i+1)*64])); } Ok(Self { - channel_id: deserialize(&v[0..32]).unwrap(), + channel_id, signature: secp_signature!(&secp_ctx, &v[32..96]), htlc_signatures, }) @@ -1018,7 +1054,7 @@ impl MsgDecodable for CommitmentSigned { impl MsgEncodable for CommitmentSigned { fn encode(&self) -> Vec { let mut res = Vec::with_capacity(32+64+2+self.htlc_signatures.len()*64); - res.extend_from_slice(&serialize(&self.channel_id).unwrap()); + res.extend_from_slice(&self.channel_id); let secp_ctx = Secp256k1::without_caps(); res.extend_from_slice(&self.signature.serialize_compact(&secp_ctx)); res.extend_from_slice(&byte_utils::be16_to_array(self.htlc_signatures.len() as u16)); @@ -1032,13 +1068,15 @@ impl MsgEncodable for CommitmentSigned { impl MsgDecodable for RevokeAndACK { fn decode(v: &[u8]) -> Result { if v.len() < 32+32+33 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } + let mut channel_id = [0; 32]; + channel_id[..].copy_from_slice(&v[0..32]); let mut per_commitment_secret = [0; 32]; per_commitment_secret.copy_from_slice(&v[32..64]); let secp_ctx = Secp256k1::without_caps(); Ok(Self { - channel_id: deserialize(&v[0..32]).unwrap(), + channel_id, per_commitment_secret, next_per_commitment_point: secp_pubkey!(&secp_ctx, &v[64..97]), }) @@ -1047,7 +1085,7 @@ impl MsgDecodable for RevokeAndACK { impl MsgEncodable for RevokeAndACK { fn encode(&self) -> Vec { let mut res = Vec::with_capacity(32+32+33); - res.extend_from_slice(&serialize(&self.channel_id).unwrap()); + res.extend_from_slice(&self.channel_id); res.extend_from_slice(&self.per_commitment_secret); res.extend_from_slice(&self.next_per_commitment_point.serialize()); res @@ -1057,10 +1095,12 @@ impl MsgEncodable for RevokeAndACK { impl MsgDecodable for UpdateFee { fn decode(v: &[u8]) -> Result { if v.len() < 32+4 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } + let mut channel_id = [0; 32]; + channel_id[..].copy_from_slice(&v[0..32]); Ok(Self { - channel_id: deserialize(&v[0..32]).unwrap(), + channel_id, feerate_per_kw: byte_utils::slice_to_be32(&v[32..36]), }) } @@ -1068,31 +1108,70 @@ impl MsgDecodable for UpdateFee { impl MsgEncodable for UpdateFee { fn encode(&self) -> Vec { let mut res = Vec::with_capacity(32+4); - res.extend_from_slice(&serialize(&self.channel_id).unwrap()); + res.extend_from_slice(&self.channel_id); res.extend_from_slice(&byte_utils::be32_to_array(self.feerate_per_kw)); res } } impl MsgDecodable for ChannelReestablish { - fn decode(_v: &[u8]) -> Result { - unimplemented!(); + fn decode(v: &[u8]) -> Result { + if v.len() < 32+2*8+33 { + return Err(DecodeError::ShortRead); + } + + let your_last_per_commitment_secret = if v.len() > 32+2*8+33 { + if v.len() < 32+2*8+33 + 32 { + return Err(DecodeError::ShortRead); + } + let mut inner_array = [0; 32]; + inner_array.copy_from_slice(&v[48..48+32]); + Some(inner_array) + } else { None }; + + let option_size = match &your_last_per_commitment_secret { + &Some(ref _ary) => 32, + &None => 0, + }; + Ok(Self { + channel_id: deserialize(&v[0..32]).unwrap(), + next_local_commitment_number: byte_utils::slice_to_be64(&v[32..40]), + next_remote_commitment_number: byte_utils::slice_to_be64(&v[40..48]), + your_last_per_commitment_secret: your_last_per_commitment_secret, + my_current_per_commitment_point: { + let ctx = Secp256k1::without_caps(); + secp_pubkey!(&ctx, &v[48+option_size..48+option_size+33]) + } + }) } } impl MsgEncodable for ChannelReestablish { fn encode(&self) -> Vec { - unimplemented!(); + let mut res = Vec::with_capacity(if self.your_last_per_commitment_secret.is_some() { 32+2*3+33 + 32 } else { 32+2*8+33 }); + + res.extend_from_slice(&serialize(&self.channel_id).unwrap()[..]); + res.extend_from_slice(&byte_utils::be64_to_array(self.next_local_commitment_number)); + res.extend_from_slice(&byte_utils::be64_to_array(self.next_remote_commitment_number)); + + if let &Some(ref ary) = &self.your_last_per_commitment_secret { + res.extend_from_slice(&ary[..]); + } + + res.extend_from_slice(&self.my_current_per_commitment_point.serialize()); + res } } impl MsgDecodable for AnnouncementSignatures { fn decode(v: &[u8]) -> Result { if v.len() < 32+8+64*2 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let secp_ctx = Secp256k1::without_caps(); + let mut channel_id = [0; 32]; + channel_id[..].copy_from_slice(&v[0..32]); Ok(Self { - channel_id: deserialize(&v[0..32]).unwrap(), + channel_id, short_channel_id: byte_utils::slice_to_be64(&v[32..40]), node_signature: secp_signature!(&secp_ctx, &v[40..104]), bitcoin_signature: secp_signature!(&secp_ctx, &v[104..168]), @@ -1102,7 +1181,7 @@ impl MsgDecodable for AnnouncementSignatures { impl MsgEncodable for AnnouncementSignatures { fn encode(&self) -> Vec { let mut res = Vec::with_capacity(32+8+64*2); - res.extend_from_slice(&serialize(&self.channel_id).unwrap()); + res.extend_from_slice(&self.channel_id); res.extend_from_slice(&byte_utils::be64_to_array(self.short_channel_id)); let secp_ctx = Secp256k1::without_caps(); res.extend_from_slice(&self.node_signature.serialize_compact(&secp_ctx)); @@ -1115,7 +1194,7 @@ impl MsgDecodable for UnsignedNodeAnnouncement { fn decode(v: &[u8]) -> Result { let features = GlobalFeatures::decode(&v[..])?; if v.len() < features.encoded_len() + 4 + 33 + 3 + 32 + 2 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let start = features.encoded_len(); @@ -1127,22 +1206,23 @@ impl MsgDecodable for UnsignedNodeAnnouncement { let addrlen = byte_utils::slice_to_be16(&v[start + 72..start + 74]) as usize; if v.len() < start + 74 + addrlen { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } + let addr_read_limit = start + 74 + addrlen; let mut addresses = Vec::with_capacity(4); let mut read_pos = start + 74; loop { - if v.len() <= read_pos { break; } + if addr_read_limit <= read_pos { break; } match v[read_pos] { 0 => { read_pos += 1; }, 1 => { - if v.len() < read_pos + 1 + 6 { - return Err(DecodeError::WrongLength); - } if addresses.len() > 0 { return Err(DecodeError::ExtraAddressesPerType); } + if addr_read_limit < read_pos + 1 + 6 { + return Err(DecodeError::BadLengthDescriptor); + } let mut addr = [0; 4]; addr.copy_from_slice(&v[read_pos + 1..read_pos + 5]); addresses.push(NetAddress::IPv4 { @@ -1152,12 +1232,12 @@ impl MsgDecodable for UnsignedNodeAnnouncement { read_pos += 1 + 6; }, 2 => { - if v.len() < read_pos + 1 + 18 { - return Err(DecodeError::WrongLength); - } if addresses.len() > 1 || (addresses.len() == 1 && addresses[0].get_id() != 1) { return Err(DecodeError::ExtraAddressesPerType); } + if addr_read_limit < read_pos + 1 + 18 { + return Err(DecodeError::BadLengthDescriptor); + } let mut addr = [0; 16]; addr.copy_from_slice(&v[read_pos + 1..read_pos + 17]); addresses.push(NetAddress::IPv6 { @@ -1167,12 +1247,12 @@ impl MsgDecodable for UnsignedNodeAnnouncement { read_pos += 1 + 18; }, 3 => { - if v.len() < read_pos + 1 + 12 { - return Err(DecodeError::WrongLength); - } if addresses.len() > 2 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 2) { return Err(DecodeError::ExtraAddressesPerType); } + if addr_read_limit < read_pos + 1 + 12 { + return Err(DecodeError::BadLengthDescriptor); + } let mut addr = [0; 10]; addr.copy_from_slice(&v[read_pos + 1..read_pos + 11]); addresses.push(NetAddress::OnionV2 { @@ -1182,12 +1262,12 @@ impl MsgDecodable for UnsignedNodeAnnouncement { read_pos += 1 + 12; }, 4 => { - if v.len() < read_pos + 1 + 37 { - return Err(DecodeError::WrongLength); - } if addresses.len() > 3 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 3) { return Err(DecodeError::ExtraAddressesPerType); } + if addr_read_limit < read_pos + 1 + 37 { + return Err(DecodeError::BadLengthDescriptor); + } let mut ed25519_pubkey = [0; 32]; ed25519_pubkey.copy_from_slice(&v[read_pos + 1..read_pos + 33]); addresses.push(NetAddress::OnionV3 { @@ -1261,7 +1341,7 @@ impl MsgEncodable for UnsignedNodeAnnouncement { impl MsgDecodable for NodeAnnouncement { fn decode(v: &[u8]) -> Result { if v.len() < 64 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let secp_ctx = Secp256k1::without_caps(); Ok(Self { @@ -1285,7 +1365,7 @@ impl MsgDecodable for UnsignedChannelAnnouncement { fn decode(v: &[u8]) -> Result { let features = GlobalFeatures::decode(&v[..])?; if v.len() < features.encoded_len() + 32 + 8 + 33*4 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let start = features.encoded_len(); let secp_ctx = Secp256k1::without_caps(); @@ -1318,7 +1398,7 @@ impl MsgEncodable for UnsignedChannelAnnouncement { impl MsgDecodable for ChannelAnnouncement { fn decode(v: &[u8]) -> Result { if v.len() < 64*4 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let secp_ctx = Secp256k1::without_caps(); Ok(Self { @@ -1347,7 +1427,7 @@ impl MsgEncodable for ChannelAnnouncement { impl MsgDecodable for UnsignedChannelUpdate { fn decode(v: &[u8]) -> Result { if v.len() < 32+8+4+2+2+8+4+4 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } Ok(Self { chain_hash: deserialize(&v[0..32]).unwrap(), @@ -1379,7 +1459,7 @@ impl MsgEncodable for UnsignedChannelUpdate { impl MsgDecodable for ChannelUpdate { fn decode(v: &[u8]) -> Result { if v.len() < 128 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let secp_ctx = Secp256k1::without_caps(); Ok(Self { @@ -1400,7 +1480,7 @@ impl MsgEncodable for ChannelUpdate { impl MsgDecodable for OnionRealm0HopData { fn decode(v: &[u8]) -> Result { if v.len() < 32 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } Ok(OnionRealm0HopData { short_channel_id: byte_utils::slice_to_be64(&v[0..8]), @@ -1423,7 +1503,7 @@ impl MsgEncodable for OnionRealm0HopData { impl MsgDecodable for OnionHopData { fn decode(v: &[u8]) -> Result { if v.len() < 65 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let realm = v[0]; if realm != 0 { @@ -1451,7 +1531,7 @@ impl MsgEncodable for OnionHopData { impl MsgDecodable for OnionPacket { fn decode(v: &[u8]) -> Result { if v.len() < 1+33+20*65+32 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let mut hop_data = [0; 20*65]; hop_data.copy_from_slice(&v[34..1334]); @@ -1480,15 +1560,15 @@ impl MsgEncodable for OnionPacket { impl MsgDecodable for DecodedOnionErrorPacket { fn decode(v: &[u8]) -> Result { if v.len() < 32 + 4 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let failuremsg_len = byte_utils::slice_to_be16(&v[32..34]) as usize; if v.len() < 32 + 4 + failuremsg_len { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let padding_len = byte_utils::slice_to_be16(&v[34 + failuremsg_len..]) as usize; if v.len() < 32 + 4 + failuremsg_len + padding_len { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let mut hmac = [0; 32]; @@ -1515,11 +1595,11 @@ impl MsgEncodable for DecodedOnionErrorPacket { impl MsgDecodable for OnionErrorPacket { fn decode(v: &[u8]) -> Result { if v.len() < 2 { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } let len = byte_utils::slice_to_be16(&v[0..2]) as usize; if v.len() < 2 + len { - return Err(DecodeError::WrongLength); + return Err(DecodeError::ShortRead); } Ok(Self { data: v[2..len+2].to_vec(), @@ -1534,3 +1614,87 @@ impl MsgEncodable for OnionErrorPacket { res } } + +impl MsgEncodable for ErrorMessage { + fn encode(&self) -> Vec { + let mut res = Vec::with_capacity(34 + self.data.len()); + res.extend_from_slice(&self.channel_id); + res.extend_from_slice(&byte_utils::be16_to_array(self.data.len() as u16)); + res.extend_from_slice(&self.data.as_bytes()); + res + } +} +impl MsgDecodable for ErrorMessage { + fn decode(v: &[u8]) -> Result { + if v.len() < 34 { + return Err(DecodeError::ShortRead); + } + let len = byte_utils::slice_to_be16(&v[32..34]); + if v.len() < 34 + len as usize { + return Err(DecodeError::ShortRead); + } + let data = match String::from_utf8(v[34..34 + len as usize].to_vec()) { + Ok(s) => s, + Err(_) => return Err(DecodeError::BadText), + }; + let mut channel_id = [0; 32]; + channel_id[..].copy_from_slice(&v[0..32]); + Ok(Self { + channel_id, + data, + }) + } +} + +#[cfg(test)] +mod tests { + use hex; + use ln::msgs::MsgEncodable; + use ln::msgs; + use secp256k1::key::{PublicKey,SecretKey}; + use secp256k1::Secp256k1; + + #[test] + fn encoding_channel_reestablish_no_secret() { + let public_key = { + let secp_ctx = Secp256k1::new(); + PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&secp_ctx, &hex::decode("0101010101010101010101010101010101010101010101010101010101010101").unwrap()[..]).unwrap()) + }; + + let cr = msgs::ChannelReestablish { + channel_id: [4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0], + next_local_commitment_number: 3, + next_remote_commitment_number: 4, + your_last_per_commitment_secret: None, + my_current_per_commitment_point: public_key, + }; + + let encoded_value = cr.encode(); + assert_eq!( + encoded_value, + vec![4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 3, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143] + ); + } + + #[test] + fn encoding_channel_reestablish_with_secret() { + let public_key = { + let secp_ctx = Secp256k1::new(); + PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&secp_ctx, &hex::decode("0101010101010101010101010101010101010101010101010101010101010101").unwrap()[..]).unwrap()) + }; + + let cr = msgs::ChannelReestablish { + channel_id: [4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0], + next_local_commitment_number: 3, + next_remote_commitment_number: 4, + your_last_per_commitment_secret: Some([9; 32]), + my_current_per_commitment_point: public_key, + }; + + let encoded_value = cr.encode(); + assert_eq!( + encoded_value, + vec![4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143] + ); + } +}