Check for missing DSA parameters.
authorDr. Stephen Henson <steve@openssl.org>
Wed, 30 Dec 2015 13:34:53 +0000 (13:34 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Wed, 30 Dec 2015 13:34:53 +0000 (13:34 +0000)
If DSA parameters are absent return -1 (for unknown) in DSA_security_bits.

If parameters are absent when a certificate is set in an SSL/SSL_CTX
structure this will reject the certificate by default. This will cause DSA
certificates which omit parameters to be rejected but that is never (?)
done in practice.

Thanks to Brian 'geeknik' Carpenter for reporting this issue.

Reviewed-by: Emilia Käsper <emilia@openssl.org>
crypto/dsa/dsa_lib.c
ssl/t1_lib.c

index 4b02d770dee5ebab91257842e2d8d469e57c84fa..722602cc90dce331ed91bc80609f69719223bbbb 100644 (file)
@@ -246,7 +246,9 @@ void *DSA_get_ex_data(DSA *d, int idx)
 
 int DSA_security_bits(const DSA *d)
 {
 
 int DSA_security_bits(const DSA *d)
 {
-    return BN_security_bits(BN_num_bits(d->p), BN_num_bits(d->q));
+    if (d->p && d->q)
+        return BN_security_bits(BN_num_bits(d->p), BN_num_bits(d->q));
+    return -1;
 }
 
 #ifndef OPENSSL_NO_DH
 }
 
 #ifndef OPENSSL_NO_DH
index 73ad6048d31e133d5e902b23a4abb7ce811e80c0..421a5a6f937d5ccfe3090832dd774132e3b91cd8 100644 (file)
@@ -4253,13 +4253,18 @@ DH *ssl_get_auto_dh(SSL *s)
 
 static int ssl_security_cert_key(SSL *s, SSL_CTX *ctx, X509 *x, int op)
 {
 
 static int ssl_security_cert_key(SSL *s, SSL_CTX *ctx, X509 *x, int op)
 {
-    int secbits;
+    int secbits = -1;
     EVP_PKEY *pkey = X509_get_pubkey(x);
     if (pkey) {
     EVP_PKEY *pkey = X509_get_pubkey(x);
     if (pkey) {
+        /*
+         * If no parameters this will return -1 and fail using the default
+         * security callback for any non-zero security level. This will
+         * reject keys which omit parameters but this only affects DSA and
+         * omission of parameters is never (?) done in practice.
+         */
         secbits = EVP_PKEY_security_bits(pkey);
         EVP_PKEY_free(pkey);
         secbits = EVP_PKEY_security_bits(pkey);
         EVP_PKEY_free(pkey);
-    } else
-        secbits = -1;
+    }
     if (s)
         return ssl_security(s, op, secbits, 0, x);
     else
     if (s)
         return ssl_security(s, op, secbits, 0, x);
     else