\r
\r
#define USER_ID_SIZE 64\r
+#define ROOM_ID_SIZE 128\r
#define SERVER_SIZE 20\r
#define ACCESS_TOKEN_SIZE 40\r
#define DEVICE_ID_SIZE 20\r
#define EXPIRE_MS_SIZE 20\r
#define REFRESH_TOKEN_SIZE 20\r
-#define MAX_URL_LEN 128\r
+#define MAX_URL_LEN 1024\r
\r
#define OLM_IDENTITY_KEYS_JSON_SIZE 128\r
#define DEVICE_KEY_SIZE 44\r
#define SIGNING_KEY_SIZE 44\r
+#define ONETIME_KEY_SIZE 44\r
+#define MASTER_KEY_SIZE 44\r
\r
#define KEY_SHARE_EVENT_LEN 1024\r
\r
\r
#define OLM_SESSION_MEMORY_SIZE 3352\r
#define OLM_ENCRYPT_RANDOM_SIZE 32\r
+#define OLM_OUTBOUND_SESSION_RANDOM_SIZE (32*2)\r
\r
-#define OLM_ONETIME_KEYS_RANDOM_SIZE 32*10\r
+#define OLM_ONETIME_KEYS_RANDOM_SIZE (32*10)\r
#define OLM_KEY_ID_SIZE 32\r
\r
#define OLM_SIGNATURE_SIZE 128\r
#define JSON_ONETIME_KEY_SIGNED_SIZE 256\r
#define JSON_SIGNATURE_SIZE 256\r
\r
-#define NUM_MEGOLM_SESSIONS 10\r
-#define NUM_OLM_SESSIONS 10\r
+#define NUM_MEGOLM_SESSIONS 2\r
+#define NUM_OLM_SESSIONS 2\r
#define NUM_DEVICES 10\r
\r
-void\r
-Randomize(uint8_t * random, int randomLen);\r
+// HTTP\r
+\r
+typedef struct MatrixHttpConnection MatrixHttpConnection;\r
\r
bool\r
-JsonEscape(\r
- char * sIn, int sInLen,\r
- char * sOut, int sOutCap);\r
+MatrixHttpInit(\r
+ MatrixHttpConnection ** hc,\r
+ const char * host);\r
+\r
+bool\r
+MatrixHttpDeinit(\r
+ MatrixHttpConnection ** hc);\r
\r
-bool JsonSign(\r
- char * sIn, int sInLen,\r
- char * sOut, int sOutCap);\r
+bool\r
+MatrixHttpSetAccessToken(\r
+ MatrixHttpConnection * hc,\r
+ const char * accessToken);\r
+\r
+bool\r
+MatrixHttpGet(\r
+ MatrixHttpConnection * hc,\r
+ const char * url,\r
+ char * outResponseBuffer, int outResponseCap,\r
+ bool authenticated);\r
+\r
+bool\r
+MatrixHttpPost(\r
+ MatrixHttpConnection * hc,\r
+ const char * url,\r
+ const char * requestBuffer,\r
+ char * outResponseBuffer, int outResponseCap,\r
+ bool authenticated);\r
+\r
+bool\r
+MatrixHttpPut(\r
+ MatrixHttpConnection * hc,\r
+ const char * url,\r
+ const char * requestBuffer,\r
+ char * outResponseBuffer, int outResponseCap,\r
+ bool authenticated);\r
+\r
+\r
\r
// Matrix Device\r
\r
typedef struct MatrixDevice {\r
char deviceId[DEVICE_ID_SIZE];\r
char deviceKey[DEVICE_KEY_SIZE];\r
+ char signingKey[SIGNING_KEY_SIZE];\r
} MatrixDevice;\r
\r
\r
MatrixOlmAccountInit(\r
MatrixOlmAccount * account);\r
\r
+bool\r
+MatrixOlmAccountUnpickle(\r
+ MatrixOlmAccount * account,\r
+ void * pickled, int pickledLen,\r
+ const void * key, int keyLen);\r
+\r
+bool\r
+MatrixOlmAccountGetDeviceKey(\r
+ MatrixOlmAccount * account,\r
+ char * key, int keyCap);\r
+ \r
+bool\r
+MatrixOlmAccountGetSigningKey(\r
+ MatrixOlmAccount * account,\r
+ char * key, int keyCap);\r
+\r
\r
// Matrix Olm Session\r
\r
typedef struct MatrixOlmSession {\r
- const char * deviceId;\r
+ const char * deviceId; // TODO: char[]\r
\r
int type;\r
OlmSession * session;\r
} MatrixOlmSession;\r
\r
bool\r
-MatrixOlmSessionInit(\r
+MatrixOlmSessionUnpickle(\r
MatrixOlmSession * session,\r
- const char * deviceId);\r
+ const char * deviceId,\r
+ void * pickled, int pickledLen,\r
+ const void * key, int keyLen);\r
+\r
+bool\r
+MatrixOlmSessionFrom(\r
+ MatrixOlmSession * session,\r
+ OlmAccount * olmAccount,\r
+ const char * deviceId,\r
+ const char * deviceKey,\r
+ const char * encrypted);\r
+\r
+bool\r
+MatrixOlmSessionTo(\r
+ MatrixOlmSession * session,\r
+ OlmAccount * olmAccount,\r
+ const char * deviceId,\r
+ const char * deviceKey,\r
+ const char * deviceOnetimeKey);\r
\r
bool\r
MatrixOlmSessionEncrypt(\r
const char * plaintext,\r
char * outBuffer, int outBufferCap);\r
\r
+bool\r
+MatrixOlmSessionDecrypt(\r
+ MatrixOlmSession * session,\r
+ size_t messageType,\r
+ char * encrypted,\r
+ char * outBuffer, int outBufferCap);\r
+\r
\r
// Matrix Megolm Session\r
\r
typedef struct MatrixMegolmInSession {\r
+ char roomId[ROOM_ID_SIZE];\r
+ char id[MEGOLM_SESSION_ID_SIZE];\r
+ char key[MEGOLM_SESSION_KEY_SIZE];\r
+\r
OlmInboundGroupSession * session;\r
+ char memory[MEGOLM_OUTBOUND_SESSION_MEMORY_SIZE];\r
+\r
} MatrixMegolmInSession;\r
\r
-typedef struct MatrixMegolmOutSession {\r
- const char * roomId;\r
+bool\r
+MatrixMegolmInSessionInit(\r
+ MatrixMegolmInSession * session,\r
+ const char * roomId,\r
+ const char * sessionId,\r
+ const char * sessionKey, int sessionKeyLen);\r
\r
- OlmOutboundGroupSession * session;\r
- char memory[MEGOLM_OUTBOUND_SESSION_MEMORY_SIZE];\r
+bool\r
+MatrixMegolmInSessionDecrypt(\r
+ MatrixMegolmInSession * session,\r
+ const char * encrypted, int encryptedLen,\r
+ char * outDecrypted, int outDecryptedCap);\r
\r
+typedef struct MatrixMegolmOutSession {\r
+ char roomId[ROOM_ID_SIZE];\r
char id[MEGOLM_SESSION_ID_SIZE];\r
char key[MEGOLM_SESSION_KEY_SIZE];\r
+\r
+ OlmOutboundGroupSession * session;\r
+ char memory[MEGOLM_OUTBOUND_SESSION_MEMORY_SIZE];\r
} MatrixMegolmOutSession;\r
\r
bool\r
MatrixMegolmOutSessionInit(\r
MatrixMegolmOutSession * session,\r
const char * roomId);\r
- \r
+\r
bool\r
MatrixMegolmOutSessionEncrypt(\r
MatrixMegolmOutSession * session,\r
MatrixDevice devices[NUM_DEVICES];\r
int numDevices;\r
\r
- char deviceKey[DEVICE_KEY_SIZE];\r
- char signingKey[DEVICE_KEY_SIZE];\r
+ // char deviceKey[DEVICE_KEY_SIZE];\r
+ // char signingKey[DEVICE_KEY_SIZE];\r
\r
char userId[USER_ID_SIZE];\r
- char server[SERVER_SIZE];\r
char accessToken[ACCESS_TOKEN_SIZE];\r
char deviceId[DEVICE_ID_SIZE];\r
char expireMs[EXPIRE_MS_SIZE];\r
char refreshToken[REFRESH_TOKEN_SIZE];\r
+ char masterKey[MASTER_KEY_SIZE];\r
\r
- void * httpUserData;\r
+ bool verified;\r
+\r
+ MatrixHttpConnection * hc;\r
} MatrixClient;\r
\r
bool\r
MatrixClientInit(\r
- MatrixClient * client,\r
- const char * server);\r
+ MatrixClient * client);\r
\r
bool\r
MatrixClientSetAccessToken(\r
MatrixClientUploadDeviceKeys(\r
MatrixClient * client);\r
\r
+bool\r
+MatrixClientClaimOnetimeKey(\r
+ MatrixClient * client,\r
+ const char * userId,\r
+ const char * deviceId,\r
+ char * outOnetimeKey, int outOnetimeKeyCap);\r
+\r
bool\r
MatrixClientLoginPassword(\r
MatrixClient * client,\r
const char * msgType,\r
const char * msgBody);\r
\r
+void\r
+HandleEvent(\r
+ MatrixClient * client,\r
+ const char * event, int eventLen);\r
+\r
+void\r
+HandleRoomEvent(\r
+ MatrixClient * client,\r
+ const char * room, int roomLen,\r
+ const char * event, int eventLen);\r
+\r
bool\r
MatrixClientSync(\r
MatrixClient * client,\r
- char * outSyncBuffer, int outSyncCap);\r
+ char * outSyncBuffer, int outSyncCap,\r
+ char * nextBatch, int nextBatchCap);\r
+\r
+bool\r
+MatrixClientGetRoomEvent(\r
+ MatrixClient * client,\r
+ const char * roomId,\r
+ const char * eventId,\r
+ char * outEvent, int outEventCap);\r
\r
bool\r
MatrixClientShareMegolmOutSession(\r
MatrixClient * client,\r
+ const char * userId,\r
const char * deviceId,\r
MatrixMegolmOutSession * session);\r
\r
bool\r
MatrixClientShareMegolmOutSessionTest(\r
MatrixClient * client,\r
+ const char * userId,\r
const char * deviceId,\r
MatrixMegolmOutSession * session);\r
\r
MatrixMegolmOutSession ** outSession);\r
\r
bool\r
-MatrixClientSetMegolmOutSession(\r
+MatrixClientNewMegolmOutSession(\r
MatrixClient * client,\r
const char * roomId,\r
- MatrixMegolmOutSession session);\r
+ MatrixMegolmOutSession ** outSession);\r
+\r
+bool\r
+MatrixClientGetMegolmInSession(\r
+ MatrixClient * client,\r
+ const char * roomId, int roomIdLen,\r
+ const char * sessionId, int sessionIdLen,\r
+ MatrixMegolmInSession ** outSession);\r
+\r
+bool\r
+MatrixClientNewMegolmInSession(\r
+ MatrixClient * client,\r
+ const char * roomId,\r
+ const char * sessionId,\r
+ const char * sessionKey,\r
+ MatrixMegolmInSession ** outSession);\r
+ \r
+bool\r
+MatrixClientRequestMegolmInSession(\r
+ MatrixClient * client,\r
+ const char * roomId,\r
+ const char * sessionId,\r
+ const char * senderKey,\r
+ const char * userId,\r
+ const char * deviceId); // TODO: remove deviceId (query all devices)\r
\r
bool\r
MatrixClientGetOlmSession(\r
MatrixClient * client,\r
+ const char * userId,\r
+ const char * deviceId,\r
+ MatrixOlmSession ** outSession);\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
+bool\r
+MatrixClientNewOlmSessionOut(\r
+ MatrixClient * client,\r
+ const char * userId,\r
const char * deviceId,\r
MatrixOlmSession ** outSession);\r
\r
const char * msgType);\r
\r
bool\r
-MatrixClientGetDeviceKey(\r
+MatrixClientSendDummy(\r
MatrixClient * client,\r
- const char * deviceId,\r
- char * outDeviceKey, int outDeviceKeyCap);\r
+ const char * userId,\r
+ const char * deviceId);\r
\r
bool\r
-MatrixClientGetDeviceKey(\r
+MatrixClientRequestDeviceKey(\r
MatrixClient * client,\r
const char * deviceId,\r
char * outDeviceKey, int outDeviceKeyCap);\r
-\r
+ \r
bool\r
-MatrixClientRequestDeviceKeys(\r
- MatrixClient * client);\r
-\r
+MatrixClientRequestSigningKey(\r
+ MatrixClient * client,\r
+ const char * deviceId,\r
+ char * outSigningKey, int outSigningKeyCap);\r
\r
+bool\r
+MatrixClientRequestMasterKey(\r
+ MatrixClient * client,\r
+ char * outMasterKey, int outMasterKeyCap);\r
\r
bool\r
-MatrixHttpInit(\r
+MatrixClientRequestDeviceKeys(\r
MatrixClient * client);\r
\r
bool\r
-MatrixHttpDeinit(\r
+MatrixClientDeleteDevice(\r
MatrixClient * client);\r
\r
-bool\r
-MatrixHttpGet(\r
- MatrixClient * client,\r
- const char * url,\r
- char * outResponseBuffer, int outResponseCap,\r
- bool authenticated);\r
\r
-bool\r
-MatrixHttpPost(\r
- MatrixClient * client,\r
- const char * url,\r
- const char * requestBuffer,\r
- char * outResponseBuffer, int outResponseCap,\r
- bool authenticated);\r
+// util\r
+\r
+void\r
+Randomize(uint8_t * random, int randomLen);\r
\r
bool\r
-MatrixHttpPut(\r
+JsonEscape(\r
+ const char * sIn, int sInLen,\r
+ char * sOut, int sOutCap);\r
+ \r
+bool\r
+JsonCanonicalize(\r
+ const char * sIn, int sInLen,\r
+ char * sOut, int sOutCap);\r
+ \r
+bool\r
+JsonSign(\r
MatrixClient * client,\r
- const char * url,\r
- const char * requestBuffer,\r
- char * outResponseBuffer, int outResponseCap,\r
- bool authenticated);\r
+ const char * sIn, int sInLen,\r
+ char * sOut, int sOutCap);\r
\r
#endif\r