From cb348b6c659e0316bc319cd3c1ca73ac322eba07 Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Mon, 15 Sep 2025 07:18:50 +1200 Subject: [PATCH] PR #1907: Support messages longer than 65,535 bytes --- src/error.rs | 2 +- src/lib.rs | 23 +++++++++++++++++------ src/nip44.vectors.json | 8 +++++++- src/tests.rs | 2 +- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/error.rs b/src/error.rs index af5dc63..aba1759 100644 --- a/src/error.rs +++ b/src/error.rs @@ -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, diff --git a/src/lib.rs b/src/lib.rs index d991471..dd41df5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -88,12 +88,17 @@ fn pad(unpadded: &str) -> Result, 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 = 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