Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
Convert Mnemonic words back to key data entropy
:param words: Mnemonic words as string of list of words
:type words: str
:param includes_checksum: Boolean to specify if checksum is used. Default is True
:type includes_checksum: bool
:return bytes: Entropy seed
"""
words = self.sanitize_mnemonic(words)
if isinstance(words, TYPE_TEXT):
words = words.split(' ')
wi = []
for word in words:
wi.append(self._wordlist.index(word))
ent = change_base(wi, 2048, 256, output_even=False)
if includes_checksum:
binresult = change_base(ent, 256, 2, len(ent) * 4)
ent = change_base(binresult[:-len(binresult) // 33], 2, 256)
# Check checksum
checksum = binresult[-len(binresult) // 33:]
if checksum != self.checksum(ent):
raise ValueError("Invalid checksum %s for entropy %s" % (checksum, ent))
return ent
:type words: str
:param includes_checksum: Boolean to specify if checksum is used. Default is True
:type includes_checksum: bool
:return bytes: Entropy seed
"""
words = self.sanitize_mnemonic(words)
if isinstance(words, TYPE_TEXT):
words = words.split(' ')
wi = []
for word in words:
wi.append(self._wordlist.index(word))
ent = change_base(wi, 2048, 256, output_even=False)
if includes_checksum:
binresult = change_base(ent, 256, 2, len(ent) * 4)
ent = change_base(binresult[:-len(binresult) // 33], 2, 256)
# Check checksum
checksum = binresult[-len(binresult) // 33:]
if checksum != self.checksum(ent):
raise ValueError("Invalid checksum %s for entropy %s" % (checksum, ent))
return ent
@staticmethod
def checksum(data):
"""
Calculates checksum for given data key
:param data: key string
:type data: bytes, hexstring
:return str: Checksum of key in bits
"""
data = to_bytes(data)
if len(data) % 4 > 0:
raise ValueError('Data length in bits should be divisible by 32, but it is not (%d bytes = %d bits).' %
(len(data), len(data) * 8))
key_hash = hashlib.sha256(data).digest()
return change_base(key_hash, 256, 2, 256)[:len(data) * 8 // 32]
def _check_list(self, language, vectors):
mnemo = Mnemonic(language)
for v in vectors:
if v[0]:
phrase = mnemo.to_mnemonic(v[0], check_on_curve=False)
else:
phrase = v[1]
seed = change_base(mnemo.to_seed(phrase, v[4], validate=False), 256, 16)
# print("Test %s => %s" % (v[0], phrase))
self.assertEqual(v[1], phrase)
self.assertEqual(v[2], seed)
k = HDKey.from_seed(seed)
self.assertEqual(k.wif(is_private=True), v[3])
['bitcoin', 'dash']
:param wif: WIF string or prefix in bytes or hexadecimal string
:type wif: str, bytes
:param witness_type: Limit search to specific witness type
:type witness_type: str
:param multisig: Limit search to multisig: false, true or None for both. Default is both
:type multisig: bool
:param network: Limit search to specified network
:type network: str
:return dict:
"""
if len(wif) > 8:
key_hex = change_base(wif, 58, 16)
else:
key_hex = wif
if not key_hex:
key_hex = to_hexstring(wif)
prefix = key_hex[:8].upper()
matches = []
for nw in NETWORK_DEFINITIONS:
if network is not None and nw != network:
continue
data = NETWORK_DEFINITIONS[nw]
for pf in data['prefixes_wif']:
if pf[0] == prefix and (multisig is None or pf[3] is None or pf[3] == multisig) and \
(witness_type is None or pf[4] is None or pf[4] == witness_type):
matches.append({
'prefix': prefix,
'is_private': True if pf[2] == 'private' else False,
def to_mnemonic(self, data, add_checksum=True, check_on_curve=True):
"""
Convert key data entropy to Mnemonic sentence
:param data: Key data entropy
:type data: bytes, hexstring
:param add_checksum: Included a checksum? Default is True
:type add_checksum: bool
:param check_on_curve: Check if data integer value is on secp256k1 curve. Should be enabled when not testing and working with crypto
:type check_on_curve: bool
:return str: Mnemonic passphrase consisting of a space seperated list of words
"""
data = to_bytes(data)
data_int = change_base(data, 256, 10)
if check_on_curve and not 0 < data_int < secp256k1_n:
raise ValueError("Integer value of data should be in secp256k1 domain between 1 and secp256k1_n-1")
if add_checksum:
binresult = change_base(data_int, 10, 2, len(data) * 8) + self.checksum(data)
wi = change_base(binresult, 2, 2048)
else:
wi = change_base(data_int, 10, 2048)
return normalize_string(' '.join([self._wordlist[i] for i in wi]))
:param data: Key data entropy
:type data: bytes, hexstring
:param add_checksum: Included a checksum? Default is True
:type add_checksum: bool
:param check_on_curve: Check if data integer value is on secp256k1 curve. Should be enabled when not testing and working with crypto
:type check_on_curve: bool
:return str: Mnemonic passphrase consisting of a space seperated list of words
"""
data = to_bytes(data)
data_int = change_base(data, 256, 10)
if check_on_curve and not 0 < data_int < secp256k1_n:
raise ValueError("Integer value of data should be in secp256k1 domain between 1 and secp256k1_n-1")
if add_checksum:
binresult = change_base(data_int, 10, 2, len(data) * 8) + self.checksum(data)
wi = change_base(binresult, 2, 2048)
else:
wi = change_base(data_int, 10, 2048)
return normalize_string(' '.join([self._wordlist[i] for i in wi]))