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
31 MatrixHttpInit(&client.hc, SERVER);
\r
33 MatrixClientSetUserId(&client, USER_ID);
\r
35 MatrixClientLoginPassword(&client,
\r
40 printf("deviceId: %s\n", client.deviceId);
\r
42 MatrixClientGenerateOnetimeKeys(&client, 10);
\r
43 MatrixClientUploadOnetimeKeys(&client);
\r
44 MatrixClientUploadDeviceKeys(&client);
\r
46 static char eventBuffer[1024];
\r
47 MatrixClientGetRoomEvent(&client,
\r
52 printf("event: %s\n", eventBuffer);
\r
55 // char theirDeviceKey[DEVICE_KEY_SIZE];
\r
56 // MatrixClientRequestDeviceKey(&client,
\r
58 // theirDeviceKey, DEVICE_KEY_SIZE);
\r
60 char transactionId[256];
\r
61 GetLine(transactionId, 128);
\r
63 char verificationReadyBuffer[2048];
\r
64 snprintf(verificationReadyBuffer, 2048,
\r
66 "\"from_device\":\"%s\","
\r
67 "\"methods\":[\"m.sas.v1\"],"
\r
68 "\"transaction_id\":\"%s\""
\r
73 MatrixClientSendToDevice(&client,
\r
76 verificationReadyBuffer,
\r
77 "m.key.verification.ready");
\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
83 olm_create_sas_random_length(olmSas));
\r
85 OlmUtility * olmUtil = olm_utility(malloc(olm_utility_size()));
\r
87 char publicKey[128];
\r
88 char keyStartJson[1024];
\r
90 char commitment[256];
\r
91 olm_sas_get_pubkey(olmSas,
\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
101 char verificationAcceptBuffer[2048];
\r
102 snprintf(verificationAcceptBuffer, 2048,
\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
115 MatrixClientSendToDevice(&client,
\r
118 verificationAcceptBuffer,
\r
119 "m.key.verification.accept");
\r
121 char theirPublicKey[128];
\r
122 GetLine(theirPublicKey, 128);
\r
123 olm_sas_set_their_key(olmSas, theirPublicKey, strlen(theirPublicKey));
\r
125 char verificationKeyBuffer[2048];
\r
126 snprintf(verificationKeyBuffer, 2048,
\r
129 "\"transaction_id\":\"%s\""
\r
134 MatrixClientSendToDevice(&client,
\r
137 verificationKeyBuffer,
\r
138 "m.key.verification.key");
\r
140 char hkdfInfo[1024];
\r
142 snprintf(hkdfInfo, 1024,
\r
143 "MATRIX_KEY_VERIFICATION_SAS%s%s%s%s%s",
\r
150 unsigned char sasBytes[5];
\r
151 olm_sas_generate_bytes(olmSas,
\r
152 hkdfInfo, hkdfInfoLen,
\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
160 printf("%d %d %d %d %d\n", b0, b1, b2, b3, b4);
\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
173 const char * masterKey = "vt8tJ5/SxqkvXS+XoGxr+4rJNe8fJfZT3/e/FTwlFsI";
\r
175 char keyList[1024];
\r
176 char keyListMac[1024];
\r
179 char key1Mac[1024];
\r
182 char key2Mac[1024];
\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
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
201 snprintf(keyList, 1024,
\r
202 "%s,%s", key1Id, key2Id);
\r
204 char macInfo[1024];
\r
208 snprintf(macInfo, 1024,
\r
209 "MATRIX_KEY_VERIFICATION_MAC%s%s%s%s%s%s",
\r
216 olm_sas_calculate_mac_fixed_base64(olmSas, keyList, strlen(keyList), macInfo, macInfoLen, keyListMac, 1024);
\r
220 snprintf(macInfo, 1024,
\r
221 "MATRIX_KEY_VERIFICATION_MAC%s%s%s%s%s%s",
\r
228 olm_sas_calculate_mac_fixed_base64(olmSas, key1, strlen(key1), macInfo, macInfoLen, key1Mac, 1024);
\r
232 snprintf(macInfo, 1024,
\r
233 "MATRIX_KEY_VERIFICATION_MAC%s%s%s%s%s%s",
\r
240 olm_sas_calculate_mac_fixed_base64(olmSas, key2, strlen(key2), macInfo, macInfoLen, key2Mac, 1024);
\r
243 printf("send mac:");
\r
246 char verificationMacBuffer[2048];
\r
247 snprintf(verificationMacBuffer, 2048,
\r
254 "\"transaction_id\":\"%s\""
\r
263 MatrixClientSendToDevice(&client,
\r
266 verificationMacBuffer,
\r
267 "m.key.verification.mac");
\r
269 printf("send done:");
\r
272 char verificationDoneBuffer[2048];
\r
273 snprintf(verificationDoneBuffer, 2048,
\r
275 "\"transaction_id\":\"%s\""
\r
279 MatrixClientSendToDevice(&client,
\r
282 verificationDoneBuffer,
\r
283 "m.key.verification.done");
\r
287 // request room key
\r
291 MatrixClientRequestMegolmInSession(&client,
\r
298 // // decrypt room key
\r
300 MatrixOlmSession * olmSession;
\r
301 MatrixClientGetOlmSession(&client,
\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
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
324 // static char decryptedBuffer[1024];
\r
325 // MatrixMegolmInSessionDecrypt(&megolmSession,
\r
327 // decryptedBuffer, 1024);
\r
329 // printf("%s\n", decryptedBuffer);
\r
333 MatrixClientDeleteDevice(&client);
\r
335 MatrixHttpDeinit(&client.hc);
\r