X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcclient%2Fclient_channel.c;h=4492153c0320b9d264edafb04d543c0bbbe6c09a;hb=03df183a5ada5bad0eed82b78d93ca6f4fd51213;hp=e7753b9400e8c99fec30b2043739ea3bd89c9c49;hpb=6f80b44621a19bc96e693e637b363a2d41e1f4a9;p=silc.git diff --git a/lib/silcclient/client_channel.c b/lib/silcclient/client_channel.c index e7753b94..4492153c 100644 --- a/lib/silcclient/client_channel.c +++ b/lib/silcclient/client_channel.c @@ -94,12 +94,12 @@ SilcBool silc_client_send_channel_message(SilcClient client, channel->internal.curr_key = key; } else { /* Use normal channel key generated by the server */ - cipher = channel->internal.channel_key; + cipher = channel->internal.send_key; hmac = channel->internal.hmac; } } else { /* Use normal channel key generated by the server */ - cipher = channel->internal.channel_key; + cipher = channel->internal.send_key; hmac = channel->internal.hmac; } @@ -163,6 +163,9 @@ SILC_FSM_STATE(silc_client_channel_message) SILC_LOG_DEBUG(("Received channel message")); + SILC_LOG_HEXDUMP(("Channel message"), silc_buffer_data(buffer), + silc_buffer_len(buffer)); + if (silc_unlikely(packet->dst_id_type != SILC_ID_CHANNEL)) { /** Invalid packet */ silc_fsm_next(fsm, silc_client_channel_message_error); @@ -221,7 +224,7 @@ SILC_FSM_STATE(silc_client_channel_message) /* Parse the channel message payload. This also decrypts the payload */ payload = silc_message_payload_parse(silc_buffer_data(buffer), silc_buffer_len(buffer), FALSE, - FALSE, channel->internal.channel_key, + FALSE, channel->internal.receive_key, channel->internal.hmac, NULL, FALSE, NULL); @@ -262,7 +265,7 @@ SILC_FSM_STATE(silc_client_channel_message) payload = silc_message_payload_parse(silc_buffer_data(buffer), silc_buffer_len(buffer), FALSE, FALSE, - channel->internal.channel_key, + channel->internal.receive_key, channel->internal.hmac, NULL, FALSE, NULL); @@ -390,7 +393,7 @@ SilcBool silc_client_save_channel_key(SilcClient client, channel->internal.old_hmacs = silc_dlist_init(); if (channel->internal.old_channel_keys && channel->internal.old_hmacs) { silc_dlist_add(channel->internal.old_channel_keys, - channel->internal.channel_key); + channel->internal.receive_key); silc_dlist_add(channel->internal.old_hmacs, channel->internal.hmac); silc_schedule_task_add_timeout(client->schedule, silc_client_save_channel_key_rekey, @@ -399,7 +402,17 @@ SilcBool silc_client_save_channel_key(SilcClient client, /* Get channel cipher */ cipher = silc_channel_key_get_cipher(payload, NULL); - if (!silc_cipher_alloc(cipher, &channel->internal.channel_key)) { + if (!silc_cipher_alloc(cipher, &channel->internal.send_key)) { + client->internal->ops->say( + conn->client, conn, + SILC_CLIENT_MESSAGE_AUDIT, + "Cannot talk to channel: unsupported cipher %s", + cipher); + silc_client_unref_channel(client, conn, channel); + silc_channel_key_payload_free(payload); + return FALSE; + } + if (!silc_cipher_alloc(cipher, &channel->internal.receive_key)) { client->internal->ops->say( conn->client, conn, SILC_CLIENT_MESSAGE_AUDIT, @@ -410,9 +423,10 @@ SilcBool silc_client_save_channel_key(SilcClient client, return FALSE; } - /* Set the cipher key */ + /* Set the cipher key. Both sending and receiving keys are same */ key = silc_channel_key_get_key(payload, &tmp_len); - silc_cipher_set_key(channel->internal.channel_key, key, tmp_len * 8, TRUE); + silc_cipher_set_key(channel->internal.send_key, key, tmp_len * 8, TRUE); + silc_cipher_set_key(channel->internal.receive_key, key, tmp_len * 8, FALSE); /* Get channel HMAC */ hmac = (channel->internal.hmac ?