From 3d8f47a72416ff4b1ca64bf66071a62e4661d036 Mon Sep 17 00:00:00 2001 From: Paul Fariello Date: Mon, 25 Mar 2019 18:30:46 +0140 Subject: [PATCH] Use /omemo fingerprint to show contact fingerprints Don't print fingerprints when they are received --- src/command/cmd_ac.c | 5 +++ src/command/cmd_defs.c | 4 +-- src/command/cmd_funcs.c | 46 ++++++++++++++++++++++++-- src/omemo/omemo.c | 71 +++++++++++++++++++++++++---------------- src/omemo/omemo.h | 2 ++ 5 files changed, 96 insertions(+), 32 deletions(-) diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index 86ef6ba9..9584543e 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -2153,6 +2153,11 @@ _omemo_autocomplete(ProfWin *window, const char *const input, gboolean previous) } } + found = autocomplete_param_with_func(input, "/omemo fingerprint", roster_contact_autocomplete, previous); + if (found) { + return found; + } + found = autocomplete_param_with_ac(input, "/omemo log", omemo_log_ac, TRUE, previous); if (found) { return found; diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index 311b404e..5a3e6873 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -2350,7 +2350,7 @@ static struct cmd_t command_defs[] = "/omemo start []", "/omemo trust [] ", "/omemo end", - "/omemo fingerprint") + "/omemo fingerprint []") CMD_DESC( "Omemo commands to manage keys, and perform encryption during chat sessions.") CMD_ARGS( @@ -2359,7 +2359,7 @@ static struct cmd_t command_defs[] = { "end", "End the current OMEMO session," }, { "log on|off", "Enable or disable plaintext logging of OMEMO encrypted messages." }, { "log redact", "Log OMEMO encrypted messages, but replace the contents with [redacted]. This is the default." }, - { "fingerprint", "Show current device fingerprint." }) + { "fingerprint", "Show contact fingerprints." }) CMD_EXAMPLES( "/omemo gen", "/omemo start buddy@buddychat.org", diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index d254960d..fcbb10b8 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -8080,9 +8080,49 @@ cmd_omemo_fingerprint(ProfWin *window, const char *const command, gchar **args) return TRUE; } - char *fingerprint = omemo_own_fingerprint(TRUE); - cons_show("%s", fingerprint); - free(fingerprint); + Jid *jid; + if (!args[1]) { + if (window->type == WIN_CONSOLE) { + char *fingerprint = omemo_own_fingerprint(TRUE); + cons_show("Your OMEMO fingerprint: %s", fingerprint); + free(fingerprint); + return TRUE; + } else if (window->type == WIN_CHAT) { + ProfChatWin *chatwin = (ProfChatWin*)window; + jid = jid_create(chatwin->barejid); + } else { + win_println(window, THEME_DEFAULT, '-', "You must be in a regular chat window to print fingerprint without providing the contact."); + return TRUE; + } + } else { + jid = jid_create(args[1]); + if (!jid) { + cons_show("%s is not a valid jid", args[1]); + return TRUE; + } + } + + GList *fingerprints = omemo_known_device_identities(jid->barejid); + GList *fingerprint; + + if (!fingerprints) { + win_println(window, THEME_DEFAULT, '-', "There is no known fingerprints for %s", jid->barejid); + return TRUE; + } + + for (fingerprint = fingerprints; fingerprint != NULL; fingerprint = fingerprint->next) { + char *formatted_fingerprint = omemo_format_fingerprint(fingerprint->data); + gboolean trusted = omemo_is_trusted_identity(jid->barejid, fingerprint->data); + + win_println(window, THEME_DEFAULT, '-', "%s's OMEMO fingerprint: %s%s", jid->barejid, formatted_fingerprint, trusted ? " (trusted)" : ""); + + free(formatted_fingerprint); + } + + g_list_free(fingerprints); + + win_println(window, THEME_DEFAULT, '-', "You can trust it with '/omemo trust '"); + win_println(window, THEME_DEFAULT, '-', "You can untrust it with '/omemo untrust '"); return TRUE; #else diff --git a/src/omemo/omemo.c b/src/omemo/omemo.c index 8ec0554f..01eb6b67 100644 --- a/src/omemo/omemo.c +++ b/src/omemo/omemo.c @@ -496,32 +496,6 @@ omemo_start_device_session(const char *const jid, uint32_t device_id, gboolean trusted = is_trusted_identity(&address, (uint8_t *)identity_key_raw, identity_key_len, &omemo_ctx.identity_key_store); - Jid *ownjid = jid_create(connection_get_fulljid()); - if (g_strcmp0(jid, ownjid->barejid) == 0) { - char *fingerprint = omemo_fingerprint(identity_key, TRUE); - - cons_show("Available device identity for %s: %s%s", ownjid->barejid, fingerprint, trusted ? " (trusted)" : ""); - if (trusted) { - cons_show("You can untrust it with '/omemo untrust %s '", ownjid->barejid); - } else { - cons_show("You can trust it with '/omemo trust %s '", ownjid->barejid); - } - free(fingerprint); - } - - ProfChatWin *chatwin = wins_get_chat(jid); - if (chatwin) { - char *fingerprint = omemo_fingerprint(identity_key, TRUE); - - win_println((ProfWin *)chatwin, THEME_DEFAULT, '-', "Available device identity: %s%s", fingerprint, trusted ? " (trusted)" : ""); - if (trusted) { - win_println((ProfWin *)chatwin, THEME_DEFAULT, '-', "You can untrust it with '/omemo untrust '"); - } else { - win_println((ProfWin *)chatwin, THEME_DEFAULT, '-', "You can trust it with '/omemo trust '"); - } - free(fingerprint); - } - if (!trusted) { goto out; } @@ -570,7 +544,6 @@ omemo_start_device_session(const char *const jid, uint32_t device_id, out: SIGNAL_UNREF(identity_key); - jid_destroy(ownjid); } char * @@ -884,6 +857,50 @@ omemo_own_fingerprint(gboolean formatted) return omemo_fingerprint(identity, formatted); } +GList * +omemo_known_device_identities(const char *const jid) +{ + GHashTable *known_identities = g_hash_table_lookup(omemo_ctx.known_devices, jid); + if (!known_identities) { + return NULL; + } + + return g_hash_table_get_keys(known_identities); +} + +gboolean +omemo_is_trusted_identity(const char *const jid, const char *const fingerprint) +{ + GHashTable *known_identities = g_hash_table_lookup(omemo_ctx.known_devices, jid); + if (!known_identities) { + return FALSE; + } + + void *device_id = g_hash_table_lookup(known_identities, fingerprint); + if (!device_id) { + return FALSE; + } + + signal_protocol_address address = { + .name = jid, + .name_len = strlen(jid), + .device_id = GPOINTER_TO_INT(device_id), + }; + + size_t fingerprint_len; + unsigned char *fingerprint_raw = omemo_fingerprint_decode(fingerprint, &fingerprint_len); + unsigned char djb_type[] = {'\x05'}; + signal_buffer *buffer = signal_buffer_create(djb_type, 1); + buffer = signal_buffer_append(buffer, fingerprint_raw, fingerprint_len); + + gboolean trusted = is_trusted_identity(&address, signal_buffer_data(buffer), signal_buffer_len(buffer), &omemo_ctx.identity_key_store); + + free(fingerprint_raw); + signal_buffer_free(buffer); + + return trusted; +} + static char * omemo_fingerprint(ec_public_key *identity, gboolean formatted) { diff --git a/src/omemo/omemo.h b/src/omemo/omemo.h index e9e9cf8d..ec48e183 100644 --- a/src/omemo/omemo.h +++ b/src/omemo/omemo.h @@ -36,6 +36,8 @@ char *omemo_format_fingerprint(const char *const fingerprint); char *omemo_own_fingerprint(gboolean formatted); void omemo_trust(const char *const jid, const char *const fingerprint); void omemo_untrust(const char *const jid, const char *const fingerprint); +GList *omemo_known_device_identities(const char *const jid); +gboolean omemo_is_trusted_identity(const char *const jid, const char *const fingerprint); void omemo_start_session(const char *const barejid); void omemo_start_muc_sessions(const char *const roomjid);