]> gitweb.ps.run Git - matrix_esp_thesis/blob - src/matrix.h
share, save, load, init, print megolm out sessions
[matrix_esp_thesis] / src / matrix.h
1 #ifndef MATRIX__H\r
2 #define MATRIX__H\r
3 \r
4 #include <stdbool.h>\r
5 #include <stdlib.h>\r
6 #include <string.h>\r
7 #include <time.h>\r
8 \r
9 #include <olm/olm.h>\r
10 \r
11 \r
12 \r
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
21 \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
26 \r
27 #define KEY_SHARE_EVENT_LEN 1024\r
28 \r
29 #define OLM_ACCOUNT_MEMORY_SIZE 7528\r
30 #define OLM_ACCOUNT_RANDOM_SIZE (32+32)\r
31 \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
35 \r
36 #define OLM_ONETIME_KEYS_RANDOM_SIZE (32*10)\r
37 #define OLM_KEY_ID_SIZE 32\r
38 \r
39 #define OLM_SIGNATURE_SIZE 128\r
40 \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
45 \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
49 \r
50 #define NUM_MEGOLM_SESSIONS 10\r
51 #define NUM_OLM_SESSIONS 10\r
52 #define NUM_DEVICES 10\r
53 \r
54 // Matrix Device\r
55 \r
56 typedef struct MatrixDevice {\r
57     char deviceId[DEVICE_ID_SIZE];\r
58     char deviceKey[DEVICE_KEY_SIZE];\r
59 } MatrixDevice;\r
60 \r
61 \r
62 // Matrix Olm Account\r
63 \r
64 typedef struct MatrixOlmAccount {\r
65     OlmAccount * account;\r
66     char memory[OLM_ACCOUNT_MEMORY_SIZE];\r
67 } MatrixOlmAccount;\r
68 \r
69 bool\r
70 MatrixOlmAccountInit(\r
71     MatrixOlmAccount * account);\r
72 \r
73 \r
74 // Matrix Olm Session\r
75 \r
76 typedef struct MatrixOlmSession {\r
77     const char * deviceId;\r
78 \r
79     int type;\r
80     OlmSession * session;\r
81     char memory[OLM_SESSION_MEMORY_SIZE];\r
82 } MatrixOlmSession;\r
83 \r
84 bool\r
85 MatrixOlmSessionTo(\r
86     MatrixOlmSession * session,\r
87     OlmAccount * olmAccount,\r
88     const char * deviceId,\r
89     const char * deviceKey,\r
90     const char * deviceOnetimeKey);\r
91 \r
92 bool\r
93 MatrixOlmSessionEncrypt(\r
94     MatrixOlmSession * session,\r
95     const char * plaintext,\r
96     char * outBuffer, int outBufferCap);\r
97 \r
98 \r
99 // Matrix Megolm Session\r
100 \r
101 typedef struct MatrixMegolmInSession {\r
102     OlmInboundGroupSession * session;\r
103 } MatrixMegolmInSession;\r
104 \r
105 typedef struct MatrixMegolmOutSession {\r
106     char roomId[ROOM_ID_SIZE];\r
107 \r
108     OlmOutboundGroupSession * session;\r
109     char memory[MEGOLM_OUTBOUND_SESSION_MEMORY_SIZE];\r
110 \r
111     char id[MEGOLM_SESSION_ID_SIZE];\r
112     char key[MEGOLM_SESSION_KEY_SIZE];\r
113 } MatrixMegolmOutSession;\r
114 \r
115 bool\r
116 MatrixMegolmOutSessionInit(\r
117     MatrixMegolmOutSession * session,\r
118     const char * roomId);\r
119 \r
120 bool\r
121 MatrixMegolmOutSessionEncrypt(\r
122     MatrixMegolmOutSession * session,\r
123     const char * plaintext,\r
124     char * outBuffer, int outBufferCap);\r
125 \r
126 bool\r
127 MatrixMegolmOutSessionSave(\r
128     MatrixMegolmOutSession * session,\r
129     const char * filename,\r
130     const char * key);\r
131     \r
132 bool\r
133 MatrixMegolmOutSessionLoad(\r
134     MatrixMegolmOutSession * session,\r
135     const char * filename,\r
136     const char * key);\r
137 \r
138 \r
139 // Matrix Client\r
140 \r
141 typedef struct MatrixClient {\r
142     MatrixOlmAccount olmAccount;\r
143 \r
144     MatrixMegolmInSession megolmInSessions[NUM_MEGOLM_SESSIONS];\r
145     int numMegolmInSessions;\r
146     MatrixMegolmOutSession megolmOutSessions[NUM_MEGOLM_SESSIONS];\r
147     int numMegolmOutSessions;\r
148     MatrixOlmSession olmSessions[NUM_OLM_SESSIONS];\r
149     int numOlmSessions;\r
150     \r
151     MatrixDevice devices[NUM_DEVICES];\r
152     int numDevices;\r
153     \r
154     char deviceKey[DEVICE_KEY_SIZE];\r
155     char signingKey[DEVICE_KEY_SIZE];\r
156 \r
157     char userId[USER_ID_SIZE];\r
158     char server[SERVER_SIZE];\r
159     char accessToken[ACCESS_TOKEN_SIZE];\r
160     char deviceId[DEVICE_ID_SIZE];\r
161     char expireMs[EXPIRE_MS_SIZE];\r
162     char refreshToken[REFRESH_TOKEN_SIZE];\r
163 \r
164     void * httpUserData;\r
165 } MatrixClient;\r
166 \r
167 bool\r
168 MatrixClientInit(\r
169     MatrixClient * client,\r
170     const char * server);\r
171 \r
172 bool\r
173 MatrixClientSave(\r
174     MatrixClient * client,\r
175     const char * filename);\r
176 \r
177 bool\r
178 MatrixClientLoad(\r
179     MatrixClient * client,\r
180     const char * filename);\r
181 \r
182 bool\r
183 MatrixClientSetAccessToken(\r
184     MatrixClient * client,\r
185     const char * accessToken);\r
186 \r
187 bool\r
188 MatrixClientSetDeviceId(\r
189     MatrixClient * client,\r
190     const char * deviceId);\r
191 \r
192 bool\r
193 MatrixClientSetUserId(\r
194     MatrixClient * client,\r
195     const char * userId);\r
196 \r
197 bool\r
198 MatrixClientGenerateOnetimeKeys(\r
199     MatrixClient * client,\r
200     int numberOfKeys);\r
201 \r
202 bool\r
203 MatrixClientUploadOnetimeKeys(\r
204     MatrixClient * client);\r
205 \r
206 bool\r
207 MatrixClientUploadDeviceKeys(\r
208     MatrixClient * client);\r
209 \r
210 bool\r
211 MatrixClientClaimOnetimeKey(\r
212     MatrixClient * client,\r
213     const char * userId,\r
214     const char * deviceId,\r
215     char * outOnetimeKey, int outOnetimeKeyCap);\r
216 \r
217 bool\r
218 MatrixClientLoginPassword(\r
219     MatrixClient * client,\r
220     const char * username,\r
221     const char * password,\r
222     const char * displayName);\r
223     \r
224 bool\r
225 MatrixClientSendEvent(\r
226     MatrixClient * client,\r
227     const char * roomId,\r
228     const char * msgType,\r
229     const char * msgBody);\r
230     \r
231 bool\r
232 MatrixClientSendEventEncrypted(\r
233     MatrixClient * client,\r
234     const char * roomId,\r
235     const char * msgType,\r
236     const char * msgBody);\r
237 \r
238 bool\r
239 MatrixClientSync(\r
240     MatrixClient * client,\r
241     char * outSync, int outSyncCap);\r
242 \r
243 bool\r
244 MatrixClientShareMegolmOutSession(\r
245     MatrixClient * client,\r
246     const char * userId,\r
247     const char * deviceId,\r
248     MatrixMegolmOutSession * session);\r
249 \r
250 bool\r
251 MatrixClientShareMegolmOutSessionTest(\r
252     MatrixClient * client,\r
253     const char * deviceId,\r
254     MatrixMegolmOutSession * session);\r
255 \r
256 bool\r
257 MatrixClientGetMegolmOutSession(\r
258     MatrixClient * client,\r
259     const char * roomId,\r
260     MatrixMegolmOutSession ** outSession);\r
261 \r
262 bool\r
263 MatrixClientSetMegolmOutSession(\r
264     MatrixClient * client,\r
265     const char * roomId,\r
266     MatrixMegolmOutSession session);\r
267 \r
268 bool\r
269 MatrixClientInitMegolmOutSession(\r
270     MatrixClient * client,\r
271     const char * roomId);\r
272 \r
273 bool\r
274 MatrixClientGetOlmSession(\r
275     MatrixClient * client,\r
276     const char * userId,\r
277     const char * deviceId,\r
278     MatrixOlmSession ** outSession);\r
279 \r
280 bool\r
281 MatrixClientSendToDevice(\r
282     MatrixClient * client,\r
283     const char * userId,\r
284     const char * deviceId,\r
285     const char * message,\r
286     const char * msgType);\r
287 \r
288 bool\r
289 MatrixClientSendToDeviceEncrypted(\r
290     MatrixClient * client,\r
291     const char * userId,\r
292     const char * deviceId,\r
293     const char * message,\r
294     const char * msgType);\r
295 \r
296 bool\r
297 MatrixClientGetDeviceKey(\r
298     MatrixClient * client,\r
299     const char * deviceId,\r
300     char * outDeviceKey, int outDeviceKeyCap);\r
301 \r
302 bool\r
303 MatrixClientGetDeviceKey(\r
304     MatrixClient * client,\r
305     const char * deviceId,\r
306     char * outDeviceKey, int outDeviceKeyCap);\r
307 \r
308 bool\r
309 MatrixClientRequestDeviceKeys(\r
310     MatrixClient * client);\r
311 \r
312 \r
313 \r
314 \r
315 bool\r
316 MatrixHttpInit(\r
317     MatrixClient * client);\r
318 \r
319 bool\r
320 MatrixHttpConnect(\r
321     MatrixClient * client);\r
322 \r
323 bool\r
324 MatrixHttpDeinit(\r
325     MatrixClient * client);\r
326 \r
327 bool\r
328 MatrixHttpGet(\r
329     MatrixClient * client,\r
330     const char * url,\r
331     char * outResponseBuffer, int outResponseCap,\r
332     bool authenticated);\r
333 \r
334 bool\r
335 MatrixHttpPost(\r
336     MatrixClient * client,\r
337     const char * url,\r
338     const char * requestBuffer,\r
339     char * outResponseBuffer, int outResponseCap,\r
340     bool authenticated);\r
341 \r
342 bool\r
343 MatrixHttpPut(\r
344     MatrixClient * client,\r
345     const char * url,\r
346     const char * requestBuffer,\r
347     char * outResponseBuffer, int outResponseCap,\r
348     bool authenticated);\r
349 \r
350 // util\r
351 \r
352 void\r
353 Randomize(uint8_t * random, int randomLen);\r
354 \r
355 bool\r
356 JsonEscape(\r
357     const char * sIn, int sInLen,\r
358     char * sOut, int sOutCap);\r
359     \r
360 bool JsonSign(\r
361     MatrixClient * client,\r
362     const char * sIn, int sInLen,\r
363     char * sOut, int sOutCap);\r
364 \r
365 #endif\r