use CryptoError;
pub fn bin2hex(b: &[u8]) -> String {
b.iter()
.map(|b| format!("{:02x}", b))
.collect::<Vec<_>>()
.join("")
}
pub fn hex2bin(s: &str) -> Result<Vec<u8>, CryptoError> {
if s.len() % 2 != 0 {
return Err(CryptoError::ParseError("Invalid string".to_string()));
}
for (i, ch) in s.chars().enumerate() {
if !ch.is_digit(16) {
return Err(CryptoError::ParseError(format!(
"Invalid character position {}",
i
)));
}
}
let input: Vec<_> = s.chars().collect();
let decoded: Vec<u8> = input
.chunks(2)
.map(|chunk| {
((chunk[0].to_digit(16).unwrap() << 4) | (chunk[1].to_digit(16).unwrap())) as u8
})
.collect();
Ok(decoded)
}