bip39-rs icon indicating copy to clipboard operation
bip39-rs copied to clipboard

Investigate use of NFKD

Open steveatinfincia opened this issue 8 years ago • 6 comments

BIP-0039 suggests it needs to be applied in two situations:

When generating the wordlists

The standard says this:

The wordlist can contain native characters, but they must be encoded in UTF-8 using Normalization Form Compatibility Decomposition (NFKD).

This should be taken care of because the wordlist in bip39-rs is from the BIP-0039 repo and has already been processed correctly.

When turning a mnemonic phrase into a seed

The standard says this:

To create a binary seed from the mnemonic, we use the PBKDF2 function with a mnemonic sentence (in UTF-8 NFKD) used as the password and the string "mnemonic" + passphrase (again in UTF-8 NFKD) used as the salt. The iteration count is set to 2048 and HMAC-SHA512 is used as the pseudo-random function. The length of the derived key is 512 bits (= 64 bytes).

We currently make no attempt to follow this and should.

steveatinfincia avatar Dec 23 '16 06:12 steveatinfincia

I believe the unicode-normalization crate provides this as UnicodeNormalization:nkfd.

burdges avatar Dec 19 '18 08:12 burdges

I've been working on adding in NFKD normalization, need reliable test vectors in non-English languages. (I already have a Japanese set)

QuestofIranon avatar Feb 12 '19 02:02 QuestofIranon

I found some in the NBitcoin project. NBitcoin/NBitcoin. https://github.com/MetacoSA/NBitcoin/tree/master/NBitcoin.Tests/data

Nice find @wigy-opensource-developer!

QuestofIranon avatar Feb 12 '19 09:02 QuestofIranon

The tests there were generated with https://github.com/nym-zone/easyseed

QuestofIranon avatar Feb 12 '19 10:02 QuestofIranon

Maybe this could be an interesting codefix: Not normalized input for Japanese phrases to test normalization: https://github.com/bip32JP/bip32JP.github.io/commit/360c05a6439e5c461bbe5e84c7567ec38eb4ac5f (I do not speak Japanese, so I would need to rely on these to make test vectors myself :blush: )