def entropy_from_mnemonic(mnemonic: Mnemonic, lang: str = "en") -> BinStr: "Return the entropy from the Electrum versioned mnemonic sentence." # verify that it is a valid Electrum mnemonic sentence version_from_mnemonic(mnemonic) indexes = indexes_from_mnemonic(mnemonic, lang) base = WORDLISTS.language_length(lang) return bin_str_entropy_from_wordlist_indexes(indexes, base)
def entropy_from_mnemonic(mnemonic: Mnemonic, lang: str = "en") -> BinStr: "Return the entropy from the BIP39 checksummed mnemonic sentence." indexes = indexes_from_mnemonic(mnemonic, lang) base = WORDLISTS.language_length(lang) cs_entropy = bin_str_entropy_from_wordlist_indexes(indexes, base) bits = int(len(cs_entropy) * 32 / 33) # entropy is only the first part of cs_entropy # the second part being the checksum, to be verified bin_str_entropy, checksum = _entropy_checksum(cs_entropy[:bits]) if cs_entropy[bits:] != checksum: err_msg = f"invalid checksum: {cs_entropy[bits:]}; expected: {checksum}" raise BTClibValueError(err_msg) return bin_str_entropy
def test_indexes() -> None: for entropy in ("0", "00000000000"): indexes = wordlist_indexes_from_bin_str_entropy(entropy, 2048) assert indexes == [0] entropy = "000000000000" indexes = wordlist_indexes_from_bin_str_entropy(entropy, 2048) assert indexes == [0, 0] test_vector = [ [1268, 535, 810, 685, 433, 811, 1385, 1790, 421, 570, 567, 1313], [0, 0, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 0], [0, 0, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 0], ] for indx in test_vector: entropy = bin_str_entropy_from_wordlist_indexes(indx, 2048) indexes = wordlist_indexes_from_bin_str_entropy(entropy, 2048) assert indexes == indx