[Pkg-silc-commits] r218 - in /silc-client/trunk: debian/changelog lib/silcclient/command_reply.c lib/silccrypt/aes.c lib/silccrypt/rijndael_internal.h lib/silcske/silcconnauth.c lib/silcskr/silcskr.c lib/silcutil/silcutil.c lib/silcutil/unix/silcunixschedule.c

lunar at users.alioth.debian.org lunar at users.alioth.debian.org
Sat Mar 8 22:56:40 UTC 2008


Author: lunar
Date: Sat Mar  8 22:56:40 2008
New Revision: 218

URL: http://svn.debian.org/wsvn/pkg-silc/?sc=1&rev=218
Log:
* Cherry-pick bugfixes from silc-toolkit 1.1.6 to update the embedded copy
  used by the irssi plugin.

Modified:
    silc-client/trunk/debian/changelog
    silc-client/trunk/lib/silcclient/command_reply.c
    silc-client/trunk/lib/silccrypt/aes.c
    silc-client/trunk/lib/silccrypt/rijndael_internal.h
    silc-client/trunk/lib/silcske/silcconnauth.c
    silc-client/trunk/lib/silcskr/silcskr.c
    silc-client/trunk/lib/silcutil/silcutil.c
    silc-client/trunk/lib/silcutil/unix/silcunixschedule.c

Modified: silc-client/trunk/debian/changelog
URL: http://svn.debian.org/wsvn/pkg-silc/silc-client/trunk/debian/changelog?rev=218&op=diff
==============================================================================
--- silc-client/trunk/debian/changelog (original)
+++ silc-client/trunk/debian/changelog Sat Mar  8 22:56:40 2008
@@ -2,6 +2,8 @@
 
   [ Jérémy Bobbio ]
   * Add a watch file.
+  * Cherry-pick bugfixes from silc-toolkit 1.1.6 to update the embedded copy
+    used by the irssi plugin.
 
  -- Jérémy Bobbio <lunar at debian.org>  Thu, 06 Mar 2008 23:52:55 +0100
 

Modified: silc-client/trunk/lib/silcclient/command_reply.c
URL: http://svn.debian.org/wsvn/pkg-silc/silc-client/trunk/lib/silcclient/command_reply.c?rev=218&op=diff
==============================================================================
--- silc-client/trunk/lib/silcclient/command_reply.c (original)
+++ silc-client/trunk/lib/silcclient/command_reply.c Sat Mar  8 22:56:40 2008
@@ -822,7 +822,7 @@
   SilcClient client = conn->client;
   SilcCommandPayload payload = state_context;
   SilcArgumentPayload args = silc_command_get_args(payload);
-  SilcChannelEntry channel;
+  SilcChannelEntry channel = NULL;
   char *topic;
   SilcUInt32 len;
   SilcID id;
@@ -859,6 +859,7 @@
   silc_client_command_callback(cmd, channel, channel->topic);
 
  out:
+  silc_client_unref_channel(client, conn, channel);
   silc_fsm_next(fsm, silc_client_command_reply_processed);
   return SILC_FSM_CONTINUE;
 }
@@ -874,7 +875,7 @@
   SilcClient client = conn->client;
   SilcCommandPayload payload = state_context;
   SilcArgumentPayload args = silc_command_get_args(payload);
-  SilcChannelEntry channel;
+  SilcChannelEntry channel = NULL;
   unsigned char *tmp;
   SilcUInt32 len;
   SilcArgumentPayload invite_args = NULL;
@@ -909,6 +910,7 @@
     silc_argument_payload_free(invite_args);
 
  out:
+  silc_client_unref_channel(client, conn, channel);
   silc_fsm_next(fsm, silc_client_command_reply_processed);
   return SILC_FSM_CONTINUE;
 }
@@ -1113,7 +1115,7 @@
   channel->internal.resolve_cmd_ident = 0;
   silc_client_unref_channel(client, conn, channel);
 
-  SILC_FSM_CALL_CONTINUE(&cmd->thread);
+  SILC_FSM_CALL_CONTINUE_SYNC(&cmd->thread);
 }
 
 
@@ -1263,8 +1265,13 @@
   /* Get channel key and save it */
   tmp = silc_argument_get_arg_type(args, 7, &len);
   if (tmp) {
-    silc_buffer_set(&keyp, tmp, len);
-    silc_client_save_channel_key(client, conn, &keyp, channel);
+    /* If channel key already exists on the channel then while resolving
+       the user list we have already received new key from server.  Don't
+       replace it with this old key. */
+    if (!channel->internal.send_key) {
+      silc_buffer_set(&keyp, tmp, len);
+      silc_client_save_channel_key(client, conn, &keyp, channel);
+    }
   }
 
   /* Get topic */
@@ -1420,7 +1427,7 @@
   SilcArgumentPayload args = silc_command_get_args(payload);
   unsigned char *tmp;
   SilcUInt32 mode;
-  SilcChannelEntry channel;
+  SilcChannelEntry channel = NULL;
   SilcUInt32 len;
   SilcPublicKey public_key = NULL;
   SilcID id;
@@ -1481,6 +1488,7 @@
 			       channel->channel_pubkeys, channel->user_limit);
 
  out:
+  silc_client_unref_channel(client, conn, channel);
   if (public_key)
     silc_pkcs_public_key_free(public_key);
   silc_fsm_next(fsm, silc_client_command_reply_processed);
@@ -1499,7 +1507,7 @@
   SilcCommandPayload payload = state_context;
   SilcArgumentPayload args = silc_command_get_args(payload);
   SilcClientEntry client_entry;
-  SilcChannelEntry channel;
+  SilcChannelEntry channel = NULL;
   SilcChannelUser chu;
   unsigned char *modev;
   SilcUInt32 len, mode;
@@ -1556,6 +1564,7 @@
   silc_client_unref_client(client, conn, client_entry);
 
  out:
+  silc_client_unref_channel(client, conn, channel);
   silc_fsm_next(fsm, silc_client_command_reply_processed);
   return SILC_FSM_CONTINUE;
 }
@@ -1570,7 +1579,7 @@
   SilcCommandPayload payload = state_context;
   SilcArgumentPayload args = silc_command_get_args(payload);
   SilcClientEntry client_entry;
-  SilcChannelEntry channel;
+  SilcChannelEntry channel = NULL;
   SilcID id;
 
   /* Sanity checks */
@@ -1609,6 +1618,7 @@
   silc_client_unref_client(client, conn, client_entry);
 
  out:
+  silc_client_unref_channel(client, conn, channel);
   silc_fsm_next(fsm, silc_client_command_reply_processed);
   return SILC_FSM_CONTINUE;
 }
@@ -1716,7 +1726,7 @@
   SilcClient client = conn->client;
   SilcCommandPayload payload = state_context;
   SilcArgumentPayload args = silc_command_get_args(payload);
-  SilcChannelEntry channel;
+  SilcChannelEntry channel = NULL;
   unsigned char *tmp;
   SilcUInt32 len;
   SilcArgumentPayload invite_args = NULL;
@@ -1751,6 +1761,7 @@
     silc_argument_payload_free(invite_args);
 
  out:
+  silc_client_unref_channel(client, conn, channel);
   silc_fsm_next(fsm, silc_client_command_reply_processed);
   return SILC_FSM_CONTINUE;
 }
@@ -1767,6 +1778,8 @@
   SilcCommandPayload payload = state_context;
   SilcArgumentPayload args = silc_command_get_args(payload);
   SilcChannelEntry channel;
+  SilcCipher key;
+  SilcHmac hmac;
   SilcID id;
 
   /* Sanity checks */
@@ -1791,6 +1804,32 @@
 
   /* Notify application */
   silc_client_command_callback(cmd, channel);
+
+  /* Remove old keys and stuff.  The channel may remain even after leaving
+     but we want to remove these always. */
+  if (channel->internal.send_key)
+    silc_cipher_free(channel->internal.send_key);
+  channel->internal.send_key = NULL;
+  if (channel->internal.receive_key)
+    silc_cipher_free(channel->internal.receive_key);
+  channel->internal.receive_key = NULL;
+  if (channel->internal.hmac)
+    silc_hmac_free(channel->internal.hmac);
+  channel->internal.hmac = NULL;
+  if (channel->internal.old_channel_keys) {
+    silc_dlist_start(channel->internal.old_channel_keys);
+    while ((key = silc_dlist_get(channel->internal.old_channel_keys)))
+      silc_cipher_free(key);
+    silc_dlist_uninit(channel->internal.old_channel_keys);
+  }
+  channel->internal.old_channel_keys = NULL;
+  if (channel->internal.old_hmacs) {
+    silc_dlist_start(channel->internal.old_hmacs);
+    while ((hmac = silc_dlist_get(channel->internal.old_hmacs)))
+      silc_hmac_free(hmac);
+    silc_dlist_uninit(channel->internal.old_hmacs);
+  }
+  channel->internal.old_hmacs = NULL;
 
   /* Now delete the channel. */
   silc_client_empty_channel(client, conn, channel);

Modified: silc-client/trunk/lib/silccrypt/aes.c
URL: http://svn.debian.org/wsvn/pkg-silc/silc-client/trunk/lib/silccrypt/aes.c?rev=218&op=diff
==============================================================================
--- silc-client/trunk/lib/silccrypt/aes.c (original)
+++ silc-client/trunk/lib/silccrypt/aes.c Sat Mar  8 22:56:40 2008
@@ -190,13 +190,7 @@
 SILC_CIPHER_API_ENCRYPT(aes_ctr)
 {
   AesContext *aes = context;
-  SilcUInt32 ctr[4];
-  int i;
-
-  SILC_GET32_MSB(ctr[0], iv);
-  SILC_GET32_MSB(ctr[1], iv + 4);
-  SILC_GET32_MSB(ctr[2], iv + 8);
-  SILC_GET32_MSB(ctr[3], iv + 12);
+  int i, k;
 
   i = aes->u.enc.inf.b[2];
   if (!i)
@@ -204,27 +198,16 @@
 
   while (len-- > 0) {
     if (i == 16) {
-      if (++ctr[3] == 0)
-	if (++ctr[2] == 0)
-	  if (++ctr[1] == 0)
-	    ++ctr[0];
-
-      SILC_PUT32_MSB(ctr[0], iv);
-      SILC_PUT32_MSB(ctr[1], iv + 4);
-      SILC_PUT32_MSB(ctr[2], iv + 8);
-      SILC_PUT32_MSB(ctr[3], iv + 12);
-
-      aes_encrypt(iv, iv, &aes->u.enc);
+      for (k = 15; k >= 0; k--)
+	if (++iv[k])
+	  break;
+
+      aes_encrypt(iv, aes->u.enc.pad, &aes->u.enc);
       i = 0;
     }
-    *dst++ = *src++ ^ iv[i++];
+    *dst++ = *src++ ^ aes->u.enc.pad[i++];
   }
   aes->u.enc.inf.b[2] = i;
-
-  SILC_PUT32_MSB(ctr[0], iv);
-  SILC_PUT32_MSB(ctr[1], iv + 4);
-  SILC_PUT32_MSB(ctr[2], iv + 8);
-  SILC_PUT32_MSB(ctr[3], iv + 12);
 
   return TRUE;
 }

Modified: silc-client/trunk/lib/silccrypt/rijndael_internal.h
URL: http://svn.debian.org/wsvn/pkg-silc/silc-client/trunk/lib/silccrypt/rijndael_internal.h?rev=218&op=diff
==============================================================================
--- silc-client/trunk/lib/silccrypt/rijndael_internal.h (original)
+++ silc-client/trunk/lib/silccrypt/rijndael_internal.h Sat Mar  8 22:56:40 2008
@@ -44,6 +44,7 @@
 typedef struct {
   uint_32t ks[KS_LENGTH];
   aes_inf inf;
+  unsigned char pad[16];
 } aes_encrypt_ctx;
 
 typedef struct {

Modified: silc-client/trunk/lib/silcske/silcconnauth.c
URL: http://svn.debian.org/wsvn/pkg-silc/silc-client/trunk/lib/silcske/silcconnauth.c?rev=218&op=diff
==============================================================================
--- silc-client/trunk/lib/silcske/silcconnauth.c (original)
+++ silc-client/trunk/lib/silcske/silcconnauth.c Sat Mar  8 22:56:40 2008
@@ -591,14 +591,15 @@
     /* Allocate search constraints for finding the key */
     find = silc_skr_find_alloc();
 
-    if (!find || !connauth->auth_data) {
+    if (!find || !connauth->auth_data || !connauth->ske->prop->public_key) {
       /** Out of memory */
       silc_fsm_next(fsm, silc_connauth_st_responder_failure);
       return SILC_FSM_CONTINUE;
     }
 
-    silc_skr_find_set_pkcs_type(find, connauth->ske->pk_type);
-    silc_skr_find_set_public_key(find, connauth->ske->public_key);
+    silc_skr_find_set_pkcs_type(
+		  find, silc_pkcs_get_type(connauth->ske->prop->public_key));
+    silc_skr_find_set_public_key(find, connauth->ske->prop->public_key);
     silc_skr_find_set_usage(find, (SILC_SKR_USAGE_AUTH |
 				   SILC_SKR_USAGE_KEY_AGREEMENT));
 
@@ -652,6 +653,8 @@
 
   silc_free(connauth->auth_data);
 
+  SILC_LOG_DEBUG(("Signature is Ok"));
+
   /** Authentication successful */
   silc_fsm_next(fsm, silc_connauth_st_responder_success);
   return SILC_FSM_CONTINUE;

Modified: silc-client/trunk/lib/silcskr/silcskr.c
URL: http://svn.debian.org/wsvn/pkg-silc/silc-client/trunk/lib/silcskr/silcskr.c?rev=218&op=diff
==============================================================================
--- silc-client/trunk/lib/silcskr/silcskr.c (original)
+++ silc-client/trunk/lib/silcskr/silcskr.c Sat Mar  8 22:56:40 2008
@@ -492,6 +492,9 @@
 {
   SilcSKRKeyInternal key;
   SilcSKRStatus status = SILC_SKR_ERROR;
+#if defined(SILC_DEBUG)
+  char tmp[256];
+#endif /* SILC_DEBUG */
 
   SILC_LOG_DEBUG(("Adding SILC public key"));
 
@@ -515,6 +518,12 @@
   key->key.usage = usage;
   key->key.key = public_key;
   key->key.key_context = key_context;
+
+#if defined(SILC_DEBUG)
+  silc_skr_type_string(SILC_SKR_FIND_USAGE, SILC_32_TO_PTR(usage),
+		       tmp, sizeof(tmp) - 1);
+  SILC_LOG_DEBUG(("Search cons %s", tmp));
+#endif /* SILC_DEBUG */
 
   /* Add key specifics */
 

Modified: silc-client/trunk/lib/silcutil/silcutil.c
URL: http://svn.debian.org/wsvn/pkg-silc/silc-client/trunk/lib/silcutil/silcutil.c?rev=218&op=diff
==============================================================================
--- silc-client/trunk/lib/silcutil/silcutil.c (original)
+++ silc-client/trunk/lib/silcutil/silcutil.c Sat Mar  8 22:56:40 2008
@@ -467,28 +467,41 @@
 
 char *silc_fingerprint(const unsigned char *data, SilcUInt32 data_len)
 {
-  char fingerprint[64], *cp;
-  int i;
-
-  memset(fingerprint, 0, sizeof(fingerprint));
-  cp = fingerprint;
+  unsigned char *fingerprint, *cp;
+  unsigned int len, blocks, i;
+  
+  if (!data || !data_len)
+    return NULL;
+
+  if (data_len >= 256)
+    data_len = 255;
+
+  /* Align and calculate total length */
+  len = ((data_len + 19) / 20) * 20;
+  blocks = (len / 10);
+  len = (len * 2) + ((blocks - 1) * 2) + (4 * blocks) + 2 + 1;
+
+  cp = fingerprint = silc_calloc(len, sizeof(*fingerprint));
+  if (!cp)
+    return NULL;
+  
   for (i = 0; i < data_len; i++) {
-    silc_snprintf(cp, sizeof(fingerprint), "%02X", data[i]);
+    silc_snprintf(cp, len, "%02X", data[i]);
     cp += 2;
+    len -= 2;
 
     if ((i + 1) % 2 == 0)
-      silc_snprintf(cp++, sizeof(fingerprint), " ");
-
+      silc_snprintf(cp++, len--, " ");
     if ((i + 1) % 10 == 0)
-      silc_snprintf(cp++, sizeof(fingerprint), " ");
+      silc_snprintf(cp++, len--, " ");
   }
   i--;
+  if ((i + 1) % 10 == 0)
+    *(--cp) = '\0';  
   if ((i + 1) % 2 == 0)
-    cp[-2] = 0;
-  if ((i + 1) % 10 == 0)
-    cp[-1] = 0;
-
-  return strdup(fingerprint);
+    *(--cp) = '\0';
+
+  return fingerprint;
 }
 
 /* Return TRUE if the `data' is ASCII string. */

Modified: silc-client/trunk/lib/silcutil/unix/silcunixschedule.c
URL: http://svn.debian.org/wsvn/pkg-silc/silc-client/trunk/lib/silcutil/unix/silcunixschedule.c?rev=218&op=diff
==============================================================================
--- silc-client/trunk/lib/silcutil/unix/silcunixschedule.c (original)
+++ silc-client/trunk/lib/silcutil/unix/silcunixschedule.c Sat Mar  8 22:56:40 2008
@@ -498,6 +498,7 @@
       signal_call[i].sig = sig;
       signal_call[i].callback = callback;
       signal_call[i].context = callback_context;
+      signal_call[i].schedule = schedule;
       signal_call[i].call = FALSE;
       signal(sig, silc_schedule_internal_sighandler);
       break;
@@ -527,6 +528,7 @@
       signal_call[i].sig = 0;
       signal_call[i].callback = NULL;
       signal_call[i].context = NULL;
+      signal_call[i].schedule = NULL;
       signal_call[i].call = FALSE;
       signal(sig, SIG_DFL);
     }




More information about the Pkg-silc-commits mailing list