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