]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
added some preliminary support for DHE_DSS and DHE_RSA algorithms... of course
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Wed, 1 Nov 2000 12:38:20 +0000 (12:38 +0000)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Wed, 1 Nov 2000 12:38:20 +0000 (12:38 +0000)
not certificates are used

lib/defines.h
lib/gnutls.c
lib/gnutls_algorithms.c
lib/gnutls_buffers.c
lib/gnutls_cipher.c
lib/gnutls_errors.c
lib/gnutls_errors.h
lib/gnutls_handshake.c
lib/gnutls_int.h
lib/gnutls_kx.c

index ac4e6e7e87333c025381ecbdbb46436515dc7f02..31f0fd8b26970154ed56eb61bb3471eab732eadc 100644 (file)
@@ -1,5 +1,4 @@
 #include <config.h>
-#include <assert.h>
 
 #ifdef STDC_HEADERS
 # include <string.h>
index 46e0fc29e94bd203e8fcb9dab319ea5b795a39ae..36b05207657b5024e3e893413a541fbee24e4023 100644 (file)
@@ -338,7 +338,7 @@ ssize_t gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type, char *data
        if (sizeofdata == 0)
                return 0;
        if (state->gnutls_internals.valid_connection == VALID_FALSE) {
-               assert(0);
+               gnutls_assert();
                return GNUTLS_E_INVALID_SESSION;
        }
 
@@ -376,21 +376,21 @@ ssize_t gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type, char *data
                if (Write(cd, &gcipher->type, 1) != 1) {
                        state->gnutls_internals.valid_connection = VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
 
                if (Write(cd, &gcipher->version.major, 1) != 1) {
                        state->gnutls_internals.valid_connection = VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
 
                if (Write(cd, &gcipher->version.minor, 1) != 1) {
                        state->gnutls_internals.valid_connection = VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
 #ifdef HARD_DEBUG
@@ -405,14 +405,14 @@ ssize_t gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type, char *data
                if (Write(cd, &length, sizeof(uint16)) != sizeof(uint16)) {
                        state->gnutls_internals.valid_connection = VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
 
                if (Write(cd, gcipher->fragment, gcipher->length) != gcipher->length) {
                        state->gnutls_internals.valid_connection = VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
                state->connection_state.write_sequence_number++;
@@ -451,31 +451,31 @@ ssize_t gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type, char *data
                if (Write(cd, &gcipher->type, 1) != 1) {
                        state->gnutls_internals.valid_connection = VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
                if (Write(cd, &gcipher->version.major, 1) != 1) {
                        state->gnutls_internals.valid_connection = VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
                if (Write(cd, &gcipher->version.minor, 1) != 1) {
                        state->gnutls_internals.valid_connection = VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
                if (Write(cd, &length, sizeof(uint16)) != sizeof(uint16)) {
                        state->gnutls_internals.valid_connection = VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
                if (Write(cd, gcipher->fragment, gcipher->length) != gcipher->length) {
                        state->gnutls_internals.valid_connection = VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
                state->connection_state.write_sequence_number++;
@@ -510,28 +510,28 @@ ssize_t gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, char *data
        }
 
        if (state->gnutls_internals.valid_connection == VALID_FALSE) {
-               assert(0);
+               gnutls_assert();
                return GNUTLS_E_INVALID_SESSION;
        }
 
        if (Read(cd, &gcipher.type, 1) != 1) {
                state->gnutls_internals.valid_connection = VALID_FALSE;
                state->gnutls_internals.resumable = RESUME_FALSE;
-               assert(0);
+               gnutls_assert();
                return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
        }
 
        if (Read(cd, &gcipher.version.major, 1) != 1) {
                state->gnutls_internals.valid_connection = VALID_FALSE;
                state->gnutls_internals.resumable = RESUME_FALSE;
-               assert(0);
+               gnutls_assert();
                return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
        }
 
        if (Read(cd, &gcipher.version.minor, 1) != 1) {
                state->gnutls_internals.valid_connection = VALID_FALSE;
                state->gnutls_internals.resumable = RESUME_FALSE;
-               assert(0);
+               gnutls_assert();
                return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
        }
 
@@ -541,14 +541,14 @@ ssize_t gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, char *data
 #endif
                _gnutls_send_alert(cd, state, GNUTLS_FATAL, GNUTLS_PROTOCOL_VERSION);
                state->gnutls_internals.resumable = RESUME_FALSE;
-               assert(0);
+               gnutls_assert();
                return GNUTLS_E_UNSUPPORTED_VERSION_PACKET;
        }
 
        if (Read(cd, &gcipher.length, 2) != 2) {
                state->gnutls_internals.valid_connection = VALID_FALSE;
                state->gnutls_internals.resumable = RESUME_FALSE;
-               assert(0);
+               gnutls_assert();
                return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
        }
 #ifndef WORDS_BIGENDIAN
@@ -569,7 +569,7 @@ ssize_t gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, char *data
                _gnutls_send_alert(cd, state, GNUTLS_FATAL, GNUTLS_RECORD_OVERFLOW);
                state->gnutls_internals.valid_connection = VALID_FALSE;
                state->gnutls_internals.resumable = RESUME_FALSE;
-               assert(0);
+               gnutls_assert();
                return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
        }
        gcipher.fragment = gnutls_malloc(gcipher.length);
@@ -586,7 +586,7 @@ ssize_t gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, char *data
                gnutls_free(gcipher.fragment);
                state->gnutls_internals.valid_connection = VALID_FALSE;
                state->gnutls_internals.resumable = RESUME_FALSE;
-               assert(0);
+               gnutls_assert();
                return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
        }
 
@@ -658,7 +658,7 @@ ssize_t gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, char *data
                case GNUTLS_CHANGE_CIPHER_SPEC:
 
                        if (type != GNUTLS_CHANGE_CIPHER_SPEC) {
-                               assert(0);
+                               gnutls_assert();
                                return GNUTLS_E_UNEXPECTED_PACKET;
                        }
                        if (((ChangeCipherSpecType)
@@ -668,14 +668,14 @@ ssize_t gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, char *data
                        } else {
                                state->gnutls_internals.valid_connection = VALID_FALSE;
                                state->gnutls_internals.resumable = RESUME_FALSE;
-                               assert(0);
+                               gnutls_assert();
                                ret = GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
                        }
                        state->connection_state.read_sequence_number++;
                        return ret;
 
                default:
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNKNOWN_ERROR;
                }
        }
@@ -693,7 +693,7 @@ ssize_t gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, char *data
                gnutls_free(tmpdata);
        } else {
                if (gcipher.type != type) {
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_RECEIVED_BAD_MESSAGE;
                }
                /* this is an error because we have messages of fixed
index bc40d06875d6b36e8fb90ce414f8aa2c26ecbb2d..c97ada1db34e11e2b21d5415adad562f9d08509b 100644 (file)
@@ -38,7 +38,7 @@ typedef struct gnutls_cipher_entry gnutls_cipher_entry;
 
 static gnutls_cipher_entry algorithms[] = {
        GNUTLS_CIPHER_ENTRY(GNUTLS_3DES, 8, 24, 1, 8, -1),
-       GNUTLS_CIPHER_ENTRY(GNUTLS_ARCFOUR, 1, 16, 0, 0, -1),
+       GNUTLS_CIPHER_ENTRY(GNUTLS_ARCFOUR, 1, 16, 0, 0, -2),
        GNUTLS_CIPHER_ENTRY(GNUTLS_NULL, 1, 0, 0, 0, -1),
        {0}
 };
@@ -96,11 +96,11 @@ typedef struct gnutls_kx_algo_entry gnutls_kx_algo_entry;
 
 static gnutls_kx_algo_entry kx_algorithms[] = {
        GNUTLS_KX_ALGO_ENTRY(GNUTLS_KX_ANON_DH, 0, 1, 0, 0, 1, -1),
-       GNUTLS_KX_ALGO_ENTRY(GNUTLS_KX_RSA, 1, 0, 1, 1, 0, -1),
+       GNUTLS_KX_ALGO_ENTRY(GNUTLS_KX_RSA, 1, 0, 1, 1, 0, -2),
        GNUTLS_KX_ALGO_ENTRY(GNUTLS_KX_DHE_DSS, 1, 1, 1, 0, 0, -1),
-       GNUTLS_KX_ALGO_ENTRY(GNUTLS_KX_DHE_RSA, 1, 1, 1, 0, 0, -1),
-       GNUTLS_KX_ALGO_ENTRY(GNUTLS_KX_DH_DSS, 1, 0, 1, 0, 0, -1),
-       GNUTLS_KX_ALGO_ENTRY(GNUTLS_KX_DH_RSA, 1, 0, 1, 0, 0, -1),
+       GNUTLS_KX_ALGO_ENTRY(GNUTLS_KX_DHE_RSA, 1, 1, 1, 0, 0, -2),
+       GNUTLS_KX_ALGO_ENTRY(GNUTLS_KX_DH_DSS, 1, 0, 1, 0, 0, -2),
+       GNUTLS_KX_ALGO_ENTRY(GNUTLS_KX_DH_RSA, 1, 0, 1, 0, 0, -2),
        {0}
 };
 
@@ -183,7 +183,7 @@ int _gnutls_mac_get_digest_size(MACAlgorithm algorithm)
 
 void _gnutls_mac_set_priority(MACAlgorithm algorithm, int prio)
 {
-       GNUTLS_HASH_ALG_LOOP(p->priority=prio);
+       GNUTLS_HASH_ALG_LOOP( if (p->priority >= -1) p->priority=prio);
 }
 
 int _gnutls_mac_priority(MACAlgorithm algorithm) /* actually returns the priority */
@@ -259,7 +259,7 @@ int _gnutls_cipher_get_block_size(BulkCipherAlgorithm algorithm)
 
 void _gnutls_cipher_set_priority(BulkCipherAlgorithm algorithm, int prio)
 {
-       GNUTLS_ALG_LOOP(p->priority=prio);
+       GNUTLS_ALG_LOOP(if (p->priority >= -1) p->priority=prio);
 }
 
  /* returns the priority */
@@ -360,7 +360,7 @@ int _gnutls_kx_server_certificate(KXAlgorithm algorithm)
 
 void _gnutls_kx_set_priority(KXAlgorithm algorithm, int prio)
 {
-       GNUTLS_KX_ALG_LOOP(p->priority=prio);
+       GNUTLS_KX_ALG_LOOP(if (p->priority >= -1) p->priority=prio);
 }
 
 
index 08f5f92c98471e346ca8085887bcc8207a4b17f7..78bad50ebac58eaa5ab93900abb7dbe906c2c5ff 100644 (file)
@@ -113,6 +113,10 @@ ssize_t Read(int fd, void *iptr, size_t sizeOfPtr)
        size_t left;
        ssize_t i=0;
        char *ptr = iptr;
+#ifdef DEBUG
+       int j,x, sum=0;
+#endif
+
 
        left = sizeOfPtr;
        while (left > 0) {
@@ -128,6 +132,21 @@ ssize_t Read(int fd, void *iptr, size_t sizeOfPtr)
 
        }
 
+#ifdef DEBUG
+       fprintf(stderr, "read %d bytes from %d\n", (sizeOfPtr-left), fd);
+       for (x=0;x<((sizeOfPtr-left)/16)+1;x++) {
+               fprintf(stderr, "%.4x - ",x);
+               for (j=0;j<16;j++) {
+                       if (sum<(sizeOfPtr-left)) {
+                               fprintf(stderr, "%.2x ", ((unsigned char*)ptr)[sum++]);
+                       }
+               }
+               fprintf(stderr, "\n");
+       
+       }
+#endif
+
+
        return (sizeOfPtr - left);
 }
 
@@ -135,9 +154,25 @@ ssize_t Read(int fd, void *iptr, size_t sizeOfPtr)
 ssize_t Write(int fd, const void *iptr, size_t n)
 {
        size_t left;
+#ifdef DEBUG
+       int j,x, sum=0;
+#endif
        ssize_t i = 0;
        const char *ptr = iptr;
 
+#ifdef DEBUG
+       fprintf(stderr, "wrote %d bytes to %d\n", n, fd);
+       for (x=0;x<(n/16)+1;x++) {
+               fprintf(stderr, "%.4x - ",x);
+               for (j=0;j<16;j++) {
+                       if (sum<n) {
+                               fprintf(stderr, "%.2x ", ((unsigned char*)ptr)[sum++]);
+                       }
+               }
+               fprintf(stderr, "\n");
+       
+       }
+#endif
        left = n;
        while (left > 0) {
                i = write(fd, &ptr[i], left);
index 43295c8a2d707a286c485917a5800c60735deb20..10b4d142ad64626cf1262f6bb6a3b49e7c0e6f3d 100644 (file)
@@ -44,7 +44,10 @@ int _gnutls_set_cipher(GNUTLS_STATE state, BulkCipherAlgorithm algo)
 {
 
        if (_gnutls_cipher_is_ok(algo) == 0) {
-               if (_gnutls_cipher_priority(algo) < 0) return GNUTLS_E_UNWANTED_ALGORITHM;
+               if (_gnutls_cipher_priority(algo) < 0) {
+                       gnutls_assert();
+                       return GNUTLS_E_UNWANTED_ALGORITHM;
+               }
 
                state->security_parameters.bulk_cipher_algorithm = algo;
                if (_gnutls_cipher_is_block(algo) == 1) {
@@ -61,6 +64,7 @@ int _gnutls_set_cipher(GNUTLS_STATE state, BulkCipherAlgorithm algo)
                state->security_parameters.IV_size =
                    _gnutls_cipher_get_iv_size(algo);
        } else {
+               gnutls_assert();
                return GNUTLS_E_UNKNOWN_CIPHER;
        }
 
@@ -77,6 +81,7 @@ int _gnutls_set_compression(GNUTLS_STATE state, CompressionMethod algo)
                break;
 
        default:
+               gnutls_assert();
                return GNUTLS_E_UNKNOWN_COMPRESSION_ALGORITHM;
        }
        return 0;
@@ -90,9 +95,13 @@ int _gnutls_set_mac(GNUTLS_STATE state, MACAlgorithm algo)
        if (_gnutls_mac_is_ok(algo) == 0) {
                state->security_parameters.mac_algorithm = algo;
        } else {
+               gnutls_assert();
                return GNUTLS_E_UNKNOWN_MAC_ALGORITHM;
        }
-       if (_gnutls_mac_priority(algo) < 0) return GNUTLS_E_UNWANTED_ALGORITHM;
+       if (_gnutls_mac_priority(algo) < 0) {
+               gnutls_assert();
+               return GNUTLS_E_UNWANTED_ALGORITHM;
+       }
        state->security_parameters.hash_size = _gnutls_mac_get_digest_size(algo);
        
        return 0;
@@ -161,6 +170,7 @@ int _gnutls_connection_state_init(GNUTLS_STATE state)
                state->connection_state.write_compression_state = NULL;
                break;
        default:
+               gnutls_assert();
                return GNUTLS_E_UNKNOWN_COMPRESSION_ALGORITHM;
        }
 
@@ -175,6 +185,7 @@ int _gnutls_connection_state_init(GNUTLS_STATE state)
                        state->connection_state.write_mac_secret = gnutls_malloc(mac_size);
                }
        } else {
+               gnutls_assert();
                return GNUTLS_E_UNKNOWN_MAC_ALGORITHM;
        }
 
@@ -187,6 +198,7 @@ int _gnutls_connection_state_init(GNUTLS_STATE state)
                          state->cipher_specs.server_write_IV,
                          state->security_parameters.IV_size);
                if (state->connection_state.write_cipher_state==GNUTLS_CIPHER_FAILED && state->security_parameters.bulk_cipher_algorithm!=GNUTLS_NULL) {
+                       gnutls_assert();
                        return GNUTLS_E_UNKNOWN_CIPHER;
                }
 
@@ -208,6 +220,7 @@ int _gnutls_connection_state_init(GNUTLS_STATE state)
                          state->cipher_specs.client_write_IV,
                          state->security_parameters.IV_size);
                if (state->connection_state.read_cipher_state==GNUTLS_CIPHER_FAILED && state->security_parameters.bulk_cipher_algorithm!=GNUTLS_NULL) {
+                       gnutls_assert();
                        return GNUTLS_E_UNKNOWN_CIPHER;
                }
        
@@ -221,6 +234,7 @@ int _gnutls_connection_state_init(GNUTLS_STATE state)
                          state->cipher_specs.server_write_IV,
                          state->security_parameters.IV_size);
                if (state->connection_state.read_cipher_state==GNUTLS_CIPHER_FAILED && state->security_parameters.bulk_cipher_algorithm!=GNUTLS_NULL) {
+                       gnutls_assert();
                        return GNUTLS_E_UNKNOWN_CIPHER;
                }
 
@@ -242,11 +256,13 @@ int _gnutls_connection_state_init(GNUTLS_STATE state)
                          state->cipher_specs.client_write_IV,
                          state->security_parameters.IV_size);
                if (state->connection_state.write_cipher_state==GNUTLS_CIPHER_FAILED && state->security_parameters.bulk_cipher_algorithm!=GNUTLS_NULL) {
+                       gnutls_assert();
                        return GNUTLS_E_UNKNOWN_CIPHER;
                }
                break;
 
        default:
+               gnutls_assert();
                return GNUTLS_E_UNKNOWN_ERROR;
        }
 
@@ -286,6 +302,7 @@ int _gnutls_TLSCompressed2TLSCiphertext(GNUTLS_STATE state,
        if (td == GNUTLS_MAC_FAILED && state->security_parameters.mac_algorithm!=GNUTLS_MAC_NULL) {
                gnutls_free(*cipher);
                gnutls_free(content);
+               gnutls_assert();
                return GNUTLS_E_UNKNOWN_MAC_ALGORITHM;
        }
 
@@ -381,6 +398,7 @@ int _gnutls_TLSCompressed2TLSCiphertext(GNUTLS_STATE state,
        default:
                gnutls_free(*cipher);
                gnutls_free(content);
+               gnutls_assert();
                return GNUTLS_E_UNKNOWN_CIPHER_TYPE;
        }
 
@@ -423,6 +441,7 @@ int _gnutls_TLSCiphertext2TLSCompressed(GNUTLS_STATE state,
        if (td==GNUTLS_MAC_FAILED && state->security_parameters.mac_algorithm!=GNUTLS_MAC_NULL) {
                gnutls_free(*compress);
                gnutls_free(content);
+               gnutls_assert();
                return GNUTLS_E_UNKNOWN_MAC_ALGORITHM;
        }
 
@@ -454,8 +473,10 @@ int _gnutls_TLSCiphertext2TLSCompressed(GNUTLS_STATE state,
                            state->connection_state.mac_secret_size - pad -
                            1;
 
-                       if (pad > ciphertext->length - state->connection_state.mac_secret_size)
+                       if (pad > ciphertext->length - state->connection_state.mac_secret_size) {
+                               gnutls_assert();
                                return GNUTLS_E_RECEIVED_BAD_MESSAGE;
+                       }
                        data = gnutls_malloc(length);
                        memmove(data, content, length);
 
@@ -470,6 +491,7 @@ int _gnutls_TLSCiphertext2TLSCompressed(GNUTLS_STATE state,
        default:
                gnutls_free(*compress);
                gnutls_free(content);
+               gnutls_assert();
                return GNUTLS_E_UNKNOWN_CIPHER_TYPE;
        }
 
@@ -498,6 +520,7 @@ int _gnutls_TLSCiphertext2TLSCompressed(GNUTLS_STATE state,
 #ifdef DEBUG
                fprintf(stderr, "MAC FAILED\n");
 #endif
+               gnutls_assert();
                return GNUTLS_E_MAC_FAILED;
        }
 
index f75a8bb786c7d1b5a5483d645c6728ce16c6e358..3955b9d2793213ef3de228ad4387153832e115fb 100644 (file)
@@ -99,3 +99,26 @@ void gnutls_perror(int error)
        
        free( ret);
 }
+
+char* gnutls_strerror(int error)
+{
+       char *ret = NULL;
+       char *pointerTo_;
+
+       /* avoid prefix */
+       GNUTLS_ERROR_ALG_LOOP(ret =
+                             strdup(p->name + sizeof("GNUTLS_E_") - 1));
+
+
+       if (ret != NULL) {
+               tolow(ret, strlen(ret));
+               pointerTo_ = strchr(ret, '_');
+
+               while (pointerTo_ != NULL) {
+                       *pointerTo_ = ' ';
+                       pointerTo_ = strchr(ret, '_');
+               }
+       }
+       
+       return ret;
+}
index 47ecde51338ce44d1d660c71696034b9833275b5..be1d46301d18af45db5c411ba5dc9ef465627ba4 100644 (file)
@@ -1,3 +1,5 @@
+#include "gnutls_int.h"
+
 #define        GNUTLS_E_MAC_FAILED  -1
 #define        GNUTLS_E_UNKNOWN_CIPHER -2
 #define        GNUTLS_E_UNKNOWN_COMPRESSION_ALGORITHM -3
 #define GNUTLS_E_UNIMPLEMENTED_FEATURE -50
 
 
+#ifdef DEBUG
+# ifdef __FILE__
+#  ifdef __LINE__
+#   define gnutls_assert() fprintf(stderr, "GNUTLS_ASSERT: %s:%d\n", __FILE__,__LINE__);
+#  else
+#   define gnutls_assert() 1
+#  endif
+# else /* __FILE__ defined */
+#  define gnutls_assert() 1
+# endif
+#else /* no debug */
+# define gnutls_assert() 1
+#endif
 
-
+char* gnutls_strerror(int error);
 void gnutls_perror(int error);
 int gnutls_is_fatal_error( int error);
index d9e37d4f19e93f3d5f6edc84e9a8cb1440c16afb..054b59e0091e5ea6f5f6c33de8178e6c7c384258 100644 (file)
@@ -101,7 +101,7 @@ int _gnutls_recv_finished(int cd, GNUTLS_STATE state)
                return ret;
        }
        if (vrfysize != 12) {
-               assert(0);
+               gnutls_assert();
                return GNUTLS_E_ERROR_IN_FINISHED_PACKET;
        }
 
@@ -126,7 +126,7 @@ int _gnutls_recv_finished(int cd, GNUTLS_STATE state)
        }
 
        if (memcmp(vrfy, data, 12) != 0) {
-               assert(0);
+               gnutls_assert();
                ret = GNUTLS_E_ERROR_IN_FINISHED_PACKET;
        }
 
@@ -137,7 +137,7 @@ int _gnutls_recv_finished(int cd, GNUTLS_STATE state)
 }
 
 
-
+/* This selects the best supported ciphersuite from the ones provided */
 int SelectSuite(opaque ret[2], char *data, int datalen)
 {
        int x, i, j;
@@ -169,10 +169,12 @@ int SelectSuite(opaque ret[2], char *data, int datalen)
 
 
        gnutls_free(ciphers);
+       gnutls_assert();
        return GNUTLS_E_UNKNOWN_CIPHER_SUITE;
 
 }
 
+/* This selects the best supported compression method from the ones provided */
 int SelectCompMethod(CompressionMethod * ret, char *data, int datalen)
 {
        int x, i, j;
@@ -180,9 +182,11 @@ int SelectCompMethod(CompressionMethod * ret, char *data, int datalen)
 
        x = _gnutls_supported_compression_methods(&ciphers);
        memset(ret, '\0', sizeof(CompressionMethod));
-
+fprintf(stderr, "datalen: %d\n",datalen);
        for (j = 0; j < datalen; j++) {
                for (i = 0; i < x; i++) {
+                       fprintf(stderr, "cipher[%d] = %u\n", i, ciphers[i]);
+                       fprintf(stderr, "data[%d] = %u\n", j, data[j]);
                        if (memcmp(&ciphers[i], &data[j], 1) == 0) {
                                memmove(ret, &ciphers[i], 1);
                                gnutls_free(ciphers);
@@ -193,6 +197,7 @@ int SelectCompMethod(CompressionMethod * ret, char *data, int datalen)
 
 
        gnutls_free(ciphers);
+       gnutls_assert();
        return GNUTLS_E_UNKNOWN_COMPRESSION_ALGORITHM;
 
 }
@@ -296,7 +301,7 @@ int _gnutls_recv_handshake(int cd, GNUTLS_STATE state, uint8 **data,
        ret = _gnutls_Recv_int(cd, state, GNUTLS_HANDSHAKE, dataptr, 4);
        if (ret < 0) return ret;
        if (ret!=4) {
-               assert(0);
+               gnutls_assert();
                return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
        }
 
@@ -305,7 +310,7 @@ int _gnutls_recv_handshake(int cd, GNUTLS_STATE state, uint8 **data,
 #endif
 
        if (dataptr[0]!=type) {
-               assert(0);
+               gnutls_assert();
                return GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET;
        }
        
@@ -407,6 +412,9 @@ int _gnutls_send_hello(int cd, GNUTLS_STATE state, opaque * SessionID,
        if (state->security_parameters.entity == GNUTLS_CLIENT) {
 
                datalen = 2 + 4 + (session_id_len + 1) + 28 + 3;
+               /* 2 for version, 4 for unix time, 28 for random bytes 2 for cipher suite's
+                * size and 1 for compression method's size 
+                */
                data = gnutls_malloc(datalen);
 
                data[pos++] = state->connection_state.version.major;
@@ -433,8 +441,7 @@ int _gnutls_send_hello(int cd, GNUTLS_STATE state, opaque * SessionID,
                }
                pos += session_id_len;
 
-               x = _gnutls_supported_ciphersuites(&cipher_suites);
-
+               x = _gnutls_supported_ciphersuites(&cipher_suites)*sizeof(uint16);
 #ifdef WORDS_BIGENDIAN
                memmove(&data[pos], &x, sizeof(uint16));
 #else
@@ -453,16 +460,13 @@ int _gnutls_send_hello(int cd, GNUTLS_STATE state, opaque * SessionID,
                        pos += 2;
                }
 
-               z =
-                   _gnutls_supported_compression_methods
+               z = _gnutls_supported_compression_methods
                    (&compression_methods);
-               memmove(&data[pos++], &z, sizeof(uint8));
-               datalen += z;
+               memmove(&data[pos++], &z, 1); /* put the number of compression methods */
+               datalen += z; 
                data = gnutls_realloc(data, datalen);
-
                for (i = 0; i < z; i++) {
-                       memmove(&data[pos], &compression_methods[i], 1);
-                       pos++;
+                       memmove(&data[pos++], &compression_methods[i], 1);
                }
 
                gcry_free(rand);
@@ -542,7 +546,7 @@ int _gnutls_recv_hello(int cd, GNUTLS_STATE state, char *data, int datalen,
 
        if (state->security_parameters.entity == GNUTLS_CLIENT) {
                if (datalen < 38) {
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
                }
 
@@ -561,7 +565,7 @@ int _gnutls_recv_hello(int cd, GNUTLS_STATE state, char *data, int datalen,
                memmove(&session_id_len, &data[pos++], 1);
 
                if (datalen < 38 + session_id_len) {
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNSUPPORTED_VERSION_PACKET;
                }
 #ifdef HARD_DEBUG
@@ -618,7 +622,7 @@ int _gnutls_recv_hello(int cd, GNUTLS_STATE state, char *data, int datalen,
 
        } else {                /* Server side reading a client hello */
                if (datalen < 35) {
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
                }
 
@@ -627,7 +631,7 @@ int _gnutls_recv_hello(int cd, GNUTLS_STATE state, char *data, int datalen,
 #endif
 
                if ( _gnutls_valid_version( state, data[pos], data[pos+1]) != 0) {
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNSUPPORTED_VERSION_PACKET;
                }
                pos+=2;
@@ -652,16 +656,18 @@ int _gnutls_recv_hello(int cd, GNUTLS_STATE state, char *data, int datalen,
 #endif
                ret = SelectSuite(state->gnutls_internals.
                            current_cipher_suite.CipherSuite, &data[pos],
-                           sizeOfSuites);
+                           sizeOfSuites); /* *2 because it's 2 bytes each */
 
                if (ret<0) return ret;
                
                pos += sizeOfSuites;
 
-               memmove(&z, &data[pos++], 1);
+               memmove(&z, &data[pos++], 1); /* z is the number of compression methods */
                ret = SelectCompMethod(&state->
                                 gnutls_internals.compression_method,
                                 &data[pos], z);
+               pos+=z;
+               
                if (ret<0) return ret;
        }
 
@@ -680,7 +686,7 @@ int _gnutls_recv_certificate(int cd, GNUTLS_STATE state, char *data, int datalen
        
        if (state->security_parameters.entity == GNUTLS_CLIENT) {
                if (datalen < 2) {
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
                }
 
@@ -694,7 +700,7 @@ int _gnutls_recv_certificate(int cd, GNUTLS_STATE state, char *data, int datalen
                sizeOfCert=byteswap32(sizeOfCert);
 #endif
                if (sizeOfCert > MAX24) {
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
                }
                certificate_list = gnutls_malloc(sizeOfCert);
@@ -708,7 +714,7 @@ int _gnutls_recv_certificate(int cd, GNUTLS_STATE state, char *data, int datalen
        } else {                /* Server side reading a client certificate */
                /* actually this is not complete */
                if (datalen < 1) {
-                       assert(0);
+                       gnutls_assert();
                        return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
                }
 
index 4236b950997d5b962393ff732336d2bb90c6b67f..ea46943a447777b6607581493736c35d44b01f8f 100644 (file)
@@ -1,6 +1,9 @@
+#ifndef GNUTLS_INT_H
+
 #include <gcrypt.h>
 
-#undef NDEBUG
+#define GNUTLS_INT_H
+
 #define HARD_DEBUG
 #define DEBUG
 
@@ -292,3 +295,5 @@ int _gnutls_set_keys(GNUTLS_STATE state);
 ssize_t gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type, char* data, size_t sizeofdata);
 ssize_t gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, char* data, size_t sizeofdata);
 int _gnutls_send_change_cipher_spec(int cd, GNUTLS_STATE state);
+
+#endif /* GNUTLS_INT_H */
index 800b7963af6fd16e6b71227b6ae16bae91c6efee..db2fa896324bb8f89395539f98ba10b573669894 100644 (file)
@@ -39,11 +39,11 @@ int _gnutls_send_server_kx_message(int cd, GNUTLS_STATE state)
        GNUTLS_MPI x, X, g, p;
        int n_X, n_g, n_p;
        uint16 _n_X, _n_g, _n_p;
-       uint8 *data=NULL;
+       uint8 *data = NULL;
        uint8 *data_p;
        uint8 *data_g;
        uint8 *data_X;
-       int ret=0;
+       int ret = 0;
 
 #ifdef HARD_DEBUG
        fprintf(stderr, "Sending server KX message\n");
@@ -55,54 +55,44 @@ int _gnutls_send_server_kx_message(int cd, GNUTLS_STATE state)
 
        /* Do key exchange only if the algorithm permits it */
        if (_gnutls_kx_server_key_exchange(algorithm) != 0) {
-
-               if ( _gnutls_cipher_suite_get_kx_algo(state->gnutls_internals.current_cipher_suite) == GNUTLS_KX_ANON_DH) {
+               switch (_gnutls_cipher_suite_get_kx_algo
+                       (state->gnutls_internals.current_cipher_suite)) {
+               case GNUTLS_KX_ANON_DH:
+               case GNUTLS_KX_DHE_DSS:
+               case GNUTLS_KX_DHE_RSA:
                        X = gnutls_calc_dh_secret(&x);
-
                        state->gnutls_internals.dh_secret = x;
-
                        g = gnutls_get_dh_params(&p);
-
-                       gcry_mpi_print(GCRYMPI_FMT_STD, NULL,
-                                      &n_g, g);
-                       gcry_mpi_print(GCRYMPI_FMT_STD, NULL,
-                                      &n_p, p);
-                       gcry_mpi_print(GCRYMPI_FMT_STD, NULL,
-                                      &n_X, X);
-                       data = gnutls_malloc( n_g+n_p+n_X+6);
-
+                       gcry_mpi_print(GCRYMPI_FMT_STD, NULL, &n_g, g);
+                       gcry_mpi_print(GCRYMPI_FMT_STD, NULL, &n_p, p);
+                       gcry_mpi_print(GCRYMPI_FMT_STD, NULL, &n_X, X);
+                       data = gnutls_malloc(n_g + n_p + n_X + 6);
                        data_p = &data[0];
                        gcry_mpi_print(GCRYMPI_FMT_STD, &data_p[2],
                                       &n_p, p);
                        gnutls_mpi_release(p);
-
                        _n_p = n_p;
-
 #ifndef WORDS_BIGENDIAN
                        _n_p = byteswap16(_n_p);
                        memmove(data_p, &_n_p, 2);
 #else
                        memmove(data_p, &_n_p, 2);
 #endif
-
-                       data_g = &data_p[2+n_p];
+                       data_g = &data_p[2 + n_p];
                        gcry_mpi_print(GCRYMPI_FMT_STD, &data_g[2],
                                       &n_g, g);
                        gnutls_mpi_release(g);
                        _n_g = n_g;
 #ifndef WORDS_BIGENDIAN
-
                        _n_g = byteswap16(_n_g);
                        memmove(data_g, &_n_g, 2);
 #else
                        memmove(data_g, &_n_g, 2);
 #endif
-
-                       data_X = &data_g[2+n_g];
+                       data_X = &data_g[2 + n_g];
                        gcry_mpi_print(GCRYMPI_FMT_STD, &data_X[2],
                                       &n_X, X);
                        gnutls_mpi_release(X);
-                       
                        _n_X = n_X;
 #ifndef WORDS_BIGENDIAN
                        _n_X = byteswap16(_n_X);
@@ -110,19 +100,19 @@ int _gnutls_send_server_kx_message(int cd, GNUTLS_STATE state)
 #else
                        memmove(data_X, &_n_X, 2);
 #endif
-
                        ret =
                            _gnutls_send_handshake(cd, state, data,
                                                   n_p + n_g + n_X + 6,
                                                   GNUTLS_SERVER_KEY_EXCHANGE);
                        gnutls_free(data);
-               } else {
+                       break;
+               default:
+                       gnutls_assert();
                        ret = GNUTLS_E_UNKNOWN_KX_ALGORITHM;
                }
        }
 
        return ret;
-
 }
 
 /* This is the function for the client to send the key
@@ -135,92 +125,88 @@ int _gnutls_send_client_kx_message(int cd, GNUTLS_STATE state)
        int n_X;
        uint16 _n_X;
        uint8 *data;
-       int ret=0;
-       uint8 *premaster=NULL;
-       int premaster_size=0;
-       svoid* master;
-       char* random = gnutls_malloc(64);
-       
+       int ret = 0;
+       uint8 *premaster = NULL;
+       int premaster_size = 0;
+       svoid *master;
+       char *random = gnutls_malloc(64);
 #ifdef HARD_DEBUG
        fprintf(stderr, "Sending client KX message\n");
 #endif
-       memmove( random, state->security_parameters.client_random, 32);
-       memmove( &random[32], state->security_parameters.server_random, 32);
-
+       memmove(random, state->security_parameters.client_random, 32);
+       memmove(&random[32], state->security_parameters.server_random, 32);
        algorithm =
-           _gnutls_cipher_suite_get_kx_algo(state->
-                                            gnutls_internals.current_cipher_suite);
-
-       if ( _gnutls_cipher_suite_get_kx_algo(state->gnutls_internals.current_cipher_suite) == GNUTLS_KX_ANON_DH) {
-
-
-                       X = _gnutls_calc_dh_secret(&x, state->gnutls_internals.client_g, state->gnutls_internals.client_p);
-
-                       gcry_mpi_print(GCRYMPI_FMT_STD, NULL,
-                                      &n_X, X);
-                       data = gnutls_malloc(n_X+3);
-                       
-                       gcry_mpi_print(GCRYMPI_FMT_STD, &data[3],
-                                      &n_X, X);
-
-                       data[0] = 1; /* extern */
-
-                       gnutls_mpi_release(X);
-                       
-                       _n_X = n_X;
+           _gnutls_cipher_suite_get_kx_algo
+           (state->gnutls_internals.current_cipher_suite);
+
+       switch (_gnutls_cipher_suite_get_kx_algo
+               (state->gnutls_internals.current_cipher_suite)) {
+       case GNUTLS_KX_ANON_DH:
+       case GNUTLS_KX_DHE_DSS:
+       case GNUTLS_KX_DHE_RSA:
+               X =
+                   _gnutls_calc_dh_secret(&x,
+                                          state->
+                                          gnutls_internals.client_g,
+                                          state->
+                                          gnutls_internals.client_p);
+               gcry_mpi_print(GCRYMPI_FMT_STD, NULL, &n_X, X);
+               data = gnutls_malloc(n_X + 3);
+               gcry_mpi_print(GCRYMPI_FMT_STD, &data[3], &n_X, X);
+               data[0] = 1;    /* extern */
+               gnutls_mpi_release(X);
+               _n_X = n_X;
 #ifndef WORDS_BIGENDIAN
-                       _n_X = byteswap16(_n_X);
-                       memmove(&data[1], &_n_X, 2);
+               _n_X = byteswap16(_n_X);
+               memmove(&data[1], &_n_X, 2);
 #else
-                       memmove(&data[1], &_n_X, 2);
+               memmove(&data[1], &_n_X, 2);
 #endif
-
-                       ret =
-                           _gnutls_send_handshake(cd, state, data,
-                                                  n_X + 3,
-                                                  GNUTLS_CLIENT_KEY_EXCHANGE);
-                       gnutls_free(data);
-                       
-                       /* calculate the key after sending the message */
-                       state->gnutls_internals.KEY = _gnutls_calc_dh_key( state->gnutls_internals.client_Y, x, state->gnutls_internals.client_p);
-                       gcry_mpi_print(GCRYMPI_FMT_STD, NULL,
-                                      &premaster_size, state->gnutls_internals.KEY);
-
-                       premaster = secure_malloc( premaster_size);
-                       gcry_mpi_print(GCRYMPI_FMT_STD, premaster,
-                                      &premaster_size, state->gnutls_internals.KEY);
-
-                       /* THIS SHOULD BE DISCARDED */
-                       gnutls_mpi_release(state->gnutls_internals.KEY);
-                       gnutls_mpi_release(state->gnutls_internals.client_Y);
-                       gnutls_mpi_release(state->gnutls_internals.client_p);
-                       gnutls_mpi_release(state->gnutls_internals.client_g);
-                       state->gnutls_internals.KEY=NULL;
-                       state->gnutls_internals.client_Y=NULL;
-                       state->gnutls_internals.client_p=NULL;
-                       state->gnutls_internals.client_g=NULL;
-               } else {
-                       ret = GNUTLS_E_UNKNOWN_KX_ALGORITHM;
+               ret =
+                   _gnutls_send_handshake(cd, state, data,
+                                          n_X + 3,
+                                          GNUTLS_CLIENT_KEY_EXCHANGE);
+               gnutls_free(data);
+               /* calculate the key after sending the message */
+               state->gnutls_internals.KEY =
+                   _gnutls_calc_dh_key(state->gnutls_internals.client_Y,
+                                       x,
+                                       state->gnutls_internals.client_p);
+               gcry_mpi_print(GCRYMPI_FMT_STD, NULL, &premaster_size,
+                              state->gnutls_internals.KEY);
+               premaster = secure_malloc(premaster_size);
+               gcry_mpi_print(GCRYMPI_FMT_STD, premaster,
+                              &premaster_size,
+                              state->gnutls_internals.KEY);
+               /* THIS SHOULD BE DISCARDED */
+               gnutls_mpi_release(state->gnutls_internals.KEY);
+               gnutls_mpi_release(state->gnutls_internals.client_Y);
+               gnutls_mpi_release(state->gnutls_internals.client_p);
+               gnutls_mpi_release(state->gnutls_internals.client_g);
+               state->gnutls_internals.KEY = NULL;
+               state->gnutls_internals.client_Y = NULL;
+               state->gnutls_internals.client_p = NULL;
+               state->gnutls_internals.client_g = NULL;
+               break;
+       default:
+               gnutls_assert();
+               ret = GNUTLS_E_UNKNOWN_KX_ALGORITHM;
        }
 
-       master = gnutls_PRF( premaster, premaster_size, MASTER_SECRET, strlen(MASTER_SECRET),
-                                               random, 64 ,48);
+       master =
+           gnutls_PRF(premaster, premaster_size,
+                      MASTER_SECRET, strlen(MASTER_SECRET), random, 64,
+                      48);
        secure_free(premaster);
-
 #ifdef HARD_DEBUG
        fprintf(stderr, "master secret: %s\n", bin2hex(master, 48));
 #endif
-       memmove( state->security_parameters.master_secret, master, 48);
-
+       memmove(state->security_parameters.master_secret, master, 48);
        secure_free(master);
        gnutls_free(random);
-       
        return ret;
-
 }
 
-/* We have this as an upper limit, since the record layer defines this
- * as a maximum packet length */
 
 int _gnutls_recv_server_kx_message(int cd, GNUTLS_STATE state)
 {
@@ -232,68 +218,79 @@ int _gnutls_recv_server_kx_message(int cd, GNUTLS_STATE state)
        uint8 *data_p;
        uint8 *data_g;
        uint8 *data_Y;
-       int ret=0, i;
-
+       int ret = 0, i;
 #ifdef HARD_DEBUG
        fprintf(stderr, "Receiving Server KX message\n");
 #endif
        algorithm =
-           _gnutls_cipher_suite_get_kx_algo(state->
-                                            gnutls_internals.current_cipher_suite);
-
+           _gnutls_cipher_suite_get_kx_algo
+           (state->gnutls_internals.current_cipher_suite);
        /* Do key exchange only if the algorithm permits it */
        if (_gnutls_kx_server_key_exchange(algorithm) != 0) {
 
-               if ( _gnutls_cipher_suite_get_kx_algo(state->gnutls_internals.current_cipher_suite) == GNUTLS_KX_ANON_DH) {
-
-                       ret = _gnutls_recv_handshake(cd, state, &data, &datasize, GNUTLS_SERVER_KEY_EXCHANGE);
-
-                       if (ret < 0) return ret;
-                       
-                       i=0;
-                       memmove( &n_p, &data[i], 2);
-                       i+=2;
-
+               switch (_gnutls_cipher_suite_get_kx_algo
+                       (state->gnutls_internals.current_cipher_suite)) {
+               case GNUTLS_KX_ANON_DH:
+               case GNUTLS_KX_DHE_DSS:
+               case GNUTLS_KX_DHE_RSA:
+                       ret =
+                           _gnutls_recv_handshake(cd, state, &data,
+                                                  &datasize,
+                                                  GNUTLS_SERVER_KEY_EXCHANGE);
+                       if (ret < 0)
+                               return ret;
+                       i = 0;
+                       memmove(&n_p, &data[i], 2);
+                       i += 2;
 #ifndef WORDS_BIGENDIAN
                        n_p = byteswap16(n_p);
 #endif
                        data_p = &data[i];
-                       i+=n_p; 
-                       if (i>datasize) return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
-                       
-                       memmove( &n_g, &data[i], 2);
+                       i += n_p;
+                       if (i > datasize) {
+                               gnutls_assert();
+                               return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
+                       }
+                       memmove(&n_g, &data[i], 2);
 #ifndef WORDS_BIGENDIAN
                        n_g = byteswap16(n_g);
 #endif
-                       i+=2;
+                       i += 2;
                        data_g = &data[i];
-                       i+=n_g;
-                       if (i>datasize) return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
-                       
-                       memmove( &n_Y, &data[i], 2);
-                       i+=2;
+                       i += n_g;
+                       if (i > datasize) {
+                               gnutls_assert();
+                               return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
+                       }
+                       memmove(&n_Y, &data[i], 2);
+                       i += 2;
 #ifndef WORDS_BIGENDIAN
                        n_Y = byteswap16(n_Y);
 #endif
                        data_Y = &data[i];
-                       i+=n_Y;
-                       if (i>datasize) return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
-                       
+                       i += n_Y;
+                       if (i > datasize) {
+                               gnutls_assert();
+                               return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
+                       }
                        _n_Y = n_Y;
                        _n_g = n_g;
                        _n_p = n_p;
-                       
-                       gcry_mpi_scan( &state->gnutls_internals.client_Y, GCRYMPI_FMT_STD, data_Y, &_n_Y);
-                       gcry_mpi_scan( &state->gnutls_internals.client_g, GCRYMPI_FMT_STD, data_g, &_n_g);
-                       gcry_mpi_scan( &state->gnutls_internals.client_p, GCRYMPI_FMT_STD, data_p, &_n_p);
+                       gcry_mpi_scan(&state->gnutls_internals.client_Y,
+                                     GCRYMPI_FMT_STD, data_Y, &_n_Y);
+                       gcry_mpi_scan(&state->gnutls_internals.client_g,
+                                     GCRYMPI_FMT_STD, data_g, &_n_g);
+                       gcry_mpi_scan(&state->gnutls_internals.client_p,
+                                     GCRYMPI_FMT_STD, data_p, &_n_p);
                        gnutls_free(data);
-               } else {
+                       break;
+               default:
+                       gnutls_assert();
                        ret = GNUTLS_E_UNKNOWN_KX_ALGORITHM;
                }
        }
 
        return ret;
-
 }
 
 int _gnutls_recv_client_kx_message(int cd, GNUTLS_STATE state)
@@ -303,76 +300,82 @@ int _gnutls_recv_client_kx_message(int cd, GNUTLS_STATE state)
        int _n_Y;
        uint8 *data;
        int datasize;
-       int ret=0;
-       uint8 *premaster=NULL;
-       int premaster_size=0;
-       svoid* master;
-       uint8* random = gnutls_malloc(64);
-
+       int ret = 0;
+       uint8 *premaster = NULL;
+       int premaster_size = 0;
+       svoid *master;
+       uint8 *random = gnutls_malloc(64);
 #ifdef HARD_DEBUG
        fprintf(stderr, "Receiving client KX message\n");
-#endif 
-       memmove( random, state->security_parameters.client_random, 32);
-       memmove( &random[32], state->security_parameters.server_random, 32);
-
+#endif
+       memmove(random, state->security_parameters.client_random, 32);
+       memmove(&random[32], state->security_parameters.server_random, 32);
        algorithm =
-           _gnutls_cipher_suite_get_kx_algo(state->
-                                            gnutls_internals.current_cipher_suite);
-
+           _gnutls_cipher_suite_get_kx_algo
+           (state->gnutls_internals.current_cipher_suite);
        /* Do key exchange only if the algorithm permits it */
        if (_gnutls_kx_server_key_exchange(algorithm) != 0) {
 
-               if ( _gnutls_cipher_suite_get_kx_algo(state->gnutls_internals.current_cipher_suite) == GNUTLS_KX_ANON_DH) {
-
-                       ret = _gnutls_recv_handshake(cd, state, &data, &datasize, GNUTLS_CLIENT_KEY_EXCHANGE);
-                       if (ret < 0) return ret;
-                       
-                       if ( data[0] != 1) return GNUTLS_E_UNIMPLEMENTED_FEATURE;
-
-                       memmove( &n_Y, &data[1], 2);
+               switch (_gnutls_cipher_suite_get_kx_algo
+                       (state->gnutls_internals.current_cipher_suite)) {
+               case GNUTLS_KX_ANON_DH:
+               case GNUTLS_KX_DHE_DSS:
+               case GNUTLS_KX_DHE_RSA:
+                       ret =
+                           _gnutls_recv_handshake(cd, state, &data,
+                                                  &datasize,
+                                                  GNUTLS_CLIENT_KEY_EXCHANGE);
+                       if (ret < 0)
+                               return ret;
+                       if (data[0] != 1) {
+                               gnutls_assert();
+                               return GNUTLS_E_UNIMPLEMENTED_FEATURE;
+                       }
+                       memmove(&n_Y, &data[1], 2);
 #ifndef WORDS_BIGENDIAN
                        n_Y = byteswap16(n_Y);
 #endif
-
                        _n_Y = n_Y;
-                       
-                       gcry_mpi_scan( &state->gnutls_internals.client_Y, GCRYMPI_FMT_STD, &data[3], &_n_Y);
-                       state->gnutls_internals.KEY = gnutls_calc_dh_key( state->gnutls_internals.client_Y, state->gnutls_internals.dh_secret);
-
+                       gcry_mpi_scan(&state->gnutls_internals.client_Y,
+                                     GCRYMPI_FMT_STD, &data[3], &_n_Y);
+                       state->gnutls_internals.KEY =
+                           gnutls_calc_dh_key(state->
+                                              gnutls_internals.client_Y,
+                                              state->
+                                              gnutls_internals.dh_secret);
                        gcry_mpi_print(GCRYMPI_FMT_STD, NULL,
-                                      &premaster_size, state->gnutls_internals.KEY);
-
+                                      &premaster_size,
+                                      state->gnutls_internals.KEY);
                        premaster = secure_malloc(premaster_size);
                        gcry_mpi_print(GCRYMPI_FMT_STD, premaster,
-                                      &premaster_size, state->gnutls_internals.KEY);
-
+                                      &premaster_size,
+                                      state->gnutls_internals.KEY);
                        /* THESE SHOULD BE DISCARDED */
                        gnutls_mpi_release(state->gnutls_internals.KEY);
-                       gnutls_mpi_release(state->gnutls_internals.client_Y);
-                       gnutls_mpi_release(state->gnutls_internals.dh_secret);
-                       state->gnutls_internals.KEY=NULL;
-                       state->gnutls_internals.client_Y=NULL;
-                       state->gnutls_internals.dh_secret=NULL;
+                       gnutls_mpi_release(state->
+                                          gnutls_internals.client_Y);
+                       gnutls_mpi_release(state->
+                                          gnutls_internals.dh_secret);
+                       state->gnutls_internals.KEY = NULL;
+                       state->gnutls_internals.client_Y = NULL;
+                       state->gnutls_internals.dh_secret = NULL;
                        gnutls_free(data);
-               } else {
+                       break;
+               default:
+                       gnutls_assert();
                        ret = GNUTLS_E_UNKNOWN_KX_ALGORITHM;
                }
        }
 
-       master = gnutls_PRF( premaster, premaster_size, MASTER_SECRET, strlen(MASTER_SECRET),
-                                               random, 64 ,48);
-       secure_free(premaster);
-
+       master =
+           gnutls_PRF(premaster, premaster_size,
+                      MASTER_SECRET, strlen(MASTER_SECRET),
+                      random, 64, 48); secure_free(premaster);
 #ifdef HARD_DEBUG
        fprintf(stderr, "master secret: %s\n", bin2hex(master, 48));
 #endif
-       memmove( state->security_parameters.master_secret, master, 48);
-
+       memmove(state->security_parameters.master_secret, master, 48);
        secure_free(master);
        gnutls_free(random);
-
        return ret;
-
 }
-
-