X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcclient%2Fclient.c;h=745cb698b52daf343e7233769ab7df0f770f7c00;hp=d6894575f169179aa7b66666a85d43ef437b7fca;hb=382d15d447b7a95390decfa783836ae4fe255b3d;hpb=5f9b1e9701fc699e68af0e5778c0bff294031d6f diff --git a/lib/silcclient/client.c b/lib/silcclient/client.c index d6894575..745cb698 100644 --- a/lib/silcclient/client.c +++ b/lib/silcclient/client.c @@ -26,7 +26,6 @@ SILC_TASK_CALLBACK(silc_client_connect_to_server_start); SILC_TASK_CALLBACK(silc_client_connect_to_server_second); SILC_TASK_CALLBACK(silc_client_connect_to_server_final); -SILC_TASK_CALLBACK(silc_client_rekey_callback); SILC_TASK_CALLBACK(silc_client_rekey_final); static bool silc_client_packet_parse(SilcPacketParserContext *parser_context, @@ -89,6 +88,16 @@ void silc_client_free(SilcClient client) if (client->rng) silc_rng_free(client->rng); + silc_cipher_unregister_all(); + silc_pkcs_unregister_all(); + silc_hash_unregister_all(); + silc_hmac_unregister_all(); + + silc_hash_free(client->md5hash); + silc_hash_free(client->sha1hash); + silc_hmac_free(client->internal->md5hmac); + silc_hmac_free(client->internal->sha1hmac); + silc_cipher_free(client->internal->none_cipher); silc_free(client->internal->params); silc_free(client->internal->silc_client_version); silc_free(client->internal); @@ -100,10 +109,11 @@ void silc_client_free(SilcClient client) the client ready to be run. One must call silc_client_run to run the client. Returns FALSE if error occured, TRUE otherwise. */ -int silc_client_init(SilcClient client) +bool silc_client_init(SilcClient client) { SILC_LOG_DEBUG(("Initializing client")); + assert(client); assert(client->username); assert(client->hostname); assert(client->realname); @@ -167,6 +177,7 @@ void silc_client_run(SilcClient client) { SILC_LOG_DEBUG(("Running client")); + assert(client); assert(client->pkcs); assert(client->public_key); assert(client->private_key); @@ -425,7 +436,7 @@ silc_client_connect_to_server_internal(SilcClientInternalConnectContext *ctx) case then this function is not used at all. When the connecting is done the `connect' client operation is called. */ -int silc_client_connect_to_server(SilcClient client, +bool silc_client_connect_to_server(SilcClient client, SilcClientConnectionParams *params, int port, char *host, void *context) { @@ -888,7 +899,7 @@ SILC_TASK_CALLBACK(silc_client_connect_to_server_final) is used directly only in special cases. Normal cases should use silc_server_packet_send. Returns < 0 on error. */ -int silc_client_packet_send_real(SilcClient client, +bool silc_client_packet_send_real(SilcClient client, SilcSocketConnection sock, bool force_send) { @@ -1400,6 +1411,12 @@ void silc_client_packet_send(SilcClient client, if (hmac) sequence = ((SilcClientConnection)sock->user_data)->internal->psn_send++; + + /* Check for mandatory rekey */ + if (sequence == SILC_CLIENT_REKEY_THRESHOLD) + silc_schedule_task_add(client->schedule, sock->sock, + silc_client_rekey_callback, sock, 0, 1, + SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL); } block_len = cipher ? silc_cipher_get_block_len(cipher) : 0; @@ -1432,7 +1449,10 @@ void silc_client_packet_send(SilcClient client, packetdata.dst_id_len)); packetdata.truelen = data_len + SILC_PACKET_HEADER_LEN + packetdata.src_id_len + packetdata.dst_id_len; - packetdata.padlen = SILC_PACKET_PADLEN(packetdata.truelen, block_len); + if (type == SILC_PACKET_CONNECTION_AUTH) + SILC_PACKET_PADLEN_MAX(packetdata.truelen, block_len, packetdata.padlen); + else + SILC_PACKET_PADLEN(packetdata.truelen, block_len, packetdata.padlen); /* Create the outgoing packet */ if (!silc_packet_assemble(&packetdata, client->rng, cipher, hmac, sock, @@ -1453,6 +1473,25 @@ void silc_client_packet_send(SilcClient client, silc_client_packet_send_real(client, sock, force_send); } +/* Packet sending routine for application. This is the only routine that + is provided for application to send SILC packets. */ + +bool silc_client_send_packet(SilcClient client, + SilcClientConnection conn, + SilcPacketType type, + const unsigned char *data, + SilcUInt32 data_len) +{ + + assert(client); + if (!conn) + return FALSE; + + silc_client_packet_send(client, conn->sock, type, NULL, 0, NULL, NULL, + (unsigned char *)data, data_len, TRUE); + return TRUE; +} + void silc_client_packet_queue_purge(SilcClient client, SilcSocketConnection sock) { @@ -1606,10 +1645,10 @@ SILC_TASK_CALLBACK(silc_client_send_auto_nick) { SilcClientConnection conn = (SilcClientConnection)context; SilcClient client = conn->client; - - silc_client_command_send(client, conn, SILC_COMMAND_NICK, - ++conn->cmd_ident, 1, 1, - client->nickname, strlen(client->nickname)); + if (client) + silc_client_command_send(client, conn, SILC_COMMAND_NICK, + ++conn->cmd_ident, 1, 1, + client->nickname, strlen(client->nickname)); } /* Client session resuming callback. If the session was resumed @@ -1811,7 +1850,7 @@ void silc_client_process_failure(SilcClient client, /* A timeout callback for the re-key. We will be the initiator of the re-key protocol. */ -SILC_TASK_CALLBACK(silc_client_rekey_callback) +SILC_TASK_CALLBACK_GLOBAL(silc_client_rekey_callback) { SilcSocketConnection sock = (SilcSocketConnection)context; SilcClientConnection conn = (SilcClientConnection)sock->user_data; @@ -1962,6 +2001,7 @@ silc_client_request_authentication_method(SilcClient client, SilcClientConnAuthRequest connauth; SilcBuffer packet; + assert(client && conn); connauth = silc_calloc(1, sizeof(*connauth)); connauth->callback = callback; connauth->context = context;