Electroneum
crypto_ops.h
Go to the documentation of this file.
1 // Copyright (c) 2014-2019, The Monero Project
2 //
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without modification, are
6 // permitted provided that the following conditions are met:
7 //
8 // 1. Redistributions of source code must retain the above copyright notice, this list of
9 // conditions and the following disclaimer.
10 //
11 // 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 // of conditions and the following disclaimer in the documentation and/or other
13 // materials provided with the distribution.
14 //
15 // 3. Neither the name of the copyright holder nor the names of its contributors may be
16 // used to endorse or promote products derived from this software without specific
17 // prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
20 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
22 // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
27 // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 //
29 // Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
30 
31 #pragma once
32 
33 #include "crypto/crypto.h"
34 #include "ringct/rctOps.h"
35 
36 enum test_op
37 {
45 
60 };
61 
62 template<test_op op>
64 {
65 public:
66  static const size_t loop_count = op < ops_fast ? 10000000 : 1000;
67 
68  bool init()
69  {
70  scalar0 = rct::skGen();
71  scalar1 = rct::skGen();
72  point0 = rct::scalarmultBase(rct::skGen());
73  point1 = rct::scalarmultBase(rct::skGen());
74  if (ge_frombytes_vartime(&p3_0, point0.bytes) != 0)
75  return false;
76  if (ge_frombytes_vartime(&p3_1, point1.bytes) != 0)
77  return false;
78  ge_p3_to_cached(&cached, &p3_0);
79  rct::precomp(precomp0, point0);
80  rct::precomp(precomp1, point1);
81  return true;
82  }
83 
84  bool test()
85  {
86  rct::key key;
87  ge_cached tmp_cached;
88  ge_p1p1 tmp_p1p1;
89  ge_p2 tmp_p2;
90  ge_dsmp dsmp;
91  switch (op)
92  {
93  case op_sc_add: sc_add(key.bytes, scalar0.bytes, scalar1.bytes); break;
94  case op_sc_sub: sc_sub(key.bytes, scalar0.bytes, scalar1.bytes); break;
95  case op_sc_mul: sc_mul(key.bytes, scalar0.bytes, scalar1.bytes); break;
96  case op_ge_add_p3_p3: {
97  ge_p3_to_cached(&tmp_cached, &p3_0);
98  ge_add(&tmp_p1p1, &p3_1, &tmp_cached);
99  ge_p1p1_to_p3(&p3_1, &tmp_p1p1);
100  break;
101  }
102  case op_ge_add_raw: ge_add(&tmp_p1p1, &p3_1, &cached); break;
103  case op_addKeys: rct::addKeys(key, point0, point1); break;
104  case op_scalarmultBase: rct::scalarmultBase(scalar0); break;
105  case op_scalarmultKey: rct::scalarmultKey(point0, scalar0); break;
106  case op_scalarmultH: rct::scalarmultH(scalar0); break;
107  case op_scalarmult8: rct::scalarmult8(point0); break;
108  case op_ge_dsm_precomp: ge_dsm_precomp(dsmp, &p3_0); break;
109  case op_ge_double_scalarmult_base_vartime: ge_double_scalarmult_base_vartime(&tmp_p2, scalar0.bytes, &p3_0, scalar1.bytes); break;
110  case op_ge_double_scalarmult_precomp_vartime: ge_double_scalarmult_precomp_vartime(&tmp_p2, scalar0.bytes, &p3_0, scalar1.bytes, precomp0); break;
111  case op_ge_double_scalarmult_precomp_vartime2: ge_double_scalarmult_precomp_vartime2(&tmp_p2, scalar0.bytes, precomp0, scalar1.bytes, precomp1); break;
112  case op_addKeys2: rct::addKeys2(key, scalar0, scalar1, point0); break;
113  case op_addKeys3: rct::addKeys3(key, scalar0, point0, scalar1, precomp1); break;
114  case op_addKeys3_2: rct::addKeys3(key, scalar0, precomp0, scalar1, precomp1); break;
115  case op_isInMainSubgroup: rct::isInMainSubgroup(point0); break;
116  case op_zeroCommitUncached: rct::zeroCommit(9001); break;
117  case op_zeroCommitCached: rct::zeroCommit(9000); break;
118  default: return false;
119  }
120  return true;
121  }
122 
123 private:
124  rct::key scalar0, scalar1;
125  rct::key point0, point1;
126  ge_p3 p3_0, p3_1;
127  ge_cached cached;
128  ge_dsmp precomp0, precomp1;
129 };
static const size_t loop_count
Definition: crypto_ops.h:66
void precomp(ge_dsmp rv, const key &B)
Definition: rctOps.cpp:476
bool isInMainSubgroup(const key &A)
Definition: rctOps.cpp:412
void addKeys3(key &aAbB, const key &a, const key &A, const key &b, const ge_dsmp B)
Definition: rctOps.cpp:485
void scalarmultKey(key &aP, const key &P, const key &a)
Definition: rctOps.cpp:368
void sc_sub(unsigned char *, const unsigned char *, const unsigned char *)
const char * key
Definition: hmac_keccak.cpp:39
void ge_double_scalarmult_precomp_vartime2(ge_p2 *, const unsigned char *, const ge_dsmp, const unsigned char *, const ge_dsmp)
void ge_double_scalarmult_precomp_vartime(ge_p2 *, const unsigned char *, const ge_p3 *, const unsigned char *, const ge_dsmp)
void ge_double_scalarmult_base_vartime(ge_p2 *, const unsigned char *, const ge_p3 *, const unsigned char *)
key scalarmultH(const key &a)
Definition: rctOps.cpp:389
#define ge_p1p1_to_p3
Definition: ge.h:63
#define ge_add
Definition: ge.h:69
void skGen(key &sk)
Definition: rctOps.cpp:253
#define ge_p3_to_cached
Definition: ge.h:61
void scalarmultBase(key &aG, const key &a)
Definition: rctOps.cpp:350
ge_cached ge_dsmp[8]
Definition: crypto-ops.h:79
unsigned char bytes[32]
Definition: rctTypes.h:86
void ge_dsm_precomp(ge_dsmp r, const ge_p3 *s)
void addKeys2(key &aGbB, const key &a, const key &b, const key &B)
Definition: rctOps.cpp:466
key scalarmult8(const key &P)
Definition: rctOps.cpp:398
key zeroCommit(etn_amount amount)
Definition: rctOps.cpp:322
int ge_frombytes_vartime(ge_p3 *, const unsigned char *)
void addKeys(key &AB, const key &A, const key &B)
Definition: rctOps.cpp:420
test_op
Definition: crypto_ops.h:36
void sc_mul(unsigned char *, const unsigned char *, const unsigned char *)
void sc_add(unsigned char *, const unsigned char *, const unsigned char *)