*/
-/****h* silccore/SilcPacketAPI
+/****h* silccore/Packet Protocol Interface
*
* DESCRIPTION
*
/* Minimum packet length */
#define SILC_PACKET_MIN_LEN (SILC_PACKET_HEADER_LEN + 1)
+/* Maximum packet length */
+#define SILC_PACKET_MAX_LEN 0xffff
+
/* Maximum length of ID */
-#define SILC_PACKET_MAX_ID_LEN 16
+#define SILC_PACKET_MAX_ID_LEN 28
/****d* silccore/SilcPacketAPI/SilcPacketType
*
* Packet flags. Flags are defined above.
*
* unsigned char *src_id
- * uint8 src_id_len
+ * SilcUInt8 src_id_len
* unsigned char src_id_type
*
* Source ID, its length and type. On packet reception retuned ID's
* are always the hash values of the ID's from the packet.
*
* unsigned char *dst_id;
- * uint8 dst_id_len;
+ * SilcUInt8 dst_id_len;
* unsigned char src_id_type;
*
* Destination ID, its length and type. On packet reception retuned
* ID's are always the hash values of the ID's from the packet.
*
- * uint16 truelen
- * uint8 padlen
+ * SilcUInt16 truelen
+ * SilcUInt8 padlen
*
* The true lenght of the packet and the padded length of the packet.
* These may be set by the caller before calling any of the
* calling silc_packet_context_dup and decreased by calling the
* silc_packet_context_free.
*
- * uint32 sequence;
+ * SilcUInt32 sequence;
*
* Packet sequence number.
*
typedef struct {
SilcBuffer buffer;
- uint16 truelen;
+ SilcUInt16 truelen;
SilcPacketFlags flags;
SilcPacketType type;
- uint8 padlen;
+ SilcUInt8 padlen;
unsigned char *src_id;
- uint8 src_id_len;
- uint8 src_id_type;
+ SilcUInt8 src_id_len;
+ SilcUInt8 src_id_type;
unsigned char *dst_id;
- uint8 dst_id_len;
- uint8 dst_id_type;
+ SilcUInt8 dst_id_len;
+ SilcUInt8 dst_id_type;
int users;
bool long_pad; /* Set to TRUE to use maximum padding
in packet (up to 256 bytes). */
- uint32 sequence;
+ SilcUInt32 sequence;
} SilcPacketContext;
/****s* silccore/SilcPacketAPI/SilcPacketParserContext
} while(0)
/***/
+/****d* silccore/SilcPacketAPI/SILC_PACKET_DATALEN
+ *
+ * NAME
+ *
+ * #define SILC_PACKET_DATALEN ...
+ *
+ * DESCRIPTION
+ *
+ * Calculates the data length with given header length. This macro
+ * can be used to check whether the data_len with header_len exceeds
+ * SILC_PACKET_MAX_LEN. If it does, this returns the new data_len
+ * so that the SILC_PACKET_MAX_LEN is not exceeded. If the data_len
+ * plus header_len fits SILC_PACKET_MAX_LEN the returned data length
+ * is the data_len given as argument. This macro can be used when
+ * assembling packet.
+ *
+ * SOURCE
+ */
+#define SILC_PACKET_DATALEN(data_len, header_len) \
+ ((data_len + header_len) > SILC_PACKET_MAX_LEN ? \
+ data_len - ((data_len + header_len) - SILC_PACKET_MAX_LEN) : data_len)
+/***/
+
/****d* silccore/SilcPacketAPI/SILC_PACKET_PADLEN
*
* NAME
* SYNOPSIS
*
* void silc_packet_encrypt(SilcCipher cipher, SilcHmac hmac,
- * SilcBuffer buffer, uint32 len);
+ * SilcBuffer buffer, SilcUInt32 len);
*
* DESCRIPTION
*
* cannot be used.
*
***/
-void silc_packet_encrypt(SilcCipher cipher, SilcHmac hmac, uint32 sequence,
- SilcBuffer buffer, uint32 len);
+void silc_packet_encrypt(SilcCipher cipher, SilcHmac hmac, SilcUInt32 sequence,
+ SilcBuffer buffer, SilcUInt32 len);
/****f* silccore/SilcPacketAPI/silc_packet_assemble
*
* SYNOPSIS
*
- * void silc_packet_assemble(SilcPacketContext *ctx);
+ * bool silc_packet_assemble(SilcPacketContext *packet, SilcRng rng,
+ * SilcCipher cipher, SilcHmac hmac,
+ * SilcSocketConnection sock,
+ * const unsigned char *data, SilcUInt32 data_len,
+ * const SilcBuffer assembled_packet);
*
* DESCRIPTION
*
- * Assembles a new packet to be ready for send out. The buffer sent as
- * argument must include the data to be sent and it must not be encrypted.
- * The packet also must have enough free space so that the SILC header
- * and padding maybe added to the packet. The packet is encrypted after
- * this function has returned.
- *
- * The buffer sent as argument should be something like following:
- *
- * --------------------------------------------
- * | head | data | tail |
- * --------------------------------------------
- * ^ ^
- * 58 bytes x bytes
- *
- * So that the SILC header and 1 - 16 bytes of padding can fit to
- * the buffer. After assembly the buffer might look like this:
- *
- * --------------------------------------------
- * | data | |
- * --------------------------------------------
- * ^ ^
- * Start of assembled packet
- *
- * Packet construct is as follows (* = won't be encrypted):
- *
- * n bytes SILC Header
- * 2 bytes Payload length (*)
- * 1 byte Flags
- * 1 byte Packet type
- * 2 bytes Source ID Length
- * 2 bytes Destination ID Length
- * 1 byte Source ID Type
- * n bytes Source ID
- * 1 byte Destination ID Type
- * n bytes Destination ID
- *
- * 1 - 16 bytes Padding
- *
- * n bytes Data payload
- *
- * All fields in the packet will be authenticated by MAC. The MAC is
- * not computed here, it must be computed separately before encrypting
- * the packet.
+ * Assembles new packet to be ready for encrypting and sending out.
+ * The `packet' is filled by caller to include the packet header specific
+ * values. This prepares the socket connection's `sock' outoing buffer
+ * for sending data, and returns the assembled packet to the
+ * `assembled_packet' pointer sent by the caller. The `assembled_packet'
+ * is a reference to the socket connection's outgoing buffer. The
+ * returned packet can be encrypted, and then sent to network by calling
+ * silc_packet_send function.
*
***/
-void silc_packet_assemble(SilcPacketContext *ctx, SilcCipher cipher);
+bool silc_packet_assemble(SilcPacketContext *packet, SilcRng rng,
+ SilcCipher cipher, SilcHmac hmac,
+ SilcSocketConnection sock,
+ const unsigned char *data, SilcUInt32 data_len,
+ const SilcBuffer assembled_packet);
/****f* silccore/SilcPacketAPI/silc_packet_send_prepare
*
* SYNOPSIS
*
- * void silc_packet_send_prepare(SilcSocketConnection sock,
- * uint32 header_len,
- * uint32 padlen,
- * uint32 data_len);
+ * bool silc_packet_send_prepare(SilcSocketConnection sock,
+ * SilcUInt32 header_len,
+ * SilcUInt32 pad_len,
+ * SilcUInt32 data_len,
+ * SilcHmac hmac,
+ * const SilcBuffer packet);
*
* DESCRIPTION
*
- * Prepare outgoing data buffer for packet sending. This moves the data
- * area so that new packet may be added into it. If needed this allocates
- * more space to the buffer. This handles directly the connection's
- * outgoing buffer in SilcSocketConnection object.
+ * This function can be used to prepare the outgoing data buffer in
+ * the socket connection specified by `sock' for packet sending.
+ * This is used internally by packet sending routines, but application
+ * may call this if it doesn't call silc_packet_assemble function.
+ * If that function is called then application must not call this since
+ * that function calls this internally.
+ *
+ * This returns the prepared data area into the `packet' pointer provided
+ * caller, which can be used then to add data to it, and later encrypt
+ * it. The `packet' includes reference to the socket connection's
+ * outgoing buffer.
*
***/
-void silc_packet_send_prepare(SilcSocketConnection sock,
- uint32 header_len,
- uint32 padlen,
- uint32 data_len);
+bool silc_packet_send_prepare(SilcSocketConnection sock,
+ SilcUInt32 header_len,
+ SilcUInt32 pad_len,
+ SilcUInt32 data_len,
+ SilcHmac hmac,
+ const SilcBuffer packet);
/****f* silccore/SilcPacketAPI/silc_packet_receive
*
bool silc_packet_receive_process(SilcSocketConnection sock,
bool local_is_router,
SilcCipher cipher, SilcHmac hmac,
- uint32 sequence,
+ SilcUInt32 sequence,
SilcPacketParserCallback parser,
void *parser_context);