Hi, Conceptually fine, but the patch needs a bit more work:
On 23-07-17 15:25, Arne Schwabe wrote: > V2: Print also curve details, add missing ifdef > --- > src/openvpn/ssl_openssl.c | 31 +++++++++++++++++++++++++++++++ > 1 file changed, 31 insertions(+) > > diff --git a/src/openvpn/ssl_openssl.c b/src/openvpn/ssl_openssl.c > index 11f4a567..a8e428ea 100644 > --- a/src/openvpn/ssl_openssl.c > +++ b/src/openvpn/ssl_openssl.c > @@ -1077,6 +1077,13 @@ tls_ctx_use_external_private_key(struct tls_root_ctx > *ctx, > ASSERT(pkey); /* NULL before SSL_CTX_use_certificate() is called */ > pub_rsa = EVP_PKEY_get0_RSA(pkey); > > + /* Certificate might not be RSA but DSA or EC */ > + if (!pub_rsa) > + { > + crypto_msg (M_FATAL, "management-external-key requires a RSA > certificate"); If you make the error non-fatal and add a "goto err;", that will clean up memory nicely. > + } > + > + Looks like one newline too many. > /* initialize RSA object */ > const BIGNUM *n = NULL; > const BIGNUM *e = NULL; > @@ -1695,6 +1702,30 @@ print_details(struct key_state_ssl *ks_ssl, const char > *prefix) > openvpn_snprintf(s2, sizeof(s2), ", %d bit DSA", > DSA_bits(dsa)); > } > +#ifndef OPENSSL_NO_EC > + else if (EVP_PKEY_id(pkey) == EVP_PKEY_EC && > EVP_PKEY_get0_EC_KEY(pkey) != NULL) > + { > + EC_KEY *ec = EVP_PKEY_get0_EC_KEY(pkey); > + const EC_GROUP *group = EC_KEY_get0_group(ec); > + BIO *bio = BIO_new(BIO_s_mem()); > + char ecparamstr[1024]; > + > + CLEAR(ecparamstr); Just use "char ecparamstr[1024] = { 0 };". Saved us a call to secure_memzero(). > + > + ECPKParameters_print(bio, group, 0); > + > + BIO_read(bio, ecparamstr, sizeof(ecparamstr)); > + /* replace '\n' with ' ' to have a one-line string */ > + for (int i=0; i < sizeof(ecparamstr); i++) > + if (ecparamstr[i] == '\n') > + ecparamstr[i] = ' '; Please add braces to both the for() and if(). Or consider using EC_GROUP_get_curve_name() + OBJ_nid2sn(). > + > + openvpn_snprintf(s2, sizeof(s2), ", %d bit EC, %s", > + EC_GROUP_order_bits(group), ecparamstr); A number of these functions are OpenSSL 1.1-specific, and will need wrappers in openssl-compat.h to work with OpenSSL 1.0.1 / 1.0.2 (which we still support); ssl_openssl.o: In function `print_details': ./src/openvpn/ssl_openssl.c:1704: undefined reference to `EVP_PKEY_get0_EC_KEY' ./src/openvpn/ssl_openssl.c:1706: undefined reference to `EVP_PKEY_get0_EC_KEY' ./src/openvpn/ssl_openssl.c:1721: undefined reference to `EC_GROUP_order_bits' > + BIO_free(bio); > + > + } > +#endif > EVP_PKEY_free(pkey); > } > X509_free(cert); > -Steffan ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel