emp-toolkit
hash.h
Go to the documentation of this file.
1 #ifndef HASH_H__
2 #define HASH_H__
3 #include "block.h"
4 #include "config.h"
5 #include <openssl/sha.h>
6 #include <stdio.h>
7 #include "utils_ec.h"
12 class Hash {
13  SHA_CTX hash;
14  char buffer[HASH_BUFFER_SIZE];
15  int size = 0;
16  public:
17  static const int DIGEST_SIZE = 20;
18  Hash() {
19  SHA1_Init(&hash);
20  }
21  ~Hash() {
22  }
23  void put(const void * data, int nbyte) {
24  if (nbyte > HASH_BUFFER_SIZE)
25  SHA1_Update(&hash, data, nbyte);
26  else if(size + nbyte < HASH_BUFFER_SIZE) {
27  memcpy(buffer+size, data, nbyte);
28  size+=nbyte;
29  } else {
30  SHA1_Update(&hash, (char*)buffer, size);
31  memcpy(buffer, data, nbyte);
32  size = nbyte;
33  }
34  }
35  void put_block(const block* block, int nblock=1){
36  put(block, sizeof(block)*nblock);
37  }
38  void digest(char * a) {
39  if(size > 0) {
40  SHA1_Update(&hash, (char*)buffer, size);
41  size=0;
42  }
43  SHA1_Final((unsigned char *)a, &hash);
44  }
45  void reset() {
46  SHA1_Init(&hash);
47  size=0;
48  }
49  static void hash_once(void * digest, const void * data, int nbyte) {
50  (void )SHA1((const unsigned char *)data, nbyte, (unsigned char *)digest);
51  }
52  static block hash_for_block(const void * data, int nbyte) {
53  char digest[20];
54  hash_once(digest, data, nbyte);
55  return _mm_load_si128((__m128i*)&digest[0]);
56  }
57  void put_eb(const eb_t * eb, int length) {
58  uint8_t buffer[100];//large enough to hold one.
59  for(int i = 0; i < length; ++i) {
60  int eb_size = eb_size_bin(eb[i], false);
61  eb_write_bin(buffer, eb_size, eb[i], false);
62  put(buffer, eb_size);
63  }
64  }
65 };
67 #endif// HASH_H__
void put_eb(const eb_t *eb, int length)
Definition: hash.h:57
void reset()
Definition: hash.h:45
__m128i block
Definition: block.h:8
Hash()
Definition: hash.h:18
~Hash()
Definition: hash.h:21
void put_block(const block *block, int nblock=1)
Definition: hash.h:35
void put(const void *data, int nbyte)
Definition: hash.h:23
#define HASH_BUFFER_SIZE
Definition: config.h:5
Definition: hash.h:12
void digest(char *a)
Definition: hash.h:38
static const int DIGEST_SIZE
Definition: hash.h:17
static block hash_for_block(const void *data, int nbyte)
Definition: hash.h:52
static void hash_once(void *digest, const void *data, int nbyte)
Definition: hash.h:49