13 #define USER_ID_SIZE 64
\r
14 #define ROOM_ID_SIZE 128
\r
15 #define SERVER_SIZE 20
\r
16 #define ACCESS_TOKEN_SIZE 40
\r
17 #define DEVICE_ID_SIZE 20
\r
18 #define EXPIRE_MS_SIZE 20
\r
19 #define REFRESH_TOKEN_SIZE 20
\r
20 #define MAX_URL_LEN 1024
\r
22 #define OLM_IDENTITY_KEYS_JSON_SIZE 128
\r
23 #define DEVICE_KEY_SIZE 44
\r
24 #define SIGNING_KEY_SIZE 44
\r
25 #define ONETIME_KEY_SIZE 44
\r
27 #define KEY_SHARE_EVENT_LEN 1024
\r
29 #define OLM_ACCOUNT_MEMORY_SIZE 7528
\r
30 #define OLM_ACCOUNT_RANDOM_SIZE (32+32)
\r
32 #define OLM_SESSION_MEMORY_SIZE 3352
\r
33 #define OLM_ENCRYPT_RANDOM_SIZE 32
\r
34 #define OLM_OUTBOUND_SESSION_RANDOM_SIZE (32*2)
\r
36 #define OLM_ONETIME_KEYS_RANDOM_SIZE (32*10)
\r
37 #define OLM_KEY_ID_SIZE 32
\r
39 #define OLM_SIGNATURE_SIZE 128
\r
41 #define MEGOLM_OUTBOUND_SESSION_MEMORY_SIZE 232
\r
42 #define MEGOLM_SESSION_ID_SIZE 44
\r
43 #define MEGOLM_SESSION_KEY_SIZE 306
\r
44 #define MEGOLM_INIT_RANDOM_SIZE (4*32 + 32)
\r
46 #define JSON_ONETIME_KEY_SIZE 128
\r
47 #define JSON_ONETIME_KEY_SIGNED_SIZE 256
\r
48 #define JSON_SIGNATURE_SIZE 256
\r
50 #define NUM_MEGOLM_SESSIONS 2
\r
51 #define NUM_OLM_SESSIONS 2
\r
52 #define NUM_DEVICES 5
\r
56 typedef struct MatrixHttpConnection MatrixHttpConnection;
\r
60 MatrixHttpConnection ** hc,
\r
64 // MatrixHttpConnect(
\r
65 // MatrixHttpConnection * hc);
\r
69 MatrixHttpConnection ** hc);
\r
72 MatrixHttpSetAccessToken(
\r
73 MatrixHttpConnection * hc,
\r
74 const char * accessToken);
\r
78 MatrixHttpConnection * hc,
\r
80 char * outResponseBuffer, int outResponseCap,
\r
81 bool authenticated);
\r
85 MatrixHttpConnection * hc,
\r
87 const char * requestBuffer,
\r
88 char * outResponseBuffer, int outResponseCap,
\r
89 bool authenticated);
\r
93 MatrixHttpConnection * hc,
\r
95 const char * requestBuffer,
\r
96 char * outResponseBuffer, int outResponseCap,
\r
97 bool authenticated);
\r
103 typedef struct MatrixDevice {
\r
104 char deviceId[DEVICE_ID_SIZE];
\r
105 char deviceKey[DEVICE_KEY_SIZE];
\r
106 char signingKey[SIGNING_KEY_SIZE];
\r
110 // Matrix Olm Account
\r
112 typedef struct MatrixOlmAccount {
\r
113 OlmAccount * account;
\r
114 char memory[OLM_ACCOUNT_MEMORY_SIZE];
\r
115 } MatrixOlmAccount;
\r
118 MatrixOlmAccountInit(
\r
119 MatrixOlmAccount * account);
\r
122 MatrixOlmAccountUnpickle(
\r
123 MatrixOlmAccount * account,
\r
124 void * pickled, int pickledLen,
\r
125 const void * key, int keyLen);
\r
128 MatrixOlmAccountGetDeviceKey(
\r
129 MatrixOlmAccount * account,
\r
130 char * key, int keyCap);
\r
133 MatrixOlmAccountGetSigningKey(
\r
134 MatrixOlmAccount * account,
\r
135 char * key, int keyCap);
\r
138 // Matrix Olm Session
\r
140 typedef struct MatrixOlmSession {
\r
141 const char * deviceId; // TODO: char[]
\r
144 OlmSession * session;
\r
145 char memory[OLM_SESSION_MEMORY_SIZE];
\r
146 } MatrixOlmSession;
\r
149 MatrixOlmSessionUnpickle(
\r
150 MatrixOlmSession * session,
\r
151 const char * deviceId,
\r
152 void * pickled, int pickledLen,
\r
153 const void * key, int keyLen);
\r
156 MatrixOlmSessionFrom(
\r
157 MatrixOlmSession * session,
\r
158 OlmAccount * olmAccount,
\r
159 const char * deviceId,
\r
160 const char * deviceKey,
\r
161 const char * encrypted);
\r
164 MatrixOlmSessionTo(
\r
165 MatrixOlmSession * session,
\r
166 OlmAccount * olmAccount,
\r
167 const char * deviceId,
\r
168 const char * deviceKey,
\r
169 const char * deviceOnetimeKey);
\r
172 MatrixOlmSessionEncrypt(
\r
173 MatrixOlmSession * session,
\r
174 const char * plaintext,
\r
175 char * outBuffer, int outBufferCap);
\r
178 MatrixOlmSessionDecrypt(
\r
179 MatrixOlmSession * session,
\r
180 size_t messageType,
\r
182 char * outBuffer, int outBufferCap);
\r
185 // Matrix Megolm Session
\r
187 typedef struct MatrixMegolmInSession {
\r
188 char roomId[ROOM_ID_SIZE];
\r
189 char id[MEGOLM_SESSION_ID_SIZE];
\r
190 char key[MEGOLM_SESSION_KEY_SIZE];
\r
192 OlmInboundGroupSession * session;
\r
193 char memory[MEGOLM_OUTBOUND_SESSION_MEMORY_SIZE];
\r
195 } MatrixMegolmInSession;
\r
198 MatrixMegolmInSessionInit(
\r
199 MatrixMegolmInSession * session,
\r
200 const char * roomId,
\r
201 const char * sessionId,
\r
202 const char * sessionKey, int sessionKeyLen);
\r
205 MatrixMegolmInSessionDecrypt(
\r
206 MatrixMegolmInSession * session,
\r
207 const char * encrypted, int encryptedLen,
\r
208 char * outDecrypted, int outDecryptedCap);
\r
210 typedef struct MatrixMegolmOutSession {
\r
211 char roomId[ROOM_ID_SIZE];
\r
212 char id[MEGOLM_SESSION_ID_SIZE];
\r
213 char key[MEGOLM_SESSION_KEY_SIZE];
\r
215 OlmOutboundGroupSession * session;
\r
216 char memory[MEGOLM_OUTBOUND_SESSION_MEMORY_SIZE];
\r
217 } MatrixMegolmOutSession;
\r
220 MatrixMegolmOutSessionInit(
\r
221 MatrixMegolmOutSession * session,
\r
222 const char * roomId);
\r
225 MatrixMegolmOutSessionEncrypt(
\r
226 MatrixMegolmOutSession * session,
\r
227 const char * plaintext,
\r
228 char * outBuffer, int outBufferCap);
\r
231 MatrixMegolmOutSessionSave(
\r
232 MatrixMegolmOutSession * session,
\r
233 const char * filename,
\r
237 MatrixMegolmOutSessionLoad(
\r
238 MatrixMegolmOutSession * session,
\r
239 const char * filename,
\r
245 typedef struct MatrixClient {
\r
246 MatrixOlmAccount olmAccount;
\r
248 MatrixMegolmInSession megolmInSessions[NUM_MEGOLM_SESSIONS];
\r
249 int numMegolmInSessions;
\r
250 MatrixMegolmOutSession megolmOutSessions[NUM_MEGOLM_SESSIONS];
\r
251 int numMegolmOutSessions;
\r
252 MatrixOlmSession olmSessions[NUM_OLM_SESSIONS];
\r
253 int numOlmSessions;
\r
255 MatrixDevice devices[NUM_DEVICES];
\r
258 // char deviceKey[DEVICE_KEY_SIZE];
\r
259 // char signingKey[DEVICE_KEY_SIZE];
\r
261 char userId[USER_ID_SIZE];
\r
262 char accessToken[ACCESS_TOKEN_SIZE];
\r
263 char deviceId[DEVICE_ID_SIZE];
\r
264 char expireMs[EXPIRE_MS_SIZE];
\r
265 char refreshToken[REFRESH_TOKEN_SIZE];
\r
267 MatrixHttpConnection * hc;
\r
272 MatrixClient * client);
\r
276 MatrixClient * client,
\r
277 const char * filename);
\r
281 MatrixClient * client,
\r
282 const char * filename);
\r
285 MatrixClientSetAccessToken(
\r
286 MatrixClient * client,
\r
287 const char * accessToken);
\r
290 MatrixClientSetDeviceId(
\r
291 MatrixClient * client,
\r
292 const char * deviceId);
\r
295 MatrixClientSetUserId(
\r
296 MatrixClient * client,
\r
297 const char * userId);
\r
300 MatrixClientGenerateOnetimeKeys(
\r
301 MatrixClient * client,
\r
305 MatrixClientUploadOnetimeKeys(
\r
306 MatrixClient * client);
\r
309 MatrixClientUploadDeviceKey(
\r
310 MatrixClient * client);
\r
313 MatrixClientClaimOnetimeKey(
\r
314 MatrixClient * client,
\r
315 const char * userId,
\r
316 const char * deviceId,
\r
317 char * outOnetimeKey, int outOnetimeKeyCap);
\r
320 MatrixClientLoginPassword(
\r
321 MatrixClient * client,
\r
322 const char * username,
\r
323 const char * password,
\r
324 const char * displayName);
\r
327 MatrixClientSendEvent(
\r
328 MatrixClient * client,
\r
329 const char * roomId,
\r
330 const char * msgType,
\r
331 const char * msgBody);
\r
334 MatrixClientSendEventEncrypted(
\r
335 MatrixClient * client,
\r
336 const char * roomId,
\r
337 const char * msgType,
\r
338 const char * msgBody);
\r
342 MatrixClient * client,
\r
343 char * outSync, int outSyncCap,
\r
344 const char * nextBatch);
\r
347 MatrixClientGetRoomEvent(
\r
348 MatrixClient * client,
\r
349 const char * roomId,
\r
350 const char * eventId,
\r
351 char * outEvent, int outEventCap);
\r
354 MatrixClientShareMegolmOutSession(
\r
355 MatrixClient * client,
\r
356 const char * userId,
\r
357 const char * deviceId,
\r
358 MatrixMegolmOutSession * session);
\r
361 MatrixClientShareMegolmOutSessionTest(
\r
362 MatrixClient * client,
\r
363 const char * userId,
\r
364 const char * deviceId,
\r
365 MatrixMegolmOutSession * session);
\r
368 MatrixClientGetMegolmOutSession(
\r
369 MatrixClient * client,
\r
370 const char * roomId,
\r
371 MatrixMegolmOutSession ** outSession);
\r
374 MatrixClientNewMegolmOutSession(
\r
375 MatrixClient * client,
\r
376 const char * roomId,
\r
377 MatrixMegolmOutSession ** outSession);
\r
380 MatrixClientGetMegolmInSession(
\r
381 MatrixClient * client,
\r
382 const char * roomId, int roomIdLen,
\r
383 const char * sessionId, int sessionIdLen,
\r
384 MatrixMegolmInSession ** outSession);
\r
387 MatrixClientNewMegolmInSession(
\r
388 MatrixClient * client,
\r
389 const char * roomId,
\r
390 const char * sessionId,
\r
391 const char * sessionKey,
\r
392 MatrixMegolmInSession ** outSession);
\r
395 MatrixClientRequestMegolmInSession(
\r
396 MatrixClient * client,
\r
397 const char * roomId,
\r
398 const char * sessionId,
\r
399 const char * senderKey,
\r
400 const char * userId,
\r
401 const char * deviceId); // TODO: remove deviceId (query all devices)
\r
404 MatrixClientGetOlmSession(
\r
405 MatrixClient * client,
\r
406 const char * userId,
\r
407 const char * deviceId,
\r
408 MatrixOlmSession ** outSession);
\r
411 MatrixClientNewOlmSessionIn(
\r
412 MatrixClient * client,
\r
413 const char * userId,
\r
414 const char * deviceId,
\r
415 const char * encrypted,
\r
416 MatrixOlmSession ** outSession);
\r
419 MatrixClientNewOlmSessionOut(
\r
420 MatrixClient * client,
\r
421 const char * userId,
\r
422 const char * deviceId,
\r
423 MatrixOlmSession ** outSession);
\r
426 MatrixClientSendToDevice(
\r
427 MatrixClient * client,
\r
428 const char * userId,
\r
429 const char * deviceId,
\r
430 const char * message,
\r
431 const char * msgType);
\r
434 MatrixClientSendToDeviceEncrypted(
\r
435 MatrixClient * client,
\r
436 const char * userId,
\r
437 const char * deviceId,
\r
438 const char * message,
\r
439 const char * msgType);
\r
442 MatrixClientSendDummy(
\r
443 MatrixClient * client,
\r
444 const char * userId,
\r
445 const char * deviceId);
\r
448 MatrixClientRequestDeviceKey(
\r
449 MatrixClient * client,
\r
450 const char * deviceId,
\r
451 char * outDeviceKey, int outDeviceKeyCap);
\r
454 MatrixClientRequestSigningKey(
\r
455 MatrixClient * client,
\r
456 const char * deviceId,
\r
457 char * outSigningKey, int outSigningKeyCap);
\r
460 MatrixClientRequestDeviceKeys(
\r
461 MatrixClient * client);
\r
464 MatrixClientDeleteDevice(
\r
465 MatrixClient * client);
\r
471 Randomize(uint8_t * random, int randomLen);
\r
475 const char * sIn, int sInLen,
\r
476 char * sOut, int sOutCap);
\r
480 const char * sIn, int sInLen,
\r
481 char * sOut, int sOutCap);
\r
485 MatrixClient * client,
\r
486 const char * sIn, int sInLen,
\r
487 char * sOut, int sOutCap);
\r