diff --git a/multibase/converters.py b/multibase/converters.py index 4202658..ca30c4b 100644 --- a/multibase/converters.py +++ b/multibase/converters.py @@ -155,7 +155,12 @@ def encode(self, bytes): return self._encode_bytes(ensure_bytes(bytes), 5, 8, 5, 8) def decode(self, bytes): - return self._decode_bytes(ensure_bytes(bytes), 8, 5, 8) + data = ensure_bytes(bytes) + if self.digits.islower(): + data = data.lower() + elif self.digits.isupper(): + data = data.upper() + return self._decode_bytes(data, 8, 5, 8) class Base256EmojiConverter: diff --git a/tests/test_multibase.py b/tests/test_multibase.py index 77bad99..9ea9022 100644 --- a/tests/test_multibase.py +++ b/tests/test_multibase.py @@ -128,6 +128,20 @@ def test_decode(_, data, encoded_data): assert decode(encoded_data) == ensure_bytes(data) +def test_decode_base32_case_insensitive(): + # base32 (prefix 'b', lowercase alphabet), decoding uppercase payload + assert decode("bMZXW6") == b"foo" + + # base32upper (prefix 'B', uppercase alphabet), decoding lowercase payload + assert decode("Bmzxw6") == b"foo" + + # base32pad (prefix 'c', lowercase alphabet), decoding uppercase payload + assert decode("cMZXW6====") == b"foo" + + # base32hex (prefix 'v', lowercase alphabet), decoding uppercase payload + assert decode("vCPNMU") == b"foo" + + @pytest.mark.parametrize("encoded_data", INCORRECT_ENCODED_DATA) def test_decode_incorrect_encoding(encoded_data): with pytest.raises(InvalidMultibaseStringError) as excinfo: