Electroneum
log.cpp
Go to the documentation of this file.
1 // Copyright (c) 2017-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 
30 #include "misc_log_ex.h"
31 #include "log.hpp"
32 
33 namespace hw {
34 
35  #undef ELECTRONEUM_DEFAULT_LOG_CATEGORY
36  #define ELECTRONEUM_DEFAULT_LOG_CATEGORY "device"
37 
38  void buffer_to_str(char *to_buff, size_t to_len, const char *buff, size_t len) {
39  CHECK_AND_ASSERT_THROW_MES(to_len > (len*2), "destination buffer too short. At least" << (len*2+1) << " bytes required");
40  for (size_t i=0; i<len; i++) {
41  sprintf(to_buff+2*i, "%.02x", (unsigned char)buff[i]);
42  }
43  }
44 
45  void log_hexbuffer(const std::string &msg, const char* buff, size_t len) {
46  char logstr[1025];
47  buffer_to_str(logstr, sizeof(logstr), buff, len);
48  MDEBUG(msg<< ": " << logstr);
49  }
50 
51  void log_message(const std::string &msg, const std::string &info ) {
52  MDEBUG(msg << ": " << info);
53  }
54 
55 
56  #ifdef WITH_DEVICE_LEDGER
57  namespace ledger {
58 
59  #undef ELECTRONEUM_DEFAULT_LOG_CATEGORY
60  #define ELECTRONEUM_DEFAULT_LOG_CATEGORY "device.ledger"
61 
62 
63  #ifdef DEBUG_HWDEVICE
64  extern crypto::secret_key dbg_viewkey;
65  extern crypto::secret_key dbg_spendkey;
66 
67 
68  void decrypt(char* buf, size_t len) {
69  #if defined(IODUMMYCRYPT_HWDEVICE) || defined(IONOCRYPT_HWDEVICE)
70  size_t i;
71  if (len == 32) {
72  //view key?
73  for (i = 0; i<32; i++) {
74  if (buf[i] != 0) break;
75  }
76  if (i == 32) {
77  memmove(buf, hw::ledger::dbg_viewkey.data, 32);
78  return;
79  }
80  //spend key?
81  for (i = 0; i<32; i++) {
82  if (buf[i] != (char)0xff) break;
83  }
84  if (i == 32) {
85  memmove(buf, hw::ledger::dbg_spendkey.data, 32);
86  return;
87  }
88  }
89  #if defined(IODUMMYCRYPT_HWDEVICE)
90  //std decrypt: XOR.55h
91  for (i = 0; i<len;i++) {
92  buf[i] ^= 0x55;
93  }
94  #endif
95  #endif
96  }
97 
99  crypto::key_derivation x = derivation;
100  decrypt(x.data, 32);
101  return x;
102  }
103 
105  cryptonote::account_keys x = keys;
106  decrypt(x.m_view_secret_key.data, 32);
107  decrypt(x.m_spend_secret_key.data, 32);
108  return x;
109  }
110 
111 
113  crypto::secret_key x = sec;
114  decrypt(x.data, 32);
115  return x;
116  }
117 
118  rct::key decrypt(const rct::key &sec) {
119  rct::key x = sec;
120  decrypt((char*)x.bytes, 32);
121  return x;
122  }
123 
126  decrypt((char*)x.data, 32);
127  return x;
128  }
129 
130  rct::keyV decrypt(const rct::keyV &keys) {
131  rct::keyV x ;
132  x.reserve(keys.size());
133  for (unsigned int j = 0; j<keys.size(); j++) {
134  x.push_back(decrypt(keys[j]));
135  }
136  return x;
137  }
138 
139  static void check(const std::string &msg, const std::string &info, const char *h, const char *d, size_t len, bool crypted) {
140  char dd[32];
141  char logstr[128];
142 
143  CHECK_AND_ASSERT_THROW_MES(len <= sizeof(dd), "invalid len");
144  memmove(dd,d,len);
145  if (crypted) {
146  CHECK_AND_ASSERT_THROW_MES(len<=32, "encrypted data greater than 32");
147  decrypt(dd,len);
148  }
149 
150  if (memcmp(h,dd,len)) {
151  log_message("ASSERT EQ FAIL", msg + ": "+ info );
152  log_hexbuffer(" host ", h, len);
153  log_hexbuffer(" device", dd, len);
154 
155  } else {
156  buffer_to_str(logstr, 128, dd, len);
157  log_message("ASSERT EQ OK", msg + ": "+ info + ": "+ std::string(logstr) );
158  }
159  }
160 
161  void check32(const std::string &msg, const std::string &info, const char *h, const char *d, bool crypted) {
162  check(msg, info, h, d, 32, crypted);
163  }
164 
165  void check8(const std::string &msg, const std::string &info, const char *h, const char *d, bool crypted) {
166  check(msg, info, h, d, 8, crypted);
167  }
168  #endif
169 
170  }
171  #endif //WITH_DEVICE_LEDGER
172 
173 }
const char * res
Definition: hmac_keccak.cpp:41
#define CHECK_AND_ASSERT_THROW_MES(expr, message)
Definition: misc_log_ex.h:173
::std::string string
Definition: gtest-port.h:1097
POD_CLASS key_derivation
Definition: crypto.h:98
void log_hexbuffer(const std::string &msg, const char *buff, size_t len)
Definition: log.cpp:45
void buffer_to_str(char *to_buff, size_t to_len, const char *buff, size_t len)
Definition: log.cpp:38
std::vector< key > keyV
Definition: rctTypes.h:88
#define MDEBUG(x)
Definition: misc_log_ex.h:76
POD_CLASS ec_scalar
Definition: crypto.h:74
Definition: device.cpp:38
const char * buf
Definition: slow_memmem.cpp:74
crypto::secret_key m_view_secret_key
Definition: account.h:45
CXA_THROW_INFO_T * info
Definition: stack_trace.cpp:91
void decrypt(const void *ciphertext, size_t length, const uint8_t *key, const uint8_t *iv, char *plaintext, size_t *plaintext_len)
Definition: protocol.cpp:120
unsigned char bytes[32]
Definition: rctTypes.h:86
crypto::secret_key m_spend_secret_key
Definition: account.h:44
void log_message(const std::string &msg, const std::string &info)
Definition: log.cpp:51
void * memmove(void *a, const void *b, size_t c)