#include <mjson.h>\r
#include <matrix.h>\r
\r
-#define SERVER "https://matrix.org"\r
-#define USER_ID "@pscho:matrix.org"\r
-#define ROOM_ID "!XKFUjAsGrSSrpDFIxB:matrix.org"\r
+#define SERVER "https://matrix.org"\r
+#define USER_ID "@example:matrix.org"\r
+#define USERNAME ""\r
+#define PASSWORD ""\r
+#define DEVICE_NAME ""\r
\r
#define BUFFER_SIZE 1024\r
#define NUMBER_ARGS 10\r
}\r
else if (CheckCommand(cmd, "todevice")) {\r
static char buffer[30000];\r
+ static char nextBatch[128];\r
MatrixClientSync(client,\r
- buffer, 30000, "");\r
+ buffer, 30000, nextBatch, 128);\r
const char * todevice;\r
int todeviceLen;\r
mjson_find(buffer, 30000,\r
args[1],\r
args[2]);\r
}\r
- else if (CheckCommand(cmd, "save")) {\r
- CHECK_ARGS(1, "<filename>")\r
-\r
- MatrixClientSave(client, args[0]);\r
- }\r
- else if (CheckCommand(cmd, "load")) {\r
- CHECK_ARGS(1, "<filename>")\r
-\r
- MatrixClientLoad(client, args[0]);\r
- }\r
else if (CheckCommand(cmd, "send")) {\r
CHECK_ARGS(2, "<room_id> <message>")\r
\r
args[2],\r
&client->megolmOutSessions[sessionIndex]);\r
}\r
- else if (CheckCommand(cmd, "savesession")) {\r
- CHECK_ARGS(3, "<session_index> <filename> <key>")\r
-\r
- int sessionIndex = atoi(args[0]);\r
-\r
- MatrixMegolmOutSessionSave(\r
- &client->megolmOutSessions[sessionIndex],\r
- args[1],\r
- args[2]);\r
- }\r
- else if (CheckCommand(cmd, "loadsession")) {\r
- CHECK_ARGS(3, "<session_index> <filename> <key>")\r
-\r
- int sessionIndex = atoi(args[0]);\r
-\r
- MatrixMegolmOutSessionLoad(\r
- &client->megolmOutSessions[sessionIndex],\r
- args[1],\r
- args[2]);\r
- }\r
else if (CheckCommand(cmd, "printsessions")) {\r
for (int i = 0; i < client->numMegolmOutSessions; i++) {\r
printf("%d: %s\t%s\t%s\n", i,\r
\r
\r
MatrixClientSetUserId(&client, USER_ID);\r
- MatrixClientLoginPassword(&client, "@pscho:matrix.org", "Wc23EbmB9G3faMq", "abc");\r
+ MatrixClientLoginPassword(&client, USERNAME, PASSWORD, DEVICE_NAME);\r
MatrixClientGenerateOnetimeKeys(&client, 10);\r
MatrixClientUploadDeviceKeys(&client);\r
MatrixClientUploadOnetimeKeys(&client);\r
+++ /dev/null
-#include <matrix.h>\r
-#include <stdio.h>\r
-\r
-#include <olm/sas.h>\r
-\r
-#define SERVER "https://matrix.org"\r
-#define USER_ID "@pscho:matrix.org"\r
-#define DEVICE_ID "ULZZOKJBYN"\r
-#define SENDER_KEY "LvVdoHsRRWNxRmG2GO2vky6o6S8RzADpPAaELsd1rjU"\r
-#define ROOM_ID "!XKFUjAsGrSSrpDFIxB:matrix.org"\r
-#define EVENT_ID "$_-y42DkC3OmJ_s40gYko7jMwrUQhoXfEut2pMV3E2J8"\r
-#define SESSION_ID "tzdnJbDrm82D/RpgkZKpILTifQ5Rads+tVzp3ax8+Ls"\r
-\r
-void\r
-GetLine(char * buffer, int n) {\r
- int c;\r
- int len = 0;\r
-\r
- while ((c = getchar()) != '\n' && len < n-1)\r
- buffer[len++] = c;\r
- \r
- buffer[len] = '\0';\r
-}\r
-\r
-int\r
-main(void)\r
-{\r
- MatrixClient client;\r
- MatrixClientInit(&client);\r
- \r
- MatrixHttpInit(&client.hc, SERVER);\r
-\r
- MatrixClientSetUserId(&client, USER_ID);\r
-\r
- MatrixClientLoginPassword(&client,\r
- "pscho",\r
- "Wc23EbmB9G3faMq",\r
- "Test1");\r
-\r
- printf("deviceId: %s\n", client.deviceId);\r
-\r
- MatrixClientGenerateOnetimeKeys(&client, 10);\r
- MatrixClientUploadOnetimeKeys(&client);\r
- MatrixClientUploadDeviceKeys(&client);\r
-\r
- static char eventBuffer[1024];\r
- MatrixClientGetRoomEvent(&client,\r
- ROOM_ID,\r
- EVENT_ID,\r
- eventBuffer, 1024);\r
- \r
- printf("event: %s\n", eventBuffer);\r
-\r
- // verify\r
- // char theirDeviceKey[DEVICE_KEY_SIZE];\r
- // MatrixClientRequestDeviceKey(&client,\r
- // DEVICE_ID,\r
- // theirDeviceKey, DEVICE_KEY_SIZE);\r
- \r
- char transactionId[256];\r
- GetLine(transactionId, 128);\r
-\r
- char verificationReadyBuffer[2048];\r
- snprintf(verificationReadyBuffer, 2048,\r
- "{"\r
- "\"from_device\":\"%s\","\r
- "\"methods\":[\"m.sas.v1\"],"\r
- "\"transaction_id\":\"%s\""\r
- "}",\r
- client.deviceId,\r
- transactionId);\r
- \r
- MatrixClientSendToDevice(&client,\r
- USER_ID,\r
- DEVICE_ID,\r
- verificationReadyBuffer,\r
- "m.key.verification.ready");\r
- \r
- OlmSAS * olmSas = olm_sas(malloc(olm_sas_size()));\r
- void * sasRandomBytes = malloc(olm_create_sas_random_length(olmSas));\r
- olm_create_sas(olmSas,\r
- sasRandomBytes,\r
- olm_create_sas_random_length(olmSas));\r
- \r
- OlmUtility * olmUtil = olm_utility(malloc(olm_utility_size()));\r
- \r
- char publicKey[128];\r
- char keyStartJson[1024];\r
- char concat[1024];\r
- char commitment[256];\r
- olm_sas_get_pubkey(olmSas,\r
- publicKey,\r
- 128);\r
- GetLine(keyStartJson, 1024);\r
- printf("keyStartJson: %s\n", keyStartJson);\r
- snprintf(concat, 1024, "%s%s", publicKey, keyStartJson);\r
- printf("concat: %s\n", concat);\r
- olm_sha256(olmUtil, concat, strlen(concat), commitment, 256);\r
- printf("hash: %s\n", commitment);\r
- \r
- char verificationAcceptBuffer[2048];\r
- snprintf(verificationAcceptBuffer, 2048,\r
- "{"\r
- "\"commitment\":\"%s\","\r
- "\"hash\":\"sha256\","\r
- "\"key_agreement_protocol\":\"curve25519\","\r
- "\"message_authentication_code\":\"hkdf-hmac-sha256.v2\","\r
- "\"method\":\"m.sas.v1\","\r
- "\"short_authentication_string\":[\"decimal\"],"\r
- "\"transaction_id\":\"%s\""\r
- "}",\r
- commitment,\r
- transactionId);\r
- \r
- MatrixClientSendToDevice(&client,\r
- USER_ID,\r
- DEVICE_ID,\r
- verificationAcceptBuffer,\r
- "m.key.verification.accept");\r
- \r
- char theirPublicKey[128];\r
- GetLine(theirPublicKey, 128);\r
- olm_sas_set_their_key(olmSas, theirPublicKey, strlen(theirPublicKey));\r
- \r
- char verificationKeyBuffer[2048];\r
- snprintf(verificationKeyBuffer, 2048,\r
- "{"\r
- "\"key\":\"%s\","\r
- "\"transaction_id\":\"%s\""\r
- "}",\r
- publicKey,\r
- transactionId);\r
- \r
- MatrixClientSendToDevice(&client,\r
- USER_ID,\r
- DEVICE_ID,\r
- verificationKeyBuffer,\r
- "m.key.verification.key");\r
-\r
- char hkdfInfo[1024];\r
- int hkdfInfoLen =\r
- snprintf(hkdfInfo, 1024,\r
- "MATRIX_KEY_VERIFICATION_SAS%s%s%s%s%s",\r
- USER_ID,\r
- DEVICE_ID,\r
- USER_ID,\r
- client.deviceId,\r
- transactionId);\r
-\r
- unsigned char sasBytes[5];\r
- olm_sas_generate_bytes(olmSas,\r
- hkdfInfo, hkdfInfoLen,\r
- sasBytes, 5);\r
- int b0 = sasBytes[0];\r
- int b1 = sasBytes[1];\r
- int b2 = sasBytes[2];\r
- int b3 = sasBytes[3];\r
- int b4 = sasBytes[4];\r
- \r
- printf("%d %d %d %d %d\n", b0, b1, b2, b3, b4);\r
-\r
- // https://spec.matrix.org/v1.7/client-server-api/#sas-method-decimal\r
- printf("%d | %d | %d\n",\r
- (b0 << 5 | b1 >> 3) + 1000,\r
- ((b1 & 0x7) << 10 | b2 << 2 | b3 >> 6) + 1000,\r
- ((b3 & 0x3F) << 7 | b4 >> 1) + 1000);\r
- printf("%d | %d | %d\n",\r
- ((b0 << 5) | (b1 >> 3)) + 1000,\r
- (((b1 & 0x7) << 10) | (b2 << 2) | (b3 >> 6)) + 1000,\r
- (((b3 & 0x3F) << 7) | (b4 >> 1)) + 1000);\r
- \r
- // mac\r
- const char * masterKey = "vt8tJ5/SxqkvXS+XoGxr+4rJNe8fJfZT3/e/FTwlFsI";\r
-\r
- char keyList[1024];\r
- char keyListMac[1024];\r
- char key1Id[1024];\r
- char key1[1024];\r
- char key1Mac[1024];\r
- char key2Id[1024];\r
- char key2[1024];\r
- char key2Mac[1024];\r
-\r
- if (strcmp(masterKey, client.deviceId) < 0) {\r
- //strcpy(key1Id, masterKey);\r
- snprintf(key1Id, 1024, "ed25519:%s", masterKey);\r
- strcpy(key1, masterKey);\r
- //strcpy(key2Id, client.deviceId);\r
- snprintf(key2Id, 1024, "ed25519:%s", client.deviceId);\r
- MatrixOlmAccountGetSigningKey(&client.olmAccount, key2, 1024);\r
- }\r
- else {\r
- //strcpy(key1Id, client.deviceId);\r
- snprintf(key1Id, 1024, "ed25519:%s", client.deviceId);\r
- MatrixOlmAccountGetSigningKey(&client.olmAccount, key1, 1024);\r
- //strcpy(key2Id, masterKey);\r
- snprintf(key2Id, 1024, "ed25519:%s", masterKey);\r
- strcpy(key2, masterKey);\r
- }\r
-\r
- snprintf(keyList, 1024,\r
- "%s,%s", key1Id, key2Id);\r
- \r
- char macInfo[1024];\r
- int macInfoLen;\r
- {\r
- macInfoLen =\r
- snprintf(macInfo, 1024,\r
- "MATRIX_KEY_VERIFICATION_MAC%s%s%s%s%s%s",\r
- USER_ID,\r
- client.deviceId,\r
- USER_ID,\r
- DEVICE_ID,\r
- transactionId,\r
- "KEY_IDS");\r
- olm_sas_calculate_mac_fixed_base64(olmSas, keyList, strlen(keyList), macInfo, macInfoLen, keyListMac, 1024);\r
- }\r
- {\r
- macInfoLen =\r
- snprintf(macInfo, 1024,\r
- "MATRIX_KEY_VERIFICATION_MAC%s%s%s%s%s%s",\r
- USER_ID,\r
- client.deviceId,\r
- USER_ID,\r
- DEVICE_ID,\r
- transactionId,\r
- key1Id);\r
- olm_sas_calculate_mac_fixed_base64(olmSas, key1, strlen(key1), macInfo, macInfoLen, key1Mac, 1024);\r
- }\r
- {\r
- macInfoLen =\r
- snprintf(macInfo, 1024,\r
- "MATRIX_KEY_VERIFICATION_MAC%s%s%s%s%s%s",\r
- USER_ID,\r
- client.deviceId,\r
- USER_ID,\r
- DEVICE_ID,\r
- transactionId,\r
- key2Id);\r
- olm_sas_calculate_mac_fixed_base64(olmSas, key2, strlen(key2), macInfo, macInfoLen, key2Mac, 1024);\r
- }\r
-\r
- printf("send mac:");\r
- getchar();\r
-\r
- char verificationMacBuffer[2048];\r
- snprintf(verificationMacBuffer, 2048,\r
- "{"\r
- "\"keys\":\"%s\","\r
- "\"mac\":{"\r
- "\"%s\":\"%s\","\r
- "\"%s\":\"%s\""\r
- "},"\r
- "\"transaction_id\":\"%s\""\r
- "}",\r
- keyListMac,\r
- key1Id,\r
- key1Mac,\r
- key2Id,\r
- key2Mac,\r
- transactionId);\r
- \r
- MatrixClientSendToDevice(&client,\r
- USER_ID,\r
- DEVICE_ID,\r
- verificationMacBuffer,\r
- "m.key.verification.mac");\r
-\r
- printf("send done:");\r
- getchar();\r
-\r
- char verificationDoneBuffer[2048];\r
- snprintf(verificationDoneBuffer, 2048,\r
- "{"\r
- "\"transaction_id\":\"%s\""\r
- "}",\r
- transactionId);\r
- \r
- MatrixClientSendToDevice(&client,\r
- USER_ID,\r
- DEVICE_ID,\r
- verificationDoneBuffer,\r
- "m.key.verification.done");\r
- \r
- // done\r
-\r
- // request room key\r
-\r
- getchar();\r
- \r
- MatrixClientRequestMegolmInSession(&client,\r
- ROOM_ID,\r
- SESSION_ID,\r
- SENDER_KEY,\r
- USER_ID,\r
- DEVICE_ID);\r
-\r
- // // decrypt room key\r
-\r
- MatrixOlmSession * olmSession;\r
- MatrixClientGetOlmSession(&client,\r
- USER_ID,\r
- DEVICE_ID,\r
- &olmSession);\r
- static char encrypted[2048];\r
- static char decrypted[2048];\r
- printf("encrypted:");\r
- fgets(encrypted, 2048, stdin);\r
- printf("(%d) %s;\n", strlen(encrypted), encrypted);\r
- MatrixOlmSessionDecrypt(olmSession,\r
- 1, encrypted, decrypted, 2048);\r
- printf("decrypted: %s\n", decrypted);\r
-\r
- // int c;\r
- // while ((c = getchar()) != 'q') {\r
- // printf("c: %c (%d)\n", c, c);\r
- // static char syncBuffer[40000];\r
- // MatrixClientSync(&client,\r
- // syncBuffer, 40000);\r
- // printf("sync: %s", syncBuffer);\r
- // }\r
-\r
-\r
- // static char decryptedBuffer[1024];\r
- // MatrixMegolmInSessionDecrypt(&megolmSession,\r
- // eventBuffer,\r
- // decryptedBuffer, 1024);\r
-\r
- // printf("%s\n", decryptedBuffer);\r
-\r
- getchar();\r
-\r
- MatrixClientDeleteDevice(&client);\r
- \r
- MatrixHttpDeinit(&client.hc);\r
-\r
- return 0;\r
-}\r