From 3a35dadf3d8837b14f57727c0759eebbae9ffa11 Mon Sep 17 00:00:00 2001 From: timoreo Date: Sat, 9 Dec 2023 15:37:06 +0100 Subject: [PATCH] OTK + Uploading keys --- src/main.cpp | 61 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 7a9d016..c66eeb5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -189,6 +189,43 @@ json_t* get_fallback_keys(Matrix::Client& client, OlmAccount* acc) { json_decref(keys); return fallback_keys; } + +json_t* get_unpublished_otk(Matrix::Client client, OlmAccount* acc) { + json_t * otk_keys = json_object(); + // Extract keys + size_t acclen = olm_account_one_time_keys_length(acc); + auto acckeys = reinterpret_cast(malloc(acclen)); + olm_account_one_time_keys(acc, acckeys, acclen); + json_t * keys = json_loads(acckeys, 0, nullptr); + free(acckeys); + + json_t* keyobj = json_object_get(keys, "curve25519"); + void* iter = json_object_iter(keyobj); + + while (iter != nullptr) { + const char* keyid = json_object_iter_key(iter); + json_t* keyval = json_object_iter_value(iter); + json_t* tosign = json_object(); + json_object_set_new(tosign, "key", keyval); + + sign_json(client, acc, tosign); + json_object_set_new(otk_keys, (std::string("signed_curve25519:") + keyid).c_str(), tosign ); + iter = json_object_iter_next(keyobj, iter); + } + json_decref(keys); + return otk_keys; +} + +void save_keys(OlmAccount* acc) { + size_t pacclen = olm_pickle_account_length(acc); + auto m = reinterpret_cast(malloc(pacclen)); + olm_pickle_account(acc, nullptr, 0, m, pacclen); + pacclen = _olm_decode_base64(m, pacclen, m); + FILE* file = fopen("secret-keys", "w"); + fwrite(m, pacclen, 1, file); + free(m); + fclose(file); +} OlmAccount* load_account(Matrix::Client client){ auto* acc = static_cast(malloc(olm_account_size())); olm_account(acc); @@ -206,18 +243,7 @@ OlmAccount* load_account(Matrix::Client client){ generate_fallback_key(acc); // Convert to pickled format - size_t pacclen = olm_pickle_account_length(acc); - - auto m = reinterpret_cast(malloc(pacclen)); - - olm_pickle_account(acc, nullptr, 0, m, pacclen); - - pacclen = _olm_decode_base64(m, pacclen, m); - FILE* file = std::fopen("secret-keys", "w"); - std::fwrite(m, pacclen, 1, file); - - free(m); - std::fclose(file); + save_keys(acc); // Upload the keys --- // Build device key json json_t * upload_keys = json_object(); @@ -230,8 +256,17 @@ OlmAccount* load_account(Matrix::Client client){ json_t* fallback_keys = get_fallback_keys(client, acc); // fallback keys are already signed json_object_set(upload_keys, "fallback_keys", fallback_keys); - json_decref(upload_keys); + // OTK keys + json_t* otk = get_unpublished_otk(client, acc); + // OTK keys are already signed + json_object_set(upload_keys, "one_time_keys", otk); + + client.uploadKeys(upload_keys); + json_decref(upload_keys); + olm_account_mark_keys_as_published(acc); + // Whether a key or not is published is saved, let's save again + save_keys(acc); } else { // Load from file std::ifstream::pos_type fsize = ifs.tellg();