x509: Fix some whitespaces and do some minor style cleanups in acert

This commit is contained in:
Martin Willi
2014-03-31 11:14:57 +02:00
parent 883a63adc1
commit 3134379ac7
+76 -72
View File
@@ -169,42 +169,41 @@ extern void x509_parse_generalNames(chunk_t blob, int level0, bool implicit,
/** /**
* parses a directoryName * parses a directoryName
*/ */
static bool parse_directoryName(chunk_t blob, int level, bool implicit, identification_t **name) static bool parse_directoryName(chunk_t blob, int level, bool implicit,
identification_t **name)
{ {
bool has_directoryName; identification_t *directoryName;
linked_list_t *list = linked_list_create(); enumerator_t *enumerator;
bool first = TRUE;
linked_list_t *list;
list = linked_list_create();
x509_parse_generalNames(blob, level, implicit, list); x509_parse_generalNames(blob, level, implicit, list);
has_directoryName = list->get_count(list) > 0;
if (has_directoryName) enumerator = list->create_enumerator(list);
while (enumerator->enumerate(enumerator, &directoryName))
{ {
enumerator_t *enumerator = list->create_enumerator(list); if (first)
identification_t *directoryName;
bool first = TRUE;
while (enumerator->enumerate(enumerator, (void**)&directoryName))
{ {
if (first) *name = directoryName;
{ first = FALSE;
*name = directoryName; }
first = FALSE; else
} {
else DBG1(DBG_ASN, "more than one directory name - first selected");
{ directoryName->destroy(directoryName);
DBG1(DBG_ASN, "more than one directory name - first selected"); break;
directoryName->destroy(directoryName);
}
} }
enumerator->destroy(enumerator);
} }
else enumerator->destroy(enumerator);
list->destroy(list);
if (first)
{ {
DBG1(DBG_ASN, "no directoryName found"); DBG1(DBG_ASN, "no directoryName found");
return FALSE;
} }
return TRUE;
list->destroy(list);
return has_directoryName;
} }
/** /**
@@ -250,57 +249,57 @@ static const asn1Object_t acObjects[] =
{ {
{ 0, "AttributeCertificate", ASN1_SEQUENCE, ASN1_OBJ }, /* 0 */ { 0, "AttributeCertificate", ASN1_SEQUENCE, ASN1_OBJ }, /* 0 */
{ 1, "AttributeCertificateInfo", ASN1_SEQUENCE, ASN1_OBJ }, /* 1 */ { 1, "AttributeCertificateInfo", ASN1_SEQUENCE, ASN1_OBJ }, /* 1 */
{ 2, "version", ASN1_INTEGER, ASN1_DEF | { 2, "version", ASN1_INTEGER, ASN1_DEF |
ASN1_BODY }, /* 2 */ ASN1_BODY }, /* 2 */
{ 2, "holder", ASN1_SEQUENCE, ASN1_NONE }, /* 3 */ { 2, "holder", ASN1_SEQUENCE, ASN1_NONE }, /* 3 */
{ 3, "baseCertificateID", ASN1_CONTEXT_C_0, ASN1_OPT }, /* 4 */ { 3, "baseCertificateID", ASN1_CONTEXT_C_0, ASN1_OPT }, /* 4 */
{ 4, "issuer", ASN1_SEQUENCE, ASN1_OBJ }, /* 5 */ { 4, "issuer", ASN1_SEQUENCE, ASN1_OBJ }, /* 5 */
{ 4, "serial", ASN1_INTEGER, ASN1_BODY }, /* 6 */ { 4, "serial", ASN1_INTEGER, ASN1_BODY }, /* 6 */
{ 4, "issuerUID", ASN1_BIT_STRING, ASN1_OPT | { 4, "issuerUID", ASN1_BIT_STRING, ASN1_OPT |
ASN1_BODY }, /* 7 */ ASN1_BODY }, /* 7 */
{ 4, "end opt", ASN1_EOC, ASN1_END }, /* 8 */ { 4, "end opt", ASN1_EOC, ASN1_END }, /* 8 */
{ 3, "end opt", ASN1_EOC, ASN1_END }, /* 9 */ { 3, "end opt", ASN1_EOC, ASN1_END }, /* 9 */
{ 3, "entityName", ASN1_CONTEXT_C_1, ASN1_OPT | { 3, "entityName", ASN1_CONTEXT_C_1, ASN1_OPT |
ASN1_OBJ }, /* 10 */ ASN1_OBJ }, /* 10 */
{ 3, "end opt", ASN1_EOC, ASN1_END }, /* 11 */ { 3, "end opt", ASN1_EOC, ASN1_END }, /* 11 */
{ 3, "objectDigestInfo", ASN1_CONTEXT_C_2, ASN1_OPT }, /* 12 */ { 3, "objectDigestInfo", ASN1_CONTEXT_C_2, ASN1_OPT }, /* 12 */
{ 4, "digestedObjectType", ASN1_ENUMERATED, ASN1_BODY }, /* 13 */ { 4, "digestedObjectType", ASN1_ENUMERATED, ASN1_BODY }, /* 13 */
{ 4, "otherObjectTypeID", ASN1_OID, ASN1_OPT | { 4, "otherObjectTypeID", ASN1_OID, ASN1_OPT |
ASN1_BODY }, /* 14 */ ASN1_BODY }, /* 14 */
{ 4, "end opt", ASN1_EOC, ASN1_END }, /* 15 */ { 4, "end opt", ASN1_EOC, ASN1_END }, /* 15 */
{ 4, "digestAlgorithm", ASN1_EOC, ASN1_RAW }, /* 16 */ { 4, "digestAlgorithm", ASN1_EOC, ASN1_RAW }, /* 16 */
{ 3, "end opt", ASN1_EOC, ASN1_END }, /* 17 */ { 3, "end opt", ASN1_EOC, ASN1_END }, /* 17 */
{ 2, "v2Form", ASN1_CONTEXT_C_0, ASN1_NONE }, /* 18 */ { 2, "v2Form", ASN1_CONTEXT_C_0, ASN1_NONE }, /* 18 */
{ 3, "issuerName", ASN1_SEQUENCE, ASN1_OPT | { 3, "issuerName", ASN1_SEQUENCE, ASN1_OPT |
ASN1_OBJ }, /* 19 */ ASN1_OBJ }, /* 19 */
{ 3, "end opt", ASN1_EOC, ASN1_END }, /* 20 */ { 3, "end opt", ASN1_EOC, ASN1_END }, /* 20 */
{ 3, "baseCertificateID", ASN1_CONTEXT_C_0, ASN1_OPT }, /* 21 */ { 3, "baseCertificateID", ASN1_CONTEXT_C_0, ASN1_OPT }, /* 21 */
{ 4, "issuerSerial", ASN1_SEQUENCE, ASN1_NONE }, /* 22 */ { 4, "issuerSerial", ASN1_SEQUENCE, ASN1_NONE }, /* 22 */
{ 5, "issuer", ASN1_SEQUENCE, ASN1_OBJ }, /* 23 */ { 5, "issuer", ASN1_SEQUENCE, ASN1_OBJ }, /* 23 */
{ 5, "serial", ASN1_INTEGER, ASN1_BODY }, /* 24 */ { 5, "serial", ASN1_INTEGER, ASN1_BODY }, /* 24 */
{ 5, "issuerUID", ASN1_BIT_STRING, ASN1_OPT | { 5, "issuerUID", ASN1_BIT_STRING, ASN1_OPT |
ASN1_BODY }, /* 25 */ ASN1_BODY }, /* 25 */
{ 5, "end opt", ASN1_EOC, ASN1_END }, /* 26 */ { 5, "end opt", ASN1_EOC, ASN1_END }, /* 26 */
{ 3, "end opt", ASN1_EOC, ASN1_END }, /* 27 */ { 3, "end opt", ASN1_EOC, ASN1_END }, /* 27 */
{ 3, "objectDigestInfo", ASN1_CONTEXT_C_1, ASN1_OPT }, /* 28 */ { 3, "objectDigestInfo", ASN1_CONTEXT_C_1, ASN1_OPT }, /* 28 */
{ 4, "digestInfo", ASN1_SEQUENCE, ASN1_OBJ }, /* 29 */ { 4, "digestInfo", ASN1_SEQUENCE, ASN1_OBJ }, /* 29 */
{ 5, "digestedObjectType", ASN1_ENUMERATED, ASN1_BODY }, /* 30 */ { 5, "digestedObjectType", ASN1_ENUMERATED, ASN1_BODY }, /* 30 */
{ 5, "otherObjectTypeID", ASN1_OID, ASN1_OPT | { 5, "otherObjectTypeID", ASN1_OID, ASN1_OPT |
ASN1_BODY }, /* 31 */ ASN1_BODY }, /* 31 */
{ 5, "end opt", ASN1_EOC, ASN1_END }, /* 32 */ { 5, "end opt", ASN1_EOC, ASN1_END }, /* 32 */
{ 5, "digestAlgorithm", ASN1_EOC, ASN1_RAW }, /* 33 */ { 5, "digestAlgorithm", ASN1_EOC, ASN1_RAW }, /* 33 */
{ 3, "end opt", ASN1_EOC, ASN1_END }, /* 34 */ { 3, "end opt", ASN1_EOC, ASN1_END }, /* 34 */
{ 2, "signature", ASN1_EOC, ASN1_RAW }, /* 35 */ { 2, "signature", ASN1_EOC, ASN1_RAW }, /* 35 */
{ 2, "serialNumber", ASN1_INTEGER, ASN1_BODY }, /* 36 */ { 2, "serialNumber", ASN1_INTEGER, ASN1_BODY }, /* 36 */
{ 2, "attrCertValidityPeriod", ASN1_SEQUENCE, ASN1_NONE }, /* 37 */ { 2, "attrCertValidityPeriod", ASN1_SEQUENCE, ASN1_NONE }, /* 37 */
{ 3, "notBeforeTime", ASN1_GENERALIZEDTIME, ASN1_BODY }, /* 38 */ { 3, "notBeforeTime", ASN1_GENERALIZEDTIME, ASN1_BODY }, /* 38 */
{ 3, "notAfterTime", ASN1_GENERALIZEDTIME, ASN1_BODY }, /* 39 */ { 3, "notAfterTime", ASN1_GENERALIZEDTIME, ASN1_BODY }, /* 39 */
{ 2, "attributes", ASN1_SEQUENCE, ASN1_LOOP }, /* 40 */ { 2, "attributes", ASN1_SEQUENCE, ASN1_LOOP }, /* 40 */
{ 3, "attribute", ASN1_SEQUENCE, ASN1_NONE }, /* 41 */ { 3, "attribute", ASN1_SEQUENCE, ASN1_NONE }, /* 41 */
{ 4, "type", ASN1_OID, ASN1_BODY }, /* 42 */ { 4, "type", ASN1_OID, ASN1_BODY }, /* 42 */
{ 4, "values", ASN1_SET, ASN1_LOOP }, /* 43 */ { 4, "values", ASN1_SET, ASN1_LOOP }, /* 43 */
{ 5, "value", ASN1_EOC, ASN1_RAW }, /* 44 */ { 5, "value", ASN1_EOC, ASN1_RAW }, /* 44 */
{ 4, "end loop", ASN1_EOC, ASN1_END }, /* 45 */ { 4, "end loop", ASN1_EOC, ASN1_END }, /* 45 */
{ 2, "end loop", ASN1_EOC, ASN1_END }, /* 46 */ { 2, "end loop", ASN1_EOC, ASN1_END }, /* 46 */
{ 2, "extensions", ASN1_SEQUENCE, ASN1_LOOP }, /* 47 */ { 2, "extensions", ASN1_SEQUENCE, ASN1_LOOP }, /* 47 */
{ 3, "extension", ASN1_SEQUENCE, ASN1_NONE }, /* 48 */ { 3, "extension", ASN1_SEQUENCE, ASN1_NONE }, /* 48 */
@@ -368,7 +367,8 @@ static bool parse_certificate(private_x509_ac_t *this)
} }
break; break;
case AC_OBJ_HOLDER_ISSUER: case AC_OBJ_HOLDER_ISSUER:
if (!parse_directoryName(object, level, FALSE, &this->holderIssuer)) if (!parse_directoryName(object, level, FALSE,
&this->holderIssuer))
{ {
goto end; goto end;
} }
@@ -377,13 +377,15 @@ static bool parse_certificate(private_x509_ac_t *this)
this->holderSerial = object; this->holderSerial = object;
break; break;
case AC_OBJ_ENTITY_NAME: case AC_OBJ_ENTITY_NAME:
if (!parse_directoryName(object, level, TRUE, &this->entityName)) if (!parse_directoryName(object, level, TRUE,
&this->entityName))
{ {
goto end; goto end;
} }
break; break;
case AC_OBJ_ISSUER_NAME: case AC_OBJ_ISSUER_NAME:
if (!parse_directoryName(object, level, FALSE, &this->issuerName)) if (!parse_directoryName(object, level, FALSE,
&this->issuerName))
{ {
goto end; goto end;
} }
@@ -446,8 +448,9 @@ static bool parse_certificate(private_x509_ac_t *this)
DBG2(DBG_ASN, " need to parse crlDistributionPoints"); DBG2(DBG_ASN, " need to parse crlDistributionPoints");
break; break;
case OID_AUTHORITY_KEY_ID: case OID_AUTHORITY_KEY_ID:
this->authKeyIdentifier = x509_parse_authorityKeyIdentifier(object, this->authKeyIdentifier =
level, &this->authKeySerialNumber); x509_parse_authorityKeyIdentifier(object,
level, &this->authKeySerialNumber);
break; break;
case OID_TARGET_INFORMATION: case OID_TARGET_INFORMATION:
DBG2(DBG_ASN, " need to parse targetInformation"); DBG2(DBG_ASN, " need to parse targetInformation");
@@ -490,7 +493,7 @@ end:
static chunk_t build_directoryName(asn1_t tag, chunk_t name) static chunk_t build_directoryName(asn1_t tag, chunk_t name)
{ {
return asn1_wrap(tag, "m", return asn1_wrap(tag, "m",
asn1_simple_object(ASN1_CONTEXT_C_4, name)); asn1_simple_object(ASN1_CONTEXT_C_4, name));
} }
/** /**
@@ -499,14 +502,15 @@ static chunk_t build_directoryName(asn1_t tag, chunk_t name)
static chunk_t build_holder(private_x509_ac_t *this) static chunk_t build_holder(private_x509_ac_t *this)
{ {
x509_t* x509 = (x509_t*)this->holderCert; x509_t* x509 = (x509_t*)this->holderCert;
identification_t *issuer = this->holderCert->get_issuer(this->holderCert); identification_t *issuer, *subject;
identification_t *subject = this->holderCert->get_subject(this->holderCert);
issuer = this->holderCert->get_issuer(this->holderCert);
subject = this->holderCert->get_subject(this->holderCert);
return asn1_wrap(ASN1_SEQUENCE, "mm", return asn1_wrap(ASN1_SEQUENCE, "mm",
asn1_wrap(ASN1_CONTEXT_C_0, "mm", asn1_wrap(ASN1_CONTEXT_C_0, "mm",
build_directoryName(ASN1_SEQUENCE, issuer->get_encoding(issuer)), build_directoryName(ASN1_SEQUENCE, issuer->get_encoding(issuer)),
asn1_simple_object(ASN1_INTEGER, x509->get_serial(x509)) asn1_simple_object(ASN1_INTEGER, x509->get_serial(x509))),
),
build_directoryName(ASN1_CONTEXT_C_1, subject->get_encoding(subject))); build_directoryName(ASN1_CONTEXT_C_1, subject->get_encoding(subject)));
} }
@@ -515,10 +519,12 @@ static chunk_t build_holder(private_x509_ac_t *this)
*/ */
static chunk_t build_v2_form(private_x509_ac_t *this) static chunk_t build_v2_form(private_x509_ac_t *this)
{ {
identification_t *subject = this->signerCert->get_subject(this->signerCert); identification_t *subject;
subject = this->signerCert->get_subject(this->signerCert);
return asn1_wrap(ASN1_CONTEXT_C_0, "m", return asn1_wrap(ASN1_CONTEXT_C_0, "m",
build_directoryName(ASN1_SEQUENCE, subject->get_encoding(subject))); build_directoryName(ASN1_SEQUENCE,
subject->get_encoding(subject)));
} }
/** /**
@@ -531,7 +537,6 @@ static chunk_t build_attr_cert_validity(private_x509_ac_t *this)
asn1_from_time(&this->notAfter, ASN1_GENERALIZEDTIME)); asn1_from_time(&this->notAfter, ASN1_GENERALIZEDTIME));
} }
/** /**
* build attribute type * build attribute type
*/ */
@@ -548,7 +553,8 @@ static chunk_t build_attribute_type(int type, chunk_t content)
static chunk_t build_attributes(private_x509_ac_t *this) static chunk_t build_attributes(private_x509_ac_t *this)
{ {
return asn1_wrap(ASN1_SEQUENCE, "m", return asn1_wrap(ASN1_SEQUENCE, "m",
build_attribute_type(OID_GROUP, this->groups->get_encoding(this->groups))); build_attribute_type(OID_GROUP,
this->groups->get_encoding(this->groups)));
} }
/** /**
@@ -621,14 +627,11 @@ static chunk_t build_attr_cert_info(private_x509_ac_t *this)
*/ */
static chunk_t build_ac(private_x509_ac_t *this) static chunk_t build_ac(private_x509_ac_t *this)
{ {
chunk_t signatureValue; chunk_t signatureValue, attributeCertificateInfo;
chunk_t attributeCertificateInfo;
attributeCertificateInfo = build_attr_cert_info(this); attributeCertificateInfo = build_attr_cert_info(this);
this->signerKey->sign(this->signerKey, SIGN_RSA_EMSA_PKCS1_SHA1, this->signerKey->sign(this->signerKey, SIGN_RSA_EMSA_PKCS1_SHA1,
attributeCertificateInfo, &signatureValue); attributeCertificateInfo, &signatureValue);
return asn1_wrap(ASN1_SEQUENCE, "mmm", return asn1_wrap(ASN1_SEQUENCE, "mmm",
attributeCertificateInfo, attributeCertificateInfo,
asn1_algorithmIdentifier(OID_SHA1_WITH_RSA), asn1_algorithmIdentifier(OID_SHA1_WITH_RSA),
@@ -692,7 +695,8 @@ METHOD(certificate_t, has_subject, id_match_t,
METHOD(certificate_t, has_issuer, id_match_t, METHOD(certificate_t, has_issuer, id_match_t,
private_x509_ac_t *this, identification_t *issuer) private_x509_ac_t *this, identification_t *issuer)
{ {
if (issuer->get_type(issuer) == ID_KEY_ID && this->authKeyIdentifier.ptr && if (issuer->get_type(issuer) == ID_KEY_ID &&
this->authKeyIdentifier.ptr &&
chunk_equals(this->authKeyIdentifier, issuer->get_encoding(issuer))) chunk_equals(this->authKeyIdentifier, issuer->get_encoding(issuer)))
{ {
return ID_MATCH_PERFECT; return ID_MATCH_PERFECT;
@@ -808,9 +812,10 @@ METHOD(certificate_t, equals, bool,
{ {
return TRUE; return TRUE;
} }
if (other->equals == (void*)equals) if (other->equals == _equals)
{ /* skip allocation if we have the same implementation */ { /* skip allocation if we have the same implementation */
return chunk_equals(this->encoding, ((private_x509_ac_t*)other)->encoding); return chunk_equals(this->encoding,
((private_x509_ac_t*)other)->encoding);
} }
if (!other->get_encoding(other, CERT_ASN1_DER, &encoding)) if (!other->get_encoding(other, CERT_ASN1_DER, &encoding))
{ {
@@ -968,4 +973,3 @@ x509_ac_t *x509_ac_gen(certificate_type_t type, va_list args)
destroy(ac); destroy(ac);
return NULL; return NULL;
} }