mirror of
https://github.com/mikedilger/nip44.git
synced 2026-07-04 05:57:29 +00:00
PR #1907: Support messages longer than 65,535 bytes
This commit is contained in:
+1
-1
@@ -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
@@ -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())?)
|
||||
|
||||
@@ -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
@@ -221,7 +221,7 @@ fn test_invalid_decrypt() {
|
||||
Error::InvalidMac,
|
||||
Error::InvalidMac,
|
||||
Error::InvalidPadding,
|
||||
Error::MessageIsEmpty,
|
||||
Error::InvalidPadding,
|
||||
Error::InvalidPadding,
|
||||
Error::InvalidPadding,
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user