mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-26 09:28:13 +00:00
Tool for checking TREZOR-generated mnemonic
This commit is contained in:
parent
845f874aea
commit
c7729e082c
61
mnemonic_check.py
Executable file
61
mnemonic_check.py
Executable file
@ -0,0 +1,61 @@
|
||||
#!/usr/bin/python
|
||||
'''
|
||||
Use this script to cross-check that TREZOR generated valid
|
||||
mnemonic sentence for given internal (TREZOR-generated)
|
||||
and external (computer-generated) entropy.
|
||||
'''
|
||||
|
||||
import binascii
|
||||
import hashlib
|
||||
import mnemonic
|
||||
|
||||
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 Exception("Invalid strength")
|
||||
|
||||
if not internal_entropy:
|
||||
raise Exception("Internal entropy is not provided")
|
||||
|
||||
if len(internal_entropy) < 32:
|
||||
raise Exception("Internal entropy too short")
|
||||
|
||||
if not external_entropy:
|
||||
raise Exception("External entropy is not provided")
|
||||
|
||||
if len(external_entropy) < 32:
|
||||
raise Exception("External entropy too short")
|
||||
|
||||
entropy = hashlib.sha256(internal_entropy + external_entropy).digest()
|
||||
entropy_stripped = entropy[:strength / 8]
|
||||
|
||||
if len(entropy_stripped) * 8 != strength:
|
||||
raise Exception("Entropy length mismatch")
|
||||
|
||||
return entropy_stripped
|
||||
|
||||
def main():
|
||||
comp = binascii.unhexlify(raw_input("Please enter computer-generated entropy (in hex): ").strip())
|
||||
trzr = binascii.unhexlify(raw_input("Please enter TREZOR-generated entropy (in hex): ").strip())
|
||||
word_count = int(raw_input("How many words your mnemonic has? "))
|
||||
|
||||
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):
|
||||
print "Mnemonic is invalid"
|
||||
return
|
||||
|
||||
if len(words.split(' ')) != word_count:
|
||||
print "Mnemonic length mismatch!"
|
||||
return
|
||||
|
||||
print "Generated mnemonic is:", words
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Reference in New Issue
Block a user