model.rs (4555B)
1 use alloc::vec::Vec; 2 use base64::Engine as _; 3 use base64::engine::general_purpose::{URL_SAFE, URL_SAFE_NO_PAD}; 4 use radroots_simplex_smp_crypto::prelude::{ 5 RadrootsSimplexOfficialX3dhParams, RadrootsSimplexSmpRatchetHeader, 6 }; 7 use radroots_simplex_smp_proto::prelude::{ 8 RadrootsSimplexSmpQueueUri, RadrootsSimplexSmpServerAddress, RadrootsSimplexSmpVersionRange, 9 }; 10 11 pub const RADROOTS_SIMPLEX_AGENT_CURRENT_VERSION: u16 = 5; 12 pub type RadrootsSimplexAgentMessageId = u64; 13 14 #[derive(Debug, Clone, Copy, PartialEq, Eq)] 15 pub enum RadrootsSimplexAgentConnectionMode { 16 Direct, 17 ContactAddress, 18 } 19 20 #[derive(Debug, Clone, Copy, PartialEq, Eq)] 21 pub enum RadrootsSimplexAgentConnectionStatus { 22 CreatePending, 23 InvitationReady, 24 JoinPending, 25 AwaitingApproval, 26 Allowed, 27 Connected, 28 Suspended, 29 Rotating, 30 Deleted, 31 } 32 33 #[derive(Debug, Clone, PartialEq, Eq)] 34 pub struct RadrootsSimplexAgentConnectionLink { 35 pub invitation_queue: RadrootsSimplexSmpQueueUri, 36 pub connection_id: Vec<u8>, 37 pub e2e_ratchet_params: RadrootsSimplexOfficialX3dhParams, 38 pub contact_address: bool, 39 } 40 41 #[derive(Debug, Clone, PartialEq, Eq)] 42 pub struct RadrootsSimplexAgentQueueAddress { 43 pub server: RadrootsSimplexSmpServerAddress, 44 pub sender_id: Vec<u8>, 45 } 46 47 #[derive(Debug, Clone, PartialEq, Eq)] 48 pub struct RadrootsSimplexAgentQueueDescriptor { 49 pub queue_uri: RadrootsSimplexSmpQueueUri, 50 pub replaced_queue: Option<RadrootsSimplexAgentQueueAddress>, 51 pub primary: bool, 52 pub sender_key: Option<Vec<u8>>, 53 } 54 55 impl RadrootsSimplexAgentQueueDescriptor { 56 pub const fn client_version_range(&self) -> RadrootsSimplexSmpVersionRange { 57 self.queue_uri.version_range 58 } 59 60 pub fn queue_address(&self) -> RadrootsSimplexAgentQueueAddress { 61 RadrootsSimplexAgentQueueAddress { 62 server: self.queue_uri.server.clone(), 63 sender_id: decode_queue_uri_sender_id(&self.queue_uri.sender_id), 64 } 65 } 66 } 67 68 fn decode_queue_uri_sender_id(sender_id: &str) -> Vec<u8> { 69 URL_SAFE_NO_PAD 70 .decode(sender_id.as_bytes()) 71 .or_else(|_| URL_SAFE.decode(sender_id.as_bytes())) 72 .expect("validated SimpleX queue URI sender id") 73 } 74 75 #[derive(Debug, Clone, PartialEq, Eq)] 76 pub struct RadrootsSimplexAgentQueueUseDecision { 77 pub queue_address: RadrootsSimplexAgentQueueAddress, 78 pub primary: bool, 79 } 80 81 #[derive(Debug, Clone, PartialEq, Eq)] 82 pub struct RadrootsSimplexAgentMessageHeader { 83 pub message_id: RadrootsSimplexAgentMessageId, 84 pub previous_message_hash: Vec<u8>, 85 } 86 87 #[derive(Debug, Clone, PartialEq, Eq)] 88 pub struct RadrootsSimplexAgentMessageReceipt { 89 pub message_id: RadrootsSimplexAgentMessageId, 90 pub message_hash: Vec<u8>, 91 pub receipt_info: Vec<u8>, 92 } 93 94 #[derive(Debug, Clone, PartialEq, Eq)] 95 pub enum RadrootsSimplexAgentMessage { 96 Hello, 97 UserMessage(Vec<u8>), 98 Receipt(RadrootsSimplexAgentMessageReceipt), 99 EncryptionReady { 100 up_to_message_id: RadrootsSimplexAgentMessageId, 101 }, 102 QueueContinue(RadrootsSimplexAgentQueueAddress), 103 QueueAdd(Vec<RadrootsSimplexAgentQueueDescriptor>), 104 QueueKey(Vec<RadrootsSimplexAgentQueueDescriptor>), 105 QueueUse(Vec<RadrootsSimplexAgentQueueUseDecision>), 106 QueueTest(Vec<RadrootsSimplexAgentQueueAddress>), 107 } 108 109 #[derive(Debug, Clone, PartialEq, Eq)] 110 pub struct RadrootsSimplexAgentMessageFrame { 111 pub header: RadrootsSimplexAgentMessageHeader, 112 pub message: RadrootsSimplexAgentMessage, 113 pub padding: Vec<u8>, 114 } 115 116 #[derive(Debug, Clone, PartialEq, Eq)] 117 pub enum RadrootsSimplexAgentDecryptedMessage { 118 ConnectionInfo(Vec<u8>), 119 ConnectionInfoReply { 120 reply_queues: Vec<RadrootsSimplexAgentQueueDescriptor>, 121 info: Vec<u8>, 122 }, 123 RatchetInfo(Vec<u8>), 124 Message(RadrootsSimplexAgentMessageFrame), 125 } 126 127 #[derive(Debug, Clone, PartialEq, Eq)] 128 pub struct RadrootsSimplexAgentEncryptedPayload { 129 pub ratchet_header: Option<RadrootsSimplexSmpRatchetHeader>, 130 pub official_message: Option<Vec<u8>>, 131 pub ciphertext: Vec<u8>, 132 } 133 134 #[derive(Debug, Clone, PartialEq, Eq)] 135 pub enum RadrootsSimplexAgentEnvelope { 136 Confirmation { 137 reply_queue: bool, 138 e2e_ratchet_params: Option<RadrootsSimplexOfficialX3dhParams>, 139 encrypted: RadrootsSimplexAgentEncryptedPayload, 140 }, 141 Message(RadrootsSimplexAgentEncryptedPayload), 142 Invitation { 143 request: Vec<u8>, 144 connection_info: Vec<u8>, 145 }, 146 RatchetKey { 147 info: Vec<u8>, 148 encrypted: RadrootsSimplexAgentEncryptedPayload, 149 }, 150 }