[core] allow scilab to use more secure hash functions
[scilab.git] / scilab / modules / core / src / cpp / hash / sha3.hxx
1 // //////////////////////////////////////////////////////////
2 // sha3.hxx
3 // Copyright (c) 2014,2015 Stephan Brumme. All rights reserved.
4 // see http://create.stephan-brumme.com/disclaimer.html
5 //
6
7 #pragma once
8
9 #include "hash.hxx"
10 #include <string>
11
12 // define fixed size integer types
13 #ifdef _MSC_VER
14 // Windows
15 typedef unsigned __int8  uint8_t;
16 typedef unsigned __int64 uint64_t;
17 #else
18 // GCC
19 #include <stdint.h>
20 #endif
21
22
23 /// compute SHA3 hash
24 /** Usage:
25     SHA3 sha3;
26     std::string myHash  = sha3("Hello World");     // std::string
27     std::string myHash2 = sha3("How are you", 11); // arbitrary data, 11 bytes
28
29     // or in a streaming fashion:
30
31     SHA3 sha3;
32     while (more data available)
33       sha3.add(pointer to fresh data, number of new bytes);
34     std::string myHash3 = sha3.getHash();
35   */
36 class SHA3 : public Hash
37 {
38 public:
39   /// algorithm variants
40   enum Bits { Bits224 = 224, Bits256 = 256, Bits384 = 384, Bits512 = 512 };
41
42   /// same as reset()
43   explicit SHA3(Bits bits = Bits256);
44
45   /// compute hash of a memory block
46   std::string operator()(const void* data, size_t numBytes);
47   /// compute hash of a string, excluding final zero
48   std::string operator()(const std::string& text);
49
50   /// add arbitrary number of bytes
51   void add(const void* data, size_t numBytes);
52
53   /// return latest hash as hex characters
54   std::string getHash();
55
56   /// restart
57   void reset();
58
59 private:
60   /// process a full block
61   void processBlock(const void* data);
62   /// process everything left in the internal buffer
63   void processBuffer();
64
65   /// 1600 bits, stored as 25x64 bit, BlockSize is no more than 1152 bits (Keccak224)
66   enum { StateSize    = 1600 / (8 * 8),
67          MaxBlockSize =  200 - 2 * (224 / 8) };
68
69   /// hash
70   uint64_t m_hash[StateSize];
71   /// size of processed data in bytes
72   uint64_t m_numBytes;
73   /// block size (less or equal to MaxBlockSize)
74   size_t   m_blockSize;
75   /// valid bytes in m_buffer
76   size_t   m_bufferSize;
77   /// bytes not processed yet
78   uint8_t  m_buffer[MaxBlockSize];
79   /// variant
80   Bits     m_bits;
81 };