From 6cda49040217e0a1a547cce09662dc683c38b3fd Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Sun, 22 Apr 2007 18:22:05 +0000 Subject: [PATCH] Added silc_packet_stream_is_valid, silc_packet_get_ids and silc_packet_engine_get_streams. Fixed also channel message encryption with router-to-router packets. --- lib/silccore/silcpacket.c | 96 +++++++++++++++++++++++++++++++++++++-- lib/silccore/silcpacket.h | 49 +++++++++++++++++++- 2 files changed, 139 insertions(+), 6 deletions(-) diff --git a/lib/silccore/silcpacket.c b/lib/silccore/silcpacket.c index 079498c7..57bf5148 100644 --- a/lib/silccore/silcpacket.c +++ b/lib/silccore/silcpacket.c @@ -623,6 +623,26 @@ void silc_packet_engine_stop(SilcPacketEngine engine) silc_free(engine); } +/* Return list of packet streams in the engine */ + +SilcDList silc_packet_engine_get_streams(SilcPacketEngine engine) +{ + SilcDList list; + SilcPacketStream ps; + + list = silc_dlist_init(); + if (!list) + return NULL; + + silc_mutex_lock(engine->lock); + silc_list_start(engine->streams); + while ((ps = silc_list_get(engine->streams))) + silc_dlist_add(list, ps); + silc_mutex_unlock(engine->lock); + + return list; +} + /* Create new packet stream */ SilcPacketStream silc_packet_stream_create(SilcPacketEngine engine, @@ -918,6 +938,13 @@ void silc_packet_stream_destroy(SilcPacketStream stream) silc_free(stream); } +/* Return TRUE if the stream is valid */ + +SilcBool silc_packet_stream_is_valid(SilcPacketStream stream) +{ + return stream->destroyed == FALSE; +} + /* Marks as router stream */ void silc_packet_stream_set_router(SilcPacketStream stream) @@ -1300,6 +1327,49 @@ SilcBool silc_packet_set_ids(SilcPacketStream stream, return TRUE; } +/* Return IDs from the packet stream */ + +SilcBool silc_packet_get_ids(SilcPacketStream stream, + SilcBool *src_id_set, SilcID *src_id, + SilcBool *dst_id_set, SilcID *dst_id) +{ + if (src_id && stream->src_id) { + (*src_id).type = stream->src_id_type; + switch (stream->src_id_type) { + case SILC_ID_CLIENT: + (*src_id).u.client_id = *(SilcClientID *)stream->src_id; + break; + case SILC_ID_SERVER: + (*src_id).u.server_id = *(SilcServerID *)stream->src_id; + break; + case SILC_ID_CHANNEL: + (*src_id).u.channel_id = *(SilcChannelID *)stream->src_id; + break; + } + if (src_id_set) + *src_id_set = TRUE; + } + + if (dst_id && stream->dst_id) { + (*dst_id).type = stream->dst_id_type; + switch (stream->dst_id_type) { + case SILC_ID_CLIENT: + (*dst_id).u.client_id = *(SilcClientID *)stream->dst_id; + break; + case SILC_ID_SERVER: + (*dst_id).u.server_id = *(SilcServerID *)stream->dst_id; + break; + case SILC_ID_CHANNEL: + (*dst_id).u.channel_id = *(SilcChannelID *)stream->dst_id; + break; + } + if (dst_id_set) + *dst_id_set = TRUE; + } + + return TRUE; +} + /* Adds Security ID (SID) */ SilcBool silc_packet_set_sid(SilcPacketStream stream, SilcUInt8 sid) @@ -1468,10 +1538,8 @@ static inline SilcBool silc_packet_send_raw(SilcPacketStream stream, type and flags, and calculate correct length. Private messages with private keys and channel messages are special packets as their payload is encrypted already. */ - if ((type == SILC_PACKET_PRIVATE_MESSAGE && - flags & SILC_PACKET_FLAG_PRIVMSG_KEY) || - type == SILC_PACKET_CHANNEL_MESSAGE) { - + if (type == SILC_PACKET_PRIVATE_MESSAGE && + flags & SILC_PACKET_FLAG_PRIVMSG_KEY) { /* Padding is calculated from header + IDs */ if (!ctr) SILC_PACKET_PADLEN((SILC_PACKET_HEADER_LEN + src_id_len + dst_id_len + @@ -1480,8 +1548,26 @@ static inline SilcBool silc_packet_send_raw(SilcPacketStream stream, /* Length to encrypt, header + IDs + padding. */ enclen = (SILC_PACKET_HEADER_LEN + src_id_len + dst_id_len + padlen + psnlen); - } else { + } else if (type == SILC_PACKET_CHANNEL_MESSAGE) { + if (stream->sc->engine->local_is_router && stream->is_router) { + /* Channel messages between routers are encrypted as normal packets. + Padding is calculated from true length of the packet. */ + if (!ctr) + SILC_PACKET_PADLEN(truelen + psnlen, block_len, padlen); + + enclen += padlen + psnlen; + } else { + /* Padding is calculated from header + IDs */ + if (!ctr) + SILC_PACKET_PADLEN((SILC_PACKET_HEADER_LEN + src_id_len + dst_id_len + + psnlen), block_len, padlen); + + /* Length to encrypt, header + IDs + padding. */ + enclen = (SILC_PACKET_HEADER_LEN + src_id_len + dst_id_len + + padlen + psnlen); + } + } else { /* Padding is calculated from true length of the packet */ if (flags & SILC_PACKET_FLAG_LONG_PAD) SILC_PACKET_PADLEN_MAX(truelen + psnlen, block_len, padlen); diff --git a/lib/silccore/silcpacket.h b/lib/silccore/silcpacket.h index 4cc2b442..5dfcdc93 100644 --- a/lib/silccore/silcpacket.h +++ b/lib/silccore/silcpacket.h @@ -377,6 +377,20 @@ silc_packet_engine_start(SilcRng rng, SilcBool router, ***/ void silc_packet_engine_stop(SilcPacketEngine engine); +/****f* silccore/SilcPacketAPI/silc_packet_engine_get_streams + * + * SYNOPSIS + * + * SilcDList silc_packet_engine_get_streams(SilcPacketEngine engine); + * + * DESCRIPTION + * + * Returns list of packet streams added to the packet engine. The caller + * must free the list with silc_dlist_uninit. + * + ***/ +SilcDList silc_packet_engine_get_streams(SilcPacketEngine engine); + /****f* silccore/SilcPacketAPI/silc_packet_stream_create * * SYNOPSIS @@ -474,6 +488,20 @@ SilcPacketStream silc_packet_stream_add_remote(SilcPacketStream stream, ***/ void silc_packet_stream_destroy(SilcPacketStream stream); +/****f* silccore/SilcPacketAPI/silc_packet_stream_is_valid + * + * SYNOPSIS + * + * SilcBool silc_packet_stream_is_valid(SilcPacketStream stream); + * + * DESCRIPTION + * + * Returns TRUE if the packet stream indicated by `stream' is valid and + * has not been disconnected or destroyed. + * + ***/ +SilcBool silc_packet_stream_is_valid(SilcPacketStream stream); + /****f* silccore/SilcPacketAPI/silc_packet_stream_set_router * * SYNOPSIS @@ -859,7 +887,7 @@ SilcBool silc_packet_get_keys(SilcPacketStream stream, * * DESCRIPTION * - * Set the source ID and destinaion ID to be used when sending packets to + * Set the source ID and destination ID to be used when sending packets to * this packet stream. The IDs to be used for a packet stream can be * overridden when sending packets. However, if the IDs do not ever change * for the packet stream it is recommended they are set using this function. @@ -871,6 +899,25 @@ SilcBool silc_packet_set_ids(SilcPacketStream stream, SilcIdType src_id_type, const void *src_id, SilcIdType dst_id_type, const void *dst_id); +/****f* silccore/SilcPacketAPI/silc_packet_set_ids + * + * SYNOPSIS + * + * SilcBool silc_packet_get_ids(SilcPacketStream stream, + * SilcBool *src_id_set, SilcID *src_id, + * SilcBool *dst_id_set, SilcID *dst_id); + * + * DESCRIPTION + * + * Returns source and destination IDs from the packet stream. The + * `src_id_set' is set to TRUE if the source ID was returned. The + * `dst_id_set' is set to TRUE if the destination ID was returned. + * + ***/ +SilcBool silc_packet_get_ids(SilcPacketStream stream, + SilcBool *src_id_set, SilcID *src_id, + SilcBool *dst_id_set, SilcID *dst_id); + /****f* silccore/SilcPacketAPI/silc_packet_set_sid * * SYNOPSIS -- 2.24.0