From 8cf8c85f3fdfcbae751f606bbce44a2cd0ef5bbf Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Sun, 19 Nov 2000 12:01:26 +0000 Subject: [PATCH] *** empty log message *** --- lib/silccore/silcchannel.c | 3 +-- lib/silccore/silccommand.c | 52 ++++++++++++++++++++++++++++++++++++++ lib/silccore/silccommand.h | 2 ++ lib/silccore/silcpacket.c | 3 +-- lib/silccore/silcpayload.c | 34 +++++++++++++++++++++++++ lib/silccore/silcpayload.h | 1 + 6 files changed, 91 insertions(+), 4 deletions(-) diff --git a/lib/silccore/silcchannel.c b/lib/silccore/silcchannel.c index c2226da4..01907084 100644 --- a/lib/silccore/silcchannel.c +++ b/lib/silccore/silcchannel.c @@ -99,8 +99,7 @@ SilcBuffer silc_channel_payload_encode(unsigned short data_len, buffer = silc_buffer_alloc(len + iv_len); /* Generate padding */ - for (i = 0; i < pad_len; i++) - pad[i] = silc_rng_get_byte(rng); + for (i = 0; i < pad_len; i++) pad[i] = silc_rng_get_byte(rng); silc_buffer_pull_tail(buffer, SILC_BUFFER_END(buffer)); diff --git a/lib/silccore/silccommand.c b/lib/silccore/silccommand.c index 6c45cdb8..14ea4e9e 100644 --- a/lib/silccore/silccommand.c +++ b/lib/silccore/silccommand.c @@ -126,6 +126,49 @@ SilcBuffer silc_command_payload_encode(SilcCommand cmd, return buffer; } +/* Same as above but encode the buffer from SilcCommandPayload structure + instead of raw data. */ + +SilcBuffer silc_command_payload_encode_payload(SilcCommandPayload payload) +{ + SilcBuffer buffer; + SilcBuffer args = NULL; + unsigned int len = 0; + unsigned int argc = 0; + + SILC_LOG_DEBUG(("Encoding command payload")); + + if (payload->args) { + args = silc_argument_payload_encode_payload(payload->args); + len = args->len; + argc = silc_argument_get_arg_num(payload->args); + } + + len += SILC_COMMAND_PAYLOAD_LEN; + buffer = silc_buffer_alloc(len); + silc_buffer_pull_tail(buffer, SILC_BUFFER_END(buffer)); + + /* Create Command payload */ + silc_buffer_format(buffer, + SILC_STR_UI_SHORT(len), + SILC_STR_UI_CHAR(payload->cmd), + SILC_STR_UI_CHAR(argc), + SILC_STR_UI_SHORT(payload->ident), + SILC_STR_END); + + /* Add arguments */ + if (args) { + silc_buffer_pull(buffer, SILC_COMMAND_PAYLOAD_LEN); + silc_buffer_format(buffer, + SILC_STR_UI_XNSTRING(args->data, args->len), + SILC_STR_END); + silc_buffer_push(buffer, SILC_COMMAND_PAYLOAD_LEN); + silc_free(args); + } + + return buffer; +} + /* Encodes Command payload with variable argument list. The arguments must be: unsigned int, unsigned char *, unsigned int, ... One {unsigned int, unsigned char * and unsigned int} forms one argument, @@ -304,3 +347,12 @@ unsigned short silc_command_get_ident(SilcCommandPayload payload) { return payload->ident; } + +/* Function to set identifier to already allocated Command Payload. Command + payloads are frequentlly resent in SILC and thusly this makes it easy + to set the identifier. */ + +void silc_command_set_ident(SilcCommandPayload payload, unsigned short ident) +{ + payload->ident = ident; +} diff --git a/lib/silccore/silccommand.h b/lib/silccore/silccommand.h index bdca206b..7038d6da 100644 --- a/lib/silccore/silccommand.h +++ b/lib/silccore/silccommand.h @@ -136,6 +136,7 @@ SilcBuffer silc_command_payload_encode(SilcCommand cmd, unsigned int *argv_lens, unsigned int *argv_types, unsigned short ident); +SilcBuffer silc_command_payload_encode_payload(SilcCommandPayload payload); SilcBuffer silc_command_payload_encode_va(SilcCommand cmd, unsigned short ident, unsigned int argc, ...); @@ -151,5 +152,6 @@ void silc_command_free_payload(SilcCommandPayload payload); SilcCommand silc_command_get(SilcCommandPayload payload); SilcArgumentPayload silc_command_get_args(SilcCommandPayload payload); unsigned short silc_command_get_ident(SilcCommandPayload payload); +void silc_command_set_ident(SilcCommandPayload payload, unsigned short ident); #endif diff --git a/lib/silccore/silcpacket.c b/lib/silccore/silcpacket.c index f2800597..6846433a 100644 --- a/lib/silccore/silcpacket.c +++ b/lib/silccore/silcpacket.c @@ -204,8 +204,7 @@ void silc_packet_assemble(SilcPacketContext *ctx) /* Get random padding */ #if 1 - for (i = 0; i < ctx->padlen; i++) - tmppad[i] = silc_rng_get_byte(ctx->rng); + for (i = 0; i < ctx->padlen; i++) tmppad[i] = silc_rng_get_byte(ctx->rng); #else /* XXX: For testing - to be removed */ memset(tmppad, 65, sizeof(tmppad)); diff --git a/lib/silccore/silcpayload.c b/lib/silccore/silcpayload.c index add747ce..6724a95c 100644 --- a/lib/silccore/silcpayload.c +++ b/lib/silccore/silcpayload.c @@ -328,6 +328,40 @@ SilcBuffer silc_argument_payload_encode(unsigned int argc, return buffer; } +/* Same as above but encode the buffer from SilcArgumentPayload structure + instead of raw data. */ + +SilcBuffer silc_argument_payload_encode_payload(SilcArgumentPayload payload) +{ + SilcBuffer buffer; + unsigned int len; + int i; + + SILC_LOG_DEBUG(("Encoding Argument payload")); + + len = 0; + for (i = 0; i < payload->argc; i++) + len += 3 + payload->argv_lens[i]; + + buffer = silc_buffer_alloc(len); + silc_buffer_pull_tail(buffer, SILC_BUFFER_END(buffer)); + + /* Put arguments */ + for (i = 0; i < payload->argc; i++) { + silc_buffer_format(buffer, + SILC_STR_UI_SHORT(payload->argv_lens[i]), + SILC_STR_UI_CHAR(payload->argv_types[i]), + SILC_STR_UI_XNSTRING(payload->argv[i], + payload->argv_lens[i]), + SILC_STR_END); + silc_buffer_pull(buffer, 3 + payload->argv_lens[i]); + } + + silc_buffer_push(buffer, len); + + return buffer; +} + #if 0 /* Encodes Argument payload with variable argument list. The arguments must be: unsigned int, unsigned char *, unsigned int, ... One diff --git a/lib/silccore/silcpayload.h b/lib/silccore/silcpayload.h index e58171e2..a1d4fb66 100644 --- a/lib/silccore/silcpayload.h +++ b/lib/silccore/silcpayload.h @@ -42,6 +42,7 @@ SilcBuffer silc_argument_payload_encode(unsigned int argc, unsigned char **argv, unsigned int *argv_lens, unsigned int *argv_types); +SilcBuffer silc_argument_payload_encode_payload(SilcArgumentPayload payload); void silc_argument_payload_free(SilcArgumentPayload payload); unsigned int silc_argument_get_arg_num(SilcArgumentPayload payload); unsigned char *silc_argument_get_first_arg(SilcArgumentPayload payload, -- 2.24.0