PR #1907: Support messages longer than 65,535 bytes

This commit is contained in:
Mike Dilger
2025-09-15 07:18:50 +12:00
parent a55cd38506
commit cb348b6c65
4 changed files with 26 additions and 9 deletions
+1 -1
View File
@@ -26,7 +26,7 @@ pub enum Error {
#[error("Message is empty")]
MessageIsEmpty,
/// Message is too long (max len 65536 - 128)
/// Message is too long (max len 4_294_967_296 - 128)
#[error("Message is too long")]
MessageIsTooLong,
+17 -6
View File
@@ -88,12 +88,17 @@ fn pad(unpadded: &str) -> Result<Vec<u8>, Error> {
if len < 1 {
return Err(Error::MessageIsEmpty);
}
if len > 65536 - 128 {
if len > 4_294_967_296 - 128 {
return Err(Error::MessageIsTooLong);
}
let mut padded: Vec<u8> = Vec::new();
padded.extend_from_slice(&(len as u16).to_be_bytes());
if len < 65536 {
padded.extend_from_slice(&(len as u16).to_be_bytes());
} else {
padded.extend_from_slice(&(0 as u16).to_be_bytes());
padded.extend_from_slice(&(len as u32).to_be_bytes());
}
padded.extend_from_slice(unpadded.as_bytes());
padded.extend(std::iter::repeat(0).take(calc_padding(len) - len));
Ok(padded)
@@ -162,18 +167,24 @@ pub fn decrypt(conversation_key: &[u8; 32], base64_ciphertext: &str) -> Result<S
}
let mut cipher = ChaCha20::new(&keys.encryption().into(), &keys.nonce().into());
cipher.apply_keystream(&mut buffer);
let unpadded_len = u16::from_be_bytes(buffer[0..2].try_into().unwrap()) as usize;
if buffer.len() < 2 + unpadded_len {
let mut lensize = 2;
let mut unpadded_len = u16::from_be_bytes(buffer[0..2].try_into().unwrap()) as usize;
if unpadded_len == 0 {
lensize = 6;
unpadded_len = u32::from_be_bytes(buffer[2..6].try_into().unwrap()) as usize;
}
if buffer.len() < lensize + unpadded_len {
return Err(Error::InvalidPadding);
}
let unpadded = &buffer[2..2 + unpadded_len];
let unpadded = &buffer[lensize..lensize + unpadded_len];
if unpadded.is_empty() {
return Err(Error::MessageIsEmpty);
}
if unpadded.len() != unpadded_len {
return Err(Error::InvalidPadding);
}
if buffer.len() != 2 + calc_padding(unpadded_len) {
if buffer.len() != lensize + calc_padding(unpadded_len) {
return Err(Error::InvalidPadding);
}
Ok(String::from_utf8(unpadded.to_vec())?)
+7 -1
View File
@@ -2,6 +2,12 @@
"v2": {
"valid": {
"get_conversation_key": [
{
"sec1": "315e59ff51cb9209768cf7da80791ddcaae56ac9775eb25b6dee1234bc5d2268",
"pub2": "c2f9d9948dc8c7c38321e4b85c8558872eafa0641cd269db76848a6073e69133",
"conversation_key": "3dfef0ce2a4d80a25e7a328accf73448ef67096f65f79588e358d9a0eb9013f1",
"note": "issue17"
},
{
"sec1": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364139",
"pub2": "0000000000000000000000000000000000000000000000000000000000000002",
@@ -247,4 +253,4 @@
]
}
}
}
}
+1 -1
View File
@@ -221,7 +221,7 @@ fn test_invalid_decrypt() {
Error::InvalidMac,
Error::InvalidMac,
Error::InvalidPadding,
Error::MessageIsEmpty,
Error::InvalidPadding,
Error::InvalidPadding,
Error::InvalidPadding,
];