]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
split dh API functions from ui.c
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Wed, 30 Dec 2015 22:32:20 +0000 (00:32 +0200)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Wed, 30 Dec 2015 22:51:06 +0000 (00:51 +0200)
lib/Makefile.am
lib/cert.c
lib/dh-session.c [new file with mode: 0644]
lib/ui.c

index 47df75eab85a1515a7eb86340e9258c9c82188bc..af13c591e947e3196c9099deaa9ecaac53c37f14 100644 (file)
@@ -75,7 +75,7 @@ COBJECTS = range.c record.c compress.c debug.c cipher.c                       \
        random.c crypto-api.c privkey.c pcert.c pubkey.c locks.c dtls.c         \
        system_override.c crypto-backend.c verify-tofu.c pin.c tpm.c fips.c     \
        safe-memfuncs.c inet_pton.c atfork.c atfork.h randomart.c \
-       system-keys.h urls.c urls.h prf.c auto-verify.c
+       system-keys.h urls.c urls.h prf.c auto-verify.c dh-session.c
 
 if WINDOWS
 COBJECTS += system-keys-win.c
index 04427775d15ce40b9d942445cde80ddafda5b988..7e0b24268f2c522c0ed9be62ab72d0a0091a2499 100644 (file)
@@ -985,3 +985,25 @@ gnutls_certificate_verification_status_print(unsigned int status,
 
        return _gnutls_buffer_to_datum(&str, out, 1);
 }
+
+#if defined(ENABLE_DHE) || defined(ENABLE_ANON)
+/**
+ * gnutls_certificate_set_dh_params:
+ * @res: is a gnutls_certificate_credentials_t type
+ * @dh_params: the Diffie-Hellman parameters.
+ *
+ * This function will set the Diffie-Hellman parameters for a
+ * certificate server to use. These parameters will be used in
+ * Ephemeral Diffie-Hellman cipher suites.  Note that only a pointer
+ * to the parameters are stored in the certificate handle, so you
+ * must not deallocate the parameters before the certificate is deallocated.
+ *
+ **/
+void
+gnutls_certificate_set_dh_params(gnutls_certificate_credentials_t res,
+                                gnutls_dh_params_t dh_params)
+{
+       res->dh_params = dh_params;
+}
+
+#endif                         /* DH */
diff --git a/lib/dh-session.c b/lib/dh-session.c
new file mode 100644 (file)
index 0000000..483341a
--- /dev/null
@@ -0,0 +1,393 @@
+/*
+ * Copyright (C) 2001-2015 Free Software Foundation, Inc.
+ * Copyright (C) 2015 Nikos Mavrogiannopoulos
+ *
+ * Author: Nikos Mavrogiannopoulos
+ *
+ * This file is part of GnuTLS.
+ *
+ * The GnuTLS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+/* This file contains certificate authentication functions to be exported in the
+ * API which did not fit elsewhere.
+ */
+
+#include "gnutls_int.h"
+#include <auth/srp_kx.h>
+#include <auth/anon.h>
+#include <auth/cert.h>
+#include <auth/psk.h>
+#include "errors.h"
+#include <auth.h>
+#include <state.h>
+#include <datum.h>
+#include <algorithms.h>
+
+/* ANON & DHE */
+
+#if defined(ENABLE_DHE) || defined(ENABLE_ANON)
+/**
+ * gnutls_dh_set_prime_bits:
+ * @session: is a #gnutls_session_t type.
+ * @bits: is the number of bits
+ *
+ * This function sets the number of bits, for use in a Diffie-Hellman
+ * key exchange.  This is used both in DH ephemeral and DH anonymous
+ * cipher suites.  This will set the minimum size of the prime that
+ * will be used for the handshake.
+ *
+ * In the client side it sets the minimum accepted number of bits.  If
+ * a server sends a prime with less bits than that
+ * %GNUTLS_E_DH_PRIME_UNACCEPTABLE will be returned by the handshake.
+ *
+ * Note that this function will warn via the audit log for value that
+ * are believed to be weak.
+ *
+ * The function has no effect in server side.
+ * 
+ * Note that since 3.1.7 this function is deprecated. The minimum
+ * number of bits is set by the priority string level.
+ * Also this function must be called after gnutls_priority_set_direct()
+ * or the set value may be overridden by the selected priority options.
+ *
+ *
+ **/
+void gnutls_dh_set_prime_bits(gnutls_session_t session, unsigned int bits)
+{
+       if (bits < gnutls_sec_param_to_pk_bits(GNUTLS_PK_DH, GNUTLS_SEC_PARAM_WEAK)
+               && bits != 0)
+               _gnutls_audit_log(session,
+                                 "Note that the security level of the Diffie-Hellman key exchange has been lowered to %u bits and this may allow decryption of the session data\n",
+                                 bits);
+       session->internals.priorities.dh_prime_bits = bits;
+}
+
+
+/**
+ * gnutls_dh_get_group:
+ * @session: is a gnutls session
+ * @raw_gen: will hold the generator.
+ * @raw_prime: will hold the prime.
+ *
+ * This function will return the group parameters used in the last
+ * Diffie-Hellman key exchange with the peer.  These are the prime and
+ * the generator used.  This function should be used for both
+ * anonymous and ephemeral Diffie-Hellman.  The output parameters must
+ * be freed with gnutls_free().
+ *
+ * Note, that the prime and generator are exported as non-negative
+ * integers and may include a leading zero byte.
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise
+ *   an error code is returned.
+ **/
+int
+gnutls_dh_get_group(gnutls_session_t session,
+                   gnutls_datum_t * raw_gen, gnutls_datum_t * raw_prime)
+{
+       dh_info_st *dh;
+       int ret;
+       anon_auth_info_t anon_info;
+       cert_auth_info_t cert_info;
+       psk_auth_info_t psk_info;
+
+       switch (gnutls_auth_get_type(session)) {
+       case GNUTLS_CRD_ANON:
+               anon_info = _gnutls_get_auth_info(session, GNUTLS_CRD_ANON);
+               if (anon_info == NULL)
+                       return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+               dh = &anon_info->dh;
+               break;
+       case GNUTLS_CRD_PSK:
+               psk_info = _gnutls_get_auth_info(session, GNUTLS_CRD_PSK);
+               if (psk_info == NULL)
+                       return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+               dh = &psk_info->dh;
+               break;
+       case GNUTLS_CRD_CERTIFICATE:
+               cert_info = _gnutls_get_auth_info(session, GNUTLS_CRD_CERTIFICATE);
+               if (cert_info == NULL)
+                       return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+               dh = &cert_info->dh;
+               break;
+       default:
+               gnutls_assert();
+               return GNUTLS_E_INVALID_REQUEST;
+       }
+
+       ret = _gnutls_set_datum(raw_prime, dh->prime.data, dh->prime.size);
+       if (ret < 0) {
+               gnutls_assert();
+               return ret;
+       }
+
+       ret =
+           _gnutls_set_datum(raw_gen, dh->generator.data,
+                             dh->generator.size);
+       if (ret < 0) {
+               gnutls_assert();
+               _gnutls_free_datum(raw_prime);
+               return ret;
+       }
+
+       return 0;
+}
+
+/**
+ * gnutls_dh_get_pubkey:
+ * @session: is a gnutls session
+ * @raw_key: will hold the public key.
+ *
+ * This function will return the peer's public key used in the last
+ * Diffie-Hellman key exchange.  This function should be used for both
+ * anonymous and ephemeral Diffie-Hellman.  The output parameters must
+ * be freed with gnutls_free().
+ *
+ * Note, that public key is exported as non-negative
+ * integer and may include a leading zero byte.
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise
+ *   an error code is returned.
+ **/
+int
+gnutls_dh_get_pubkey(gnutls_session_t session, gnutls_datum_t * raw_key)
+{
+       dh_info_st *dh;
+       anon_auth_info_t anon_info;
+       cert_auth_info_t cert_info;
+       cert_auth_info_t psk_info;
+
+       switch (gnutls_auth_get_type(session)) {
+       case GNUTLS_CRD_ANON:
+               {
+                       anon_info = _gnutls_get_auth_info(session, GNUTLS_CRD_ANON);
+                       if (anon_info == NULL)
+                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+                       dh = &anon_info->dh;
+                       break;
+               }
+       case GNUTLS_CRD_PSK:
+               {
+                       psk_info = _gnutls_get_auth_info(session, GNUTLS_CRD_PSK);
+                       if (psk_info == NULL)
+                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+                       dh = &psk_info->dh;
+                       break;
+               }
+       case GNUTLS_CRD_CERTIFICATE:
+               {
+
+                       cert_info = _gnutls_get_auth_info(session, GNUTLS_CRD_CERTIFICATE);
+                       if (cert_info == NULL)
+                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+                       dh = &cert_info->dh;
+                       break;
+               }
+       default:
+               gnutls_assert();
+               return GNUTLS_E_INVALID_REQUEST;
+       }
+
+       return _gnutls_set_datum(raw_key, dh->public_key.data,
+                                dh->public_key.size);
+}
+
+/**
+ * gnutls_dh_get_secret_bits:
+ * @session: is a gnutls session
+ *
+ * This function will return the bits used in the last Diffie-Hellman
+ * key exchange with the peer.  Should be used for both anonymous and
+ * ephemeral Diffie-Hellman.
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise
+ *   an error code is returned.
+ **/
+int gnutls_dh_get_secret_bits(gnutls_session_t session)
+{
+       switch (gnutls_auth_get_type(session)) {
+       case GNUTLS_CRD_ANON:
+               {
+                       anon_auth_info_t info;
+
+                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_ANON);
+                       if (info == NULL)
+                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+                       return info->dh.secret_bits;
+               }
+       case GNUTLS_CRD_PSK:
+               {
+                       psk_auth_info_t info;
+
+                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_PSK);
+                       if (info == NULL)
+                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+                       return info->dh.secret_bits;
+               }
+       case GNUTLS_CRD_CERTIFICATE:
+               {
+                       cert_auth_info_t info;
+
+                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_CERTIFICATE);
+                       if (info == NULL)
+                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+
+                       return info->dh.secret_bits;
+               }
+       default:
+               gnutls_assert();
+               return GNUTLS_E_INVALID_REQUEST;
+       }
+}
+
+
+static int mpi_buf2bits(gnutls_datum_t * mpi_buf)
+{
+       bigint_t mpi;
+       int rc;
+
+       rc = _gnutls_mpi_init_scan_nz(&mpi, mpi_buf->data, mpi_buf->size);
+       if (rc) {
+               gnutls_assert();
+               return rc;
+       }
+
+       rc = _gnutls_mpi_get_nbits(mpi);
+       _gnutls_mpi_release(&mpi);
+
+       return rc;
+}
+
+/**
+ * gnutls_dh_get_prime_bits:
+ * @session: is a gnutls session
+ *
+ * This function will return the bits of the prime used in the last
+ * Diffie-Hellman key exchange with the peer.  Should be used for both
+ * anonymous and ephemeral Diffie-Hellman.  Note that some ciphers,
+ * like RSA and DSA without DHE, do not use a Diffie-Hellman key
+ * exchange, and then this function will return 0.
+ *
+ * Returns: The Diffie-Hellman bit strength is returned, or 0 if no
+ *   Diffie-Hellman key exchange was done, or a negative error code on
+ *   failure.
+ **/
+int gnutls_dh_get_prime_bits(gnutls_session_t session)
+{
+       dh_info_st *dh;
+
+       switch (gnutls_auth_get_type(session)) {
+       case GNUTLS_CRD_ANON:
+               {
+                       anon_auth_info_t info;
+
+                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_ANON);
+                       if (info == NULL)
+                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+                       dh = &info->dh;
+                       break;
+               }
+       case GNUTLS_CRD_PSK:
+               {
+                       psk_auth_info_t info;
+
+                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_PSK);
+                       if (info == NULL)
+                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+                       dh = &info->dh;
+                       break;
+               }
+       case GNUTLS_CRD_CERTIFICATE:
+               {
+                       cert_auth_info_t info;
+
+                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_CERTIFICATE);
+                       if (info == NULL)
+                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+
+                       dh = &info->dh;
+                       break;
+               }
+       default:
+               gnutls_assert();
+               return GNUTLS_E_INVALID_REQUEST;
+       }
+
+       if(dh->prime.size == 0)
+               return 0;
+
+       return mpi_buf2bits(&dh->prime);
+}
+
+
+/**
+ * gnutls_dh_get_peers_public_bits:
+ * @session: is a gnutls session
+ *
+ * Get the Diffie-Hellman public key bit size.  Can be used for both
+ * anonymous and ephemeral Diffie-Hellman.
+ *
+ * Returns: The public key bit size used in the last Diffie-Hellman
+ *   key exchange with the peer, or a negative error code in case of error.
+ **/
+int gnutls_dh_get_peers_public_bits(gnutls_session_t session)
+{
+       dh_info_st *dh;
+
+       switch (gnutls_auth_get_type(session)) {
+       case GNUTLS_CRD_ANON:
+               {
+                       anon_auth_info_t info;
+
+                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_ANON);
+                       if (info == NULL)
+                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+
+                       dh = &info->dh;
+                       break;
+               }
+       case GNUTLS_CRD_PSK:
+               {
+                       psk_auth_info_t info;
+
+                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_PSK);
+                       if (info == NULL)
+                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+
+                       dh = &info->dh;
+                       break;
+               }
+       case GNUTLS_CRD_CERTIFICATE:
+               {
+                       cert_auth_info_t info;
+
+                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_CERTIFICATE);
+                       if (info == NULL)
+                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+
+                       dh = &info->dh;
+                       break;
+               }
+       default:
+               gnutls_assert();
+               return GNUTLS_E_INVALID_REQUEST;
+       }
+
+       return mpi_buf2bits(&dh->public_key);
+}
+
+#endif                         /* DH */
+
index 6fa5d3e8167cbfe7ff4b5f478ebaa45098a2b7e1..6b9de00305b525536b377239db1ccf3ec4e78173 100644 (file)
--- a/lib/ui.c
+++ b/lib/ui.c
 #include <datum.h>
 #include <algorithms.h>
 
-/* ANON & DHE */
-
-#if defined(ENABLE_DHE) || defined(ENABLE_ANON)
-/**
- * gnutls_dh_set_prime_bits:
- * @session: is a #gnutls_session_t type.
- * @bits: is the number of bits
- *
- * This function sets the number of bits, for use in a Diffie-Hellman
- * key exchange.  This is used both in DH ephemeral and DH anonymous
- * cipher suites.  This will set the minimum size of the prime that
- * will be used for the handshake.
- *
- * In the client side it sets the minimum accepted number of bits.  If
- * a server sends a prime with less bits than that
- * %GNUTLS_E_DH_PRIME_UNACCEPTABLE will be returned by the handshake.
- *
- * Note that this function will warn via the audit log for value that
- * are believed to be weak.
- *
- * The function has no effect in server side.
- * 
- * Note that since 3.1.7 this function is deprecated. The minimum
- * number of bits is set by the priority string level.
- * Also this function must be called after gnutls_priority_set_direct()
- * or the set value may be overridden by the selected priority options.
- *
- *
- **/
-void gnutls_dh_set_prime_bits(gnutls_session_t session, unsigned int bits)
-{
-       if (bits < gnutls_sec_param_to_pk_bits(GNUTLS_PK_DH, GNUTLS_SEC_PARAM_WEAK)
-               && bits != 0)
-               _gnutls_audit_log(session,
-                                 "Note that the security level of the Diffie-Hellman key exchange has been lowered to %u bits and this may allow decryption of the session data\n",
-                                 bits);
-       session->internals.priorities.dh_prime_bits = bits;
-}
-
-
-/**
- * gnutls_dh_get_group:
- * @session: is a gnutls session
- * @raw_gen: will hold the generator.
- * @raw_prime: will hold the prime.
- *
- * This function will return the group parameters used in the last
- * Diffie-Hellman key exchange with the peer.  These are the prime and
- * the generator used.  This function should be used for both
- * anonymous and ephemeral Diffie-Hellman.  The output parameters must
- * be freed with gnutls_free().
- *
- * Note, that the prime and generator are exported as non-negative
- * integers and may include a leading zero byte.
- *
- * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise
- *   an error code is returned.
- **/
-int
-gnutls_dh_get_group(gnutls_session_t session,
-                   gnutls_datum_t * raw_gen, gnutls_datum_t * raw_prime)
-{
-       dh_info_st *dh;
-       int ret;
-       anon_auth_info_t anon_info;
-       cert_auth_info_t cert_info;
-       psk_auth_info_t psk_info;
-
-       switch (gnutls_auth_get_type(session)) {
-       case GNUTLS_CRD_ANON:
-               anon_info = _gnutls_get_auth_info(session, GNUTLS_CRD_ANON);
-               if (anon_info == NULL)
-                       return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-               dh = &anon_info->dh;
-               break;
-       case GNUTLS_CRD_PSK:
-               psk_info = _gnutls_get_auth_info(session, GNUTLS_CRD_PSK);
-               if (psk_info == NULL)
-                       return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-               dh = &psk_info->dh;
-               break;
-       case GNUTLS_CRD_CERTIFICATE:
-               cert_info = _gnutls_get_auth_info(session, GNUTLS_CRD_CERTIFICATE);
-               if (cert_info == NULL)
-                       return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-               dh = &cert_info->dh;
-               break;
-       default:
-               gnutls_assert();
-               return GNUTLS_E_INVALID_REQUEST;
-       }
-
-       ret = _gnutls_set_datum(raw_prime, dh->prime.data, dh->prime.size);
-       if (ret < 0) {
-               gnutls_assert();
-               return ret;
-       }
-
-       ret =
-           _gnutls_set_datum(raw_gen, dh->generator.data,
-                             dh->generator.size);
-       if (ret < 0) {
-               gnutls_assert();
-               _gnutls_free_datum(raw_prime);
-               return ret;
-       }
-
-       return 0;
-}
-
-/**
- * gnutls_dh_get_pubkey:
- * @session: is a gnutls session
- * @raw_key: will hold the public key.
- *
- * This function will return the peer's public key used in the last
- * Diffie-Hellman key exchange.  This function should be used for both
- * anonymous and ephemeral Diffie-Hellman.  The output parameters must
- * be freed with gnutls_free().
- *
- * Note, that public key is exported as non-negative
- * integer and may include a leading zero byte.
- *
- * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise
- *   an error code is returned.
- **/
-int
-gnutls_dh_get_pubkey(gnutls_session_t session, gnutls_datum_t * raw_key)
-{
-       dh_info_st *dh;
-       anon_auth_info_t anon_info;
-       cert_auth_info_t cert_info;
-       cert_auth_info_t psk_info;
-
-       switch (gnutls_auth_get_type(session)) {
-       case GNUTLS_CRD_ANON:
-               {
-                       anon_info = _gnutls_get_auth_info(session, GNUTLS_CRD_ANON);
-                       if (anon_info == NULL)
-                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-                       dh = &anon_info->dh;
-                       break;
-               }
-       case GNUTLS_CRD_PSK:
-               {
-                       psk_info = _gnutls_get_auth_info(session, GNUTLS_CRD_PSK);
-                       if (psk_info == NULL)
-                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-                       dh = &psk_info->dh;
-                       break;
-               }
-       case GNUTLS_CRD_CERTIFICATE:
-               {
-
-                       cert_info = _gnutls_get_auth_info(session, GNUTLS_CRD_CERTIFICATE);
-                       if (cert_info == NULL)
-                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-                       dh = &cert_info->dh;
-                       break;
-               }
-       default:
-               gnutls_assert();
-               return GNUTLS_E_INVALID_REQUEST;
-       }
-
-       return _gnutls_set_datum(raw_key, dh->public_key.data,
-                                dh->public_key.size);
-}
-
-/**
- * gnutls_dh_get_secret_bits:
- * @session: is a gnutls session
- *
- * This function will return the bits used in the last Diffie-Hellman
- * key exchange with the peer.  Should be used for both anonymous and
- * ephemeral Diffie-Hellman.
- *
- * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise
- *   an error code is returned.
- **/
-int gnutls_dh_get_secret_bits(gnutls_session_t session)
-{
-       switch (gnutls_auth_get_type(session)) {
-       case GNUTLS_CRD_ANON:
-               {
-                       anon_auth_info_t info;
-
-                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_ANON);
-                       if (info == NULL)
-                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-                       return info->dh.secret_bits;
-               }
-       case GNUTLS_CRD_PSK:
-               {
-                       psk_auth_info_t info;
-
-                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_PSK);
-                       if (info == NULL)
-                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-                       return info->dh.secret_bits;
-               }
-       case GNUTLS_CRD_CERTIFICATE:
-               {
-                       cert_auth_info_t info;
-
-                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_CERTIFICATE);
-                       if (info == NULL)
-                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-
-                       return info->dh.secret_bits;
-               }
-       default:
-               gnutls_assert();
-               return GNUTLS_E_INVALID_REQUEST;
-       }
-}
-
-
-static int mpi_buf2bits(gnutls_datum_t * mpi_buf)
-{
-       bigint_t mpi;
-       int rc;
-
-       rc = _gnutls_mpi_init_scan_nz(&mpi, mpi_buf->data, mpi_buf->size);
-       if (rc) {
-               gnutls_assert();
-               return rc;
-       }
-
-       rc = _gnutls_mpi_get_nbits(mpi);
-       _gnutls_mpi_release(&mpi);
-
-       return rc;
-}
-
-/**
- * gnutls_dh_get_prime_bits:
- * @session: is a gnutls session
- *
- * This function will return the bits of the prime used in the last
- * Diffie-Hellman key exchange with the peer.  Should be used for both
- * anonymous and ephemeral Diffie-Hellman.  Note that some ciphers,
- * like RSA and DSA without DHE, do not use a Diffie-Hellman key
- * exchange, and then this function will return 0.
- *
- * Returns: The Diffie-Hellman bit strength is returned, or 0 if no
- *   Diffie-Hellman key exchange was done, or a negative error code on
- *   failure.
- **/
-int gnutls_dh_get_prime_bits(gnutls_session_t session)
-{
-       dh_info_st *dh;
-
-       switch (gnutls_auth_get_type(session)) {
-       case GNUTLS_CRD_ANON:
-               {
-                       anon_auth_info_t info;
-
-                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_ANON);
-                       if (info == NULL)
-                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-                       dh = &info->dh;
-                       break;
-               }
-       case GNUTLS_CRD_PSK:
-               {
-                       psk_auth_info_t info;
-
-                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_PSK);
-                       if (info == NULL)
-                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-                       dh = &info->dh;
-                       break;
-               }
-       case GNUTLS_CRD_CERTIFICATE:
-               {
-                       cert_auth_info_t info;
-
-                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_CERTIFICATE);
-                       if (info == NULL)
-                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-
-                       dh = &info->dh;
-                       break;
-               }
-       default:
-               gnutls_assert();
-               return GNUTLS_E_INVALID_REQUEST;
-       }
-
-       if(dh->prime.size == 0)
-               return 0;
-
-       return mpi_buf2bits(&dh->prime);
-}
-
-
-/**
- * gnutls_dh_get_peers_public_bits:
- * @session: is a gnutls session
- *
- * Get the Diffie-Hellman public key bit size.  Can be used for both
- * anonymous and ephemeral Diffie-Hellman.
- *
- * Returns: The public key bit size used in the last Diffie-Hellman
- *   key exchange with the peer, or a negative error code in case of error.
- **/
-int gnutls_dh_get_peers_public_bits(gnutls_session_t session)
-{
-       dh_info_st *dh;
-
-       switch (gnutls_auth_get_type(session)) {
-       case GNUTLS_CRD_ANON:
-               {
-                       anon_auth_info_t info;
-
-                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_ANON);
-                       if (info == NULL)
-                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-
-                       dh = &info->dh;
-                       break;
-               }
-       case GNUTLS_CRD_PSK:
-               {
-                       psk_auth_info_t info;
-
-                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_PSK);
-                       if (info == NULL)
-                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-
-                       dh = &info->dh;
-                       break;
-               }
-       case GNUTLS_CRD_CERTIFICATE:
-               {
-                       cert_auth_info_t info;
-
-                       info = _gnutls_get_auth_info(session, GNUTLS_CRD_CERTIFICATE);
-                       if (info == NULL)
-                               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-
-                       dh = &info->dh;
-                       break;
-               }
-       default:
-               gnutls_assert();
-               return GNUTLS_E_INVALID_REQUEST;
-       }
-
-       return mpi_buf2bits(&dh->public_key);
-}
-
-/**
- * gnutls_certificate_set_dh_params:
- * @res: is a gnutls_certificate_credentials_t type
- * @dh_params: the Diffie-Hellman parameters.
- *
- * This function will set the Diffie-Hellman parameters for a
- * certificate server to use. These parameters will be used in
- * Ephemeral Diffie-Hellman cipher suites.  Note that only a pointer
- * to the parameters are stored in the certificate handle, so you
- * must not deallocate the parameters before the certificate is deallocated.
- *
- **/
-void
-gnutls_certificate_set_dh_params(gnutls_certificate_credentials_t res,
-                                gnutls_dh_params_t dh_params)
-{
-       res->dh_params = dh_params;
-}
-
-#endif                         /* DH */
-
 /* CERTIFICATE STUFF */
 
 /**