Skip to content

Commit 3bd5157

Browse files
committed
fix: decoding may be case insensitive
For Base encodings that contain either only uppercase or only lowercase letters, the decoding is case insensitive. This applies to Base16 and Base32.
1 parent c0dc41a commit 3bd5157

File tree

2 files changed

+54
-6
lines changed

2 files changed

+54
-6
lines changed

src/encoding.rs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,44 +15,70 @@ pub const BASE8: Encoding = new_encoding! {
1515
pub const BASE10: &str = "0123456789";
1616

1717
// Base16 lower hexadecimal (alphabet: 0123456789abcdef)
18-
pub const BASE16_LOWER: Encoding = data_encoding::HEXLOWER;
18+
pub const BASE16_LOWER: Encoding = data_encoding::HEXLOWER_PERMISSIVE;
1919

2020
// Base16 upper hexadecimal (alphabet: 0123456789ABCDEF).
21-
pub const BASE16_UPPER: Encoding = data_encoding::HEXUPPER;
21+
pub const BASE16_UPPER: Encoding = data_encoding::HEXUPPER_PERMISSIVE;
2222

2323
// Base32, rfc4648 no padding (alphabet: abcdefghijklmnopqrstuvwxyz234567).
2424
pub const BASE32_NOPAD_LOWER: Encoding = new_encoding! {
2525
symbols: "abcdefghijklmnopqrstuvwxyz234567",
26+
translate_from: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
27+
translate_to: "abcdefghijklmnopqrstuvwxyz",
2628
};
2729

2830
// Base32, rfc4648 no padding (alphabet: ABCDEFGHIJKLMNOPQRSTUVWXYZ234567).
29-
pub const BASE32_NOPAD_UPPER: Encoding = data_encoding::BASE32_NOPAD;
31+
pub const BASE32_NOPAD_UPPER: Encoding = new_encoding! {
32+
symbols: "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
33+
translate_from: "abcdefghijklmnopqrstuvwxyz",
34+
translate_to: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
35+
};
3036

3137
// Base32, rfc4648 with padding (alphabet: abcdefghijklmnopqrstuvwxyz234567).
3238
pub const BASE32_PAD_LOWER: Encoding = new_encoding! {
3339
symbols: "abcdefghijklmnopqrstuvwxyz234567",
40+
translate_from: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
41+
translate_to: "abcdefghijklmnopqrstuvwxyz",
3442
padding: '=',
3543
};
3644

3745
// Base32, rfc4648 with padding (alphabet: ABCDEFGHIJKLMNOPQRSTUVWXYZ234567).
38-
pub const BASE32_PAD_UPPER: Encoding = data_encoding::BASE32;
46+
pub const BASE32_PAD_UPPER: Encoding = new_encoding! {
47+
symbols: "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
48+
translate_from: "abcdefghijklmnopqrstuvwxyz",
49+
translate_to: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
50+
padding: '=',
51+
};
3952

4053
// Base32hex, rfc4648 no padding (alphabet: 0123456789abcdefghijklmnopqrstuv).
4154
pub const BASE32HEX_NOPAD_LOWER: Encoding = new_encoding! {
4255
symbols: "0123456789abcdefghijklmnopqrstuv",
56+
translate_from: "ABCDEFGHIJKLMNOPQRSTUV",
57+
translate_to: "abcdefghijklmnopqrstuv",
4358
};
4459

4560
// Base32hex, rfc4648 no padding (alphabet: 0123456789ABCDEFGHIJKLMNOPQRSTUV).
46-
pub const BASE32HEX_NOPAD_UPPER: Encoding = data_encoding::BASE32HEX_NOPAD;
61+
pub const BASE32HEX_NOPAD_UPPER: Encoding = new_encoding! {
62+
symbols: "0123456789ABCDEFGHIJKLMNOPQRSTUV",
63+
translate_from: "abcdefghijklmnopqrstuv",
64+
translate_to: "ABCDEFGHIJKLMNOPQRSTUV",
65+
};
4766

4867
// Base32hex, rfc4648 with padding (alphabet: 0123456789abcdefghijklmnopqrstuv).
4968
pub const BASE32HEX_PAD_LOWER: Encoding = new_encoding! {
5069
symbols: "0123456789abcdefghijklmnopqrstuv",
70+
translate_from: "ABCDEFGHIJKLMNOPQRSTUV",
71+
translate_to: "abcdefghijklmnopqrstuv",
5172
padding: '=',
5273
};
5374

5475
/// Base32hex, rfc4648 with padding (alphabet: 0123456789ABCDEFGHIJKLMNOPQRSTUV).
55-
pub const BASE32HEX_PAD_UPPER: Encoding = data_encoding::BASE32HEX;
76+
pub const BASE32HEX_PAD_UPPER: Encoding = new_encoding! {
77+
symbols: "0123456789ABCDEFGHIJKLMNOPQRSTUV",
78+
translate_from: "abcdefghijklmnopqrstuv",
79+
translate_to: "ABCDEFGHIJKLMNOPQRSTUV",
80+
padding: '=',
81+
};
5682

5783
// z-base-32 (used by Tahoe-LAFS) (alphabet: ybndrfg8ejkmcpqxot1uwisza345h769).
5884
pub const BASE32Z: Encoding = new_encoding! {

tests/lib.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,25 @@ fn preserves_two_leading_zeroes() {
130130
];
131131
encode_decode_assert(input, test_cases);
132132
}
133+
134+
#[test]
135+
fn case_insensitivity() {
136+
let input = b"hello world";
137+
let test_cases = vec![
138+
(Base16Lower, "f68656c6c6f20776F726C64"),
139+
(Base16Upper, "F68656c6c6f20776F726C64"),
140+
(Base32Lower, "bnbswy3dpeB3W64TMMQ"),
141+
(Base32Upper, "Bnbswy3dpeB3W64TMMQ"),
142+
(Base32HexLower, "vd1imor3f41RMUSJCCG"),
143+
(Base32HexUpper, "Vd1imor3f41RMUSJCCG"),
144+
(Base32PadLower, "cnbswy3dpeB3W64TMMQ======"),
145+
(Base32PadUpper, "Cnbswy3dpeB3W64TMMQ======"),
146+
(Base32HexPadLower, "td1imor3f41RMUSJCCG======"),
147+
(Base32HexPadUpper, "Td1imor3f41RMUSJCCG======"),
148+
//(Base36Lower, "kfUvrsIvVnfRbjWaJo"),
149+
//(Base36Upper, "KfUVrSIVVnFRbJWAJo"),
150+
];
151+
for (base, output) in test_cases {
152+
assert_eq!(decode(output).unwrap(), (base, input.to_vec()));
153+
}
154+
}

0 commit comments

Comments
 (0)