aboutsummaryrefslogtreecommitdiffstats
path: root/Source/charon/encoding/payloads/id_payload.c
diff options
context:
space:
mode:
Diffstat (limited to 'Source/charon/encoding/payloads/id_payload.c')
-rw-r--r--Source/charon/encoding/payloads/id_payload.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/Source/charon/encoding/payloads/id_payload.c b/Source/charon/encoding/payloads/id_payload.c
index 708aa61b4..9691522f0 100644
--- a/Source/charon/encoding/payloads/id_payload.c
+++ b/Source/charon/encoding/payloads/id_payload.c
@@ -146,6 +146,15 @@ static status_t verify(private_id_payload_t *this)
/* critical bit is set! */
return FAILED;
}
+ if ((this->id_type == 0) ||
+ (this->id_type == 4) ||
+ ((this->id_type >= 6) && (this->id_type <= 8)) ||
+ ((this->id_type >= 12) && (this->id_type <= 200)))
+ {
+ /* reserved IDs */
+ return FAILED;
+ }
+
return SUCCESS;
}
@@ -252,6 +261,14 @@ static void set_initiator (private_id_payload_t *this,bool is_initiator)
}
/**
+ * Implementation of private_id_payload_t.compute_length.
+ */
+static void compute_length(private_id_payload_t *this)
+{
+ this->payload_length = ID_PAYLOAD_HEADER_LENGTH + this->id_data.len;
+}
+
+/**
* Implementation of payload_t.destroy and id_payload_t.destroy.
*/
static void destroy(private_id_payload_t *this)
@@ -289,6 +306,9 @@ id_payload_t *id_payload_create(bool is_initiator)
this->public.get_initiator = (bool (*) (id_payload_t *)) get_initiator;
this->public.set_initiator = (void (*) (id_payload_t *,bool)) set_initiator;
+ /* private functions */
+ this->compute_length = compute_length;
+
/* private variables */
this->critical = FALSE;
this->next_payload = NO_PAYLOAD;