diff options
Diffstat (limited to 'nix-rust/src/util/base32.rs')
-rw-r--r-- | nix-rust/src/util/base32.rs | 160 |
1 files changed, 0 insertions, 160 deletions
diff --git a/nix-rust/src/util/base32.rs b/nix-rust/src/util/base32.rs deleted file mode 100644 index 7e71dc920..000000000 --- a/nix-rust/src/util/base32.rs +++ /dev/null @@ -1,160 +0,0 @@ -use crate::error::Error; -use lazy_static::lazy_static; - -pub fn encoded_len(input_len: usize) -> usize { - if input_len == 0 { - 0 - } else { - (input_len * 8 - 1) / 5 + 1 - } -} - -pub fn decoded_len(input_len: usize) -> usize { - input_len * 5 / 8 -} - -static BASE32_CHARS: &[u8; 32] = &b"0123456789abcdfghijklmnpqrsvwxyz"; - -lazy_static! { - static ref BASE32_CHARS_REVERSE: Box<[u8; 256]> = { - let mut xs = [0xffu8; 256]; - for (n, c) in BASE32_CHARS.iter().enumerate() { - xs[*c as usize] = n as u8; - } - Box::new(xs) - }; -} - -pub fn encode(input: &[u8]) -> String { - let mut buf = vec![0; encoded_len(input.len())]; - encode_into(input, &mut buf); - std::str::from_utf8(&buf).unwrap().to_string() -} - -pub fn encode_into(input: &[u8], output: &mut [u8]) { - let len = encoded_len(input.len()); - assert_eq!(len, output.len()); - - let mut nr_bits_left: usize = 0; - let mut bits_left: u16 = 0; - let mut pos = len; - - for b in input { - bits_left |= (*b as u16) << nr_bits_left; - nr_bits_left += 8; - while nr_bits_left > 5 { - output[pos - 1] = BASE32_CHARS[(bits_left & 0x1f) as usize]; - pos -= 1; - bits_left >>= 5; - nr_bits_left -= 5; - } - } - - if nr_bits_left > 0 { - output[pos - 1] = BASE32_CHARS[(bits_left & 0x1f) as usize]; - pos -= 1; - } - - assert_eq!(pos, 0); -} - -pub fn decode(input: &str) -> Result<Vec<u8>, crate::Error> { - let mut res = Vec::with_capacity(decoded_len(input.len())); - - let mut nr_bits_left: usize = 0; - let mut bits_left: u16 = 0; - - for c in input.chars().rev() { - let b = BASE32_CHARS_REVERSE[c as usize]; - if b == 0xff { - return Err(Error::BadBase32); - } - bits_left |= (b as u16) << nr_bits_left; - nr_bits_left += 5; - if nr_bits_left >= 8 { - res.push((bits_left & 0xff) as u8); - bits_left >>= 8; - nr_bits_left -= 8; - } - } - - if nr_bits_left > 0 && bits_left != 0 { - return Err(Error::BadBase32); - } - - Ok(res) -} - -#[cfg(test)] -mod tests { - use super::*; - use assert_matches::assert_matches; - use hex; - use proptest::proptest; - - #[test] - fn test_encode() { - assert_eq!(encode(&[]), ""); - - assert_eq!( - encode(&hex::decode("0839703786356bca59b0f4a32987eb2e6de43ae8").unwrap()), - "x0xf8v9fxf3jk8zln1cwlsrmhqvp0f88" - ); - - assert_eq!( - encode( - &hex::decode("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad") - .unwrap() - ), - "1b8m03r63zqhnjf7l5wnldhh7c134ap5vpj0850ymkq1iyzicy5s" - ); - - assert_eq!( - encode( - &hex::decode("ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f") - .unwrap() - ), - "2gs8k559z4rlahfx0y688s49m2vvszylcikrfinm30ly9rak69236nkam5ydvly1ai7xac99vxfc4ii84hawjbk876blyk1jfhkbbyx" - ); - } - - #[test] - fn test_decode() { - assert_eq!(hex::encode(decode("").unwrap()), ""); - - assert_eq!( - hex::encode(decode("x0xf8v9fxf3jk8zln1cwlsrmhqvp0f88").unwrap()), - "0839703786356bca59b0f4a32987eb2e6de43ae8" - ); - - assert_eq!( - hex::encode(decode("1b8m03r63zqhnjf7l5wnldhh7c134ap5vpj0850ymkq1iyzicy5s").unwrap()), - "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" - ); - - assert_eq!( - hex::encode(decode("2gs8k559z4rlahfx0y688s49m2vvszylcikrfinm30ly9rak69236nkam5ydvly1ai7xac99vxfc4ii84hawjbk876blyk1jfhkbbyx").unwrap()), - "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f" - ); - - assert_matches!( - decode("xoxf8v9fxf3jk8zln1cwlsrmhqvp0f88"), - Err(Error::BadBase32) - ); - assert_matches!( - decode("2b8m03r63zqhnjf7l5wnldhh7c134ap5vpj0850ymkq1iyzicy5s"), - Err(Error::BadBase32) - ); - assert_matches!(decode("2"), Err(Error::BadBase32)); - assert_matches!(decode("2gs"), Err(Error::BadBase32)); - assert_matches!(decode("2gs8"), Err(Error::BadBase32)); - } - - proptest! { - - #[test] - fn roundtrip(s: Vec<u8>) { - assert_eq!(s, decode(&encode(&s)).unwrap()); - } - } -} |