/*
- * 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,