diff options
author | fanquake <fanquake@gmail.com> | 2020-11-17 13:56:11 +0800 |
---|---|---|
committer | fanquake <fanquake@gmail.com> | 2020-11-17 13:56:22 +0800 |
commit | 7c0d412a74ba8d791e6b83b6aca82406f2158fc3 (patch) | |
tree | 764dafb081b7c352f6d41272657d9f1afb31dad0 | |
parent | c48e788246fcced78cb4eb1d4bd09cb41a9ff09b (diff) | |
parent | d355a302d9b7e4aaac04edaa0671ced3b3eaef45 (diff) |
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.cpp | 6 |
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; } |