aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfanquake <fanquake@gmail.com>2020-11-17 13:56:11 +0800
committerfanquake <fanquake@gmail.com>2020-11-17 13:56:22 +0800
commit7c0d412a74ba8d791e6b83b6aca82406f2158fc3 (patch)
tree764dafb081b7c352f6d41272657d9f1afb31dad0
parentc48e788246fcced78cb4eb1d4bd09cb41a9ff09b (diff)
parentd355a302d9b7e4aaac04edaa0671ced3b3eaef45 (diff)
downloadbitcoin-7c0d412a74ba8d791e6b83b6aca82406f2158fc3.tar.xz
Merge #20405: p2p: avoid calculating onion address checksum when version is not 3
d355a302d9b7e4aaac04edaa0671ced3b3eaef45 Break circuit earlier (lontivero) Pull request description: Currently when parsing an onion v3 address the pubic key checksum is calculated in order to compare it with the received address checksum. However this step is not necessary if the address version byte is not 3, in which case the method can return with false immediately. ACKs for top commit: jonatack: ACK d355a302d9b7e4aaac04edaa0671ced3b3eaef45 practicalswift: ACK d355a302d9b7e4aaac04edaa0671ced3b3eaef45 -- patch looks correct hebasto: ACK d355a302d9b7e4aaac04edaa0671ced3b3eaef45, I have reviewed the code and it looks OK, I agree it can be merged. sipa: utACK d355a302d9b7e4aaac04edaa0671ced3b3eaef45 Tree-SHA512: 9e4506793b7f4a62ce8edc41a260a8c125ae81ed2f90cd850eb2a9214d323c446edc7586c7b0590dcbf3aed5be534718b77bb19c45b48f8f52553d32a3663a65
-rw-r--r--src/netaddress.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/netaddress.cpp b/src/netaddress.cpp
index c0193fa2e9..35e9161f58 100644
--- a/src/netaddress.cpp
+++ b/src/netaddress.cpp
@@ -255,10 +255,14 @@ bool CNetAddr::SetSpecial(const std::string& str)
Span<const uint8_t> input_checksum{input.data() + ADDR_TORV3_SIZE, torv3::CHECKSUM_LEN};
Span<const uint8_t> input_version{input.data() + ADDR_TORV3_SIZE + torv3::CHECKSUM_LEN, sizeof(torv3::VERSION)};
+ if (input_version != torv3::VERSION) {
+ return false;
+ }
+
uint8_t calculated_checksum[torv3::CHECKSUM_LEN];
torv3::Checksum(input_pubkey, calculated_checksum);
- if (input_checksum != calculated_checksum || input_version != torv3::VERSION) {
+ if (input_checksum != calculated_checksum) {
return false;
}