From: patrick-scho Date: Sun, 15 Oct 2023 12:11:51 +0000 (+0200) Subject: use global static buffers to save memory, get Verify example working on ESP32 X-Git-Url: https://gitweb.ps.run/matrix_esp_thesis/commitdiff_plain/b231ec39ba5b9df6288a50204e5dabe9f591c830?ds=sidebyside use global static buffers to save memory, get Verify example working on ESP32 --- diff --git a/esp32/esp_project/main/Verify.c b/esp32/esp_project/main/Verify.c index 124ddd2..0ac7183 100644 --- a/esp32/esp_project/main/Verify.c +++ b/esp32/esp_project/main/Verify.c @@ -62,9 +62,9 @@ HandleEvent( OlmUtility * olmUtil = olm_utility(malloc(olm_utility_size())); STATIC char publicKey[64]; - STATIC char keyStartJsonCanonical[128]; - STATIC char concat[128+64]; - STATIC char commitment[256]; + STATIC char keyStartJsonCanonical[512]; + STATIC char concat[512+64]; + STATIC char commitment[1024]; olm_sas_get_pubkey(olmSas, publicKey, 64); @@ -73,15 +73,15 @@ HandleEvent( const char * keyStartJson; int keyStartJsonLen; mjson_find(event, eventLen, "$.content", &keyStartJson, &keyStartJsonLen); - JsonCanonicalize(keyStartJson, keyStartJsonLen, keyStartJsonCanonical, 128); + JsonCanonicalize(keyStartJson, keyStartJsonLen, keyStartJsonCanonical, 512); printf("json:\n%.*s\ncanonical json:\n%s\n", keyStartJsonLen, keyStartJson, keyStartJsonCanonical); int concatLen = - snprintf(concat, 128+64, "%.*s%s", olm_sas_pubkey_length(olmSas), publicKey, keyStartJsonCanonical); + snprintf(concat, 512+64, "%.*s%s", olm_sas_pubkey_length(olmSas), publicKey, keyStartJsonCanonical); int commitmentLen = - olm_sha256(olmUtil, concat, concatLen, commitment, 256); + olm_sha256(olmUtil, concat, concatLen, commitment, 1024); STATIC char verificationAcceptBuffer[512]; snprintf(verificationAcceptBuffer, 512, @@ -293,16 +293,22 @@ HandleEvent( mjson_get_string(event, eventLen, jp, encrypted, 2048); MatrixOlmSession * olmSession; - if (messageTypeInt == 0) { - MatrixClientGetOlmSessionIn(client, - USER_ID, - DEVICE_ID, - &olmSession); - } else { - MatrixClientGetOlmSessionOut(client, - USER_ID, - DEVICE_ID, - &olmSession); + + if (! MatrixClientGetOlmSession(client, USER_ID, DEVICE_ID, &olmSession)) + { + if (messageTypeInt == 0) { + MatrixClientNewOlmSessionIn(client, + USER_ID, + DEVICE_ID, + encrypted, + &olmSession); + } + else { + MatrixClientNewOlmSessionOut(client, + USER_ID, + DEVICE_ID, + &olmSession); + } } printf("event: %.*s\n", eventLen, event); @@ -380,17 +386,19 @@ HandleRoomEvent( void Sync( MatrixClient * client, - char * syncBuffer -) { + char * syncBuffer, int syncBufferLen) +{ STATIC char nextBatch[1024] = {0}; - MatrixClientSync(client, syncBuffer, 1024, nextBatch); + MatrixClientSync(client, syncBuffer, syncBufferLen, nextBatch); int res; const char * s = syncBuffer; int slen = strlen(syncBuffer); + printf("sync:\n\n%s\n\n", syncBuffer); + // { // int koff, klen, voff, vlen, vtype, off = 0; // for (off = 0; (off = mjson_next(s, slen, off, &koff, &klen, @@ -465,9 +473,15 @@ Sync( int main(void) { - STATIC MatrixClient _client; - MatrixClient * client = &_client; - // MatrixClient * client = (MatrixClient*)malloc(sizeof(MatrixClient)); + // sizeof(MatrixOlmAccount); + // sizeof(MatrixMegolmInSession); + // sizeof(MatrixMegolmOutSession); + // sizeof(MatrixOlmSession); + // sizeof(MatrixDevice); + + // STATIC MatrixClient _client; + // MatrixClient * client = &_client; + MatrixClient * client = (MatrixClient*)malloc(sizeof(MatrixClient)); MatrixClientInit(client); MatrixHttpInit(&client->hc, SERVER); @@ -488,40 +502,48 @@ main(void) EVENT_ID, eventBuffer, 1024); printf("event: %s\n", eventBuffer); - - char * syncBuffer = (char*)malloc(1024*40); - // STATIC char syncBuffer[1024]; - while (! verified) - Sync(client, syncBuffer); + #define SYNC_BUFFER_SIZE 1024*10 + + // char * syncBuffer = (char*)malloc(SYNC_BUFFER_SIZE); + STATIC char syncBuffer[SYNC_BUFFER_SIZE]; + + while (! verified) { + Sync(client, syncBuffer, SYNC_BUFFER_SIZE); + } + + printf("verified!\n"); - // while (getchar() != 'q') - // Sync(client, syncBuffer); + int c; + while ((c=getchar()) != 'q') { + printf("getchar() = %c [%d]\n", c, c); + Sync(client, syncBuffer, SYNC_BUFFER_SIZE); + } - MatrixClientRequestMegolmInSession(client, - ROOM_ID, - SESSION_ID, - SENDER_KEY, - USER_ID, - DEVICE_ID); - - MatrixMegolmInSession * megolmInSession; - while (! MatrixClientGetMegolmInSession(client, - ROOM_ID, strlen(ROOM_ID), - SESSION_ID, strlen(SESSION_ID), - &megolmInSession)) - Sync(client, syncBuffer); - - int encryptedLen = - mjson_get_string(eventBuffer, strlen(eventBuffer), "$.content.ciphertext", encrypted, 1024); + // MatrixClientRequestMegolmInSession(client, + // ROOM_ID, + // SESSION_ID, + // SENDER_KEY, + // USER_ID, + // DEVICE_ID); + + // MatrixMegolmInSession * megolmInSession; + // while (! MatrixClientGetMegolmInSession(client, + // ROOM_ID, strlen(ROOM_ID), + // SESSION_ID, strlen(SESSION_ID), + // &megolmInSession)) + // Sync(client, syncBuffer, SYNC_BUFFER_SIZE); + + // int encryptedLen = + // mjson_get_string(eventBuffer, strlen(eventBuffer), "$.content.ciphertext", encrypted, 1024); - printf("encrypted: [%.*s]\n", encryptedLen, encrypted); + // printf("encrypted: [%.*s]\n", encryptedLen, encrypted); - MatrixMegolmInSessionDecrypt(megolmInSession, - encrypted, encryptedLen, - decrypted, 1024); + // MatrixMegolmInSessionDecrypt(megolmInSession, + // encrypted, encryptedLen, + // decrypted, 1024); - printf("decrypted: %s\n", decrypted); + // printf("decrypted: %s\n", decrypted); MatrixClientDeleteDevice(client); diff --git a/src/matrix.c b/src/matrix.c index ef094b8..fe8e1a3 100644 --- a/src/matrix.c +++ b/src/matrix.c @@ -8,14 +8,16 @@ #include #endif -#define STATIC +#define STATIC static #define LOGIN_REQUEST_SIZE 1024 #define LOGIN_RESPONSE_SIZE 1024 #define LOGIN_URL "/_matrix/client/v3/login" #define ENCRYPTED_REQUEST_SIZE (1024*5) +STATIC char g_EncryptedRequestBuffer[ENCRYPTED_REQUEST_SIZE]; #define ENCRYPTED_EVENT_SIZE (1024*10) +STATIC char g_EncryptedEventBuffer[ENCRYPTED_EVENT_SIZE]; #define ROOM_SEND_REQUEST_SIZE 256 #define ROOM_SEND_RESPONSE_SIZE 1024 #define ROOM_SEND_URL "/_matrix/client/v3/rooms/%s/send/%s/%d" @@ -23,15 +25,18 @@ #define ROOMKEY_REQUEST_SIZE (1024*4) #define TODEVICE_EVENT_SIZE (1024*5) +STATIC char g_TodeviceEventBuffer[TODEVICE_EVENT_SIZE]; #define TODEVICE_URL "/_matrix/client/v3/sendToDevice/%s/%d" #define KEYS_QUERY_URL "/_matrix/client/v3/keys/query" #define KEYS_QUERY_REQUEST_SIZE 256 -#define KEYS_QUERY_RESPONSE_SIZE (1024*10) +#define KEYS_QUERY_RESPONSE_SIZE (1024*5) #define KEYS_UPLOAD_URL "/_matrix/client/v3/keys/upload" #define KEYS_UPLOAD_REQUEST_SIZE 1024*4 +STATIC char g_KeysUploadRequestBuffer[KEYS_UPLOAD_REQUEST_SIZE]; #define KEYS_UPLOAD_REQUEST_SIGNED_SIZE 2048*4 +STATIC char g_KeysUploadRequestSignedBuffer[KEYS_UPLOAD_REQUEST_SIGNED_SIZE]; #define KEYS_UPLOAD_RESPONSE_SIZE 2048 #define KEYS_CLAIM_URL "/_matrix/client/v3/keys/claim" @@ -696,9 +701,7 @@ bool MatrixClientUploadOnetimeKeys( MatrixClient * client) { - STATIC char requestBuffer[KEYS_UPLOAD_REQUEST_SIZE]; - - mjson_snprintf(requestBuffer, KEYS_UPLOAD_REQUEST_SIZE, + mjson_snprintf(g_KeysUploadRequestBuffer, KEYS_UPLOAD_REQUEST_SIZE, "{"); STATIC char onetimeKeysBuffer[1024]; @@ -724,34 +727,33 @@ MatrixClientUploadOnetimeKeys( keyJson, keyJsonLen, keyJsonSigned, JSON_ONETIME_KEY_SIGNED_SIZE); - mjson_snprintf(requestBuffer+strlen(requestBuffer), KEYS_UPLOAD_REQUEST_SIZE-strlen(requestBuffer), + mjson_snprintf(g_KeysUploadRequestBuffer+strlen(g_KeysUploadRequestBuffer), KEYS_UPLOAD_REQUEST_SIZE-strlen(g_KeysUploadRequestBuffer), "\"signed_curve25519:%.*s\":%s,", klen-2, keys + koff+1, keyJsonSigned); } - if (requestBuffer[strlen(requestBuffer)-1] == ',') - requestBuffer[strlen(requestBuffer)-1] = '\0'; + if (g_KeysUploadRequestBuffer[strlen(g_KeysUploadRequestBuffer)-1] == ',') + g_KeysUploadRequestBuffer[strlen(g_KeysUploadRequestBuffer)-1] = '\0'; - mjson_snprintf(requestBuffer+strlen(requestBuffer), KEYS_UPLOAD_REQUEST_SIZE-strlen(requestBuffer), + mjson_snprintf(g_KeysUploadRequestBuffer+strlen(g_KeysUploadRequestBuffer), KEYS_UPLOAD_REQUEST_SIZE-strlen(g_KeysUploadRequestBuffer), "}"); // STATIC char onetimeKeysSignedBuffer[KEYS_UPLOAD_REQUEST_SIGNED_SIZE]; // JsonSign(client, - // requestBuffer, strlen(requestBuffer), + // g_KeysUploadRequestBuffer, strlen(g_KeysUploadRequestBuffer), // onetimeKeysSignedBuffer, KEYS_UPLOAD_REQUEST_SIZE); // STATIC char finalEvent[KEYS_UPLOAD_REQUEST_SIGNED_SIZE]; // snprintf(finalEvent, KEYS_UPLOAD_REQUEST_SIGNED_SIZE, // "{\"one_time_keys\":%s}", onetimeKeysSignedBuffer); - STATIC char finalEvent[KEYS_UPLOAD_REQUEST_SIGNED_SIZE]; - snprintf(finalEvent, KEYS_UPLOAD_REQUEST_SIGNED_SIZE, - "{\"one_time_keys\":%s}", requestBuffer); + snprintf(g_KeysUploadRequestSignedBuffer, KEYS_UPLOAD_REQUEST_SIGNED_SIZE, + "{\"one_time_keys\":%s}", g_KeysUploadRequestBuffer); STATIC char responseBuffer[KEYS_UPLOAD_RESPONSE_SIZE]; MatrixHttpPost(client->hc, KEYS_UPLOAD_URL, - finalEvent, + g_KeysUploadRequestSignedBuffer, responseBuffer, KEYS_UPLOAD_RESPONSE_SIZE, true); @@ -768,10 +770,8 @@ MatrixClientUploadDeviceKey( char thisSigningKey[DEVICE_KEY_SIZE]; MatrixOlmAccountGetSigningKey(&client->olmAccount, thisSigningKey, DEVICE_KEY_SIZE); - STATIC char deviceKeysBuffer[KEYS_UPLOAD_REQUEST_SIZE]; - int deviceKeysBufferLen = - mjson_snprintf(deviceKeysBuffer, KEYS_UPLOAD_REQUEST_SIZE, + mjson_snprintf(g_KeysUploadRequestBuffer, KEYS_UPLOAD_REQUEST_SIZE, "{" "\"algorithms\":[\"m.olm.v1.curve25519-aes-sha2\",\"m.megolm.v1.aes-sha2\"]," "\"device_id\":\"%s\"," @@ -786,14 +786,13 @@ MatrixClientUploadDeviceKey( client->deviceId, thisSigningKey, client->userId); - STATIC char deviceKeysSignedBuffer[KEYS_UPLOAD_REQUEST_SIGNED_SIZE]; JsonSign(client, - deviceKeysBuffer, deviceKeysBufferLen, - deviceKeysSignedBuffer, KEYS_UPLOAD_REQUEST_SIZE); + g_KeysUploadRequestBuffer, deviceKeysBufferLen, + g_KeysUploadRequestSignedBuffer, KEYS_UPLOAD_REQUEST_SIZE); STATIC char finalEvent[KEYS_UPLOAD_REQUEST_SIGNED_SIZE+30]; snprintf(finalEvent, KEYS_UPLOAD_REQUEST_SIGNED_SIZE+30, - "{\"device_keys\":%s}", deviceKeysSignedBuffer); + "{\"device_keys\":%s}", g_KeysUploadRequestSignedBuffer); STATIC char responseBuffer[KEYS_UPLOAD_RESPONSE_SIZE]; MatrixHttpPost(client->hc, @@ -966,10 +965,9 @@ MatrixClientSendEventEncrypted( MatrixClientNewMegolmOutSession(client, roomId, &outSession); // encrypt - STATIC char encryptedBuffer[ENCRYPTED_REQUEST_SIZE/10]; MatrixMegolmOutSessionEncrypt(outSession, requestBuffer, - encryptedBuffer, ENCRYPTED_REQUEST_SIZE); + g_EncryptedRequestBuffer, ENCRYPTED_REQUEST_SIZE); char thisDeviceKey[DEVICE_KEY_SIZE]; MatrixOlmAccountGetDeviceKey(&client->olmAccount, thisDeviceKey, DEVICE_KEY_SIZE); @@ -980,8 +978,7 @@ MatrixClientSendEventEncrypted( const char * sessionId = outSession->id; const char * deviceId = client->deviceId; - STATIC char encryptedEventBuffer[ENCRYPTED_EVENT_SIZE/10]; - sprintf(encryptedEventBuffer, + snprintf(g_EncryptedEventBuffer, ENCRYPTED_EVENT_SIZE, "{" "\"algorithm\":\"m.megolm.v1.aes-sha2\"," "\"ciphertext\":\"%s\"," @@ -989,7 +986,7 @@ MatrixClientSendEventEncrypted( "\"sender_key\":\"%s\"," "\"session_id\":\"%s\"" "}", - encryptedBuffer, + g_EncryptedRequestBuffer, deviceId, senderKey, sessionId); @@ -998,7 +995,7 @@ MatrixClientSendEventEncrypted( return MatrixClientSendEvent(client, roomId, "m.room.encrypted", - encryptedEventBuffer); + g_EncryptedEventBuffer); } // https://spec.matrix.org/v1.6/client-server-api/#get_matrixclientv3sync @@ -1011,8 +1008,10 @@ MatrixClientSync( // filter={\"event_fields\":[\"to_device\"]} STATIC char url[MAX_URL_LEN]; snprintf(url, MAX_URL_LEN, - "/_matrix/client/v3/sync?timeout=%d%s", + "/_matrix/client/v3/sync?timeout=%d" "%s" "%s", SYNC_TIMEOUT, + "", + // "&filter={\"event_fields\":[\"to_device\"]}", strlen(nextBatch) > 0 ? "&since=" : ""); int index = strlen(url); @@ -1253,7 +1252,7 @@ MatrixClientRequestMegolmInSession( } bool -MatrixClientGetOlmSessionIn( +MatrixClientGetOlmSession( MatrixClient * client, const char * userId, const char * deviceId, @@ -1303,25 +1302,6 @@ MatrixClientNewOlmSessionIn( return false; } -bool -MatrixClientGetOlmSessionOut( - MatrixClient * client, - const char * userId, - const char * deviceId, - MatrixOlmSession ** outSession) -{ - for (int i = 0; i < client->numOlmSessions; i++) - { - if (strcmp(client->olmSessions[i].deviceId, deviceId) == 0) - { - *outSession = &client->olmSessions[i]; - return true; - } - } - - return false; -} - bool MatrixClientNewOlmSessionOut( MatrixClient * client, @@ -1372,8 +1352,7 @@ MatrixClientSendToDevice( sprintf(requestUrl, TODEVICE_URL, msgType, (int)time(NULL)); - STATIC char eventBuffer[TODEVICE_EVENT_SIZE]; - snprintf(eventBuffer, TODEVICE_EVENT_SIZE, + snprintf(g_TodeviceEventBuffer, TODEVICE_EVENT_SIZE, "{" "\"messages\":{" "\"%s\":{" @@ -1389,7 +1368,7 @@ MatrixClientSendToDevice( bool result = MatrixHttpPut(client->hc, requestUrl, - eventBuffer, + g_TodeviceEventBuffer, responseBuffer, ROOM_SEND_RESPONSE_SIZE, true); @@ -1408,7 +1387,7 @@ MatrixClientSendToDeviceEncrypted( { // get olm session MatrixOlmSession * olmSession; - if (! MatrixClientGetOlmSessionOut(client, userId, deviceId, &olmSession)) + if (! MatrixClientGetOlmSession(client, userId, deviceId, &olmSession)) MatrixClientNewOlmSessionOut(client, userId, deviceId, &olmSession); // create event json @@ -1420,8 +1399,7 @@ MatrixClientSendToDeviceEncrypted( char thisSigningKey[DEVICE_KEY_SIZE]; MatrixOlmAccountGetSigningKey(&client->olmAccount, thisSigningKey, DEVICE_KEY_SIZE); - STATIC char eventBuffer[TODEVICE_EVENT_SIZE]; - sprintf(eventBuffer, + snprintf(g_TodeviceEventBuffer, TODEVICE_EVENT_SIZE, "{" "\"type\":\"%s\"," "\"content\":%s," @@ -1442,17 +1420,14 @@ MatrixClientSendToDeviceEncrypted( thisSigningKey); // encrypt - STATIC char encryptedBuffer[ENCRYPTED_REQUEST_SIZE]; MatrixOlmSessionEncrypt(olmSession, - eventBuffer, - encryptedBuffer, ENCRYPTED_REQUEST_SIZE); + g_TodeviceEventBuffer, + g_EncryptedRequestBuffer, ENCRYPTED_REQUEST_SIZE); char thisDeviceKey[DEVICE_KEY_SIZE]; MatrixOlmAccountGetDeviceKey(&client->olmAccount, thisDeviceKey, DEVICE_KEY_SIZE); - - STATIC char encryptedEventBuffer[ENCRYPTED_EVENT_SIZE]; - sprintf(encryptedEventBuffer, + snprintf(g_EncryptedEventBuffer, ENCRYPTED_EVENT_SIZE, "{" "\"algorithm\":\"m.olm.v1.curve25519-aes-sha2\"," "\"ciphertext\":{" @@ -1465,7 +1440,7 @@ MatrixClientSendToDeviceEncrypted( "\"sender_key\":\"%s\"" "}", targetDeviceKey, - encryptedBuffer, + g_EncryptedRequestBuffer, olm_session_has_received_message(olmSession->session), client->deviceId, thisDeviceKey); @@ -1475,7 +1450,7 @@ MatrixClientSendToDeviceEncrypted( client, userId, deviceId, - encryptedEventBuffer, + g_EncryptedEventBuffer, "m.room.encrypted"); } diff --git a/src/matrix.h b/src/matrix.h index d31a7f6..c07c742 100644 --- a/src/matrix.h +++ b/src/matrix.h @@ -47,9 +47,9 @@ #define JSON_ONETIME_KEY_SIGNED_SIZE 256 #define JSON_SIGNATURE_SIZE 256 -#define NUM_MEGOLM_SESSIONS 10 -#define NUM_OLM_SESSIONS 10 -#define NUM_DEVICES 10 +#define NUM_MEGOLM_SESSIONS 2 +#define NUM_OLM_SESSIONS 2 +#define NUM_DEVICES 5 // HTTP @@ -401,7 +401,7 @@ MatrixClientRequestMegolmInSession( const char * deviceId); // TODO: remove deviceId (query all devices) bool -MatrixClientGetOlmSessionIn( +MatrixClientGetOlmSession( MatrixClient * client, const char * userId, const char * deviceId, @@ -415,13 +415,6 @@ MatrixClientNewOlmSessionIn( const char * encrypted, MatrixOlmSession ** outSession); -bool -MatrixClientGetOlmSessionOut( - MatrixClient * client, - const char * userId, - const char * deviceId, - MatrixOlmSession ** outSession); - bool MatrixClientNewOlmSessionOut( MatrixClient * client, diff --git a/src/matrix_http_esp32.c b/src/matrix_http_esp32.c index 3faf9f5..874afd8 100644 --- a/src/matrix_http_esp32.c +++ b/src/matrix_http_esp32.c @@ -98,6 +98,7 @@ esp_err_t _http_event_handler(esp_http_client_event_t *evt) copy_len = MIN(evt->data_len, (hc->dataCap - hc->dataLen)); if (copy_len) { memcpy(hc->data + hc->dataLen, evt->data, copy_len); + hc->data[hc->dataLen + copy_len] = '\0'; } hc->dataLen += copy_len;