Electroneum
Loading...
Searching...
No Matches
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
61
62template<test_op op>
64{
65public:
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();
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 {
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
123private:
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 sc_mul(unsigned char *, const unsigned char *, const unsigned char *)
void ge_double_scalarmult_precomp_vartime(ge_p2 *, const unsigned char *, const ge_p3 *, const unsigned char *, const ge_dsmp)
ge_cached ge_dsmp[8]
Definition crypto-ops.h:79
void ge_dsm_precomp(ge_dsmp r, const ge_p3 *s)
int ge_frombytes_vartime(ge_p3 *, const unsigned char *)
void sc_sub(unsigned char *, const unsigned char *, const unsigned char *)
void ge_double_scalarmult_precomp_vartime2(ge_p2 *, const unsigned char *, const ge_dsmp, const unsigned char *, const ge_dsmp)
void ge_double_scalarmult_base_vartime(ge_p2 *, const unsigned char *, const ge_p3 *, const unsigned char *)
void sc_add(unsigned char *, const unsigned char *, const unsigned char *)
test_op
Definition crypto_ops.h:37
@ op_scalarmultKey
Definition crypto_ops.h:48
@ op_ge_double_scalarmult_base_vartime
Definition crypto_ops.h:52
@ op_ge_double_scalarmult_precomp_vartime
Definition crypto_ops.h:53
@ op_ge_add_raw
Definition crypto_ops.h:41
@ ops_fast
Definition crypto_ops.h:44
@ op_scalarmultH
Definition crypto_ops.h:49
@ op_zeroCommitUncached
Definition crypto_ops.h:59
@ op_sc_add
Definition crypto_ops.h:38
@ op_addKeys2
Definition crypto_ops.h:55
@ op_zeroCommitCached
Definition crypto_ops.h:43
@ op_ge_dsm_precomp
Definition crypto_ops.h:51
@ op_ge_double_scalarmult_precomp_vartime2
Definition crypto_ops.h:54
@ op_scalarmultBase
Definition crypto_ops.h:47
@ op_ge_add_p3_p3
Definition crypto_ops.h:42
@ op_addKeys
Definition crypto_ops.h:46
@ op_isInMainSubgroup
Definition crypto_ops.h:58
@ op_addKeys3_2
Definition crypto_ops.h:57
@ op_sc_sub
Definition crypto_ops.h:39
@ op_scalarmult8
Definition crypto_ops.h:50
@ op_addKeys3
Definition crypto_ops.h:56
@ op_sc_mul
Definition crypto_ops.h:40
const char * key
void scalarmultBase(key &aG, const key &a)
Definition rctOps.cpp:350
bool isInMainSubgroup(const key &A)
Definition rctOps.cpp:412
key scalarmultH(const key &a)
Definition rctOps.cpp:389
key skGen()
Definition rctOps.cpp:258
key zeroCommit(etn_amount amount)
Definition rctOps.cpp:322
void scalarmultKey(key &aP, const key &P, const key &a)
Definition rctOps.cpp:368
void addKeys(key &AB, const key &A, const key &B)
Definition rctOps.cpp:420
key scalarmult8(const key &P)
Definition rctOps.cpp:398
void addKeys2(key &aGbB, const key &a, const key &b, const key &B)
Definition rctOps.cpp:466
void precomp(ge_dsmp rv, const key &B)
Definition rctOps.cpp:476
void skGen(key &sk)
Definition rctOps.cpp:253
void addKeys3(key &aAbB, const key &a, const key &A, const key &b, const ge_dsmp B)
Definition rctOps.cpp:485
#define ge_p1p1_to_p3
Definition ge.h:63
#define ge_p3_to_cached
Definition ge.h:61
#define ge_add
Definition ge.h:69