identification: Support custom types in string constructor prefixes
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user