Extended nonce payload for IKEv1 support
authorMartin Willi <martin@revosec.ch>
Thu, 17 Nov 2011 09:53:35 +0000 (10:53 +0100)
committerMartin Willi <martin@revosec.ch>
Tue, 20 Mar 2012 16:30:42 +0000 (17:30 +0100)
src/libcharon/encoding/payloads/nonce_payload.c
src/libcharon/encoding/payloads/nonce_payload.h
src/libcharon/encoding/payloads/payload.c
src/libcharon/sa/tasks/child_create.c
src/libcharon/sa/tasks/ike_init.c

index 78000b8..684bddc 100644 (file)
@@ -57,6 +57,11 @@ struct private_nonce_payload_t {
         * The contained nonce value.
         */
        chunk_t nonce;
+
+       /**
+        * Payload type, NONCE or NONCE_V1
+        */
+       payload_type_t type;
 };
 
 /**
@@ -115,7 +120,7 @@ METHOD(payload_t, get_encoding_rules, void,
 METHOD(payload_t, get_type, payload_type_t,
        private_nonce_payload_t *this)
 {
-       return NONCE;
+       return this->type;
 }
 
 METHOD(payload_t, get_next_type, payload_type_t,
@@ -159,7 +164,7 @@ METHOD2(payload_t, nonce_payload_t, destroy, void,
 /*
  * Described in header
  */
-nonce_payload_t *nonce_payload_create()
+nonce_payload_t *nonce_payload_create(payload_type_t type)
 {
        private_nonce_payload_t *this;
 
@@ -180,6 +185,7 @@ nonce_payload_t *nonce_payload_create()
                },
                .next_payload = NO_PAYLOAD,
                .payload_length = NONCE_PAYLOAD_HEADER_LENGTH,
+               .type = type,
        );
        return &this->public;
 }
index e921220..3be2e2e 100644 (file)
@@ -38,9 +38,7 @@ typedef struct nonce_payload_t nonce_payload_t;
 #define NONCE_PAYLOAD_HEADER_LENGTH 4
 
 /**
- * Object representing an IKEv2 Nonce payload.
- *
- * The Nonce payload format is described in RFC section 3.3.
+ * Object representing an IKEv1/IKEv2 Nonce payload.
  */
 struct nonce_payload_t {
        /**
@@ -71,8 +69,9 @@ struct nonce_payload_t {
 /**
  * Creates an empty nonce_payload_t object
  *
- * @return nonce_payload_t object
+ * @param type         NONCE or NONCE_V1
+ * @return                     nonce_payload_t object
  */
-nonce_payload_t *nonce_payload_create(void);
+nonce_payload_t *nonce_payload_create(payload_type_t type);
 
 #endif /** NONCE_PAYLOAD_H_ @}*/
index 2021e84..56563ac 100644 (file)
@@ -180,7 +180,8 @@ payload_t *payload_create(payload_type_t type)
                case TRANSFORM_ATTRIBUTE_V1:
                        return (payload_t*)transform_attribute_create(type);
                case NONCE:
-                       return (payload_t*)nonce_payload_create();
+               case NONCE_V1:
+                       return (payload_t*)nonce_payload_create(type);
                case ID_INITIATOR:
                case ID_RESPONDER:
 #ifdef ME
index fdc5b52..587e37a 100644 (file)
@@ -539,7 +539,7 @@ static void build_payloads(private_child_create_t *this, message_t *message)
        /* add nonce payload if not in IKE_AUTH */
        if (message->get_exchange_type(message) == CREATE_CHILD_SA)
        {
-               nonce_payload = nonce_payload_create();
+               nonce_payload = nonce_payload_create(NONCE);
                nonce_payload->set_nonce(nonce_payload, this->my_nonce);
                message->add_payload(message, (payload_t*)nonce_payload);
        }
index 911e0c2..e6f4237 100644 (file)
@@ -148,7 +148,7 @@ static void build_payloads(private_ike_init_t *this, message_t *message)
        }
        message->add_payload(message, (payload_t*)sa_payload);
 
-       nonce_payload = nonce_payload_create();
+       nonce_payload = nonce_payload_create(NONCE);
        nonce_payload->set_nonce(nonce_payload, this->my_nonce);
        ke_payload = ke_payload_create_from_diffie_hellman(this->dh);