identification: Support custom types in string constructor prefixes

This commit is contained in:
Martin Willi
2014-10-30 11:07:08 +01:00
parent c0da835a9f
commit 6528338753
3 changed files with 48 additions and 0 deletions
@@ -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)
+39
View 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.
+3
View 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.