2025-09-04 14:38:41 +03:00
|
|
|
use aes_gcm::{AeadCore, Aes256Gcm, KeyInit, aead::Aead};
|
2024-10-30 12:32:36 +02:00
|
|
|
use elliptic_curve::PrimeField;
|
2025-09-04 14:38:41 +03:00
|
|
|
use elliptic_curve::point::AffineCoordinates;
|
2024-10-30 12:32:36 +02:00
|
|
|
use k256::{AffinePoint, FieldBytes, Scalar};
|
2025-01-03 08:13:59 +02:00
|
|
|
use log::info;
|
2025-09-04 14:38:41 +03:00
|
|
|
use rand::{RngCore, rngs::OsRng};
|
2024-10-30 12:32:36 +02:00
|
|
|
|
|
|
|
|
use super::constants_types::{CipherText, Nonce};
|
|
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
|
///Ephemeral secret key holder. Non-clonable as intended for one-time use. Produces ephemeral public keys. Can produce shared secret for sender.
|
|
|
|
|
pub struct EphemeralKeyHolder {
|
|
|
|
|
ephemeral_secret_key: Scalar,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl EphemeralKeyHolder {
|
|
|
|
|
pub fn new_os_random() -> Self {
|
|
|
|
|
let mut bytes = FieldBytes::default();
|
|
|
|
|
|
|
|
|
|
OsRng.fill_bytes(&mut bytes);
|
|
|
|
|
|
|
|
|
|
Self {
|
|
|
|
|
ephemeral_secret_key: Scalar::from_repr(bytes).unwrap(),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn generate_ephemeral_public_key(&self) -> AffinePoint {
|
|
|
|
|
(AffinePoint::GENERATOR * self.ephemeral_secret_key).into()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn calculate_shared_secret_sender(
|
|
|
|
|
&self,
|
|
|
|
|
viewing_public_key_receiver: AffinePoint,
|
|
|
|
|
) -> AffinePoint {
|
|
|
|
|
(viewing_public_key_receiver * self.ephemeral_secret_key).into()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn encrypt_data(
|
|
|
|
|
&self,
|
|
|
|
|
viewing_public_key_receiver: AffinePoint,
|
|
|
|
|
data: &[u8],
|
|
|
|
|
) -> (CipherText, Nonce) {
|
2025-05-07 16:34:52 -03:00
|
|
|
let shared_secret = self.calculate_shared_secret_sender(viewing_public_key_receiver);
|
|
|
|
|
let cipher = Aes256Gcm::new(&shared_secret.x());
|
2024-10-30 12:32:36 +02:00
|
|
|
let nonce = Aes256Gcm::generate_nonce(&mut OsRng);
|
|
|
|
|
|
|
|
|
|
(cipher.encrypt(&nonce, data).unwrap(), nonce)
|
|
|
|
|
}
|
2025-01-03 08:13:59 +02:00
|
|
|
|
|
|
|
|
pub fn log(&self) {
|
2025-01-03 12:43:05 +02:00
|
|
|
info!(
|
|
|
|
|
"Ephemeral private key is {:?}",
|
2025-04-04 14:39:37 -04:00
|
|
|
hex::encode(serde_json::to_vec(&self.ephemeral_secret_key).unwrap())
|
2025-01-03 12:43:05 +02:00
|
|
|
);
|
2025-01-03 08:13:59 +02:00
|
|
|
}
|
2024-10-30 12:32:36 +02:00
|
|
|
}
|