/* Encrypt the data area of the packet. */
if (cipher) {
SILC_LOG_DEBUG(("Encrypting packet, cipher %s, len %d",
- cipher->cipher->name, len));
- silc_cipher_encrypt(cipher, buffer->data, buffer->data, len, cipher->iv);
+ silc_cipher_get_name(cipher), len));
+ silc_cipher_encrypt(cipher, buffer->data, buffer->data, len,
+ silc_cipher_get_iv(cipher));
}
/* Pull the HMAC into the visible data area in the buffer */
/* Assembles a new packet to be ready for send out. */
bool silc_packet_assemble(SilcPacketContext *packet, SilcRng rng,
- SilcCipher cipher, SilcHmac hmac,
- SilcSocketConnection sock,
- const unsigned char *data, SilcUInt32 data_len,
- const SilcBuffer assembled_packet)
+ SilcCipher cipher, SilcHmac hmac,
+ SilcSocketConnection sock,
+ const unsigned char *data, SilcUInt32 data_len,
+ const SilcBuffer assembled_packet)
{
unsigned char tmppad[SILC_PACKET_MAX_PADLEN];
int block_len = cipher ? silc_cipher_get_block_len(cipher) : 0;
padding. */
if (!packet->truelen) {
data_len = SILC_PACKET_DATALEN(data_len, SILC_PACKET_HEADER_LEN +
- packet->src_id_len + packet->dst_id_len);
+ packet->src_id_len + packet->dst_id_len);
packet->truelen = data_len + SILC_PACKET_HEADER_LEN +
packet->src_id_len + packet->dst_id_len;
}
/* Calculate the length of the padding. The padding is calculated from
the data that will be encrypted. */
if (!packet->padlen) {
- packet->padlen = (packet->long_pad ?
- SILC_PACKET_PADLEN_MAX(packet->truelen) :
- SILC_PACKET_PADLEN(packet->truelen, block_len));
+ if (packet->long_pad)
+ SILC_PACKET_PADLEN_MAX(packet->truelen, block_len, packet->padlen);
+ else
+ SILC_PACKET_PADLEN(packet->truelen, block_len, packet->padlen);
}
/* Now prepare the outgoing data buffer for packet sending and start
/* Return pointer to the assembled packet */
if (!silc_packet_send_prepare(sock, packet->truelen - data_len,
- packet->padlen, data_len, hmac,
- assembled_packet))
+ packet->padlen, data_len, hmac,
+ assembled_packet))
return FALSE;
/* Get random padding */
if (rng)
for (i = 0; i < packet->padlen; i++) tmppad[i] =
- silc_rng_get_byte_fast(rng);
+ silc_rng_get_byte_fast(rng);
else
for (i = 0; i < packet->padlen; i++) tmppad[i] =
- silc_rng_global_get_byte_fast();
+ silc_rng_global_get_byte_fast();
/* Create the packet. This creates the SILC header, adds padding, and
the actual packet data. */
ret =
silc_buffer_format(assembled_packet,
- SILC_STR_UI_SHORT(packet->truelen),
- SILC_STR_UI_CHAR(packet->flags),
- SILC_STR_UI_CHAR(packet->type),
- SILC_STR_UI_CHAR(packet->padlen),
- SILC_STR_UI_CHAR(0),
- SILC_STR_UI_CHAR(packet->src_id_len),
- SILC_STR_UI_CHAR(packet->dst_id_len),
- SILC_STR_UI_CHAR(packet->src_id_type),
- SILC_STR_UI_XNSTRING(packet->src_id,
- packet->src_id_len),
- SILC_STR_UI_CHAR(packet->dst_id_type),
- SILC_STR_UI_XNSTRING(packet->dst_id,
- packet->dst_id_len),
- SILC_STR_UI_XNSTRING(tmppad, packet->padlen),
- SILC_STR_UI_XNSTRING(data, data_len),
- SILC_STR_END);
+ SILC_STR_UI_SHORT(packet->truelen),
+ SILC_STR_UI_CHAR(packet->flags),
+ SILC_STR_UI_CHAR(packet->type),
+ SILC_STR_UI_CHAR(packet->padlen),
+ SILC_STR_UI_CHAR(0),
+ SILC_STR_UI_CHAR(packet->src_id_len),
+ SILC_STR_UI_CHAR(packet->dst_id_len),
+ SILC_STR_UI_CHAR(packet->src_id_type),
+ SILC_STR_UI_XNSTRING(packet->src_id,
+ packet->src_id_len),
+ SILC_STR_UI_CHAR(packet->dst_id_type),
+ SILC_STR_UI_XNSTRING(packet->dst_id,
+ packet->dst_id_len),
+ SILC_STR_UI_XNSTRING(tmppad, packet->padlen),
+ SILC_STR_UI_XNSTRING(data, data_len),
+ SILC_STR_END);
if (ret < 0)
return FALSE;
SILC_LOG_HEXDUMP(("Assembled packet, len %d", assembled_packet->len),
- assembled_packet->data, assembled_packet->len);
+ assembled_packet->data, assembled_packet->len);
return TRUE;
}
pointer to that buffer into the `packet'. */
bool silc_packet_send_prepare(SilcSocketConnection sock,
- SilcUInt32 header_len,
- SilcUInt32 pad_len,
- SilcUInt32 data_len,
- SilcHmac hmac,
- const SilcBuffer packet)
+ SilcUInt32 header_len,
+ SilcUInt32 pad_len,
+ SilcUInt32 data_len,
+ SilcHmac hmac,
+ const SilcBuffer packet)
{
int totlen;
unsigned char *oldptr;
SILC_LOG_DEBUG(("Allocating outgoing data buffer"));
sock->outbuf = silc_buffer_alloc(totlen > SILC_PACKET_DEFAULT_SIZE ?
- totlen : SILC_PACKET_DEFAULT_SIZE);
+ totlen : SILC_PACKET_DEFAULT_SIZE);
if (!sock->outbuf)
return FALSE;
} else {
if ((sock->outbuf->end - sock->outbuf->tail) < (totlen + mac_len)) {
SILC_LOG_DEBUG(("Reallocating outgoing data buffer"));
sock->outbuf = silc_buffer_realloc(sock->outbuf,
- sock->outbuf->truelen + (totlen * 2));
+ sock->outbuf->truelen + (totlen * 2));
if (!sock->outbuf)
return FALSE;
}
/* Decrypt first 16 bytes of the packet */
if (!SILC_IS_INBUF_PENDING(sock) && cipher)
silc_cipher_decrypt(cipher, sock->inbuf->data, sock->inbuf->data,
- SILC_PACKET_MIN_HEADER_LEN, cipher->iv);
+ SILC_PACKET_MIN_HEADER_LEN,
+ silc_cipher_get_iv(cipher));
/* Get packet lenght and full packet length with padding */
SILC_PACKET_LENGTH(sock->inbuf, packetlen, paddedlen);
/* Sanity checks */
if (packetlen < SILC_PACKET_MIN_LEN) {
- SILC_LOG_DEBUG(("Received invalid packet, dropped"));
+ SILC_LOG_ERROR(("Received invalid packet, dropped"));
silc_buffer_clear(sock->inbuf);
return FALSE;
}
if (silc_packet_decrypt(cipher, hmac, parse_ctx->packet->sequence,
parse_ctx->packet->buffer,
parse_ctx->normal) == -1) {
- SILC_LOG_WARNING(("Packet decryption failed %s:%d [%s]",
+ SILC_LOG_WARNING(("Packet decryption failed %s:%d [%s] [%s]",
sock->hostname, sock->port,
+ silc_get_packet_name(parse_ctx->packet->type),
(sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
"Router")));
+ silc_packet_context_free(parse_ctx->packet);
+ silc_free(parse_ctx);
+ return FALSE;
}
/* Pull the packet from inbuf thus we'll get the next one
if ((buffer->len - silc_hmac_len(hmac)) > SILC_PACKET_MIN_LEN) {
silc_buffer_push_tail(buffer, silc_hmac_len(hmac));
} else {
- SILC_LOG_DEBUG(("Bad MAC length in packet, packet dropped"));
+ SILC_LOG_ERROR(("Bad MAC length in packet, packet dropped"));
return FALSE;
}
}
/* Decrypt rest of the packet */
silc_buffer_pull(buffer, SILC_PACKET_MIN_HEADER_LEN);
silc_cipher_decrypt(cipher, buffer->data, buffer->data, buffer->len,
- cipher->iv);
+ silc_cipher_get_iv(cipher));
silc_buffer_push(buffer, SILC_PACKET_MIN_HEADER_LEN);
SILC_LOG_HEXDUMP(("Fully decrypted packet, len %d", buffer->len),
if ((buffer->len - silc_hmac_len(hmac)) > SILC_PACKET_MIN_LEN) {
silc_buffer_push_tail(buffer, silc_hmac_len(hmac));
} else {
- SILC_LOG_DEBUG(("Bad MAC length in packet, packet dropped"));
+ SILC_LOG_ERROR(("Bad MAC length in packet, packet dropped"));
return FALSE;
}
}
silc_buffer_pull(buffer, SILC_PACKET_MIN_HEADER_LEN);
if (len > buffer->len) {
- SILC_LOG_DEBUG(("Garbage in header of packet, bad packet length, "
+ SILC_LOG_ERROR(("Garbage in header of packet, bad packet length, "
"packet dropped"));
return FALSE;
}
- silc_cipher_decrypt(cipher, buffer->data, buffer->data, len, cipher->iv);
+ silc_cipher_decrypt(cipher, buffer->data, buffer->data, len,
+ silc_cipher_get_iv(cipher));
silc_buffer_push(buffer, SILC_PACKET_MIN_HEADER_LEN);
SILC_LOG_HEXDUMP(("packet, len %d", buffer->len),
buffer->data, buffer->len);
SilcBuffer buffer = ctx->buffer;
SilcUInt8 tmp;
int len, ret;
+ SilcUInt8 src_id_len, src_id_type, dst_id_len, dst_id_type, padlen;
SILC_LOG_DEBUG(("Parsing incoming packet"));
SILC_STR_UI_SHORT(&ctx->truelen),
SILC_STR_UI_CHAR(&ctx->flags),
SILC_STR_UI_CHAR(&ctx->type),
- SILC_STR_UI_CHAR(&ctx->padlen),
+ SILC_STR_UI_CHAR(&padlen),
SILC_STR_UI_CHAR(&tmp),
- SILC_STR_UI_CHAR(&ctx->src_id_len),
- SILC_STR_UI_CHAR(&ctx->dst_id_len),
- SILC_STR_UI_CHAR(&ctx->src_id_type),
+ SILC_STR_UI_CHAR(&src_id_len),
+ SILC_STR_UI_CHAR(&dst_id_len),
+ SILC_STR_UI_CHAR(&src_id_type),
SILC_STR_END);
if (len == -1 || tmp != 0)
return SILC_PACKET_NONE;
- if (ctx->src_id_len > SILC_PACKET_MAX_ID_LEN ||
- ctx->dst_id_len > SILC_PACKET_MAX_ID_LEN) {
+ if (src_id_len > SILC_PACKET_MAX_ID_LEN ||
+ dst_id_len > SILC_PACKET_MAX_ID_LEN) {
SILC_LOG_ERROR(("Bad ID lengths in packet (%d and %d)",
- ctx->src_id_len, ctx->dst_id_len));
+ src_id_len, dst_id_len));
return SILC_PACKET_NONE;
}
silc_buffer_pull(buffer, len);
ret = silc_buffer_unformat(buffer,
SILC_STR_UI_XNSTRING_ALLOC(&ctx->src_id,
- ctx->src_id_len),
- SILC_STR_UI_CHAR(&ctx->dst_id_type),
+ src_id_len),
+ SILC_STR_UI_CHAR(&dst_id_type),
SILC_STR_UI_XNSTRING_ALLOC(&ctx->dst_id,
- ctx->dst_id_len),
- SILC_STR_UI_XNSTRING(NULL, ctx->padlen),
+ dst_id_len),
+ SILC_STR_UI_XNSTRING(NULL, padlen),
SILC_STR_END);
if (ret == -1)
return SILC_PACKET_NONE;
+ if (src_id_type > SILC_ID_CHANNEL || dst_id_type > SILC_ID_CHANNEL) {
+ SILC_LOG_ERROR(("Bad ID types in packet (%d and %d)",
+ src_id_type, dst_id_type));
+ return SILC_PACKET_NONE;
+ }
+
+ ctx->src_id_len = src_id_len;
+ ctx->dst_id_len = dst_id_len;
+ ctx->src_id_type = src_id_type;
+ ctx->dst_id_type = dst_id_type;
+ ctx->padlen = padlen;
+
silc_buffer_push(buffer, len);
SILC_LOG_HEXDUMP(("parsed packet, len %d", ctx->buffer->len),
SilcBuffer buffer = ctx->buffer;
SilcUInt8 tmp;
int len, ret;
+ SilcUInt8 src_id_len, src_id_type, dst_id_len, dst_id_type, padlen;
SILC_LOG_DEBUG(("Parsing incoming packet"));
SILC_STR_UI_SHORT(&ctx->truelen),
SILC_STR_UI_CHAR(&ctx->flags),
SILC_STR_UI_CHAR(&ctx->type),
- SILC_STR_UI_CHAR(&ctx->padlen),
+ SILC_STR_UI_CHAR(&padlen),
SILC_STR_UI_CHAR(&tmp),
- SILC_STR_UI_CHAR(&ctx->src_id_len),
- SILC_STR_UI_CHAR(&ctx->dst_id_len),
- SILC_STR_UI_CHAR(&ctx->src_id_type),
+ SILC_STR_UI_CHAR(&src_id_len),
+ SILC_STR_UI_CHAR(&dst_id_len),
+ SILC_STR_UI_CHAR(&src_id_type),
SILC_STR_END);
if (len == -1 || tmp != 0) {
SILC_LOG_ERROR(("Malformed packet header, packet dropped"));
return SILC_PACKET_NONE;
}
- if (ctx->src_id_len > SILC_PACKET_MAX_ID_LEN ||
- ctx->dst_id_len > SILC_PACKET_MAX_ID_LEN) {
+ if (src_id_len > SILC_PACKET_MAX_ID_LEN ||
+ dst_id_len > SILC_PACKET_MAX_ID_LEN) {
SILC_LOG_ERROR(("Bad ID lengths in packet (%d and %d)",
- ctx->src_id_len, ctx->dst_id_len));
+ src_id_len, dst_id_len));
return SILC_PACKET_NONE;
}
silc_buffer_pull(buffer, len);
ret = silc_buffer_unformat(buffer,
SILC_STR_UI_XNSTRING_ALLOC(&ctx->src_id,
- ctx->src_id_len),
- SILC_STR_UI_CHAR(&ctx->dst_id_type),
+ src_id_len),
+ SILC_STR_UI_CHAR(&dst_id_type),
SILC_STR_UI_XNSTRING_ALLOC(&ctx->dst_id,
- ctx->dst_id_len),
- SILC_STR_UI_XNSTRING(NULL, ctx->padlen),
+ dst_id_len),
+ SILC_STR_UI_XNSTRING(NULL, padlen),
SILC_STR_END);
if (ret == -1) {
SILC_LOG_ERROR(("Malformed packet header, packet dropped"));
return SILC_PACKET_NONE;
}
+ if (src_id_type > SILC_ID_CHANNEL || dst_id_type > SILC_ID_CHANNEL) {
+ SILC_LOG_ERROR(("Bad ID types in packet (%d and %d)",
+ src_id_type, dst_id_type));
+ return SILC_PACKET_NONE;
+ }
+
+ ctx->src_id_len = src_id_len;
+ ctx->dst_id_len = dst_id_len;
+ ctx->src_id_type = src_id_type;
+ ctx->dst_id_type = dst_id_type;
+ ctx->padlen = padlen;
+
silc_buffer_push(buffer, len);
SILC_LOG_HEXDUMP(("parsed packet, len %d", ctx->buffer->len),