enigma-identity 0.1.0

Enigma Identity: local identity + X3DH bundle + shared secret derivation
Documentation
use serde::{Deserialize, Serialize};
use serde_big_array::BigArray;
use uuid::Uuid;
use zeroize::Zeroize;

#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct LocalUser {
    pub uuid: Uuid,
    pub username: String,
}

#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct X3dhBundle {
    pub username: String,
    pub identity_public_key: [u8; 32],
    pub signed_prekey_public_key: [u8; 32],
    #[serde(with = "BigArray")]
    pub signed_prekey_signature: [u8; 64],
}

#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct X3dhInitiation {
    pub initiator_ephemeral_public_key: [u8; 32],
}

#[derive(Clone)]
pub struct X3dhResponderKeys {
    pub identity_public_key: [u8; 32],
    pub identity_secret_key: [u8; 32],
    pub signed_prekey_public_key: [u8; 32],
    pub signed_prekey_secret_key: [u8; 32],
    pub signed_prekey_signature: [u8; 64],
}

#[derive(Clone, Debug, PartialEq, Eq, Zeroize)]
#[zeroize(drop)]
pub struct SharedSecret([u8; 32]);

impl SharedSecret {
    pub fn new(bytes: [u8; 32]) -> Self {
        Self(bytes)
    }

    pub fn as_bytes(&self) -> &[u8; 32] {
        &self.0
    }
}