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
15 GetLine(char * buffer, int n) {
\r
19 while ((c = getchar()) != '\n' && len < n-1)
\r
28 MatrixClient client;
\r
29 MatrixClientInit(&client,
\r
32 MatrixHttpInit(&client);
\r
34 MatrixClientSetUserId(&client, USER_ID);
\r
36 MatrixClientLoginPassword(&client,
\r
41 printf("deviceId: %s\n", client.deviceId);
\r
43 MatrixClientGenerateOnetimeKeys(&client, 10);
\r
44 MatrixClientUploadOnetimeKeys(&client);
\r
45 MatrixClientUploadDeviceKey(&client);
\r
47 static char eventBuffer[1024];
\r
48 MatrixClientGetRoomEvent(&client,
\r
53 printf("event: %s\n", eventBuffer);
\r
56 // char theirDeviceKey[DEVICE_KEY_SIZE];
\r
57 // MatrixClientRequestDeviceKey(&client,
\r
59 // theirDeviceKey, DEVICE_KEY_SIZE);
\r
61 char transactionId[256];
\r
62 GetLine(transactionId, 128);
\r
64 char verificationReadyBuffer[2048];
\r
65 snprintf(verificationReadyBuffer, 2048,
\r
67 "\"from_device\":\"%s\","
\r
68 "\"methods\":[\"m.sas.v1\"],"
\r
69 "\"transaction_id\":\"%s\""
\r
74 MatrixClientSendToDevice(&client,
\r
77 verificationReadyBuffer,
\r
78 "m.key.verification.ready");
\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
84 olm_create_sas_random_length(olmSas));
\r
86 OlmUtility * olmUtil = olm_utility(malloc(olm_utility_size()));
\r
88 char publicKey[128];
\r
89 char keyStartJson[1024];
\r
91 char commitment[256];
\r
92 olm_sas_get_pubkey(olmSas,
\r
95 GetLine(keyStartJson, 1024);
\r
96 printf("keyStartJson: %s\n", keyStartJson);
\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
103 char verificationAcceptBuffer[2048];
\r
104 snprintf(verificationAcceptBuffer, 2048,
\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
117 MatrixClientSendToDevice(&client,
\r
120 verificationAcceptBuffer,
\r
121 "m.key.verification.accept");
\r
123 char theirPublicKey[128];
\r
124 GetLine(theirPublicKey, 128);
\r
125 olm_sas_set_their_key(olmSas, theirPublicKey, strlen(theirPublicKey));
\r
127 char verificationKeyBuffer[2048];
\r
128 snprintf(verificationKeyBuffer, 2048,
\r
131 "\"transaction_id\":\"%s\""
\r
136 MatrixClientSendToDevice(&client,
\r
139 verificationKeyBuffer,
\r
140 "m.key.verification.key");
\r
142 char hkdfInfo[1024];
\r
144 snprintf(hkdfInfo, 1024,
\r
145 "MATRIX_KEY_VERIFICATION_SAS%s%s%s%s%s",
\r
152 unsigned char sasBytes[5];
\r
153 olm_sas_generate_bytes(olmSas,
\r
154 hkdfInfo, hkdfInfoLen,
\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
162 printf("%d %d %d %d %d\n", b0, b1, b2, b3, b4);
\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
175 const char * masterKey = "vt8tJ5/SxqkvXS+XoGxr+4rJNe8fJfZT3/e/FTwlFsI";
\r
177 char keyList[1024];
\r
178 char keyListMac[1024];
\r
181 char key1Mac[1024];
\r
184 char key2Mac[1024];
\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
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
203 snprintf(keyList, 1024,
\r
204 "%s,%s", key1Id, key2Id);
\r
206 char macInfo[1024];
\r
210 snprintf(macInfo, 1024,
\r
211 "MATRIX_KEY_VERIFICATION_MAC%s%s%s%s%s%s",
\r
218 olm_sas_calculate_mac_fixed_base64(olmSas, keyList, strlen(keyList), macInfo, macInfoLen, keyListMac, 1024);
\r
222 snprintf(macInfo, 1024,
\r
223 "MATRIX_KEY_VERIFICATION_MAC%s%s%s%s%s%s",
\r
230 olm_sas_calculate_mac_fixed_base64(olmSas, key1, strlen(key1), macInfo, macInfoLen, key1Mac, 1024);
\r
234 snprintf(macInfo, 1024,
\r
235 "MATRIX_KEY_VERIFICATION_MAC%s%s%s%s%s%s",
\r
242 olm_sas_calculate_mac_fixed_base64(olmSas, key2, strlen(key2), macInfo, macInfoLen, key2Mac, 1024);
\r
245 printf("send mac:");
\r
248 char verificationMacBuffer[2048];
\r
249 snprintf(verificationMacBuffer, 2048,
\r
256 "\"transaction_id\":\"%s\""
\r
265 MatrixClientSendToDevice(&client,
\r
268 verificationMacBuffer,
\r
269 "m.key.verification.mac");
\r
271 printf("send done:");
\r
274 char verificationDoneBuffer[2048];
\r
275 snprintf(verificationDoneBuffer, 2048,
\r
277 "\"transaction_id\":\"%s\""
\r
281 MatrixClientSendToDevice(&client,
\r
284 verificationDoneBuffer,
\r
285 "m.key.verification.done");
\r
289 // request room key
\r
293 MatrixMegolmInSession megolmSession;
\r
295 MatrixClientRequestMegolmInSession(&client,
\r
303 // // decrypt room key
\r
305 MatrixOlmSession * olmSession;
\r
306 MatrixClientGetOlmSession(&client,
\r
310 static char encrypted[2048];
\r
311 static char decrypted[2048];
\r
312 printf("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
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
329 // static char decryptedBuffer[1024];
\r
330 // MatrixMegolmInSessionDecrypt(&megolmSession,
\r
332 // decryptedBuffer, 1024);
\r
334 // printf("%s\n", decryptedBuffer);
\r
338 MatrixClientDeleteDevice(&client);
\r
340 MatrixHttpDeinit(&client);
\r