]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Added options to disable more key exchange mechanisms.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Mon, 11 Mar 2013 19:15:07 +0000 (20:15 +0100)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Mon, 11 Mar 2013 23:20:31 +0000 (00:20 +0100)
In that DHE was separated from ECDHE.

20 files changed:
configure.ac
lib/algorithms/ciphersuites.c
lib/algorithms/kx.c
lib/auth/Makefile.am
lib/auth/anon_ecdh.c
lib/auth/cert.c
lib/auth/cert.h
lib/auth/dh_common.c
lib/auth/dhe.c
lib/auth/dhe_psk.c
lib/auth/ecdhe.c [moved from lib/auth/ecdh_common.c with 66% similarity]
lib/auth/ecdhe.h [moved from lib/auth/ecdh_common.h with 100% similarity]
lib/auth/rsa_export.c
lib/gnutls_handshake.c
lib/gnutls_kx.c
lib/gnutls_priority.c
lib/gnutls_rsa_export.c
lib/gnutls_state.c
lib/gnutls_ui.c
m4/hooks.m4

index 28d3ddc5abfcaf37a04bbedefb229a2cb16fa049..01c8a9977d1ca6c841510fe0f1f755e2a1439dc9 100644 (file)
@@ -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
 ])
index e5fdc3ac54eda3fccae1953986b8b2186919cd00..817f07b6596d8381ae7a40bb02f3e3518e6bfcd5 100644 (file)
@@ -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}
 };
 
index ccd0dbbe880524ba16a44a128cb6c51576abd152..430f8bc04ad222913a4d52ba48ee9236a055614f 100644 (file)
@@ -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}
 };
index 504a44822b5cc56b530b177cee3fae9dfbd9abbe..1d5d8da888888426c8065bb1f3635f11b4c6ef99 100644 (file)
@@ -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
index 233cdddf236e13fd190175801fc73ef52722ccd6..622fc2c1dfb3e8bcdf61e98363e4c1034b99bc22 100644 (file)
@@ -36,7 +36,7 @@
 #include "gnutls_num.h"
 #include "gnutls_mpi.h"
 #include <gnutls_state.h>
-#include <auth/ecdh_common.h>
+#include <auth/ecdhe.h>
 #include <ext/ecc.h>
 
 static int gen_anon_ecdh_server_kx (gnutls_session_t, gnutls_buffer_st*);
index 3bf0509612eeeaa77da32333c7f50d13c3b8c2d7..77538eb4ec2c9418eae86ed00c7ece3e1d8181c2 100644 (file)
@@ -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;
+}
index a98dfcfd3865441336dfc08a36c526f245ee1bdc..18a383df220eb4c605d1f5ce7693f3c52b9b0754 100644 (file)
@@ -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
index a953577f8f961d1a7e49851cf10d43526812ac6b..0d7f088cb707dde49cde8494fbc044724e56c373 100644 (file)
@@ -38,6 +38,8 @@
 #include <algorithms.h>
 #include <auth/psk.h>
 
+#if defined(ENABLE_DHE) || defined(ENABLE_ANON)
+
 /* Frees the dh_info_st structure.
  */
 void
@@ -322,3 +324,5 @@ cleanup:
 
   return ret;
 }
+
+#endif
index 164e966ae545d0a5093c7d16fa47ba67eb97e4bc..24732d6f923996f31fca9e3223130b463fe7b17d 100644 (file)
 #include <gnutls_x509.h>
 #include <gnutls_state.h>
 #include <auth/dh_common.h>
-#include <auth/ecdh_common.h>
+#include <auth/ecdhe.h>
 
 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);
 }
index 017369fc9038ebd89e980e3d0f3c83516bfaf390..a51aaa130529e86d0db89245d545af3096a23c72 100644 (file)
 #include "gnutls_mpi.h"
 #include <gnutls_state.h>
 #include <auth/dh_common.h>
-#include <auth/ecdh_common.h>
+#include <auth/ecdhe.h>
 #include <gnutls_datum.h>
 #include <auth/psk_passwd.h>
 
-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 ();
similarity index 66%
rename from lib/auth/ecdh_common.c
rename to lib/auth/ecdhe.c
index 2cc06a45e2f931f2d59b2ff0f96494c53f88e876..0c75caa9a4c50f2d1f7f365f70bd93da02fe3471 100644 (file)
  * procedure of the certificate and anoymous authentication.
  */
 
-#include "gnutls_int.h"
+#include <gnutls_int.h>
 #include "gnutls_auth.h"
 #include "gnutls_errors.h"
 #include "gnutls_dh.h"
 #include "gnutls_num.h"
 #include "gnutls_sig.h"
+#include <gnutls_state.h>
 #include <gnutls_datum.h>
 #include <gnutls_x509.h>
-#include <gnutls_state.h>
-#include <auth/ecdh_common.h>
+#include <auth/ecdhe.h>
 #include <gnutls_ecc.h>
 #include <ext/ecc.h>
 #include <algorithms.h>
 #include <auth/psk.h>
+#include <auth/cert.h>
 #include <gnutls_pk.h>
 
+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_tpsk_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
similarity index 100%
rename from lib/auth/ecdh_common.h
rename to lib/auth/ecdhe.h
index e78049c0fc01468677295fe53d87e78e31c63ad9..cf09f8d908993ed9a585f78ce0c52804036c29da 100644 (file)
@@ -42,6 +42,8 @@
 #include <random.h>
 #include <abstract_int.h>
 
+#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
index 3f1a418c5e031fbc3d4870e1992e680cd7604b67..39b67ee8e9d95386de36c76fddd1d7905bac2902 100644 (file)
@@ -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)
     {
index 65ad007c3b0833ae1c8fe386116ba55836c4f33e..d84303f7620dcf463a735fa8cade16dd62a52670 100644 (file)
@@ -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))
index 753787bcb1c4ed0f7119de8cc7f2a982391b754d..09dbbb55b66bcdf2790647a4ec98e5dd7b13d721 100644 (file)
@@ -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!
    */
index 64d3d87388683850b5af243a42fc3f68d726df2b..954abf3ee6454e4ee569821b1343e075952be091 100644 (file)
@@ -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
index 6d16ab08451a2551c2c39c0aee73d1a9bf590017..3f768f7798ec57ee57d288238c18c2b107a639af 100644 (file)
@@ -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);
 
index 321b2f724e3edc69645ffb34df9d0bbdcd7e8651..e8b12c379770bfa5544ad47d1bca563bc3f24454 100644 (file)
@@ -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
index 35fa68b7cec40cfc8d6fd0b217ddb88d2d1a89a2..366006e22931f25449b27e4a228b0a7c9195a3ae 100644 (file)
@@ -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,