Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
mpc_hash.cpp
Go to the documentation of this file.
1 // Copyright (c) 2015-2022 Clearmatics Technologies Ltd
2 //
3 // SPDX-License-Identifier: LGPL-3.0+
4 
6 
7 #include "libzeth/core/utils.hpp"
8 
9 namespace libzeth
10 {
11 
12 // In the text representation, use 16 x 4-byte words, (each represented as 8
13 // digits + separator).
14 using hash_repr_word = uint32_t;
15 static const size_t HASH_REPR_WORD_SIZE = sizeof(hash_repr_word);
16 static const size_t HASH_REPR_WORDS_PER_HASH =
17  MPC_HASH_SIZE_BYTES / HASH_REPR_WORD_SIZE;
18 
19 static_assert(MPC_HASH_SIZE_BYTES % sizeof(size_t) == 0, "invalid hash size");
20 static_assert(
21  MPC_HASH_SIZE_BYTES == crypto_generichash_blake2b_BYTES_MAX,
22  "unexpected hash size");
23 
25 {
26  crypto_generichash_blake2b_init(&state, nullptr, 0, MPC_HASH_SIZE_BYTES);
27 }
28 
29 void mpc_hash_update(mpc_hash_state_t &state, const void *in, size_t size)
30 {
31  crypto_generichash_blake2b_update(&state, (const uint8_t *)in, size);
32 }
33 
35 {
36  crypto_generichash_blake2b_final(
37  &state, (uint8_t *)out_hash, MPC_HASH_SIZE_BYTES);
38 }
39 
40 void mpc_compute_hash(mpc_hash_t out_hash, const void *data, size_t data_size)
41 {
43  mpc_hash_init(s);
44  mpc_hash_update(s, data, data_size);
45  mpc_hash_final(s, out_hash);
46 }
47 
48 void mpc_compute_hash(mpc_hash_t out_hash, const std::string &data)
49 {
50  mpc_compute_hash(out_hash, data.data(), data.size());
51 }
52 
53 void mpc_hash_write(const mpc_hash_t hash, std::ostream &out)
54 {
55  const hash_repr_word *words = (const hash_repr_word *)hash;
56 
57  for (size_t i = 0; i < HASH_REPR_WORDS_PER_HASH; ++i) {
58  char sep = ((i % 4) == 3) ? '\n' : ' ';
59  out << bytes_to_hex(&words[i], sizeof(words[i])) << sep;
60  }
61 }
62 
63 bool mpc_hash_read(mpc_hash_t out_hash, std::istream &in)
64 {
65  hash_repr_word *out_data = (hash_repr_word *)out_hash;
66 
67  std::string word;
68  for (size_t i = 0; i < HASH_REPR_WORDS_PER_HASH; ++i) {
69  if (!(in >> word)) {
70  std::cerr << "Read failed" << std::endl;
71  return false;
72  }
73 
74  const std::string bin = hex_to_bytes(word);
75  if (bin.size() != HASH_REPR_WORD_SIZE) {
76  std::cerr << "Invalid word size" << std::endl;
77  return false;
78  }
79 
80  memcpy(&out_data[i], bin.data(), HASH_REPR_WORD_SIZE);
81  }
82 
83  return true;
84 }
85 
87 
88 void mpc_hash::update(const void *data, size_t size)
89 {
90  mpc_hash_update(state, data, size);
91 }
92 
93 void mpc_hash::final(mpc_hash_t out_buffer)
94 {
95  mpc_hash_final(state, out_buffer);
96 }
97 
98 } // namespace libzeth
libzeth::hex_to_bytes
void hex_to_bytes(const std::string &hex, void *dest, size_t bytes)
Convert hex to bytes (first chars at lowest address)
Definition: utils.cpp:68
utils.hpp
libzeth::mpc_hash_final
void mpc_hash_final(mpc_hash_state_t &state, mpc_hash_t out_hash)
Definition: mpc_hash.cpp:34
mpc_hash.hpp
libzeth::mpc_hash_state_t
crypto_generichash_blake2b_state mpc_hash_state_t
Definition: mpc_hash.hpp:22
libzeth
Definition: binary_operation.hpp:15
libzeth::mpc_hash::mpc_hash
mpc_hash()
Definition: mpc_hash.cpp:86
libzeth::mpc_hash_t
size_t[MPC_HASH_ARRAY_LENGTH] mpc_hash_t
Definition: mpc_hash.hpp:21
libzeth::mpc_hash_update
void mpc_hash_update(mpc_hash_state_t &state, const void *in, size_t size)
Definition: mpc_hash.cpp:29
libzeth::mpc_hash::update
void update(const void *, size_t)
Definition: mpc_hash.cpp:88
libzeth::hash_repr_word
uint32_t hash_repr_word
Definition: mpc_hash.cpp:14
libzeth::mpc_hash::final
void final(OutBuffer out_buffer)
Definition: mpc_hash.cpp:93
libzeth::mpc_hash_read
bool mpc_hash_read(mpc_hash_t out_hash, std::istream &in)
Definition: mpc_hash.cpp:63
libzeth::mpc_hash_write
void mpc_hash_write(const mpc_hash_t hash, std::ostream &out)
Definition: mpc_hash.cpp:53
libzeth::mpc_compute_hash
void mpc_compute_hash(mpc_hash_t out_hash, const void *data, size_t data_size)
Definition: mpc_hash.cpp:40
libzeth::bytes_to_hex
std::string bytes_to_hex(const void *bytes, size_t num_bytes, bool prefix)
Definition: utils.cpp:105
analyzer.parse_r1cs.data
data
Definition: parse_r1cs.py:116
libzeth::mpc_hash_init
void mpc_hash_init(mpc_hash_state_t &state)
Definition: mpc_hash.cpp:24