updates.
[silc.git] / lib / silccore / silcprivate.c
index 25e749f2d34ed90f93104962b71d1199967fbd45..ac56c1d03d864cbe7294231e2eebfb358797acc8 100644 (file)
@@ -29,6 +29,8 @@
 
 ******************************************************************************/
 
+#define SILC_PRIVATE_MESSAGE_PAD(__payloadlen) (16 - (__payloadlen) % 16)
+
 /* Private Message Payload structure. Contents of this structure is parsed
    from SILC packets. */
 struct SilcPrivateMessagePayloadStruct {
@@ -41,31 +43,38 @@ struct SilcPrivateMessagePayloadStruct {
    structure. This also decrypts the message if the `cipher' is provided. */
 
 SilcPrivateMessagePayload 
-silc_private_message_payload_parse(SilcBuffer buffer, SilcCipher cipher)
+silc_private_message_payload_parse(unsigned char *payload,
+                                  uint32 payload_len,
+                                  SilcCipher cipher)
 {
+  SilcBufferStruct buffer;
   SilcPrivateMessagePayload new;
   int ret;
 
   SILC_LOG_DEBUG(("Parsing private message payload"));
 
+  silc_buffer_set(&buffer, payload, payload_len);
+
   /* Decrypt the payload */
   if (cipher)
-    silc_cipher_decrypt(cipher, buffer->data, buffer->data, 
-                       buffer->len, cipher->iv);
+    silc_cipher_decrypt(cipher, buffer.data, buffer.data, 
+                       buffer.len, cipher->iv);
 
   new = silc_calloc(1, sizeof(*new));
 
   /* Parse the Private Message Payload. Ignore the padding. */
-  ret = silc_buffer_unformat(buffer,
+  ret = silc_buffer_unformat(&buffer,
                             SILC_STR_UI_SHORT(&new->flags),
                             SILC_STR_UI16_NSTRING_ALLOC(&new->message, 
                                                         &new->message_len),
                             SILC_STR_END);
-  if (ret == -1)
+  if (ret == -1) {
+    SILC_LOG_DEBUG(("Incorrect private message payload"));
     goto err;
+  }
 
-  if ((new->message_len < 1 || new->message_len > buffer->len)) {
-    SILC_LOG_ERROR(("Incorrect private message payload in packet, "
+  if ((new->message_len < 1 || new->message_len > buffer.len)) {
+    SILC_LOG_DEBUG(("Incorrect private message payload in packet, "
                    "packet dropped"));
     goto err;
   }
@@ -83,13 +92,13 @@ silc_private_message_payload_parse(SilcBuffer buffer, SilcCipher cipher)
 
 SilcBuffer silc_private_message_payload_encode(uint16 flags,
                                               uint16 data_len,
-                                              unsigned char *data,
+                                              const unsigned char *data,
                                               SilcCipher cipher)
 {
   int i;
   SilcBuffer buffer;
   uint32 len, pad_len = 0;
-  unsigned char pad[SILC_PACKET_MAX_PADLEN];
+  unsigned char pad[16];
 
   SILC_LOG_DEBUG(("Encoding private message payload"));
 
@@ -97,7 +106,7 @@ SilcBuffer silc_private_message_payload_encode(uint16 flags,
 
   if (cipher) {
     /* Calculate length of padding. */
-    pad_len = SILC_PACKET_PADLEN((len + 2));
+    pad_len = SILC_PRIVATE_MESSAGE_PAD(len);
     len += pad_len;
 
     /* Generate padding */
@@ -126,7 +135,7 @@ SilcBuffer silc_private_message_payload_encode(uint16 flags,
   return buffer;
 }
 
-/* Free's Private Message Payload */
+/* Frees Private Message Payload */
 
 void silc_private_message_payload_free(SilcPrivateMessagePayload payload)
 {