Monero
Loading...
Searching...
No Matches
crypto_ops.h
Go to the documentation of this file.
1// Copyright (c) 2014-2022, 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
66
67template<test_op op>
69{
70public:
71 static const size_t loop_count = op < ops_fast ? 10000000 : 1000;
72
73 bool init()
74 {
81 if (ge_frombytes_vartime(&p3_0, point0.bytes) != 0)
82 return false;
83 if (ge_frombytes_vartime(&p3_1, point1.bytes) != 0)
84 return false;
85 if (ge_frombytes_vartime(&p3_2, point2.bytes) != 0)
86 return false;
91 return true;
92 }
93
94 bool test()
95 {
97 ge_cached tmp_cached;
98 ge_p1p1 tmp_p1p1;
99 ge_p2 tmp_p2;
100 ge_dsmp dsmp;
101 switch (op)
102 {
103 case op_sc_add: sc_add(key.bytes, scalar0.bytes, scalar1.bytes); break;
104 case op_sc_sub: sc_sub(key.bytes, scalar0.bytes, scalar1.bytes); break;
105 case op_sc_mul: sc_mul(key.bytes, scalar0.bytes, scalar1.bytes); break;
106 case op_ge_add_p3_p3: {
107 ge_p3_to_cached(&tmp_cached, &p3_0);
108 ge_add(&tmp_p1p1, &p3_1, &tmp_cached);
109 ge_p1p1_to_p3(&p3_1, &tmp_p1p1);
110 break;
111 }
112 case op_ge_add_raw: ge_add(&tmp_p1p1, &p3_1, &cached); break;
113 case op_addKeys: rct::addKeys(key, point0, point1); break;
119 case op_ge_dsm_precomp: ge_dsm_precomp(dsmp, &p3_0); break;
131 case op_zeroCommitUncached: rct::zeroCommit(9001); break;
132 case op_zeroCommitCached: rct::zeroCommit(9000); break;
133 default: return false;
134 }
135 return true;
136 }
137
138private:
144};
Definition crypto_ops.h:69
ge_p3 p3_1
Definition crypto_ops.h:141
ge_p3 p3_0
Definition crypto_ops.h:141
rct::key scalar2
Definition crypto_ops.h:139
ge_cached cached
Definition crypto_ops.h:142
bool init()
Definition crypto_ops.h:73
rct::key point2
Definition crypto_ops.h:140
ge_p3 p3_2
Definition crypto_ops.h:141
bool test()
Definition crypto_ops.h:94
rct::key scalar1
Definition crypto_ops.h:139
rct::key scalar0
Definition crypto_ops.h:139
ge_dsmp precomp2
Definition crypto_ops.h:143
rct::key point0
Definition crypto_ops.h:140
ge_dsmp precomp0
Definition crypto_ops.h:143
ge_dsmp precomp1
Definition crypto_ops.h:143
static const size_t loop_count
Definition crypto_ops.h:71
rct::key point1
Definition crypto_ops.h:140
ge_cached ge_dsmp[8]
Definition crypto-ops.h:78
test_op
Definition crypto_ops.h:37
@ op_scalarmultKey
Definition crypto_ops.h:48
@ op_ge_double_scalarmult_base_vartime
Definition crypto_ops.h:53
@ op_ge_double_scalarmult_precomp_vartime
Definition crypto_ops.h:55
@ 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:64
@ op_sc_add
Definition crypto_ops.h:38
@ op_addKeys2
Definition crypto_ops.h:58
@ op_zeroCommitCached
Definition crypto_ops.h:43
@ op_addKeys_aGbBcC
Definition crypto_ops.h:61
@ op_ge_dsm_precomp
Definition crypto_ops.h:52
@ op_addKeys_aAbBcC
Definition crypto_ops.h:62
@ op_ge_triple_scalarmult_base_vartime
Definition crypto_ops.h:54
@ op_ge_double_scalarmult_precomp_vartime2
Definition crypto_ops.h:57
@ 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:63
@ op_scalarmult8_p3
Definition crypto_ops.h:51
@ op_addKeys3_2
Definition crypto_ops.h:60
@ op_sc_sub
Definition crypto_ops.h:39
@ op_scalarmult8
Definition crypto_ops.h:50
@ op_addKeys3
Definition crypto_ops.h:59
@ op_sc_mul
Definition crypto_ops.h:40
@ op_ge_triple_scalarmult_precomp_vartime
Definition crypto_ops.h:56
const char * key
Definition hmac_keccak.cpp:40
void scalarmultBase(key &aG, const key &a)
Definition rctOps.cpp:350
void addKeys_aGbBcC(key &aGbBcC, const key &a, const key &b, const ge_dsmp B, const key &c, const ge_dsmp C)
Definition rctOps.cpp:517
bool isInMainSubgroup(const key &A)
Definition rctOps.cpp:424
key zeroCommit(xmr_amount amount)
Definition rctOps.cpp:322
key scalarmultH(const key &a)
Definition rctOps.cpp:389
key skGen()
Definition rctOps.cpp:258
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:432
void addKeys_aAbBcC(key &aAbBcC, const key &a, const ge_dsmp A, const key &b, const ge_dsmp B, const key &c, const ge_dsmp C)
Definition rctOps.cpp:526
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:478
void precomp(ge_dsmp rv, const key &B)
Definition rctOps.cpp:488
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:497
#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
int ge_frombytes_vartime(ge_p3 *h, const unsigned char *s)
Definition crypto-ops.c:1334
void sc_mul(unsigned char *s, const unsigned char *a, const unsigned char *b)
Definition crypto-ops.c:3168
void ge_dsm_precomp(ge_dsmp r, const ge_p3 *s)
Definition crypto-ops.c:1175
void ge_double_scalarmult_precomp_vartime2(ge_p2 *r, const unsigned char *a, const ge_dsmp Ai, const unsigned char *b, const ge_dsmp Bi)
Definition crypto-ops.c:2162
void sc_add(unsigned char *s, const unsigned char *a, const unsigned char *b)
Definition crypto-ops.c:2548
void ge_triple_scalarmult_precomp_vartime(ge_p2 *r, const unsigned char *a, const ge_dsmp Ai, const unsigned char *b, const ge_dsmp Bi, const unsigned char *c, const ge_dsmp Ci)
Definition crypto-ops.c:2202
void ge_double_scalarmult_base_vartime(ge_p2 *r, const unsigned char *a, const ge_p3 *A, const unsigned char *b)
Definition crypto-ops.c:1196
void ge_double_scalarmult_precomp_vartime(ge_p2 *r, const unsigned char *a, const ge_p3 *A, const unsigned char *b, const ge_dsmp Bi)
Definition crypto-ops.c:2294
void sc_sub(unsigned char *s, const unsigned char *a, const unsigned char *b)
Definition crypto-ops.c:2687
void ge_triple_scalarmult_base_vartime(ge_p2 *r, const unsigned char *a, const unsigned char *b, const ge_dsmp Bi, const unsigned char *c, const ge_dsmp Ci)
Definition crypto-ops.c:1238
Definition crypto-ops.h:65
Definition crypto-ops.h:52
Definition crypto-ops.h:39
Definition crypto-ops.h:45
Definition rctTypes.h:79