diff options
-rw-r--r-- | src/allocators.h | 4 | ||||
-rw-r--r-- | src/key.h | 7 | ||||
-rw-r--r-- | src/script.cpp | 20 |
3 files changed, 19 insertions, 12 deletions
diff --git a/src/allocators.h b/src/allocators.h index b4490ce277..85af8fe376 100644 --- a/src/allocators.h +++ b/src/allocators.h @@ -176,6 +176,10 @@ private: {} }; +// +// Functions for directly locking/unlocking memory objects. +// Intended for non-dynamically allocated structures. +// template<typename T> void LockObject(const T &t) { LockedPageManager::instance.LockRange((void*)(&t), sizeof(T)); } @@ -84,7 +84,7 @@ public: Set(vch.begin(), vch.end()); } - // Simply read-only vector-like interface to the pubkey data. + // Simple read-only vector-like interface to the pubkey data. unsigned int size() const { return GetLen(vch[0]); } const unsigned char *begin() const { return vch; } const unsigned char *end() const { return vch+size(); } @@ -109,12 +109,11 @@ public: } template<typename Stream> void Serialize(Stream &s, int nType, int nVersion) const { unsigned int len = size(); - ::Serialize(s, VARINT(len), nType, nVersion); + ::WriteCompactSize(s, len); s.write((char*)vch, len); } template<typename Stream> void Unserialize(Stream &s, int nType, int nVersion) { - unsigned int len; - ::Unserialize(s, VARINT(len), nType, nVersion); + unsigned int len = ::ReadCompactSize(s); if (len <= 65) { s.read((char*)vch, len); } else { diff --git a/src/script.cpp b/src/script.cpp index 2c7fd59874..b411666353 100644 --- a/src/script.cpp +++ b/src/script.cpp @@ -16,7 +16,7 @@ using namespace boost; #include "sync.h" #include "util.h" -bool CheckSig(vector<unsigned char> vchSig, vector<unsigned char> vchPubKey, CScript scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, int flags); +bool CheckSig(vector<unsigned char> vchSig, const vector<unsigned char> &vchPubKey, const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, int flags); @@ -1033,13 +1033,13 @@ class CSignatureCache { private: // sigdata_type is (signature hash, signature, public key): - typedef boost::tuple<uint256, std::vector<unsigned char>, std::vector<unsigned char> > sigdata_type; + typedef boost::tuple<uint256, std::vector<unsigned char>, CPubKey> sigdata_type; std::set< sigdata_type> setValid; boost::shared_mutex cs_sigcache; public: bool - Get(uint256 hash, const std::vector<unsigned char>& vchSig, const std::vector<unsigned char>& pubKey) + Get(const uint256 &hash, const std::vector<unsigned char>& vchSig, const CPubKey& pubKey) { boost::shared_lock<boost::shared_mutex> lock(cs_sigcache); @@ -1050,7 +1050,7 @@ public: return false; } - void Set(uint256 hash, const std::vector<unsigned char>& vchSig, const std::vector<unsigned char>& pubKey) + void Set(const uint256 &hash, const std::vector<unsigned char>& vchSig, const CPubKey& pubKey) { // DoS prevention: limit cache size to less than 10MB // (~200 bytes per cache entry times 50,000 entries) @@ -1081,11 +1081,15 @@ public: } }; -bool CheckSig(vector<unsigned char> vchSig, vector<unsigned char> vchPubKey, CScript scriptCode, +bool CheckSig(vector<unsigned char> vchSig, const vector<unsigned char> &vchPubKey, const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, int flags) { static CSignatureCache signatureCache; + CPubKey pubkey(vchPubKey); + if (!pubkey.IsValid()) + return false; + // Hash type is one byte tacked on to the end of the signature if (vchSig.empty()) return false; @@ -1097,14 +1101,14 @@ bool CheckSig(vector<unsigned char> vchSig, vector<unsigned char> vchPubKey, CSc uint256 sighash = SignatureHash(scriptCode, txTo, nIn, nHashType); - if (signatureCache.Get(sighash, vchSig, vchPubKey)) + if (signatureCache.Get(sighash, vchSig, pubkey)) return true; - if (!CPubKey(vchPubKey).Verify(sighash, vchSig)) + if (!pubkey.Verify(sighash, vchSig)) return false; if (!(flags & SCRIPT_VERIFY_NOCACHE)) - signatureCache.Set(sighash, vchSig, vchPubKey); + signatureCache.Set(sighash, vchSig, pubkey); return true; } |