I am making an attempt to grasp the logic of producing a sound BIP-39 seed phrase. I’ve learn the BIP-39 and making an attempt to implement the part Producing the mnemonic step-by-step. I’ve the next Crystal code that works very effectively for a 256-bit seed I discovered within the reply to: generate a sound hash for a bip39 seed phrase?
# First, an preliminary entropy of ENT bits is generated.
entropy = "87c1b129fbadd7b6e9abc0a9ef7695436d767aece042bec198a97e949fcbe14c"
# => "87c1b129fbadd7b6e9abc0a9ef7695436d767aece042bec198a97e949fcbe14c"
# A checksum is generated by taking the primary ENT / 32 bits of its SHA256 hash.
sha2sum = OpenSSL::Digest.new("SHA256").replace(entropy.hexbytes).closing.hexstring
# => "0dc811788c7e02c32b9c4b3586baf58ca27f74330c92d661042b19faa6c7e9f2"
# the checksum size (CS): 2 (hex) := 8 (bits)
checksum_length_hex = 2
# => 2
checksum = sha2sum[0, checksum_length_hex]
# => "0d"
# This checksum is appended to the top of the preliminary entropy.
entropy_checksummed = entropy + checksum
# => "87c1b129fbadd7b6e9abc0a9ef7695436d767aece042bec198a97e949fcbe14c0d"
This works, as I stated and my code is ready to generate the right indices for the phrases required, and the ensuing phrase matches with the one supplied within the different thread.
My downside is, nevertheless, how will we handle the checksum_length_hex for entropies of 160, 192, and 224 bits? As I stated, my code works for 256 bit with checksum_length_hex of 2 and it additionally works for 128 bit with a size of 1.
However how do I cope with the instances in between? I can’t create a prefix of 1.2. I used to be pondering of taking the checksum prefix in pure bits (e.g., 5 bits for 160 entropy) and finally bought solely gibberish outcomes. The next desk is taken straight from BIP-39:
# | ENT | CS | ENT+CS | MS |
# +-------+----+--------+------+
# | 128 | 4 | 132 | 12 |
# | 160 | 5 | 165 | 15 |
# | 192 | 6 | 198 | 18 |
# | 224 | 7 | 231 | 21 |
# | 256 | 8 | 264 | 24 |
How do I correctly compute BIP-39 checksum bytes of sizes 5, 6, and seven for entropies of 160, 192, and 224?
