Skip to content

Commit a1aaea5

Browse files
authored
Merge pull request #136 from TheBlueMatt/2018-08-excess-signed-data-bolt-7
Correctly verify and forward excess data post-signature in signed announcement messages
2 parents d2b44ca + f78d729 commit a1aaea5

21 files changed

+508
-55
lines changed

fuzz/Cargo.toml

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,11 @@ path = "fuzz_targets/msg_pong_target.rs"
6262

6363
[[bin]]
6464
name = "msg_error_message_target"
65-
path = "fuzz_targets/msg_error_message_target.rs"
65+
path = "fuzz_targets/msg_targets/msg_error_message_target.rs"
6666

6767
[[bin]]
6868
name = "msg_update_add_htlc_target"
69-
path = "fuzz_targets/msg_update_add_htlc_target.rs"
69+
path = "fuzz_targets/msg_targets/msg_update_add_htlc_target.rs"
7070

7171
[[bin]]
7272
name = "msg_accept_channel_target"
@@ -123,3 +123,31 @@ path = "fuzz_targets/msg_targets/msg_update_fail_htlc_target.rs"
123123
[[bin]]
124124
name = "msg_channel_reestablish_target"
125125
path = "fuzz_targets/msg_targets/msg_channel_reestablish_target.rs"
126+
127+
[[bin]]
128+
name = "msg_announcement_signatures_target"
129+
path = "fuzz_targets/msg_targets/msg_announcement_signatures_target.rs"
130+
131+
[[bin]]
132+
name = "msg_channel_announcement_target"
133+
path = "fuzz_targets/msg_targets/msg_channel_announcement_target.rs"
134+
135+
[[bin]]
136+
name = "msg_channel_update_target"
137+
path = "fuzz_targets/msg_targets/msg_channel_update_target.rs"
138+
139+
[[bin]]
140+
name = "msg_decoded_onion_error_packet_target"
141+
path = "fuzz_targets/msg_targets/msg_decoded_onion_error_packet_target.rs"
142+
143+
[[bin]]
144+
name = "msg_init_target"
145+
path = "fuzz_targets/msg_targets/msg_init_target.rs"
146+
147+
[[bin]]
148+
name = "msg_node_announcement_target"
149+
path = "fuzz_targets/msg_targets/msg_node_announcement_target.rs"
150+
151+
[[bin]]
152+
name = "msg_onion_hop_data_target"
153+
path = "fuzz_targets/msg_targets/msg_onion_hop_data_target.rs"

fuzz/fuzz_targets/channel_target.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ pub fn do_test(data: &[u8]) {
124124
Ok(msg) => msg,
125125
Err(e) => match e {
126126
msgs::DecodeError::UnknownRealmByte => return,
127+
msgs::DecodeError::UnknownRequiredFeature => return,
127128
msgs::DecodeError::BadPublicKey => return,
128129
msgs::DecodeError::BadSignature => return,
129130
msgs::DecodeError::BadText => return,
@@ -146,6 +147,7 @@ pub fn do_test(data: &[u8]) {
146147
Ok(msg) => msg,
147148
Err(e) => match e {
148149
msgs::DecodeError::UnknownRealmByte => return,
150+
msgs::DecodeError::UnknownRequiredFeature => return,
149151
msgs::DecodeError::BadPublicKey => return,
150152
msgs::DecodeError::BadSignature => return,
151153
msgs::DecodeError::BadText => return,
Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,33 @@
1-
for target in CommitmentSigned FundingCreated FundingLocked FundingSigned OpenChannel RevokeAndACK Shutdown UpdateFailHTLC UpdateFailMalformedHTLC UpdateFee UpdateFulfillHTLC AcceptChannel ClosingSigned ChannelReestablish; do
2-
tn=$(echo $target | sed 's/\([a-z0-9]\)\([A-Z]\)/\1_\2/g')
1+
#!/bin/sh
2+
3+
GEN_TEST() {
4+
tn=$(echo $1 | sed 's/\([a-z0-9]\)\([A-Z]\)/\1_\2/g')
35
fn=msg_$(echo $tn | tr '[:upper:]' '[:lower:]')_target.rs
4-
cat msg_target_template.txt | sed s/MSG_TARGET/$target/ > $fn
5-
done
6+
cat msg_target_template.txt | sed s/MSG_TARGET/$1/ | sed "s/TEST_MSG/$2/" | sed "s/EXTRA_ARGS/$3/" > $fn
7+
}
8+
9+
GEN_TEST AcceptChannel test_msg ""
10+
GEN_TEST AnnouncementSignatures test_msg ""
11+
GEN_TEST ChannelReestablish test_msg ""
12+
GEN_TEST ClosingSigned test_msg ""
13+
GEN_TEST CommitmentSigned test_msg ""
14+
GEN_TEST DecodedOnionErrorPacket test_msg ""
15+
GEN_TEST FundingCreated test_msg ""
16+
GEN_TEST FundingLocked test_msg ""
17+
GEN_TEST FundingSigned test_msg ""
18+
GEN_TEST Init test_msg ""
19+
GEN_TEST OpenChannel test_msg ""
20+
GEN_TEST RevokeAndACK test_msg ""
21+
GEN_TEST Shutdown test_msg ""
22+
GEN_TEST UpdateFailHTLC test_msg ""
23+
GEN_TEST UpdateFailMalformedHTLC test_msg ""
24+
GEN_TEST UpdateFee test_msg ""
25+
GEN_TEST UpdateFulfillHTLC test_msg ""
26+
27+
GEN_TEST ChannelAnnouncement test_msg_exact ""
28+
GEN_TEST ChannelUpdate test_msg_exact ""
29+
GEN_TEST NodeAnnouncement test_msg_exact ""
30+
31+
GEN_TEST UpdateAddHTLC test_msg_hole ", 85, 33"
32+
GEN_TEST ErrorMessage test_msg_hole ", 32, 2"
33+
GEN_TEST OnionHopData test_msg_hole ", 1+8+8+4, 12"
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// This file is auto-generated by gen_target.sh based on msg_target_template.txt
2+
// To modify it, modify msg_target_template.txt and run gen_target.sh instead.
3+
4+
extern crate lightning;
5+
6+
use lightning::ln::msgs;
7+
use lightning::util::reset_rng_state;
8+
9+
use lightning::ln::msgs::{MsgEncodable, MsgDecodable};
10+
11+
mod utils;
12+
13+
#[inline]
14+
pub fn do_test(data: &[u8]) {
15+
reset_rng_state();
16+
test_msg!(msgs::AnnouncementSignatures, data);
17+
}
18+
19+
#[cfg(feature = "afl")]
20+
#[macro_use] extern crate afl;
21+
#[cfg(feature = "afl")]
22+
fn main() {
23+
fuzz!(|data| {
24+
do_test(data);
25+
});
26+
}
27+
28+
#[cfg(feature = "honggfuzz")]
29+
#[macro_use] extern crate honggfuzz;
30+
#[cfg(feature = "honggfuzz")]
31+
fn main() {
32+
loop {
33+
fuzz!(|data| {
34+
do_test(data);
35+
});
36+
}
37+
}
38+
39+
extern crate hex;
40+
#[cfg(test)]
41+
mod tests {
42+
#[test]
43+
fn duplicate_crash() {
44+
super::do_test(&::hex::decode("00").unwrap());
45+
}
46+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// This file is auto-generated by gen_target.sh based on msg_target_template.txt
2+
// To modify it, modify msg_target_template.txt and run gen_target.sh instead.
3+
4+
extern crate lightning;
5+
6+
use lightning::ln::msgs;
7+
use lightning::util::reset_rng_state;
8+
9+
use lightning::ln::msgs::{MsgEncodable, MsgDecodable};
10+
11+
mod utils;
12+
13+
#[inline]
14+
pub fn do_test(data: &[u8]) {
15+
reset_rng_state();
16+
test_msg_exact!(msgs::ChannelAnnouncement, data);
17+
}
18+
19+
#[cfg(feature = "afl")]
20+
#[macro_use] extern crate afl;
21+
#[cfg(feature = "afl")]
22+
fn main() {
23+
fuzz!(|data| {
24+
do_test(data);
25+
});
26+
}
27+
28+
#[cfg(feature = "honggfuzz")]
29+
#[macro_use] extern crate honggfuzz;
30+
#[cfg(feature = "honggfuzz")]
31+
fn main() {
32+
loop {
33+
fuzz!(|data| {
34+
do_test(data);
35+
});
36+
}
37+
}
38+
39+
extern crate hex;
40+
#[cfg(test)]
41+
mod tests {
42+
#[test]
43+
fn duplicate_crash() {
44+
super::do_test(&::hex::decode("00").unwrap());
45+
}
46+
}

fuzz/fuzz_targets/msg_update_add_htlc_target.rs renamed to fuzz/fuzz_targets/msg_targets/msg_channel_update_target.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1+
// This file is auto-generated by gen_target.sh based on msg_target_template.txt
2+
// To modify it, modify msg_target_template.txt and run gen_target.sh instead.
3+
14
extern crate lightning;
25

36
use lightning::ln::msgs;
47
use lightning::util::reset_rng_state;
58

69
use lightning::ln::msgs::{MsgEncodable, MsgDecodable};
710

11+
mod utils;
12+
813
#[inline]
914
pub fn do_test(data: &[u8]) {
1015
reset_rng_state();
11-
if let Ok(msg) = msgs::UpdateAddHTLC::decode(data){
12-
let enc = msg.encode();
13-
assert_eq!(&data[0..85], &enc[0..85]);
14-
assert_eq!(&data[85+33..enc.len()], &enc[85+33..]);
15-
}
16+
test_msg_exact!(msgs::ChannelUpdate, data);
1617
}
1718

1819
#[cfg(feature = "afl")]
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// This file is auto-generated by gen_target.sh based on msg_target_template.txt
2+
// To modify it, modify msg_target_template.txt and run gen_target.sh instead.
3+
4+
extern crate lightning;
5+
6+
use lightning::ln::msgs;
7+
use lightning::util::reset_rng_state;
8+
9+
use lightning::ln::msgs::{MsgEncodable, MsgDecodable};
10+
11+
mod utils;
12+
13+
#[inline]
14+
pub fn do_test(data: &[u8]) {
15+
reset_rng_state();
16+
test_msg!(msgs::DecodedOnionErrorPacket, data);
17+
}
18+
19+
#[cfg(feature = "afl")]
20+
#[macro_use] extern crate afl;
21+
#[cfg(feature = "afl")]
22+
fn main() {
23+
fuzz!(|data| {
24+
do_test(data);
25+
});
26+
}
27+
28+
#[cfg(feature = "honggfuzz")]
29+
#[macro_use] extern crate honggfuzz;
30+
#[cfg(feature = "honggfuzz")]
31+
fn main() {
32+
loop {
33+
fuzz!(|data| {
34+
do_test(data);
35+
});
36+
}
37+
}
38+
39+
extern crate hex;
40+
#[cfg(test)]
41+
mod tests {
42+
#[test]
43+
fn duplicate_crash() {
44+
super::do_test(&::hex::decode("00").unwrap());
45+
}
46+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// This file is auto-generated by gen_target.sh based on msg_target_template.txt
2+
// To modify it, modify msg_target_template.txt and run gen_target.sh instead.
3+
4+
extern crate lightning;
5+
6+
use lightning::ln::msgs;
7+
use lightning::util::reset_rng_state;
8+
9+
use lightning::ln::msgs::{MsgEncodable, MsgDecodable};
10+
11+
mod utils;
12+
13+
#[inline]
14+
pub fn do_test(data: &[u8]) {
15+
reset_rng_state();
16+
test_msg_hole!(msgs::ErrorMessage, data, 32, 2);
17+
}
18+
19+
#[cfg(feature = "afl")]
20+
#[macro_use] extern crate afl;
21+
#[cfg(feature = "afl")]
22+
fn main() {
23+
fuzz!(|data| {
24+
do_test(data);
25+
});
26+
}
27+
28+
#[cfg(feature = "honggfuzz")]
29+
#[macro_use] extern crate honggfuzz;
30+
#[cfg(feature = "honggfuzz")]
31+
fn main() {
32+
loop {
33+
fuzz!(|data| {
34+
do_test(data);
35+
});
36+
}
37+
}
38+
39+
extern crate hex;
40+
#[cfg(test)]
41+
mod tests {
42+
#[test]
43+
fn duplicate_crash() {
44+
super::do_test(&::hex::decode("00").unwrap());
45+
}
46+
}

fuzz/fuzz_targets/msg_error_message_target.rs renamed to fuzz/fuzz_targets/msg_targets/msg_init_target.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1+
// This file is auto-generated by gen_target.sh based on msg_target_template.txt
2+
// To modify it, modify msg_target_template.txt and run gen_target.sh instead.
3+
14
extern crate lightning;
25

36
use lightning::ln::msgs;
47
use lightning::util::reset_rng_state;
58

69
use lightning::ln::msgs::{MsgEncodable, MsgDecodable};
710

11+
mod utils;
12+
813
#[inline]
914
pub fn do_test(data: &[u8]) {
1015
reset_rng_state();
11-
if let Ok(msg) = msgs::ErrorMessage::decode(data){
12-
let enc = msg.encode();
13-
assert_eq!(&data[0..32], &enc[0..32]);
14-
assert_eq!(&data[34..enc.len()], &enc[34..]);
15-
}
16+
test_msg!(msgs::Init, data);
1617
}
1718

1819
#[cfg(feature = "afl")]
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// This file is auto-generated by gen_target.sh based on msg_target_template.txt
2+
// To modify it, modify msg_target_template.txt and run gen_target.sh instead.
3+
4+
extern crate lightning;
5+
6+
use lightning::ln::msgs;
7+
use lightning::util::reset_rng_state;
8+
9+
use lightning::ln::msgs::{MsgEncodable, MsgDecodable};
10+
11+
mod utils;
12+
13+
#[inline]
14+
pub fn do_test(data: &[u8]) {
15+
reset_rng_state();
16+
test_msg_exact!(msgs::NodeAnnouncement, data);
17+
}
18+
19+
#[cfg(feature = "afl")]
20+
#[macro_use] extern crate afl;
21+
#[cfg(feature = "afl")]
22+
fn main() {
23+
fuzz!(|data| {
24+
do_test(data);
25+
});
26+
}
27+
28+
#[cfg(feature = "honggfuzz")]
29+
#[macro_use] extern crate honggfuzz;
30+
#[cfg(feature = "honggfuzz")]
31+
fn main() {
32+
loop {
33+
fuzz!(|data| {
34+
do_test(data);
35+
});
36+
}
37+
}
38+
39+
extern crate hex;
40+
#[cfg(test)]
41+
mod tests {
42+
#[test]
43+
fn duplicate_crash() {
44+
super::do_test(&::hex::decode("00").unwrap());
45+
}
46+
}

0 commit comments

Comments
 (0)