[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