diff --git a/include/openssl/ssl.h b/include/openssl/ssl.h index a1412aba0..5a65facb2 100644 --- a/include/openssl/ssl.h +++ b/include/openssl/ssl.h @@ -1950,6 +1950,9 @@ OPENSSL_EXPORT const SSL_CIPHER *SSL_get_current_cipher(const SSL *s); OPENSSL_EXPORT int SSL_CIPHER_get_bits(const SSL_CIPHER *c,int *alg_bits); OPENSSL_EXPORT const char * SSL_CIPHER_get_version(const SSL_CIPHER *c); OPENSSL_EXPORT const char * SSL_CIPHER_get_name(const SSL_CIPHER *c); +/* SSL_CIPHER_get_kx_name returns a string that describes the key-exchange + * method used by |c|. For example, "ECDHE-ECDSA". */ +OPENSSL_EXPORT const char * SSL_CIPHER_get_kx_name(const SSL_CIPHER *cipher); OPENSSL_EXPORT unsigned long SSL_CIPHER_get_id(const SSL_CIPHER *c); OPENSSL_EXPORT int SSL_get_fd(const SSL *s); diff --git a/ssl/ssl_ciph.c b/ssl/ssl_ciph.c index 5a8668363..da29878c7 100644 --- a/ssl/ssl_ciph.c +++ b/ssl/ssl_ciph.c @@ -1742,6 +1742,49 @@ const char *SSL_CIPHER_get_name(const SSL_CIPHER *c) return("(NONE)"); } +const char *SSL_CIPHER_get_kx_name(const SSL_CIPHER *cipher) { + if (cipher == NULL) { + return ""; + } + + switch (cipher->algorithm_mkey) { + case SSL_kRSA: + return SSL_TXT_RSA; + case SSL_kDHr: + return SSL_TXT_DH "_" SSL_TXT_RSA; + case SSL_kDHd: + return SSL_TXT_DH "_" SSL_TXT_DSS; + case SSL_kEDH: + switch (cipher->algorithm_auth) { + case SSL_aDSS: + return "DHE_" SSL_TXT_DSS; + case SSL_aRSA: + return "DHE_" SSL_TXT_RSA; + case SSL_aNULL: + return SSL_TXT_DH "_anon"; + default: + return "UNKNOWN"; + } + case SSL_kECDHr: + return SSL_TXT_ECDH "_" SSL_TXT_RSA; + case SSL_kECDHe: + return SSL_TXT_ECDH "_" SSL_TXT_ECDSA; + case SSL_kEECDH: + switch (cipher->algorithm_auth) { + case SSL_aECDSA: + return "ECDHE_" SSL_TXT_ECDSA; + case SSL_aRSA: + return "ECDHE_" SSL_TXT_RSA; + case SSL_aNULL: + return SSL_TXT_ECDH "_anon"; + default: + return "UNKNOWN"; + } + default: + return "UNKNOWN"; + } +} + /* number of bits for symmetric cipher */ int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits) {