Skip to content

Commit ece7177

Browse files
committed
base32ct: Avoid panics when decoding inputs; enforce lengths.
Formerly, Encoding::decode would write beyond the end of `dst` when the input (ignoring padding) had (length%8) == 1, 3, or 6. These lengths are not valid base32, so we now reject them.
1 parent a551024 commit ece7177

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

base32ct/src/encoding.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,19 +101,23 @@ impl<T: Alphabet> Encoding for T {
101101
c[6] = Self::decode_5bits(src_rem[6]);
102102
};
103103

104-
if !src_rem.is_empty() {
104+
err |= (src_rem.len() == 1) as u8;
105+
err |= (src_rem.len() == 3) as u8;
106+
err |= (src_rem.len() == 6) as u8;
107+
108+
if src_rem.len() >= 2 {
105109
dst_rem[0] = (((c[0] << 3) | (c[1] >> 2)) & 0xff) as u8;
106110
}
107111

108-
if src_rem.len() >= 3 {
112+
if src_rem.len() >= 4 {
109113
dst_rem[1] = (((c[1] << 6) | (c[2] << 1) | (c[3] >> 4)) & 0xff) as u8;
110114
}
111115

112116
if src_rem.len() >= 5 {
113117
dst_rem[2] = (((c[3] << 4) | (c[4] >> 1)) & 0xff) as u8;
114118
}
115119

116-
if src_rem.len() >= 6 {
120+
if src_rem.len() >= 7 {
117121
dst_rem[3] = (((c[4] << 7) | (c[5] << 2) | (c[6] >> 3)) & 0xff) as u8;
118122
}
119123

base32ct/tests/vectors.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,3 +185,16 @@ fn encode_base32() {
185185
);
186186
}
187187
}
188+
189+
#[test]
190+
fn decode_unpadded_truncated() {
191+
let string = "foobarba";
192+
for length in 1..=7 {
193+
let s = &string[..length];
194+
let s_padded: String = s.chars().chain(std::iter::repeat('=')).take(8).collect();
195+
assert!(s_padded.starts_with(s));
196+
assert_eq!(s_padded.len(), 8);
197+
assert_eq!(Base32::decode_vec(s), Err(base32ct::Error::InvalidEncoding));
198+
assert_eq!(Base32Unpadded::decode_vec(s), Base32::decode_vec(&s_padded));
199+
}
200+
}

0 commit comments

Comments
 (0)