-
Notifications
You must be signed in to change notification settings - Fork 29
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
121 additions
and
107 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
// Copyright (c) 2009-2010 Satoshi Nakamoto | ||
// Copyright (c) 2009-2012 The Bitcoin developers | ||
// Distributed under the MIT/X11 software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
#ifndef BITCOIN_HASH_H | ||
#define BITCOIN_HASH_H | ||
|
||
#include "uint256.h" | ||
#include "serialize.h" | ||
|
||
#include <openssl/sha.h> | ||
#include <openssl/ripemd.h> | ||
|
||
template<typename T1> | ||
inline uint256 Hash(const T1 pbegin, const T1 pend) | ||
{ | ||
static unsigned char pblank[1]; | ||
uint256 hash1; | ||
SHA256((pbegin == pend ? pblank : (unsigned char*)&pbegin[0]), (pend - pbegin) * sizeof(pbegin[0]), (unsigned char*)&hash1); | ||
uint256 hash2; | ||
SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2); | ||
return hash2; | ||
} | ||
|
||
class CHashWriter | ||
{ | ||
private: | ||
SHA256_CTX ctx; | ||
|
||
public: | ||
int nType; | ||
int nVersion; | ||
|
||
void Init() { | ||
SHA256_Init(&ctx); | ||
} | ||
|
||
CHashWriter(int nTypeIn, int nVersionIn) : nType(nTypeIn), nVersion(nVersionIn) { | ||
Init(); | ||
} | ||
|
||
CHashWriter& write(const char *pch, size_t size) { | ||
SHA256_Update(&ctx, pch, size); | ||
return (*this); | ||
} | ||
|
||
// invalidates the object | ||
uint256 GetHash() { | ||
uint256 hash1; | ||
SHA256_Final((unsigned char*)&hash1, &ctx); | ||
uint256 hash2; | ||
SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2); | ||
return hash2; | ||
} | ||
|
||
template<typename T> | ||
CHashWriter& operator<<(const T& obj) { | ||
// Serialize to this stream | ||
::Serialize(*this, obj, nType, nVersion); | ||
return (*this); | ||
} | ||
}; | ||
|
||
|
||
template<typename T1, typename T2> | ||
inline uint256 Hash(const T1 p1begin, const T1 p1end, | ||
const T2 p2begin, const T2 p2end) | ||
{ | ||
static unsigned char pblank[1]; | ||
uint256 hash1; | ||
SHA256_CTX ctx; | ||
SHA256_Init(&ctx); | ||
SHA256_Update(&ctx, (p1begin == p1end ? pblank : (unsigned char*)&p1begin[0]), (p1end - p1begin) * sizeof(p1begin[0])); | ||
SHA256_Update(&ctx, (p2begin == p2end ? pblank : (unsigned char*)&p2begin[0]), (p2end - p2begin) * sizeof(p2begin[0])); | ||
SHA256_Final((unsigned char*)&hash1, &ctx); | ||
uint256 hash2; | ||
SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2); | ||
return hash2; | ||
} | ||
|
||
template<typename T1, typename T2, typename T3> | ||
inline uint256 Hash(const T1 p1begin, const T1 p1end, | ||
const T2 p2begin, const T2 p2end, | ||
const T3 p3begin, const T3 p3end) | ||
{ | ||
static unsigned char pblank[1]; | ||
uint256 hash1; | ||
SHA256_CTX ctx; | ||
SHA256_Init(&ctx); | ||
SHA256_Update(&ctx, (p1begin == p1end ? pblank : (unsigned char*)&p1begin[0]), (p1end - p1begin) * sizeof(p1begin[0])); | ||
SHA256_Update(&ctx, (p2begin == p2end ? pblank : (unsigned char*)&p2begin[0]), (p2end - p2begin) * sizeof(p2begin[0])); | ||
SHA256_Update(&ctx, (p3begin == p3end ? pblank : (unsigned char*)&p3begin[0]), (p3end - p3begin) * sizeof(p3begin[0])); | ||
SHA256_Final((unsigned char*)&hash1, &ctx); | ||
uint256 hash2; | ||
SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2); | ||
return hash2; | ||
} | ||
|
||
template<typename T> | ||
uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION) | ||
{ | ||
CHashWriter ss(nType, nVersion); | ||
ss << obj; | ||
return ss.GetHash(); | ||
} | ||
|
||
inline uint160 Hash160(const std::vector<unsigned char>& vch) | ||
{ | ||
uint256 hash1; | ||
SHA256(&vch[0], vch.size(), (unsigned char*)&hash1); | ||
uint160 hash2; | ||
RIPEMD160((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2); | ||
return hash2; | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters