use crate::bytes::AsBytes;
use crate::crypto::keys::*;
use ssb_crypto::ephemeral::{
derive_shared_secret, derive_shared_secret_pk, derive_shared_secret_sk, SharedSecret,
};
use ssb_crypto::{hash, Hash, Keypair};
#[derive(AsBytes, Clone)]
#[repr(C)]
pub struct SharedA(SharedSecret);
impl SharedA {
pub fn client_side(sk: &ClientEphSecretKey, pk: &ServerEphPublicKey) -> Option<SharedA> {
derive_shared_secret(&sk.0, &pk.0).map(SharedA)
}
pub fn server_side(sk: &ServerEphSecretKey, pk: &ClientEphPublicKey) -> Option<SharedA> {
derive_shared_secret(&sk.0, &pk.0).map(SharedA)
}
pub(crate) fn hash(&self) -> SharedAHash {
SharedAHash(hash(self.as_bytes()))
}
}
#[derive(AsBytes)]
#[repr(C)]
pub(crate) struct SharedAHash(Hash);
#[derive(AsBytes, Clone)]
#[repr(C)]
pub struct SharedB(SharedSecret);
impl SharedB {
pub fn client_side(sk: &ClientEphSecretKey, pk: &ServerPublicKey) -> Option<SharedB> {
derive_shared_secret_pk(&sk.0, &pk.0).map(SharedB)
}
pub fn server_side(kp: &Keypair, pk: &ClientEphPublicKey) -> Option<SharedB> {
derive_shared_secret_sk(&kp.secret, &pk.0).map(SharedB)
}
}
#[derive(AsBytes, Clone)]
#[repr(C)]
pub struct SharedC(SharedSecret);
impl SharedC {
pub fn client_side(kp: &Keypair, pk: &ServerEphPublicKey) -> Option<SharedC> {
derive_shared_secret_sk(&kp.secret, &pk.0).map(SharedC)
}
pub fn server_side(sk: &ServerEphSecretKey, pk: &ClientPublicKey) -> Option<SharedC> {
derive_shared_secret_pk(&sk.0, &pk.0).map(SharedC)
}
}