summaryrefslogtreecommitdiff
path: root/ThirdParty/hash-library/keccak.h
diff options
context:
space:
mode:
Diffstat (limited to 'ThirdParty/hash-library/keccak.h')
-rw-r--r--ThirdParty/hash-library/keccak.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/ThirdParty/hash-library/keccak.h b/ThirdParty/hash-library/keccak.h
new file mode 100644
index 0000000..8b87a25
--- /dev/null
+++ b/ThirdParty/hash-library/keccak.h
@@ -0,0 +1,81 @@
+// //////////////////////////////////////////////////////////
+// keccak.h
+// Copyright (c) 2014,2015 Stephan Brumme. All rights reserved.
+// see http://create.stephan-brumme.com/disclaimer.html
+//
+
+#pragma once
+
+//#include "hash.h"
+#include <string>
+
+// define fixed size integer types
+#ifdef _MSC_VER
+// Windows
+typedef unsigned __int8 uint8_t;
+typedef unsigned __int64 uint64_t;
+#else
+// GCC
+#include <stdint.h>
+#endif
+
+
+/// compute Keccak hash (designated SHA3)
+/** Usage:
+ Keccak keccak;
+ std::string myHash = keccak("Hello World"); // std::string
+ std::string myHash2 = keccak("How are you", 11); // arbitrary data, 11 bytes
+
+ // or in a streaming fashion:
+
+ Keccak keccak;
+ while (more data available)
+ keccak.add(pointer to fresh data, number of new bytes);
+ std::string myHash3 = keccak.getHash();
+ */
+class Keccak //: public Hash
+{
+public:
+ /// algorithm variants
+ enum Bits { Keccak224 = 224, Keccak256 = 256, Keccak384 = 384, Keccak512 = 512 };
+
+ /// same as reset()
+ explicit Keccak(Bits bits = Keccak256);
+
+ /// compute hash of a memory block
+ std::string operator()(const void* data, size_t numBytes);
+ /// compute hash of a string, excluding final zero
+ std::string operator()(const std::string& text);
+
+ /// add arbitrary number of bytes
+ void add(const void* data, size_t numBytes);
+
+ /// return latest hash as hex characters
+ std::string getHash();
+
+ /// restart
+ void reset();
+
+private:
+ /// process a full block
+ void processBlock(const void* data);
+ /// process everything left in the internal buffer
+ void processBuffer();
+
+ /// 1600 bits, stored as 25x64 bit, BlockSize is no more than 1152 bits (Keccak224)
+ enum { StateSize = 1600 / (8 * 8),
+ MaxBlockSize = 200 - 2 * (224 / 8) };
+
+ /// hash
+ uint64_t m_hash[StateSize];
+ /// size of processed data in bytes
+ uint64_t m_numBytes;
+ /// block size (less or equal to MaxBlockSize)
+ size_t m_blockSize;
+ /// valid bytes in m_buffer
+ size_t m_bufferSize;
+ /// bytes not processed yet
+ uint8_t m_buffer[MaxBlockSize];
+ /// variant
+ Bits m_bits;
+};