\r
#define LOGIN_REQUEST_SIZE 1024\r
#define LOGIN_RESPONSE_SIZE 1024\r
#define LOGIN_URL "/_matrix/client/v3/login"\r
\r
#define ENCRYPTED_REQUEST_SIZE (1024*5)\r
\r
#define LOGIN_REQUEST_SIZE 1024\r
#define LOGIN_RESPONSE_SIZE 1024\r
#define LOGIN_URL "/_matrix/client/v3/login"\r
\r
#define ENCRYPTED_REQUEST_SIZE (1024*5)\r
#define ROOM_SEND_REQUEST_SIZE 256\r
#define ROOM_SEND_RESPONSE_SIZE 1024\r
#define ROOM_SEND_URL "/_matrix/client/v3/rooms/%s/send/%s/%d"\r
#define ROOM_SEND_REQUEST_SIZE 256\r
#define ROOM_SEND_RESPONSE_SIZE 1024\r
#define ROOM_SEND_URL "/_matrix/client/v3/rooms/%s/send/%s/%d"\r
#define TODEVICE_URL "/_matrix/client/v3/sendToDevice/%s/%d"\r
\r
#define KEYS_QUERY_URL "/_matrix/client/v3/keys/query"\r
#define KEYS_QUERY_REQUEST_SIZE 256\r
#define TODEVICE_URL "/_matrix/client/v3/sendToDevice/%s/%d"\r
\r
#define KEYS_QUERY_URL "/_matrix/client/v3/keys/query"\r
#define KEYS_QUERY_REQUEST_SIZE 256\r
if (first) { srand(time(0)); first = false; }\r
\r
for (int i = 0; i < randomLen; i++)\r
{\r
random[i] = rand() % 256;\r
}\r
if (first) { srand(time(0)); first = false; }\r
\r
for (int i = 0; i < randomLen; i++)\r
{\r
random[i] = rand() % 256;\r
}\r
int valLen;\r
mjson_find(sIn, sInLen, jp, &valPtr, &valLen);\r
\r
int valLen;\r
mjson_find(sIn, sInLen, jp, &valPtr, &valLen);\r
\r
snprintf(newEntry, JSON_MAX_ENTRY_SIZE, "{%.*s:%.*s}", keys[i].len, keys[i].ptr, valLen, valPtr);\r
\r
char * buffer = strdup(sOut);\r
snprintf(newEntry, JSON_MAX_ENTRY_SIZE, "{%.*s:%.*s}", keys[i].len, keys[i].ptr, valLen, valPtr);\r
\r
char * buffer = strdup(sOut);\r
const char * sIn, int sInLen,\r
char * sOut, int sOutCap)\r
{\r
const char * sIn, int sInLen,\r
char * sOut, int sOutCap)\r
{\r
Randomize(random, OLM_ACCOUNT_RANDOM_SIZE);\r
\r
size_t res = olm_create_account(\r
Randomize(random, OLM_ACCOUNT_RANDOM_SIZE);\r
\r
size_t res = olm_create_account(\r
MatrixOlmAccount * account,\r
char * key, int keyCap)\r
{\r
MatrixOlmAccount * account,\r
char * key, int keyCap)\r
{\r
size_t res =\r
olm_account_identity_keys(account->account,\r
deviceKeysJson, OLM_IDENTITY_KEYS_JSON_SIZE);\r
size_t res =\r
olm_account_identity_keys(account->account,\r
deviceKeysJson, OLM_IDENTITY_KEYS_JSON_SIZE);\r
MatrixOlmAccount * account,\r
char * key, int keyCap)\r
{\r
MatrixOlmAccount * account,\r
char * key, int keyCap)\r
{\r
size_t res =\r
olm_account_identity_keys(account->account,\r
deviceKeysJson, OLM_IDENTITY_KEYS_JSON_SIZE);\r
size_t res =\r
olm_account_identity_keys(account->account,\r
deviceKeysJson, OLM_IDENTITY_KEYS_JSON_SIZE);\r
size_t res =\r
olm_create_inbound_session_from(session->session, olmAccount,\r
deviceKey, strlen(deviceKey),\r
size_t res =\r
olm_create_inbound_session_from(session->session, olmAccount,\r
deviceKey, strlen(deviceKey),\r
const char * plaintext,\r
char * outBuffer, int outBufferCap)\r
{\r
const char * plaintext,\r
char * outBuffer, int outBufferCap)\r
{\r
Randomize(random, OLM_ENCRYPT_RANDOM_SIZE);\r
\r
size_t res = olm_encrypt(session->session,\r
Randomize(random, OLM_ENCRYPT_RANDOM_SIZE);\r
\r
size_t res = olm_encrypt(session->session,\r
(uint8_t *)outDecrypted, outDecryptedCap,\r
&megolmInMessageIndex);\r
\r
(uint8_t *)outDecrypted, outDecryptedCap,\r
&megolmInMessageIndex);\r
\r
\r
if (res == olm_error()) {\r
printf("error decrypting megolm message: %s\n", olm_inbound_group_session_last_error(session->session));\r
\r
if (res == olm_error()) {\r
printf("error decrypting megolm message: %s\n", olm_inbound_group_session_last_error(session->session));\r
Randomize(random, MEGOLM_INIT_RANDOM_SIZE);\r
\r
strncpy(session->roomId, roomId, ROOM_ID_SIZE);\r
Randomize(random, MEGOLM_INIT_RANDOM_SIZE);\r
\r
strncpy(session->roomId, roomId, ROOM_ID_SIZE);\r
fwrite(thisDeviceKey, 1, DEVICE_KEY_SIZE, f);\r
fwrite(thisSigningKey, 1, DEVICE_KEY_SIZE, f);\r
fwrite(client->userId, 1, USER_ID_SIZE, f);\r
fwrite(thisDeviceKey, 1, DEVICE_KEY_SIZE, f);\r
fwrite(thisSigningKey, 1, DEVICE_KEY_SIZE, f);\r
fwrite(client->userId, 1, USER_ID_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->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
fread(thisDeviceKey, 1, DEVICE_KEY_SIZE, f);\r
fread(thisSigningKey, 1, DEVICE_KEY_SIZE, f);\r
fread(client->userId, 1, USER_ID_SIZE, f);\r
fread(thisDeviceKey, 1, DEVICE_KEY_SIZE, f);\r
fread(thisSigningKey, 1, DEVICE_KEY_SIZE, f);\r
fread(client->userId, 1, USER_ID_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->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
- static char requestBuffer[KEYS_UPLOAD_REQUEST_SIZE];\r
-\r
- mjson_snprintf(requestBuffer, KEYS_UPLOAD_REQUEST_SIZE,\r
+ mjson_snprintf(g_KeysUploadRequestBuffer, KEYS_UPLOAD_REQUEST_SIZE,\r
olm_account_one_time_keys(client->olmAccount.account,\r
onetimeKeysBuffer, 1024);\r
\r
olm_account_one_time_keys(client->olmAccount.account,\r
onetimeKeysBuffer, 1024);\r
\r
\r
int koff, klen, voff, vlen, vtype, off = 0;\r
while ((off = mjson_next(keys, keysLen, off, &koff, &klen, &voff, &vlen, &vtype)) != 0) {\r
\r
int koff, klen, voff, vlen, vtype, off = 0;\r
while ((off = mjson_next(keys, keysLen, off, &koff, &klen, &voff, &vlen, &vtype)) != 0) {\r
\r
int keyJsonLen =\r
snprintf(keyJson, JSON_ONETIME_KEY_SIZE,\r
"{\"key\":\"%.*s\"}",\r
vlen-2, keys + voff+1);\r
\r
\r
int keyJsonLen =\r
snprintf(keyJson, JSON_ONETIME_KEY_SIZE,\r
"{\"key\":\"%.*s\"}",\r
vlen-2, keys + voff+1);\r
\r
- mjson_snprintf(requestBuffer+strlen(requestBuffer), KEYS_UPLOAD_REQUEST_SIZE-strlen(requestBuffer),\r
+ mjson_snprintf(g_KeysUploadRequestBuffer+strlen(g_KeysUploadRequestBuffer), KEYS_UPLOAD_REQUEST_SIZE-strlen(g_KeysUploadRequestBuffer),\r
- if (requestBuffer[strlen(requestBuffer)-1] == ',')\r
- requestBuffer[strlen(requestBuffer)-1] = '\0';\r
+ if (g_KeysUploadRequestBuffer[strlen(g_KeysUploadRequestBuffer)-1] == ',')\r
+ g_KeysUploadRequestBuffer[strlen(g_KeysUploadRequestBuffer)-1] = '\0';\r
- mjson_snprintf(requestBuffer+strlen(requestBuffer), KEYS_UPLOAD_REQUEST_SIZE-strlen(requestBuffer),\r
+ mjson_snprintf(g_KeysUploadRequestBuffer+strlen(g_KeysUploadRequestBuffer), KEYS_UPLOAD_REQUEST_SIZE-strlen(g_KeysUploadRequestBuffer),\r
// snprintf(finalEvent, KEYS_UPLOAD_REQUEST_SIGNED_SIZE,\r
// "{\"one_time_keys\":%s}", onetimeKeysSignedBuffer);\r
// snprintf(finalEvent, KEYS_UPLOAD_REQUEST_SIGNED_SIZE,\r
// "{\"one_time_keys\":%s}", onetimeKeysSignedBuffer);\r
- static char finalEvent[KEYS_UPLOAD_REQUEST_SIGNED_SIZE];\r
- snprintf(finalEvent, KEYS_UPLOAD_REQUEST_SIGNED_SIZE,\r
- "{\"one_time_keys\":%s}", requestBuffer);\r
+ snprintf(g_KeysUploadRequestSignedBuffer, KEYS_UPLOAD_REQUEST_SIGNED_SIZE,\r
+ "{\"one_time_keys\":%s}", g_KeysUploadRequestBuffer);\r
- static char responseBuffer[KEYS_UPLOAD_RESPONSE_SIZE];\r
- MatrixHttpPost(client,\r
+ STATIC char responseBuffer[KEYS_UPLOAD_RESPONSE_SIZE];\r
+ MatrixHttpPost(client->hc,\r
char thisSigningKey[DEVICE_KEY_SIZE];\r
MatrixOlmAccountGetSigningKey(&client->olmAccount, thisSigningKey, DEVICE_KEY_SIZE);\r
\r
char thisSigningKey[DEVICE_KEY_SIZE];\r
MatrixOlmAccountGetSigningKey(&client->olmAccount, thisSigningKey, DEVICE_KEY_SIZE);\r
\r
"{"\r
"\"algorithms\":[\"m.olm.v1.curve25519-aes-sha2\",\"m.megolm.v1.aes-sha2\"],"\r
"\"device_id\":\"%s\","\r
"{"\r
"\"algorithms\":[\"m.olm.v1.curve25519-aes-sha2\",\"m.megolm.v1.aes-sha2\"],"\r
"\"device_id\":\"%s\","\r
- deviceKeysBuffer, deviceKeysBufferLen,\r
- deviceKeysSignedBuffer, KEYS_UPLOAD_REQUEST_SIZE);\r
+ g_KeysUploadRequestBuffer, deviceKeysBufferLen,\r
+ g_KeysUploadRequestSignedBuffer, KEYS_UPLOAD_REQUEST_SIZE);\r
- static char finalEvent[KEYS_UPLOAD_REQUEST_SIGNED_SIZE];\r
- snprintf(finalEvent, KEYS_UPLOAD_REQUEST_SIGNED_SIZE,\r
- "{\"device_keys\":%s}", deviceKeysSignedBuffer);\r
+ STATIC char finalEvent[KEYS_UPLOAD_REQUEST_SIGNED_SIZE+30];\r
+ snprintf(finalEvent, KEYS_UPLOAD_REQUEST_SIGNED_SIZE+30,\r
+ "{\"device_keys\":%s}", g_KeysUploadRequestSignedBuffer);\r
- static char responseBuffer[KEYS_UPLOAD_RESPONSE_SIZE];\r
- MatrixHttpPost(client,\r
+ STATIC char responseBuffer[KEYS_UPLOAD_RESPONSE_SIZE];\r
+ MatrixHttpPost(client->hc,\r
- static char responseBuffer[KEYS_CLAIM_RESPONSE_SIZE];\r
- MatrixHttpPost(client,\r
+ STATIC char responseBuffer[KEYS_CLAIM_RESPONSE_SIZE];\r
+ MatrixHttpPost(client->hc,\r
JsonEscape(userId, strlen(userId),\r
userIdEscaped, USER_ID_SIZE);\r
\r
JsonEscape(userId, strlen(userId),\r
userIdEscaped, USER_ID_SIZE);\r
\r
snprintf(query, JSON_QUERY_SIZE,\r
"$.one_time_keys.%s.%s",\r
userIdEscaped,\r
snprintf(query, JSON_QUERY_SIZE,\r
"$.one_time_keys.%s.%s",\r
userIdEscaped,\r
mjson_get_string(responseBuffer, responseLen,\r
"$.refresh_token",\r
client->refreshToken, REFRESH_TOKEN_SIZE);\r
mjson_get_string(responseBuffer, responseLen,\r
"$.refresh_token",\r
client->refreshToken, REFRESH_TOKEN_SIZE);\r
sprintf(requestUrl,\r
ROOM_SEND_URL, roomId, msgType, (int)time(NULL));\r
\r
sprintf(requestUrl,\r
ROOM_SEND_URL, roomId, msgType, (int)time(NULL));\r
\r
\r
char thisDeviceKey[DEVICE_KEY_SIZE];\r
MatrixOlmAccountGetDeviceKey(&client->olmAccount, thisDeviceKey, DEVICE_KEY_SIZE);\r
\r
char thisDeviceKey[DEVICE_KEY_SIZE];\r
MatrixOlmAccountGetDeviceKey(&client->olmAccount, thisDeviceKey, DEVICE_KEY_SIZE);\r
- static char encryptedEventBuffer[ENCRYPTED_EVENT_SIZE];\r
- sprintf(encryptedEventBuffer,\r
+ snprintf(g_EncryptedEventBuffer, ENCRYPTED_EVENT_SIZE,\r
"{"\r
"\"algorithm\":\"m.megolm.v1.aes-sha2\","\r
"\"ciphertext\":\"%s\","\r
"{"\r
"\"algorithm\":\"m.megolm.v1.aes-sha2\","\r
"\"ciphertext\":\"%s\","\r
"\"sender_key\":\"%s\","\r
"\"session_id\":\"%s\""\r
"}",\r
"\"sender_key\":\"%s\","\r
"\"session_id\":\"%s\""\r
"}",\r
snprintf(url, MAX_URL_LEN,\r
"/_matrix/client/v3/rooms/%s/event/%s",\r
roomId,\r
eventId);\r
\r
return\r
snprintf(url, MAX_URL_LEN,\r
"/_matrix/client/v3/rooms/%s/event/%s",\r
roomId,\r
eventId);\r
\r
return\r
// TODO: cancel requests\r
MatrixClientSendDummy(client, userId, deviceId);\r
\r
// TODO: cancel requests\r
MatrixClientSendDummy(client, userId, deviceId);\r
\r
snprintf(event, ROOMKEY_REQUEST_SIZE,\r
"{"\r
"\"action\":\"request\","\r
snprintf(event, ROOMKEY_REQUEST_SIZE,\r
"{"\r
"\"action\":\"request\","\r
"\"sender_key\":\"%s\","\r
"\"session_id\":\"%s\""\r
"},"\r
"\"sender_key\":\"%s\","\r
"\"session_id\":\"%s\""\r
"},"\r
+ return false;\r
+}\r
+\r
+bool\r
+MatrixClientNewOlmSessionIn(\r
+ MatrixClient * client,\r
+ const char * userId,\r
+ const char * deviceId,\r
+ const char * encrypted,\r
+ MatrixOlmSession ** outSession)\r
+{\r
MatrixClientRequestDeviceKey(client,\r
deviceId,\r
deviceKey, DEVICE_KEY_SIZE);\r
MatrixClientRequestDeviceKey(client,\r
deviceId,\r
deviceKey, DEVICE_KEY_SIZE);\r
MatrixClientRequestDeviceKey(client,\r
deviceId,\r
deviceKey, DEVICE_KEY_SIZE);\r
MatrixClientRequestDeviceKey(client,\r
deviceId,\r
deviceKey, DEVICE_KEY_SIZE);\r
- static char eventBuffer[TODEVICE_EVENT_SIZE];\r
- snprintf(eventBuffer, TODEVICE_EVENT_SIZE,\r
+ snprintf(g_TodeviceEventBuffer, TODEVICE_EVENT_SIZE,\r
- MatrixClientGetOlmSessionOut(client, userId, deviceId, &olmSession);\r
+ if (! MatrixClientGetOlmSession(client, userId, deviceId, &olmSession))\r
+ MatrixClientNewOlmSessionOut(client, userId, deviceId, &olmSession);\r
char thisSigningKey[DEVICE_KEY_SIZE];\r
MatrixOlmAccountGetSigningKey(&client->olmAccount, thisSigningKey, DEVICE_KEY_SIZE);\r
\r
char thisSigningKey[DEVICE_KEY_SIZE];\r
MatrixOlmAccountGetSigningKey(&client->olmAccount, thisSigningKey, DEVICE_KEY_SIZE);\r
\r
- eventBuffer,\r
- encryptedBuffer, ENCRYPTED_REQUEST_SIZE);\r
+ g_TodeviceEventBuffer,\r
+ g_EncryptedRequestBuffer, ENCRYPTED_REQUEST_SIZE);\r
\r
char thisDeviceKey[DEVICE_KEY_SIZE];\r
MatrixOlmAccountGetDeviceKey(&client->olmAccount, thisDeviceKey, DEVICE_KEY_SIZE);\r
\r
\r
char thisDeviceKey[DEVICE_KEY_SIZE];\r
MatrixOlmAccountGetDeviceKey(&client->olmAccount, thisDeviceKey, DEVICE_KEY_SIZE);\r
\r
-\r
- static char encryptedEventBuffer[ENCRYPTED_EVENT_SIZE];\r
- sprintf(encryptedEventBuffer,\r
+ snprintf(g_EncryptedEventBuffer, ENCRYPTED_EVENT_SIZE,\r
JsonEscape(client->userId, strlen(client->userId),\r
userIdEscaped, USER_ID_SIZE);\r
\r
JsonEscape(client->userId, strlen(client->userId),\r
userIdEscaped, USER_ID_SIZE);\r
\r
snprintf(request, KEYS_QUERY_REQUEST_SIZE,\r
"{\"device_keys\":{\"%s\":[]}}", client->userId);\r
\r
snprintf(request, KEYS_QUERY_REQUEST_SIZE,\r
"{\"device_keys\":{\"%s\":[]}}", client->userId);\r
\r
- static char responseBuffer[KEYS_QUERY_RESPONSE_SIZE];\r
- bool requestResult = MatrixHttpPost(client,\r
+ STATIC char responseBuffer[KEYS_QUERY_RESPONSE_SIZE];\r
+ bool requestResult = MatrixHttpPost(client->hc,\r
snprintf(query, JSON_QUERY_SIZE,\r
"$.device_keys.%s", userIdEscaped);\r
\r
snprintf(query, JSON_QUERY_SIZE,\r
"$.device_keys.%s", userIdEscaped);\r
\r
"%.*s", klen-2, key+1);\r
\r
// look for device key in value\r
"%.*s", klen-2, key+1);\r
\r
// look for device key in value\r
snprintf(deviceKeyQuery, JSON_QUERY_SIZE,\r
"$.keys.curve25519:%s", d.deviceId);\r
mjson_get_string(val, vlen,\r
deviceKeyQuery, d.deviceKey, DEVICE_KEY_SIZE);\r
\r
// look for signing key in value\r
snprintf(deviceKeyQuery, JSON_QUERY_SIZE,\r
"$.keys.curve25519:%s", d.deviceId);\r
mjson_get_string(val, vlen,\r
deviceKeyQuery, d.deviceKey, DEVICE_KEY_SIZE);\r
\r
// look for signing key in value\r
snprintf(signingKeyQuery, JSON_QUERY_SIZE,\r
"$.keys.ed25519:%s", d.deviceId);\r
mjson_get_string(val, vlen,\r
snprintf(signingKeyQuery, JSON_QUERY_SIZE,\r
"$.keys.ed25519:%s", d.deviceId);\r
mjson_get_string(val, vlen,\r
snprintf(deleteRequest, 1024,\r
"{\"devices\":[\"%s\"]}",\r
client->deviceId);\r
snprintf(deleteRequest, 1024,\r
"{\"devices\":[\"%s\"]}",\r
client->deviceId);\r
- static char deleteResponse[1024];\r
- bool res = MatrixHttpPost(client, "/_matrix/client/v3/delete_devices",\r
+ STATIC char deleteResponse[1024];\r
+ bool res = MatrixHttpPost(client->hc, "/_matrix/client/v3/delete_devices",\r
deleteRequest, deleteResponse, 1024, true);\r
return res;\r
}
\ No newline at end of file
deleteRequest, deleteResponse, 1024, true);\r
return res;\r
}
\ No newline at end of file