Warn about invalid checksums of addresses.

This commit is contained in:
chriseth
2017-01-24 23:37:48 +01:00
parent ba9a045002
commit 1316bb7565
8 changed files with 117 additions and 2 deletions
+41 -2
View File
@@ -20,8 +20,6 @@
* Solidity abstract syntax tree.
*/
#include <algorithm>
#include <functional>
#include <libsolidity/interface/Utils.h>
#include <libsolidity/ast/AST.h>
#include <libsolidity/ast/ASTVisitor.h>
@@ -30,6 +28,11 @@
#include <libdevcore/SHA3.h>
#include <boost/algorithm/string.hpp>
#include <algorithm>
#include <functional>
using namespace std;
using namespace dev;
using namespace dev::solidity;
@@ -522,3 +525,39 @@ IdentifierAnnotation& Identifier::annotation() const
m_annotation = new IdentifierAnnotation();
return static_cast<IdentifierAnnotation&>(*m_annotation);
}
bool Literal::looksLikeAddress() const
{
if (subDenomination() != SubDenomination::None)
return false;
string lit = value();
return lit.substr(0, 2) == "0x" && abs(int(lit.length()) - 42) <= 1;
}
bool Literal::passesAddressChecksum() const
{
string lit = value();
solAssert(lit.substr(0, 2) == "0x", "Expected hex prefix");
lit = lit.substr(2);
if (lit.length() != 40)
return false;
h256 hash = keccak256(boost::algorithm::to_lower_copy(lit, std::locale::classic()));
for (size_t i = 0; i < 40; ++i)
{
char addressCharacter = lit[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;
}