From 8fb2b024b0f18d2361ca16b894c0c812d0c8b26d Mon Sep 17 00:00:00 2001 From: Blake Lawson Date: Wed, 15 Jun 2016 18:21:44 -0700 Subject: [PATCH] Added limited list of supported ciphers Summary: Added method to enable server support for a specific elliptic curve encryption algorithm. Reviewed By: siyengar Differential Revision: D3432860 fbshipit-source-id: 078531eead48ea156a68a109f8a62dc4907ac1ec --- folly/io/async/SSLContext.cpp | 36 +++++++++++++++++++++++++++++++++++ folly/io/async/SSLContext.h | 7 +++++++ 2 files changed, 43 insertions(+) diff --git a/folly/io/async/SSLContext.cpp b/folly/io/async/SSLContext.cpp index 8854b9be..a8cf72de 100644 --- a/folly/io/async/SSLContext.cpp +++ b/folly/io/async/SSLContext.cpp @@ -145,6 +145,42 @@ void SSLContext::setClientECCurvesList( #endif } +void SSLContext::setServerECCurve(const std::string& curveName) { + bool validCall = false; +#if OPENSSL_VERSION_NUMBER >= 0x0090800fL +#ifndef OPENSSL_NO_ECDH + validCall = true; +#endif +#endif + if (!validCall) { + throw std::runtime_error("Elliptic curve encryption not allowed"); + } + + EC_KEY* ecdh = nullptr; + int nid; + + /* + * Elliptic-Curve Diffie-Hellman parameters are either "named curves" + * from RFC 4492 section 5.1.1, or explicitly described curves over + * binary fields. OpenSSL only supports the "named curves", which provide + * maximum interoperability. + */ + + nid = OBJ_sn2nid(curveName.c_str()); + if (nid == 0) { + LOG(FATAL) << "Unknown curve name:" << curveName.c_str(); + return; + } + ecdh = EC_KEY_new_by_curve_name(nid); + if (ecdh == nullptr) { + LOG(FATAL) << "Unable to create curve:" << curveName.c_str(); + return; + } + + SSL_CTX_set_tmp_ecdh(ctx_, ecdh); + EC_KEY_free(ecdh); +} + void SSLContext::setX509VerifyParam( const ssl::X509VerifyParam& x509VerifyParam) { if (!x509VerifyParam) { diff --git a/folly/io/async/SSLContext.h b/folly/io/async/SSLContext.h index 83f0ad22..4593f918 100644 --- a/folly/io/async/SSLContext.h +++ b/folly/io/async/SSLContext.h @@ -161,6 +161,13 @@ class SSLContext { */ void setClientECCurvesList(const std::vector& ecCurves); + /** + * Method to add support for a specific elliptic curve encryption algorithm. + * + * @param curveName: The name of the ec curve to support, eg: prime256v1. + */ + void setServerECCurve(const std::string& curveName); + /** * Sets an x509 verification param on the context. */ -- 2.34.1