Skip to content

Commit 5d290c5

Browse files
committed
lib: update bitcoin version
Makes use of the new `V2NetworkMessage` apart of the new `p2p` types crate.
1 parent eceb074 commit 5d290c5

File tree

10 files changed

+108
-415
lines changed

10 files changed

+108
-415
lines changed

protocol/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ std = ["bitcoin/std", "bitcoin_hashes/std", "chacha20-poly1305/std", "rand/std",
2020
# depending on which version of tokio is selected by the caller.
2121
tokio = { version = "1", default-features = false, optional = true, features = ["io-util"] }
2222
rand = { version = "0.8.0", default-features = false }
23-
bitcoin = { version = "0.32.4", default-features = false }
23+
bitcoin = { git = "https://github.com/rust-bitcoin/rust-bitcoin", default-features = false, rev = "bd450d7be31bb50b6bc33f2417bfb5f0b00191b0" }
24+
p2p = { package = "bitcoin-p2p-messages", git = "https://github.com/rust-bitcoin/rust-bitcoin", rev = "bd450d7be31bb50b6bc33f2417bfb5f0b00191b0" }
25+
2426
# Depending on hashes directly for HKDF, can drop this and
2527
# use the re-exported version in bitcoin > 0.32.*.
2628
bitcoin_hashes = { version ="0.15.0", default-features = false }

protocol/src/handshake.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use bitcoin::{
1616
},
1717
Network,
1818
};
19+
use p2p::NetworkExt;
1920
use rand::Rng;
2021

2122
use crate::{
@@ -131,7 +132,7 @@ impl Handshake<Initialized> {
131132
) -> Result<Self, Error> {
132133
let mut secret_key_buffer = [0u8; 32];
133134
rng.fill(&mut secret_key_buffer[..]);
134-
let sk = SecretKey::from_slice(&secret_key_buffer)?;
135+
let sk = SecretKey::from_byte_array(&secret_key_buffer)?;
135136
let pk = PublicKey::from_secret_key(curve, &sk);
136137
let es = ElligatorSwift::from_pubkey(pk);
137138

@@ -235,8 +236,8 @@ impl<'a> Handshake<SentKey<'a>> {
235236
let their_ellswift = ElligatorSwift::from_array(their_key);
236237

237238
// Check for V1 protocol magic bytes
238-
if self.network.magic()
239-
== bitcoin::p2p::Magic::from_bytes(
239+
if self.network.default_network_magic()
240+
== p2p::Magic::from_bytes(
240241
their_key[..4]
241242
.try_into()
242243
.expect("64 byte array to have 4 byte prefix"),
@@ -896,17 +897,21 @@ mod tests {
896897

897898
// Create a key that starts with Bitcoin mainnet magic bytes
898899
let mut v1_key = [0u8; NUM_ELLIGATOR_SWIFT_BYTES];
899-
v1_key[..4].copy_from_slice(&Network::Bitcoin.magic().to_bytes());
900+
let magic = p2p::Magic::from_params(Network::Bitcoin)
901+
.unwrap()
902+
.to_bytes();
903+
v1_key[..4].copy_from_slice(&magic);
900904

901905
let result = handshake.receive_key(v1_key);
902906
assert!(matches!(result, Err(Error::V1Protocol)));
903907

904908
// Test with different networks
905-
let handshake = Handshake::<Initialized>::new(Network::Testnet, Role::Responder).unwrap();
909+
let handshake = Handshake::<Initialized>::new(Network::Signet, Role::Responder).unwrap();
906910
let handshake = handshake.send_key(None, &mut buffer).unwrap();
907911

908912
let mut v1_testnet_key = [0u8; NUM_ELLIGATOR_SWIFT_BYTES];
909-
v1_testnet_key[..4].copy_from_slice(&Network::Testnet.magic().to_bytes());
913+
let foo_magic = p2p::Magic::from_params(Network::Signet).unwrap().to_bytes();
914+
v1_testnet_key[..4].copy_from_slice(&foo_magic);
910915

911916
let result = handshake.receive_key(v1_testnet_key);
912917
assert!(matches!(result, Err(Error::V1Protocol)));

protocol/src/lib.rs

Lines changed: 15 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
//!
1616
//! ```no_run
1717
//! use bip324::io::{Protocol, Payload};
18-
//! use bip324::serde::{serialize, deserialize, NetworkMessage};
18+
//! use bitcoin::consensus::{serialize, deserialize};
19+
//! use p2p::message::{NetworkMessage, V2NetworkMessage};
1920
//! use std::net::TcpStream;
2021
//! use std::io::BufReader;
2122
//!
@@ -34,12 +35,12 @@
3435
//! writer,
3536
//! )?;
3637
//!
37-
//! let ping_msg = NetworkMessage::Ping(0xdeadbeef);
38-
//! let serialized = serialize(ping_msg);
38+
//! let ping_msg = V2NetworkMessage::new(NetworkMessage::Ping(0xdeadbeef));
39+
//! let serialized = serialize(&ping_msg);
3940
//! protocol.write(&Payload::genuine(serialized))?;
4041
//!
4142
//! let response = protocol.read()?;
42-
//! let response_msg: NetworkMessage = deserialize(&response.contents())?;
43+
//! let response_msg: V2NetworkMessage = deserialize(&response.contents())?;
4344
//! # Ok(())
4445
//! # }
4546
//! ```
@@ -52,7 +53,8 @@
5253
//! # async fn main() -> Result<(), Box<dyn std::error::Error>> {
5354
//! use bip324::futures::Protocol;
5455
//! use bip324::io::Payload;
55-
//! use bip324::serde::{serialize, deserialize, NetworkMessage};
56+
//! use bitcoin::consensus::{deserialize, serialize};
57+
//! use p2p::message::{NetworkMessage, V2NetworkMessage};
5658
//! use tokio::net::TcpStream;
5759
//! use tokio::io::BufReader;
5860
//!
@@ -70,31 +72,12 @@
7072
//! writer,
7173
//! ).await?;
7274
//!
73-
//! let ping_msg = NetworkMessage::Ping(12345); // nonce
74-
//! let serialized = serialize(ping_msg);
75+
//! let ping_msg = V2NetworkMessage::new(NetworkMessage::Ping(12345)); // nonce
76+
//! let serialized = serialize(&ping_msg);
7577
//! protocol.write(&Payload::genuine(serialized)).await?;
7678
//!
7779
//! let response = protocol.read().await?;
78-
//! let response_msg: NetworkMessage = deserialize(&response.contents())?;
79-
//! # Ok(())
80-
//! # }
81-
//! ```
82-
//!
83-
//! # Message Serialization
84-
//!
85-
//! BIP-324 introduces specific changes to how bitcoin P2P messages are serialized for V2 transport.
86-
//! The [`serde`] module provides these serialization functions.
87-
//!
88-
//! ```no_run
89-
//! # #[cfg(feature = "std")]
90-
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
91-
//! use bip324::serde::{serialize, deserialize, NetworkMessage};
92-
//!
93-
//! let ping_msg = NetworkMessage::Ping(0xdeadbeef);
94-
//! let serialized = serialize(ping_msg);
95-
//!
96-
//! let received_bytes = vec![0x12, 0xef, 0xbe, 0xad, 0xde, 0, 0, 0, 0];
97-
//! let message: NetworkMessage = deserialize(&received_bytes)?;
80+
//! let response_msg: V2NetworkMessage = deserialize(&response.contents())?;
9881
//! # Ok(())
9982
//! # }
10083
//! ```
@@ -148,8 +131,6 @@ pub mod futures;
148131
mod handshake;
149132
#[cfg(feature = "std")]
150133
pub mod io;
151-
#[cfg(feature = "std")]
152-
pub mod serde;
153134

154135
use core::fmt;
155136

@@ -168,6 +149,7 @@ pub use handshake::{
168149
};
169150

170151
use fschacha20poly1305::{FSChaCha20, FSChaCha20Poly1305};
152+
use p2p::NetworkExt;
171153

172154
/// Value for header byte with the decoy flag flipped to true.
173155
pub const DECOY_BYTE: u8 = 128;
@@ -234,10 +216,10 @@ impl fmt::Display for Error {
234216
"Packet size exceeds maximum 4MiB size for automatic allocation."
235217
),
236218
Error::NoGarbageTerminator => {
237-
write!(f, "More than 4095 bytes of garbage recieved in the handshake before a terminator was sent.")
219+
write!(f, "More than 4095 bytes of garbage received in the handshake before a terminator was sent.")
238220
}
239221
Error::SecretGeneration(e) => write!(f, "Cannot generate secrets: {e:?}."),
240-
Error::Decryption(e) => write!(f, "Decrytion error: {e:?}."),
222+
Error::Decryption(e) => write!(f, "Decryption error: {e:?}."),
241223
Error::V1Protocol => write!(f, "The remote peer is communicating on the V1 protocol."),
242224
Error::TooMuchGarbage => write!(
243225
f,
@@ -353,7 +335,7 @@ impl SessionKeyMaterial {
353335
let ecdh_sk = ElligatorSwift::shared_secret(a, b, secret, party, Some(data));
354336

355337
let ikm_salt = "bitcoin_v2_shared_secret".as_bytes();
356-
let magic = network.magic().to_bytes();
338+
let magic = network.default_network_magic().to_bytes();
357339
let salt = [ikm_salt, &magic].concat();
358340
let hk = Hkdf::<sha256::Hash>::new(salt.as_slice(), ecdh_sk.as_secret_bytes());
359341
let mut session_id = [0u8; 32];
@@ -376,7 +358,7 @@ impl SessionKeyMaterial {
376358
hk.expand(garbage_info, &mut garbage)?;
377359
let initiator_garbage_terminator: [u8; 16] = garbage[..16]
378360
.try_into()
379-
.expect("first 16 btyes of expanded garbage");
361+
.expect("first 16 bytes of expanded garbage");
380362
let responder_garbage_terminator: [u8; 16] = garbage[16..]
381363
.try_into()
382364
.expect("last 16 bytes of expanded garbage");

0 commit comments

Comments
 (0)