From 9ec954cd3ff2875970ad07e82b58ee53283866c2 Mon Sep 17 00:00:00 2001 From: beneth Date: Sun, 12 Apr 2020 23:57:45 +0200 Subject: [PATCH] Handle b64 padding if needed --- set1/chal1/src/main.rs | 68 ++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/set1/chal1/src/main.rs b/set1/chal1/src/main.rs index 686174b..04fb6a3 100644 --- a/set1/chal1/src/main.rs +++ b/set1/chal1/src/main.rs @@ -24,26 +24,23 @@ fn hex_to_char(s: &str) -> Result { } fn main() { + let mut input_str = String::new(); let args: Vec = env::args().collect(); let input = &args[1]; - let mut input_str = String::new(); - let char_vec: Vec = input.chars().collect(); let hex_char = &char_vec .chunks(2) .map(|chunk| chunk.iter().collect::()) .collect::>(); - // Printing the string in Ascii format - for decoding example - print!("Input string in ASCII is : « "); + // Printing the string in Ascii format - for hexa to Ascii example for (i, s) in hex_char.into_iter().enumerate() { match hex_to_char(s) { Ok(s) => input_str.push(s), Err(e) => println!("\nError decoding char '{}' at index {}", e, i), } } - println!(" »"); // Convert hex_char : Vec into Vec // Warning: Panic if not base16 @@ -54,39 +51,52 @@ fn main() { .map(|i| u8::from_str_radix(i, 16).unwrap()) .collect(); - println!(" Len is : {}, is it modulo 3-bytes ? {}", - &hex.len(), - if &hex.len()%3 == 0 { "true" } else { "false"} - ); - - print!("b64_encode({:?}) ==> ", &input_str); - - // Ugly right ? + // TODO ! + // TODO: Make not ugly and move to function b64_encode(Vec) -> str + // TODO ! + let mut output = String::new(); for j in (0..hex.len()).step_by(3) { + let mut pad = 0; let mut arr = [0u8;4]; - - // Must handle Padding here ! - // Index will be out of bound - // Find a way in rust to detect that ? or just compute here. - // Si padding 1 = '=' + arr[3] = 0 - // Si padding 2 = '==' + arr[3] & arr[4] = 0 arr[0] = 0; + for i in 0..3 { - arr[i+1] = hex[i+j]; + if i+j == hex.len() { + arr[i+1] = 0; + pad = 1; + } else if i+j > hex.len() { + arr[i+1] = 0; + pad = 2; + } else { + arr[i+1] = hex[i+j]; + } } let tmp = u32::from_be_bytes(arr); + let tmp1:usize = ((tmp>>18) & 0x3F).try_into().unwrap(); let tmp2:usize = ((tmp>>12) & 0x3F).try_into().unwrap(); - // If this fail we need to PAD '==' - let tmp3:usize = ((tmp>>6) & 0x3F).try_into().unwrap(); - // If this fail we need to PAD '=' - let tmp4:usize = ((tmp) & 0x3F).try_into().unwrap(); + output.push(BASE64_TABLE[tmp1]); + output.push(BASE64_TABLE[tmp2]); - print!("{}", BASE64_TABLE[tmp1]); - print!("{}", BASE64_TABLE[tmp2]); - print!("{}", BASE64_TABLE[tmp3]); - print!("{}", BASE64_TABLE[tmp4]); + if pad == 2 { + output.push_str("=="); + break + } else { + let tmp3:usize = ((tmp>>6) & 0x3F).try_into().unwrap(); + output.push(BASE64_TABLE[tmp3]); + } + + if pad == 1 { + output.push_str("="); + break + } else { + let tmp4:usize = ((tmp) & 0x3F).try_into().unwrap(); + output.push(BASE64_TABLE[tmp4]); + } } - println!(); + + println!("Input string is '{}'", input); + println!("Hex String to ASCII '{}'", &input_str); + println!("Base64 encode '{}'", output); }