Skip to content

Commit 4fb6df6

Browse files
committed
Add mnemonics support
1 parent be644ae commit 4fb6df6

19 files changed

+23333
-0
lines changed

extensions/mnemonics.json

Lines changed: 443 additions & 0 deletions
Large diffs are not rendered by default.

extensions/mnemonics/chinese_simplified.h

Lines changed: 1709 additions & 0 deletions
Large diffs are not rendered by default.

extensions/mnemonics/dutch.h

Lines changed: 1686 additions & 0 deletions
Large diffs are not rendered by default.

extensions/mnemonics/electrum-words.cpp

Lines changed: 490 additions & 0 deletions
Large diffs are not rendered by default.

extensions/mnemonics/electrum-words.h

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
// Copyright (c) 2014-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+
/*!
30+
* \file electrum-words.h
31+
*
32+
* \brief Mnemonic seed generation and wallet restoration from them.
33+
*
34+
* This file and its cpp file are for translating Electrum-style word lists
35+
* into their equivalent byte representations for cross-compatibility with
36+
* that method of "backing up" one's wallet keys.
37+
*/
38+
39+
#ifndef ELECTRUM_WORDS_H
40+
#define ELECTRUM_WORDS_H
41+
42+
#include <string>
43+
#include <cstdint>
44+
#include <map>
45+
#include "crypto/crypto.h" // for declaration of crypto::secret_key
46+
47+
/*!
48+
* \namespace crypto
49+
*
50+
* \brief crypto namespace.
51+
*/
52+
namespace crypto
53+
{
54+
/*!
55+
* \namespace crypto::ElectrumWords
56+
*
57+
* \brief Mnemonic seed word generation and wallet restoration helper functions.
58+
*/
59+
namespace ElectrumWords
60+
{
61+
62+
const int seed_length = 24;
63+
const std::string old_language_name = "EnglishOld";
64+
/*!
65+
* \brief Converts seed words to bytes (secret key).
66+
* \param words String containing the words separated by spaces.
67+
* \param dst To put the secret data restored from the words.
68+
* \param len The number of bytes to expect, 0 if unknown
69+
* \param duplicate If true and len is not zero, we accept half the data, and duplicate it
70+
* \param language_name Language of the seed as found gets written here.
71+
* \return false if not a multiple of 3 words, or if word is not in the words list
72+
*/
73+
bool words_to_bytes(std::string words, std::string& dst, size_t len, bool duplicate,
74+
std::string &language_name);
75+
/*!
76+
* \brief Converts seed words to bytes (secret key).
77+
* \param words String containing the words separated by spaces.
78+
* \param dst To put the secret key restored from the words.
79+
* \param language_name Language of the seed as found gets written here.
80+
* \return false if not a multiple of 3 words, or if word is not in the words list
81+
*/
82+
bool words_to_bytes(std::string words, Crypto::SecretKey& dst,
83+
std::string &language_name);
84+
85+
/*!
86+
* \brief Converts bytes to seed words.
87+
* \param src Secret data
88+
* \param len Secret data length in bytes (positive multiples of 4 only)
89+
* \param words Space delimited concatenated words get written here.
90+
* \param language_name Seed language name
91+
* \return true if successful false if not. Unsuccessful if wrong key size.
92+
*/
93+
bool bytes_to_words(const char *src, size_t len, std::string& words,
94+
const std::string &language_name);
95+
96+
/*!
97+
* \brief Converts bytes (secret key) to seed words.
98+
* \param src Secret key
99+
* \param words Space delimited concatenated words get written here.
100+
* \param language_name Seed language name
101+
* \return true if successful false if not. Unsuccessful if wrong key size.
102+
*/
103+
bool bytes_to_words(const Crypto::SecretKey& src, std::string& words,
104+
const std::string &language_name);
105+
106+
/*!
107+
* \brief Gets a list of seed languages that are supported.
108+
* \param languages A vector is set to the list of languages.
109+
*/
110+
void get_language_list(std::vector<std::string> &languages);
111+
112+
/*!
113+
* \brief Tells if the seed passed is an old style seed or not.
114+
* \param seed The seed to check (a space delimited concatenated word list)
115+
* \return true if the seed passed is a old style seed false if not.
116+
*/
117+
bool get_is_old_style_seed(std::string seed);
118+
}
119+
}
120+
121+
#endif

0 commit comments

Comments
 (0)