/*
- * Copyright (C) 2008 Tobias Brunner
+ * Copyright (C) 2008-2018 Tobias Brunner
* Copyright (C) 2006-2009 Martin Willi
*
* Copyright (C) secunet Security Networks AG
* Do we accept HTTP certificate lookup requests
*/
bool do_http_lookup;
-
- /**
- * whether this is the final authentication round
- */
- bool final;
};
/**
*/
static bool final_auth(message_t *message)
{
- /* we check for an AUTH payload without a ANOTHER_AUTH_FOLLOWS notify */
- if (message->get_payload(message, PLV2_AUTH) == NULL)
- {
- return FALSE;
- }
- if (message->get_notify(message, ANOTHER_AUTH_FOLLOWS))
- {
- return FALSE;
- }
- return TRUE;
+ return message->get_payload(message, PLV2_AUTH) != NULL &&
+ !message->get_notify(message, ANOTHER_AUTH_FOLLOWS);
}
METHOD(task_t, build_i, status_t,
private_ike_cert_pre_t *this, message_t *message)
{
- if (message->get_message_id(message) == 1)
- { /* initiator sends CERTREQs in first IKE_AUTH */
+ if (message->get_exchange_type(message) == IKE_AUTH)
+ { /* initiator sends CERTREQs in first IKE_AUTH only */
build_certreqs(this, message);
+ this->public.task.build = (void*)return_need_more;
}
return NEED_MORE;
}
METHOD(task_t, process_r, status_t,
private_ike_cert_pre_t *this, message_t *message)
{
- if (message->get_exchange_type(message) != IKE_SA_INIT)
+ if (message->get_exchange_type(message) == IKE_AUTH)
{ /* handle certreqs/certs in any IKE_AUTH, just in case */
process_certreqs(this, message);
process_certs(this, message);
+ if (final_auth(message))
+ {
+ return SUCCESS;
+ }
}
- this->final = final_auth(message);
return NEED_MORE;
}
{
build_certreqs(this, message);
}
- if (this->final)
- {
- return SUCCESS;
- }
return NEED_MORE;
}
METHOD(task_t, process_i, status_t,
private_ike_cert_pre_t *this, message_t *message)
{
- if (message->get_exchange_type(message) == IKE_SA_INIT)
- {
- process_certreqs(this, message);
- }
- process_certs(this, message);
-
- if (final_auth(message))
+ switch (message->get_exchange_type(message))
{
- return SUCCESS;
+ case IKE_SA_INIT:
+ process_certreqs(this, message);
+ break;
+ case IKE_AUTH:
+ process_certs(this, message);
+ if (final_auth(message))
+ {
+ return SUCCESS;
+ }
+ break;
+ default:
+ break;
}
return NEED_MORE;
}
private_ike_cert_pre_t *this, ike_sa_t *ike_sa)
{
this->ike_sa = ike_sa;
+ this->public.task.build = _build_i;
}
METHOD(task_t, destroy, void,