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) }},
|
.data.c = chunk_from_chars(0xc0,0xa8,0x01,0x01) }},
|
||||||
{ "email:tester", ID_RFC822_ADDR, { .type = ENC_STRING,
|
{ "email:tester", ID_RFC822_ADDR, { .type = ENC_STRING,
|
||||||
.data.s = "tester" }},
|
.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)
|
START_TEST(test_from_string)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include "identification.h"
|
#include "identification.h"
|
||||||
|
|
||||||
@@ -970,6 +971,39 @@ static private_identification_t* create_from_string_with_prefix_type(char *str)
|
|||||||
return NULL;
|
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.
|
* Described in header.
|
||||||
*/
|
*/
|
||||||
@@ -987,6 +1021,11 @@ identification_t *identification_create_from_string(char *string)
|
|||||||
{
|
{
|
||||||
return &this->public;
|
return &this->public;
|
||||||
}
|
}
|
||||||
|
this = create_from_string_with_num_type(string);
|
||||||
|
if (this)
|
||||||
|
{
|
||||||
|
return &this->public;
|
||||||
|
}
|
||||||
if (strchr(string, '=') != NULL)
|
if (strchr(string, '=') != NULL)
|
||||||
{
|
{
|
||||||
/* we interpret this as an ASCII X.501 ID_DER_ASN1_DN.
|
/* 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
|
* 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
|
* is interpreted as hex encoded binary data for that ID, otherwise the raw
|
||||||
* string following the prefix is used as identity data, without conversion.
|
* 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
|
* This constructor never returns NULL. If it does not find a suitable
|
||||||
* conversion function, it will copy the string to an ID_KEY_ID.
|
* conversion function, it will copy the string to an ID_KEY_ID.
|
||||||
|
|||||||
Reference in New Issue
Block a user