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