From 8a6692b2cfb7cf53db6731acd6a9908bd36b5475 Mon Sep 17 00:00:00 2001 From: wadeAlexC Date: Thu, 5 Oct 2017 09:28:25 -0400 Subject: Improves address literal checksum error message --- libdevcore/CommonData.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'libdevcore/CommonData.cpp') diff --git a/libdevcore/CommonData.cpp b/libdevcore/CommonData.cpp index db11e61c..85ad685b 100644 --- a/libdevcore/CommonData.cpp +++ b/libdevcore/CommonData.cpp @@ -86,20 +86,23 @@ bool dev::passesAddressChecksum(string const& _str, bool _strict) )) return true; + return _str == dev::getChecksummedAddress(_str); +} + +string dev::getChecksummedAddress(string const& _addr) +{ + string s = _addr.substr(0, 2) == "0x" ? _addr.substr(2) : _addr; h256 hash = keccak256(boost::algorithm::to_lower_copy(s, std::locale::classic())); - for (size_t i = 0; i < 40; ++i) + string ret = "0x"; + + for (size_t i = 0; i < s.length(); ++i) { char addressCharacter = s[i]; - bool lowerCase; - if ('a' <= addressCharacter && addressCharacter <= 'f') - lowerCase = true; - else if ('A' <= addressCharacter && addressCharacter <= 'F') - lowerCase = false; - else - continue; unsigned nibble = (unsigned(hash[i / 2]) >> (4 * (1 - (i % 2)))) & 0xf; - if ((nibble >= 8) == lowerCase) - return false; + if (nibble >= 8) + ret += toupper(addressCharacter); + else + ret += tolower(addressCharacter); } - return true; + return ret; } -- cgit v1.2.3 From 6ebc094474837d922ac00a92c54c903c5eb78585 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 20 Oct 2017 15:23:28 +0100 Subject: Ensure that non-hex characters are caught in address checksumming --- libdevcore/CommonData.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'libdevcore/CommonData.cpp') diff --git a/libdevcore/CommonData.cpp b/libdevcore/CommonData.cpp index 85ad685b..445d11cd 100644 --- a/libdevcore/CommonData.cpp +++ b/libdevcore/CommonData.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -92,10 +93,13 @@ bool dev::passesAddressChecksum(string const& _str, bool _strict) string dev::getChecksummedAddress(string const& _addr) { string s = _addr.substr(0, 2) == "0x" ? _addr.substr(2) : _addr; + assertThrow(s.length() == 40, InvalidAddress, ""); + assertThrow(s.find_first_not_of("0123456789abcdefABCDEF") == string::npos, InvalidAddress, ""); + h256 hash = keccak256(boost::algorithm::to_lower_copy(s, std::locale::classic())); - string ret = "0x"; - for (size_t i = 0; i < s.length(); ++i) + string ret = "0x"; + for (size_t i = 0; i < 40; ++i) { char addressCharacter = s[i]; unsigned nibble = (unsigned(hash[i / 2]) >> (4 * (1 - (i % 2)))) & 0xf; -- cgit v1.2.3