When bech32Encode is called with a human-readable part that contains one or more upper-case characters, it produces in an invalid Bech32 string that cannot be decoded with the bech32Decode function.
Analysis
As part of the encoding process, the human-readable part is converted to lower case:
Overview
When
bech32Encode
is called with a human-readable part that contains one or more upper-case characters, it produces in an invalid Bech32 string that cannot be decoded with thebech32Decode
function.Analysis
As part of the encoding process, the human-readable part is converted to lower case:
https://github.com/sipa/bech32/blob/a4e672df3b79be54a9b14a33ae5fdb7d10a1dd26/ref/haskell/src/Codec/Binary/Bech32.hs#L85
However, the checksum is calculated before the conversion to lower case takes place:
https://github.com/sipa/bech32/blob/a4e672df3b79be54a9b14a33ae5fdb7d10a1dd26/ref/haskell/src/Codec/Binary/Bech32.hs#L83
This contradicts the Bech32 specification, which states:
Therefore, if the original human-readable part contains one or more upper case characters:
Example
Consider the following two calls to
bech32Encode
, differing only in the case of the human-readable part:Expected Behaviour
Both calls to
bech32Encode
should result in the same output string:Actual Behaviour
The above calls to
bech32Encode
actually result in different output strings:Attempting to decode the string produced by
bech32Encode "TEST" []
results inNothing
: