thefinalboss commited on
Commit
291d38e
·
verified ·
1 Parent(s): e3583aa

Add AICL example: 14_secure_messaging.aicl

Browse files
data/aicl/examples/14_secure_messaging.aicl ADDED
@@ -0,0 +1,400 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # AICL Example: End-to-End Secure Messaging
2
+ # Comprehensive E2EE messaging platform with group encryption, X3DH key exchange,
3
+ # double ratchet algorithm, forward secrecy, and deniable authentication
4
+
5
+ Goal Build an end-to-end encrypted messaging platform providing strong forward secrecy through double ratchet key agreement, group messaging with sender keys, multi-device synchronization, deniable authentication, and metadata protection
6
+
7
+ Constraint All message content must be encrypted end-to-end with no server access to plaintext under any circumstance
8
+ Constraint Forward secrecy must be maintained with new key agreement for every message
9
+ Constraint Group messages must maintain same security guarantees as 1:1 conversations
10
+ Constraint Key exchange must complete within 500ms on mobile devices
11
+ Constraint Metadata must be minimized with sender anonymity through sealed sender design
12
+
13
+ Risk Device compromise exposes current session keys and decrypts future messages
14
+ Recovery Implement remote wipe capability, force session reset from authenticated backup device, and re-key all active conversations with new ratchet initialization
15
+ Risk Man-in-middle attack during initial key exchange intercepts communications
16
+ Recovery Implement safety number verification with QR code comparison, monitor identity key changes with explicit user confirmation, and support out-of-band key verification channels
17
+ Risk Group messaging key scaling becomes unmanageable for large groups
18
+ Recovery Implement sender key distribution with periodic re-keying, limit group size to 1000 members with sub-group partitioning, and use tree-based group key agreement for large groups
19
+ Risk Server metadata leak reveals communication patterns and relationships
20
+ Recovery Implement sealed sender with server-visible delivery tokens only, use constant-rate cover traffic, and deploy mix network routing for high-security mode
21
+ Risk Key material persistence on device after session enables retroactive decryption
22
+ Recovery Implement secure key deletion with verified memory zeroization, use hardware-backed key storage with automatic purge, and enforce key lifetime limits with automatic destruction
23
+
24
+ Layer SecureMessaging
25
+ SubLayer: KeyExchange
26
+ # X3DH key agreement and identity key management
27
+ SubLayer: DoubleRatchet
28
+ # Symmetric key ratchet and Diffie-Hellman ratchet
29
+ SubLayer: GroupEncryption
30
+ # Sender keys, group ratchet, and membership management
31
+ SubLayer: MessageProcessing
32
+ # Encryption, decryption, ordering, and delivery
33
+ SubLayer: MetadataProtection
34
+ # Sealed sender, cover traffic, and anonymous routing
35
+
36
+ Validation Message authentication must verify sender identity through MAC before decryption
37
+ Validation Each message must use unique message key with no key reuse across sessions
38
+ Validation Safety number must remain consistent between conversation participants
39
+ Validation Group membership changes must trigger re-key with new sender key distribution
40
+ Validation Deleted messages must be cryptographically erased from all device storage
41
+ Validation Out-of-order messages must be decryptable up to maximum skip of 1000 messages
42
+ Validation Identity key changes must require explicit user confirmation before continuing
43
+
44
+ Entity IdentityKeyPair
45
+ identity_id: string
46
+ public_key: bytes
47
+ signed_prekey: bytes
48
+ signed_prekey_signature: bytes
49
+ one_time_prekeys: list
50
+ prekey_last_rotated: datetime
51
+ device_id: string
52
+ user_id: string
53
+ is_verified: boolean
54
+ safety_number: string
55
+
56
+ Entity SessionState
57
+ session_id: string
58
+ remote_identity: bytes
59
+ root_key: bytes
60
+ chain_key_send: bytes
61
+ chain_key_recv: bytes
62
+ ratchet_key_send: bytes
63
+ ratchet_key_recv: bytes
64
+ send_count: integer
65
+ recv_count: integer
66
+ previous_sending_chain: bytes
67
+ skipped_keys: dict
68
+ created_at: datetime
69
+ last_used: datetime
70
+
71
+ Entity GroupSession
72
+ group_id: string
73
+ group_name: string
74
+ sender_key: bytes
75
+ chain_key: bytes
76
+ iteration: integer
77
+ members: list
78
+ distribution_id: string
79
+ created_at: datetime
80
+ last_rekey: datetime
81
+ membership_version: integer
82
+
83
+ Entity SecureMessage
84
+ message_id: string
85
+ sender_device: string
86
+ recipient: string
87
+ ciphertext: bytes
88
+ message_type: string
89
+ ratchet_header: bytes
90
+ timestamp: datetime
91
+ delivery_status: string
92
+ is_sealed_sender: boolean
93
+ group_id: string
94
+
95
+ Entity DeviceRecord
96
+ device_id: string
97
+ user_id: string
98
+ identity_key: bytes
99
+ signed_prekey: bytes
100
+ registration_date: datetime
101
+ last_active: datetime
102
+ is_primary: boolean
103
+ capabilities: list
104
+ push_token: string
105
+
106
+ Entity PreKeyBundle
107
+ user_id: string
108
+ device_id: string
109
+ identity_key: bytes
110
+ signed_prekey: bytes
111
+ prekey_signature: bytes
112
+ one_time_prekey: bytes
113
+ bundle_timestamp: datetime
114
+ bundle_signature: bytes
115
+
116
+ Entity SafetyNumber
117
+ local_identity: bytes
118
+ remote_identity: bytes
119
+ fingerprint: string
120
+ qr_code_data: bytes
121
+ verified: boolean
122
+ verification_date: datetime
123
+ verification_method: string
124
+
125
+ Behavior InitializeSession
126
+ Input:
127
+ local_identity: IdentityKeyPair
128
+ remote_bundle: PreKeyBundle
129
+ Output:
130
+ session: SessionState
131
+ safety_number: SafetyNumber
132
+ Action:
133
+ Execute X3DH key agreement with remote prekey bundle
134
+ Derive initial root key and chain keys from shared secret
135
+ Initialize double ratchet with DH ratchet step
136
+ Compute safety number from both identity keys
137
+ Store session state with forward secrecy guarantees
138
+ Emit session_created event
139
+ Return session with safety number for verification
140
+
141
+ Behavior EncryptMessage
142
+ Input:
143
+ session: SessionState
144
+ plaintext: bytes
145
+ message_type: string
146
+ Output:
147
+ message: SecureMessage
148
+ updated_session: SessionState
149
+ Action:
150
+ Derive message key from current sending chain key
151
+ Advance sending chain key using HMAC-based derivation
152
+ Encrypt plaintext using AES-256-GCM with message key
153
+ Construct message header with current ratchet public key
154
+ Apply symmetric ratchet step for forward secrecy
155
+ Include authentication data from session context
156
+ Return encrypted message with updated session state
157
+
158
+ Behavior DecryptMessage
159
+ Input:
160
+ session: SessionState
161
+ message: SecureMessage
162
+ Output:
163
+ plaintext: bytes
164
+ updated_session: SessionState
165
+ Action:
166
+ Parse message header for ratchet key and chain information
167
+ Perform DH ratchet step if new ratchet key detected
168
+ Store skipped message keys for out-of-order handling
169
+ Derive message key from receiving chain
170
+ Verify message authentication code before decryption
171
+ Decrypt ciphertext using AES-256-GCM with derived key
172
+ Advance receiving chain key
173
+ Return plaintext with updated session state
174
+
175
+ Behavior CreateGroup
176
+ Input:
177
+ creator: IdentityKeyPair
178
+ member_identities: list
179
+ group_name: string
180
+ Output:
181
+ group_session: GroupSession
182
+ distribution_messages: list
183
+ Action:
184
+ Generate sender key for group creator
185
+ Create group session with initial member list
186
+ Encrypt sender key for each member individually
187
+ Distribute encrypted sender keys via 1:1 sessions
188
+ Initialize group chain key and iteration counter
189
+ Record group metadata and membership version
190
+ Return group session with distribution messages
191
+
192
+ Behavior RekeyGroup
193
+ Input:
194
+ group_session: GroupSession
195
+ change_type: string
196
+ affected_members: list
197
+ Output:
198
+ new_group_session: GroupSession
199
+ distribution_messages: list
200
+ Action:
201
+ Generate new sender key for group
202
+ Increment membership version counter
203
+ For member addition, encrypt new sender key for all members
204
+ For member removal, distribute new sender key excluding removed member
205
+ Update group session state with new key material
206
+ Archive previous sender key for message history access
207
+ Emit group_rekeyed event with version update
208
+
209
+ Behavior SendSealedSender
210
+ Input:
211
+ session: SessionState
212
+ plaintext: bytes
213
+ server_token: bytes
214
+ Output:
215
+ sealed_message: SecureMessage
216
+ Action:
217
+ Encrypt message with double ratchet as normal
218
+ Wrap encrypted message with server delivery token
219
+ Encrypt sender identity within sealed envelope
220
+ Remove all plaintext metadata from message envelope
221
+ Use constant-size message padding to hide length
222
+ Route through mix network in high-security mode
223
+ Return sealed message with minimal server-visible data
224
+
225
+ Behavior VerifySafetyNumber
226
+ Input:
227
+ local_identity: IdentityKeyPair
228
+ remote_identity: bytes
229
+ verification_method: string
230
+ Output:
231
+ safety_number: SafetyNumber
232
+ is_match: boolean
233
+ Action:
234
+ Compute safety number from both identity public keys
235
+ Format as 60-digit numeric string or QR code
236
+ Compare with previously stored safety number
237
+ If new identity, prompt user for explicit verification
238
+ Record verification method and timestamp
239
+ Mark safety number as verified upon confirmation
240
+ Return safety number with match status
241
+
242
+ Condition:
243
+ When identity key change detected for existing contact
244
+ Then require explicit user confirmation before processing messages and display safety number change warning
245
+
246
+ Condition:
247
+ When skipped message keys exceed 1000 entries in session
248
+ Then discard oldest skipped keys and emit message_gap_warning for potentially lost messages
249
+
250
+ Condition:
251
+ When group membership exceeds 500 members
252
+ Then recommend sub-group partitioning and switch to tree-based group key agreement protocol
253
+
254
+ Condition:
255
+ When signed prekey age exceeds 7 days without rotation
256
+ Then automatically rotate signed prekey and upload new bundle to server
257
+
258
+ Condition:
259
+ When device has been offline for more than 30 days
260
+ Then require fresh key exchange and invalidate cached session state
261
+
262
+ Event:
263
+ On session_created
264
+ Action: Store session state, compute safety number, emit session notification, log key exchange completion
265
+
266
+ Event:
267
+ On message_decrypted
268
+ Action: Update session state, advance ratchet, store plaintext locally in encrypted database, emit delivery receipt
269
+
270
+ Event:
271
+ On group_rekeyed
272
+ Action: Distribute new sender keys, update membership version, archive old keys, notify members of key rotation
273
+
274
+ Event:
275
+ On identity_key_changed
276
+ Action: Alert user to key change, pause automatic message processing, require verification, log security event
277
+
278
+ Event:
279
+ On sealed_sender_received
280
+ Action: Decrypt sender identity, verify delivery token, process inner message, strip metadata, emit receipt without sender disclosure
281
+
282
+ Parallel:
283
+ Message encryption and decryption across multiple active sessions
284
+ Group sender key distribution to new and existing members
285
+ Prekey bundle upload and rotation management
286
+ Safety number computation and verification cache updates
287
+
288
+ Optimize: Message encryption latency on mobile devices
289
+ Priority: Achieve sub-50ms encryption time through hardware-accelerated AES and pre-computed ratchet steps
290
+
291
+ Optimize: Group message distribution efficiency
292
+ Priority: Minimize bandwidth for group messages using fan-out optimization and compressed sender key updates
293
+
294
+ Optimize: Key exchange completion time
295
+ Priority: Reduce X3DH key exchange to sub-200ms through prekey pre-fetching and session pre-computation
296
+
297
+ Learn: Optimal prekey pool sizing
298
+ Goal: Maintain sufficient one-time prekeys to prevent key exhaustion while minimizing storage
299
+ Adapt: Prekey generation batch size and upload frequency
300
+ Based: Session initiation rate, device popularity patterns, and prekey consumption trends
301
+
302
+ Learn: Group rekey timing optimization
303
+ Goal: Balance security of frequent rekeying against performance cost of key distribution
304
+ Adapt: Rekey interval and trigger sensitivity for membership changes
305
+ Based: Group activity patterns, membership change frequency, and message volume correlation with security requirements
306
+
307
+ Learn: Cover traffic rate calibration
308
+ Goal: Generate sufficient cover traffic to hide real communication patterns without excessive bandwidth
309
+ Adapt: Cover message generation rate and timing distribution
310
+ Based: Real message frequency analysis, traffic analysis resistance metrics, and network overhead constraints
311
+
312
+ Security:
313
+ Encrypt: All message content using AES-256-GCM with unique message keys derived from double ratchet
314
+ Encrypt: Sender key distribution messages using 1:1 session encryption with forward secrecy
315
+ Protect: Session keys against memory dump using secure enclave storage and memory locking
316
+ Protect: Metadata against traffic analysis using sealed sender, cover traffic, and constant-rate padding
317
+ Protect: Group membership against server enumeration using encrypted member lists with server-blind access control
318
+ Protect: Key material against device extraction using hardware-backed keystore with biometric access requirements
319
+
320
+ Native: rust
321
+ {
322
+ use aes_gcm::{Aes256Gcm, KeyInit, Nonce};
323
+ use aes_gcm::aead::Aead;
324
+ use hkdf::Hkdf;
325
+ use sha2::Sha256;
326
+ use x25519_dalek::{EphemeralSecret, PublicKey, SharedSecret};
327
+
328
+ fn x3dh_key_agreement(
329
+ my_identity: &PrivateKey,
330
+ my_ephemeral: &EphemeralSecret,
331
+ their_identity: &PublicKey,
332
+ their_signed_prekey: &PublicKey,
333
+ their_one_time_prekey: Option<&PublicKey>,
334
+ ) -> ([u8; 32], [u8; 32]) {
335
+ let dh1 = my_identity.diffie_hellman(their_identity);
336
+ let dh2 = my_identity.diffie_hellman(their_signed_prekey);
337
+ let dh3 = my_ephemeral.diffie_hellman(their_signed_prekey);
338
+
339
+ let mut shared_secret = Vec::new();
340
+ shared_secret.extend_from_bytes(dh1.as_bytes());
341
+ shared_secret.extend_from_bytes(dh2.as_bytes());
342
+ shared_secret.extend_from_bytes(dh3.as_bytes());
343
+
344
+ if let Some(otpk) = their_one_time_prekey {
345
+ let dh4 = my_ephemeral.diffie_hellman(otpk);
346
+ shared_secret.extend_from_bytes(dh4.as_bytes());
347
+ }
348
+
349
+ let hkdf = Hkdf::<Sha256>::new(None, &shared_secret);
350
+ let mut root_key = [0u8; 32];
351
+ let mut chain_key = [0u8; 32];
352
+ hkdf.expand(b"root", &mut root_key).unwrap();
353
+ hkdf.expand(b"chain", &mut chain_key).unwrap();
354
+
355
+ (root_key, chain_key)
356
+ }
357
+
358
+ fn ratchet_step(
359
+ root_key: &[u8; 32],
360
+ dh_output: &[u8; 32],
361
+ ) -> ([u8; 32], [u8; 32]) {
362
+ let hkdf = Hkdf::<Sha256>::new(Some(root_key), dh_output);
363
+ let mut new_root = [0u8; 32];
364
+ let mut new_chain = [0u8; 32];
365
+ hkdf.expand(b"root", &mut new_root).unwrap();
366
+ hkdf.expand(b"chain", &mut new_chain).unwrap();
367
+ (new_root, new_chain)
368
+ }
369
+
370
+ fn encrypt_message(
371
+ chain_key: &[u8; 32],
372
+ plaintext: &[u8],
373
+ ) -> (Vec<u8>, [u8; 32]) {
374
+ let hkdf = Hkdf::<Sha256>::new(None, chain_key);
375
+ let mut message_key = [0u8; 32];
376
+ let mut next_chain = [0u8; 32];
377
+ hkdf.expand(b"msg", &mut message_key).unwrap();
378
+ hkdf.expand(b"next", &mut next_chain).unwrap();
379
+
380
+ let cipher = Aes256Gcm::new_from_slice(&message_key).unwrap();
381
+ let nonce = Nonce::from_slice(b"unique nonce"); // Simplified
382
+ let ciphertext = cipher.encrypt(nonce, plaintext).unwrap();
383
+
384
+ (ciphertext, next_chain)
385
+ }
386
+
387
+ fn compute_safety_number(identity_a: &[u8], identity_b: &[u8]) -> String {
388
+ use sha2::Digest;
389
+ let mut hasher = sha2::Sha512::new();
390
+ let (first, second) = if identity_a < identity_b {
391
+ (identity_a, identity_b)
392
+ } else {
393
+ (identity_b, identity_a)
394
+ };
395
+ hasher.update(first);
396
+ hasher.update(second);
397
+ let hash = hasher.finalize();
398
+ format!("{:060}", u64::from_be_bytes(hash[..8].try_into().unwrap()) % 1000000000000000000)
399
+ }
400
+ }