Implemented X.509 certificate reading using OpenSSL

This commit is contained in:
Martin Willi
2010-05-21 16:25:51 +02:00
parent 3e3059ba7c
commit 5728c6aa7e
6 changed files with 1054 additions and 2 deletions
@@ -100,7 +100,6 @@ error:
return FALSE;
}
/**
* Described in header.
*/
@@ -124,3 +123,85 @@ bool openssl_bn_split(chunk_t chunk, BIGNUM *a, BIGNUM *b)
return TRUE;
}
/**
* Described in header.
*/
chunk_t openssl_asn1_obj2chunk(ASN1_OBJECT *asn1)
{
if (asn1)
{
return chunk_create(asn1->data, asn1->length);
}
return chunk_empty;
}
/**
* Described in header.
*/
chunk_t openssl_asn1_str2chunk(ASN1_STRING *asn1)
{
if (asn1)
{
return chunk_create(ASN1_STRING_data(asn1), ASN1_STRING_length(asn1));
}
return chunk_empty;
}
/**
* Convert a X509 name to a ID_DER_ASN1_DN identification_t
*/
identification_t *openssl_x509_name2id(X509_NAME *name)
{
if (name)
{
identification_t *id;
chunk_t chunk;
chunk = openssl_i2chunk(X509_NAME, name);
if (chunk.len)
{
id = identification_create_from_encoding(ID_DER_ASN1_DN, chunk);
free(chunk.ptr);
return id;
}
}
return NULL;
}
/**
* We can't include <asn1/asn1.h>, as the ASN1_ definitions would clash
* with OpenSSL. Redeclare what we need.
*/
int asn1_known_oid(chunk_t);
time_t asn1_to_time(chunk_t *,int);
/**
* Described in header.
*/
int openssl_asn1_known_oid(ASN1_OBJECT *obj)
{
return asn1_known_oid(openssl_asn1_obj2chunk(obj));
}
/**
* Described in header.
*/
time_t openssl_asn1_to_time(ASN1_TIME *time)
{
chunk_t chunk;
if (time)
{
chunk = openssl_asn1_str2chunk(time);
switch (time->type)
{
case V_ASN1_UTCTIME:
case V_ASN1_GENERALIZEDTIME:
return asn1_to_time(&chunk, time->type);
default:
break;
}
}
DBG1(DBG_LIB, "invalid ASN1 time");
return 0;
}