Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
field_element_utils.tcc
Go to the documentation of this file.
1 // Copyright (c) 2015-2022 Clearmatics Technologies Ltd
2 //
3 // SPDX-License-Identifier: LGPL-3.0+
4 
5 #ifndef __ZETH_FIELD_ELEMENT_UTILS_TCC__
6 #define __ZETH_FIELD_ELEMENT_UTILS_TCC__
7 
8 #include "libzeth/core/field_element_utils.hpp"
9 #include "libzeth/core/utils.hpp"
10 
11 #include <assert.h>
12 #include <iomanip>
13 
14 namespace libzeth
15 {
16 
17 template<typename FieldT>
18 std::string base_field_element_to_hex(const FieldT &field_el)
19 {
20  static_assert(
21  FieldT::extension_degree() == 1, "only valid on base/ground fields");
22  return libff::bigint_to_hex(field_el.as_bigint(), true);
23 }
24 
25 template<typename FieldT>
26 FieldT base_field_element_from_hex(const std::string &hex)
27 {
28  static_assert(
29  FieldT::extension_degree() == 1, "only valid on base/ground fields");
30  using BigIntT =
31  typename std::decay<decltype(((FieldT *)nullptr)->mont_repr)>::type;
32  BigIntT v;
33  libff::bigint_from_hex(v, hex);
34  return FieldT(v);
35 }
36 
37 template<typename FieldT>
38 void field_element_write_json(const FieldT &el, std::ostream &out_s)
39 {
40  libff::field_write<libff::encoding_json, libff::form_plain>(el, out_s);
41 }
42 
43 template<typename FieldT>
44 void field_element_read_json(FieldT &el, std::istream &in_s)
45 {
46  libff::field_read<libff::encoding_json, libff::form_plain>(el, in_s);
47 }
48 
49 template<typename FieldT> std::string field_element_to_json(const FieldT &el)
50 {
51  std::stringstream ss;
52  ss.exceptions(
53  std::ios_base::eofbit | std::ios_base::badbit | std::ios_base::failbit);
54  field_element_write_json(el, ss);
55  return ss.str();
56 }
57 
58 template<typename FieldT>
59 FieldT field_element_from_json(const std::string &json)
60 {
61  std::stringstream ss(json);
62  FieldT result;
63  field_element_read_json(result, ss);
64  return result;
65 }
66 
67 template<typename FieldT>
68 void field_element_write_bytes(const FieldT &el, std::ostream &out_s)
69 {
70  libff::field_write<libff::encoding_binary, libff::form_plain>(el, out_s);
71 }
72 
73 template<typename FieldT>
74 void field_element_read_bytes(FieldT &el, std::istream &in_s)
75 {
76  libff::field_read<libff::encoding_binary, libff::form_plain>(el, in_s);
77 }
78 
79 } // namespace libzeth
80 
81 #endif // __ZETH_FIELD_ELEMENT_UTILS_TCC__