]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Added compression support (ZLIB)
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 7 Dec 2000 13:07:07 +0000 (13:07 +0000)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 7 Dec 2000 13:07:07 +0000 (13:07 +0000)
17 files changed:
.cvsignore
configure.in
lib/Makefile.am
lib/gnutls.c
lib/gnutls.h
lib/gnutls_algorithms.c
lib/gnutls_algorithms.h
lib/gnutls_cipher.c
lib/gnutls_compress.c
lib/gnutls_errors.c
lib/gnutls_errors.h
lib/gnutls_handshake.c
lib/gnutls_int.h
lib/gnutls_priority.c
src/cli.c
src/port.h
src/serv.c

index 9ff1aadbc4724d12a67b7d9217a0c87d6202a015..baf65d76919d38a09924bab71adc909a87423e5a 100644 (file)
@@ -1,7 +1,7 @@
 Makefile
 aclocal.m4
 config.status
-gnutls-0.0.1.tar.gz
+gnutls*.tar.gz
 ltmain.sh
 configure
 libtool
index 95d3154c68e40c6a216cfa894d05dfd9a6934d18..aceeb29d2236885a669da852e15cd63c625a50e3 100644 (file)
@@ -98,11 +98,13 @@ fi
 AC_HEADER_STDC
 AC_CHECK_HEADERS(unistd.h pwd.h locale.h strings.h stdarg.h)
 AC_CHECK_HEADERS(sys/stat.h sys/types.h fcntl.h sys/wait.h)
-AC_CHECK_HEADERS(utime.h signal.h)
+AC_CHECK_HEADERS(utime.h signal.h zlib.h)
 AC_CHECK_HEADERS(termios.h termio.h sgtty.h)
 AC_CHECK_FUNCS(bzero signal sigaction memset fcntl fsync siglongjmp,,)
 AC_CHECK_FUNCS(lstat stat umask utime memmove bcopy getpwuid waitpid,,)
 
+AC_CHECK_LIB(z, compress)
+
 dnl Checks for libraries.
 AC_C_BIGENDIAN
 AC_TYPE_SIGNAL
index 7b13218908aae6579c041f0ce6a7dd149460de11..315fd57d16dfc515d212fbdcabe84737bbb19c3c 100644 (file)
@@ -3,10 +3,11 @@ EXTRA_DIST = debug.h gnutls_compress.h defines.h gnutls_plaintext.h \
        gnutls_cipher.h gnutls_buffers.h gnutls_errors.h gnutls_int.h \
        gnutls_handshake.h gnutls_num.h gnutls_algorithms.h gnutls_dh.h \
        gnutls_kx.h gnutls_hash_int.h gnutls_cipher_int.h gnutls_der.h \
-       gnutls_cert.lex
+       gnutls_cert.lex gnutls_compress_int.h
 lib_LTLIBRARIES = libgnutls.la
 libgnutls_la_SOURCES = gnutls.c gnutls_compress.c debug.c gnutls_plaintext.c \
        gnutls_cipher.c gnutls_buffers.c gnutls_handshake.c gnutls_num.c \
        gnutls_errors.c gnutls_algorithms.c gnutls_dh.c gnutls_kx.c \
-       gnutls_priority.c gnutls_hash_int.c gnutls_cipher_int.c gnutls_der.c
+       gnutls_priority.c gnutls_hash_int.c gnutls_cipher_int.c gnutls_der.c \
+       gnutls_compress_int.c
 libgnutls_la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
index ee4f5e82f61edeb11fc023529f9319ba87d6d601..e4e6e804f5b20d445e1694215577d7114704c03f 100644 (file)
@@ -61,7 +61,7 @@ int gnutls_init(GNUTLS_STATE * state, ConnectionEnd con_end)
 /* Set the defaults (only to remind me that they should be allocated ) */
        (*state)->security_parameters.bulk_cipher_algorithm = GNUTLS_NULL;
        (*state)->security_parameters.mac_algorithm = GNUTLS_MAC_NULL;
-       (*state)->security_parameters.compression_algorithm = COMPRESSION_NULL;
+       (*state)->security_parameters.compression_algorithm = GNUTLS_COMPRESSION_NULL;
 
        (*state)->connection_state.read_compression_state = NULL;
        (*state)->connection_state.read_mac_secret = NULL;
@@ -101,7 +101,10 @@ int gnutls_init(GNUTLS_STATE * state, ConnectionEnd con_end)
 
        (*state)->gnutls_internals.BulkCipherAlgorithmPriority.algorithm_priority=NULL;
        (*state)->gnutls_internals.BulkCipherAlgorithmPriority.algorithms=0;
-       
+
+       (*state)->gnutls_internals.CompressionMethodPriority.algorithm_priority=NULL;
+       (*state)->gnutls_internals.CompressionMethodPriority.algorithms=0;
+
        return 0;
 }
 
index 92233502aa542da85d1d7237b23656df2f6d29d8..2144437b9c9daf73965c85d157014a5fe17a1f77 100644 (file)
@@ -26,7 +26,7 @@ enum KXAlgorithm { GNUTLS_KX_RSA, GNUTLS_KX_DHE_DSS, GNUTLS_KX_DHE_RSA, GNUTLS_K
 typedef enum KXAlgorithm KXAlgorithm;
 enum MACAlgorithm { GNUTLS_MAC_NULL, GNUTLS_MAC_MD5, GNUTLS_MAC_SHA };
 typedef enum MACAlgorithm MACAlgorithm;
-enum CompressionMethod { COMPRESSION_NULL };
+enum CompressionMethod { GNUTLS_COMPRESSION_NULL, GNUTLS_ZLIB=224 };
 typedef enum CompressionMethod CompressionMethod;
 enum ConnectionEnd { GNUTLS_SERVER, GNUTLS_CLIENT };
 typedef enum ConnectionEnd ConnectionEnd;
@@ -60,6 +60,7 @@ void gnutls_perror( int error);
 void gnutls_set_cipher_priority( GNUTLS_STATE state, int num, ...);
 void gnutls_set_kx_priority( GNUTLS_STATE state, int num, ...);
 void gnutls_set_mac_priority( GNUTLS_STATE state, int num, ...);
+void gnutls_set_compression_priority( GNUTLS_STATE state, int num, ...);
 
 /* set our version - local is 0x00 for TLS 1.0 and SSL3 */
 void gnutls_set_current_version(GNUTLS_STATE state, GNUTLS_Version version); 
index a7945be77f35a56c6f709ab925b3f004eefbcedf..e99f1ae7a3f3a88ee348a8e0928b34c882e40181 100644 (file)
@@ -105,8 +105,32 @@ static gnutls_hash_entry hash_algorithms[] = {
                         GNUTLS_HASH_LOOP( if(p->id == algorithm) { a; break; } )
 
 
+/* Compression Section */
+#define GNUTLS_COMPRESSION_ENTRY(name) \
+       { #name, name }
 
+struct gnutls_compression_entry {
+       char *name;
+       CompressionMethod id;
+};
+
+typedef struct gnutls_compression_entry gnutls_compression_entry;
+static gnutls_compression_entry compression_algorithms[] = {
+       GNUTLS_COMPRESSION_ENTRY(GNUTLS_COMPRESSION_NULL),
+//#ifdef HAVE_LIBZ
+       GNUTLS_COMPRESSION_ENTRY(GNUTLS_ZLIB),
+//#endif
+       {0}
+};
 
+#define GNUTLS_COMPRESSION_LOOP(b) \
+        gnutls_compression_entry *p; \
+                for(p = compression_algorithms; p->name != NULL; p++) { b ; }
+#define GNUTLS_COMPRESSION_ALG_LOOP(a) \
+                        GNUTLS_COMPRESSION_LOOP( if(p->id == algorithm) { a; break; } )
+
+
+/* Key Exchange Section */
 #define GNUTLS_KX_ALGO_ENTRY(name, server_cert, server_kx, client_cert, RSA_premaster, DH_public_value) \
        { #name, name, server_cert, server_kx, client_cert, RSA_premaster, DH_public_value }
 
@@ -141,8 +165,8 @@ static gnutls_kx_algo_entry kx_algorithms[] = {
 
 
 /* Cipher SUITES */
-#define GNUTLS_CIPHER_SUITE_ENTRY( name, block_algorithm, kx_algorithm, mac_algorithm) \
-       { #name, {name}, block_algorithm, kx_algorithm, mac_algorithm }
+#define GNUTLS_CIPHER_SUITE_ENTRY( name, block_algorithm, kx_algorithm, mac_algorithm, compression_algorithm) \
+       { #name, {name}, block_algorithm, kx_algorithm, mac_algorithm, compression_algorithm }
 
 typedef struct {
        char *name;
@@ -150,6 +174,7 @@ typedef struct {
        BulkCipherAlgorithm block_algorithm;
        KXAlgorithm kx_algorithm;
        MACAlgorithm mac_algorithm;
+       CompressionMethod compression_algorithm;
 } gnutls_cipher_suite_entry;
 
 #define GNUTLS_DH_anon_WITH_3DES_EDE_CBC_SHA { 0x00, 0x1B }
@@ -177,21 +202,21 @@ typedef struct {
                       
                       
 static gnutls_cipher_suite_entry cs_algorithms[] = {
-       GNUTLS_CIPHER_SUITE_ENTRY(GNUTLS_DH_anon_WITH_ARCFOUR_MD5,   GNUTLS_ARCFOUR, GNUTLS_KX_ANON_DH, GNUTLS_MAC_MD5),
-       GNUTLS_CIPHER_SUITE_ENTRY(GNUTLS_DH_anon_WITH_3DES_EDE_CBC_SHA, GNUTLS_3DES, GNUTLS_KX_ANON_DH, GNUTLS_MAC_SHA),
-       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DH_DSS_WITH_3DES_EDE_CBC_SHA, GNUTLS_3DES, GNUTLS_KX_DH_DSS,  GNUTLS_MAC_SHA),
-       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DH_RSA_WITH_3DES_EDE_CBC_SHA, GNUTLS_3DES, GNUTLS_KX_DH_RSA,  GNUTLS_MAC_SHA),
-       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,GNUTLS_3DES, GNUTLS_KX_DHE_DSS, GNUTLS_MAC_SHA),
-       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,GNUTLS_3DES, GNUTLS_KX_DHE_RSA, GNUTLS_MAC_SHA),
-       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_RSA_WITH_ARCFOUR_SHA,         GNUTLS_ARCFOUR, GNUTLS_KX_RSA,  GNUTLS_MAC_SHA),
-       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_RSA_WITH_ARCFOUR_MD5,         GNUTLS_ARCFOUR, GNUTLS_KX_RSA,  GNUTLS_MAC_MD5),
-       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_RSA_WITH_3DES_EDE_CBC_SHA,    GNUTLS_3DES, GNUTLS_KX_RSA,     GNUTLS_MAC_SHA),
-       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_RSA_WITH_RIJNDAEL_128_CBC_SHA,        GNUTLS_RIJNDAEL,  GNUTLS_KX_RSA,        GNUTLS_MAC_SHA),
-       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DH_DSS_WITH_RIJNDAEL_128_CBC_SHA,     GNUTLS_RIJNDAEL,  GNUTLS_KX_DH_DSS,  GNUTLS_MAC_SHA),
-       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DH_RSA_WITH_RIJNDAEL_128_CBC_SHA,     GNUTLS_RIJNDAEL,  GNUTLS_KX_DH_RSA,     GNUTLS_MAC_SHA),
-       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DHE_DSS_WITH_RIJNDAEL_128_CBC_SHA,    GNUTLS_RIJNDAEL,  GNUTLS_KX_DHE_DSS,    GNUTLS_MAC_SHA),
-       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DHE_RSA_WITH_RIJNDAEL_128_CBC_SHA,    GNUTLS_RIJNDAEL,  GNUTLS_KX_DHE_RSA,    GNUTLS_MAC_SHA),
-       GNUTLS_CIPHER_SUITE_ENTRY(GNUTLS_DH_anon_WITH_RIJNDAEL_SHA,   GNUTLS_RIJNDAEL, GNUTLS_KX_ANON_DH, GNUTLS_MAC_SHA),
+       GNUTLS_CIPHER_SUITE_ENTRY(GNUTLS_DH_anon_WITH_ARCFOUR_MD5,   GNUTLS_ARCFOUR, GNUTLS_KX_ANON_DH, GNUTLS_MAC_MD5, GNUTLS_COMPRESSION_NULL),
+       GNUTLS_CIPHER_SUITE_ENTRY(GNUTLS_DH_anon_WITH_3DES_EDE_CBC_SHA, GNUTLS_3DES, GNUTLS_KX_ANON_DH, GNUTLS_MAC_SHA, GNUTLS_COMPRESSION_NULL),
+       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DH_DSS_WITH_3DES_EDE_CBC_SHA, GNUTLS_3DES, GNUTLS_KX_DH_DSS,  GNUTLS_MAC_SHA, GNUTLS_COMPRESSION_NULL),
+       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DH_RSA_WITH_3DES_EDE_CBC_SHA, GNUTLS_3DES, GNUTLS_KX_DH_RSA,  GNUTLS_MAC_SHA, GNUTLS_COMPRESSION_NULL),
+       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,GNUTLS_3DES, GNUTLS_KX_DHE_DSS, GNUTLS_MAC_SHA, GNUTLS_COMPRESSION_NULL),
+       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,GNUTLS_3DES, GNUTLS_KX_DHE_RSA, GNUTLS_MAC_SHA, GNUTLS_COMPRESSION_NULL),
+       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_RSA_WITH_ARCFOUR_SHA,         GNUTLS_ARCFOUR, GNUTLS_KX_RSA,  GNUTLS_MAC_SHA, GNUTLS_COMPRESSION_NULL),
+       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_RSA_WITH_ARCFOUR_MD5,         GNUTLS_ARCFOUR, GNUTLS_KX_RSA,  GNUTLS_MAC_MD5, GNUTLS_COMPRESSION_NULL),
+       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_RSA_WITH_3DES_EDE_CBC_SHA,    GNUTLS_3DES, GNUTLS_KX_RSA,     GNUTLS_MAC_SHA, GNUTLS_COMPRESSION_NULL),
+       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_RSA_WITH_RIJNDAEL_128_CBC_SHA,        GNUTLS_RIJNDAEL,  GNUTLS_KX_RSA,        GNUTLS_MAC_SHA, GNUTLS_COMPRESSION_NULL),
+       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DH_DSS_WITH_RIJNDAEL_128_CBC_SHA,     GNUTLS_RIJNDAEL,  GNUTLS_KX_DH_DSS,  GNUTLS_MAC_SHA, GNUTLS_COMPRESSION_NULL),
+       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DH_RSA_WITH_RIJNDAEL_128_CBC_SHA,     GNUTLS_RIJNDAEL,  GNUTLS_KX_DH_RSA,     GNUTLS_MAC_SHA, GNUTLS_COMPRESSION_NULL),
+       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DHE_DSS_WITH_RIJNDAEL_128_CBC_SHA,    GNUTLS_RIJNDAEL,  GNUTLS_KX_DHE_DSS,    GNUTLS_MAC_SHA, GNUTLS_COMPRESSION_NULL),
+       GNUTLS_CIPHER_SUITE_ENTRY( GNUTLS_DHE_RSA_WITH_RIJNDAEL_128_CBC_SHA,    GNUTLS_RIJNDAEL,  GNUTLS_KX_DHE_RSA,    GNUTLS_MAC_SHA, GNUTLS_COMPRESSION_NULL),
+       GNUTLS_CIPHER_SUITE_ENTRY(GNUTLS_DH_anon_WITH_RIJNDAEL_SHA,   GNUTLS_RIJNDAEL, GNUTLS_KX_ANON_DH, GNUTLS_MAC_SHA, GNUTLS_COMPRESSION_NULL),
        {0}
 };
 
@@ -207,7 +232,7 @@ static gnutls_cipher_suite_entry cs_algorithms[] = {
 /* Generic Functions */
 
 /* this function makes the whole string lowercase */
-void tolow(char *str, int size)
+void _gnutls_tolow(char *str, int size)
 {
        int i;
 
@@ -234,7 +259,6 @@ int _gnutls_mac_priority(GNUTLS_STATE state, MACAlgorithm algorithm) /* actually
        return -1;
 }
 
-
 char *_gnutls_mac_get_name(MACAlgorithm algorithm)
 {
        char *ret = NULL;
@@ -246,7 +270,7 @@ char *_gnutls_mac_get_name(MACAlgorithm algorithm)
 
 
        if (ret != NULL) {
-               tolow(ret, strlen(ret));
+               _gnutls_tolow(ret, strlen(ret));
                pointerTo_ = strchr(ret, '_');
 
                while (pointerTo_ != NULL) {
@@ -286,6 +310,67 @@ int _gnutls_mac_is_ok(MACAlgorithm algorithm)
 
 }
 
+/* Compression Functions */
+int _gnutls_compression_priority(GNUTLS_STATE state, CompressionMethod algorithm) /* actually returns the priority */
+{
+       int i, num = state->gnutls_internals.CompressionMethodPriority.algorithms;
+       for (i=0;i<num;i++) {
+               if (state->gnutls_internals.CompressionMethodPriority.algorithm_priority[i]==algorithm) return i;
+       }
+       return -1;
+}
+
+char *_gnutls_compression_get_name(CompressionMethod algorithm)
+{
+       char *ret = NULL;
+       char *pointerTo_;
+
+       /* avoid prefix */
+       GNUTLS_COMPRESSION_ALG_LOOP(ret =
+                            strdup(p->name + sizeof("GNUTLS_") - 1));
+
+
+       if (ret != NULL) {
+               _gnutls_tolow(ret, strlen(ret));
+               pointerTo_ = strchr(ret, '_');
+
+               while (pointerTo_ != NULL) {
+                       *pointerTo_ = '-';
+                       pointerTo_ = strchr(ret, '_');
+               }
+       }
+       return ret;
+}
+
+int _gnutls_compression_count()
+{
+       uint8 i, counter = 0;
+       char *y;
+
+       for (i = 0; i < 255; i++) {
+               y = _gnutls_compression_get_name(i);
+
+               if (y != NULL) {
+                       free(y);
+                       counter++;
+               }
+       }
+       return counter;
+}
+
+int _gnutls_compression_is_ok(CompressionMethod algorithm)
+{
+       char *y = _gnutls_compression_get_name(algorithm);
+
+       if (y != NULL) {
+               free(y);
+               return 0;
+       } else {
+               return 1;
+       }
+
+}
+
 
 
 /* CIPHER functions */
@@ -343,7 +428,7 @@ char *_gnutls_cipher_get_name(BulkCipherAlgorithm algorithm)
 
 
        if (ret != NULL) {
-               tolow(ret, strlen(ret));
+               _gnutls_tolow(ret, strlen(ret));
                pointerTo_ = strchr(ret, '_');
 
                while (pointerTo_ != NULL) {
@@ -446,7 +531,7 @@ char *_gnutls_kx_get_name(KXAlgorithm algorithm)
 
 
        if (ret != NULL) {
-               tolow(ret, strlen(ret));
+               _gnutls_tolow(ret, strlen(ret));
                pointerTo_ = strchr(ret, '_');
 
                while (pointerTo_ != NULL) {
@@ -530,6 +615,14 @@ MACAlgorithm _gnutls_cipher_suite_get_mac_algo(const GNUTLS_CipherSuite suite)
 
 }
 
+CompressionMethod _gnutls_cipher_suite_get_compression_algo(const GNUTLS_CipherSuite suite)
+{
+       size_t ret = 0;
+       GNUTLS_CIPHER_SUITE_ALG_LOOP(ret = p->compression_algorithm);
+       return ret;
+
+}
+
 char *_gnutls_cipher_suite_get_name(GNUTLS_CipherSuite suite)
 {
        char *ret = NULL;
@@ -542,7 +635,7 @@ char *_gnutls_cipher_suite_get_name(GNUTLS_CipherSuite suite)
 
 
        if (ret != NULL) {
-               tolow(ret, strlen(ret));
+               _gnutls_tolow(ret, strlen(ret));
                pointerTo_ = strchr(ret, '_');
 
                while (pointerTo_ != NULL) {
@@ -698,7 +791,7 @@ int _gnutls_supported_ciphersuites(GNUTLS_STATE state, GNUTLS_CipherSuite ** cip
 /* then sort using block algorithm's priorities */
        bsort(state, tmp_ciphers, count, sizeof(GNUTLS_CipherSuite), _gnutls_compare_cipher_algo);
 
-/* Last try KX algorithms priority */
+/* Last try KX algorithms priority (highest) */
        bsort(state, tmp_ciphers, count, sizeof(GNUTLS_CipherSuite), _gnutls_compare_kx_algo);
 
        for (i = 0; i < count; i++) {
@@ -709,7 +802,6 @@ int _gnutls_supported_ciphersuites(GNUTLS_STATE state, GNUTLS_CipherSuite ** cip
 
                (*ciphers)[j].CipherSuite[0] = tmp_ciphers[i].CipherSuite[0];
                (*ciphers)[j].CipherSuite[1] = tmp_ciphers[i].CipherSuite[1];
-/*             fprintf(stderr, "%d: %s\n", j, _gnutls_cipher_suite_get_name((*ciphers)[j])); */
                j++;
        }
        ret_count=j;
@@ -728,17 +820,17 @@ int _gnutls_supported_ciphersuites(GNUTLS_STATE state, GNUTLS_CipherSuite ** cip
        return ret_count;
 }
 
-/* For compression - FIXME!!! */
-#define SUPPORTED_COMPRESSION_METHODS 1
+/* For compression  */
+#define SUPPORTED_COMPRESSION_METHODS state->gnutls_internals.CompressionMethodPriority.algorithms
 int _gnutls_supported_compression_methods(GNUTLS_STATE state, CompressionMethod ** comp)
 {
-
+int i;
        *comp =
-            gnutls_malloc(SUPPORTED_COMPRESSION_METHODS *
-                          sizeof(CompressionMethod));
+            gnutls_malloc(SUPPORTED_COMPRESSION_METHODS * 1);
 
-/* NULL Compression */
-       (*comp)[0] = COMPRESSION_NULL;
+       for (i=0;i<SUPPORTED_COMPRESSION_METHODS;i++) {
+               (*comp)[i] = state->gnutls_internals.CompressionMethodPriority.algorithm_priority[i];
+       }
 
        return SUPPORTED_COMPRESSION_METHODS;
 }
index 376d0eb6481b228e841fd78bad6b82598ef0e5e6..ef9203055776cfb2a06437f0691e4c693569eec8 100644 (file)
@@ -18,6 +18,7 @@ char* _gnutls_cipher_suite_get_name(GNUTLS_CipherSuite algorithm);
 BulkCipherAlgorithm _gnutls_cipher_suite_get_cipher_algo(const GNUTLS_CipherSuite algorithm);
 KXAlgorithm _gnutls_cipher_suite_get_kx_algo(const GNUTLS_CipherSuite algorithm);
 MACAlgorithm _gnutls_cipher_suite_get_mac_algo(const GNUTLS_CipherSuite algorithm);
+CompressionMethod _gnutls_cipher_suite_get_compression_algo(const GNUTLS_CipherSuite suite);
 GNUTLS_CipherSuite  _gnutls_cipher_suite_get_suite_name(GNUTLS_CipherSuite algorithm);
 
 /* functions for ciphers */
@@ -40,3 +41,9 @@ int _gnutls_kx_DH_public_value(KXAlgorithm algorithm);
 char *_gnutls_kx_get_name(KXAlgorithm algorithm);
 int _gnutls_kx_is_ok(KXAlgorithm algorithm);
 int _gnutls_kx_count();
+
+/* functions for compression */
+int _gnutls_compression_priority(GNUTLS_STATE state, CompressionMethod algorithm);
+int _gnutls_compression_is_ok(CompressionMethod algorithm);
+int _gnutls_compression_count();
+char *_gnutls_compression_get_name(CompressionMethod algorithm);
index 7f856c77da3e1ed3cd9221ab097dcffebede1bb9..97c4872b06f2a6c6da9d6e27324301c0ae7a838b 100644 (file)
@@ -159,11 +159,9 @@ int _gnutls_set_cipher(GNUTLS_STATE state, BulkCipherAlgorithm algo)
 int _gnutls_set_compression(GNUTLS_STATE state, CompressionMethod algo)
 {
 
-       switch (algo) {
-       case COMPRESSION_NULL:
-               break;
-
-       default:
+       if (_gnutls_compression_is_ok(algo)==0) {
+               state->security_parameters.compression_algorithm = algo;
+       } else {
                gnutls_assert();
                return GNUTLS_E_UNKNOWN_COMPRESSION_ALGORITHM;
        }
@@ -221,14 +219,17 @@ int _gnutls_connection_state_init(GNUTLS_STATE state)
        if (rc < 0)
                return rc;
 
+       rc =
+           _gnutls_set_compression(state,
+                           state->gnutls_internals.compression_method);
+       if (rc < 0)
+               return rc;
+
 /* Setup the keys since we have the master secret 
  */
        _gnutls_set_keys(state);
 
 
-/* FIXME: Compression is not implemented (no compression algorithms used)
- */
-
 #ifdef DEBUG
        fprintf(stderr, "Cipher Suite: %s\n",
                _gnutls_cipher_suite_get_name(state->
@@ -239,7 +240,7 @@ int _gnutls_connection_state_init(GNUTLS_STATE state)
        fprintf(stderr, "MAC: %s\n",
                _gnutls_mac_get_name(state->security_parameters.
                                     mac_algorithm));
-       fprintf(stderr, "Compression: %s\n", "null");
+       fprintf(stderr, "Compression: %s\n", _gnutls_compression_get_name(state->security_parameters.compression_algorithm));
 #endif
 
        gnutls_free(state->connection_state.write_mac_secret);
@@ -256,12 +257,10 @@ int _gnutls_connection_state_init(GNUTLS_STATE state)
        gnutls_free(state->connection_state.read_compression_state);
        gnutls_free(state->connection_state.write_compression_state);
 
-       switch (state->security_parameters.compression_algorithm) {
-       case COMPRESSION_NULL:
+       if (_gnutls_compression_is_ok(state->security_parameters.compression_algorithm) == 0) {
                state->connection_state.read_compression_state = NULL;
                state->connection_state.write_compression_state = NULL;
-               break;
-       default:
+       } else {
                gnutls_assert();
                return GNUTLS_E_UNKNOWN_COMPRESSION_ALGORITHM;
        }
index 971dcfc329163b51f0b550d4c27a1e14e18c64db..806f3ff3ea4c74ebe53ce9689b8c5b89be20d854 100644 (file)
@@ -22,6 +22,7 @@
 #include "gnutls_int.h"
 #include "gnutls_compress.h"
 #include "gnutls_errors.h"
+#include "gnutls_compress_int.h"
 
 int _gnutls_TLSPlaintext2TLSCompressed(GNUTLS_STATE state,
                                                     GNUTLSCompressed **
@@ -29,27 +30,26 @@ int _gnutls_TLSPlaintext2TLSCompressed(GNUTLS_STATE state,
                                                     GNUTLSPlaintext *
                                                     plaintext)
 {
+       int size;
        GNUTLSCompressed *compressed;
-
+       char *data;
+       
        *compress = gnutls_malloc(sizeof(GNUTLSCompressed));
        compressed = *compress;
 
-       switch (state->security_parameters.compression_algorithm) {
-       case COMPRESSION_NULL:
-
-               compressed->fragment = gnutls_malloc(plaintext->length);
-
-               memmove(compressed->fragment, plaintext->fragment,
-                       plaintext->length);
-               compressed->length = plaintext->length;
-               compressed->type = plaintext->type;
-               compressed->version.major = plaintext->version.major;
-               compressed->version.minor = plaintext->version.minor;
-               break;
-       default:
+       data=NULL;
+       
+       size = gnutls_compress( state->security_parameters.compression_algorithm, plaintext->fragment, plaintext->length, &data);
+       if (size < 0) {
+               if (data!=NULL) gnutls_free(data);
                gnutls_free(*compress);
                return GNUTLS_E_UNKNOWN_COMPRESSION_ALGORITHM;
        }
+       compressed->fragment = data;
+       compressed->length = size;
+       compressed->type = plaintext->type;
+       compressed->version.major = plaintext->version.major;
+       compressed->version.minor = plaintext->version.minor;
 
        return 0;
 }
@@ -61,24 +61,25 @@ int _gnutls_TLSCompressed2TLSPlaintext(GNUTLS_STATE state,
                                                     compressed)
 {
        GNUTLSPlaintext *plaintext;
+       int size;
+       char* data;
 
        *plain = gnutls_malloc(sizeof(GNUTLSPlaintext));
        plaintext = *plain;
+
+       data=NULL;
        
-       switch (state->security_parameters.compression_algorithm) {
-       case COMPRESSION_NULL:
-               plaintext->fragment = gnutls_malloc(compressed->length);
-               memmove(plaintext->fragment, compressed->fragment,
-                       compressed->length);
-               plaintext->length = compressed->length;
-               plaintext->type = compressed->type;
-               plaintext->version.major = compressed->version.major;
-               plaintext->version.minor = compressed->version.minor;
-               break;
-       default:
+       size = gnutls_decompress( state->security_parameters.compression_algorithm, compressed->fragment, compressed->length, &data);
+       if (size < 0) {
+               if (data!=NULL) gnutls_free(data);
                gnutls_free(*plain);
                return GNUTLS_E_UNKNOWN_COMPRESSION_ALGORITHM;
        }
+       plaintext->fragment = data;
+       plaintext->length = size;
+       plaintext->type = compressed->type;
+       plaintext->version.major = compressed->version.major;
+       plaintext->version.minor = compressed->version.minor;
 
        return 0;
 }
index c7299aedcc13a15e5fa84ef839d9d7e6511b855c..bf5ff3c6567da3b7f5e33b0dd787975aea2107c6 100644 (file)
@@ -21,7 +21,7 @@
 #include "defines.h"
 #include "gnutls_errors.h"
 
-void tolow(char *str, int size);
+void _gnutls_tolow(char *str, int size);
 
 #define GNUTLS_ERROR_ENTRY(name, fatal) \
        { #name, name, fatal }
@@ -59,6 +59,7 @@ static gnutls_error_entry error_algorithms[] = {
        GNUTLS_ERROR_ENTRY( GNUTLS_E_MPI_SCAN_FAILED, 1),
        GNUTLS_ERROR_ENTRY( GNUTLS_E_DECRYPTION_FAILED, 1),
        GNUTLS_ERROR_ENTRY( GNUTLS_E_DECOMPRESSION_FAILED, 1),
+       GNUTLS_ERROR_ENTRY( GNUTLS_E_COMPRESSION_FAILED, 1),
        GNUTLS_ERROR_ENTRY( GNUTLS_E_MEMORY_ERROR, 1),
        GNUTLS_ERROR_ENTRY( GNUTLS_E_UNIMPLEMENTED_FEATURE, 1),
        {0}
@@ -91,7 +92,7 @@ void gnutls_perror(int error)
 
 
        if (ret != NULL) {
-               tolow(ret, strlen(ret));
+               _gnutls_tolow(ret, strlen(ret));
                pointerTo_ = strchr(ret, '_');
 
                while (pointerTo_ != NULL) {
@@ -115,7 +116,7 @@ char* gnutls_strerror(int error)
 
 
        if (ret != NULL) {
-               tolow(ret, strlen(ret));
+               _gnutls_tolow(ret, strlen(ret));
                pointerTo_ = strchr(ret, '_');
 
                while (pointerTo_ != NULL) {
index c3909ca1be611116824e23dbccc1402a3c69e6cf..a010cacb4e205acfa9d7f38ed729281ebc74e6ae 100644 (file)
@@ -26,6 +26,7 @@
 #define GNUTLS_E_DECRYPTION_FAILED -24
 #define GNUTLS_E_MEMORY_ERROR -25
 #define GNUTLS_E_DECOMPRESSION_FAILED -26
+#define GNUTLS_E_COMPRESSION_FAILED -27
 #define GNUTLS_E_UNIMPLEMENTED_FEATURE -50
 
 
index 329b4e47f13bc8588a609a7d650816a1284edea4..0e263910dcfdd6465c789c26efea06c49426f044 100644 (file)
@@ -147,8 +147,6 @@ int _gnutls_send_finished(int cd, GNUTLS_STATE state)
                data_size=12;
        }
 
-fprintf(stderr, "Finished: %s\n", _gnutls_bin2hex(data, data_size));
-
        ret = _gnutls_send_handshake(cd, state, data, data_size, GNUTLS_FINISHED);
        gnutls_free(data);
 
@@ -243,27 +241,29 @@ static int SelectSuite(GNUTLS_STATE state, opaque ret[2], char *data, int datale
 }
 
 /* This selects the best supported compression method from the ones provided */
-static int SelectCompMethod(GNUTLS_STATE state, CompressionMethod * ret, char *data, int datalen)
+static int SelectCompMethod(GNUTLS_STATE state, CompressionMethod * ret, opaque *data, int datalen)
 {
        int x, i, j;
        CompressionMethod *ciphers;
 
        x = _gnutls_supported_compression_methods(state, &ciphers);
        memset(ret, '\0', sizeof(CompressionMethod));
-fprintf(stderr, "datalen: %d\n",datalen);
+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);
+                       fprintf(stderr, "cipher[%d] = %d\n", i, (int)ciphers[i]);
+                       fprintf(stderr, "data[%d] = %d\n", j, (int)data[j]);
+                       if ( ciphers[i] == data[j]) {
+                               *ret = ciphers[i];
                                gnutls_free(ciphers);
                                return 0;
                        }
                }
        }
 
-
+       /* we were not able to find a compatible compression
+        * algorithm
+        */
        gnutls_free(ciphers);
        gnutls_assert();
        return GNUTLS_E_UNKNOWN_COMPRESSION_ALGORITHM;
@@ -763,7 +763,9 @@ int _gnutls_recv_hello(int cd, GNUTLS_STATE state, char *data, int datalen,
                                 &data[pos], z);
                pos+=z;
                
-               if (ret<0) return ret;
+               if (ret < 0) {
+                       return ret;
+               }
        }
 
        return ret;
index 34313726b95dca90eaffa9ac88798e108de2e9c0..ca7623c7658961ec0e7f2ee7f3933d3f790c5990 100644 (file)
@@ -2,7 +2,7 @@
 
 #define GNUTLS_INT_H
 
-#define HANDSHAKE_DEBUG
+//#define HANDSHAKE_DEBUG
 //#define HARD_DEBUG
 //#define READ_DEBUG
 //#define WRITE_DEBUG
 #define gnutls_mpi_release mpi_release
 
 #define svoid void /* for functions that allocate using secure_free */
-#define secure_free(x) if (x!=NULL) free(x)
+#define secure_free free
 #define secure_malloc malloc
 #define secure_realloc realloc
 #define secure_calloc calloc
 #define gnutls_malloc malloc
 #define gnutls_realloc realloc
 #define gnutls_calloc calloc
-#define gnutls_free(x) if (x!=NULL) free(x)
+#define gnutls_free free
 
 typedef struct {
        uint8   pint[3];
@@ -89,7 +89,7 @@ enum KeyExchangeAlgorithm { GNUTLS_RSA, GNUTLS_DIFFIE_HELLMAN };
 enum CipherType { CIPHER_STREAM, CIPHER_BLOCK };
 enum IsExportable { EXPORTABLE_TRUE, EXPORTABLE_FALSE };
 enum MACAlgorithm { GNUTLS_MAC_NULL, GNUTLS_MAC_MD5, GNUTLS_MAC_SHA };
-enum CompressionMethod { COMPRESSION_NULL };
+enum CompressionMethod { GNUTLS_COMPRESSION_NULL, GNUTLS_ZLIB=224 };
 
 enum ValidSession { VALID_TRUE, VALID_FALSE };
 enum ResumableSession { RESUME_TRUE, RESUME_FALSE };
@@ -175,6 +175,11 @@ typedef struct {
        int algorithms;
 } KXAlgorithm_Priority;
 
+typedef struct {
+       int* algorithm_priority;
+       int algorithms;
+} CompressionMethod_Priority;
+
 typedef struct {
        char*                   buffer;
        uint32                  bufferSize;
@@ -198,6 +203,7 @@ typedef struct {
        BulkCipherAlgorithm_Priority    BulkCipherAlgorithmPriority;
        MACAlgorithm_Priority           MACAlgorithmPriority;
        KXAlgorithm_Priority            KXAlgorithmPriority;
+       CompressionMethod_Priority      CompressionMethodPriority;
 } GNUTLS_INTERNALS;
 
 typedef struct {
index 357a76a77e6446990a3c73269cbbe206d00d45ac..07168591e6b8f4ce1bffd24eacfd13c819efe34b 100644 (file)
@@ -81,4 +81,23 @@ void gnutls_set_mac_priority( GNUTLS_STATE state, int num, ...) {
                state->gnutls_internals.MACAlgorithmPriority.algorithm_priority[i] = _ap[i];
        }
        va_end(ap);
-}
\ No newline at end of file
+}
+
+void gnutls_set_compression_priority( GNUTLS_STATE state, int num, ...) {
+       
+       va_list ap;
+       int i;
+       CompressionMethod *_ap;
+       
+       va_start( ap, num);
+       _ap = ap;
+       
+       if (state->gnutls_internals.CompressionMethodPriority.algorithm_priority!=NULL)
+               gnutls_free(state->gnutls_internals.CompressionMethodPriority.algorithm_priority);      
+       state->gnutls_internals.CompressionMethodPriority.algorithm_priority = gnutls_malloc(sizeof(int*)*num);
+       state->gnutls_internals.CompressionMethodPriority.algorithms = num;
+       for (i=0;i<num;i++) {
+               state->gnutls_internals.CompressionMethodPriority.algorithm_priority[i] = _ap[i];
+       }
+       va_end(ap);
+}
index 8c26ad89b1b2b9e1ee356080f51cc3fc501f3a8e..7bdd2d462749e9e8935a796c120d6d8c45b9c2a4 100644 (file)
--- a/src/cli.c
+++ b/src/cli.c
@@ -59,7 +59,7 @@ int main()
        gnutls_set_current_version( state, GNUTLS_TLS1);
 
        gnutls_set_cipher_priority( state, 2, GNUTLS_ARCFOUR, GNUTLS_3DES);
-//     gnutls_set_kx_priority( state, 1, GNUTLS_KX_ANON_DH);
+       gnutls_set_compression_priority( state, 2, GNUTLS_ZLIB, GNUTLS_COMPRESSION_NULL);
        gnutls_set_kx_priority( state, 3, GNUTLS_KX_ANON_DH, GNUTLS_KX_DHE_DSS, GNUTLS_KX_DHE_RSA);
        gnutls_set_mac_priority( state, 2, GNUTLS_MAC_SHA, GNUTLS_MAC_MD5);
        ret = gnutls_handshake(sd, state);
index 003fa6f42e52d9f9f8ee299c7caef94afbd8a805..5339ecc2d3dd3e1ad74de17355fff8f79341cf53 100644 (file)
@@ -1,2 +1,2 @@
-#define PORT 5555
+#define PORT 5554
 #define SERVER "127.0.0.1"
index f8c75af954790ce27e874b261bac312da47afd62..64ba9bf171afcfc9ad822bc3236fefb2c1949a4a 100644 (file)
@@ -64,6 +64,7 @@ int main()
     for (;;) {
        gnutls_init(&state, GNUTLS_SERVER);
        gnutls_set_cipher_priority( state, 1, GNUTLS_3DES);
+       gnutls_set_compression_priority( state, 2, GNUTLS_COMPRESSION_NULL, GNUTLS_ZLIB);
        gnutls_set_kx_priority( state, 1, GNUTLS_KX_ANON_DH);
        gnutls_set_mac_priority( state, 2, GNUTLS_MAC_SHA, GNUTLS_MAC_MD5);
        sd = accept(listen_sd, (SA *) & sa_cli, &client_len);