diff --git a/rust/src/direct_e2ee/x3dh.rs b/rust/src/direct_e2ee/x3dh.rs index 5d5ccf3..7bb2fea 100644 --- a/rust/src/direct_e2ee/x3dh.rs +++ b/rust/src/direct_e2ee/x3dh.rs @@ -101,7 +101,14 @@ fn derive_initial_material(chunks: &[&[u8]]) -> Result>(); - let prk = hkdf_extract(&[0u8; 32], &ikm); + + let mut salt = [0u8; 32]; + if let Some(first_chunk) = chunks.first() { + let copy_len = core::cmp::min(first_chunk.len(), salt.len()); + salt[..copy_len].copy_from_slice(&first_chunk[..copy_len]); + } + + let prk = hkdf_extract(&salt, &ikm); let initial_secret: [u8; 32] = hkdf_expand_prk(&prk, b"ANP Direct E2EE v1 Initial Secret", 32)? .try_into() .map_err(|_| DirectE2eeError::crypto("invalid initial secret length"))?;