5 Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
7 Copyright (C) 1997 - 2000 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
21 * Created: Fri Jul 25 18:52:14 1997
25 #include "silcincludes.h"
27 /******************************************************************************
29 Packet Sending Routines
31 ******************************************************************************/
33 /* Writes data from encrypted buffer to the socket connection. If the
34 data cannot be written at once, it will be written later with a timeout.
35 The data is written from the data section of the buffer, not from head
36 or tail section. This automatically pulls the data section towards end
37 after writing the data. */
39 int silc_packet_write(int sock, SilcBuffer src)
43 SILC_LOG_DEBUG(("Writing data to socket %d", sock));
46 ret = write(sock, src->data, src->len);
48 if (errno == EAGAIN) {
49 SILC_LOG_DEBUG(("Could not write immediately, will do it later"));
52 SILC_LOG_ERROR(("Cannot write to socket: %s", strerror(errno)));
56 silc_buffer_pull(src, ret);
59 SILC_LOG_DEBUG(("Wrote data %d bytes", ret));
64 /* Actually sends the packet. This flushes the connections outgoing data
65 buffer. If data is sent directly to the network this returns the bytes
66 written, if error occured this returns -1 and if the data could not
67 be written directly to the network at this time this returns -2, in
68 which case the data should be queued by the caller and sent at some
69 later time. If `force_send' is TRUE this attempts to write the data
70 directly to the network, if FALSE, this returns -2. */
72 int silc_packet_send(SilcSocketConnection sock, int force_send)
74 /* Send now if forced to do so */
75 if (force_send == TRUE) {
78 SILC_LOG_DEBUG(("Forcing packet send, packet sent immediately"));
80 /* Write to network */
81 ret = silc_packet_write(sock->sock, sock->outbuf);
84 SILC_LOG_ERROR(("Error sending packet, dropped"));
89 SILC_LOG_DEBUG(("Could not force the send, packet put to queue"));
92 SILC_LOG_DEBUG(("Packet in queue"));
97 /* Encrypts a packet. This also creates HMAC of the packet before
98 encryption and adds the HMAC at the end of the buffer. This assumes
99 that there is enough free space at the end of the buffer to add the
100 computed HMAC. This is the normal way of encrypting packets, if some
101 other process of HMAC computing and encryption is needed this function
104 void silc_packet_encrypt(SilcCipher cipher, SilcHmac hmac,
105 SilcBuffer buffer, unsigned int len)
107 unsigned char mac[32];
109 /* Compute HMAC. This assumes that HMAC is created from the entire
110 data area thus this uses the length found in buffer, not the length
113 silc_hmac_make(hmac, buffer->data, buffer->len, mac);
114 silc_buffer_put_tail(buffer, mac, hmac->hash->hash->hash_len);
115 memset(mac, 0, sizeof(mac));
118 /* Encrypt the data area of the packet. 2 bytes of the packet
119 are not encrypted. */
121 SILC_LOG_DEBUG(("Encrypting packet, cipher %s, len %d (%d)",
122 cipher->cipher->name, len, len - 2));
123 cipher->cipher->encrypt(cipher->context, buffer->data + 2,
124 buffer->data + 2, len - 2, cipher->iv);
127 /* Pull the HMAC into the visible data area in the buffer */
129 silc_buffer_pull_tail(buffer, hmac->hash->hash->hash_len);
132 /* Assembles a new packet to be ready for send out. The buffer sent as
133 argument must include the data to be sent and it must not be encrypted.
134 The packet also must have enough free space so that the SILC header
135 and padding maybe added to the packet. The packet is encrypted after
136 this function has returned.
138 The buffer sent as argument should be something like following:
140 --------------------------------------------
141 | head | data | tail |
142 --------------------------------------------
146 So that the SILC header and 1 - 16 bytes of padding can fit to
147 the buffer. After assembly the buffer might look like this:
149 --------------------------------------------
151 --------------------------------------------
153 Start of assembled packet
155 Packet construct is as follows (* = won't be encrypted):
158 2 bytes Payload length (*)
161 1 byte Source ID Type
162 2 bytes Source ID Length
164 1 byte Destination ID Type
165 2 bytes Destination ID Length
166 x bytes Destination ID
172 All fields in the packet will be authenticated by MAC. The MAC is
173 not computed here, it must be computed differently before encrypting
178 void silc_packet_assemble(SilcPacketContext *ctx)
180 unsigned char tmppad[SILC_PACKET_MAX_PADLEN];
183 SILC_LOG_DEBUG(("Assembling outgoing packet"));
185 /* Get the true length of the packet. This is saved as payload length
186 into the packet header. This does not include the length of the
189 ctx->truelen = ctx->buffer->len + SILC_PACKET_HEADER_LEN +
190 ctx->src_id_len + ctx->dst_id_len;
192 /* Calculate the length of the padding. The padding is calculated from
193 the data that will be encrypted. As protocol states 3 first bytes
194 of the packet are not encrypted they are not included in the
195 padding calculation. */
197 ctx->padlen = SILC_PACKET_PADLEN(ctx->truelen);
199 /* Put the start of the data section to the right place. */
200 silc_buffer_push(ctx->buffer, SILC_PACKET_HEADER_LEN +
201 ctx->src_id_len + ctx->dst_id_len + ctx->padlen);
203 /* Get random padding */
205 for (i = 0; i < ctx->padlen; i++) tmppad[i] = silc_rng_get_byte(ctx->rng);
207 /* XXX: For testing - to be removed */
208 memset(tmppad, 65, sizeof(tmppad));
211 /* Create the packet. This creates the SILC header and adds padding,
212 rest of the buffer remains as it is. */
213 silc_buffer_format(ctx->buffer,
214 SILC_STR_UI_SHORT(ctx->truelen),
215 SILC_STR_UI_CHAR(ctx->flags),
216 SILC_STR_UI_CHAR(ctx->type),
217 SILC_STR_UI_SHORT(ctx->src_id_len),
218 SILC_STR_UI_SHORT(ctx->dst_id_len),
219 SILC_STR_UI_CHAR(ctx->src_id_type),
220 SILC_STR_UI_XNSTRING(ctx->src_id, ctx->src_id_len),
221 SILC_STR_UI_CHAR(ctx->dst_id_type),
222 SILC_STR_UI_XNSTRING(ctx->dst_id, ctx->dst_id_len),
223 SILC_STR_UI_XNSTRING(tmppad, ctx->padlen),
226 SILC_LOG_HEXDUMP(("Assembled packet, len %d", ctx->buffer->len),
227 ctx->buffer->data, ctx->buffer->len);
229 SILC_LOG_DEBUG(("Outgoing packet assembled"));
232 /* Prepare outgoing data buffer for packet sending. This moves the data
233 area so that new packet may be added into it. If needed this allocates
234 more space to the buffer. This handles directly the connection's
235 outgoing buffer in SilcSocketConnection object. */
237 void silc_packet_send_prepare(SilcSocketConnection sock,
238 unsigned int header_len,
240 unsigned int data_len)
244 totlen = header_len + padlen + data_len;
246 /* Prepare the outgoing buffer for packet sending. */
248 /* Allocate new buffer. This is done only once per connection. */
249 SILC_LOG_DEBUG(("Allocating outgoing data buffer"));
251 sock->outbuf = silc_buffer_alloc(SILC_PACKET_DEFAULT_SIZE);
252 silc_buffer_pull_tail(sock->outbuf, totlen);
253 silc_buffer_pull(sock->outbuf, header_len + padlen);
255 if (SILC_IS_OUTBUF_PENDING(sock)) {
256 /* There is some pending data in the buffer. */
258 /* Allocate more space if needed */
259 if ((sock->outbuf->end - sock->outbuf->tail) < data_len) {
260 SILC_LOG_DEBUG(("Reallocating outgoing data buffer"));
261 sock->outbuf = silc_buffer_realloc(sock->outbuf,
262 sock->outbuf->truelen + totlen);
265 oldlen = sock->outbuf->len;
266 silc_buffer_pull_tail(sock->outbuf, totlen);
267 silc_buffer_pull(sock->outbuf, header_len + padlen + oldlen);
269 /* Buffer is free for use */
270 silc_buffer_clear(sock->outbuf);
271 silc_buffer_pull_tail(sock->outbuf, totlen);
272 silc_buffer_pull(sock->outbuf, header_len + padlen);
277 /******************************************************************************
279 Packet Reception Routines
281 ******************************************************************************/
283 /* Reads data from the socket connection into the incoming data buffer.
284 However, this does not parse the packet, it only reads some amount from
285 the network. If there are more data available that can be read at a time
286 the rest of the data will be read later with a timeout and only after
287 that the packet is ready to be parsed.
289 The destination buffer sent as argument must be initialized before
290 calling this function, and, the data section and the start of the tail
291 section must be same. Ie. we add the read data to the tail section of
292 the buffer hence the data section is the start of the buffer.
294 This returns amount of bytes read or -1 on error or -2 on case where
295 all of the data could not be read at once. */
297 int silc_packet_read(int sock, SilcBuffer dest)
300 unsigned char buf[SILC_PACKET_READ_SIZE];
302 SILC_LOG_DEBUG(("Reading data from socket %d", sock));
304 /* Read the data from the socket. */
305 len = read(sock, buf, sizeof(buf));
307 if (errno == EAGAIN || errno == EINTR) {
308 SILC_LOG_DEBUG(("Could not read immediately, will do it later"));
311 SILC_LOG_ERROR(("Cannot read from socket: %d", strerror(errno)));
318 /* Insert the data to the buffer. If the data doesn't fit to the
319 buffer space is allocated for the buffer. */
320 /* XXX: This may actually be bad thing as if there is pending data in
321 the buffer they will be lost! */
324 /* If the data doesn't fit we just have to allocate a whole new
326 if (dest->truelen <= len) {
328 /* Free the old buffer */
329 memset(dest->head, 'F', dest->truelen);
330 silc_free(dest->head);
332 /* Allocate new data area */
333 len += SILC_PACKET_DEFAULT_SIZE;
334 dest->data = silc_calloc(len, sizeof(char));
337 dest->head = dest->data;
338 dest->data = dest->data;
339 dest->tail = dest->data;
340 dest->end = dest->data + dest->truelen;
341 len -= SILC_PACKET_DEFAULT_SIZE;
344 silc_buffer_put_tail(dest, buf, len);
345 silc_buffer_pull_tail(dest, len);
348 SILC_LOG_DEBUG(("Read %d bytes", len));
353 /* Processes the received data. This checks the received data and
354 calls parser callback that handles the actual packet decryption
355 and parsing. If more than one packet was received this calls the
356 parser multiple times. The parser callback will get context
357 SilcPacketParserContext that includes the packet and the `context'
358 sent to this function. */
360 void silc_packet_receive_process(SilcSocketConnection sock,
361 SilcCipher cipher, SilcHmac hmac,
362 SilcPacketParserCallback parser,
365 SilcPacketParserContext *parse_ctx;
366 int packetlen, paddedlen, count, mac_len = 0;
368 /* We need at least 2 bytes of data to be able to start processing
370 if (sock->inbuf->len < 2)
374 mac_len = hmac->hash->hash->hash_len;
376 /* Parse the packets from the data */
378 while (sock->inbuf->len > 0) {
379 SILC_PACKET_LENGTH(sock->inbuf, packetlen, paddedlen);
383 if (packetlen < SILC_PACKET_MIN_LEN) {
384 SILC_LOG_DEBUG(("Received invalid packet, dropped"));
388 if (sock->inbuf->len < paddedlen + mac_len) {
389 SILC_LOG_DEBUG(("Received partial packet, waiting for the rest"));
393 parse_ctx = silc_calloc(1, sizeof(*parse_ctx));
394 parse_ctx->packet = silc_packet_context_alloc();
395 parse_ctx->packet->buffer = silc_buffer_alloc(paddedlen + mac_len);
396 parse_ctx->sock = sock;
397 parse_ctx->cipher = cipher;
398 parse_ctx->hmac = hmac;
399 parse_ctx->context = context;
401 silc_buffer_pull_tail(parse_ctx->packet->buffer,
402 SILC_BUFFER_END(parse_ctx->packet->buffer));
403 silc_buffer_put(parse_ctx->packet->buffer, sock->inbuf->data,
404 paddedlen + mac_len);
406 SILC_LOG_HEXDUMP(("Incoming packet, len %d",
407 parse_ctx->packet->buffer->len),
408 parse_ctx->packet->buffer->data,
409 parse_ctx->packet->buffer->len);
411 /* Call the parser */
413 (*parser)(parse_ctx);
415 /* Pull the packet from inbuf thus we'll get the next one
417 silc_buffer_pull(sock->inbuf, paddedlen);
419 silc_buffer_pull(sock->inbuf, mac_len);
422 silc_buffer_clear(sock->inbuf);
425 /* Receives packet from network and reads the data into connection's
426 incoming data buffer. If the data was read directly this returns the
427 read bytes, if error occured this returns -1, if the data could not
428 be read directly at this time this returns -2 in which case the data
429 should be read again at some later time, or If EOF occured this returns
432 int silc_packet_receive(SilcSocketConnection sock)
436 /* Allocate the incoming data buffer if not done already. */
438 sock->inbuf = silc_buffer_alloc(SILC_PACKET_DEFAULT_SIZE);
440 /* Read some data from connection */
441 ret = silc_packet_read(sock->sock, sock->inbuf);
445 SILC_LOG_ERROR(("Error reading packet, dropped"));
451 /* Checks MAC in the packet. Returns TRUE if MAC is Ok. This is called
452 after packet has been totally decrypted and parsed. */
454 static int silc_packet_check_mac(SilcHmac hmac, SilcBuffer buffer)
458 unsigned char mac[32];
460 SILC_LOG_DEBUG(("Verifying MAC"));
462 /* Compute HMAC of packet */
463 memset(mac, 0, sizeof(mac));
464 silc_hmac_make(hmac, buffer->data, buffer->len, mac);
466 /* Compare the HMAC's (buffer->tail has the packet's HMAC) */
467 if (memcmp(mac, buffer->tail, hmac->hash->hash->hash_len)) {
468 SILC_LOG_DEBUG(("MAC failed"));
472 SILC_LOG_DEBUG(("MAC is Ok"));
473 memset(mac, 0, sizeof(mac));
479 /* Decrypts rest of the packet (after decrypting just the SILC header).
480 After calling this function the packet is ready to be parsed by calling
481 silc_packet_parse. If everything goes without errors this returns TRUE,
482 if packet is malformed this returns FALSE. */
484 static int silc_packet_decrypt_rest(SilcCipher cipher, SilcHmac hmac,
489 /* Pull MAC from packet before decryption */
491 if ((buffer->len - hmac->hash->hash->hash_len) > SILC_PACKET_MIN_LEN) {
492 silc_buffer_push_tail(buffer, hmac->hash->hash->hash_len);
494 SILC_LOG_DEBUG(("Bad MAC length in packet, packet dropped"));
499 SILC_LOG_DEBUG(("Decrypting rest of the packet"));
501 /* Decrypt rest of the packet */
502 silc_buffer_pull(buffer, SILC_PACKET_MIN_HEADER_LEN - 2);
503 cipher->cipher->decrypt(cipher->context, buffer->data + 2,
504 buffer->data + 2, buffer->len - 2,
506 silc_buffer_push(buffer, SILC_PACKET_MIN_HEADER_LEN - 2);
508 SILC_LOG_HEXDUMP(("Fully decrypted packet, len %d", buffer->len),
509 buffer->data, buffer->len);
515 /* Decrypts rest of the SILC Packet header that has been decrypted partly
516 already. This decrypts the padding of the packet also. After calling
517 this function the packet is ready to be parsed by calling function
518 silc_packet_parse. This is used in special packet reception (protocol
519 defines the way of decrypting special packets). */
521 static int silc_packet_decrypt_rest_special(SilcCipher cipher,
525 /* Decrypt rest of the header plus padding */
527 unsigned short truelen, len1, len2, padlen;
529 /* Pull MAC from packet before decryption */
531 if ((buffer->len - hmac->hash->hash->hash_len) > SILC_PACKET_MIN_LEN) {
532 silc_buffer_push_tail(buffer, hmac->hash->hash->hash_len);
534 SILC_LOG_DEBUG(("Bad MAC length in packet, packet dropped"));
539 SILC_LOG_DEBUG(("Decrypting rest of the header"));
541 SILC_GET16_MSB(len1, &buffer->data[4]);
542 SILC_GET16_MSB(len2, &buffer->data[6]);
544 truelen = SILC_PACKET_HEADER_LEN + len1 + len2;
545 padlen = SILC_PACKET_PADLEN(truelen);
546 len1 = (truelen + padlen) - (SILC_PACKET_MIN_HEADER_LEN - 2);
548 silc_buffer_pull(buffer, SILC_PACKET_MIN_HEADER_LEN - 2);
549 cipher->cipher->decrypt(cipher->context, buffer->data + 2,
550 buffer->data + 2, len1 - 2,
552 silc_buffer_push(buffer, SILC_PACKET_MIN_HEADER_LEN - 2);
558 /* Decrypts a packet. This assumes that typical SILC packet is the
559 packet to be decrypted and thus checks for normal and special SILC
560 packets and can handle both of them. This also computes and checks
561 the HMAC of the packet. If any other special or customized decryption
562 processing is required this function cannot be used. This returns
563 -1 on error, 0 when packet is normal packet and 1 when the packet
564 is special and requires special processing. */
566 int silc_packet_decrypt(SilcCipher cipher, SilcHmac hmac,
567 SilcBuffer buffer, SilcPacketContext *packet)
570 /* Decrypt start of the packet header */
572 cipher->cipher->decrypt(cipher->context, buffer->data + 2,
573 buffer->data + 2, SILC_PACKET_MIN_HEADER_LEN - 2,
576 /* If the packet type is not any special type lets decrypt rest
577 of the packet here. */
578 if ((buffer->data[3] == SILC_PACKET_PRIVATE_MESSAGE &&
579 !(buffer->data[2] & SILC_PACKET_FLAG_PRIVMSG_KEY)) ||
580 buffer->data[3] != SILC_PACKET_CHANNEL_MESSAGE) {
582 /* Normal packet, decrypt rest of the packet */
583 if (!silc_packet_decrypt_rest(cipher, hmac, buffer))
587 if (!silc_packet_check_mac(hmac, buffer))
592 /* Packet requires special handling, decrypt rest of the header.
593 This only decrypts. */
594 if (!silc_packet_decrypt_rest_special(cipher, hmac, buffer))
598 if (!silc_packet_check_mac(hmac, buffer))
605 /* Parses the packet. This is called when a whole packet is ready to be
606 parsed. The buffer sent must be already decrypted before calling this
607 function. The len argument must be the true length of the packet. This
608 function returns the type of the packet. The data section of the
609 buffer is parsed, not head or tail sections. */
611 SilcPacketType silc_packet_parse(SilcPacketContext *ctx)
613 SilcBuffer buffer = ctx->buffer;
616 SILC_LOG_DEBUG(("Parsing incoming packet"));
618 /* Check the length of the buffer */
619 if (buffer->len < SILC_PACKET_MIN_LEN) {
620 SILC_LOG_ERROR(("Bad packet length: %d, packet dropped", buffer->len));
621 return SILC_PACKET_NONE;
624 /* Parse the buffer. This parses the SILC header of the packet. */
625 len = silc_buffer_unformat(buffer,
626 SILC_STR_UI_SHORT(&ctx->truelen),
627 SILC_STR_UI_CHAR(&ctx->flags),
628 SILC_STR_UI_CHAR(&ctx->type),
629 SILC_STR_UI_SHORT(&ctx->src_id_len),
630 SILC_STR_UI_SHORT(&ctx->dst_id_len),
631 SILC_STR_UI_CHAR(&ctx->src_id_type),
634 return SILC_PACKET_NONE;
636 if (ctx->src_id_len > SILC_PACKET_MAX_ID_LEN ||
637 ctx->dst_id_len > SILC_PACKET_MAX_ID_LEN) {
638 SILC_LOG_ERROR(("Bad ID lengths in packet"));
639 return SILC_PACKET_NONE;
642 /* Calculate length of padding in packet */
643 ctx->padlen = SILC_PACKET_PADLEN(ctx->truelen);
645 silc_buffer_pull(buffer, len);
646 ret = silc_buffer_unformat(buffer,
647 SILC_STR_UI_XNSTRING_ALLOC(&ctx->src_id,
649 SILC_STR_UI_CHAR(&ctx->dst_id_type),
650 SILC_STR_UI_XNSTRING_ALLOC(&ctx->dst_id,
652 SILC_STR_UI_XNSTRING(NULL, ctx->padlen),
655 return SILC_PACKET_NONE;
657 silc_buffer_push(buffer, len);
659 SILC_LOG_HEXDUMP(("parsed packet, len %d", ctx->buffer->len),
660 ctx->buffer->data, ctx->buffer->len);
662 /* Pull SILC header and padding from packet */
663 silc_buffer_pull(buffer, SILC_PACKET_HEADER_LEN +
664 ctx->src_id_len + ctx->dst_id_len + ctx->padlen);
666 SILC_LOG_DEBUG(("Incoming packet type: %d", ctx->type));
671 /* Perform special SILC Packet header parsing. This is required to some
672 packet types that have the data payload encrypted with different key
673 than the header area plus padding of the packet. Hence, this parses
674 the header in a way that it does not take the data area into account
675 and parses the header and padding area only. */
677 SilcPacketType silc_packet_parse_special(SilcPacketContext *ctx)
679 SilcBuffer buffer = ctx->buffer;
680 int len, tmplen, ret;
682 SILC_LOG_DEBUG(("Parsing incoming packet"));
684 /* Check the length of the buffer */
685 if (buffer->len < SILC_PACKET_MIN_LEN) {
686 SILC_LOG_ERROR(("Bad packet length: %d, packet dropped", buffer->len));
687 return SILC_PACKET_NONE;
690 /* Parse the buffer. This parses the SILC header of the packet. */
691 len = silc_buffer_unformat(buffer,
692 SILC_STR_UI_SHORT(&ctx->truelen),
693 SILC_STR_UI_CHAR(&ctx->flags),
694 SILC_STR_UI_CHAR(&ctx->type),
695 SILC_STR_UI_SHORT(&ctx->src_id_len),
696 SILC_STR_UI_SHORT(&ctx->dst_id_len),
697 SILC_STR_UI_CHAR(&ctx->src_id_type),
700 return SILC_PACKET_NONE;
702 if (ctx->src_id_len > SILC_PACKET_MAX_ID_LEN ||
703 ctx->dst_id_len > SILC_PACKET_MAX_ID_LEN) {
704 SILC_LOG_ERROR(("Bad ID lengths in packet"));
705 return SILC_PACKET_NONE;
708 /* Calculate length of padding in packet. As this is special packet
709 the data area is not used in the padding calculation as it won't
710 be decrypted by the caller. */
711 tmplen = SILC_PACKET_HEADER_LEN + ctx->src_id_len + ctx->dst_id_len;
712 ctx->padlen = SILC_PACKET_PADLEN(tmplen);
714 silc_buffer_pull(buffer, len);
715 ret = silc_buffer_unformat(buffer,
716 SILC_STR_UI_XNSTRING_ALLOC(&ctx->src_id,
718 SILC_STR_UI_CHAR(&ctx->dst_id_type),
719 SILC_STR_UI_XNSTRING_ALLOC(&ctx->dst_id,
721 SILC_STR_UI_XNSTRING(NULL, ctx->padlen),
724 return SILC_PACKET_NONE;
726 silc_buffer_push(buffer, len);
728 SILC_LOG_HEXDUMP(("parsed packet, len %d", ctx->buffer->len),
729 ctx->buffer->data, ctx->buffer->len);
731 /* Pull SILC header and padding from packet */
732 silc_buffer_pull(buffer, SILC_PACKET_HEADER_LEN +
733 ctx->src_id_len + ctx->dst_id_len + ctx->padlen);
735 SILC_LOG_DEBUG(("Incoming packet type: %d", ctx->type));
740 /* Allocate packet context */
742 SilcPacketContext *silc_packet_context_alloc()
744 SilcPacketContext *ctx = silc_calloc(1, sizeof(*ctx));
749 /* Increse the reference count of the packet context. */
751 SilcPacketContext *silc_packet_context_dup(SilcPacketContext *ctx)
754 SILC_LOG_DEBUG(("Packet context %p refcnt %d->%d", ctx, ctx->users - 1,
759 /* Decrese the reference count of the packet context and free it only if
762 void silc_packet_context_free(SilcPacketContext *ctx)
765 SILC_LOG_DEBUG(("Packet context %p refcnt %d->%d", ctx, ctx->users + 1,
770 silc_buffer_free(ctx->buffer);
772 silc_free(ctx->src_id);
774 silc_free(ctx->dst_id);