Handle obfuscation in CLevelDBIterator

This commit is contained in:
James O'Beirne 2015-10-08 00:44:10 -07:00
parent 3499ce1e1a
commit 0fdf8c80ee
3 changed files with 15 additions and 8 deletions

View file

@ -145,7 +145,7 @@ std::string CLevelDBWrapper::GetObfuscateKeyHex() const
{ {
return HexStr(obfuscate_key); return HexStr(obfuscate_key);
} }
CLevelDBIterator::~CLevelDBIterator() { delete piter; } CLevelDBIterator::~CLevelDBIterator() { delete piter; }
bool CLevelDBIterator::Valid() { return piter->Valid(); } bool CLevelDBIterator::Valid() { return piter->Valid(); }
void CLevelDBIterator::SeekToFirst() { piter->SeekToFirst(); } void CLevelDBIterator::SeekToFirst() { piter->SeekToFirst(); }

View file

@ -73,9 +73,16 @@ class CLevelDBIterator
{ {
private: private:
leveldb::Iterator *piter; leveldb::Iterator *piter;
const std::vector<unsigned char> obfuscate_key;
public: public:
CLevelDBIterator(leveldb::Iterator *piterIn) : piter(piterIn) {}
/**
* @param[in] piterIn The original leveldb iterator.
* @param[in] obfuscate_key If passed, XOR data with this key.
*/
CLevelDBIterator(leveldb::Iterator *piterIn, const std::vector<unsigned char>& obfuscate_key) :
piter(piterIn), obfuscate_key(obfuscate_key) { };
~CLevelDBIterator(); ~CLevelDBIterator();
bool Valid(); bool Valid();
@ -113,7 +120,7 @@ public:
leveldb::Slice slValue = piter->value(); leveldb::Slice slValue = piter->value();
try { try {
CDataStream ssValue(slValue.data(), slValue.data() + slValue.size(), SER_DISK, CLIENT_VERSION); CDataStream ssValue(slValue.data(), slValue.data() + slValue.size(), SER_DISK, CLIENT_VERSION);
ssValue.Xor(db.GetObfuscateKey()); ssValue.Xor(obfuscate_key);
ssValue >> value; ssValue >> value;
} catch(std::exception &e) { } catch(std::exception &e) {
return false; return false;
@ -251,8 +258,8 @@ public:
CLevelDBIterator *NewIterator() CLevelDBIterator *NewIterator()
{ {
return new CLevelDBIterator(pdb->NewIterator(iteroptions)); return new CLevelDBIterator(pdb->NewIterator(iteroptions), obfuscate_key);
{ }
/** /**
* Return true if the database managed by this class contains no entries. * Return true if the database managed by this class contains no entries.

View file

@ -98,7 +98,7 @@ bool CCoinsViewDB::GetStats(CCoinsStats &stats) const {
/* It seems that there are no "const iterators" for LevelDB. Since we /* It seems that there are no "const iterators" for LevelDB. Since we
only need read operations on it, use a const-cast to get around only need read operations on it, use a const-cast to get around
that restriction. */ that restriction. */
boost::scoped_ptr<CLevelDBWrapper> pcursor(const_cast<CLevelDBWrapper*>(&db)->NewIterator()); boost::scoped_ptr<CLevelDBIterator> pcursor(const_cast<CLevelDBWrapper*>(&db)->NewIterator());
pcursor->Seek('c'); pcursor->Seek('c');
CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION);
@ -177,9 +177,9 @@ bool CBlockTreeDB::ReadFlag(const std::string &name, bool &fValue) {
bool CBlockTreeDB::LoadBlockIndexGuts() bool CBlockTreeDB::LoadBlockIndexGuts()
{ {
boost::scoped_ptr<leveldb::Iterator> pcursor(NewIterator()); boost::scoped_ptr<CLevelDBIterator> pcursor(NewIterator());
pcursor->Seek(make_pair('b', uint256(0))); pcursor->Seek(make_pair('b', uint256()));
// Load mapBlockIndex // Load mapBlockIndex
while (pcursor->Valid()) { while (pcursor->Valid()) {