obscura-server 0.4.3

A server for relaying secure messages using the Signal Protocol
Documentation
use crate::domain::crypto::{PublicKey, Signature};
use crate::domain::keys::{OneTimePreKey, SignedPreKey};
use time::OffsetDateTime;
use uuid::Uuid;

#[derive(Debug, sqlx::FromRow)]
pub struct IdentityKeyRecord {
    #[sqlx(rename = "user_id")]
    pub(crate) _user_id: Uuid,
    #[sqlx(rename = "identity_key")]
    pub(crate) key: Vec<u8>,
    pub(crate) registration_id: i32,
}

impl TryFrom<IdentityKeyRecord> for PublicKey {
    type Error = String;
    fn try_from(record: IdentityKeyRecord) -> Result<Self, Self::Error> {
        Self::try_from_bytes(&record.key)
    }
}

#[derive(Debug, sqlx::FromRow)]
pub struct SignedPreKeyRecord {
    pub(crate) id: i32,
    #[sqlx(rename = "user_id")]
    pub(crate) _user_id: Uuid,
    pub(crate) public_key: Vec<u8>,
    pub(crate) signature: Vec<u8>,
    #[sqlx(rename = "created_at")]
    pub(crate) _created_at: Option<OffsetDateTime>,
}

impl TryFrom<SignedPreKeyRecord> for SignedPreKey {
    type Error = String;
    fn try_from(record: SignedPreKeyRecord) -> Result<Self, Self::Error> {
        let public_key = PublicKey::try_from(record.public_key)?;
        let signature = Signature::try_from(record.signature)?;
        Ok(Self { key_id: record.id, public_key, signature })
    }
}

#[derive(Debug, sqlx::FromRow)]
pub struct OneTimePreKeyRecord {
    pub(crate) id: i32,
    #[sqlx(rename = "user_id")]
    pub(crate) _user_id: Uuid,
    pub(crate) public_key: Vec<u8>,
    #[sqlx(rename = "created_at")]
    pub(crate) _created_at: Option<OffsetDateTime>,
}

impl TryFrom<OneTimePreKeyRecord> for OneTimePreKey {
    type Error = String;
    fn try_from(record: OneTimePreKeyRecord) -> Result<Self, Self::Error> {
        let public_key = PublicKey::try_from(record.public_key)?;
        Ok(Self { key_id: record.id, public_key })
    }
}