identification: Support custom types in string constructor prefixes
authorMartin Willi <martin@revosec.ch>
Wed, 29 Oct 2014 10:53:03 +0000 (11:53 +0100)
committerMartin Willi <martin@revosec.ch>
Thu, 30 Oct 2014 10:07:08 +0000 (11:07 +0100)
src/libstrongswan/tests/suites/test_identification.c
src/libstrongswan/utils/identification.c
src/libstrongswan/utils/identification.h

index d20ad9b..de00e4a 100644 (file)
@@ -178,6 +178,12 @@ static struct {
                .data.c = chunk_from_chars(0xc0,0xa8,0x01,0x01) }},
        { "email:tester",                       ID_RFC822_ADDR, { .type = ENC_STRING,
                .data.s = "tester" }},
+       { "{1}:#c0a80101",                      ID_IPV4_ADDR,   { .type = ENC_CHUNK,
+               .data.c = chunk_from_chars(0xc0,0xa8,0x01,0x01) }},
+       { "{0x02}:tester",                      ID_FQDN,                { .type = ENC_STRING,
+               .data.s = "tester" }},
+       { "{99}:somedata",                      99,                             { .type = ENC_STRING,
+               .data.s = "somedata" }},
 };
 
 START_TEST(test_from_string)
index 43aa090..b69adf3 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <string.h>
 #include <stdio.h>
+#include <errno.h>
 
 #include "identification.h"
 
@@ -970,6 +971,39 @@ static private_identification_t* create_from_string_with_prefix_type(char *str)
        return NULL;
 }
 
+/**
+ * Create an identity for a specific type, determined by a numerical prefix
+ *
+ * The prefix is of the form "{x}:", where x denotes the numerical identity
+ * type.
+ */
+static private_identification_t* create_from_string_with_num_type(char *str)
+{
+       private_identification_t *this;
+       u_long type;
+
+       if (*str++ != '{')
+       {
+               return NULL;
+       }
+       errno = 0;
+       type = strtoul(str, &str, 0);
+       if (errno || *str++ != '}' || *str++ != ':')
+       {
+               return NULL;
+       }
+       this = identification_create(type);
+       if (*str == '#')
+       {
+               this->encoded = chunk_from_hex(chunk_from_str(str + 1), NULL);
+       }
+       else
+       {
+               this->encoded = chunk_clone(chunk_from_str(str));
+       }
+       return this;
+}
+
 /*
  * Described in header.
  */
@@ -987,6 +1021,11 @@ identification_t *identification_create_from_string(char *string)
        {
                return &this->public;
        }
+       this = create_from_string_with_num_type(string);
+       if (this)
+       {
+               return &this->public;
+       }
        if (strchr(string, '=') != NULL)
        {
                /* we interpret this as an ASCII X.501 ID_DER_ASN1_DN.
index 3e89974..e6a9fe1 100644 (file)
@@ -307,6 +307,9 @@ struct identification_t {
  * dns:, asn1dn:, asn1gn: and keyid:. If a # follows the :, the remaining data
  * is interpreted as hex encoded binary data for that ID, otherwise the raw
  * string following the prefix is used as identity data, without conversion.
+ * To specify a non-standard ID type, the numerical type may be prefixed
+ * between curly backets, building a prefix. For instance the "{1}:" prefix
+ * defines an ID_IPV4_ADDR type.
  *
  * This constructor never returns NULL. If it does not find a suitable
  * conversion function, it will copy the string to an ID_KEY_ID.