Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2006 - 2007 Pekka Riikonen
+ Copyright (C) 2006 - 2014 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/* Connection created successfully */
SILC_LOG_DEBUG(("Connected"));
- conn->stream = (void *)stream;
+ conn->internal->user_stream = stream;
SILC_FSM_CALL_CONTINUE(fsm);
}
silc_ske_map_status(status));
conn->internal->status = SILC_CLIENT_CONN_ERROR_KE;
- conn->internal->error = status;
silc_ske_free_rekey_material(rekey);
silc_fsm_next(fsm, silc_client_st_connect_error);
- SILC_FSM_CALL_CONTINUE(fsm);
+ SILC_FSM_CALL_CONTINUE_SYNC(fsm);
return;
}
silc_ske_free_rekey_material(rekey);
silc_fsm_next(fsm, silc_client_st_connect_error);
- SILC_FSM_CALL_CONTINUE(fsm);
+ SILC_FSM_CALL_CONTINUE_SYNC(fsm);
return;
}
silc_ske_free_rekey_material(rekey);
silc_fsm_next(fsm, silc_client_st_connect_error);
- SILC_FSM_CALL_CONTINUE(fsm);
+ SILC_FSM_CALL_CONTINUE_SYNC(fsm);
return;
}
conn->remote_host,
silc_ske_map_status(status));
+ silc_ske_free(conn->internal->ske);
+ conn->internal->ske = NULL;
silc_fsm_finish(fsm);
+
+ /* Close connection */
+ silc_client_close_connection(client, conn);
return;
}
/* Callback called by application to return authentication data */
static void silc_client_connect_auth_method(SilcAuthMethod auth_meth,
- void *auth, SilcUInt32 auth_len,
+ const void *auth,
+ SilcUInt32 auth_len,
void *context)
{
SilcFSMThread fsm = context;
SilcClientConnection conn = silc_fsm_get_context(fsm);
conn->internal->params.auth_method = auth_meth;
- conn->internal->params.auth = auth;
+ if (auth_meth == SILC_AUTH_PASSWORD)
+ conn->internal->params.auth = silc_memdup(auth, auth_len);
+ else
+ conn->internal->params.auth = (void *)auth;
conn->internal->params.auth_len = auth_len;
SILC_FSM_CALL_CONTINUE(fsm);
silc_fsm_next(fsm, silc_client_st_connect_error);
}
- SILC_FSM_CALL_CONTINUE(fsm);
+ SILC_FSM_CALL_CONTINUE_SYNC(fsm);
}
/********************** CONNECTION_AUTH_REQUEST packet **********************/
/* Create packet stream */
conn->stream = silc_packet_stream_create(client->internal->packet_engine,
conn->internal->schedule,
- (SilcStream)conn->stream);
+ conn->internal->user_stream);
if (!conn->stream) {
/** Cannot create packet stream */
SILC_LOG_DEBUG(("Could not create packet stream"));
{
SilcClientConnection conn = fsm_context;
SilcClient client = conn->client;
- SilcSKEParamsStruct params;
+ SilcSKEParamsStruct params = {};
SILC_LOG_DEBUG(("Starting key exchange protocol"));
return SILC_FSM_CONTINUE;
}
-/* Resolved authentication method to be used in authentication protocol */
+/* Resolve authentication method to be used in authentication protocol */
SILC_FSM_STATE(silc_client_st_connect_auth_resolve)
{
silc_ske_free(conn->internal->ske);
conn->internal->ske = NULL;
+ if (!conn->internal->params.auth_set &&
+ conn->internal->params.auth_method == SILC_AUTH_PASSWORD &&
+ conn->internal->params.auth) {
+ silc_free(conn->internal->params.auth);
+ conn->internal->params.auth = NULL;
+ }
+
if (conn->internal->disconnected) {
/** Disconnected */
silc_fsm_next(fsm, silc_client_st_connect_error);
/* Allocate SKE */
conn->internal->ske =
- silc_ske_alloc(client->rng, conn->internal->schedule,
- conn->internal->params.repository,
- conn->public_key, conn->private_key, fsm);
+ silc_ske_alloc(client->rng, conn->internal->schedule, NULL,
+ conn->public_key, NULL, fsm);
if (!conn->internal->ske)
return SILC_FSM_FINISH;
SILC_FSM_CALL(conn->internal->op = silc_ske_rekey_responder(
conn->internal->ske,
conn->stream,
- conn->internal->rekey));
+ conn->internal->rekey,
+ NULL));
}