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 128
\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 10
\r
51 #define NUM_OLM_SESSIONS 10
\r
52 #define NUM_DEVICES 10
\r
56 typedef struct MatrixDevice {
\r
57 char deviceId[DEVICE_ID_SIZE];
\r
58 char deviceKey[DEVICE_KEY_SIZE];
\r
59 char signingKey[SIGNING_KEY_SIZE];
\r
63 // Matrix Olm Account
\r
65 typedef struct MatrixOlmAccount {
\r
66 OlmAccount * account;
\r
67 char memory[OLM_ACCOUNT_MEMORY_SIZE];
\r
71 MatrixOlmAccountInit(
\r
72 MatrixOlmAccount * account);
\r
75 MatrixOlmAccountUnpickle(
\r
76 MatrixOlmAccount * account,
\r
77 void * pickled, int pickledLen,
\r
78 const void * key, int keyLen);
\r
81 MatrixOlmAccountGetDeviceKey(
\r
82 MatrixOlmAccount * account,
\r
83 char * key, int keyCap);
\r
86 MatrixOlmAccountGetSigningKey(
\r
87 MatrixOlmAccount * account,
\r
88 char * key, int keyCap);
\r
91 // Matrix Olm Session
\r
93 typedef struct MatrixOlmSession {
\r
94 const char * deviceId; // TODO: char[]
\r
97 OlmSession * session;
\r
98 char memory[OLM_SESSION_MEMORY_SIZE];
\r
102 MatrixOlmSessionUnpickle(
\r
103 MatrixOlmSession * session,
\r
104 const char * deviceId,
\r
105 void * pickled, int pickledLen,
\r
106 const void * key, int keyLen);
\r
109 MatrixOlmSessionTo(
\r
110 MatrixOlmSession * session,
\r
111 OlmAccount * olmAccount,
\r
112 const char * deviceId,
\r
113 const char * deviceKey,
\r
114 const char * deviceOnetimeKey);
\r
117 MatrixOlmSessionEncrypt(
\r
118 MatrixOlmSession * session,
\r
119 const char * plaintext,
\r
120 char * outBuffer, int outBufferCap);
\r
123 MatrixOlmSessionDecrypt(
\r
124 MatrixOlmSession * session,
\r
125 size_t messageType,
\r
127 char * outBuffer, int outBufferCap);
\r
130 // Matrix Megolm Session
\r
132 typedef struct MatrixMegolmInSession {
\r
133 OlmInboundGroupSession * session;
\r
134 } MatrixMegolmInSession;
\r
137 MatrixMegolmInSessionDecrypt(
\r
138 MatrixMegolmInSession * megolmInSession,
\r
139 const char * encrypted,
\r
140 char * outDecrypted, int outDecryptedCap);
\r
142 typedef struct MatrixMegolmOutSession {
\r
143 char roomId[ROOM_ID_SIZE];
\r
145 OlmOutboundGroupSession * session;
\r
146 char memory[MEGOLM_OUTBOUND_SESSION_MEMORY_SIZE];
\r
148 char id[MEGOLM_SESSION_ID_SIZE];
\r
149 char key[MEGOLM_SESSION_KEY_SIZE];
\r
150 } MatrixMegolmOutSession;
\r
153 MatrixMegolmOutSessionInit(
\r
154 MatrixMegolmOutSession * session,
\r
155 const char * roomId);
\r
158 MatrixMegolmOutSessionEncrypt(
\r
159 MatrixMegolmOutSession * session,
\r
160 const char * plaintext,
\r
161 char * outBuffer, int outBufferCap);
\r
164 MatrixMegolmOutSessionSave(
\r
165 MatrixMegolmOutSession * session,
\r
166 const char * filename,
\r
170 MatrixMegolmOutSessionLoad(
\r
171 MatrixMegolmOutSession * session,
\r
172 const char * filename,
\r
178 typedef struct MatrixClient {
\r
179 MatrixOlmAccount olmAccount;
\r
181 MatrixMegolmInSession megolmInSessions[NUM_MEGOLM_SESSIONS];
\r
182 int numMegolmInSessions;
\r
183 MatrixMegolmOutSession megolmOutSessions[NUM_MEGOLM_SESSIONS];
\r
184 int numMegolmOutSessions;
\r
185 MatrixOlmSession olmSessions[NUM_OLM_SESSIONS];
\r
186 int numOlmSessions;
\r
188 MatrixDevice devices[NUM_DEVICES];
\r
191 // char deviceKey[DEVICE_KEY_SIZE];
\r
192 // char signingKey[DEVICE_KEY_SIZE];
\r
194 char userId[USER_ID_SIZE];
\r
195 char server[SERVER_SIZE];
\r
196 char accessToken[ACCESS_TOKEN_SIZE];
\r
197 char deviceId[DEVICE_ID_SIZE];
\r
198 char expireMs[EXPIRE_MS_SIZE];
\r
199 char refreshToken[REFRESH_TOKEN_SIZE];
\r
201 void * httpUserData;
\r
206 MatrixClient * client,
\r
207 const char * server);
\r
211 MatrixClient * client,
\r
212 const char * filename);
\r
216 MatrixClient * client,
\r
217 const char * filename);
\r
220 MatrixClientSetAccessToken(
\r
221 MatrixClient * client,
\r
222 const char * accessToken);
\r
225 MatrixClientSetDeviceId(
\r
226 MatrixClient * client,
\r
227 const char * deviceId);
\r
230 MatrixClientSetUserId(
\r
231 MatrixClient * client,
\r
232 const char * userId);
\r
235 MatrixClientGenerateOnetimeKeys(
\r
236 MatrixClient * client,
\r
240 MatrixClientUploadOnetimeKeys(
\r
241 MatrixClient * client);
\r
244 MatrixClientUploadDeviceKey(
\r
245 MatrixClient * client);
\r
248 MatrixClientClaimOnetimeKey(
\r
249 MatrixClient * client,
\r
250 const char * userId,
\r
251 const char * deviceId,
\r
252 char * outOnetimeKey, int outOnetimeKeyCap);
\r
255 MatrixClientLoginPassword(
\r
256 MatrixClient * client,
\r
257 const char * username,
\r
258 const char * password,
\r
259 const char * displayName);
\r
262 MatrixClientSendEvent(
\r
263 MatrixClient * client,
\r
264 const char * roomId,
\r
265 const char * msgType,
\r
266 const char * msgBody);
\r
269 MatrixClientSendEventEncrypted(
\r
270 MatrixClient * client,
\r
271 const char * roomId,
\r
272 const char * msgType,
\r
273 const char * msgBody);
\r
277 MatrixClient * client,
\r
278 char * outSync, int outSyncCap);
\r
281 MatrixClientGetRoomEvent(
\r
282 MatrixClient * client,
\r
283 const char * roomId,
\r
284 const char * eventId,
\r
285 char * outEvent, int outEventCap);
\r
288 MatrixClientShareMegolmOutSession(
\r
289 MatrixClient * client,
\r
290 const char * userId,
\r
291 const char * deviceId,
\r
292 MatrixMegolmOutSession * session);
\r
295 MatrixClientShareMegolmOutSessionTest(
\r
296 MatrixClient * client,
\r
297 const char * userId,
\r
298 const char * deviceId,
\r
299 MatrixMegolmOutSession * session);
\r
302 MatrixClientGetMegolmOutSession(
\r
303 MatrixClient * client,
\r
304 const char * roomId,
\r
305 MatrixMegolmOutSession ** outSession);
\r
308 MatrixClientSetMegolmOutSession(
\r
309 MatrixClient * client,
\r
310 const char * roomId,
\r
311 MatrixMegolmOutSession session);
\r
314 MatrixClientInitMegolmOutSession(
\r
315 MatrixClient * client,
\r
316 const char * roomId);
\r
319 MatrixClientRequestMegolmInSession(
\r
320 MatrixClient * client,
\r
321 const char * roomId,
\r
322 const char * sessionId,
\r
323 const char * senderKey,
\r
324 const char * userId,
\r
325 const char * deviceId, // TODO: remove deviceId (query all devices)
\r
326 MatrixMegolmInSession * outMegolmInSession);
\r
329 MatrixClientGetOlmSession(
\r
330 MatrixClient * client,
\r
331 const char * userId,
\r
332 const char * deviceId,
\r
333 MatrixOlmSession ** outSession);
\r
336 MatrixClientSendToDevice(
\r
337 MatrixClient * client,
\r
338 const char * userId,
\r
339 const char * deviceId,
\r
340 const char * message,
\r
341 const char * msgType);
\r
344 MatrixClientSendToDeviceEncrypted(
\r
345 MatrixClient * client,
\r
346 const char * userId,
\r
347 const char * deviceId,
\r
348 const char * message,
\r
349 const char * msgType);
\r
352 MatrixClientSendDummy(
\r
353 MatrixClient * client,
\r
354 const char * userId,
\r
355 const char * deviceId);
\r
358 MatrixClientRequestDeviceKey(
\r
359 MatrixClient * client,
\r
360 const char * deviceId,
\r
361 char * outDeviceKey, int outDeviceKeyCap);
\r
364 MatrixClientRequestSigningKey(
\r
365 MatrixClient * client,
\r
366 const char * deviceId,
\r
367 char * outSigningKey, int outSigningKeyCap);
\r
370 MatrixClientRequestDeviceKeys(
\r
371 MatrixClient * client);
\r
374 MatrixClientDeleteDevice(
\r
375 MatrixClient * client);
\r
382 MatrixClient * client);
\r
386 MatrixClient * client);
\r
390 MatrixClient * client);
\r
394 MatrixClient * client,
\r
396 char * outResponseBuffer, int outResponseCap,
\r
397 bool authenticated);
\r
401 MatrixClient * client,
\r
403 const char * requestBuffer,
\r
404 char * outResponseBuffer, int outResponseCap,
\r
405 bool authenticated);
\r
409 MatrixClient * client,
\r
411 const char * requestBuffer,
\r
412 char * outResponseBuffer, int outResponseCap,
\r
413 bool authenticated);
\r
418 Randomize(uint8_t * random, int randomLen);
\r
422 const char * sIn, int sInLen,
\r
423 char * sOut, int sOutCap);
\r
427 MatrixClient * client,
\r
428 const char * sIn, int sInLen,
\r
429 char * sOut, int sOutCap);
\r