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
|
|
|
}
|
|
|
|
|
}
|