use crate::crypto::{KeyPair, PublicKey};
use crate::{AdnlAddress, AdnlAesParams, AdnlHandshake};
use crate::helper_types::CryptoRandom;
pub struct AdnlBuilder {
aes_params: AdnlAesParams,
}
impl AdnlBuilder {
pub fn with_static_aes_params(aes_params: AdnlAesParams) -> Self {
Self { aes_params }
}
pub fn with_random_aes_params<R: CryptoRandom>(rng: &mut R) -> Self {
Self {
aes_params: {
let mut buffer = [0u8; 160];
rng.fill_bytes(&mut buffer);
AdnlAesParams::from(buffer)
},
}
}
pub fn use_static_ecdh(
self,
sender_public: PublicKey,
receiver_address: AdnlAddress,
ecdh_secret: [u8; 32],
) -> AdnlHandshake {
AdnlHandshake::new(
receiver_address,
sender_public,
ecdh_secret,
self.aes_params,
)
}
pub fn perform_ecdh(
self,
sender_keypair: &KeyPair,
receiver_public: &PublicKey,
) -> AdnlHandshake {
AdnlHandshake::new(
AdnlAddress::from(receiver_public),
sender_keypair.public_key,
sender_keypair
.secret_key
.compute_shared_secret(receiver_public),
self.aes_params,
)
}
}