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
+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.