Electroneum
device.cpp
Go to the documentation of this file.
1 // Copyright (c) 2018, 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 #include "gtest/gtest.h"
30 #include "ringct/rctOps.h"
32 
33 TEST(device, name)
34 {
36  ASSERT_TRUE(dev.set_name("test"));
37  ASSERT_EQ(dev.get_name(), "test");
38 }
39 
40 /*
41 TEST(device, locking)
42 {
43  hw::core::device_default dev;
44  ASSERT_TRUE(dev.try_lock());
45  ASSERT_FALSE(dev.try_lock());
46  dev.unlock();
47  ASSERT_TRUE(dev.try_lock());
48  dev.unlock();
49  dev.lock();
50  ASSERT_FALSE(dev.try_lock());
51  dev.unlock();
52  ASSERT_TRUE(dev.try_lock());
53  dev.unlock();
54 }
55 */
56 
57 TEST(device, open_close)
58 {
61  ASSERT_TRUE(dev.open_tx(key));
62  ASSERT_TRUE(dev.close_tx());
63 }
64 
65 TEST(device, ops)
66 {
68  rct::key resd, res;
69  crypto::key_derivation derd, der;
70  rct::key sk, pk;
71  crypto::secret_key sk0, sk1;
72  crypto::public_key pk0, pk1;
73  crypto::ec_scalar ressc0, ressc1;
74  crypto::key_image ki0, ki1;
75 
76  rct::skpkGen(sk, pk);
79 
80  dev.scalarmultKey(resd, pk, sk);
81  rct::scalarmultKey(res, pk, sk);
82  ASSERT_EQ(resd, res);
83 
84  dev.scalarmultBase(resd, sk);
86  ASSERT_EQ(resd, res);
87 
88  dev.sc_secret_add((crypto::secret_key&)resd, sk0, sk1);
89  sc_add((unsigned char*)&res, (unsigned char*)&sk0, (unsigned char*)&sk1);
90  ASSERT_EQ(resd, res);
91 
92  dev.generate_key_derivation(pk0, sk0, derd);
93  crypto::generate_key_derivation(pk0, sk0, der);
94  ASSERT_FALSE(memcmp(&derd, &der, sizeof(der)));
95 
96  dev.derivation_to_scalar(der, 0, ressc0);
97  crypto::derivation_to_scalar(der, 0, ressc1);
98  ASSERT_FALSE(memcmp(&ressc0, &ressc1, sizeof(ressc1)));
99 
100  dev.derive_secret_key(der, 0, rct::rct2sk(sk), sk0);
101  crypto::derive_secret_key(der, 0, rct::rct2sk(sk), sk1);
102  ASSERT_EQ(sk0, sk1);
103 
104  dev.derive_public_key(der, 0, rct::rct2pk(pk), pk0);
105  crypto::derive_public_key(der, 0, rct::rct2pk(pk), pk1);
106  ASSERT_EQ(pk0, pk1);
107 
108  dev.secret_key_to_public_key(rct::rct2sk(sk), pk0);
109  crypto::secret_key_to_public_key(rct::rct2sk(sk), pk1);
110  ASSERT_EQ(pk0, pk1);
111 
112  dev.generate_key_image(pk0, sk0, ki0);
113  crypto::generate_key_image(pk0, sk0, ki1);
114  ASSERT_EQ(ki0, ki1);
115 }
116 
117 TEST(device, ecdh32)
118 {
120  rct::ecdhTuple tuple, tuple2;
121  rct::key key = rct::skGen();
122  tuple.mask = rct::skGen();
123  tuple.amount = rct::skGen();
124  tuple2 = tuple;
125  dev.ecdhEncode(tuple, key, false);
126  dev.ecdhDecode(tuple, key, false);
127  ASSERT_EQ(tuple2.mask, tuple.mask);
128  ASSERT_EQ(tuple2.amount, tuple.amount);
129 }
130 
const char * res
Definition: hmac_keccak.cpp:41
void derivation_to_scalar(const key_derivation &derivation, size_t output_index, ec_scalar &res)
Definition: crypto.h:279
void derive_secret_key(const key_derivation &derivation, std::size_t output_index, const secret_key &base, secret_key &derived_key)
Definition: crypto.h:282
bool generate_key_image(const crypto::public_key &pub, const crypto::secret_key &sec, crypto::key_image &image) override
bool sc_secret_add(crypto::secret_key &r, const crypto::secret_key &a, const crypto::secret_key &b) override
POD_CLASS key_derivation
Definition: crypto.h:98
bool scalarmultBase(rct::key &aG, const rct::key &a) override
void scalarmultKey(key &aP, const key &P, const key &a)
Definition: rctOps.cpp:368
bool derive_public_key(const crypto::key_derivation &derivation, const std::size_t output_index, const crypto::public_key &pub, crypto::public_key &derived_pub) override
bool ecdhEncode(rct::ecdhTuple &unmasked, const rct::key &sharedSec, bool short_amount) override
const char * key
Definition: hmac_keccak.cpp:39
bool close_tx(void) override
bool derivation_to_scalar(const crypto::key_derivation &derivation, const size_t output_index, crypto::ec_scalar &res) override
bool scalarmultKey(rct::key &aP, const rct::key &P, const rct::key &a) override
const std::string get_name() const override
const char * name
bool generate_key_derivation(const public_key &key1, const secret_key &key2, key_derivation &derivation)
Definition: crypto.h:272
bool open_tx(crypto::secret_key &tx_key) override
#define ASSERT_FALSE(condition)
Definition: gtest.h:1868
#define ASSERT_EQ(val1, val2)
Definition: gtest.h:1956
bool ecdhDecode(rct::ecdhTuple &masked, const rct::key &sharedSec, bool short_amount) override
void generate_key_image(const public_key &pub, const secret_key &sec, key_image &image)
Definition: crypto.h:324
POD_CLASS ec_scalar
Definition: crypto.h:74
POD_CLASS public_key
Definition: crypto.h:76
void skGen(key &sk)
Definition: rctOps.cpp:253
void scalarmultBase(key &aG, const key &a)
Definition: rctOps.cpp:350
bool secret_key_to_public_key(const crypto::secret_key &sec, crypto::public_key &pub) override
TEST(device, name)
Definition: device.cpp:33
bool derive_secret_key(const crypto::key_derivation &derivation, const std::size_t output_index, const crypto::secret_key &sec, crypto::secret_key &derived_sec) override
POD_CLASS key_image
Definition: crypto.h:102
#define ASSERT_TRUE(condition)
Definition: gtest.h:1865
bool derive_public_key(const key_derivation &derivation, std::size_t output_index, const public_key &base, public_key &derived_key)
Definition: crypto.h:275
void skpkGen(key &sk, key &pk)
Definition: rctOps.cpp:284
bool secret_key_to_public_key(const secret_key &sec, public_key &pub)
Definition: crypto.h:262
bool set_name(const std::string &name) override
void sc_add(unsigned char *, const unsigned char *, const unsigned char *)
bool generate_key_derivation(const crypto::public_key &pub, const crypto::secret_key &sec, crypto::key_derivation &derivation) override