OTK + Uploading keys
This commit is contained in:
parent
77e9344057
commit
3a35dadf3d
1 changed files with 48 additions and 13 deletions
61
src/main.cpp
61
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<char *>(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<uint8_t *>(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<OlmAccount*>(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<uint8_t *>(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();
|
||||
|
|
Loading…
Reference in a new issue