- code cleaned

This commit is contained in:
Jan Hutter
2005-12-03 16:52:54 +00:00
parent aebb38a093
commit a374d1ee66
+195 -136
View File
@@ -74,116 +74,175 @@ struct private_ike_sa_t {
/* private values */ /* private values */
/** /**
* Identifier for the current IKE_SA * Identifier for the current IKE_SA.
*/ */
ike_sa_id_t *ike_sa_id; ike_sa_id_t *ike_sa_id;
/** /**
* Linked List containing the child sa's of the current IKE_SA * Linked List containing the child sa's of the current IKE_SA.
*/ */
linked_list_t *child_sas; linked_list_t *child_sas;
/** /**
* TODO * Current state of the IKE_SA represented as state_t object.
*/ *
init_config_t *init_config; * A state object representates one of the following states and is processing
* messages in the specific state:
/** * - INITIATOR_INIT
* TODO * - RESPONDER_INIT
*/ * - IKE_SA_INIT_REQUESTED
sa_config_t *sa_config; * - IKE_SA_INIT_RESPONDED
* - IKE_AUTH_REQUESTED
/** * -IKE_SA_ESTABLISHED
* Current state of the IKE_SA
*/ */
state_t *current_state; state_t *current_state;
/** /**
* this SA's source for random data * INIT configuration, needed for the IKE_SA_INIT exchange.
*
* Gets set in states:
* - INITATOR_INIT
* - RESPONDER_INIT
*
* Available in states:
* - IKE_SA_INIT_REQUESTED
* - IKE_SA_INIT_RESPONDED
* - IKE_AUTH_REQUESTED
* -IKE_SA_ESTABLISHED
*/
init_config_t *init_config;
/**
* SA configuration, needed for all other exchanges after IKE_SA_INIT exchange.
*
* Gets set in states:
* - IKE_SA_INIT_REQUESTED
* - IKE_SA_INIT_RESPONDED
*
* Available in states:
* - IKE_AUTH_REQUESTED
* -IKE_SA_ESTABLISHED
*/
sa_config_t *sa_config;
/**
* This SA's source for random data.
*
* Is available in every state.
*/ */
randomizer_t *randomizer; randomizer_t *randomizer;
/** /**
* contains the last responded message * The last responded message.
*
*/ */
message_t *last_responded_message; message_t *last_responded_message;
/** /**
* contains the last requested message * The ast requested message.
*
*/ */
message_t *last_requested_message; message_t *last_requested_message;
/** /**
* Informations of this host * Informations of this host.
*/ */
struct { struct {
host_t *host; host_t *host;
} me; } me;
/** /**
* Informations of the other host * Informations of the other host.
*/ */
struct { struct {
host_t *host; host_t *host;
} other; } other;
/** /**
* Crypter object for initiator * Crypter object for initiator.
*
* Gets set in states:
* - IKE_SA_INIT_REQUESTED
* - RESPONDER_INIT
*
* Available in states:
* - IKE_SA_INIT_RESPONDED
* - IKE_AUTH_REQUESTED
* -IKE_SA_ESTABLISHED
*/ */
crypter_t *crypter_initiator; crypter_t *crypter_initiator;
/** /**
* Crypter object for responder * Crypter object for responder.
*
* Gets set in states:
* - IKE_SA_INIT_REQUESTED
* - RESPONDER_INIT
*
* Available in states:
* - IKE_SA_INIT_RESPONDED
* - IKE_AUTH_REQUESTED
* -IKE_SA_ESTABLISHED
*/ */
crypter_t *crypter_responder; crypter_t *crypter_responder;
/** /**
* Signer object for initiator * Signer object for initiator.
*
* Gets set in states:
* - IKE_SA_INIT_REQUESTED
* - RESPONDER_INIT
*
* Available in states:
* - IKE_SA_INIT_RESPONDED
* - IKE_AUTH_REQUESTED
* -IKE_SA_ESTABLISHED
*/ */
signer_t *signer_initiator; signer_t *signer_initiator;
/** /**
* Signer object for responder * Signer object for responder.
*
* Gets set in states:
* - IKE_SA_INIT_REQUESTED
* - RESPONDER_INIT
*
* Available in states:
* - IKE_SA_INIT_RESPONDED
* - IKE_AUTH_REQUESTED
* -IKE_SA_ESTABLISHED
*/ */
signer_t *signer_responder; signer_t *signer_responder;
/** /**
* prf function * Prf function.
*
* Gets set in states:
* - IKE_SA_INIT_REQUESTED
* - RESPONDER_INIT
*
* Available in states:
* - IKE_SA_INIT_RESPONDED
* - IKE_AUTH_REQUESTED
* -IKE_SA_ESTABLISHED
*/ */
prf_t *prf; prf_t *prf;
/** /**
* Shared secrets * Shared secrets which have to be stored.
*
* Are getting set in states:
* - IKE_SA_INIT_REQUESTED
* - RESPONDER_INIT
*
* Available in states:
* - IKE_SA_INIT_RESPONDED
* - IKE_AUTH_REQUESTED
* -IKE_SA_ESTABLISHED
*/ */
struct { struct {
/** /**
* Key used for deriving other keys * Key used for deriving other keys
*/ */
chunk_t d_key; chunk_t d_key;
/**
* Key for authenticate (initiator)
*/
chunk_t ai_key;
/**
* Key for authenticate (responder)
*/
chunk_t ar_key;
/**
* Key for encryption (initiator)
*/
chunk_t ei_key;
/**
* Key for encryption (responder)
*/
chunk_t er_key;
/** /**
* Key for generating auth payload (initiator) * Key for generating auth payload (initiator)
@@ -198,29 +257,28 @@ struct private_ike_sa_t {
} secrets; } secrets;
/** /**
* next message id to receive. * Next message id to receive.
*/ */
u_int32_t message_id_in; u_int32_t message_id_in;
/** /**
* next message id to send. * Next message id to send.
*/ */
u_int32_t message_id_out; u_int32_t message_id_out;
/** /**
* Last message id which was successfully replied. * Last reply id which was successfully received.
*/ */
int32_t last_replied_message_id; int32_t last_replied_message_id;
/** /**
* a logger for this IKE_SA * A logger for this IKE_SA.
*/ */
logger_t *logger; logger_t *logger;
}; };
/** /**
* Implements protected_ike_sa_t.process_message. * Implementation of ike_sa_t.process_message.
*/ */
static status_t process_message (private_ike_sa_t *this, message_t *message) static status_t process_message (private_ike_sa_t *this, message_t *message)
{ {
@@ -228,9 +286,9 @@ static status_t process_message (private_ike_sa_t *this, message_t *message)
exchange_type_t exchange_type; exchange_type_t exchange_type;
bool is_request; bool is_request;
/* we must process each request or response from remote host */ /* We must process each request or response from remote host */
/* find out type of message (request or response) */ /* Find out type of message (request or response) */
is_request = message->get_request(message); is_request = message->get_request(message);
exchange_type = message->get_exchange_type(message); exchange_type = message->get_exchange_type(message);
@@ -243,8 +301,8 @@ static status_t process_message (private_ike_sa_t *this, message_t *message)
*/ */
if (is_request && (message_id == (this->message_id_in - 1))) if (is_request && (message_id == (this->message_id_in - 1)))
{ {
/* message can be resent ! */ /* Message can be resent ! */
this->logger->log(this->logger, CONTROL|MORE, "Resent message detected. Send stored reply"); this->logger->log(this->logger, CONTROL|MORE, "Resent request detected. Send stored reply.");
return (this->resend_last_reply(this)); return (this->resend_last_reply(this));
} }
@@ -268,42 +326,43 @@ static status_t process_message (private_ike_sa_t *this, message_t *message)
} }
} }
/* now the message is processed by the current state object */ /* now the message is processed by the current state object.
/* the current state does change the current change to the next one*/ * The specific state object is responsible to check if a message can be received in
* the state it represents.
* The current state is also responsible to change the state object to the next state
* by calling protected_ike_sa_t.set_new_state*/
return this->current_state->process_message(this->current_state,message); return this->current_state->process_message(this->current_state,message);
} }
/** /**
* Implements protected_ike_sa_t.build_message. * Implementation of protected_ike_sa_t.build_message.
*/ */
static void build_message(private_ike_sa_t *this, exchange_type_t type, bool request, message_t **message) static void build_message(private_ike_sa_t *this, exchange_type_t type, bool request, message_t **message)
{ {
message_t *new_message; message_t *new_message;
host_t *source, *destination;
this->logger->log(this->logger, CONTROL|MORE, "build empty message"); this->logger->log(this->logger, CONTROL|MOST, "Build empty message");
new_message = message_create(); new_message = message_create();
new_message->set_source(new_message, this->me.host->clone(this->me.host));
source = this->me.host->clone(this->me.host); new_message->set_destination(new_message, this->other.host->clone(this->other.host));
destination = this->other.host->clone(this->other.host);
new_message->set_source(new_message, source);
new_message->set_destination(new_message, destination);
new_message->set_exchange_type(new_message, type); new_message->set_exchange_type(new_message, type);
new_message->set_request(new_message, request); new_message->set_request(new_message, request);
new_message->set_message_id(new_message, (request) ? this->message_id_out : this->message_id_in); new_message->set_message_id(new_message, (request) ? this->message_id_out : this->message_id_in);
new_message->set_ike_sa_id(new_message, this->ike_sa_id); new_message->set_ike_sa_id(new_message, this->ike_sa_id);
*message = new_message; *message = new_message;
} }
/** /**
* Implements protected_ike_sa_t.process_configuration. * Implementation of protected_ike_sa_t.process_configuration.
*/ */
static status_t initialize_connection(private_ike_sa_t *this, char *name) static status_t initialize_connection(private_ike_sa_t *this, char *name)
{ {
/* work is done in state object of type INITIATOR_INIT */
initiator_init_t *current_state; initiator_init_t *current_state;
status_t status; status_t status;
/* Work is done in state object of type INITIATOR_INIT. All other states are not
* initial states and so don't have a initialize_connection function */
if (this->current_state->get_state(this->current_state) != INITIATOR_INIT) if (this->current_state->get_state(this->current_state) != INITIATOR_INIT)
{ {
@@ -313,12 +372,11 @@ static status_t initialize_connection(private_ike_sa_t *this, char *name)
current_state = (initiator_init_t *) this->current_state; current_state = (initiator_init_t *) this->current_state;
status = current_state->initiate_connection(current_state,name); status = current_state->initiate_connection(current_state,name);
return status; return status;
} }
/** /**
* Implements protected_ike_sa_t.get_id. * Implementation of protected_ike_sa_t.get_id.
*/ */
static ike_sa_id_t* get_id(private_ike_sa_t *this) static ike_sa_id_t* get_id(private_ike_sa_t *this)
{ {
@@ -326,37 +384,43 @@ static ike_sa_id_t* get_id(private_ike_sa_t *this)
} }
/** /**
* Implements protected_ike_sa_t.compute_secrets. * Implementation of protected_ike_sa_t.compute_secrets.
*/ */
static void compute_secrets(private_ike_sa_t *this,chunk_t dh_shared_secret,chunk_t initiator_nonce, chunk_t responder_nonce) static void compute_secrets(private_ike_sa_t *this,chunk_t dh_shared_secret,chunk_t initiator_nonce, chunk_t responder_nonce)
{ {
chunk_t concatenated_nonces; u_int8_t ei_buffer[this->crypter_initiator->get_block_size(this->crypter_initiator)];
chunk_t skeyseed; chunk_t ei_key = {ptr: ei_buffer, len: sizeof(ei_buffer)};
chunk_t prf_plus_seed; u_int8_t er_buffer[this->crypter_responder->get_block_size(this->crypter_responder)];
chunk_t er_key = {ptr: er_buffer, len: sizeof(er_buffer)};
u_int8_t ai_buffer[this->signer_initiator->get_key_size(this->signer_initiator)];
chunk_t ai_key = {ptr: ai_buffer, len: sizeof(ai_buffer)};
u_int8_t ar_buffer[this->signer_responder->get_key_size(this->signer_responder)];
chunk_t ar_key = {ptr: ar_buffer, len: sizeof(ar_buffer)};
u_int8_t concatenated_nonces_buffer[initiator_nonce.len + responder_nonce.len];
chunk_t concatenated_nonces = {ptr: concatenated_nonces_buffer, len : sizeof(concatenated_nonces_buffer)};
u_int8_t skeyseed_buffer[this->prf->get_block_size(this->prf)];
chunk_t skeyseed = {ptr: skeyseed_buffer, len: sizeof(skeyseed_buffer)};
u_int64_t initiator_spi; u_int64_t initiator_spi;
u_int64_t responder_spi; u_int64_t responder_spi;
chunk_t prf_plus_seed;
prf_plus_t *prf_plus; prf_plus_t *prf_plus;
/**
/* * TODO check length fo specific prfs
* TODO check length for specific prf's
*/ */
concatenated_nonces.len = (initiator_nonce.len + responder_nonce.len);
concatenated_nonces.ptr = allocator_alloc(concatenated_nonces.len);
/* first is initiator */ /* first is initiator */
memcpy(concatenated_nonces.ptr,initiator_nonce.ptr,initiator_nonce.len); memcpy(concatenated_nonces.ptr,initiator_nonce.ptr,initiator_nonce.len);
/* second is responder */ /* second is responder */
memcpy(concatenated_nonces.ptr + initiator_nonce.len,responder_nonce.ptr,responder_nonce.len); memcpy(concatenated_nonces.ptr + initiator_nonce.len,responder_nonce.ptr,responder_nonce.len);
this->logger->log_chunk(this->logger, RAW, "Nonce data", &concatenated_nonces); this->logger->log_chunk(this->logger, RAW | MOST, "Nonce data", &concatenated_nonces);
/* status of set_key is not checked */ /* Status of set_key is not checked */
this->prf->set_key(this->prf,concatenated_nonces); this->prf->set_key(this->prf,concatenated_nonces);
this->prf->allocate_bytes(this->prf,dh_shared_secret,&skeyseed); this->prf->get_bytes(this->prf,dh_shared_secret,skeyseed_buffer);
allocator_free_chunk(&concatenated_nonces);
prf_plus_seed.len = (initiator_nonce.len + responder_nonce.len + 16); prf_plus_seed.len = (initiator_nonce.len + responder_nonce.len + 16);
prf_plus_seed.ptr = allocator_alloc(prf_plus_seed.len); prf_plus_seed.ptr = allocator_alloc(prf_plus_seed.len);
@@ -377,31 +441,30 @@ static void compute_secrets(private_ike_sa_t *this,chunk_t dh_shared_secret,chun
this->logger->log(this->logger, CONTROL | MOST, "Set new key of prf object"); this->logger->log(this->logger, CONTROL | MOST, "Set new key of prf object");
this->prf->set_key(this->prf,skeyseed); this->prf->set_key(this->prf,skeyseed);
allocator_free_chunk(&skeyseed);
this->logger->log(this->logger, CONTROL | MOST, "Create new prf+ object"); this->logger->log(this->logger, CONTROL | MOST, "Create new prf+ object");
prf_plus = prf_plus_create(this->prf, prf_plus_seed); prf_plus = prf_plus_create(this->prf, prf_plus_seed);
allocator_free_chunk(&prf_plus_seed); allocator_free_chunk(&prf_plus_seed);
prf_plus->allocate_bytes(prf_plus,this->prf->get_block_size(this->prf),&(this->secrets.d_key)); prf_plus->allocate_bytes(prf_plus,this->prf->get_block_size(this->prf),&(this->secrets.d_key));
this->logger->log_chunk(this->logger, PRIVATE, "Sk_d secret", &(this->secrets.d_key)); this->logger->log_chunk(this->logger, PRIVATE, "Sk_d secret", &(this->secrets.d_key));
prf_plus->allocate_bytes(prf_plus,this->signer_initiator->get_key_size(this->signer_initiator),&(this->secrets.ai_key)); prf_plus->get_bytes(prf_plus,ai_key.len,ai_buffer);
this->logger->log_chunk(this->logger, PRIVATE, "Sk_ai secret", &(this->secrets.ai_key)); this->logger->log_chunk(this->logger, PRIVATE, "Sk_ai secret", &(ai_key));
this->signer_initiator->set_key(this->signer_initiator,this->secrets.ai_key); this->signer_initiator->set_key(this->signer_initiator,ai_key);
prf_plus->allocate_bytes(prf_plus,this->signer_responder->get_key_size(this->signer_responder),&(this->secrets.ar_key)); prf_plus->get_bytes(prf_plus,ar_key.len,ar_buffer);
this->logger->log_chunk(this->logger, PRIVATE, "Sk_ar secret", &(this->secrets.ar_key)); this->logger->log_chunk(this->logger, PRIVATE, "Sk_ar secret", &(ar_key));
this->signer_responder->set_key(this->signer_responder,this->secrets.ar_key); this->signer_responder->set_key(this->signer_responder,ar_key);
prf_plus->get_bytes(prf_plus,ei_key.len,ei_buffer);
prf_plus->allocate_bytes(prf_plus,this->crypter_initiator->get_block_size(this->crypter_initiator),&(this->secrets.ei_key)); this->logger->log_chunk(this->logger, PRIVATE, "Sk_ei secret", &(ei_key));
this->logger->log_chunk(this->logger, PRIVATE, "Sk_ei secret", &(this->secrets.ei_key)); this->crypter_initiator->set_key(this->crypter_initiator,ei_key);
this->crypter_initiator->set_key(this->crypter_initiator,this->secrets.ei_key);
prf_plus->get_bytes(prf_plus,er_key.len,er_buffer);
prf_plus->allocate_bytes(prf_plus,this->crypter_responder->get_block_size(this->crypter_responder),&(this->secrets.er_key)); this->logger->log_chunk(this->logger, PRIVATE, "Sk_er secret", &(er_key));
this->logger->log_chunk(this->logger, PRIVATE, "Sk_er secret", &(this->secrets.er_key)); this->crypter_responder->set_key(this->crypter_responder,er_key);
this->crypter_responder->set_key(this->crypter_responder,this->secrets.er_key);
prf_plus->allocate_bytes(prf_plus,this->crypter_responder->get_block_size(this->crypter_responder),&(this->secrets.pi_key)); prf_plus->allocate_bytes(prf_plus,this->crypter_responder->get_block_size(this->crypter_responder),&(this->secrets.pi_key));
this->logger->log_chunk(this->logger, PRIVATE, "Sk_pi secret", &(this->secrets.pi_key)); this->logger->log_chunk(this->logger, PRIVATE, "Sk_pi secret", &(this->secrets.pi_key));
@@ -413,12 +476,13 @@ static void compute_secrets(private_ike_sa_t *this,chunk_t dh_shared_secret,chun
} }
/** /**
* Implementation of private_ike_sa_t.resend_last_reply. * Implementation of private_ike_sa_t.resend_last_reply.
*/ */
static status_t resend_last_reply(private_ike_sa_t *this) static status_t resend_last_reply(private_ike_sa_t *this)
{ {
packet_t *packet; packet_t *packet;
this->logger->log(this->logger, CONTROL | MORE, "Going to retransmit last reply");
packet = this->last_responded_message->get_packet(this->last_responded_message); packet = this->last_responded_message->get_packet(this->last_responded_message);
charon->send_queue->add(charon->send_queue, packet); charon->send_queue->add(charon->send_queue, packet);
@@ -456,7 +520,7 @@ status_t retransmit_request (private_ike_sa_t *this, u_int32_t message_id)
/** /**
* Implements protected_ike_sa_t.resend_last_reply. * Implementation of private_ike_sa_t.resend_last_reply.
*/ */
static status_t create_delete_job(private_ike_sa_t *this) static status_t create_delete_job(private_ike_sa_t *this)
{ {
@@ -475,7 +539,9 @@ static status_t create_delete_job(private_ike_sa_t *this)
*/ */
static void set_new_state (private_ike_sa_t *this, state_t *state) static void set_new_state (private_ike_sa_t *this, state_t *state)
{ {
this->logger->log(this->logger, CONTROL, "Change current state %s to %s",mapping_find(ike_sa_state_m,this->current_state->get_state(this->current_state)),mapping_find(ike_sa_state_m,state->get_state(state))); this->logger->log(this->logger, CONTROL, "Change current state %s to %s",
mapping_find(ike_sa_state_m,this->current_state->get_state(this->current_state)),
mapping_find(ike_sa_state_m,state->get_state(state)));
this->current_state = state; this->current_state = state;
} }
@@ -605,7 +671,8 @@ static status_t create_transforms_from_proposal (private_ike_sa_t *this,ike_prop
this->crypter_initiator = crypter_create(proposal->encryption_algorithm,proposal->encryption_algorithm_key_length); this->crypter_initiator = crypter_create(proposal->encryption_algorithm,proposal->encryption_algorithm_key_length);
if (this->crypter_initiator == NULL) if (this->crypter_initiator == NULL)
{ {
this->logger->log(this->logger, ERROR|MORE, "encryption algorithm not supported!"); this->logger->log(this->logger, ERROR|MORE, "encryption algorithm %s not supported!",
mapping_find(encryption_algorithm_m,proposal->encryption_algorithm));
return FAILED; return FAILED;
} }
@@ -614,11 +681,7 @@ static status_t create_transforms_from_proposal (private_ike_sa_t *this,ike_prop
this->crypter_responder->destroy(this->crypter_responder); this->crypter_responder->destroy(this->crypter_responder);
} }
this->crypter_responder = crypter_create(proposal->encryption_algorithm,proposal->encryption_algorithm_key_length); this->crypter_responder = crypter_create(proposal->encryption_algorithm,proposal->encryption_algorithm_key_length);
if (this->crypter_responder == NULL) /* check must not be done again */
{
this->logger->log(this->logger, ERROR|MORE, "encryption algorithm not supported!");
return FAILED;
}
if (this->signer_initiator != NULL) if (this->signer_initiator != NULL)
{ {
@@ -636,11 +699,6 @@ static status_t create_transforms_from_proposal (private_ike_sa_t *this,ike_prop
this->signer_responder->destroy(this->signer_responder); this->signer_responder->destroy(this->signer_responder);
} }
this->signer_responder = signer_create(proposal->integrity_algorithm); this->signer_responder = signer_create(proposal->integrity_algorithm);
if (this->signer_responder == NULL)
{
this->logger->log(this->logger, ERROR|MORE, "integrity algorithm not supported!");
return FAILED;
}
return SUCCESS; return SUCCESS;
} }
@@ -690,14 +748,15 @@ static signer_t *get_signer_responder (private_ike_sa_t *this)
*/ */
static status_t send_request (private_ike_sa_t *this,message_t * message) static status_t send_request (private_ike_sa_t *this,message_t * message)
{ {
packet_t *packet;
status_t status;
retransmit_request_job_t *retransmit_job; retransmit_request_job_t *retransmit_job;
u_int32_t timeout; u_int32_t timeout;
packet_t *packet;
status_t status;
if (message->get_message_id(message) != this->message_id_out) if (message->get_message_id(message) != this->message_id_out)
{ {
this->logger->log(this->logger, ERROR, "Message could not be sent cause id was not as expected"); this->logger->log(this->logger, ERROR, "Message could not be sent cause id (%d) was not as expected (%d)",
message->get_message_id(message),this->message_id_out);
return FAILED; return FAILED;
} }
@@ -857,68 +916,72 @@ static void destroy (private_ike_sa_t *this)
this->child_sas->destroy(this->child_sas); this->child_sas->destroy(this->child_sas);
this->logger->log(this->logger, CONTROL | MOST, "Destroy secrets"); this->logger->log(this->logger, CONTROL | MOST, "Destroy secrets");
allocator_free(this->secrets.d_key.ptr); allocator_free(this->secrets.d_key.ptr);
allocator_free(this->secrets.ai_key.ptr);
allocator_free(this->secrets.ar_key.ptr);
allocator_free(this->secrets.ei_key.ptr);
allocator_free(this->secrets.er_key.ptr);
allocator_free(this->secrets.pi_key.ptr); allocator_free(this->secrets.pi_key.ptr);
allocator_free(this->secrets.pr_key.ptr); allocator_free(this->secrets.pr_key.ptr);
if (this->crypter_initiator != NULL) if (this->crypter_initiator != NULL)
{ {
this->logger->log(this->logger, CONTROL | MOST, "Destroy initiator crypter_t object");
this->crypter_initiator->destroy(this->crypter_initiator); this->crypter_initiator->destroy(this->crypter_initiator);
} }
if (this->crypter_responder != NULL) if (this->crypter_responder != NULL)
{ {
this->logger->log(this->logger, CONTROL | MOST, "Destroy responder crypter_t object");
this->crypter_responder->destroy(this->crypter_responder); this->crypter_responder->destroy(this->crypter_responder);
} }
if (this->signer_initiator != NULL) if (this->signer_initiator != NULL)
{ {
this->logger->log(this->logger, CONTROL | MOST, "Destroy initiator signer_t object");
this->signer_initiator->destroy(this->signer_initiator); this->signer_initiator->destroy(this->signer_initiator);
} }
if (this->signer_responder != NULL) if (this->signer_responder != NULL)
{ {
this->logger->log(this->logger, CONTROL | MOST, "Destroy responder signer_t object");
this->signer_responder->destroy(this->signer_responder); this->signer_responder->destroy(this->signer_responder);
} }
if (this->prf != NULL) if (this->prf != NULL)
{ {
this->logger->log(this->logger, CONTROL | MOST, "Destroy prf_t object");
this->prf->destroy(this->prf); this->prf->destroy(this->prf);
} }
/* destroy ike_sa_id */ /* destroy ike_sa_id */
this->logger->log(this->logger, CONTROL | MOST, "Destroy ike_sa_id object");
this->ike_sa_id->destroy(this->ike_sa_id); this->ike_sa_id->destroy(this->ike_sa_id);
/* destroy stored requested message */ /* destroy stored requested message */
if (this->last_requested_message != NULL) if (this->last_requested_message != NULL)
{ {
this->logger->log(this->logger, CONTROL | MOST, "Destroy last requested message");
this->last_requested_message->destroy(this->last_requested_message); this->last_requested_message->destroy(this->last_requested_message);
} }
/* destroy stored responded messages */
if (this->last_responded_message != NULL)
{
this->logger->log(this->logger, CONTROL | MOST, "Destroy last responded message");
this->last_responded_message->destroy(this->last_responded_message);
}
/* destroy stored host_t objects */ /* destroy stored host_t objects */
if (this->me.host != NULL) if (this->me.host != NULL)
{ {
this->logger->log(this->logger, CONTROL | MOST, "Destroy my host_t object");
this->me.host->destroy(this->me.host); this->me.host->destroy(this->me.host);
} }
/* destroy stored host_t objects */ /* destroy stored host_t objects */
if (this->other.host != NULL) if (this->other.host != NULL)
{ {
this->logger->log(this->logger, CONTROL | MOST, "Destroy other host_t object");
this->other.host->destroy(this->other.host); this->other.host->destroy(this->other.host);
} }
/* destroy stored responded messages */
if (this->last_responded_message != NULL)
{
this->last_responded_message->destroy(this->last_responded_message);
}
this->randomizer->destroy(this->randomizer); this->randomizer->destroy(this->randomizer);
this->logger->log(this->logger, CONTROL | MOST, "Destroy current state object"); this->logger->log(this->logger, CONTROL | MOST, "Destroy current state object");
@@ -993,10 +1056,6 @@ ike_sa_t * ike_sa_create(ike_sa_id_t *ike_sa_id)
this->message_id_in = 0; this->message_id_in = 0;
this->last_replied_message_id = -1; this->last_replied_message_id = -1;
this->secrets.d_key = CHUNK_INITIALIZER; this->secrets.d_key = CHUNK_INITIALIZER;
this->secrets.ai_key = CHUNK_INITIALIZER;
this->secrets.ar_key = CHUNK_INITIALIZER;
this->secrets.ei_key = CHUNK_INITIALIZER;
this->secrets.er_key = CHUNK_INITIALIZER;
this->secrets.pi_key = CHUNK_INITIALIZER; this->secrets.pi_key = CHUNK_INITIALIZER;
this->secrets.pr_key = CHUNK_INITIALIZER; this->secrets.pr_key = CHUNK_INITIALIZER;
this->crypter_initiator = NULL; this->crypter_initiator = NULL;