******************************************************************************/
+#define SILC_PRIVATE_MESSAGE_PAD(__payloadlen) (16 - (__payloadlen) % 16)
+
/* Private Message Payload structure. Contents of this structure is parsed
from SILC packets. */
struct SilcPrivateMessagePayloadStruct {
- uint16 flags;
- uint16 message_len;
+ SilcUInt16 flags;
+ SilcUInt16 message_len;
unsigned char *message;
};
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,
+ SilcUInt32 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) {
- SILC_LOG_ERROR(("Incorrect private message payload"));
+ 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;
}
the cipher is provided the packet is also encrypted here. It is provided
if the private message private keys are used. */
-SilcBuffer silc_private_message_payload_encode(uint16 flags,
- uint16 data_len,
- unsigned char *data,
+SilcBuffer silc_private_message_payload_encode(SilcUInt16 flags,
+ SilcUInt16 data_len,
+ const unsigned char *data,
SilcCipher cipher)
{
int i;
SilcBuffer buffer;
- uint32 len, pad_len = 0, block_len;
- unsigned char pad[SILC_PACKET_MAX_PADLEN];
+ SilcUInt32 len, pad_len = 0;
+ unsigned char pad[16];
SILC_LOG_DEBUG(("Encoding private message payload"));
if (cipher) {
/* Calculate length of padding. */
- block_len = silc_cipher_get_block_len(cipher);
- pad_len = SILC_PACKET_PADLEN(len, block_len);
+ pad_len = SILC_PRIVATE_MESSAGE_PAD(len);
len += pad_len;
/* Generate padding */
/* Return flags */
-uint16
+SilcUInt16
silc_private_message_get_flags(SilcPrivateMessagePayload payload)
{
return payload->flags;
unsigned char *
silc_private_message_get_message(SilcPrivateMessagePayload payload,
- uint32 *message_len)
+ SilcUInt32 *message_len)
{
if (message_len)
*message_len = payload->message_len;