untrusted comment: signature from openbsd 6.1 base secret key
RWQEQa33SgQSEu2i0Rk+2jegwVongnaA2ojcYgaEhpz07n4N7Y1uKv0jQ2+KIw333jm32ObggMxcnwwmB7mEn6WeG9u8bhUZ8gQ=
OpenBSD 6.1 errata 014, July 5, 2017:
Distinguish between self-issued certificates and self-signed certificates,
so that self-issued certificates verify correctly in a chain.
Apply by doing:
signify -Vep /etc/signify/openbsd-61-base.pub -x 014_libcrypto.patch.sig \
-m - | (cd /usr/src && patch -p0)
And then rebuild and install libcrypto:
cd /usr/src/lib/libcrypto
make obj
make depend
make
make install
Index: lib/libcrypto/x509v3/v3_purp.c
===================================================================
RCS file: /cvs/src/lib/libcrypto/x509v3/v3_purp.c,v
retrieving revision 1.29
diff -u -p -u -p -r1.29 v3_purp.c
--- lib/libcrypto/x509v3/v3_purp.c 29 Jan 2017 17:49:23 -0000 1.29
+++ lib/libcrypto/x509v3/v3_purp.c 4 Jul 2017 16:59:03 -0000
@@ -65,6 +65,14 @@
#include <openssl/x509v3.h>
#include <openssl/x509_vfy.h>
+#define V1_ROOT (EXFLAG_V1|EXFLAG_SS)
+#define ku_reject(x, usage) \
+ (((x)->ex_flags & EXFLAG_KUSAGE) && !((x)->ex_kusage & (usage)))
+#define xku_reject(x, usage) \
+ (((x)->ex_flags & EXFLAG_XKUSAGE) && !((x)->ex_xkusage & (usage)))
+#define ns_reject(x, usage) \
+ (((x)->ex_flags & EXFLAG_NSCERT) && !((x)->ex_nscert & (usage)))
+
static void x509v3_cache_extensions(X509 *x);
static int check_ssl_ca(const X509 *x);
@@ -427,19 +435,19 @@ x509v3_cache_extensions(X509 *x)
ASN1_BIT_STRING *ns;
EXTENDED_KEY_USAGE *extusage;
X509_EXTENSION *ex;
-
int i;
+
if (x->ex_flags & EXFLAG_SET)
return;
+
#ifndef OPENSSL_NO_SHA
X509_digest(x, EVP_sha1(), x->sha1_hash, NULL);
#endif
- /* Does subject name match issuer ? */
- if (!X509_NAME_cmp(X509_get_subject_name(x), X509_get_issuer_name(x)))
- x->ex_flags |= EXFLAG_SI;
+
/* V1 should mean no extensions ... */
if (!X509_get_version(x))
x->ex_flags |= EXFLAG_V1;
+
/* Handle basic constraints */
if ((bs = X509_get_ext_d2i(x, NID_basic_constraints, NULL, NULL))) {
if (bs->ca)
@@ -456,6 +464,7 @@ x509v3_cache_extensions(X509 *x)
BASIC_CONSTRAINTS_free(bs);
x->ex_flags |= EXFLAG_BCONS;
}
+
/* Handle proxy certificates */
if ((pci = X509_get_ext_d2i(x, NID_proxyCertInfo, NULL, NULL))) {
if (x->ex_flags & EXFLAG_CA ||
@@ -477,6 +486,7 @@ x509v3_cache_extensions(X509 *x)
PROXY_CERT_INFO_EXTENSION_free(pci);
x->ex_flags |= EXFLAG_PROXY;
}
+
/* Handle key usage */
if ((usage = X509_get_ext_d2i(x, NID_key_usage, NULL, NULL))) {
if (usage->length > 0) {
@@ -541,6 +551,16 @@ x509v3_cache_extensions(X509 *x)
x->skid = X509_get_ext_d2i(x, NID_subject_key_identifier, NULL, NULL);
x->akid = X509_get_ext_d2i(x, NID_authority_key_identifier, NULL, NULL);
+
+ /* Does subject name match issuer? */
+ if (!X509_NAME_cmp(X509_get_subject_name(x), X509_get_issuer_name(x))) {
+ x->ex_flags |= EXFLAG_SI;
+ /* If SKID matches AKID also indicate self signed. */
+ if (X509_check_akid(x, x->akid) == X509_V_OK &&
+ !ku_reject(x, KU_KEY_CERT_SIGN))
+ x->ex_flags |= EXFLAG_SS;
+ }
+
x->altname = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
x->nc = X509_get_ext_d2i(x, NID_name_constraints, &i, NULL);
if (!x->nc && (i != -1))
@@ -570,14 +590,6 @@ x509v3_cache_extensions(X509 *x)
* 3 basicConstraints absent but self signed V1.
* 4 basicConstraints absent but keyUsage present and keyCertSign asserted.
*/
-
-#define V1_ROOT (EXFLAG_V1|EXFLAG_SS)
-#define ku_reject(x, usage) \
- (((x)->ex_flags & EXFLAG_KUSAGE) && !((x)->ex_kusage & (usage)))
-#define xku_reject(x, usage) \
- (((x)->ex_flags & EXFLAG_XKUSAGE) && !((x)->ex_xkusage & (usage)))
-#define ns_reject(x, usage) \
- (((x)->ex_flags & EXFLAG_NSCERT) && !((x)->ex_nscert & (usage)))
static int
check_ca(const X509 *x)
Index: lib/libcrypto/x509v3/x509v3.h
===================================================================
RCS file: /cvs/src/lib/libcrypto/x509v3/x509v3.h,v
retrieving revision 1.21
diff -u -p -u -p -r1.21 x509v3.h
--- lib/libcrypto/x509v3/x509v3.h 30 Dec 2016 16:19:24 -0000 1.21
+++ lib/libcrypto/x509v3/x509v3.h 4 Jul 2017 16:59:04 -0000
@@ -411,23 +411,21 @@ struct ISSUING_DIST_POINT_st
/* X509_PURPOSE stuff */
-#define EXFLAG_BCONS 0x1
-#define EXFLAG_KUSAGE 0x2
-#define EXFLAG_XKUSAGE 0x4
-#define EXFLAG_NSCERT 0x8
+#define EXFLAG_BCONS 0x0001
+#define EXFLAG_KUSAGE 0x0002
+#define EXFLAG_XKUSAGE 0x0004
+#define EXFLAG_NSCERT 0x0008
-#define EXFLAG_CA 0x10
-/* Really self issued not necessarily self signed */
-#define EXFLAG_SI 0x20
-#define EXFLAG_SS 0x20
-#define EXFLAG_V1 0x40
-#define EXFLAG_INVALID 0x80
-#define EXFLAG_SET 0x100
-#define EXFLAG_CRITICAL 0x200
-#define EXFLAG_PROXY 0x400
-
-#define EXFLAG_INVALID_POLICY 0x800
+#define EXFLAG_CA 0x0010
+#define EXFLAG_SI 0x0020 /* Self issued. */
+#define EXFLAG_V1 0x0040
+#define EXFLAG_INVALID 0x0080
+#define EXFLAG_SET 0x0100
+#define EXFLAG_CRITICAL 0x0200
+#define EXFLAG_PROXY 0x0400
+#define EXFLAG_INVALID_POLICY 0x0800
#define EXFLAG_FRESHEST 0x1000
+#define EXFLAG_SS 0x2000 /* Self signed. */
#define KU_DIGITAL_SIGNATURE 0x0080
#define KU_NON_REPUDIATION 0x0040