Added conversion functions between string OIDs and its DER encoding
This commit is contained in:
@@ -123,6 +123,100 @@ chunk_t asn1_build_known_oid(int n)
|
|||||||
return oid;
|
return oid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined in header.
|
||||||
|
*/
|
||||||
|
chunk_t asn1_oid_from_string(char *str)
|
||||||
|
{
|
||||||
|
enumerator_t *enumerator;
|
||||||
|
u_char buf[32];
|
||||||
|
char *end;
|
||||||
|
int i = 0, pos = 0;
|
||||||
|
u_int val, first = 0;
|
||||||
|
|
||||||
|
enumerator = enumerator_create_token(str, ".", "");
|
||||||
|
while (enumerator->enumerate(enumerator, &str))
|
||||||
|
{
|
||||||
|
val = strtoul(str, &end, 10);
|
||||||
|
if (end == str || pos > countof(buf))
|
||||||
|
{
|
||||||
|
pos = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (i++)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
first = val;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
buf[pos++] = first * 40 + val;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (val < 128)
|
||||||
|
{
|
||||||
|
buf[pos++] = val;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buf[pos++] = 128 | (val >> 7);
|
||||||
|
buf[pos++] = (val % 256) & 0x7F;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
|
||||||
|
return chunk_clone(chunk_create(buf, pos));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined in header.
|
||||||
|
*/
|
||||||
|
char *asn1_oid_to_string(chunk_t oid)
|
||||||
|
{
|
||||||
|
char buf[64], *pos = buf;
|
||||||
|
int len;
|
||||||
|
u_int val;
|
||||||
|
|
||||||
|
if (!oid.len)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
val = oid.ptr[0] / 40;
|
||||||
|
len = snprintf(buf, sizeof(buf), "%d.%d", val, oid.ptr[0] - val * 40);
|
||||||
|
oid = chunk_skip(oid, 1);
|
||||||
|
if (len < 0 || len >= sizeof(buf))
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
pos += len;
|
||||||
|
|
||||||
|
while (oid.len)
|
||||||
|
{
|
||||||
|
if (oid.ptr[0] < 128)
|
||||||
|
{
|
||||||
|
len = snprintf(pos, sizeof(buf) + buf - pos, ".%d", oid.ptr[0]);
|
||||||
|
oid = chunk_skip(oid, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (oid.len == 1)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
val = ((u_int)(oid.ptr[0] & 0x7F) << 7) + oid.ptr[1];
|
||||||
|
len = snprintf(pos, sizeof(buf) + buf - pos, ".%d", val);
|
||||||
|
oid = chunk_skip(oid, 2);
|
||||||
|
}
|
||||||
|
if (len < 0 || len >= sizeof(buf) + buf - pos)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
pos += len;
|
||||||
|
}
|
||||||
|
return strdup(buf);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Defined in header.
|
* Defined in header.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -114,6 +114,22 @@ int asn1_known_oid(chunk_t object);
|
|||||||
*/
|
*/
|
||||||
chunk_t asn1_build_known_oid(int n);
|
chunk_t asn1_build_known_oid(int n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert human readable OID to ASN.1 DER encoding, without OID header.
|
||||||
|
*
|
||||||
|
* @param str OID string (e.g. 1.2.345.67.8)
|
||||||
|
* @return allocated ASN.1 encoded OID, chunk_empty on error
|
||||||
|
*/
|
||||||
|
chunk_t asn1_oid_from_string(char *str);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a DER encoded ASN.1 OID to a human readable string.
|
||||||
|
*
|
||||||
|
* @param oid DER encoded OID, without header
|
||||||
|
* @return human readable OID string, allocated, NULL on error
|
||||||
|
*/
|
||||||
|
char* asn1_oid_to_string(chunk_t oid);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the length of an ASN.1 object
|
* Returns the length of an ASN.1 object
|
||||||
* The blob pointer is advanced past the tag length fields
|
* The blob pointer is advanced past the tag length fields
|
||||||
|
|||||||
Reference in New Issue
Block a user