signal_bridge/
storage_trait.rs

1//! Storage trait definitions for libsignal
2//!
3//! This module provides trait definitions for storage backends, allowing
4//! dependency injection of different storage implementations (memory, database, etc.).
5
6use async_trait::async_trait;
7use libsignal_protocol::*;
8
9/// Container trait for all Signal Protocol storage backends
10pub trait SignalStorageContainer {
11    type SessionStore: SessionStore + ExtendedSessionStore;
12    type IdentityStore: IdentityKeyStore + ExtendedIdentityStore;
13    type PreKeyStore: PreKeyStore + ExtendedPreKeyStore;
14    type SignedPreKeyStore: SignedPreKeyStore + ExtendedSignedPreKeyStore;
15    type KyberPreKeyStore: KyberPreKeyStore + ExtendedKyberPreKeyStore;
16
17    fn session_store(&mut self) -> &mut Self::SessionStore;
18
19    fn identity_store(&mut self) -> &mut Self::IdentityStore;
20
21    fn pre_key_store(&mut self) -> &mut Self::PreKeyStore;
22
23    fn signed_pre_key_store(&mut self) -> &mut Self::SignedPreKeyStore;
24
25    fn kyber_pre_key_store(&mut self) -> &mut Self::KyberPreKeyStore;
26
27    fn initialize(&mut self) -> Result<(), Box<dyn std::error::Error>>;
28
29    fn close(&mut self) -> Result<(), Box<dyn std::error::Error>>;
30
31    fn storage_type(&self) -> &'static str;
32}
33
34/// High-level operations for session establishment and message encryption/decryption
35#[async_trait(?Send)]
36pub trait ExtendedStorageOps {
37    async fn establish_session_from_bundle(
38        &mut self,
39        address: &ProtocolAddress,
40        bundle: &PreKeyBundle,
41    ) -> Result<(), Box<dyn std::error::Error>>;
42
43    async fn encrypt_message(
44        &mut self,
45        remote_address: &ProtocolAddress,
46        plaintext: &[u8],
47    ) -> Result<CiphertextMessage, SignalProtocolError>;
48
49    async fn decrypt_message(
50        &mut self,
51        remote_address: &ProtocolAddress,
52        ciphertext: &CiphertextMessage,
53    ) -> Result<Vec<u8>, SignalProtocolError>;
54}
55
56/// Extended operations for session storage beyond libsignal's SessionStore
57#[async_trait(?Send)]
58pub trait ExtendedSessionStore {
59    async fn session_count(&self) -> usize;
60    async fn clear_all_sessions(&mut self) -> Result<(), Box<dyn std::error::Error>>;
61    async fn delete_session(
62        &mut self,
63        address: &ProtocolAddress,
64    ) -> Result<(), Box<dyn std::error::Error>>;
65}
66
67/// Extended operations for identity key storage beyond libsignal's IdentityKeyStore
68#[async_trait(?Send)]
69pub trait ExtendedIdentityStore {
70    async fn identity_count(&self) -> usize;
71    async fn set_local_identity_key_pair(
72        &self,
73        identity_key_pair: &IdentityKeyPair,
74    ) -> Result<(), Box<dyn std::error::Error>>;
75    async fn set_local_registration_id(
76        &self,
77        registration_id: u32,
78    ) -> Result<(), Box<dyn std::error::Error>>;
79    async fn get_peer_identity(
80        &self,
81        address: &ProtocolAddress,
82    ) -> Result<Option<IdentityKey>, Box<dyn std::error::Error>>;
83    async fn delete_identity(
84        &mut self,
85        address: &ProtocolAddress,
86    ) -> Result<(), Box<dyn std::error::Error>>;
87    async fn clear_all_identities(&mut self) -> Result<(), Box<dyn std::error::Error>>;
88    async fn clear_local_identity(&mut self) -> Result<(), Box<dyn std::error::Error>>;
89}
90
91/// Extended operations for pre-key storage beyond libsignal's PreKeyStore
92#[async_trait(?Send)]
93pub trait ExtendedPreKeyStore {
94    async fn pre_key_count(&self) -> usize;
95    async fn clear_all_pre_keys(&mut self) -> Result<(), Box<dyn std::error::Error>>;
96    async fn get_max_pre_key_id(&self) -> Result<Option<u32>, Box<dyn std::error::Error>>;
97    async fn delete_pre_key(&mut self, id: PreKeyId) -> Result<(), Box<dyn std::error::Error>>;
98}
99
100/// Extended operations for signed pre-key storage beyond libsignal's SignedPreKeyStore
101#[async_trait(?Send)]
102pub trait ExtendedSignedPreKeyStore {
103    async fn signed_pre_key_count(&self) -> usize;
104    async fn clear_all_signed_pre_keys(&mut self) -> Result<(), Box<dyn std::error::Error>>;
105    async fn get_max_signed_pre_key_id(&self) -> Result<Option<u32>, Box<dyn std::error::Error>>;
106    async fn delete_signed_pre_key(
107        &mut self,
108        id: SignedPreKeyId,
109    ) -> Result<(), Box<dyn std::error::Error>>;
110    async fn get_signed_pre_keys_older_than(
111        &self,
112        timestamp_millis: u64,
113    ) -> Result<Vec<SignedPreKeyId>, Box<dyn std::error::Error>>;
114}
115
116/// Extended operations for Kyber post-quantum pre-key storage beyond libsignal's KyberPreKeyStore
117#[async_trait(?Send)]
118pub trait ExtendedKyberPreKeyStore {
119    async fn kyber_pre_key_count(&self) -> usize;
120    async fn clear_all_kyber_pre_keys(&mut self) -> Result<(), Box<dyn std::error::Error>>;
121    async fn get_max_kyber_pre_key_id(&self) -> Result<Option<u32>, Box<dyn std::error::Error>>;
122    async fn delete_kyber_pre_key(
123        &mut self,
124        id: KyberPreKeyId,
125    ) -> Result<(), Box<dyn std::error::Error>>;
126    async fn get_kyber_pre_keys_older_than(
127        &self,
128        timestamp_millis: u64,
129    ) -> Result<Vec<KyberPreKeyId>, Box<dyn std::error::Error>>;
130}