Browse Source

gost hash for merkle tree

master
orignal 7 years ago
parent
commit
991f770800
  1. 4
      src/server/shared/Bitcoin/Block.cpp
  2. 12
      src/server/shared/Crypto.cpp
  3. 3
      src/server/shared/Crypto.h

4
src/server/shared/Bitcoin/Block.cpp

@ -16,7 +16,7 @@ namespace Bitcoin
for (uint32 i = 0; i < size; i += 2) for (uint32 i = 0; i < size; i += 2)
{ {
uint32 i2 = std::min(i+1, size-1); uint32 i2 = std::min(i+1, size-1);
merkleTree.push_back(Crypto::GOSTD(Util::Join(merkleTree[j+i], merkleTree[j+i2]))); merkleTree.push_back(Crypto::GOSTD(merkleTree[j+i], merkleTree[j+i2]));
} }
j += size; j += size;
@ -35,7 +35,7 @@ namespace Bitcoin
uint32 j = 0; uint32 j = 0;
for (uint32 size = tx.size(); size > 1; size = (size+1)/2) for (uint32 size = tx.size(); size > 1; size = (size+1)/2)
{ {
merkleTree[j+size] = Crypto::GOSTD(Util::Join(merkleTree[j], merkleTree[j+1])); merkleTree[j+size] = Crypto::GOSTD(merkleTree[j], merkleTree[j+1]);
j += size; j += size;
} }

12
src/server/shared/Crypto.cpp

@ -14,4 +14,16 @@ namespace Crypto
hash.push_back (hash2[31-i]); hash.push_back (hash2[31-i]);
return hash; return hash;
} }
BinaryData GOSTD(BinaryData data1, BinaryData data2)
{
BinaryData data3 = data1;
data3.insert(data3.end(), data2.begin(), data2.end());
uint8_t hash1[64];
std::vector<byte> hash(32);
i2p::crypto::GOSTR3411_2012_512 (&data3[0], data3.size (), hash1);
i2p::crypto::GOSTR3411_2012_256 (hash1, 64, &hash[0]);
// we don't convert to Little Endian here
return hash;
}
} }

3
src/server/shared/Crypto.h

@ -10,6 +10,7 @@
namespace Crypto namespace Crypto
{ {
BinaryData GOSTD(BinaryData data); BinaryData GOSTD(BinaryData data);
} BinaryData GOSTD(BinaryData data1, BinaryData data2); // for merkle
}
#endif #endif

Loading…
Cancel
Save