]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: ssl: fix detection of ephemeral diffie-hellman key exchange by using the...
authorRemi Gacogne <rgacogne[at]aquaray[dot]fr>
Thu, 12 Jun 2014 16:20:11 +0000 (18:20 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 12 Jun 2014 18:52:41 +0000 (20:52 +0200)
In OpenSSL, the name of a cipher using ephemeral diffie-hellman for key
 exchange can start with EDH, but also DHE, EXP-EDH or EXP1024-DHE.
We work around this issue by using the cipher's description instead of
the cipher's name.
Hopefully the description is less likely to change in the future.

src/ssl_sock.c

index bfbb5b8fcbc0230e1749b579e918ec4f130c9a35..8fb8b5f037a94eebe89bc0d4549bae77e87d7b67 100644 (file)
@@ -1022,10 +1022,12 @@ int ssl_sock_prepare_ctx(struct bind_conf *bind_conf, SSL_CTX *ctx, struct proxy
                SSL_MODE_RELEASE_BUFFERS;
        STACK_OF(SSL_CIPHER) * ciphers = NULL;
        SSL_CIPHER * cipher = NULL;
-       const char * cipher_name = NULL;
-       /* The name of ciphers using an Ephemeral Diffie Hellman key exchange
-          starts with "EDH". */
-       const char edh_name[] = "EDH";
+       char cipher_description[128];
+       /* The description of ciphers using an Ephemeral Diffie Hellman key exchange
+          contains " Kx=DH " or " Kx=DH(". Beware of " Kx=DH/",
+          which is not ephemeral DH. */
+       const char dhe_description[] = " Kx=DH ";
+       const char dhe_export_description[] = " Kx=DH(";
        int idx = 0;
        int dhe_found = 0;
 
@@ -1124,10 +1126,12 @@ int ssl_sock_prepare_ctx(struct bind_conf *bind_conf, SSL_CTX *ctx, struct proxy
                if (ciphers) {
                        for (idx = 0; idx < sk_SSL_CIPHER_num(ciphers); idx++) {
                                cipher = sk_SSL_CIPHER_value(ciphers, idx);
-                               cipher_name = SSL_CIPHER_get_name(cipher);
-                               if (strncmp(cipher_name, edh_name, sizeof (edh_name)-1) == 0) {
-                                       dhe_found = 1;
-                                       break;
+                               if (SSL_CIPHER_description(cipher, cipher_description, sizeof (cipher_description)) == cipher_description) {
+                                       if (strstr(cipher_description, dhe_description) != NULL ||
+                                           strstr(cipher_description, dhe_export_description) != NULL) {
+                                               dhe_found = 1;
+                                               break;
+                                       }
                                }
                        }