Function silc_message_payload_encode
SYNOPSIS
SilcBuffer silc_message_payload_encode(SilcMessageFlags flags,
const unsigned char *data,
SilcUInt32 data_len,
SilcBool generate_iv,
SilcBool private_message,
SilcCipher cipher,
SilcHmac hmac,
SilcRng rng,
SilcPublicKey public_key,
SilcPrivateKey private_key,
SilcHash hash,
SilcID *sender_id,
SilcID *receiver_id,
SilcBuffer buffer);
DESCRIPTION
Encodes a Message Payload into a buffer and returns it. This is
used to encode channel messages and private messages into a packet.
If `private_message' is FALSE then this encodes channel message, if
it is TRUE this encodes private message. If `private_message' is
TRUE then `generate_iv' MUST be FALSE if the private message key
`cipher' is not static key (pre-shared key). If it is static key
then protocol dictates that IV must be present in the Message Payload
and `generate_iv' must be TRUE. The caller must know whether the key
is static or not for private messages. If the key was generated with
Key Agreement protocol then `generate_iv' is always FALSE. For
channel messages `generate_iv' is always set to TRUE value.
The `cipher' is the cipher used to encrypt the message and `hmac'
is used to compute the MAC for the payload. If encoding private
message that will be encrypted with session keys (no private message
key) then `cipher' and `hmac' is NULL and this merely encodes the
payload buffer, and the caller must encrypt the packet later.
If `rng' is NULL then global RNG is used, if non-NULL then the
`rng' is used (for IV and padding generation).
The `public_key', `private_key' and `hash' are provided only if the
flags includes SILC_MESSAGE_FLAG_SIGNED, in which case the message
will be digitally signed. If `public_key' is non-NULL then it will
be included in the message. The `private_message' and `hash' MUST
be provided. The `hash' SHOULD be SHA1.
The `sender_id' is the ID message sender and `receiver_id' is ID of
message receiver.
If the `buffer' is non-NULL then the payload will be encoded into
that buffer. The same buffer is returned. Otherwise new buffer is
allocated and returned. The `buffer' will be automatically enlarged
if the payload does not fit to it.
|