]> gitweb.ps.run Git - matrix_esp_thesis/blob - src/matrix.h
91ed208623a94804b5a398726a74c56dc8cc7e2e
[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 \r
126 // Matrix Client\r
127 \r
128 typedef struct MatrixClient {\r
129     MatrixOlmAccount olmAccount;\r
130 \r
131     MatrixMegolmInSession megolmInSessions[NUM_MEGOLM_SESSIONS];\r
132     int numMegolmInSessions;\r
133     MatrixMegolmOutSession megolmOutSessions[NUM_MEGOLM_SESSIONS];\r
134     int numMegolmOutSessions;\r
135     MatrixOlmSession olmSessions[NUM_OLM_SESSIONS];\r
136     int numOlmSessions;\r
137     \r
138     MatrixDevice devices[NUM_DEVICES];\r
139     int numDevices;\r
140     \r
141     char deviceKey[DEVICE_KEY_SIZE];\r
142     char signingKey[DEVICE_KEY_SIZE];\r
143 \r
144     char userId[USER_ID_SIZE];\r
145     char server[SERVER_SIZE];\r
146     char accessToken[ACCESS_TOKEN_SIZE];\r
147     char deviceId[DEVICE_ID_SIZE];\r
148     char expireMs[EXPIRE_MS_SIZE];\r
149     char refreshToken[REFRESH_TOKEN_SIZE];\r
150 \r
151     void * httpUserData;\r
152 } MatrixClient;\r
153 \r
154 bool\r
155 MatrixClientInit(\r
156     MatrixClient * client,\r
157     const char * server);\r
158 \r
159 bool\r
160 MatrixClientSave(\r
161     MatrixClient * client,\r
162     const char * filename);\r
163 \r
164 bool\r
165 MatrixClientLoad(\r
166     MatrixClient * client,\r
167     const char * filename);\r
168 \r
169 bool\r
170 MatrixClientSetAccessToken(\r
171     MatrixClient * client,\r
172     const char * accessToken);\r
173 \r
174 bool\r
175 MatrixClientSetDeviceId(\r
176     MatrixClient * client,\r
177     const char * deviceId);\r
178 \r
179 bool\r
180 MatrixClientSetUserId(\r
181     MatrixClient * client,\r
182     const char * userId);\r
183 \r
184 bool\r
185 MatrixClientGenerateOnetimeKeys(\r
186     MatrixClient * client,\r
187     int numberOfKeys);\r
188 \r
189 bool\r
190 MatrixClientUploadOnetimeKeys(\r
191     MatrixClient * client);\r
192 \r
193 bool\r
194 MatrixClientUploadDeviceKeys(\r
195     MatrixClient * client);\r
196 \r
197 bool\r
198 MatrixClientClaimOnetimeKey(\r
199     MatrixClient * client,\r
200     const char * userId,\r
201     const char * deviceId,\r
202     char * outOnetimeKey, int outOnetimeKeyCap);\r
203 \r
204 bool\r
205 MatrixClientLoginPassword(\r
206     MatrixClient * client,\r
207     const char * username,\r
208     const char * password,\r
209     const char * displayName);\r
210     \r
211 bool\r
212 MatrixClientSendEvent(\r
213     MatrixClient * client,\r
214     const char * roomId,\r
215     const char * msgType,\r
216     const char * msgBody);\r
217     \r
218 bool\r
219 MatrixClientSendEventEncrypted(\r
220     MatrixClient * client,\r
221     const char * roomId,\r
222     const char * msgType,\r
223     const char * msgBody);\r
224 \r
225 bool\r
226 MatrixClientSync(\r
227     MatrixClient * client,\r
228     char * outSync, int outSyncCap);\r
229 \r
230 bool\r
231 MatrixClientShareMegolmOutSession(\r
232     MatrixClient * client,\r
233     const char * userId,\r
234     const char * deviceId,\r
235     MatrixMegolmOutSession * session);\r
236 \r
237 bool\r
238 MatrixClientShareMegolmOutSessionTest(\r
239     MatrixClient * client,\r
240     const char * deviceId,\r
241     MatrixMegolmOutSession * session);\r
242 \r
243 bool\r
244 MatrixClientGetMegolmOutSession(\r
245     MatrixClient * client,\r
246     const char * roomId,\r
247     MatrixMegolmOutSession ** outSession);\r
248 \r
249 bool\r
250 MatrixClientSetMegolmOutSession(\r
251     MatrixClient * client,\r
252     const char * roomId,\r
253     MatrixMegolmOutSession session);\r
254 \r
255 bool\r
256 MatrixClientGetOlmSession(\r
257     MatrixClient * client,\r
258     const char * userId,\r
259     const char * deviceId,\r
260     MatrixOlmSession ** outSession);\r
261 \r
262 bool\r
263 MatrixClientSendToDevice(\r
264     MatrixClient * client,\r
265     const char * userId,\r
266     const char * deviceId,\r
267     const char * message,\r
268     const char * msgType);\r
269 \r
270 bool\r
271 MatrixClientSendToDeviceEncrypted(\r
272     MatrixClient * client,\r
273     const char * userId,\r
274     const char * deviceId,\r
275     const char * message,\r
276     const char * msgType);\r
277 \r
278 bool\r
279 MatrixClientGetDeviceKey(\r
280     MatrixClient * client,\r
281     const char * deviceId,\r
282     char * outDeviceKey, int outDeviceKeyCap);\r
283 \r
284 bool\r
285 MatrixClientGetDeviceKey(\r
286     MatrixClient * client,\r
287     const char * deviceId,\r
288     char * outDeviceKey, int outDeviceKeyCap);\r
289 \r
290 bool\r
291 MatrixClientRequestDeviceKeys(\r
292     MatrixClient * client);\r
293 \r
294 \r
295 \r
296 \r
297 bool\r
298 MatrixHttpInit(\r
299     MatrixClient * client);\r
300 \r
301 bool\r
302 MatrixHttpConnect(\r
303     MatrixClient * client);\r
304 \r
305 bool\r
306 MatrixHttpDeinit(\r
307     MatrixClient * client);\r
308 \r
309 bool\r
310 MatrixHttpGet(\r
311     MatrixClient * client,\r
312     const char * url,\r
313     char * outResponseBuffer, int outResponseCap,\r
314     bool authenticated);\r
315 \r
316 bool\r
317 MatrixHttpPost(\r
318     MatrixClient * client,\r
319     const char * url,\r
320     const char * requestBuffer,\r
321     char * outResponseBuffer, int outResponseCap,\r
322     bool authenticated);\r
323 \r
324 bool\r
325 MatrixHttpPut(\r
326     MatrixClient * client,\r
327     const char * url,\r
328     const char * requestBuffer,\r
329     char * outResponseBuffer, int outResponseCap,\r
330     bool authenticated);\r
331 \r
332 // util\r
333 \r
334 void\r
335 Randomize(uint8_t * random, int randomLen);\r
336 \r
337 bool\r
338 JsonEscape(\r
339     const char * sIn, int sInLen,\r
340     char * sOut, int sOutCap);\r
341     \r
342 bool JsonSign(\r
343     MatrixClient * client,\r
344     const char * sIn, int sInLen,\r
345     char * sOut, int sOutCap);\r
346 \r
347 #endif\r