The branch master has been updated
       via  6c41ee7c6530b23267ed20f95143a2a682796fef (commit)
       via  361136f4b39de26edcc275f8fe1471bcb90feb64 (commit)
       via  063f1f0c693a10aab6a7227df15d4120ed824856 (commit)
       via  af183984c3feaae693f4785be71dc1e098991d6f (commit)
      from  fb029cebaeb6b0dbdb05a26a515e38a52a3c0fa1 (commit)


- Log -----------------------------------------------------------------
commit 6c41ee7c6530b23267ed20f95143a2a682796fef
Author: Dr. Stephen Henson <st...@openssl.org>
Date:   Tue Sep 1 19:09:20 2015 +0100

    make update
    
    Reviewed-by: Rich Salz <rs...@openssl.org>

commit 361136f4b39de26edcc275f8fe1471bcb90feb64
Author: Dr. Stephen Henson <st...@openssl.org>
Date:   Tue Sep 1 18:56:58 2015 +0100

    Document extension functions
    
    Reviewed-by: Rich Salz <rs...@openssl.org>

commit 063f1f0c693a10aab6a7227df15d4120ed824856
Author: Dr. Stephen Henson <st...@openssl.org>
Date:   Tue Sep 1 17:48:05 2015 +0100

    functions to retrieve certificate flags
    
    Reviewed-by: Rich Salz <rs...@openssl.org>

commit af183984c3feaae693f4785be71dc1e098991d6f
Author: Dr. Stephen Henson <st...@openssl.org>
Date:   Tue Sep 1 16:07:05 2015 +0100

    use uint32_t for certificate flags
    
    Reviewed-by: Rich Salz <rs...@openssl.org>

-----------------------------------------------------------------------

Summary of changes:
 crypto/x509v3/v3_purp.c                 |  22 ++++++
 doc/crypto/X509_get_extension_flags.pod | 115 ++++++++++++++++++++++++++++++++
 include/openssl/x509.h                  |   8 +--
 include/openssl/x509v3.h                |   5 ++
 util/libeay.num                         |   3 +
 5 files changed, 149 insertions(+), 4 deletions(-)
 create mode 100644 doc/crypto/X509_get_extension_flags.pod

diff --git a/crypto/x509v3/v3_purp.c b/crypto/x509v3/v3_purp.c
index 1f9296a..13c5120 100644
--- a/crypto/x509v3/v3_purp.c
+++ b/crypto/x509v3/v3_purp.c
@@ -841,3 +841,25 @@ int X509_check_akid(X509 *issuer, AUTHORITY_KEYID *akid)
     }
     return X509_V_OK;
 }
+
+uint32_t X509_get_extension_flags(X509 *x)
+{
+    X509_check_purpose(x, -1, -1);
+    return x->ex_flags;
+}
+
+uint32_t X509_get_key_usage(X509 *x)
+{
+    X509_check_purpose(x, -1, -1);
+    if (x->ex_flags & EXFLAG_KUSAGE)
+        return x->ex_kusage;
+    return UINT32_MAX;
+}
+
+uint32_t X509_get_extended_key_usage(X509 *x)
+{
+    X509_check_purpose(x, -1, -1);
+    if (x->ex_flags & EXFLAG_XKUSAGE)
+        return x->ex_xkusage;
+    return UINT32_MAX;
+}
diff --git a/doc/crypto/X509_get_extension_flags.pod 
b/doc/crypto/X509_get_extension_flags.pod
new file mode 100644
index 0000000..2950bd7
--- /dev/null
+++ b/doc/crypto/X509_get_extension_flags.pod
@@ -0,0 +1,115 @@
+=pod
+
+=head1 NAME
+
+X509_get_extension_flags, X509_get_key_usage, X509_get_extended_key_usage -
+retrieve certificate extension flags.
+
+=head1 SYNOPSIS
+
+   #include <openssl/x509v3.h>
+
+   uint32_t X509_get_extension_flags(X509 *x);
+   uint32_t X509_get_key_usage(X509 *x);
+   uint32_t X509_get_extended_key_usage(X509 *x);
+
+=head1 DESCRIPTION
+
+These functions retrieve flags related to commonly used certificate extensions.
+
+X509_get_extension_flags() retrieves general information about a certificate,
+it will return one or more of the following flags ored together.
+
+=over 4
+
+=item B<EXFLAG_V1>
+
+The certificate is an obsolete version 1 certificate.
+
+=item B<EXFLAG_BCONS>
+
+The certificate contains a basic constraints extension.
+
+=item B<EXFLAG_CA>
+
+The certificate contains basic constraints and asserts the CA flag.
+
+=item B<EXFLAG_PROXY>
+
+The certificate is a valid proxy certificate.
+
+=item B<EXFLAG_SI>
+
+The certificate is self issued (that is subject and issuer names match).
+
+=item B<EXFLAG_SS>
+
+The subject and issuer names match and extension values imply it is self
+signed.
+
+=item B<EXFLAG_FRESHEST>
+
+The freshest CRL extension is present in the certificate.
+
+=item B<EXFLAG_CRITICAL>
+
+The certificate contains an unhandled critical extension.
+
+=item B<EXFLAG_INVALID>
+
+Some certificate extension values are invalid or inconsistent. The
+certificate should be rejected.
+
+=item B<EXFLAG_KUSAGE>
+
+The certificate contains a key usage extension. The value can be retrieved
+using X509_get_key_usage().
+
+=item B<EXFLAG_XKUSAGE>
+
+The certificate contains an extended key usage extension. The value can be
+retrieved using X509_get_extended_key_usage().
+
+=back
+
+X509_get_key_usage() returns the value of the key usage extension.  If key
+usage is present will return zero or more of the flags:
+B<KU_DIGITAL_SIGNATURE>, B<KU_NON_REPUDIATION>, B<KU_KEY_ENCIPHERMENT>,
+B<KU_DATA_ENCIPHERMENT>, B<KU_KEY_AGREEMENT>, B<KU_KEY_CERT_SIGN>,
+B<KU_CRL_SIGN>, B<KU_ENCIPHER_ONLY> or B<KU_DECIPHER_ONLY> corresponding to
+individual key usage bits. If key usage is absent then B<UINT32_MAX> is
+returned.
+
+X509_get_extended_key_usage() returns the value of the extended key usage
+extension. If extended key usage is present it will return zero or more of the
+flags: B<XKU_SSL_SERVER>, B<XKU_SSL_CLIENT>, B<XKU_SMIME>, B<XKU_CODE_SIGN>
+B<XKU_OCSP_SIGN>, B<XKU_TIMESTAMP>, B<XKU_DVCS> or B<XKU_ANYEKU>. These
+correspond to the OIDs B<id-kp-serverAuth>, B<id-kp-clientAuth>,
+B<id-kp-emailProtection>, B<id-kp-codeSigning>, B<id-kp-OCSPSigning>,
+B<id-kp-timeStamping>, B<id-kp-dvcs> and B<anyExtendedKeyUsage> respectively.
+Additionally B<XKU_SGC> is set if either Netscape or Microsoft SGC OIDs are
+present.
+
+=head1 NOTES
+
+The value of the flags correspond to extension values which are cached
+in the B<X509> structure. If the flags returned do not provide sufficient
+information an application should examine extension values directly.
+
+If the key usage or extended key usage extension is absent then typically usage
+is unrestricted. For this reason X509_get_key_usage() and
+X509_get_extended_key_usage() return B<UINT32_MAX> when the corresponding
+extension is absent. Applications can additionally check the return value of
+X509_get_extension_flags() and take appropriate action is an extension is
+absent.
+
+=head1 RETURN VALUE
+
+These functions all return sets of flags corresponding to the certificate
+extension values.
+
+=head1 SEE ALSO
+
+L<X509_check_purpose(3)>
+
+=cut
diff --git a/include/openssl/x509.h b/include/openssl/x509.h
index 4e816ea..5e795c0 100644
--- a/include/openssl/x509.h
+++ b/include/openssl/x509.h
@@ -197,10 +197,10 @@ struct x509_st {
     /* These contain copies of various extension values */
     long ex_pathlen;
     long ex_pcpathlen;
-    unsigned long ex_flags;
-    unsigned long ex_kusage;
-    unsigned long ex_xkusage;
-    unsigned long ex_nscert;
+    uint32_t ex_flags;
+    uint32_t ex_kusage;
+    uint32_t ex_xkusage;
+    uint32_t ex_nscert;
     ASN1_OCTET_STRING *skid;
     AUTHORITY_KEYID *akid;
     X509_POLICY_CACHE *policy_cache;
diff --git a/include/openssl/x509v3.h b/include/openssl/x509v3.h
index a46ec5d..19fcb39 100644
--- a/include/openssl/x509v3.h
+++ b/include/openssl/x509v3.h
@@ -696,6 +696,11 @@ int X509_supported_extension(X509_EXTENSION *ex);
 int X509_PURPOSE_set(int *p, int purpose);
 int X509_check_issued(X509 *issuer, X509 *subject);
 int X509_check_akid(X509 *issuer, AUTHORITY_KEYID *akid);
+
+uint32_t X509_get_extension_flags(X509 *x);
+uint32_t X509_get_key_usage(X509 *x);
+uint32_t X509_get_extended_key_usage(X509 *x);
+
 int X509_PURPOSE_get_count(void);
 X509_PURPOSE *X509_PURPOSE_get0(int idx);
 int X509_PURPOSE_get_by_sname(char *sname);
diff --git a/util/libeay.num b/util/libeay.num
index 1e3671f..080066a 100755
--- a/util/libeay.num
+++ b/util/libeay.num
@@ -4592,3 +4592,6 @@ X509_up_ref                             4950      
EXIST::FUNCTION:
 X509_REQ_get_version                    4951   EXIST::FUNCTION:
 X509_REQ_get_subject_name               4952   EXIST::FUNCTION:
 X509_CRL_up_ref                         4953   EXIST::FUNCTION:
+X509_get_extension_flags                4954   EXIST::FUNCTION:
+X509_get_extended_key_usage             4955   EXIST::FUNCTION:
+X509_get_key_usage                      4956   EXIST::FUNCTION:
_____
openssl-commits mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-commits

Reply via email to