diff options
author | chriseth <c@ethdev.com> | 2017-01-25 06:36:07 +0800 |
---|---|---|
committer | chriseth <c@ethdev.com> | 2017-01-25 06:37:48 +0800 |
commit | 3949624a61b1dd0c32e67d30fe7d46b2511c583f (patch) | |
tree | 796125372166adcc3207927650666186f32edbd8 /libdevcore | |
parent | 605455f96b64f0c4b229cc31186f2dcf22433e6d (diff) | |
download | dexon-solidity-3949624a61b1dd0c32e67d30fe7d46b2511c583f.tar dexon-solidity-3949624a61b1dd0c32e67d30fe7d46b2511c583f.tar.gz dexon-solidity-3949624a61b1dd0c32e67d30fe7d46b2511c583f.tar.bz2 dexon-solidity-3949624a61b1dd0c32e67d30fe7d46b2511c583f.tar.lz dexon-solidity-3949624a61b1dd0c32e67d30fe7d46b2511c583f.tar.xz dexon-solidity-3949624a61b1dd0c32e67d30fe7d46b2511c583f.tar.zst dexon-solidity-3949624a61b1dd0c32e67d30fe7d46b2511c583f.zip |
Also check library addresses.
Diffstat (limited to 'libdevcore')
-rw-r--r-- | libdevcore/CommonData.cpp | 40 | ||||
-rw-r--r-- | libdevcore/CommonData.h | 5 |
2 files changed, 43 insertions, 2 deletions
diff --git a/libdevcore/CommonData.cpp b/libdevcore/CommonData.cpp index 062d1b29..a53d9628 100644 --- a/libdevcore/CommonData.cpp +++ b/libdevcore/CommonData.cpp @@ -19,8 +19,12 @@ * @date 2014 */ -#include "CommonData.h" -#include "Exceptions.h" +#include <libdevcore/CommonData.h> +#include <libdevcore/Exceptions.h> +#include <libdevcore/SHA3.h> + +#include <boost/algorithm/string.hpp> + using namespace std; using namespace dev; @@ -95,3 +99,35 @@ bytes dev::fromHex(std::string const& _s, WhenError _throw) } return ret; } + + +bool dev::passesAddressChecksum(string const& _str, bool _strict) +{ + string s = _str.substr(0, 2) == "0x" ? _str.substr(2) : _str; + + if (s.length() != 40) + return false; + + if (!_strict && ( + _str.find_first_of("abcdef") == string::npos || + _str.find_first_of("ABCDEF") == string::npos + )) + return true; + + h256 hash = keccak256(boost::algorithm::to_lower_copy(s, std::locale::classic())); + for (size_t i = 0; i < 40; ++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; + } + return true; +} diff --git a/libdevcore/CommonData.h b/libdevcore/CommonData.h index 5ffcdcca..e0a6d221 100644 --- a/libdevcore/CommonData.h +++ b/libdevcore/CommonData.h @@ -179,4 +179,9 @@ bool contains(T const& _t, V const& _v) return std::end(_t) != std::find(std::begin(_t), std::end(_t), _v); } +/// @returns true iff @a _str passess the hex address checksum test. +/// @param _strict if false, hex strings with only uppercase or only lowercase letters +/// are considered valid. +bool passesAddressChecksum(std::string const& _str, bool _strict); + } |