On Thu, Oct 21, 2021 at 01:05:18PM +0200, Theo Buehler wrote:
> This is the first of two diffs to prepare isakmpd for upcoming libcrypto
> changes.  X509_EXTENSION will become opaque so we need to use an accessor.
> I decided to leave accesses into ASN1_OCTET_STRING as they are for
> readability (asn1_string_st is still exposed in OpenSSL's asn1.h).

Here's a second diff that deals with opaque X509_STORE_CTX.

There is a minor piece left that needs X509_OBJECT_{new,free}() to land
in libcrypto.

Index: x509.c
===================================================================
RCS file: /cvs/src/sbin/isakmpd/x509.c,v
retrieving revision 1.120
diff -u -p -r1.120 x509.c
--- x509.c      13 Oct 2021 16:57:43 -0000      1.120
+++ x509.c      21 Oct 2021 11:19:14 -0000
@@ -109,7 +109,7 @@ x509_generate_kn(int id, X509 *cert)
                    "Conditions: %s >= \"%s\" && %s <= \"%s\";\n";
        X509_NAME *issuer, *subject;
        struct keynote_deckey dc;
-       X509_STORE_CTX csc;
+       X509_STORE_CTX *csc = NULL;
        X509_OBJECT obj;
        X509    *icert;
        RSA     *key = NULL;
@@ -154,24 +154,32 @@ x509_generate_kn(int id, X509 *cert)
        RSA_free(key);
        key = NULL;
 
+       csc = X509_STORE_CTX_new();
+       if (csc == NULL) {
+               log_print("x509_generate_kn: failed to get memory for "
+                   "certificate store");
+               goto fail;
+       }
+
        /* Now find issuer's certificate so we can get the public key.  */
-       X509_STORE_CTX_init(&csc, x509_cas, cert, NULL);
-       if (X509_STORE_get_by_subject(&csc, X509_LU_X509, issuer, &obj) !=
+       X509_STORE_CTX_init(csc, x509_cas, cert, NULL);
+       if (X509_STORE_get_by_subject(csc, X509_LU_X509, issuer, &obj) !=
            X509_LU_X509) {
-               X509_STORE_CTX_cleanup(&csc);
-               X509_STORE_CTX_init(&csc, x509_certs, cert, NULL);
-               if (X509_STORE_get_by_subject(&csc, X509_LU_X509, issuer, &obj)
+               X509_STORE_CTX_cleanup(csc);
+               X509_STORE_CTX_init(csc, x509_certs, cert, NULL);
+               if (X509_STORE_get_by_subject(csc, X509_LU_X509, issuer, &obj)
                    != X509_LU_X509) {
-                       X509_STORE_CTX_cleanup(&csc);
+                       X509_STORE_CTX_cleanup(csc);
                        LOG_DBG((LOG_POLICY, 30,
                            "x509_generate_kn: no certificate found for "
                            "issuer"));
                        goto fail;
                }
        }
-       X509_STORE_CTX_cleanup(&csc);
-       icert = obj.data.x509;
+       X509_STORE_CTX_free(csc);
+       csc = NULL;
 
+       icert = X509_OBJECT_get0_X509(&obj);
        if (icert == NULL) {
                LOG_DBG((LOG_POLICY, 30, "x509_generate_kn: "
                    "missing certificates, cannot construct X509 chain"));
@@ -435,6 +443,7 @@ x509_generate_kn(int id, X509 *cert)
        return 1;
 
 fail:
+       X509_STORE_CTX_free(csc);
        free(buf);
        free(skey);
        free(ikey);
@@ -812,25 +821,31 @@ x509_cert_get(u_int8_t *asn, u_int32_t l
 int
 x509_cert_validate(void *scert)
 {
-       X509_STORE_CTX  csc;
+       X509_STORE_CTX  *csc;
        X509_NAME       *issuer, *subject;
        X509            *cert = (X509 *) scert;
        EVP_PKEY        *key;
-       int             res, err;
+       int             res, err, flags;
 
        /*
         * Validate the peer certificate by checking with the CA certificates
         * we trust.
         */
-       X509_STORE_CTX_init(&csc, x509_cas, cert, NULL);
+       csc = X509_STORE_CTX_new();
+       if (csc == NULL) {
+               log_print("x509_cert_validate: failed to get memory for "
+                   "certificate store");
+       }
+       X509_STORE_CTX_init(csc, x509_cas, cert, NULL);
        /* XXX See comment in x509_read_crls_from_dir.  */
-       if (x509_cas->param->flags & X509_V_FLAG_CRL_CHECK) {
-               X509_STORE_CTX_set_flags(&csc, X509_V_FLAG_CRL_CHECK);
-               X509_STORE_CTX_set_flags(&csc, X509_V_FLAG_CRL_CHECK_ALL);
-       }
-       res = X509_verify_cert(&csc);
-       err = csc.error;
-       X509_STORE_CTX_cleanup(&csc);
+       flags = X509_VERIFY_PARAM_get_flags(X509_STORE_get0_param(x509_cas));
+       if (flags & X509_V_FLAG_CRL_CHECK) {
+               X509_STORE_CTX_set_flags(csc, X509_V_FLAG_CRL_CHECK);
+               X509_STORE_CTX_set_flags(csc, X509_V_FLAG_CRL_CHECK_ALL);
+       }
+       res = X509_verify_cert(csc);
+       err = X509_STORE_CTX_get_error(csc);
+       X509_STORE_CTX_free(csc);
 
        /*
         * Return if validation succeeded or self-signed certs are not

Reply via email to