From: Nikos Mavrogiannopoulos Date: Mon, 11 Mar 2013 19:15:07 +0000 (+0100) Subject: Added options to disable more key exchange mechanisms. X-Git-Tag: gnutls_3_1_10~29 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ba1a0fae3371baccaa24aed1f5fcdc12f6df82e1;p=thirdparty%2Fgnutls.git Added options to disable more key exchange mechanisms. In that DHE was separated from ECDHE. --- diff --git a/configure.ac b/configure.ac index 28d3ddc5ab..01c8a9977d 100644 --- a/configure.ac +++ b/configure.ac @@ -653,6 +653,9 @@ if features are disabled) OpenPGP support: $ac_enable_openpgp SRP support: $ac_enable_srp PSK support: $ac_enable_psk + DHE support: $ac_enable_dhe + ECDHE support: $ac_enable_ecdhe + RSA-EXPORT support: $ac_enable_rsa_export Anon auth support: $ac_enable_anon Heartbeat support: $ac_enable_heartbeat ]) diff --git a/lib/algorithms/ciphersuites.c b/lib/algorithms/ciphersuites.c index e5fdc3ac54..817f07b659 100644 --- a/lib/algorithms/ciphersuites.c +++ b/lib/algorithms/ciphersuites.c @@ -221,147 +221,65 @@ typedef struct #define CIPHER_SUITES_COUNT (sizeof(cs_algorithms)/sizeof(gnutls_cipher_suite_entry)-1) static const gnutls_cipher_suite_entry cs_algorithms[] = { - /* DH_ANON */ - ENTRY (GNUTLS_DH_ANON_ARCFOUR_MD5, - GNUTLS_CIPHER_ARCFOUR_128, - GNUTLS_KX_ANON_DH, GNUTLS_MAC_MD5, - GNUTLS_SSL3, GNUTLS_VERSION_MAX, 0), - ENTRY (GNUTLS_DH_ANON_3DES_EDE_CBC_SHA1, - GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_ANON_DH, - GNUTLS_MAC_SHA1, GNUTLS_SSL3, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_DH_ANON_AES_128_CBC_SHA1, - GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_ANON_DH, - GNUTLS_MAC_SHA1, GNUTLS_SSL3, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_DH_ANON_AES_256_CBC_SHA1, - GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_ANON_DH, - GNUTLS_MAC_SHA1, GNUTLS_SSL3, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_DH_ANON_CAMELLIA_128_CBC_SHA1, - GNUTLS_CIPHER_CAMELLIA_128_CBC, - GNUTLS_KX_ANON_DH, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_DH_ANON_CAMELLIA_256_CBC_SHA1, - GNUTLS_CIPHER_CAMELLIA_256_CBC, - GNUTLS_KX_ANON_DH, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, + /* RSA-NULL */ + ENTRY (GNUTLS_RSA_NULL_MD5, + GNUTLS_CIPHER_NULL, + GNUTLS_KX_RSA, GNUTLS_MAC_MD5, GNUTLS_SSL3, GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_DH_ANON_AES_128_CBC_SHA256, - GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_ANON_DH, - GNUTLS_MAC_SHA256, GNUTLS_TLS1_2, + ENTRY (GNUTLS_RSA_NULL_SHA1, + GNUTLS_CIPHER_NULL, + GNUTLS_KX_RSA, GNUTLS_MAC_SHA1, GNUTLS_SSL3, GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_DH_ANON_AES_256_CBC_SHA256, - GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_ANON_DH, - GNUTLS_MAC_SHA256, GNUTLS_TLS1_2, + ENTRY (GNUTLS_RSA_NULL_SHA256, + GNUTLS_CIPHER_NULL, + GNUTLS_KX_RSA, GNUTLS_MAC_SHA256, GNUTLS_TLS1_2, GNUTLS_VERSION_MAX, 1), - /* PSK */ - ENTRY (GNUTLS_PSK_SHA_ARCFOUR_SHA1, - GNUTLS_CIPHER_ARCFOUR, GNUTLS_KX_PSK, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, + /* RSA */ + ENTRY (GNUTLS_RSA_ARCFOUR_SHA1, + GNUTLS_CIPHER_ARCFOUR_128, + GNUTLS_KX_RSA, GNUTLS_MAC_SHA1, GNUTLS_SSL3, GNUTLS_VERSION_MAX, 0), - ENTRY (GNUTLS_PSK_SHA_3DES_EDE_CBC_SHA1, - GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_PSK, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_PSK_SHA_AES_128_CBC_SHA1, - GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_PSK, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_PSK_SHA_AES_256_CBC_SHA1, - GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_PSK, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_PSK_AES_128_CBC_SHA256, - GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_PSK, - GNUTLS_MAC_SHA256, GNUTLS_TLS1, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_PSK_AES_128_GCM_SHA256, - GNUTLS_CIPHER_AES_128_GCM, GNUTLS_KX_PSK, - GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_PSK_NULL_SHA256, - GNUTLS_CIPHER_NULL, GNUTLS_KX_PSK, - GNUTLS_MAC_SHA256, GNUTLS_TLS1, - GNUTLS_VERSION_MAX, 1), - - /* DHE-PSK */ - ENTRY (GNUTLS_DHE_PSK_SHA_ARCFOUR_SHA1, - GNUTLS_CIPHER_ARCFOUR, GNUTLS_KX_DHE_PSK, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, + ENTRY (GNUTLS_RSA_ARCFOUR_MD5, + GNUTLS_CIPHER_ARCFOUR_128, + GNUTLS_KX_RSA, GNUTLS_MAC_MD5, GNUTLS_SSL3, GNUTLS_VERSION_MAX, 0), - ENTRY (GNUTLS_DHE_PSK_SHA_3DES_EDE_CBC_SHA1, - GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_DHE_PSK, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_DHE_PSK_SHA_AES_128_CBC_SHA1, - GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_DHE_PSK, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_DHE_PSK_SHA_AES_256_CBC_SHA1, - GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_DHE_PSK, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_DHE_PSK_AES_128_CBC_SHA256, - GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_DHE_PSK, - GNUTLS_MAC_SHA256, GNUTLS_TLS1, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_DHE_PSK_AES_128_GCM_SHA256, - GNUTLS_CIPHER_AES_128_GCM, GNUTLS_KX_DHE_PSK, - GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_DHE_PSK_NULL_SHA256, - GNUTLS_CIPHER_NULL, GNUTLS_KX_DHE_PSK, - GNUTLS_MAC_SHA256, GNUTLS_TLS1, - GNUTLS_VERSION_MAX, 1), - - /* SRP */ - ENTRY (GNUTLS_SRP_SHA_3DES_EDE_CBC_SHA1, - GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_SRP, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_SRP_SHA_AES_128_CBC_SHA1, - GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_SRP, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, + ENTRY (GNUTLS_RSA_3DES_EDE_CBC_SHA1, + GNUTLS_CIPHER_3DES_CBC, + GNUTLS_KX_RSA, GNUTLS_MAC_SHA1, GNUTLS_SSL3, GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_SRP_SHA_AES_256_CBC_SHA1, - GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_SRP, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, + ENTRY (GNUTLS_RSA_AES_128_CBC_SHA1, + GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_RSA, + GNUTLS_MAC_SHA1, GNUTLS_SSL3, GNUTLS_VERSION_MAX, 1), - - ENTRY (GNUTLS_SRP_SHA_DSS_3DES_EDE_CBC_SHA1, - GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_SRP_DSS, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, + ENTRY (GNUTLS_RSA_AES_256_CBC_SHA1, + GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_RSA, + GNUTLS_MAC_SHA1, GNUTLS_SSL3, GNUTLS_VERSION_MAX, 1), - - ENTRY (GNUTLS_SRP_SHA_RSA_3DES_EDE_CBC_SHA1, - GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_SRP_RSA, + ENTRY (GNUTLS_RSA_CAMELLIA_128_CBC_SHA1, + GNUTLS_CIPHER_CAMELLIA_128_CBC, GNUTLS_KX_RSA, GNUTLS_MAC_SHA1, GNUTLS_TLS1, GNUTLS_VERSION_MAX, 1), - - ENTRY (GNUTLS_SRP_SHA_DSS_AES_128_CBC_SHA1, - GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_SRP_DSS, + ENTRY (GNUTLS_RSA_CAMELLIA_256_CBC_SHA1, + GNUTLS_CIPHER_CAMELLIA_256_CBC, GNUTLS_KX_RSA, GNUTLS_MAC_SHA1, GNUTLS_TLS1, GNUTLS_VERSION_MAX, 1), - - ENTRY (GNUTLS_SRP_SHA_RSA_AES_128_CBC_SHA1, - GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_SRP_RSA, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, + ENTRY (GNUTLS_RSA_AES_128_CBC_SHA256, + GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_RSA, + GNUTLS_MAC_SHA256, GNUTLS_TLS1_2, GNUTLS_VERSION_MAX, 1), - - ENTRY (GNUTLS_SRP_SHA_DSS_AES_256_CBC_SHA1, - GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_SRP_DSS, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, + ENTRY (GNUTLS_RSA_AES_256_CBC_SHA256, + GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_RSA, + GNUTLS_MAC_SHA256, GNUTLS_TLS1_2, GNUTLS_VERSION_MAX, 1), - - ENTRY (GNUTLS_SRP_SHA_RSA_AES_256_CBC_SHA1, - GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_SRP_RSA, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, +/* GCM */ + ENTRY (GNUTLS_RSA_AES_128_GCM_SHA256, + GNUTLS_CIPHER_AES_128_GCM, GNUTLS_KX_RSA, + GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, GNUTLS_VERSION_MAX, 1), /* DHE_DSS */ +#ifdef ENABLE_DHE ENTRY (GNUTLS_DHE_DSS_ARCFOUR_SHA1, GNUTLS_CIPHER_ARCFOUR_128, GNUTLS_KX_DHE_DSS, GNUTLS_MAC_SHA1, GNUTLS_TLS1, @@ -427,68 +345,6 @@ static const gnutls_cipher_suite_entry cs_algorithms[] = { GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_DHE_RSA, GNUTLS_MAC_SHA256, GNUTLS_TLS1_2, GNUTLS_VERSION_MAX, 1), - /* RSA-NULL */ - ENTRY (GNUTLS_RSA_NULL_MD5, - GNUTLS_CIPHER_NULL, - GNUTLS_KX_RSA, GNUTLS_MAC_MD5, GNUTLS_SSL3, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_RSA_NULL_SHA1, - GNUTLS_CIPHER_NULL, - GNUTLS_KX_RSA, GNUTLS_MAC_SHA1, GNUTLS_SSL3, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_RSA_NULL_SHA256, - GNUTLS_CIPHER_NULL, - GNUTLS_KX_RSA, GNUTLS_MAC_SHA256, GNUTLS_TLS1_2, - GNUTLS_VERSION_MAX, 1), - - /* RSA-EXPORT */ - ENTRY (GNUTLS_RSA_EXPORT_ARCFOUR_40_MD5, - GNUTLS_CIPHER_ARCFOUR_40, - GNUTLS_KX_RSA_EXPORT, GNUTLS_MAC_MD5, - GNUTLS_SSL3, GNUTLS_TLS1_0, 0), - - /* RSA */ - ENTRY (GNUTLS_RSA_ARCFOUR_SHA1, - GNUTLS_CIPHER_ARCFOUR_128, - GNUTLS_KX_RSA, GNUTLS_MAC_SHA1, GNUTLS_SSL3, - GNUTLS_VERSION_MAX, 0), - ENTRY (GNUTLS_RSA_ARCFOUR_MD5, - GNUTLS_CIPHER_ARCFOUR_128, - GNUTLS_KX_RSA, GNUTLS_MAC_MD5, GNUTLS_SSL3, - GNUTLS_VERSION_MAX, 0), - ENTRY (GNUTLS_RSA_3DES_EDE_CBC_SHA1, - GNUTLS_CIPHER_3DES_CBC, - GNUTLS_KX_RSA, GNUTLS_MAC_SHA1, GNUTLS_SSL3, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_RSA_AES_128_CBC_SHA1, - GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_RSA, - GNUTLS_MAC_SHA1, GNUTLS_SSL3, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_RSA_AES_256_CBC_SHA1, - GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_RSA, - GNUTLS_MAC_SHA1, GNUTLS_SSL3, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_RSA_CAMELLIA_128_CBC_SHA1, - GNUTLS_CIPHER_CAMELLIA_128_CBC, GNUTLS_KX_RSA, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_RSA_CAMELLIA_256_CBC_SHA1, - GNUTLS_CIPHER_CAMELLIA_256_CBC, GNUTLS_KX_RSA, - GNUTLS_MAC_SHA1, GNUTLS_TLS1, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_RSA_AES_128_CBC_SHA256, - GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_RSA, - GNUTLS_MAC_SHA256, GNUTLS_TLS1_2, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_RSA_AES_256_CBC_SHA256, - GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_RSA, - GNUTLS_MAC_SHA256, GNUTLS_TLS1_2, - GNUTLS_VERSION_MAX, 1), -/* GCM */ - ENTRY (GNUTLS_RSA_AES_128_GCM_SHA256, - GNUTLS_CIPHER_AES_128_GCM, GNUTLS_KX_RSA, - GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, - GNUTLS_VERSION_MAX, 1), ENTRY (GNUTLS_DHE_RSA_AES_128_GCM_SHA256, GNUTLS_CIPHER_AES_128_GCM, GNUTLS_KX_DHE_RSA, GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, @@ -497,27 +353,8 @@ static const gnutls_cipher_suite_entry cs_algorithms[] = { GNUTLS_CIPHER_AES_128_GCM, GNUTLS_KX_DHE_DSS, GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_DH_ANON_AES_128_GCM_SHA256, - GNUTLS_CIPHER_AES_128_GCM, GNUTLS_KX_ANON_DH, - GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, - GNUTLS_VERSION_MAX, 1), -/* ECC-ANON */ - ENTRY (GNUTLS_ECDH_ANON_NULL_SHA1, - GNUTLS_CIPHER_NULL, GNUTLS_KX_ANON_ECDH, - GNUTLS_MAC_SHA1, GNUTLS_TLS1_0, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_ECDH_ANON_3DES_EDE_CBC_SHA1, - GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_ANON_ECDH, - GNUTLS_MAC_SHA1, GNUTLS_TLS1_0, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_ECDH_ANON_AES_128_CBC_SHA1, - GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_ANON_ECDH, - GNUTLS_MAC_SHA1, GNUTLS_TLS1_0, - GNUTLS_VERSION_MAX, 1), - ENTRY (GNUTLS_ECDH_ANON_AES_256_CBC_SHA1, - GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_ANON_ECDH, - GNUTLS_MAC_SHA1, GNUTLS_TLS1_0, - GNUTLS_VERSION_MAX, 1), +#endif /* DHE */ +#ifdef ENABLE_ECDHE /* ECC-RSA */ ENTRY (GNUTLS_ECDHE_RSA_NULL_SHA1, GNUTLS_CIPHER_NULL, GNUTLS_KX_ECDHE_RSA, @@ -570,6 +407,20 @@ static const gnutls_cipher_suite_entry cs_algorithms[] = { GNUTLS_CIPHER_AES_128_GCM, GNUTLS_KX_ECDHE_RSA, GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, GNUTLS_VERSION_MAX, 1), + ENTRY_PRF(GNUTLS_ECDHE_ECDSA_AES_256_GCM_SHA384, + GNUTLS_CIPHER_AES_256_GCM, GNUTLS_KX_ECDHE_ECDSA, + GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, + GNUTLS_VERSION_MAX, 1, GNUTLS_DIG_SHA384), + ENTRY_PRF(GNUTLS_ECDHE_RSA_AES_256_GCM_SHA384, + GNUTLS_CIPHER_AES_256_GCM, GNUTLS_KX_ECDHE_RSA, + GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, + GNUTLS_VERSION_MAX, 1, GNUTLS_DIG_SHA384), + ENTRY_PRF(GNUTLS_ECDHE_ECDSA_AES_256_CBC_SHA384, + GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_ECDHE_ECDSA, + GNUTLS_MAC_SHA384, GNUTLS_TLS1_2, + GNUTLS_VERSION_MAX, 1, GNUTLS_DIG_SHA384), +#endif +#ifdef ENABLE_PSK /* ECC - PSK */ ENTRY (GNUTLS_ECDHE_PSK_3DES_EDE_CBC_SHA1, GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_ECDHE_PSK, @@ -599,18 +450,67 @@ static const gnutls_cipher_suite_entry cs_algorithms[] = { GNUTLS_CIPHER_NULL, GNUTLS_KX_ECDHE_PSK, GNUTLS_MAC_SHA384, GNUTLS_TLS1_0, GNUTLS_VERSION_MAX, 1, GNUTLS_MAC_SHA384), - ENTRY_PRF(GNUTLS_ECDHE_ECDSA_AES_256_GCM_SHA384, - GNUTLS_CIPHER_AES_256_GCM, GNUTLS_KX_ECDHE_ECDSA, - GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, - GNUTLS_VERSION_MAX, 1, GNUTLS_DIG_SHA384), - ENTRY_PRF(GNUTLS_ECDHE_RSA_AES_256_GCM_SHA384, - GNUTLS_CIPHER_AES_256_GCM, GNUTLS_KX_ECDHE_RSA, - GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, - GNUTLS_VERSION_MAX, 1, GNUTLS_DIG_SHA384), - ENTRY_PRF(GNUTLS_ECDHE_ECDSA_AES_256_CBC_SHA384, - GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_ECDHE_ECDSA, - GNUTLS_MAC_SHA384, GNUTLS_TLS1_2, - GNUTLS_VERSION_MAX, 1, GNUTLS_DIG_SHA384), + + /* PSK */ + ENTRY (GNUTLS_PSK_SHA_ARCFOUR_SHA1, + GNUTLS_CIPHER_ARCFOUR, GNUTLS_KX_PSK, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 0), + ENTRY (GNUTLS_PSK_SHA_3DES_EDE_CBC_SHA1, + GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_PSK, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_PSK_SHA_AES_128_CBC_SHA1, + GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_PSK, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_PSK_SHA_AES_256_CBC_SHA1, + GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_PSK, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_PSK_AES_128_CBC_SHA256, + GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_PSK, + GNUTLS_MAC_SHA256, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_PSK_AES_128_GCM_SHA256, + GNUTLS_CIPHER_AES_128_GCM, GNUTLS_KX_PSK, + GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_PSK_NULL_SHA256, + GNUTLS_CIPHER_NULL, GNUTLS_KX_PSK, + GNUTLS_MAC_SHA256, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + + /* DHE-PSK */ + ENTRY (GNUTLS_DHE_PSK_SHA_ARCFOUR_SHA1, + GNUTLS_CIPHER_ARCFOUR, GNUTLS_KX_DHE_PSK, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 0), + ENTRY (GNUTLS_DHE_PSK_SHA_3DES_EDE_CBC_SHA1, + GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_DHE_PSK, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_DHE_PSK_SHA_AES_128_CBC_SHA1, + GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_DHE_PSK, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_DHE_PSK_SHA_AES_256_CBC_SHA1, + GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_DHE_PSK, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_DHE_PSK_AES_128_CBC_SHA256, + GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_DHE_PSK, + GNUTLS_MAC_SHA256, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_DHE_PSK_AES_128_GCM_SHA256, + GNUTLS_CIPHER_AES_128_GCM, GNUTLS_KX_DHE_PSK, + GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_DHE_PSK_NULL_SHA256, + GNUTLS_CIPHER_NULL, GNUTLS_KX_DHE_PSK, + GNUTLS_MAC_SHA256, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + ENTRY_PRF(GNUTLS_PSK_WITH_AES_256_GCM_SHA384, GNUTLS_CIPHER_AES_256_GCM, GNUTLS_KX_PSK, GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, @@ -619,6 +519,117 @@ static const gnutls_cipher_suite_entry cs_algorithms[] = { GNUTLS_CIPHER_AES_256_GCM, GNUTLS_KX_DHE_PSK, GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, GNUTLS_VERSION_MAX, 1, GNUTLS_DIG_SHA384), +#endif +#ifdef ENABLE_ANON + /* DH_ANON */ + ENTRY (GNUTLS_DH_ANON_ARCFOUR_MD5, + GNUTLS_CIPHER_ARCFOUR_128, + GNUTLS_KX_ANON_DH, GNUTLS_MAC_MD5, + GNUTLS_SSL3, GNUTLS_VERSION_MAX, 0), + ENTRY (GNUTLS_DH_ANON_3DES_EDE_CBC_SHA1, + GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_ANON_DH, + GNUTLS_MAC_SHA1, GNUTLS_SSL3, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_DH_ANON_AES_128_CBC_SHA1, + GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_ANON_DH, + GNUTLS_MAC_SHA1, GNUTLS_SSL3, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_DH_ANON_AES_256_CBC_SHA1, + GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_ANON_DH, + GNUTLS_MAC_SHA1, GNUTLS_SSL3, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_DH_ANON_CAMELLIA_128_CBC_SHA1, + GNUTLS_CIPHER_CAMELLIA_128_CBC, + GNUTLS_KX_ANON_DH, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_DH_ANON_CAMELLIA_256_CBC_SHA1, + GNUTLS_CIPHER_CAMELLIA_256_CBC, + GNUTLS_KX_ANON_DH, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_DH_ANON_AES_128_CBC_SHA256, + GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_ANON_DH, + GNUTLS_MAC_SHA256, GNUTLS_TLS1_2, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_DH_ANON_AES_256_CBC_SHA256, + GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_ANON_DH, + GNUTLS_MAC_SHA256, GNUTLS_TLS1_2, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_DH_ANON_AES_128_GCM_SHA256, + GNUTLS_CIPHER_AES_128_GCM, GNUTLS_KX_ANON_DH, + GNUTLS_MAC_AEAD, GNUTLS_TLS1_2, + GNUTLS_VERSION_MAX, 1), +/* ECC-ANON */ + ENTRY (GNUTLS_ECDH_ANON_NULL_SHA1, + GNUTLS_CIPHER_NULL, GNUTLS_KX_ANON_ECDH, + GNUTLS_MAC_SHA1, GNUTLS_TLS1_0, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_ECDH_ANON_3DES_EDE_CBC_SHA1, + GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_ANON_ECDH, + GNUTLS_MAC_SHA1, GNUTLS_TLS1_0, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_ECDH_ANON_AES_128_CBC_SHA1, + GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_ANON_ECDH, + GNUTLS_MAC_SHA1, GNUTLS_TLS1_0, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_ECDH_ANON_AES_256_CBC_SHA1, + GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_ANON_ECDH, + GNUTLS_MAC_SHA1, GNUTLS_TLS1_0, + GNUTLS_VERSION_MAX, 1), +#endif +#ifdef ENABLE_SRP + /* SRP */ + ENTRY (GNUTLS_SRP_SHA_3DES_EDE_CBC_SHA1, + GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_SRP, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_SRP_SHA_AES_128_CBC_SHA1, + GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_SRP, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + ENTRY (GNUTLS_SRP_SHA_AES_256_CBC_SHA1, + GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_SRP, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + + ENTRY (GNUTLS_SRP_SHA_DSS_3DES_EDE_CBC_SHA1, + GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_SRP_DSS, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + + ENTRY (GNUTLS_SRP_SHA_RSA_3DES_EDE_CBC_SHA1, + GNUTLS_CIPHER_3DES_CBC, GNUTLS_KX_SRP_RSA, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + + ENTRY (GNUTLS_SRP_SHA_DSS_AES_128_CBC_SHA1, + GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_SRP_DSS, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + + ENTRY (GNUTLS_SRP_SHA_RSA_AES_128_CBC_SHA1, + GNUTLS_CIPHER_AES_128_CBC, GNUTLS_KX_SRP_RSA, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + + ENTRY (GNUTLS_SRP_SHA_DSS_AES_256_CBC_SHA1, + GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_SRP_DSS, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), + + ENTRY (GNUTLS_SRP_SHA_RSA_AES_256_CBC_SHA1, + GNUTLS_CIPHER_AES_256_CBC, GNUTLS_KX_SRP_RSA, + GNUTLS_MAC_SHA1, GNUTLS_TLS1, + GNUTLS_VERSION_MAX, 1), +#endif +#ifdef ENABLE_RSA_EXPORT + /* RSA-EXPORT */ + ENTRY (GNUTLS_RSA_EXPORT_ARCFOUR_40_MD5, + GNUTLS_CIPHER_ARCFOUR_40, + GNUTLS_KX_RSA_EXPORT, GNUTLS_MAC_MD5, + GNUTLS_SSL3, GNUTLS_TLS1_0, 0), +#endif {0, {0, 0}, 0, 0, 0, 0, 0, 0} }; diff --git a/lib/algorithms/kx.c b/lib/algorithms/kx.c index ccd0dbbe88..430f8bc04a 100644 --- a/lib/algorithms/kx.c +++ b/lib/algorithms/kx.c @@ -95,13 +95,18 @@ static const gnutls_kx_algo_entry _gnutls_kx_algorithms[] = { {"ANON-ECDH", GNUTLS_KX_ANON_ECDH, &anon_ecdh_auth_struct, 0, 0}, #endif {"RSA", GNUTLS_KX_RSA, &rsa_auth_struct, 0, 0}, +#ifdef ENABLE_RSA_EXPORT {"RSA-EXPORT", GNUTLS_KX_RSA_EXPORT, &rsa_export_auth_struct, 0, 1 /* needs RSA params */ }, +#endif +#ifdef ENABLE_DHE {"DHE-RSA", GNUTLS_KX_DHE_RSA, &dhe_rsa_auth_struct, 1, 0}, + {"DHE-DSS", GNUTLS_KX_DHE_DSS, &dhe_dss_auth_struct, 1, 0}, +#endif +#ifdef ENABLE_ECDHE {"ECDHE-RSA", GNUTLS_KX_ECDHE_RSA, &ecdhe_rsa_auth_struct, 0, 0}, {"ECDHE-ECDSA", GNUTLS_KX_ECDHE_ECDSA, &ecdhe_ecdsa_auth_struct, 0, 0}, - {"DHE-DSS", GNUTLS_KX_DHE_DSS, &dhe_dss_auth_struct, 1, 0}, - +#endif #ifdef ENABLE_SRP {"SRP-DSS", GNUTLS_KX_SRP_DSS, &srp_dss_auth_struct, 0, 0}, {"SRP-RSA", GNUTLS_KX_SRP_RSA, &srp_rsa_auth_struct, 0, 0}, @@ -109,9 +114,13 @@ static const gnutls_kx_algo_entry _gnutls_kx_algorithms[] = { #endif #ifdef ENABLE_PSK {"PSK", GNUTLS_KX_PSK, &psk_auth_struct, 0, 0}, +# ifdef ENABLE_DHE {"DHE-PSK", GNUTLS_KX_DHE_PSK, &dhe_psk_auth_struct, 1 /* needs DHE params */ , 0}, +# endif +# ifdef ENABLE_ECDHE {"ECDHE-PSK", GNUTLS_KX_ECDHE_PSK, &ecdhe_psk_auth_struct, 0 , 0}, +# endif #endif {0, 0, 0, 0, 0} }; diff --git a/lib/auth/Makefile.am b/lib/auth/Makefile.am index 504a44822b..1d5d8da888 100644 --- a/lib/auth/Makefile.am +++ b/lib/auth/Makefile.am @@ -38,4 +38,4 @@ libgnutls_auth_la_SOURCES = anon.c cert.c dh_common.c dhe.c \ dhe_psk.c psk.c psk_passwd.c rsa.c rsa_export.c srp.c \ srp_passwd.c srp_rsa.c srp_sb64.c anon.h cert.h dh_common.h \ psk.h psk_passwd.h srp.h srp_passwd.h anon_ecdh.c \ - ecdh_common.c ecdh_common.h + ecdhe.c ecdhe.h diff --git a/lib/auth/anon_ecdh.c b/lib/auth/anon_ecdh.c index 233cdddf23..622fc2c1df 100644 --- a/lib/auth/anon_ecdh.c +++ b/lib/auth/anon_ecdh.c @@ -36,7 +36,7 @@ #include "gnutls_num.h" #include "gnutls_mpi.h" #include -#include +#include #include static int gen_anon_ecdh_server_kx (gnutls_session_t, gnutls_buffer_st*); diff --git a/lib/auth/cert.c b/lib/auth/cert.c index 3bf0509612..77538eb4ec 100644 --- a/lib/auth/cert.c +++ b/lib/auth/cert.c @@ -2184,3 +2184,155 @@ _gnutls_free_rsa_info (rsa_info_st * rsa) _gnutls_free_datum (&rsa->modulus); _gnutls_free_datum (&rsa->exponent); } + +int _gnutls_gen_dhe_signature(gnutls_session_t session, gnutls_buffer_st* data, + uint8_t* plain, unsigned plain_size) +{ +gnutls_pcert_st *apr_cert_list; +gnutls_privkey_t apr_pkey; +int apr_cert_list_length; +gnutls_datum_t signature = { NULL, 0 }, ddata; +gnutls_sign_algorithm_t sign_algo; +gnutls_protocol_t ver = gnutls_protocol_get_version (session); +int ret; + + ddata.data = plain; + ddata.size = plain_size; + + /* find the appropriate certificate */ + if ((ret = + _gnutls_get_selected_cert (session, &apr_cert_list, + &apr_cert_list_length, &apr_pkey)) < 0) + { + gnutls_assert (); + return ret; + } + + if (apr_cert_list_length > 0) + { + if ((ret = + _gnutls_handshake_sign_data (session, &apr_cert_list[0], + apr_pkey, &ddata, &signature, + &sign_algo)) < 0) + { + gnutls_assert (); + goto cleanup; + } + } + else + { + gnutls_assert (); + ret = 0; /* ANON-DH, do not put a signature - ILLEGAL! */ + goto cleanup; + } + + if (_gnutls_version_has_selectable_sighash (ver)) + { + const sign_algorithm_st *aid; + uint8_t p[2]; + + if (sign_algo == GNUTLS_SIGN_UNKNOWN) + { + ret = GNUTLS_E_UNKNOWN_ALGORITHM; + goto cleanup; + } + + aid = _gnutls_sign_to_tls_aid (sign_algo); + if (aid == NULL) + { + gnutls_assert(); + ret = GNUTLS_E_UNKNOWN_ALGORITHM; + goto cleanup; + } + + p[0] = aid->hash_algorithm; + p[1] = aid->sign_algorithm; + + ret = _gnutls_buffer_append_data(data, p, 2); + if (ret < 0) + { + gnutls_assert(); + goto cleanup; + } + } + + ret = _gnutls_buffer_append_data_prefix(data, 16, signature.data, signature.size); + if (ret < 0) + { + gnutls_assert(); + } + + ret = 0; + +cleanup: + _gnutls_free_datum (&signature); + return ret; +} + +int +_gnutls_proc_dhe_signature (gnutls_session_t session, uint8_t * data, + size_t _data_size, gnutls_datum_t* vparams) +{ + int sigsize; + gnutls_datum_t signature; + int ret; + cert_auth_info_t info = _gnutls_get_auth_info (session); + ssize_t data_size = _data_size; + gnutls_pcert_st peer_cert; + gnutls_sign_algorithm_t sign_algo = GNUTLS_SIGN_UNKNOWN; + gnutls_protocol_t ver = gnutls_protocol_get_version (session); + + if (info == NULL || info->ncerts == 0) + { + gnutls_assert (); + /* we need this in order to get peer's certificate */ + return GNUTLS_E_INTERNAL_ERROR; + } + + /* VERIFY SIGNATURE */ + if (_gnutls_version_has_selectable_sighash (ver)) + { + sign_algorithm_st aid; + + DECR_LEN (data_size, 1); + aid.hash_algorithm = *data++; + DECR_LEN (data_size, 1); + aid.sign_algorithm = *data++; + sign_algo = _gnutls_tls_aid_to_sign (&aid); + if (sign_algo == GNUTLS_SIGN_UNKNOWN) + { + _gnutls_debug_log("unknown signature %d.%d\n", aid.sign_algorithm, aid.hash_algorithm); + gnutls_assert (); + return GNUTLS_E_UNSUPPORTED_SIGNATURE_ALGORITHM; + } + } + DECR_LEN (data_size, 2); + sigsize = _gnutls_read_uint16 (data); + data += 2; + + DECR_LEN (data_size, sigsize); + signature.data = data; + signature.size = sigsize; + + if ((ret = + _gnutls_get_auth_info_pcert (&peer_cert, + session->security_parameters.cert_type, + info)) < 0) + { + gnutls_assert (); + return ret; + } + + ret = + _gnutls_handshake_verify_data (session, &peer_cert, vparams, &signature, + sign_algo); + + gnutls_pcert_deinit (&peer_cert); + if (ret < 0) + { + gnutls_assert (); + return ret; + } + + return 0; +} diff --git a/lib/auth/cert.h b/lib/auth/cert.h index a98dfcfd38..18a383df22 100644 --- a/lib/auth/cert.h +++ b/lib/auth/cert.h @@ -169,4 +169,10 @@ int _gnutls_selected_cert_supported_kx (struct gnutls_session_int *session, int _gnutls_check_key_cert_match (gnutls_certificate_credentials_t res); +int _gnutls_gen_dhe_signature(gnutls_session_t session, gnutls_buffer_st* data, + uint8_t* plain, unsigned plain_size); +int +_gnutls_proc_dhe_signature (gnutls_session_t session, uint8_t * data, + size_t _data_size, gnutls_datum_t *vparams); + #endif diff --git a/lib/auth/dh_common.c b/lib/auth/dh_common.c index a953577f8f..0d7f088cb7 100644 --- a/lib/auth/dh_common.c +++ b/lib/auth/dh_common.c @@ -38,6 +38,8 @@ #include #include +#if defined(ENABLE_DHE) || defined(ENABLE_ANON) + /* Frees the dh_info_st structure. */ void @@ -322,3 +324,5 @@ cleanup: return ret; } + +#endif diff --git a/lib/auth/dhe.c b/lib/auth/dhe.c index 164e966ae5..24732d6f92 100644 --- a/lib/auth/dhe.c +++ b/lib/auth/dhe.c @@ -37,45 +37,13 @@ #include #include #include -#include +#include static int gen_dhe_server_kx (gnutls_session_t, gnutls_buffer_st*); static int proc_dhe_server_kx (gnutls_session_t, uint8_t *, size_t); static int proc_dhe_client_kx (gnutls_session_t, uint8_t *, size_t); -const mod_auth_st ecdhe_ecdsa_auth_struct = { - "ECDHE_ECDSA", - _gnutls_gen_cert_server_crt, - _gnutls_gen_cert_client_crt, - gen_dhe_server_kx, - _gnutls_gen_ecdh_common_client_kx, /* This is the only difference */ - _gnutls_gen_cert_client_crt_vrfy, - _gnutls_gen_cert_server_cert_req, - - _gnutls_proc_crt, - _gnutls_proc_crt, - proc_dhe_server_kx, - proc_dhe_client_kx, - _gnutls_proc_cert_client_crt_vrfy, - _gnutls_proc_cert_cert_req -}; - -const mod_auth_st ecdhe_rsa_auth_struct = { - "ECDHE_RSA", - _gnutls_gen_cert_server_crt, - _gnutls_gen_cert_client_crt, - gen_dhe_server_kx, - _gnutls_gen_ecdh_common_client_kx, /* This is the only difference */ - _gnutls_gen_cert_client_crt_vrfy, - _gnutls_gen_cert_server_cert_req, - - _gnutls_proc_crt, - _gnutls_proc_crt, - proc_dhe_server_kx, - proc_dhe_client_kx, - _gnutls_proc_cert_client_crt_vrfy, - _gnutls_proc_cert_cert_req -}; +#ifdef ENABLE_DHE const mod_auth_st dhe_rsa_auth_struct = { "DHE_RSA", @@ -111,21 +79,16 @@ const mod_auth_st dhe_dss_auth_struct = { _gnutls_proc_cert_cert_req /* proc server cert request */ }; +#endif static int gen_dhe_server_kx (gnutls_session_t session, gnutls_buffer_st* data) { bigint_t g, p; const bigint_t *mpis; - int ret = 0, data_size; - gnutls_pcert_st *apr_cert_list; - gnutls_privkey_t apr_pkey; - int apr_cert_list_length; - gnutls_datum_t signature = { NULL, 0 }, ddata; + int ret = 0; gnutls_certificate_credentials_t cred; gnutls_dh_params_t dh_params; - gnutls_sign_algorithm_t sign_algo; - gnutls_protocol_t ver = gnutls_protocol_get_version (session); cred = (gnutls_certificate_credentials_t) _gnutls_get_cred (session, GNUTLS_CRD_CERTIFICATE, NULL); @@ -135,14 +98,6 @@ gen_dhe_server_kx (gnutls_session_t session, gnutls_buffer_st* data) return GNUTLS_E_INSUFFICIENT_CREDENTIALS; } - /* find the appropriate certificate */ - if ((ret = - _gnutls_get_selected_cert (session, &apr_cert_list, - &apr_cert_list_length, &apr_pkey)) < 0) - { - gnutls_assert (); - return ret; - } if ((ret = _gnutls_auth_info_set (session, GNUTLS_CRD_CERTIFICATE, sizeof (cert_auth_info_st), 0)) < 0) @@ -151,196 +106,55 @@ gen_dhe_server_kx (gnutls_session_t session, gnutls_buffer_st* data) return ret; } - if (!_gnutls_session_is_ecc (session)) + dh_params = + _gnutls_get_dh_params (cred->dh_params, cred->params_func, session); + mpis = _gnutls_dh_params_to_mpi (dh_params); + if (mpis == NULL) { - dh_params = - _gnutls_get_dh_params (cred->dh_params, cred->params_func, session); - mpis = _gnutls_dh_params_to_mpi (dh_params); - if (mpis == NULL) - { - gnutls_assert (); - return GNUTLS_E_NO_TEMPORARY_DH_PARAMS; - } - - p = mpis[0]; - g = mpis[1]; + gnutls_assert (); + return GNUTLS_E_NO_TEMPORARY_DH_PARAMS; + } - _gnutls_dh_set_group (session, g, p); + p = mpis[0]; + g = mpis[1]; - ret = _gnutls_dh_common_print_server_kx (session, g, p, dh_params->q_bits, data); - } - else - { - ret = _gnutls_ecdh_common_print_server_kx (session, data, _gnutls_session_ecc_curve_get(session)); - } + _gnutls_dh_set_group (session, g, p); + ret = _gnutls_dh_common_print_server_kx (session, g, p, dh_params->q_bits, data); if (ret < 0) { gnutls_assert (); return ret; } - data_size = ret; /* Generate the signature. */ - - ddata.data = data->data; - ddata.size = data->length; - - if (apr_cert_list_length > 0) - { - if ((ret = - _gnutls_handshake_sign_data (session, &apr_cert_list[0], - apr_pkey, &ddata, &signature, - &sign_algo)) < 0) - { - gnutls_assert (); - goto cleanup; - } - } - else - { - gnutls_assert (); - ret = data_size; /* do not put a signature - ILLEGAL! */ - goto cleanup; - } - - if (_gnutls_version_has_selectable_sighash (ver)) - { - const sign_algorithm_st *aid; - uint8_t p[2]; - - if (sign_algo == GNUTLS_SIGN_UNKNOWN) - { - ret = GNUTLS_E_UNKNOWN_ALGORITHM; - goto cleanup; - } - - aid = _gnutls_sign_to_tls_aid (sign_algo); - if (aid == NULL) - { - gnutls_assert(); - ret = GNUTLS_E_UNKNOWN_ALGORITHM; - goto cleanup; - } - - p[0] = aid->hash_algorithm; - p[1] = aid->sign_algorithm; - - ret = _gnutls_buffer_append_data(data, p, 2); - if (ret < 0) - { - gnutls_assert(); - goto cleanup; - } - } - - ret = _gnutls_buffer_append_data_prefix(data, 16, signature.data, signature.size); - if (ret < 0) - { - gnutls_assert(); - } - - ret = data->length; - -cleanup: - _gnutls_free_datum (&signature); - return ret; - + return _gnutls_gen_dhe_signature(session, data, data->data, data->length); } + static int proc_dhe_server_kx (gnutls_session_t session, uint8_t * data, size_t _data_size) { - int sigsize; - uint8_t *sigdata; - gnutls_datum_t vparams, signature; - int ret; - cert_auth_info_t info = _gnutls_get_auth_info (session); - ssize_t data_size = _data_size; - gnutls_pcert_st peer_cert; - gnutls_sign_algorithm_t sign_algo = GNUTLS_SIGN_UNKNOWN; - gnutls_protocol_t ver = gnutls_protocol_get_version (session); - - if (info == NULL || info->ncerts == 0) - { - gnutls_assert (); - /* we need this in order to get peer's certificate */ - return GNUTLS_E_INTERNAL_ERROR; - } - - if (!_gnutls_session_is_ecc (session)) - ret = _gnutls_proc_dh_common_server_kx (session, data, _data_size); - else - ret = _gnutls_proc_ecdh_common_server_kx (session, data, _data_size); +gnutls_datum_t vdata; +int ret; + ret = _gnutls_proc_dh_common_server_kx(session, data, _data_size); if (ret < 0) - { - gnutls_assert (); - return ret; - } - - /* VERIFY SIGNATURE */ - - vparams.size = ret; - vparams.data = data; - - sigdata = &data[vparams.size]; - if (_gnutls_version_has_selectable_sighash (ver)) - { - sign_algorithm_st aid; - - DECR_LEN (data_size, 1); - aid.hash_algorithm = *sigdata++; - DECR_LEN (data_size, 1); - aid.sign_algorithm = *sigdata++; - sign_algo = _gnutls_tls_aid_to_sign (&aid); - if (sign_algo == GNUTLS_SIGN_UNKNOWN) - { - _gnutls_debug_log("unknown signature %d.%d\n", aid.sign_algorithm, aid.hash_algorithm); - gnutls_assert (); - return GNUTLS_E_UNSUPPORTED_SIGNATURE_ALGORITHM; - } - } - DECR_LEN (data_size, 2); - sigsize = _gnutls_read_uint16 (sigdata); - sigdata += 2; - - DECR_LEN (data_size, sigsize); - signature.data = sigdata; - signature.size = sigsize; - - if ((ret = - _gnutls_get_auth_info_pcert (&peer_cert, - session->security_parameters.cert_type, - info)) < 0) - { - gnutls_assert (); - return ret; - } - - ret = - _gnutls_handshake_verify_data (session, &peer_cert, &vparams, &signature, - sign_algo); + return gnutls_assert_val(ret); - gnutls_pcert_deinit (&peer_cert); - if (ret < 0) - { - gnutls_assert (); - return ret; - } + vdata.data = data; + vdata.size = ret; - return ret; + return _gnutls_proc_dhe_signature(session, data+ret, _data_size-ret, &vdata); } - static int proc_dhe_client_kx (gnutls_session_t session, uint8_t * data, size_t _data_size) { gnutls_certificate_credentials_t cred; - int ret; bigint_t p, g; const bigint_t *mpis; gnutls_dh_params_t dh_params; @@ -353,23 +167,14 @@ proc_dhe_client_kx (gnutls_session_t session, uint8_t * data, return GNUTLS_E_INSUFFICIENT_CREDENTIALS; } - if (!_gnutls_session_is_ecc (session)) - { - dh_params = - _gnutls_get_dh_params (cred->dh_params, cred->params_func, session); - mpis = _gnutls_dh_params_to_mpi (dh_params); - if (mpis == NULL) - return gnutls_assert_val(GNUTLS_E_NO_TEMPORARY_DH_PARAMS); - - p = mpis[0]; - g = mpis[1]; - - ret = _gnutls_proc_dh_common_client_kx (session, data, _data_size, g, p, NULL); - } - else - ret = _gnutls_proc_ecdh_common_client_kx (session, data, _data_size, - _gnutls_session_ecc_curve_get(session), NULL); + dh_params = + _gnutls_get_dh_params (cred->dh_params, cred->params_func, session); + mpis = _gnutls_dh_params_to_mpi (dh_params); + if (mpis == NULL) + return gnutls_assert_val(GNUTLS_E_NO_TEMPORARY_DH_PARAMS); - return ret; + p = mpis[0]; + g = mpis[1]; + return _gnutls_proc_dh_common_client_kx (session, data, _data_size, g, p, NULL); } diff --git a/lib/auth/dhe_psk.c b/lib/auth/dhe_psk.c index 017369fc90..a51aaa1305 100644 --- a/lib/auth/dhe_psk.c +++ b/lib/auth/dhe_psk.c @@ -39,54 +39,61 @@ #include "gnutls_mpi.h" #include #include -#include +#include #include #include -static int gen_psk_server_kx (gnutls_session_t, gnutls_buffer_st*); -static int gen_psk_client_kx (gnutls_session_t, gnutls_buffer_st*); -static int proc_psk_client_kx (gnutls_session_t, uint8_t *, size_t); -static int proc_psk_server_kx (gnutls_session_t, uint8_t *, size_t); +static int +proc_ecdhe_psk_server_kx (gnutls_session_t session, uint8_t * data, + size_t _data_size); +static int gen_dhe_psk_server_kx (gnutls_session_t, gnutls_buffer_st*); +static int gen_dhe_psk_client_kx (gnutls_session_t, gnutls_buffer_st*); +static int gen_ecdhe_psk_client_kx (gnutls_session_t, gnutls_buffer_st*); +static int proc_ecdhe_psk_client_kx (gnutls_session_t, uint8_t *, size_t); +static int proc_dhe_psk_server_kx (gnutls_session_t, uint8_t *, size_t); static int gen_ecdhe_psk_server_kx (gnutls_session_t session, gnutls_buffer_st* data); -static int proc_ecdhe_psk_client_kx (gnutls_session_t session, uint8_t * data, +static int proc_dhe_psk_client_kx (gnutls_session_t session, uint8_t * data, size_t _data_size); - +#ifdef ENABLE_DHE const mod_auth_st dhe_psk_auth_struct = { "DHE PSK", NULL, NULL, - gen_psk_server_kx, - gen_psk_client_kx, + gen_dhe_psk_server_kx, + gen_dhe_psk_client_kx, NULL, NULL, NULL, NULL, /* certificate */ - proc_psk_server_kx, - proc_psk_client_kx, + proc_dhe_psk_server_kx, + proc_dhe_psk_client_kx, NULL, NULL }; +#endif +#ifdef ENABLE_ECDHE const mod_auth_st ecdhe_psk_auth_struct = { "ECDHE PSK", NULL, NULL, gen_ecdhe_psk_server_kx, - gen_psk_client_kx, + gen_ecdhe_psk_client_kx, NULL, NULL, NULL, NULL, /* certificate */ - proc_psk_server_kx, + proc_ecdhe_psk_server_kx, proc_ecdhe_psk_client_kx, NULL, NULL }; +#endif static int -gen_psk_client_kx (gnutls_session_t session, gnutls_buffer_st* data) +gen_ecdhe_psk_client_kx (gnutls_session_t session, gnutls_buffer_st* data) { int ret, free; gnutls_psk_client_credentials_t cred; @@ -110,11 +117,7 @@ gen_psk_client_kx (gnutls_session_t session, gnutls_buffer_st* data) } /* The PSK key is set in there */ - if (!_gnutls_session_is_ecc (session)) - ret = _gnutls_gen_dh_common_client_kx_int (session, data, &key); - else - ret = _gnutls_gen_ecdh_common_client_kx_int (session, data, &key); - + ret = _gnutls_gen_ecdh_common_client_kx_int (session, data, &key); if (ret < 0) { gnutls_assert (); @@ -131,11 +134,54 @@ cleanup: } return ret; +} + +static int +gen_dhe_psk_client_kx (gnutls_session_t session, gnutls_buffer_st* data) +{ + int ret, free; + gnutls_psk_client_credentials_t cred; + gnutls_datum_t username, key; + + cred = (gnutls_psk_client_credentials_t) + _gnutls_get_cred (session, GNUTLS_CRD_PSK, NULL); + + if (cred == NULL) + return gnutls_assert_val(GNUTLS_E_INSUFFICIENT_CREDENTIALS); + + ret = _gnutls_find_psk_key( session, cred, &username, &key, &free); + if (ret < 0) + return gnutls_assert_val(ret); + + ret = _gnutls_buffer_append_data_prefix(data, 16, username.data, username.size); + if (ret < 0) + { + gnutls_assert(); + goto cleanup; + } + /* The PSK key is set in there */ + ret = _gnutls_gen_dh_common_client_kx_int (session, data, &key); + if (ret < 0) + { + gnutls_assert (); + goto cleanup; + } + + ret = data->length; + +cleanup: + if (free) + { + _gnutls_free_datum(&username); + _gnutls_free_datum(&key); + } + + return ret; } static int -gen_psk_server_kx (gnutls_session_t session, gnutls_buffer_st* data) +gen_dhe_psk_server_kx (gnutls_session_t session, gnutls_buffer_st* data) { bigint_t g, p; const bigint_t *mpis; @@ -211,7 +257,7 @@ gen_ecdhe_psk_server_kx (gnutls_session_t session, gnutls_buffer_st* data) static int -proc_psk_client_kx (gnutls_session_t session, uint8_t * data, +proc_dhe_psk_client_kx (gnutls_session_t session, uint8_t * data, size_t _data_size) { int ret; @@ -354,8 +400,40 @@ proc_ecdhe_psk_client_kx (gnutls_session_t session, uint8_t * data, return ret; } -int -proc_psk_server_kx (gnutls_session_t session, uint8_t * data, +static int +proc_dhe_psk_server_kx (gnutls_session_t session, uint8_t * data, + size_t _data_size) +{ + + int ret, psk_size; + ssize_t data_size = _data_size; + + /* set auth_info */ + if ((ret = + _gnutls_auth_info_set (session, GNUTLS_CRD_PSK, + sizeof (psk_auth_info_st), 1)) < 0) + { + gnutls_assert (); + return ret; + } + + DECR_LEN (data_size, 2); + psk_size = _gnutls_read_uint16 (data); + DECR_LEN (data_size, psk_size); + data += 2 + psk_size; + + ret = _gnutls_proc_dh_common_server_kx (session, data, data_size); + if (ret < 0) + { + gnutls_assert (); + return ret; + } + + return 0; +} + +static int +proc_ecdhe_psk_server_kx (gnutls_session_t session, uint8_t * data, size_t _data_size) { @@ -376,10 +454,7 @@ proc_psk_server_kx (gnutls_session_t session, uint8_t * data, DECR_LEN (data_size, psk_size); data += 2 + psk_size; - if (!_gnutls_session_is_ecc (session)) - ret = _gnutls_proc_dh_common_server_kx (session, data, data_size); - else - ret = _gnutls_proc_ecdh_common_server_kx (session, data, data_size); + ret = _gnutls_proc_ecdh_common_server_kx (session, data, data_size); if (ret < 0) { gnutls_assert (); diff --git a/lib/auth/ecdh_common.c b/lib/auth/ecdhe.c similarity index 66% rename from lib/auth/ecdh_common.c rename to lib/auth/ecdhe.c index 2cc06a45e2..0c75caa9a4 100644 --- a/lib/auth/ecdh_common.c +++ b/lib/auth/ecdhe.c @@ -25,22 +25,66 @@ * procedure of the certificate and anoymous authentication. */ -#include "gnutls_int.h" +#include #include "gnutls_auth.h" #include "gnutls_errors.h" #include "gnutls_dh.h" #include "gnutls_num.h" #include "gnutls_sig.h" +#include #include #include -#include -#include +#include #include #include #include #include +#include #include +static int gen_ecdhe_server_kx (gnutls_session_t, gnutls_buffer_st*); +static int +proc_ecdhe_server_kx (gnutls_session_t session, + uint8_t * data, size_t _data_size); +static int +proc_ecdhe_client_kx (gnutls_session_t session, + uint8_t * data, size_t _data_size); + +#if defined(ENABLE_ECDHE) +const mod_auth_st ecdhe_ecdsa_auth_struct = { + "ECDHE_ECDSA", + _gnutls_gen_cert_server_crt, + _gnutls_gen_cert_client_crt, + gen_ecdhe_server_kx, + _gnutls_gen_ecdh_common_client_kx, /* This is the only difference */ + _gnutls_gen_cert_client_crt_vrfy, + _gnutls_gen_cert_server_cert_req, + + _gnutls_proc_crt, + _gnutls_proc_crt, + proc_ecdhe_server_kx, + proc_ecdhe_client_kx, + _gnutls_proc_cert_client_crt_vrfy, + _gnutls_proc_cert_cert_req +}; + +const mod_auth_st ecdhe_rsa_auth_struct = { + "ECDHE_RSA", + _gnutls_gen_cert_server_crt, + _gnutls_gen_cert_client_crt, + gen_ecdhe_server_kx, + _gnutls_gen_ecdh_common_client_kx, /* This is the only difference */ + _gnutls_gen_cert_client_crt_vrfy, + _gnutls_gen_cert_server_cert_req, + + _gnutls_proc_crt, + _gnutls_proc_crt, + proc_ecdhe_server_kx, + proc_ecdhe_client_kx, + _gnutls_proc_cert_client_crt_vrfy, + _gnutls_proc_cert_cert_req +}; + static int calc_ecdh_key( gnutls_session_t session, gnutls_datum_t * psk_key) { gnutls_pk_params_st pub; @@ -88,15 +132,12 @@ cleanup: _gnutls_mpi_release (&session->key.ecdh_y); gnutls_pk_params_release( &session->key.ecdh_params); return ret; - } - -int -_gnutls_proc_ecdh_common_client_kx (gnutls_session_t session, +int _gnutls_proc_ecdh_common_client_kx(gnutls_session_t session, uint8_t * data, size_t _data_size, - gnutls_ecc_curve_t curve, - gnutls_datum_t *psk_key) + gnutls_ecc_curve_t curve, + gnutls_datum_t* psk_key) { ssize_t data_size = _data_size; int ret, i = 0; @@ -118,10 +159,28 @@ _gnutls_proc_ecdh_common_client_kx (gnutls_session_t session, ret = calc_ecdh_key(session, psk_key); if (ret < 0) return gnutls_assert_val(ret); - + return 0; } +static int +proc_ecdhe_client_kx (gnutls_session_t session, + uint8_t * data, size_t _data_size) +{ + gnutls_certificate_credentials_t cred; + + cred = (gnutls_certificate_credentials_t) + _gnutls_get_cred (session, GNUTLS_CRD_CERTIFICATE, NULL); + if (cred == NULL) + { + gnutls_assert (); + return GNUTLS_E_INSUFFICIENT_CREDENTIALS; + } + + return _gnutls_proc_ecdh_common_client_kx(session, data, _data_size, + _gnutls_session_ecc_curve_get(session), NULL); +} + int _gnutls_gen_ecdh_common_client_kx (gnutls_session_t session, gnutls_buffer_st* data) @@ -163,10 +222,26 @@ _gnutls_gen_ecdh_common_client_kx_int (gnutls_session_t session, return data->length; } -/* Returns the bytes parsed */ +static int +proc_ecdhe_server_kx (gnutls_session_t session, + uint8_t * data, size_t _data_size) +{ +int ret; +gnutls_datum_t vparams; + + ret = _gnutls_proc_ecdh_common_server_kx(session, data, _data_size); + if (ret < 0) + return gnutls_assert_val(ret); + + vparams.data = data; + vparams.size = ret; + + return _gnutls_proc_dhe_signature(session, data+ret, _data_size-ret, &vparams); +} + int _gnutls_proc_ecdh_common_server_kx (gnutls_session_t session, - uint8_t * data, size_t _data_size) + uint8_t * data, size_t _data_size) { int i, ret, point_size; gnutls_ecc_curve_t curve; @@ -243,3 +318,37 @@ int _gnutls_ecdh_common_print_server_kx (gnutls_session_t session, gnutls_buffer return data->length; } + +static int +gen_ecdhe_server_kx (gnutls_session_t session, gnutls_buffer_st* data) +{ + int ret = 0; + gnutls_certificate_credentials_t cred; + + cred = (gnutls_certificate_credentials_t) + _gnutls_get_cred (session, GNUTLS_CRD_CERTIFICATE, NULL); + if (cred == NULL) + { + gnutls_assert (); + return GNUTLS_E_INSUFFICIENT_CREDENTIALS; + } + + if ((ret = _gnutls_auth_info_set (session, GNUTLS_CRD_CERTIFICATE, + sizeof (cert_auth_info_st), 0)) < 0) + { + gnutls_assert (); + return ret; + } + + ret = _gnutls_ecdh_common_print_server_kx (session, data, _gnutls_session_ecc_curve_get(session)); + if (ret < 0) + { + gnutls_assert (); + return ret; + } + + /* Generate the signature. */ + return _gnutls_gen_dhe_signature(session, data, data->data, data->length); +} + +#endif diff --git a/lib/auth/ecdh_common.h b/lib/auth/ecdhe.h similarity index 100% rename from lib/auth/ecdh_common.h rename to lib/auth/ecdhe.h diff --git a/lib/auth/rsa_export.c b/lib/auth/rsa_export.c index e78049c0fc..cf09f8d908 100644 --- a/lib/auth/rsa_export.c +++ b/lib/auth/rsa_export.c @@ -42,6 +42,8 @@ #include #include +#ifdef ENABLE_RSA_EXPORT + int _gnutls_gen_rsa_client_kx (gnutls_session_t, gnutls_buffer_st*); static int gen_rsa_export_server_kx (gnutls_session_t, gnutls_buffer_st*); static int proc_rsa_export_server_kx (gnutls_session_t, uint8_t *, size_t); @@ -461,3 +463,5 @@ proc_rsa_export_server_kx (gnutls_session_t session, return ret; } + +#endif diff --git a/lib/gnutls_handshake.c b/lib/gnutls_handshake.c index 3f1a418c5e..39b67ee8e9 100644 --- a/lib/gnutls_handshake.c +++ b/lib/gnutls_handshake.c @@ -3177,10 +3177,12 @@ check_server_params (gnutls_session_t session, dh_params = _gnutls_get_dh_params (x509_cred->dh_params, x509_cred->params_func, session); +#ifdef ENABLE_RSA_EXPORT rsa_params = _gnutls_certificate_get_rsa_params (x509_cred->rsa_params, x509_cred->params_func, session); +#endif } /* Check also if the certificate supports the @@ -3234,6 +3236,7 @@ check_server_params (gnutls_session_t session, return 0; /* no need for params */ +#ifdef ENABLE_RSA_EXPORT /* If the key exchange method needs RSA or DH params, * but they are not set then remove it. */ @@ -3246,6 +3249,7 @@ check_server_params (gnutls_session_t session, return 1; } } +#endif if (_gnutls_kx_needs_dh_params (kx) != 0) { diff --git a/lib/gnutls_kx.c b/lib/gnutls_kx.c index 65ad007c3b..d84303f762 100644 --- a/lib/gnutls_kx.c +++ b/lib/gnutls_kx.c @@ -459,7 +459,7 @@ _gnutls_recv_server_kx_message (gnutls_session_t session) if (session->internals.auth_struct->gnutls_process_server_kx != NULL) { - +#ifdef ENABLE_RSA_EXPORT /* EXCEPTION FOR RSA_EXPORT cipher suite */ if (_gnutls_session_is_export (session) != 0 && @@ -468,6 +468,7 @@ _gnutls_recv_server_kx_message (gnutls_session_t session) gnutls_assert (); return 0; } +#endif /* Server key exchange packet is optional for PSK. */ if (_gnutls_session_is_psk (session)) diff --git a/lib/gnutls_priority.c b/lib/gnutls_priority.c index 753787bcb1..09dbbb55b6 100644 --- a/lib/gnutls_priority.c +++ b/lib/gnutls_priority.c @@ -293,10 +293,14 @@ static const int protocol_priority_suiteb[] = { static const int kx_priority_performance[] = { GNUTLS_KX_RSA, +#ifdef ENABLE_ECDHE GNUTLS_KX_ECDHE_ECDSA, GNUTLS_KX_ECDHE_RSA, +#endif +#ifdef ENABLE_DHE GNUTLS_KX_DHE_RSA, GNUTLS_KX_DHE_DSS, +#endif 0 }; @@ -307,11 +311,17 @@ static const int kx_priority_suiteb[] = { static const int kx_priority_export[] = { GNUTLS_KX_RSA, +#ifdef ENABLE_ECDHE GNUTLS_KX_ECDHE_ECDSA, GNUTLS_KX_ECDHE_RSA, +#endif +#ifdef ENABLE_DHE GNUTLS_KX_DHE_RSA, GNUTLS_KX_DHE_DSS, +#endif +#ifdef ENABLE_RSA_EXPORT GNUTLS_KX_RSA_EXPORT, +#endif 0 }; @@ -319,15 +329,19 @@ static const int kx_priority_secure[] = { /* The ciphersuites that offer forward secrecy take * precedence */ +#ifdef ENABLE_ECDHE GNUTLS_KX_ECDHE_ECDSA, GNUTLS_KX_ECDHE_RSA, +#endif GNUTLS_KX_RSA, /* KX-RSA is now ahead of DHE-RSA and DHE-DSS due to the compatibility * issues the DHE ciphersuites have. That is, one cannot enforce a specific * security level without dropping the connection. */ +#ifdef ENABLE_DHE GNUTLS_KX_DHE_RSA, GNUTLS_KX_DHE_DSS, +#endif /* GNUTLS_KX_ANON_DH: Man-in-the-middle prone, don't add! * GNUTLS_KX_RSA_EXPORT: Deprecated, don't add! */ diff --git a/lib/gnutls_rsa_export.c b/lib/gnutls_rsa_export.c index 64d3d87388..954abf3ee6 100644 --- a/lib/gnutls_rsa_export.c +++ b/lib/gnutls_rsa_export.c @@ -31,6 +31,8 @@ #include "x509/x509_int.h" #include "debug.h" +#ifdef ENABLE_RSA_EXPORT + /* returns e and m, depends on the requested bits. * We only support limited key sizes. */ @@ -232,3 +234,5 @@ gnutls_rsa_params_export_raw (gnutls_rsa_params_t rsa, return 0; } + +#endif diff --git a/lib/gnutls_state.c b/lib/gnutls_state.c index 6d16ab0845..3f768f7798 100644 --- a/lib/gnutls_state.c +++ b/lib/gnutls_state.c @@ -230,11 +230,15 @@ _gnutls_session_cert_type_supported (gnutls_session_t session, inline static void deinit_internal_params (gnutls_session_t session) { +#if defined(ENABLE_DHE) || defined(ENABLE_ANON) if (session->internals.params.free_dh_params) gnutls_dh_params_deinit (session->internals.params.dh_params); +#endif +#ifdef ENABLE_RSA_EXPORT if (session->internals.params.free_rsa_params) gnutls_rsa_params_deinit (session->internals.params.rsa_params); +#endif _gnutls_handshake_hash_buffers_clear (session); diff --git a/lib/gnutls_ui.c b/lib/gnutls_ui.c index 321b2f724e..e8b12c3797 100644 --- a/lib/gnutls_ui.c +++ b/lib/gnutls_ui.c @@ -71,6 +71,7 @@ int gnutls_random_art (gnutls_random_art_t type, /* ANON & DHE */ +#if defined(ENABLE_DHE) || defined(ENABLE_ANON) /** * gnutls_dh_set_prime_bits: * @session: is a #gnutls_session_t structure. @@ -230,57 +231,6 @@ gnutls_dh_get_pubkey (gnutls_session_t session, gnutls_datum_t * raw_key) dh->public_key.size); } -/** - * gnutls_rsa_export_get_pubkey: - * @session: is a gnutls session - * @exponent: will hold the exponent. - * @modulus: will hold the modulus. - * - * This function will return the peer's public key exponent and - * modulus used in the last RSA-EXPORT authentication. The output - * parameters must be freed with gnutls_free(). - * - * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise - * an error code is returned. - **/ -int -gnutls_rsa_export_get_pubkey (gnutls_session_t session, - gnutls_datum_t * exponent, - gnutls_datum_t * modulus) -{ - cert_auth_info_t info; - int ret; - - if (gnutls_auth_get_type (session) == GNUTLS_CRD_CERTIFICATE) - { - info = _gnutls_get_auth_info (session); - if (info == NULL) - return GNUTLS_E_INTERNAL_ERROR; - - ret = _gnutls_set_datum (modulus, info->rsa_export.modulus.data, - info->rsa_export.modulus.size); - if (ret < 0) - { - gnutls_assert (); - return ret; - } - - ret = _gnutls_set_datum (exponent, info->rsa_export.exponent.data, - info->rsa_export.exponent.size); - if (ret < 0) - { - gnutls_assert (); - _gnutls_free_datum (modulus); - return ret; - } - - return 0; - } - - return GNUTLS_E_INVALID_REQUEST; -} - - /** * gnutls_dh_get_secret_bits: * @session: is a gnutls session @@ -331,6 +281,7 @@ gnutls_dh_get_secret_bits (gnutls_session_t session) } } + static int mpi_buf2bits (gnutls_datum_t * mpi_buf) { @@ -410,26 +361,6 @@ gnutls_dh_get_prime_bits (gnutls_session_t session) return mpi_buf2bits (&dh->prime); } -/** - * gnutls_rsa_export_get_modulus_bits: - * @session: is a gnutls session - * - * Get the export RSA parameter's modulus size. - * - * Returns: The bits used in the last RSA-EXPORT key exchange with the - * peer, or a negative error code in case of error. - **/ -int -gnutls_rsa_export_get_modulus_bits (gnutls_session_t session) -{ - cert_auth_info_t info; - - info = _gnutls_get_auth_info (session); - if (info == NULL) - return GNUTLS_E_INTERNAL_ERROR; - - return mpi_buf2bits (&info->rsa_export.modulus); -} /** * gnutls_dh_get_peers_public_bits: @@ -489,6 +420,27 @@ gnutls_dh_get_peers_public_bits (gnutls_session_t session) return mpi_buf2bits (&dh->public_key); } +/** + * gnutls_certificate_set_dh_params: + * @res: is a gnutls_certificate_credentials_t structure + * @dh_params: is a structure that holds 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 */ /** @@ -651,26 +603,6 @@ gnutls_fingerprint (gnutls_digest_algorithm_t algo, return 0; } - -/** - * gnutls_certificate_set_dh_params: - * @res: is a gnutls_certificate_credentials_t structure - * @dh_params: is a structure that holds 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; -} - /** * gnutls_certificate_set_params_function: * @res: is a gnutls_certificate_credentials_t structure @@ -687,7 +619,6 @@ gnutls_certificate_set_params_function (gnutls_certificate_credentials_t res, res->params_func = func; } - /** * gnutls_certificate_set_verify_flags: * @res: is a gnutls_certificate_credentials_t structure @@ -725,22 +656,7 @@ gnutls_certificate_set_verify_limits (gnutls_certificate_credentials_t res, res->verify_bits = max_bits; } -/** - * gnutls_certificate_set_rsa_export_params: - * @res: is a gnutls_certificate_credentials_t structure - * @rsa_params: is a structure that holds temporary RSA parameters. - * - * This function will set the temporary RSA parameters for a - * certificate server to use. These parameters will be used in - * RSA-EXPORT cipher suites. - **/ -void -gnutls_certificate_set_rsa_export_params (gnutls_certificate_credentials_t - res, gnutls_rsa_params_t rsa_params) -{ - res->rsa_params = rsa_params; -} - +#ifdef ENABLE_PSK /** * gnutls_psk_set_params_function: * @res: is a gnutls_psk_server_credentials_t structure @@ -756,7 +672,9 @@ gnutls_psk_set_params_function (gnutls_psk_server_credentials_t res, { res->params_func = func; } +#endif +#ifdef ENABLE_ANON /** * gnutls_anon_set_params_function: * @res: is a gnutls_anon_server_credentials_t structure @@ -772,6 +690,7 @@ gnutls_anon_set_params_function (gnutls_anon_server_credentials_t res, { res->params_func = func; } +#endif /** * gnutls_load_file: @@ -828,3 +747,94 @@ gnutls_ocsp_status_request_is_checked (gnutls_session_t session, unsigned int fl { return session->internals.ocsp_check_ok; } + +#ifdef ENABLE_RSA_EXPORT + +/** + * gnutls_rsa_export_get_pubkey: + * @session: is a gnutls session + * @exponent: will hold the exponent. + * @modulus: will hold the modulus. + * + * This function will return the peer's public key exponent and + * modulus used in the last RSA-EXPORT authentication. The output + * parameters must be freed with gnutls_free(). + * + * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise + * an error code is returned. + **/ +int +gnutls_rsa_export_get_pubkey (gnutls_session_t session, + gnutls_datum_t * exponent, + gnutls_datum_t * modulus) +{ + cert_auth_info_t info; + int ret; + + if (gnutls_auth_get_type (session) == GNUTLS_CRD_CERTIFICATE) + { + info = _gnutls_get_auth_info (session); + if (info == NULL) + return GNUTLS_E_INTERNAL_ERROR; + + ret = _gnutls_set_datum (modulus, info->rsa_export.modulus.data, + info->rsa_export.modulus.size); + if (ret < 0) + { + gnutls_assert (); + return ret; + } + + ret = _gnutls_set_datum (exponent, info->rsa_export.exponent.data, + info->rsa_export.exponent.size); + if (ret < 0) + { + gnutls_assert (); + _gnutls_free_datum (modulus); + return ret; + } + + return 0; + } + + return GNUTLS_E_INVALID_REQUEST; +} + +/** + * gnutls_rsa_export_get_modulus_bits: + * @session: is a gnutls session + * + * Get the export RSA parameter's modulus size. + * + * Returns: The bits used in the last RSA-EXPORT key exchange with the + * peer, or a negative error code in case of error. + **/ +int +gnutls_rsa_export_get_modulus_bits (gnutls_session_t session) +{ + cert_auth_info_t info; + + info = _gnutls_get_auth_info (session); + if (info == NULL) + return GNUTLS_E_INTERNAL_ERROR; + + return mpi_buf2bits (&info->rsa_export.modulus); +} + +/** + * gnutls_certificate_set_rsa_export_params: + * @res: is a gnutls_certificate_credentials_t structure + * @rsa_params: is a structure that holds temporary RSA parameters. + * + * This function will set the temporary RSA parameters for a + * certificate server to use. These parameters will be used in + * RSA-EXPORT cipher suites. + **/ +void +gnutls_certificate_set_rsa_export_params (gnutls_certificate_credentials_t + res, gnutls_rsa_params_t rsa_params) +{ + res->rsa_params = rsa_params; +} + +#endif diff --git a/m4/hooks.m4 b/m4/hooks.m4 index 35fa68b7ce..366006e229 100644 --- a/m4/hooks.m4 +++ b/m4/hooks.m4 @@ -211,7 +211,49 @@ fi AC_MSG_RESULT(yes) fi AM_CONDITIONAL(ENABLE_ANON, test "$ac_enable_anon" != "no") - + + AC_MSG_CHECKING([whether to disable DHE support]) + AC_ARG_ENABLE(dhe, + AS_HELP_STRING([--disable-dhe], + [disable the DHE support]), + ac_enable_dhe=$enableval, ac_enable_dhe=yes) + if test x$ac_enable_dhe != xno; then + AC_MSG_RESULT(no) + AC_DEFINE([ENABLE_DHE], 1, [enable DHE]) + else + ac_full=0 + AC_MSG_RESULT(yes) + fi + AM_CONDITIONAL(ENABLE_DHE, test "$ac_enable_dhe" != "no") + + AC_MSG_CHECKING([whether to disable ECDHE support]) + AC_ARG_ENABLE(ecdhe, + AS_HELP_STRING([--disable-ecdhe], + [disable the ECDHE support]), + ac_enable_ecdhe=$enableval, ac_enable_ecdhe=yes) + if test x$ac_enable_ecdhe != xno; then + AC_MSG_RESULT(no) + AC_DEFINE([ENABLE_ECDHE], 1, [enable DHE]) + else + ac_full=0 + AC_MSG_RESULT(yes) + fi + AM_CONDITIONAL(ENABLE_ECDHE, test "$ac_enable_ecdhe" != "no") + + AC_MSG_CHECKING([whether to disable RSA-EXPORT support]) + AC_ARG_ENABLE(rsa-export, + AS_HELP_STRING([--disable-rsa-export], + [disable the RSA-EXPORT support]), + ac_enable_rsa_export=$enableval, ac_enable_rsa_export=yes) + if test x$ac_enable_rsa_export != xno; then + AC_MSG_RESULT(no) + AC_DEFINE([ENABLE_RSA_EXPORT], 1, [enable RSA-EXPORT]) + else + ac_full=0 + AC_MSG_RESULT(yes) + fi + AM_CONDITIONAL(ENABLE_RSA_EXPORT, test "$ac_enable_rsa_export" != "no") + ac_enable_openpgp=yes AC_MSG_CHECKING([whether to disable OpenPGP Certificate authentication support]) AC_ARG_ENABLE(openpgp-authentication,