message. The `data' is the private message. If the `force_send' is
TRUE the packet is sent immediately. */
-void silc_client_send_private_message(SilcClient client,
+bool silc_client_send_private_message(SilcClient client,
SilcClientConnection conn,
SilcClientEntry client_entry,
SilcMessageFlags flags,
SilcCipher cipher;
SilcHmac hmac;
int block_len;
+ bool ret = FALSE;
assert(client && conn && client_entry);
sock = conn->sock;
SILC_LOG_DEBUG(("Sending private message"));
/* Encode private message payload */
- buffer = silc_private_message_payload_encode(flags,
- data_len, data,
- client_entry->send_key,
- client_entry->hmac_send,
- client->rng);
+ buffer = silc_message_payload_encode(flags, data, data_len,
+ !client_entry->send_key ? FALSE :
+ !client_entry->generated,
+ TRUE, client_entry->send_key,
+ client_entry->hmac_send,
+ client->rng, NULL, client->private_key,
+ client->sha1hash);
+ if (!buffer) {
+ SILC_LOG_ERROR(("Error encoding private message"));
+ return FALSE;
+ }
/* If we don't have private message specific key then private messages
are just as any normal packet thus call normal packet sending. If
silc_free(packetdata.dst_id);
+ ret = TRUE;
+
out:
silc_buffer_free(buffer);
+
+ return ret;
}
static void silc_client_private_message_cb(SilcClient client,
SilcPacketContext *packet)
{
SilcClientConnection conn = (SilcClientConnection)sock->user_data;
- SilcPrivateMessagePayload payload = NULL;
+ SilcMessagePayload payload = NULL;
SilcClientID *remote_id = NULL;
SilcClientEntry remote_client;
SilcMessageFlags flags;
}
/* Parse the payload and decrypt it also if private message key is set */
- payload = silc_private_message_payload_parse(packet->buffer->data,
- packet->buffer->len,
- cipher, hmac);
+ payload = silc_message_payload_parse(packet->buffer->data,
+ packet->buffer->len, TRUE,
+ !remote_client->generated,
+ cipher, hmac);
if (!payload) {
silc_free(remote_id);
return;
}
- flags = silc_private_message_get_flags(payload);
+ flags = silc_message_get_flags(payload);
/* Pass the private message to application */
- message = silc_private_message_get_message(payload, &message_len);
- client->internal->ops->private_message(client, conn, remote_client, flags,
- message, message_len);
+ message = silc_message_get_data(payload, &message_len);
+ client->internal->ops->private_message(client, conn, remote_client, payload,
+ flags, message, message_len);
/* See if we are away (gone). If we are away we will reply to the
sender with the set away message. */
out:
if (payload)
- silc_private_message_payload_free(payload);
+ silc_message_payload_free(payload);
silc_free(remote_id);
}
/* Produce the key material as the protocol defines */
keymat = silc_calloc(1, sizeof(*keymat));
if (silc_ske_process_key_material_data(key, key_len, 16, 256, 16,
- client->md5hash, keymat)
+ client->sha1hash, keymat)
!= SILC_SKE_STATUS_OK)
return FALSE;
if (!silc_hmac_is_supported(hmac))
return FALSE;
+ client_entry->generated = TRUE;
+
/* Allocate the cipher and HMAC */
silc_cipher_alloc(cipher, &client_entry->send_key);
silc_cipher_alloc(cipher, &client_entry->receive_key);