From 44b3c4faa0c1fa0da11ae8bfb6e875e7a7dc89f5 Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Sat, 16 Dec 2023 14:35:40 +1300 Subject: [PATCH] Change how conversation keys are generated (HKDF related) --- src/lib.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 1947d0c..47018ea 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -39,7 +39,7 @@ impl MessageKeys { } /// A conversation key is the long-term secret that two nostr identities share. -pub fn get_conversation_key( +fn get_shared_point( private_key_a: SecretKey, x_only_public_key_b: XOnlyPublicKey, ) -> [u8; 32] { @@ -51,10 +51,22 @@ pub fn get_conversation_key( ssp.try_into().unwrap() } -fn get_message_keys(conversation_key: &[u8; 32], salt: &[u8; 32]) -> Result { - let hk = Hkdf::::new(Some(&salt[..]), conversation_key); +pub fn get_conversation_key( + private_key_a: SecretKey, + x_only_public_key_b: XOnlyPublicKey, +) -> [u8; 32] { + let shared_point = get_shared_point(private_key_a, x_only_public_key_b); + let (convo_key, _hkdf) = Hkdf::::extract(Some("nip44-v2".as_bytes()), shared_point.as_slice()); + convo_key.into() +} + +fn get_message_keys(conversation_key: &[u8; 32], nonce: &[u8; 32]) -> Result { + let hk: Hkdf:: = match Hkdf::from_prk(conversation_key) { + Ok(hk) => hk, + Err(_) => return Err(Error::HkdfLength(conversation_key.len())), + }; let mut message_keys: MessageKeys = MessageKeys::zero(); - if hk.expand("nip44-v2".as_bytes(), &mut message_keys.0).is_err() { + if hk.expand(&nonce[..], &mut message_keys.0).is_err() { return Err(Error::HkdfLength(message_keys.0.len())); } Ok(message_keys)