silcclient: auto-negotiation of private message key using SKE over SILCnet
[silc.git] / lib / silcclient / command_reply.c
index 29e05e73fe086b419299d922f1e196da594b2cfa..45de171ef1d72b79c26f2524757f07b1025da66e 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2007 Pekka Riikonen
+  Copyright (C) 1997 - 2014 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -738,6 +738,12 @@ SILC_FSM_STATE(silc_client_command_reply_nick)
     goto out;
   }
 
+  /* All auto-generated private message keys must be rekeyed because
+     we changed nick and others may not know about it. */
+  conn->internal->ake_generation++;
+  SILC_LOG_DEBUG(("AKE keys will be rekeyed, generation %u",
+                 conn->internal->ake_generation));
+
   silc_rwlock_unlock(conn->local_entry->internal.lock);
 
   /* Notify application */
@@ -1172,6 +1178,17 @@ SILC_FSM_STATE(silc_client_command_reply_join)
     silc_client_ref_channel(client, conn, channel);
   }
 
+  /* Get hmac */
+  hmac = silc_argument_get_arg_type(args, 11, NULL);
+  if (hmac && !silc_hmac_is_supported(hmac)) {
+    if (cmd->verbose)
+      SAY(client, conn, SILC_CLIENT_MESSAGE_COMMAND_ERROR,
+         "Cannot join channel: Unsupported HMAC `%s'", hmac);
+    ERROR_CALLBACK(SILC_STATUS_ERR_UNKNOWN_ALGORITHM);
+    silc_rwlock_unlock(channel->internal.lock);
+    goto out;
+  }
+
   /* Get the list count */
   tmp = silc_argument_get_arg_type(args, 12, &len);
   if (!tmp) {
@@ -1245,19 +1262,6 @@ SILC_FSM_STATE(silc_client_command_reply_join)
     }
   }
 
-  /* Get hmac */
-  hmac = silc_argument_get_arg_type(args, 11, NULL);
-  if (hmac) {
-    if (!silc_hmac_alloc(hmac, NULL, &channel->internal.hmac)) {
-      if (cmd->verbose)
-       SAY(client, conn, SILC_CLIENT_MESSAGE_COMMAND_ERROR,
-           "Cannot join channel: Unsupported HMAC `%s'", hmac);
-      ERROR_CALLBACK(SILC_STATUS_ERR_UNKNOWN_ALGORITHM);
-      silc_rwlock_unlock(channel->internal.lock);
-      goto out;
-    }
-  }
-
   /* Get channel mode */
   tmp = silc_argument_get_arg_type(args, 5, &len);
   if (tmp && len == 4)
@@ -2018,7 +2022,7 @@ SILC_FSM_STATE(silc_client_command_reply_getkey)
   SilcServerEntry server_entry;
   unsigned char *tmp;
   SilcUInt32 len;
-  SilcPublicKey public_key;
+  SilcPublicKey public_key = NULL;
   SilcID id;
 
   /* Sanity checks */