X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilccore%2Fsilcpacket.c;h=d2696bbe8c624795fa438aed5b2287ee9f775e6a;hb=96d69ecd5b1e5090db05efee7c992e2b2b1e3062;hp=c8fd4b122280961941e36f289c525e0543f53547;hpb=c83ba40afd93d30aa4464a1fed61387373c41d87;p=silc.git diff --git a/lib/silccore/silcpacket.c b/lib/silccore/silcpacket.c index c8fd4b12..d2696bbe 100644 --- a/lib/silccore/silcpacket.c +++ b/lib/silccore/silcpacket.c @@ -771,10 +771,10 @@ SilcPacketStream silc_packet_stream_create(SilcPacketEngine engine, /* If this is UDP stream, allocate UDP remote stream hash table */ if (!engine->udp_remote && silc_socket_stream_is_udp(stream, NULL)) - engine->udp_remote = silc_hash_table_alloc(NULL, 0, silc_hash_string, NULL, - silc_hash_string_compare, NULL, - silc_packet_engine_hash_destr, - NULL, TRUE); + engine->udp_remote = + silc_hash_table_alloc(NULL, 0, silc_hash_string_case, NULL, + silc_hash_string_case_compare, NULL, + silc_packet_engine_hash_destr, NULL, TRUE); silc_mutex_unlock(engine->lock); @@ -786,6 +786,8 @@ SilcPacketStream silc_packet_stream_create(SilcPacketEngine engine, return NULL; } + SILC_LOG_DEBUG(("Created packet stream %p", ps)); + return ps; } @@ -888,6 +890,8 @@ void silc_packet_stream_destroy(SilcPacketStream stream) if (silc_atomic_sub_int8(&stream->refcnt, 1) > 0) { stream->destroyed = TRUE; + SILC_LOG_DEBUG(("Marking packet stream %p destroyed", stream)); + /* Close the underlaying stream */ if (!stream->udp && stream->stream) silc_stream_close(stream->stream); @@ -1468,14 +1472,6 @@ static inline void silc_packet_send_ctr_increment(SilcPacketStream stream, unsigned char *iv = silc_cipher_get_iv(cipher); SilcUInt32 pc1, pc2; - /* Increment 64-bit packet counter */ - SILC_GET32_MSB(pc1, iv + 4); - SILC_GET32_MSB(pc2, iv + 8); - if (++pc2 == 0) - ++pc1; - SILC_PUT32_MSB(pc1, iv + 4); - SILC_PUT32_MSB(pc2, iv + 8); - /* Reset block counter */ memset(iv + 12, 0, 4); @@ -1486,17 +1482,30 @@ static inline void silc_packet_send_ctr_increment(SilcPacketStream stream, ret_iv[1] = ret_iv[0] + iv[4]; ret_iv[2] = ret_iv[0] ^ ret_iv[1]; ret_iv[3] = ret_iv[0] + ret_iv[2]; - SILC_PUT32_MSB(pc2, ret_iv + 4); + + /* Increment 32-bit packet counter */ + SILC_GET32_MSB(pc1, iv + 8); + pc1++; + SILC_PUT32_MSB(pc1, ret_iv + 4); + SILC_LOG_HEXDUMP(("IV"), ret_iv, 8); - /* Set new nonce to counter block */ - memcpy(iv + 4, ret_iv, 4); + /* Set new IV to counter block */ + memcpy(iv + 4, ret_iv, 8); + } else { + /* Increment 64-bit packet counter */ + SILC_GET32_MSB(pc1, iv + 4); + SILC_GET32_MSB(pc2, iv + 8); + if (++pc2 == 0) + ++pc1; + SILC_PUT32_MSB(pc1, iv + 4); + SILC_PUT32_MSB(pc2, iv + 8); } SILC_LOG_HEXDUMP(("Counter Block"), iv, 16); } -/* Internal routine to assemble outgoing packet. Assembles and encryptes +/* Internal routine to assemble outgoing packet. Assembles and encrypts the packet. The silc_packet_stream_write needs to be called to send it after this returns TRUE. */ @@ -1605,6 +1614,12 @@ static inline SilcBool silc_packet_send_raw(SilcPacketStream stream, silc_mutex_lock(stream->lock); + if (silc_unlikely(stream->destroyed)) { + SILC_LOG_DEBUG(("Stream %p is destroyed, cannot send packet", stream)); + silc_mutex_unlock(stream->lock); + return FALSE; + } + /* Get packet pointer from the outgoing buffer */ if (silc_unlikely(!silc_packet_send_prepare(stream, truelen + padlen + ivlen + psnlen, hmac, &packet))) {