core_crypto_keystore/entities/
proteus.rs1use 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}