core_crypto_keystore/entities/
proteus.rs

1use zeroize::Zeroize;
2
3use crate::connection::FetchFromDatabase;
4
5#[derive(Debug, Clone, Zeroize, PartialEq, Eq)]
6#[zeroize(drop)]
7#[cfg_attr(
8    any(target_family = "wasm", feature = "serde"),
9    derive(serde::Serialize, serde::Deserialize)
10)]
11pub struct ProteusIdentity {
12    pub sk: Vec<u8>,
13    pub pk: Vec<u8>,
14}
15
16impl ProteusIdentity {
17    pub const SK_KEY_SIZE: usize = 64;
18    pub const PK_KEY_SIZE: usize = 32;
19
20    pub fn sk_raw(&self) -> zeroize::Zeroizing<[u8; Self::SK_KEY_SIZE]> {
21        let mut slice = zeroize::Zeroizing::new([0u8; Self::SK_KEY_SIZE]);
22        debug_assert_eq!(self.sk.len(), Self::SK_KEY_SIZE);
23        slice.copy_from_slice(&self.sk[..Self::SK_KEY_SIZE]);
24        slice
25    }
26
27    pub fn pk_raw(&self) -> zeroize::Zeroizing<[u8; Self::PK_KEY_SIZE]> {
28        let mut slice = zeroize::Zeroizing::new([0u8; Self::PK_KEY_SIZE]);
29        debug_assert_eq!(self.pk.len(), Self::PK_KEY_SIZE);
30        slice.copy_from_slice(&self.pk[..Self::PK_KEY_SIZE]);
31        slice
32    }
33}
34
35#[derive(Debug, Clone, Zeroize, PartialEq, Eq)]
36#[zeroize(drop)]
37#[cfg_attr(
38    any(target_family = "wasm", feature = "serde"),
39    derive(serde::Serialize, serde::Deserialize)
40)]
41pub struct ProteusPrekey {
42    pub id: u16,
43    id_bytes: Vec<u8>,
44    pub prekey: Vec<u8>,
45}
46
47impl ProteusPrekey {
48    pub fn from_raw(id: u16, prekey: Vec<u8>) -> Self {
49        Self {
50            id_bytes: id.to_le_bytes().into(),
51            id,
52            prekey,
53        }
54    }
55
56    pub fn id_bytes(&self) -> &[u8] {
57        &self.id_bytes
58    }
59
60    pub fn id_from_slice(slice: &[u8]) -> u16 {
61        if slice.len() < 2 {
62            panic!("Oops, Proteus Prekey id slice is too small!");
63        }
64
65        let mut id_buf = [0u8; 2];
66        id_buf.copy_from_slice(&slice[..2]);
67        let id: u16 = u16::from_le_bytes(id_buf);
68        id
69    }
70
71    pub fn set_id(&mut self, id: u16) {
72        self.id = id;
73        self.id_bytes = self.id.to_le_bytes().into();
74    }
75
76    pub async fn get_free_id(conn: &crate::Connection) -> crate::CryptoKeystoreResult<u16> {
77        let mut id = 1u16;
78        let limit = u16::MAX;
79        while id <= limit {
80            if id == limit {
81                return Err(crate::CryptoKeystoreError::NoFreePrekeyId);
82            }
83            if conn.find::<Self>(&id.to_le_bytes()).await?.is_none() {
84                break;
85            }
86            id += 1;
87        }
88
89        Ok(id)
90    }
91}
92
93#[derive(Debug, Clone, Zeroize, PartialEq, Eq, core_crypto_macros::Entity)]
94#[zeroize(drop)]
95#[cfg_attr(
96    any(target_family = "wasm", feature = "serde"),
97    derive(serde::Serialize, serde::Deserialize)
98)]
99pub struct ProteusSession {
100    pub id: String,
101    pub session: Vec<u8>,
102}