diff --git a/src/commands/run.rs b/src/commands/run.rs index 9db06fc569..0ce7a25f79 100644 --- a/src/commands/run.rs +++ b/src/commands/run.rs @@ -3,6 +3,7 @@ use crate::clients::directory::presence::{MixNodePresence, Topology}; use crate::clients::directory::requests::presence_topology_get::PresenceTopologyGetRequester; use crate::clients::directory::DirectoryClient; use crate::clients::mix::MixClient; +use crate::utils::bytes; use base64; use clap::ArgMatches; use curve25519_dalek::montgomery::MontgomeryPoint; @@ -71,9 +72,9 @@ fn route_from(topology: &Topology, route_len: usize) -> Vec { let mut route = vec![]; let nodes = topology.mix_nodes.iter(); for mix in nodes.take(route_len) { - let address_bytes = zero_pad_to_32_bytes(mix.host.as_bytes().to_vec()); + let address_bytes = bytes::zero_pad_to_32(mix.host.as_bytes().to_vec()); let decoded_key_bytes = base64::decode_config(&mix.pub_key, base64::URL_SAFE).unwrap(); - let key_bytes = zero_pad_to_32_bytes(decoded_key_bytes); + let key_bytes = bytes::zero_pad_to_32(decoded_key_bytes); let key = MontgomeryPoint(key_bytes); let sphinx_node = SphinxNode { address: address_bytes, @@ -84,17 +85,6 @@ fn route_from(topology: &Topology, route_len: usize) -> Vec { route } -fn zero_pad_to_32_bytes(mut bytes: Vec) -> [u8; 32] { - assert!(bytes.len() <= 32); - if bytes.len() != 32 { - bytes.resize(32, 0); - } - let mut padded_bytes = [0; 32]; - padded_bytes.copy_from_slice(&bytes[..]); - assert!(padded_bytes.len() == 32); - padded_bytes -} - // TODO: where do we retrieve this guy from? fn get_destination() -> Destination { Destination { diff --git a/src/main.rs b/src/main.rs index 77d309f519..04b0432aa7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use std::process; mod clients; mod commands; +mod utils; fn main() { let arg_matches = App::new("Nym Client") diff --git a/src/utils/bytes.rs b/src/utils/bytes.rs new file mode 100644 index 0000000000..92ec2fea37 --- /dev/null +++ b/src/utils/bytes.rs @@ -0,0 +1,64 @@ +pub fn zero_pad_to_32(mut bytes: Vec) -> [u8; 32] { + assert!(bytes.len() <= 32); + if bytes.len() != 32 { + bytes.resize(32, 0); + } + let mut padded_bytes = [0; 32]; + padded_bytes.copy_from_slice(&bytes[..]); + assert!(padded_bytes.len() == 32); + padded_bytes +} + +#[cfg(test)] +mod zero_padding_to_32_bytes { + use super::*; + + #[cfg(test)] + mod with_empty_input { + use super::*; + + #[test] + fn it_returns_32_zeros() { + let input = vec![]; + let result = zero_pad_to_32(input); + assert_eq!([0u8; 32], result); + } + } + + #[cfg(test)] + mod with_all_bytes_set_to_1 { + use super::*; + #[test] + fn it_returns_32_ones() { + let input = vec![1u8; 32]; + let result = zero_pad_to_32(input); + assert_eq!([1u8; 32], result); + } + } + + #[cfg(test)] + mod with_3_bytes_set { + use super::*; + #[test] + fn it_returns_input_zero_padded_to_32_bytes() { + let input = vec![1u8; 3]; + let result = zero_pad_to_32(input); + let expected_content = vec![ + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + ]; + assert_eq!(expected_content, result.to_vec()); + } + } + + #[cfg(test)] + mod with_oversized_input { + use super::*; + #[test] + #[should_panic] + fn it_panics() { + let input = vec![1u8; 33]; + zero_pad_to_32(input); + } + } +} diff --git a/src/utils/mod.rs b/src/utils/mod.rs new file mode 100644 index 0000000000..ad0049c4c2 --- /dev/null +++ b/src/utils/mod.rs @@ -0,0 +1 @@ +pub mod bytes;