Added silc_packet_stream_is_valid, silc_packet_get_ids and
authorPekka Riikonen <priikone@silcnet.org>
Sun, 22 Apr 2007 18:22:05 +0000 (18:22 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sun, 22 Apr 2007 18:22:05 +0000 (18:22 +0000)
silc_packet_engine_get_streams.  Fixed also channel message
encryption with router-to-router packets.

lib/silccore/silcpacket.c
lib/silccore/silcpacket.h

index 079498c7a8ad202d047842c987bd644611cba986..57bf5148d712613903f83381b48a9759da409ba7 100644 (file)
@@ -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);
index 4cc2b44285d2bd37bfe1c0acb751cb1ce1a0e1da..5dfcdc93edea59f70f69c4b473186c791e41fd8e 100644 (file)
@@ -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