]> gitweb.ps.run Git - matrix_esp_thesis/blob - examples/Decrypt.c
start working on Sync example (reply to to_device messages)
[matrix_esp_thesis] / examples / Decrypt.c
1 #include <matrix.h>\r
2 #include <stdio.h>\r
3 \r
4 #include <olm/sas.h>\r
5 \r
6 #define SERVER       "https://matrix.org"\r
7 #define USER_ID      "@pscho:matrix.org"\r
8 #define DEVICE_ID    "ULZZOKJBYN"\r
9 #define SENDER_KEY   "LvVdoHsRRWNxRmG2GO2vky6o6S8RzADpPAaELsd1rjU"\r
10 #define ROOM_ID      "!XKFUjAsGrSSrpDFIxB:matrix.org"\r
11 #define EVENT_ID     "$_-y42DkC3OmJ_s40gYko7jMwrUQhoXfEut2pMV3E2J8"\r
12 #define SESSION_ID   "tzdnJbDrm82D/RpgkZKpILTifQ5Rads+tVzp3ax8+Ls"\r
13 \r
14 void\r
15 GetLine(char * buffer, int n) {\r
16     int c;\r
17     int len = 0;\r
18 \r
19     while ((c = getchar()) != '\n' && len < n-1)\r
20         buffer[len++] = c;\r
21     \r
22     buffer[len] = '\0';\r
23 }\r
24 \r
25 int\r
26 main(void)\r
27 {\r
28     MatrixClient client;\r
29     MatrixClientInit(&client,\r
30         SERVER);\r
31     \r
32     MatrixHttpInit(&client);\r
33 \r
34     MatrixClientSetUserId(&client, USER_ID);\r
35 \r
36     MatrixClientLoginPassword(&client,\r
37         "pscho",\r
38         "Wc23EbmB9G3faMq",\r
39         "Test1");\r
40 \r
41     printf("deviceId: %s\n", client.deviceId);\r
42 \r
43     MatrixClientGenerateOnetimeKeys(&client, 10);\r
44     MatrixClientUploadOnetimeKeys(&client);\r
45     MatrixClientUploadDeviceKey(&client);\r
46 \r
47     static char eventBuffer[1024];\r
48     MatrixClientGetRoomEvent(&client,\r
49         ROOM_ID,\r
50         EVENT_ID,\r
51         eventBuffer, 1024);\r
52     \r
53     printf("event: %s\n", eventBuffer);\r
54 \r
55     // verify\r
56     char theirDeviceKey[DEVICE_KEY_SIZE];\r
57     MatrixClientRequestDeviceKey(&client,\r
58         DEVICE_ID,\r
59         theirDeviceKey, DEVICE_KEY_SIZE);\r
60     \r
61     char transactionId[256];\r
62     GetLine(transactionId, 128);\r
63 \r
64     char verificationReadyBuffer[2048];\r
65     snprintf(verificationReadyBuffer, 2048,\r
66         "{"\r
67         "\"from_device\":\"%s\","\r
68         "\"methods\":[\"m.sas.v1\"],"\r
69         "\"transaction_id\":\"%s\""\r
70         "}",\r
71         client.deviceId,\r
72         transactionId);\r
73     \r
74     MatrixClientSendToDevice(&client,\r
75         USER_ID,\r
76         DEVICE_ID,\r
77         verificationReadyBuffer,\r
78         "m.key.verification.ready");\r
79     \r
80     OlmSAS * olmSas = olm_sas(malloc(olm_sas_size()));\r
81     void * sasRandomBytes = malloc(olm_create_sas_random_length(olmSas));\r
82     olm_create_sas(olmSas,\r
83         sasRandomBytes,\r
84         olm_create_sas_random_length(olmSas));\r
85     \r
86     OlmUtility * olmUtil = olm_utility(malloc(olm_utility_size()));\r
87     \r
88     char publicKey[128];\r
89     char keyStartJson[1024];\r
90     char concat[1024];\r
91     char commitment[256];\r
92     olm_sas_get_pubkey(olmSas,\r
93         publicKey,\r
94         128);\r
95     GetLine(keyStartJson, 1024);\r
96     printf("keyStartJson: %s\n", keyStartJson);\r
97     int concatLen =\r
98         snprintf(concat, 1024, "%s%s", publicKey, keyStartJson);\r
99     printf("concat: %s\n", concat);\r
100     olm_sha256(olmUtil, concat, strlen(concat), commitment, 256);\r
101     printf("hash: %s\n", commitment);\r
102     \r
103     char verificationAcceptBuffer[2048];\r
104     snprintf(verificationAcceptBuffer, 2048,\r
105         "{"\r
106         "\"commitment\":\"%s\","\r
107         "\"hash\":\"sha256\","\r
108         "\"key_agreement_protocol\":\"curve25519\","\r
109         "\"message_authentication_code\":\"hkdf-hmac-sha256.v2\","\r
110         "\"method\":\"m.sas.v1\","\r
111         "\"short_authentication_string\":[\"decimal\"],"\r
112         "\"transaction_id\":\"%s\""\r
113         "}",\r
114         commitment,\r
115         transactionId);\r
116     \r
117     MatrixClientSendToDevice(&client,\r
118         USER_ID,\r
119         DEVICE_ID,\r
120         verificationAcceptBuffer,\r
121         "m.key.verification.accept");\r
122     \r
123     char theirPublicKey[128];\r
124     GetLine(theirPublicKey, 128);\r
125     olm_sas_set_their_key(olmSas, theirPublicKey, strlen(theirPublicKey));\r
126     \r
127     char verificationKeyBuffer[2048];\r
128     snprintf(verificationKeyBuffer, 2048,\r
129         "{"\r
130         "\"key\":\"%s\","\r
131         "\"transaction_id\":\"%s\""\r
132         "}",\r
133         publicKey,\r
134         transactionId);\r
135     \r
136     MatrixClientSendToDevice(&client,\r
137         USER_ID,\r
138         DEVICE_ID,\r
139         verificationKeyBuffer,\r
140         "m.key.verification.key");\r
141 \r
142     char hkdfInfo[1024];\r
143     int hkdfInfoLen =\r
144         snprintf(hkdfInfo, 1024,\r
145             "MATRIX_KEY_VERIFICATION_SAS%s%s%s%s%s",\r
146             USER_ID,\r
147             DEVICE_ID,\r
148             USER_ID,\r
149             client.deviceId,\r
150             transactionId);\r
151 \r
152     unsigned char sasBytes[5];\r
153     olm_sas_generate_bytes(olmSas,\r
154         hkdfInfo, hkdfInfoLen,\r
155         sasBytes, 5);\r
156     int b0 = sasBytes[0];\r
157     int b1 = sasBytes[1];\r
158     int b2 = sasBytes[2];\r
159     int b3 = sasBytes[3];\r
160     int b4 = sasBytes[4];\r
161     \r
162     printf("%d %d %d %d %d\n", b0, b1, b2, b3, b4);\r
163 \r
164     // https://spec.matrix.org/v1.7/client-server-api/#sas-method-decimal\r
165     printf("%d | %d | %d\n",\r
166         (b0 << 5 | b1 >> 3) + 1000,\r
167         ((b1 & 0x7) << 10 | b2 << 2 | b3 >> 6) + 1000,\r
168         ((b3 & 0x3F) << 7 | b4 >> 1) + 1000);\r
169     printf("%d | %d | %d\n",\r
170         ((b0 << 5) | (b1 >> 3)) + 1000,\r
171         (((b1 & 0x7) << 10) | (b2 << 2) | (b3 >> 6)) + 1000,\r
172         (((b3 & 0x3F) << 7) | (b4 >> 1)) + 1000);\r
173     \r
174     // mac\r
175     const char * masterKey = "vt8tJ5/SxqkvXS+XoGxr+4rJNe8fJfZT3/e/FTwlFsI";\r
176 \r
177     char keyList[1024];\r
178     char keyListMac[1024];\r
179     char key1Id[1024];\r
180     char key1[1024];\r
181     char key1Mac[1024];\r
182     char key2Id[1024];\r
183     char key2[1024];\r
184     char key2Mac[1024];\r
185 \r
186     if (strcmp(masterKey, client.deviceId) < 0) {\r
187         //strcpy(key1Id, masterKey);\r
188         snprintf(key1Id, 1024, "ed25519:%s", masterKey);\r
189         strcpy(key1, masterKey);\r
190         //strcpy(key2Id, client.deviceId);\r
191         snprintf(key2Id, 1024, "ed25519:%s", client.deviceId);\r
192         MatrixOlmAccountGetSigningKey(&client.olmAccount, key2, 1024);\r
193     }\r
194     else {\r
195         //strcpy(key1Id, client.deviceId);\r
196         snprintf(key1Id, 1024, "ed25519:%s", client.deviceId);\r
197         MatrixOlmAccountGetSigningKey(&client.olmAccount, key1, 1024);\r
198         //strcpy(key2Id, masterKey);\r
199         snprintf(key2Id, 1024, "ed25519:%s", masterKey);\r
200         strcpy(key2, masterKey);\r
201     }\r
202 \r
203     snprintf(keyList, 1024,\r
204         "%s,%s", key1Id, key2Id);\r
205     \r
206     char macInfo[1024];\r
207     int macInfoLen;\r
208     {\r
209         macInfoLen =\r
210             snprintf(macInfo, 1024,\r
211                 "MATRIX_KEY_VERIFICATION_MAC%s%s%s%s%s%s",\r
212                 USER_ID,\r
213                 client.deviceId,\r
214                 USER_ID,\r
215                 DEVICE_ID,\r
216                 transactionId,\r
217                 "KEY_IDS");\r
218         olm_sas_calculate_mac_fixed_base64(olmSas, keyList, strlen(keyList), macInfo, macInfoLen, keyListMac, 1024);\r
219     }\r
220     {\r
221         macInfoLen =\r
222             snprintf(macInfo, 1024,\r
223                 "MATRIX_KEY_VERIFICATION_MAC%s%s%s%s%s%s",\r
224                 USER_ID,\r
225                 client.deviceId,\r
226                 USER_ID,\r
227                 DEVICE_ID,\r
228                 transactionId,\r
229                 key1Id);\r
230         olm_sas_calculate_mac_fixed_base64(olmSas, key1, strlen(key1), macInfo, macInfoLen, key1Mac, 1024);\r
231     }\r
232     {\r
233         macInfoLen =\r
234             snprintf(macInfo, 1024,\r
235                 "MATRIX_KEY_VERIFICATION_MAC%s%s%s%s%s%s",\r
236                 USER_ID,\r
237                 client.deviceId,\r
238                 USER_ID,\r
239                 DEVICE_ID,\r
240                 transactionId,\r
241                 key2Id);\r
242         olm_sas_calculate_mac_fixed_base64(olmSas, key2, strlen(key2), macInfo, macInfoLen, key2Mac, 1024);\r
243     }\r
244 \r
245     printf("send mac:");\r
246     getchar();\r
247 \r
248     char verificationMacBuffer[2048];\r
249     snprintf(verificationMacBuffer, 2048,\r
250         "{"\r
251         "\"keys\":\"%s\","\r
252         "\"mac\":{"\r
253         "\"%s\":\"%s\","\r
254         "\"%s\":\"%s\""\r
255         "},"\r
256         "\"transaction_id\":\"%s\""\r
257         "}",\r
258         keyListMac,\r
259         key1Id,\r
260         key1Mac,\r
261         key2Id,\r
262         key2Mac,\r
263         transactionId);\r
264     \r
265     MatrixClientSendToDevice(&client,\r
266         USER_ID,\r
267         DEVICE_ID,\r
268         verificationMacBuffer,\r
269         "m.key.verification.mac");\r
270 \r
271     printf("send done:");\r
272     getchar();\r
273 \r
274     char verificationDoneBuffer[2048];\r
275     snprintf(verificationDoneBuffer, 2048,\r
276         "{"\r
277         "\"transaction_id\":\"%s\""\r
278         "}",\r
279         transactionId);\r
280     \r
281     MatrixClientSendToDevice(&client,\r
282         USER_ID,\r
283         DEVICE_ID,\r
284         verificationDoneBuffer,\r
285         "m.key.verification.done");\r
286     \r
287     // done\r
288 \r
289     // request room key\r
290 \r
291     getchar();\r
292     \r
293     MatrixMegolmInSession megolmSession;\r
294     \r
295     MatrixClientRequestMegolmInSession(&client,\r
296         ROOM_ID,\r
297         SESSION_ID,\r
298         SENDER_KEY,\r
299         USER_ID,\r
300         DEVICE_ID,\r
301         &megolmSession);\r
302 \r
303     // // decrypt room key\r
304 \r
305     MatrixOlmSession * olmSession;\r
306     MatrixClientGetOlmSession(&client,\r
307         USER_ID,\r
308         DEVICE_ID,\r
309         &olmSession);\r
310     static char encrypted[2048];\r
311     static char decrypted[2048];\r
312     printf("encrypted:");\r
313     gets(encrypted);\r
314     printf("(%d) %s;\n", strlen(encrypted), encrypted);\r
315     MatrixOlmSessionDecrypt(olmSession,\r
316         1, encrypted, decrypted, 2048);\r
317     printf("decrypted: %s\n", decrypted);\r
318 \r
319     // int c;\r
320     // while ((c = getchar()) != 'q') {\r
321     //     printf("c: %c (%d)\n", c, c);\r
322     //     static char syncBuffer[40000];\r
323     //     MatrixClientSync(&client,\r
324     //         syncBuffer, 40000);\r
325     //     printf("sync: %s", syncBuffer);\r
326     // }\r
327 \r
328 \r
329     // static char decryptedBuffer[1024];\r
330     // MatrixMegolmInSessionDecrypt(&megolmSession,\r
331     //     eventBuffer,\r
332     //     decryptedBuffer, 1024);\r
333 \r
334     // printf("%s\n", decryptedBuffer);\r
335 \r
336     getchar();\r
337 \r
338     MatrixClientDeleteDevice(&client);\r
339         \r
340     MatrixHttpDeinit(&client);\r
341 \r
342     return 0;\r
343 }\r