]> gitweb.ps.run Git - matrix_esp_thesis/blobdiff - src/matrix.c
share, save, load, init, print megolm out sessions
[matrix_esp_thesis] / src / matrix.c
index fbcf97e7d1dc46e3cd224ac40347ef67472ff420..de936de0d47bc31247d4e5a5f4dba95a4bd808ce 100644 (file)
@@ -192,7 +192,7 @@ MatrixMegolmOutSessionInit(
     static uint8_t random[MEGOLM_INIT_RANDOM_SIZE];\r
     Randomize(random, MEGOLM_INIT_RANDOM_SIZE);\r
 \r
-    session->roomId = roomId;\r
+    strncpy(session->roomId, roomId, ROOM_ID_SIZE);\r
 \r
     session->session =\r
         olm_outbound_group_session(session->memory);\r
@@ -226,6 +226,72 @@ MatrixMegolmOutSessionEncrypt(
     return res != olm_error();\r
 }\r
 \r
+bool\r
+MatrixMegolmOutSessionSave(\r
+    MatrixMegolmOutSession * session,\r
+    const char * filename,\r
+    const char * key)\r
+{\r
+    FILE * f = fopen(filename, "w");\r
+\r
+    size_t roomIdLen = strlen(session->roomId);\r
+    fwrite(&roomIdLen, sizeof(size_t), 1, f);\r
+    fwrite(session->roomId, 1, roomIdLen, f);\r
+\r
+    size_t pickleBufferLen =\r
+        olm_pickle_outbound_group_session_length(\r
+            session->session);\r
+    void * pickleBuffer = malloc(pickleBufferLen);\r
+\r
+    olm_pickle_outbound_group_session(\r
+        session->session,\r
+        key, strlen(key),\r
+        pickleBuffer, pickleBufferLen);\r
+    \r
+    fwrite(&pickleBufferLen, sizeof(size_t), 1, f);\r
+    fwrite(pickleBuffer, 1, pickleBufferLen, f);\r
+    free(pickleBuffer);\r
+\r
+    fclose(f);\r
+\r
+    return true;\r
+}\r
+\r
+bool\r
+MatrixMegolmOutSessionLoad(\r
+    MatrixMegolmOutSession * session,\r
+    const char * filename,\r
+    const char * key)\r
+{\r
+    FILE * f = fopen(filename, "r");\r
+\r
+    size_t roomIdLen;\r
+    fread(&roomIdLen, sizeof(size_t), 1, f);\r
+    fread(session->roomId, 1, roomIdLen, f);\r
+    for (int i = roomIdLen; i < ROOM_ID_SIZE; i++)\r
+        session->roomId[i] = '\0';\r
+\r
+    size_t pickleBufferLen;\r
+    fread(&pickleBufferLen, sizeof(size_t), 1, f);\r
+\r
+    void * pickleBuffer = malloc(pickleBufferLen);\r
+    fread(pickleBuffer, 1, pickleBufferLen, f);\r
+\r
+    olm_unpickle_outbound_group_session(\r
+        session->session,\r
+        key, strlen(key),\r
+        pickleBuffer, pickleBufferLen);\r
+    \r
+    free(pickleBuffer);\r
+\r
+    olm_outbound_group_session_id(session->session, (uint8_t *)session->id, MEGOLM_SESSION_ID_SIZE);\r
+    olm_outbound_group_session_key(session->session, (uint8_t *)session->key, MEGOLM_SESSION_KEY_SIZE);\r
+\r
+    fclose(f);\r
+\r
+    return true;\r
+}\r
+\r
 \r
 \r
 bool\r
@@ -259,17 +325,65 @@ MatrixClientInit(
 }\r
 \r
 bool\r
-MatrixClientSetAccessToken(\r
+MatrixClientSave(\r
     MatrixClient * client,\r
-    const char * accessToken)\r
+    const char * filename)\r
 {\r
-    int accessTokenLen = strlen(accessToken);\r
+    FILE * f = fopen(filename, "w");\r
+    \r
+    fwrite(client->deviceKey, 1, DEVICE_KEY_SIZE, f);\r
+    fwrite(client->signingKey, 1, DEVICE_KEY_SIZE, f);\r
+    fwrite(client->userId, 1, USER_ID_SIZE, f);\r
+    fwrite(client->server, 1, SERVER_SIZE, f);\r
+    fwrite(client->accessToken, 1, ACCESS_TOKEN_SIZE, f);\r
+    fwrite(client->deviceId, 1, DEVICE_ID_SIZE, f);\r
+    fwrite(client->expireMs, 1, EXPIRE_MS_SIZE, f);\r
+    fwrite(client->refreshToken, 1, REFRESH_TOKEN_SIZE, f);\r
+\r
+    fwrite(&client->numDevices, sizeof(int), 1, f);\r
+    for (int i = 0; i < client->numDevices; i++) {\r
+        fwrite(client->devices[i].deviceId, 1, DEVICE_ID_SIZE, f);\r
+        fwrite(client->devices[i].deviceKey, 1, DEVICE_KEY_SIZE, f);\r
+    }\r
 \r
-    if (accessTokenLen > ACCESS_TOKEN_SIZE - 1)\r
-        return false;\r
+    fclose(f);\r
+    return true;\r
+}\r
 \r
-    for (int i = 0; i < accessTokenLen; i++)\r
+bool\r
+MatrixClientLoad(\r
+    MatrixClient * client,\r
+    const char * filename)\r
+{\r
+    FILE * f = fopen(filename, "r");\r
+    \r
+    fread(client->deviceKey, 1, DEVICE_KEY_SIZE, f);\r
+    fread(client->signingKey, 1, DEVICE_KEY_SIZE, f);\r
+    fread(client->userId, 1, USER_ID_SIZE, f);\r
+    fread(client->server, 1, SERVER_SIZE, f);\r
+    fread(client->accessToken, 1, ACCESS_TOKEN_SIZE, f);\r
+    fread(client->deviceId, 1, DEVICE_ID_SIZE, f);\r
+    fread(client->expireMs, 1, EXPIRE_MS_SIZE, f);\r
+    fread(client->refreshToken, 1, REFRESH_TOKEN_SIZE, f);\r
+\r
+    fread(&client->numDevices, sizeof(int), 1, f);\r
+    for (int i = 0; i < client->numDevices; i++) {\r
+        fread(client->devices[i].deviceId, 1, DEVICE_ID_SIZE, f);\r
+        fread(client->devices[i].deviceKey, 1, DEVICE_KEY_SIZE, f);\r
+    }\r
+\r
+    fclose(f);\r
+    return true;\r
+}\r
+\r
+bool\r
+MatrixClientSetAccessToken(\r
+    MatrixClient * client,\r
+    const char * accessToken)\r
+{\r
+    for (int i = 0; i < ACCESS_TOKEN_SIZE-1; i++)\r
         client->accessToken[i] = accessToken[i];\r
+    client->accessToken[ACCESS_TOKEN_SIZE-1] = '\0';\r
 \r
     return true;\r
 }\r
@@ -279,13 +393,9 @@ MatrixClientSetDeviceId(
     MatrixClient * client,\r
     const char * deviceId)\r
 {\r
-    int deviceIdLen = strlen(deviceId);\r
-\r
-    if (deviceIdLen > DEVICE_ID_SIZE - 1)\r
-        return false;\r
-\r
-    for (int i = 0; i < deviceIdLen; i++)\r
+    for (int i = 0; i < DEVICE_ID_SIZE-1; i++)\r
         client->deviceId[i] = deviceId[i];\r
+    client->deviceId[DEVICE_ID_SIZE-1] = '\0';\r
 \r
     return true;\r
 }\r
@@ -295,13 +405,9 @@ MatrixClientSetUserId(
     MatrixClient * client,\r
     const char * userId)\r
 {\r
-    int userIdLen = strlen(userId);\r
-\r
-    if (userIdLen > USER_ID_SIZE - 1)\r
-        return false;\r
-\r
-    for (int i = 0; i < userIdLen; i++)\r
+    for (int i = 0; i < USER_ID_SIZE-1; i++)\r
         client->userId[i] = userId[i];\r
+    client->userId[USER_ID_SIZE-1] = '\0';\r
 \r
     return true;\r
 }\r
@@ -715,19 +821,29 @@ MatrixClientGetMegolmOutSession(
         }\r
     }\r
 \r
+    if (MatrixClientInitMegolmOutSession(client, roomId)) {\r
+        *outSession = &client->megolmOutSessions[client->numMegolmOutSessions-1];\r
+        return true;\r
+    }\r
+\r
+    return false;\r
+}\r
+\r
+bool\r
+MatrixClientInitMegolmOutSession(\r
+    MatrixClient * client,\r
+    const char * roomId)\r
+{\r
     if (client->numMegolmOutSessions < NUM_MEGOLM_SESSIONS)\r
     {\r
         MatrixMegolmOutSessionInit(\r
             &client->megolmOutSessions[client->numMegolmOutSessions],\r
             roomId);\r
-\r
-        *outSession = &client->megolmOutSessions[client->numMegolmOutSessions];\r
         \r
         client->numMegolmOutSessions++;\r
 \r
         return true;\r
     }\r
-\r
     return false;\r
 }\r
 \r