lssa/key_protocol/src/key_management/ephemeral_key_holder.rs

53 lines
1.6 KiB
Rust
Raw Normal View History

2025-09-15 14:04:49 +03:00
use nssa_core::{
NullifierPublicKey, SharedSecretKey,
encryption::{EphemeralPublicKey, EphemeralSecretKey, IncomingViewingPublicKey},
};
2025-10-03 08:08:54 -03:00
use rand::{RngCore, rngs::OsRng};
2025-09-08 15:03:02 +03:00
use sha2::Digest;
2024-10-30 12:32:36 +02:00
#[derive(Debug)]
2025-11-26 00:27:20 +03:00
/// Ephemeral secret key holder. Non-clonable as intended for one-time use. Produces ephemeral
/// public keys. Can produce shared secret for sender.
2024-10-30 12:32:36 +02:00
pub struct EphemeralKeyHolder {
2025-09-15 14:04:49 +03:00
ephemeral_secret_key: EphemeralSecretKey,
2024-10-30 12:32:36 +02:00
}
2025-09-26 09:50:09 +03:00
pub fn produce_one_sided_shared_secret_receiver(
ipk: &IncomingViewingPublicKey,
) -> (SharedSecretKey, EphemeralPublicKey) {
let mut esk = [0; 32];
OsRng.fill_bytes(&mut esk);
(
SharedSecretKey::new(&esk, ipk),
EphemeralPublicKey::from_scalar(esk),
)
}
2024-10-30 12:32:36 +02:00
impl EphemeralKeyHolder {
2025-10-03 08:08:54 -03:00
pub fn new(receiver_nullifier_public_key: &NullifierPublicKey) -> Self {
2025-10-02 22:30:33 -03:00
let mut nonce_bytes = [0; 16];
OsRng.fill_bytes(&mut nonce_bytes);
2025-09-08 14:48:58 +03:00
let mut hasher = sha2::Sha256::new();
hasher.update(receiver_nullifier_public_key);
2025-10-02 22:30:33 -03:00
hasher.update(nonce_bytes);
2024-10-30 12:32:36 +02:00
Self {
2025-09-17 08:59:14 +03:00
ephemeral_secret_key: hasher.finalize().into(),
2024-10-30 12:32:36 +02:00
}
}
2025-09-15 14:04:49 +03:00
pub fn generate_ephemeral_public_key(&self) -> EphemeralPublicKey {
EphemeralPublicKey::from_scalar(self.ephemeral_secret_key)
2024-10-30 12:32:36 +02:00
}
pub fn calculate_shared_secret_sender(
&self,
2025-10-02 22:30:33 -03:00
receiver_incoming_viewing_public_key: &IncomingViewingPublicKey,
2025-09-15 14:04:49 +03:00
) -> SharedSecretKey {
SharedSecretKey::new(
&self.ephemeral_secret_key,
2025-10-02 22:30:33 -03:00
receiver_incoming_viewing_public_key,
2025-09-15 14:04:49 +03:00
)
2024-10-30 12:32:36 +02:00
}
}