X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilccore%2Fsilcprivate.c;h=26a064297028477ee2dba73f94da60fce0220509;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=41d948e2daeddec433a9238ce9b3ab84cbd7bd42;hpb=9bc7aa726cf320ec4fad29466f884a0db5c89557;p=silc.git diff --git a/lib/silccore/silcprivate.c b/lib/silccore/silcprivate.c index 41d948e2..26a06429 100644 --- a/lib/silccore/silcprivate.c +++ b/lib/silccore/silcprivate.c @@ -29,13 +29,13 @@ ******************************************************************************/ +#define SILC_PRIVATE_MESSAGE_PAD(__payloadlen) (16 - (__payloadlen) % 16) + /* Private Message Payload structure. Contents of this structure is parsed from SILC packets. */ struct SilcPrivateMessagePayloadStruct { - unsigned short flags; - unsigned short nickname_len; - unsigned char *nickname; - unsigned short message_len; + SilcUInt16 flags; + SilcUInt16 message_len; unsigned char *message; }; @@ -43,34 +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, + 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->nickname, - &new->nickname_len), 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) || - (new->nickname_len < 1 || new->nickname_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; } @@ -86,25 +90,23 @@ silc_private_message_payload_parse(SilcBuffer buffer, SilcCipher cipher) 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(unsigned short flags, - unsigned int nickname_len, - unsigned char *nickname, - unsigned short 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; - unsigned int len, pad_len = 0; - unsigned char pad[SILC_PACKET_MAX_PADLEN]; + SilcUInt32 len, pad_len = 0; + unsigned char pad[16]; SILC_LOG_DEBUG(("Encoding private message payload")); - len = 4 + nickname_len + 2 + data_len; + len = 4 + data_len; 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 */ @@ -118,8 +120,6 @@ SilcBuffer silc_private_message_payload_encode(unsigned short flags, silc_buffer_pull_tail(buffer, SILC_BUFFER_END(buffer)); silc_buffer_format(buffer, SILC_STR_UI_SHORT(flags), - SILC_STR_UI_SHORT(nickname_len), - SILC_STR_UI_XNSTRING(nickname, nickname_len), SILC_STR_UI_SHORT(data_len), SILC_STR_UI_XNSTRING(data, data_len), SILC_STR_UI_XNSTRING(pad, pad_len), @@ -135,11 +135,10 @@ SilcBuffer silc_private_message_payload_encode(unsigned short flags, return buffer; } -/* Free's Private Message Payload */ +/* Frees Private Message Payload */ void silc_private_message_payload_free(SilcPrivateMessagePayload payload) { - silc_free(payload->nickname); if (payload->message) { memset(payload->message, 0, payload->message_len); silc_free(payload->message); @@ -149,29 +148,17 @@ void silc_private_message_payload_free(SilcPrivateMessagePayload payload) /* Return flags */ -unsigned short +SilcUInt16 silc_private_message_get_flags(SilcPrivateMessagePayload payload) { return payload->flags; } -/* Return nickname */ - -unsigned char * -silc_private_message_get_nickname(SilcPrivateMessagePayload payload, - unsigned int *nickname_len) -{ - if (nickname_len) - *nickname_len = payload->nickname_len; - - return payload->nickname; -} - /* Return message */ unsigned char * silc_private_message_get_message(SilcPrivateMessagePayload payload, - unsigned int *message_len) + SilcUInt32 *message_len) { if (message_len) *message_len = payload->message_len;