Scorum
utils.cpp
Go to the documentation of this file.
2 
3 #include <graphene/utilities/key_conversion.hpp>
4 #include <graphene/utilities/words.hpp>
5 
6 #define BRAIN_KEY_WORD_COUNT 16
7 
8 namespace scorum {
9 namespace wallet {
10 
12 {
13  uint32_t x = fc::sha256::hash(key)._hash[0];
14  static const char hd[] = "0123456789abcdef";
15  std::string result;
16 
17  result += hd[(x >> 0x1c) & 0x0f];
18  result += hd[(x >> 0x18) & 0x0f];
19  result += hd[(x >> 0x14) & 0x0f];
20  result += hd[(x >> 0x10) & 0x0f];
21  result += hd[(x >> 0x0c) & 0x0f];
22  result += hd[(x >> 0x08) & 0x0f];
23  result += hd[(x >> 0x04) & 0x0f];
24  result += hd[(x)&0x0f];
25 
26  return result;
27 }
28 
29 std::string normalize_brain_key(const std::string& s)
30 {
31  size_t i = 0, n = s.length();
32  std::string result;
33  char c;
34  result.reserve(n);
35 
36  bool preceded_by_whitespace = false;
37  bool non_empty = false;
38  while (i < n)
39  {
40  c = s[i++];
41  switch (c)
42  {
43  case ' ':
44  case '\t':
45  case '\r':
46  case '\n':
47  case '\v':
48  case '\f':
49  preceded_by_whitespace = true;
50  continue;
51 
52  case 'a':
53  c = 'A';
54  break;
55  case 'b':
56  c = 'B';
57  break;
58  case 'c':
59  c = 'C';
60  break;
61  case 'd':
62  c = 'D';
63  break;
64  case 'e':
65  c = 'E';
66  break;
67  case 'f':
68  c = 'F';
69  break;
70  case 'g':
71  c = 'G';
72  break;
73  case 'h':
74  c = 'H';
75  break;
76  case 'i':
77  c = 'I';
78  break;
79  case 'j':
80  c = 'J';
81  break;
82  case 'k':
83  c = 'K';
84  break;
85  case 'l':
86  c = 'L';
87  break;
88  case 'm':
89  c = 'M';
90  break;
91  case 'n':
92  c = 'N';
93  break;
94  case 'o':
95  c = 'O';
96  break;
97  case 'p':
98  c = 'P';
99  break;
100  case 'q':
101  c = 'Q';
102  break;
103  case 'r':
104  c = 'R';
105  break;
106  case 's':
107  c = 'S';
108  break;
109  case 't':
110  c = 'T';
111  break;
112  case 'u':
113  c = 'U';
114  break;
115  case 'v':
116  c = 'V';
117  break;
118  case 'w':
119  c = 'W';
120  break;
121  case 'x':
122  c = 'X';
123  break;
124  case 'y':
125  c = 'Y';
126  break;
127  case 'z':
128  c = 'Z';
129  break;
130 
131  default:
132  break;
133  }
134  if (preceded_by_whitespace && non_empty)
135  result.push_back(' ');
136  result.push_back(c);
137  preceded_by_whitespace = false;
138  non_empty = true;
139  }
140  return result;
141 }
142 
143 fc::ecc::private_key derive_private_key(const std::string& prefix_string, int sequence_number)
144 {
145  std::string sequence_string = std::to_string(sequence_number);
146  fc::sha512 h = fc::sha512::hash(prefix_string + " " + sequence_string);
147  fc::ecc::private_key derived_key = fc::ecc::private_key::regenerate(fc::sha256::hash(h));
148  return derived_key;
149 }
150 
152 {
154  // create a private key for secure entropy
155  fc::sha256 sha_entropy1 = fc::ecc::private_key::generate().get_secret();
156  fc::sha256 sha_entropy2 = fc::ecc::private_key::generate().get_secret();
157  fc::bigint entropy1(sha_entropy1.data(), sha_entropy1.data_size());
158  fc::bigint entropy2(sha_entropy2.data(), sha_entropy2.data_size());
159  fc::bigint entropy(entropy1);
160  entropy <<= 8 * sha_entropy1.data_size();
161  entropy += entropy2;
162  std::string brain_key = "";
163 
164  for (int i = 0; i < BRAIN_KEY_WORD_COUNT; i++)
165  {
166  fc::bigint choice = entropy % graphene::words::word_list_size;
167  entropy /= graphene::words::word_list_size;
168  if (i > 0)
169  brain_key += " ";
170  brain_key += graphene::words::word_list[choice.to_int64()];
171  }
172 
173  brain_key = normalize_brain_key(brain_key);
174  fc::ecc::private_key priv_key = derive_private_key(brain_key, 0);
175  result.brain_priv_key = brain_key;
176  result.wif_priv_key = graphene::utilities::key_to_wif(priv_key);
177  result.pub_key = priv_key.get_public_key();
178  return result;
179 }
180 
181 } // namespace scorum
182 } // namespace wallet
fc::ecc::private_key derive_private_key(const std::string &prefix_string, int sequence_number)
Definition: utils.cpp:143
brain_key_info suggest_brain_key()
Definition: utils.cpp:151
std::string pubkey_to_shorthash(const sp::public_key_type &key)
Definition: utils.cpp:11
std::string normalize_brain_key(const std::string &s)
Definition: utils.cpp:29
Definition: asset.cpp:15
#define BRAIN_KEY_WORD_COUNT
Definition: utils.cpp:6