python-trezor/tools/mnemonic_check.py

73 lines
2.2 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
2016-05-26 08:20:44 -07:00
import binascii
import hashlib
import mnemonic
2016-05-20 13:27:20 -07:00
2014-02-03 02:36:56 -08:00
__doc__ = '''
Use this script to cross-check that TREZOR generated valid
mnemonic sentence for given internal (TREZOR-generated)
and external (computer-generated) entropy.
Keep in mind that you're entering secret information to this script.
2014-02-03 02:36:56 -08:00
Leaking of these information may lead to stealing your bitcoins
from your wallet! We strongly recommend to run this script only on
2014-02-03 02:36:56 -08:00
highly secured computer (ideally live linux distribution
without an internet connection).
'''
2017-06-23 12:31:42 -07:00
def generate_entropy(strength, internal_entropy, external_entropy):
'''
strength - length of produced seed. One of 128, 192, 256
random - binary stream of random data from external HRNG
'''
if strength not in (128, 192, 256):
raise ValueError("Invalid strength")
if not internal_entropy:
raise ValueError("Internal entropy is not provided")
if len(internal_entropy) < 32:
raise ValueError("Internal entropy too short")
if not external_entropy:
raise ValueError("External entropy is not provided")
if len(external_entropy) < 32:
raise ValueError("External entropy too short")
entropy = hashlib.sha256(internal_entropy + external_entropy).digest()
2016-05-20 13:27:20 -07:00
entropy_stripped = entropy[:strength // 8]
if len(entropy_stripped) * 8 != strength:
raise ValueError("Entropy length mismatch")
return entropy_stripped
2017-06-23 12:31:42 -07:00
def main():
2016-05-20 04:36:17 -07:00
print(__doc__)
2014-02-03 02:36:56 -08:00
2016-05-20 04:36:17 -07:00
comp = binascii.unhexlify(input("Please enter computer-generated entropy (in hex): ").strip())
trzr = binascii.unhexlify(input("Please enter TREZOR-generated entropy (in hex): ").strip())
word_count = int(input("How many words your mnemonic has? "))
2016-05-20 13:27:20 -07:00
strength = word_count * 32 // 3
entropy = generate_entropy(strength, trzr, comp)
words = mnemonic.Mnemonic('english').to_mnemonic(entropy)
if not mnemonic.Mnemonic('english').check(words):
2016-05-20 04:36:17 -07:00
print("Mnemonic is invalid")
return
if len(words.split(' ')) != word_count:
2016-05-20 04:36:17 -07:00
print("Mnemonic length mismatch!")
return
2016-05-20 04:36:17 -07:00
print("Generated mnemonic is:", words)
2017-06-23 12:31:42 -07:00
if __name__ == '__main__':
main()