parsing of subjectPublicKeyInfo of x509 certificates extracted
This commit is contained in:
@@ -640,23 +640,21 @@ static const asn1Object_t certObjects[] = {
|
|||||||
{ 3, "notBefore", ASN1_EOC, ASN1_RAW }, /* 8 */
|
{ 3, "notBefore", ASN1_EOC, ASN1_RAW }, /* 8 */
|
||||||
{ 3, "notAfter", ASN1_EOC, ASN1_RAW }, /* 9 */
|
{ 3, "notAfter", ASN1_EOC, ASN1_RAW }, /* 9 */
|
||||||
{ 2, "subject", ASN1_SEQUENCE, ASN1_OBJ }, /* 10 */
|
{ 2, "subject", ASN1_SEQUENCE, ASN1_OBJ }, /* 10 */
|
||||||
{ 2, "subjectPublicKeyInfo",ASN1_SEQUENCE, ASN1_NONE }, /* 11 */
|
{ 2, "subjectPublicKeyInfo",ASN1_SEQUENCE, ASN1_RAW }, /* 11 */
|
||||||
{ 3, "algorithm", ASN1_EOC, ASN1_RAW }, /* 12 */
|
{ 2, "issuerUniqueID", ASN1_CONTEXT_C_1, ASN1_OPT }, /* 12 */
|
||||||
{ 3, "subjectPublicKey", ASN1_BIT_STRING, ASN1_BODY }, /* 13 */
|
{ 2, "end opt", ASN1_EOC, ASN1_END }, /* 13 */
|
||||||
{ 2, "issuerUniqueID", ASN1_CONTEXT_C_1, ASN1_OPT }, /* 14 */
|
{ 2, "subjectUniqueID", ASN1_CONTEXT_C_2, ASN1_OPT }, /* 14 */
|
||||||
{ 2, "end opt", ASN1_EOC, ASN1_END }, /* 15 */
|
{ 2, "end opt", ASN1_EOC, ASN1_END }, /* 15 */
|
||||||
{ 2, "subjectUniqueID", ASN1_CONTEXT_C_2, ASN1_OPT }, /* 16 */
|
{ 2, "optional extensions", ASN1_CONTEXT_C_3, ASN1_OPT }, /* 16 */
|
||||||
{ 2, "end opt", ASN1_EOC, ASN1_END }, /* 17 */
|
{ 3, "extensions", ASN1_SEQUENCE, ASN1_LOOP }, /* 17 */
|
||||||
{ 2, "optional extensions", ASN1_CONTEXT_C_3, ASN1_OPT }, /* 18 */
|
{ 4, "extension", ASN1_SEQUENCE, ASN1_NONE }, /* 18 */
|
||||||
{ 3, "extensions", ASN1_SEQUENCE, ASN1_LOOP }, /* 29 */
|
{ 5, "extnID", ASN1_OID, ASN1_BODY }, /* 19 */
|
||||||
{ 4, "extension", ASN1_SEQUENCE, ASN1_NONE }, /* 20 */
|
{ 5, "critical", ASN1_BOOLEAN, ASN1_DEF|ASN1_BODY }, /* 20 */
|
||||||
{ 5, "extnID", ASN1_OID, ASN1_BODY }, /* 21 */
|
{ 5, "extnValue", ASN1_OCTET_STRING, ASN1_BODY }, /* 21 */
|
||||||
{ 5, "critical", ASN1_BOOLEAN, ASN1_DEF|ASN1_BODY }, /* 22 */
|
{ 3, "end loop", ASN1_EOC, ASN1_END }, /* 22 */
|
||||||
{ 5, "extnValue", ASN1_OCTET_STRING, ASN1_BODY }, /* 23 */
|
{ 2, "end opt", ASN1_EOC, ASN1_END }, /* 23 */
|
||||||
{ 3, "end loop", ASN1_EOC, ASN1_END }, /* 24 */
|
{ 1, "signatureAlgorithm", ASN1_EOC, ASN1_RAW }, /* 24 */
|
||||||
{ 2, "end opt", ASN1_EOC, ASN1_END }, /* 25 */
|
{ 1, "signatureValue", ASN1_BIT_STRING, ASN1_BODY }, /* 25 */
|
||||||
{ 1, "signatureAlgorithm", ASN1_EOC, ASN1_RAW }, /* 26 */
|
|
||||||
{ 1, "signatureValue", ASN1_BIT_STRING, ASN1_BODY }, /* 27 */
|
|
||||||
{ 0, "exit", ASN1_EOC, ASN1_EXIT }
|
{ 0, "exit", ASN1_EOC, ASN1_EXIT }
|
||||||
};
|
};
|
||||||
#define X509_OBJ_TBS_CERTIFICATE 1
|
#define X509_OBJ_TBS_CERTIFICATE 1
|
||||||
@@ -667,13 +665,12 @@ static const asn1Object_t certObjects[] = {
|
|||||||
#define X509_OBJ_NOT_BEFORE 8
|
#define X509_OBJ_NOT_BEFORE 8
|
||||||
#define X509_OBJ_NOT_AFTER 9
|
#define X509_OBJ_NOT_AFTER 9
|
||||||
#define X509_OBJ_SUBJECT 10
|
#define X509_OBJ_SUBJECT 10
|
||||||
#define X509_OBJ_SUBJECT_PUBLIC_KEY_ALGORITHM 12
|
#define X509_OBJ_SUBJECT_PUBLIC_KEY_INFO 11
|
||||||
#define X509_OBJ_SUBJECT_PUBLIC_KEY 13
|
#define X509_OBJ_EXTN_ID 19
|
||||||
#define X509_OBJ_EXTN_ID 21
|
#define X509_OBJ_CRITICAL 20
|
||||||
#define X509_OBJ_CRITICAL 22
|
#define X509_OBJ_EXTN_VALUE 21
|
||||||
#define X509_OBJ_EXTN_VALUE 23
|
#define X509_OBJ_ALGORITHM 24
|
||||||
#define X509_OBJ_ALGORITHM 26
|
#define X509_OBJ_SIGNATURE 25
|
||||||
#define X509_OBJ_SIGNATURE 27
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses an X.509v3 certificate
|
* Parses an X.509v3 certificate
|
||||||
@@ -684,7 +681,6 @@ static bool parse_certificate(private_x509_cert_t *this)
|
|||||||
chunk_t object;
|
chunk_t object;
|
||||||
int objectID;
|
int objectID;
|
||||||
int extn_oid = OID_UNKNOWN;
|
int extn_oid = OID_UNKNOWN;
|
||||||
int key_alg = OID_UNKNOWN;
|
|
||||||
int sig_alg = OID_UNKNOWN;
|
int sig_alg = OID_UNKNOWN;
|
||||||
bool success = FALSE;
|
bool success = FALSE;
|
||||||
bool critical;
|
bool critical;
|
||||||
@@ -724,31 +720,13 @@ static bool parse_certificate(private_x509_cert_t *this)
|
|||||||
this->subject = identification_create_from_encoding(ID_DER_ASN1_DN, object);
|
this->subject = identification_create_from_encoding(ID_DER_ASN1_DN, object);
|
||||||
DBG2(" '%D'", this->subject);
|
DBG2(" '%D'", this->subject);
|
||||||
break;
|
break;
|
||||||
case X509_OBJ_SUBJECT_PUBLIC_KEY_ALGORITHM:
|
case X509_OBJ_SUBJECT_PUBLIC_KEY_INFO:
|
||||||
key_alg = asn1_parse_algorithmIdentifier(object, level, NULL);
|
this->public_key = lib->creds->create(lib->creds, CRED_PUBLIC_KEY,
|
||||||
break;
|
KEY_ANY, BUILD_BLOB_ASN1_DER, chunk_clone(object), BUILD_END);
|
||||||
case X509_OBJ_SUBJECT_PUBLIC_KEY:
|
if (this->public_key == NULL)
|
||||||
if (object.len > 0 && *object.ptr == 0x00)
|
|
||||||
{
|
{
|
||||||
/* skip initial bit string octet defining 0 unused bits */
|
DBG1("could not create public key");
|
||||||
object = chunk_skip(object, 1);
|
goto end;
|
||||||
}
|
|
||||||
switch (key_alg)
|
|
||||||
{
|
|
||||||
case OID_RSA_ENCRYPTION:
|
|
||||||
this->public_key = lib->creds->create(lib->creds,
|
|
||||||
CRED_PUBLIC_KEY, KEY_RSA,
|
|
||||||
BUILD_BLOB_ASN1_DER, chunk_clone(object),
|
|
||||||
BUILD_END);
|
|
||||||
if (this->public_key == NULL)
|
|
||||||
{
|
|
||||||
DBG1("could not create RSA public key");
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
DBG1("parsing key type %d failed", key_alg);
|
|
||||||
goto end;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case X509_OBJ_EXTN_ID:
|
case X509_OBJ_EXTN_ID:
|
||||||
|
|||||||
Reference in New Issue
Block a user