Added checking for maximum packet length.
[silc.git] / lib / silccore / silcprivate.c
index fa9bfa9e926e9af2249344600b84efbdc507de4d..ac99257f21595ee14a737d7fb8be608a9c1e6d84 100644 (file)
 
 ******************************************************************************/
 
+/* Calculates padding length for message payload */
 #define SILC_PRIVATE_MESSAGE_PAD(__payloadlen) (16 - (__payloadlen) % 16)
 
+/* Header length plus maximum padding length */
+#define SILC_PRIVATE_MESSAGE_HLEN 4 + 16
+
+/* Returns the data length that fits to the packet.  If data length is too
+   big it will be truncated to fit to the payload. */
+#define SILC_PRIVATE_MESSAGE_DATALEN(data_len)                         \
+  ((data_len + SILC_PRIVATE_MESSAGE_HLEN) > SILC_PACKET_MAX_LEN ?      \
+   data_len - ((data_len + SILC_PRIVATE_MESSAGE_HLEN) -                \
+              SILC_PACKET_MAX_LEN) : data_len)
+
 /* Private Message Payload structure. Contents of this structure is parsed
    from SILC packets. */
 struct SilcPrivateMessagePayloadStruct {
@@ -95,7 +106,8 @@ silc_private_message_payload_parse(unsigned char *payload,
 SilcBuffer silc_private_message_payload_encode(SilcUInt16 flags,
                                               SilcUInt16 data_len,
                                               const unsigned char *data,
-                                              SilcCipher cipher)
+                                              SilcCipher cipher,
+                                              SilcRng rng)
 {
   int i;
   SilcBuffer buffer;
@@ -104,6 +116,7 @@ SilcBuffer silc_private_message_payload_encode(SilcUInt16 flags,
 
   SILC_LOG_DEBUG(("Encoding private message payload"));
 
+  data_len = SILC_PRIVATE_MESSAGE_DATALEN(data_len);
   len = 4 + data_len;
 
   if (cipher) {