Parse and encode crlSign keyUsage flag in x509 plugin
This commit is contained in:
@@ -620,6 +620,60 @@ end:
|
|||||||
parser->destroy(parser);
|
parser->destroy(parser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract KeyUsage flags
|
||||||
|
*/
|
||||||
|
static void parse_keyUsage(chunk_t blob, private_x509_cert_t *this)
|
||||||
|
{
|
||||||
|
enum {
|
||||||
|
KU_DIGITAL_SIGNATURE = 0,
|
||||||
|
KU_NON_REPUDIATION = 1,
|
||||||
|
KU_KEY_ENCIPHERMENT = 2,
|
||||||
|
KU_DATA_ENCIPHERMENT = 3,
|
||||||
|
KU_KEY_AGREEMENT = 4,
|
||||||
|
KU_KEY_CERT_SIGN = 5,
|
||||||
|
KU_CRL_SIGN = 6,
|
||||||
|
KU_ENCIPHER_ONLY = 7,
|
||||||
|
KU_DECIPHER_ONLY = 8,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (asn1_unwrap(&blob, &blob) == ASN1_BIT_STRING && blob.len)
|
||||||
|
{
|
||||||
|
int bit, byte, unused = blob.ptr[0];
|
||||||
|
|
||||||
|
blob = chunk_skip(blob, 1);
|
||||||
|
for (byte = 0; byte < blob.len; byte++)
|
||||||
|
{
|
||||||
|
for (bit = 0; bit < 8; bit++)
|
||||||
|
{
|
||||||
|
if (byte == blob.len - 1 && bit > (7 - unused))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (blob.ptr[byte] & 1 << (7 - bit))
|
||||||
|
{
|
||||||
|
switch (byte * 8 + bit)
|
||||||
|
{
|
||||||
|
case KU_CRL_SIGN:
|
||||||
|
this->flags |= X509_CRL_SIGN;
|
||||||
|
break;
|
||||||
|
case KU_KEY_CERT_SIGN:
|
||||||
|
/* we use the caBasicConstraint, MUST be set */
|
||||||
|
case KU_DIGITAL_SIGNATURE:
|
||||||
|
case KU_NON_REPUDIATION:
|
||||||
|
case KU_KEY_ENCIPHERMENT:
|
||||||
|
case KU_DATA_ENCIPHERMENT:
|
||||||
|
case KU_KEY_AGREEMENT:
|
||||||
|
case KU_ENCIPHER_ONLY:
|
||||||
|
case KU_DECIPHER_ONLY:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ASN.1 definition of a extendedKeyUsage extension
|
* ASN.1 definition of a extendedKeyUsage extension
|
||||||
*/
|
*/
|
||||||
@@ -632,7 +686,7 @@ static const asn1Object_t extendedKeyUsageObjects[] = {
|
|||||||
#define EXT_KEY_USAGE_PURPOSE_ID 1
|
#define EXT_KEY_USAGE_PURPOSE_ID 1
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extracts extendedKeyUsage OIDs - currently only OCSP_SIGING is returned
|
* Extracts extendedKeyUsage OIDs
|
||||||
*/
|
*/
|
||||||
static void parse_extendedKeyUsage(chunk_t blob, int level0,
|
static void parse_extendedKeyUsage(chunk_t blob, int level0,
|
||||||
private_x509_cert_t *this)
|
private_x509_cert_t *this)
|
||||||
@@ -1060,7 +1114,7 @@ static bool parse_certificate(private_x509_cert_t *this)
|
|||||||
parse_authorityInfoAccess(object, level, this);
|
parse_authorityInfoAccess(object, level, this);
|
||||||
break;
|
break;
|
||||||
case OID_KEY_USAGE:
|
case OID_KEY_USAGE:
|
||||||
/* TODO parse the flags */
|
parse_keyUsage(object, this);
|
||||||
break;
|
break;
|
||||||
case OID_EXTENDED_KEY_USAGE:
|
case OID_EXTENDED_KEY_USAGE:
|
||||||
parse_extendedKeyUsage(object, level, this);
|
parse_extendedKeyUsage(object, level, this);
|
||||||
@@ -1609,7 +1663,7 @@ static bool generate(private_x509_cert_t *cert, certificate_t *sign_cert,
|
|||||||
chunk_t serverAuth = chunk_empty, clientAuth = chunk_empty;
|
chunk_t serverAuth = chunk_empty, clientAuth = chunk_empty;
|
||||||
chunk_t ocspSigning = chunk_empty;
|
chunk_t ocspSigning = chunk_empty;
|
||||||
chunk_t basicConstraints = chunk_empty;
|
chunk_t basicConstraints = chunk_empty;
|
||||||
chunk_t keyUsage = chunk_empty;
|
chunk_t keyUsage = chunk_empty, keyUsageBits = chunk_empty;
|
||||||
chunk_t subjectAltNames = chunk_empty;
|
chunk_t subjectAltNames = chunk_empty;
|
||||||
chunk_t subjectKeyIdentifier = chunk_empty, authKeyIdentifier = chunk_empty;
|
chunk_t subjectKeyIdentifier = chunk_empty, authKeyIdentifier = chunk_empty;
|
||||||
chunk_t crlDistributionPoints = chunk_empty, authorityInfoAccess = chunk_empty;
|
chunk_t crlDistributionPoints = chunk_empty, authorityInfoAccess = chunk_empty;
|
||||||
@@ -1745,13 +1799,20 @@ static bool generate(private_x509_cert_t *cert, certificate_t *sign_cert,
|
|||||||
asn1_wrap(ASN1_BOOLEAN, "c",
|
asn1_wrap(ASN1_BOOLEAN, "c",
|
||||||
chunk_from_chars(0xFF)),
|
chunk_from_chars(0xFF)),
|
||||||
pathLenConstraint)));
|
pathLenConstraint)));
|
||||||
|
/* set CertificateSign and implicitly CRLsign */
|
||||||
|
keyUsageBits = chunk_from_chars(0x01, 0x06);
|
||||||
|
}
|
||||||
|
else if (cert->flags & X509_CRL_SIGN)
|
||||||
|
{
|
||||||
|
keyUsageBits = chunk_from_chars(0x01, 0x02);
|
||||||
|
}
|
||||||
|
if (keyUsageBits.len)
|
||||||
|
{
|
||||||
keyUsage = asn1_wrap(ASN1_SEQUENCE, "mmm",
|
keyUsage = asn1_wrap(ASN1_SEQUENCE, "mmm",
|
||||||
asn1_build_known_oid(OID_KEY_USAGE),
|
asn1_build_known_oid(OID_KEY_USAGE),
|
||||||
asn1_wrap(ASN1_BOOLEAN, "c",
|
asn1_wrap(ASN1_BOOLEAN, "c", chunk_from_chars(0xFF)),
|
||||||
chunk_from_chars(0xFF)),
|
asn1_wrap(ASN1_OCTET_STRING, "m",
|
||||||
asn1_wrap(ASN1_OCTET_STRING, "m",
|
asn1_wrap(ASN1_BIT_STRING, "c", keyUsageBits)));
|
||||||
asn1_wrap(ASN1_BIT_STRING, "c",
|
|
||||||
chunk_from_chars(0x01, 0x06))));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add serverAuth extendedKeyUsage flag */
|
/* add serverAuth extendedKeyUsage flag */
|
||||||
@@ -1780,7 +1841,7 @@ static bool generate(private_x509_cert_t *cert, certificate_t *sign_cert,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* add subjectKeyIdentifier to CA and OCSP signer certificates */
|
/* add subjectKeyIdentifier to CA and OCSP signer certificates */
|
||||||
if (cert->flags & (X509_CA | X509_OCSP_SIGNER))
|
if (cert->flags & (X509_CA | X509_OCSP_SIGNER | X509_CRL_SIGN))
|
||||||
{
|
{
|
||||||
chunk_t keyid;
|
chunk_t keyid;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user