diff --git a/src/key_exchange/tripledh.rs b/src/key_exchange/tripledh.rs index 5194596..f1df66f 100644 --- a/src/key_exchange/tripledh.rs +++ b/src/key_exchange/tripledh.rs @@ -468,7 +468,7 @@ fn hkdf_expand_label_extracted( let mut okm = vec![0u8; length]; let mut hkdf_label: Vec = Vec::new(); - hkdf_label.extend_from_slice(&length.to_be_bytes()[6..]); + hkdf_label.extend_from_slice(&length.to_be_bytes()[std::mem::size_of::() - 2..]); let mut opaque_label: Vec = Vec::new(); opaque_label.extend_from_slice(&STR_OPAQUE); diff --git a/src/serialization/mod.rs b/src/serialization/mod.rs index 261e589..58b71f8 100644 --- a/src/serialization/mod.rs +++ b/src/serialization/mod.rs @@ -82,7 +82,8 @@ impl From<&LoginThirdMessage> for ProtocolMessageType { pub(crate) fn serialize(input: &[u8], max_bytes: usize) -> Vec { let mut output: Vec = Vec::new(); - output.extend_from_slice(&input.len().to_be_bytes()[8 - max_bytes..]); + output + .extend_from_slice(&input.len().to_be_bytes()[std::mem::size_of::() - max_bytes..]); output.extend_from_slice(&input[..]); output } @@ -96,7 +97,15 @@ pub(crate) fn tokenize(input: Vec, size_bytes: usize) -> Result<(Vec, Ve for i in 0..size_bytes { size_array[8 - size_bytes + i] = input[i]; } - let size = usize::from_be_bytes(size_array); + + let big_size = u64::from_be_bytes(size_array); + + // TODO:: check RFC compliance in refusing this + if big_size >= u32::MAX as u64 { + return Err(PakeError::SerializationError); + } + + let size = big_size as usize; if size_bytes + size > input.len() { return Err(PakeError::SerializationError); diff --git a/src/serialization/tests.rs b/src/serialization/tests.rs index 8e82593..0023912 100644 --- a/src/serialization/tests.rs +++ b/src/serialization/tests.rs @@ -118,8 +118,8 @@ fn register_first_message_roundtrip() { let mut input = Vec::new(); input.extend_from_slice(&[ProtocolMessageType::RegistrationRequest as u8 + 1]); - input.extend_from_slice(&total_length.to_be_bytes()[8 - 3..]); - input.extend_from_slice(&alpha_length.to_be_bytes()[8 - 2..]); + input.extend_from_slice(&total_length.to_be_bytes()[std::mem::size_of::() - 3..]); + input.extend_from_slice(&alpha_length.to_be_bytes()[std::mem::size_of::() - 2..]); input.extend_from_slice(pt_bytes.as_slice()); let r1 = RegisterFirstMessage::::deserialize(input.as_slice()).unwrap(); @@ -142,10 +142,10 @@ fn register_second_message_roundtrip() { let mut input = Vec::new(); input.extend_from_slice(&[ProtocolMessageType::RegistrationResponse as u8 + 1]); - input.extend_from_slice(&total_length.to_be_bytes()[8 - 3..]); - input.extend_from_slice(&beta_length.to_be_bytes()[8 - 2..]); + input.extend_from_slice(&total_length.to_be_bytes()[std::mem::size_of::() - 3..]); + input.extend_from_slice(&beta_length.to_be_bytes()[std::mem::size_of::() - 2..]); input.extend_from_slice(beta_bytes.as_slice()); - input.extend_from_slice(&pubkey_length.to_be_bytes()[8 - 2..]); + input.extend_from_slice(&pubkey_length.to_be_bytes()[std::mem::size_of::() - 2..]); input.extend_from_slice(&pubkey_bytes.as_slice()); input.extend_from_slice(&credential_types); @@ -175,9 +175,9 @@ fn register_third_message_roundtrip() { let mut input = Vec::new(); input.extend_from_slice(&[ProtocolMessageType::RegistrationUpload as u8 + 1]); - input.extend_from_slice(&total_length.to_be_bytes()[8 - 3..]); + input.extend_from_slice(&total_length.to_be_bytes()[std::mem::size_of::() - 3..]); input.extend_from_slice(&envelope_bytes); - input.extend_from_slice(&pubkey_length.to_be_bytes()[8 - 2..]); + input.extend_from_slice(&pubkey_length.to_be_bytes()[std::mem::size_of::() - 2..]); input.extend_from_slice(&pubkey_bytes[..]); let r3 = RegisterThirdMessage::::deserialize(&input[..]).unwrap(); @@ -202,8 +202,10 @@ fn login_first_message_roundtrip() { let mut input = Vec::new(); input.extend_from_slice(&[ProtocolMessageType::CredentialRequest as u8 + 1]); - input.extend_from_slice(&total_length_without_ke1m.to_be_bytes()[8 - 3..]); - input.extend_from_slice(&alpha_length.to_be_bytes()[8 - 2..]); + input.extend_from_slice( + &total_length_without_ke1m.to_be_bytes()[std::mem::size_of::() - 3..], + ); + input.extend_from_slice(&alpha_length.to_be_bytes()[std::mem::size_of::() - 2..]); input.extend_from_slice(&alpha_bytes); input.extend_from_slice(&ke1m[..]); @@ -242,8 +244,10 @@ fn login_second_message_roundtrip() { let mut input = Vec::new(); input.extend_from_slice(&[ProtocolMessageType::CredentialResponse as u8 + 1]); - input.extend_from_slice(&total_length_without_ke2m.to_be_bytes()[8 - 3..]); - input.extend_from_slice(&pt_bytes.len().to_be_bytes()[8 - 2..]); + input.extend_from_slice( + &total_length_without_ke2m.to_be_bytes()[std::mem::size_of::() - 3..], + ); + input.extend_from_slice(&pt_bytes.len().to_be_bytes()[std::mem::size_of::() - 2..]); input.extend_from_slice(pt_bytes.as_slice()); input.extend_from_slice(&envelope.to_bytes()); input.extend_from_slice(&ke2m[..]);