Anoncoin  0.9.4
P2P Digital Currency
hash.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2013 The Bitcoin developers
3 // Copyright (c) 2013-2014 The Anoncoin Core developers
4 // Distributed under the MIT/X11 software license, see the accompanying
5 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 
7 #ifndef ANONCOIN_HASH_H
8 #define ANONCOIN_HASH_H
9 
10 #include "serialize.h"
11 #include "uint256.h"
12 #include "version.h"
13 
14 #include <vector>
15 
16 #include <openssl/ripemd.h>
17 #include <openssl/sha.h>
18 
19 template<typename T1>
20 inline uint256 Hash(const T1 pbegin, const T1 pend)
21 {
22  static unsigned char pblank[1];
23  uint256 hash1;
24  SHA256((pbegin == pend ? pblank : (unsigned char*)&pbegin[0]), (pend - pbegin) * sizeof(pbegin[0]), (unsigned char*)&hash1);
25  uint256 hash2;
26  SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
27  return hash2;
28 }
29 
31 {
32 private:
33  SHA256_CTX ctx;
34 
35 public:
36  int nType;
37  int nVersion;
38 
39  void Init() {
40  SHA256_Init(&ctx);
41  }
42 
43  CHashWriter(int nTypeIn, int nVersionIn) : nType(nTypeIn), nVersion(nVersionIn) {
44  Init();
45  }
46 
47  CHashWriter& write(const char *pch, size_t size) {
48  SHA256_Update(&ctx, pch, size);
49  return (*this);
50  }
51 
52  // invalidates the object
54  uint256 hash1;
55  SHA256_Final((unsigned char*)&hash1, &ctx);
56  uint256 hash2;
57  SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
58  return hash2;
59  }
60 
61  template<typename T>
62  CHashWriter& operator<<(const T& obj) {
63  // Serialize to this stream
64  ::Serialize(*this, obj, nType, nVersion);
65  return (*this);
66  }
67 };
68 
69 
70 template<typename T1, typename T2>
71 inline uint256 Hash(const T1 p1begin, const T1 p1end,
72  const T2 p2begin, const T2 p2end)
73 {
74  static unsigned char pblank[1];
75  uint256 hash1;
76  SHA256_CTX ctx;
77  SHA256_Init(&ctx);
78  SHA256_Update(&ctx, (p1begin == p1end ? pblank : (unsigned char*)&p1begin[0]), (p1end - p1begin) * sizeof(p1begin[0]));
79  SHA256_Update(&ctx, (p2begin == p2end ? pblank : (unsigned char*)&p2begin[0]), (p2end - p2begin) * sizeof(p2begin[0]));
80  SHA256_Final((unsigned char*)&hash1, &ctx);
81  uint256 hash2;
82  SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
83  return hash2;
84 }
85 
86 template<typename T1, typename T2, typename T3>
87 inline uint256 Hash(const T1 p1begin, const T1 p1end,
88  const T2 p2begin, const T2 p2end,
89  const T3 p3begin, const T3 p3end)
90 {
91  static unsigned char pblank[1];
92  uint256 hash1;
93  SHA256_CTX ctx;
94  SHA256_Init(&ctx);
95  SHA256_Update(&ctx, (p1begin == p1end ? pblank : (unsigned char*)&p1begin[0]), (p1end - p1begin) * sizeof(p1begin[0]));
96  SHA256_Update(&ctx, (p2begin == p2end ? pblank : (unsigned char*)&p2begin[0]), (p2end - p2begin) * sizeof(p2begin[0]));
97  SHA256_Update(&ctx, (p3begin == p3end ? pblank : (unsigned char*)&p3begin[0]), (p3end - p3begin) * sizeof(p3begin[0]));
98  SHA256_Final((unsigned char*)&hash1, &ctx);
99  uint256 hash2;
100  SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
101  return hash2;
102 }
103 
104 template<typename T>
105 uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION)
106 {
107  CHashWriter ss(nType, nVersion);
108  ss << obj;
109  return ss.GetHash();
110 }
111 
112 template<typename T1>
113 inline uint160 Hash160(const T1 pbegin, const T1 pend)
114 {
115  static unsigned char pblank[1];
116  uint256 hash1;
117  SHA256((pbegin == pend ? pblank : (unsigned char*)&pbegin[0]), (pend - pbegin) * sizeof(pbegin[0]), (unsigned char*)&hash1);
118  uint160 hash2;
119  RIPEMD160((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
120  return hash2;
121 }
122 
123 inline uint160 Hash160(const std::vector<unsigned char>& vch)
124 {
125  return Hash160(vch.begin(), vch.end());
126 }
127 
128 unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char>& vDataToHash);
129 
130 typedef struct
131 {
132  SHA512_CTX ctxInner;
133  SHA512_CTX ctxOuter;
135 
136 int HMAC_SHA512_Init(HMAC_SHA512_CTX *pctx, const void *pkey, size_t len);
137 int HMAC_SHA512_Update(HMAC_SHA512_CTX *pctx, const void *pdata, size_t len);
138 int HMAC_SHA512_Final(unsigned char *pmd, HMAC_SHA512_CTX *pctx);
139 
140 #endif
SHA512_CTX ctxOuter
Definition: hash.h:133
unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector< unsigned char > &vDataToHash)
Definition: hash.cpp:8
int nVersion
Definition: hash.h:37
SHA512_CTX ctxInner
Definition: hash.h:132
void Serialize(Stream &s, char a, int, int=0)
Definition: serialize.h:128
CHashWriter & write(const char *pch, size_t size)
Definition: hash.h:47
uint160 Hash160(const T1 pbegin, const T1 pend)
Definition: hash.h:113
int HMAC_SHA512_Init(HMAC_SHA512_CTX *pctx, const void *pkey, size_t len)
Definition: hash.cpp:60
uint256 SerializeHash(const T &obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION)
Definition: hash.h:105
SHA256_CTX ctx
Definition: hash.h:33
int HMAC_SHA512_Update(HMAC_SHA512_CTX *pctx, const void *pdata, size_t len)
Definition: hash.cpp:88
uint256 Hash(const T1 pbegin, const T1 pend)
Definition: hash.h:20
CHashWriter(int nTypeIn, int nVersionIn)
Definition: hash.h:43
uint256 GetHash()
Definition: hash.h:53
256-bit unsigned integer
Definition: uint256.h:532
160-bit unsigned integer
Definition: uint256.h:420
CHashWriter & operator<<(const T &obj)
Definition: hash.h:62
void Init()
Definition: hash.h:39
int HMAC_SHA512_Final(unsigned char *pmd, HMAC_SHA512_CTX *pctx)
Definition: hash.cpp:93
int nType
Definition: hash.h:36