57 lines
1.7 KiB
Rust
Raw Normal View History

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
}