]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Added gnutls_recv... Works only for application data, and it is not
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Mon, 13 Mar 2000 19:52:53 +0000 (19:52 +0000)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Mon, 13 Mar 2000 19:52:53 +0000 (19:52 +0000)
tested.

configure.in
src/Makefile.am
src/gnutls.c
src/gnutls.h
src/gnutls_cipher.c
src/test.c

index b1d759566ae652fcc65f5168b8ff8ddb91b3483a..3e24d4a3f649347588ce6635c64ee4bc57930b2b 100644 (file)
@@ -49,60 +49,9 @@ AC_C_CONST
 
 dnl Checks for programs.
 AC_PROG_INSTALL
-AC_PROG_LN_S
-AC_PATH_PROG(RM,rm)
-AC_PATH_PROG(MAKEINFO,makeinfo)
-dnl AC_PATH_PROG(AR,ar)
-dnl AC_PATH_PROG(RANLIB,ranlib)
 
 dnl AC_PROG_MAKE_SET
 
-dnl From GNUPG
-AC_MSG_CHECKING([whether use of /dev/random is requested])
-AC_ARG_ENABLE(dev-random,
-[  --disable-dev-random    disable the use of dev random],
-    try_dev_random=$enableval, try_dev_random=yes)
-AC_MSG_RESULT($try_dev_random)
-
-opt_maintainer_mode=no
-AC_MSG_CHECKING([whether in maintanance mode])
-AC_ARG_ENABLE(maintainer-mode,
-[  --enable-maintainer-mode enable maintainer mode],
-opt_maintainer_mode=$enableval)
-AC_MSG_RESULT($opt_maintainer_mode)
-
-case "${target}" in
-    *-openbsd*)
-        NAME_OF_DEV_RANDOM="/dev/srandom"
-        NAME_OF_DEV_URANDOM="/dev/urandom"
-        ;;
-    *)
-        NAME_OF_DEV_RANDOM="/dev/random"
-        NAME_OF_DEV_URANDOM="/dev/urandom"
-        ;;
-esac
-
-AC_DEFINE_UNQUOTED(NAME_OF_DEV_RANDOM, "$NAME_OF_DEV_RANDOM")
-AC_DEFINE_UNQUOTED(NAME_OF_DEV_URANDOM, "$NAME_OF_DEV_URANDOM")
-
-dnl check whether we have a random device
-if test "$try_dev_random" = yes ; then
-AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
-[if test -c "/dev/random" && test -c "$NAME_OF_DEV_URANDOM" ; then
-  ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
-if test "$ac_cv_have_dev_random" = yes; then
-    AC_DEFINE(HAVE_DEV_RANDOM)
-else
-    AC_MSG_WARN(No random device found. No real random data can be used.)
-fi
-else
-    AC_MSG_CHECKING(for random device)
-    ac_cv_have_dev_random=no
-    AC_MSG_RESULT(has been disabled)
-    AC_MSG_WARN(Support for random device was disabled. No real random data can be used.)
-fi
-
-
 if test $ac_cv_prog_gcc = yes; then
   CFLAGS="${CFLAGS} -ffast-math"
 
index 8010cac53909dfc1c24bd9ec5c3dc85378c5f2a8..ab81c6b0a96c08db9f864bc77c0ec0755fce4d1a 100644 (file)
@@ -1,7 +1,7 @@
 include_HEADERS = gnutls.h 
-EXTRA_DIST = debug.h gnutls_compress.h defines.h gnutls_plaintext.h gnutls_cipher.h
+EXTRA_DIST = debug.h gnutls_compress.h defines.h gnutls_plaintext.h gnutls_cipher.h gnutls_buffers.h
 lib_LTLIBRARIES = libgnutls.la
-libgnutls_la_SOURCES = gnutls.c gnutls_compress.c debug.c gnutls_plaintext.c gnutls_cipher.c
+libgnutls_la_SOURCES = gnutls.c gnutls_compress.c debug.c gnutls_plaintext.c gnutls_cipher.c gnutls_buffers.c
 libgnutls_la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
 bin_PROGRAMS = test
 test_SOURCES = test.c
index 9f528d43eeab3631183b65d8e184c1d304fc0faa..39f131eda9692ccb3f9efcc316c599985e791dbe 100644 (file)
@@ -4,6 +4,7 @@
 #include "gnutls_compress.h"
 #include "gnutls_plaintext.h"
 #include "gnutls_cipher.h"
+#include "gnutls_buffers.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <mhash.h>
@@ -29,6 +30,7 @@ int gnutls_init(GNUTLS_STATE * state, ConnectionEnd con_end)
        (*state)->cipher_specs.server_write_key = NULL;
        (*state)->cipher_specs.client_write_key = NULL;
 
+       (*state)->gnutls_internals.buffer = NULL;
 }
 
 int gnutls_deinit(GNUTLS_STATE * state)
@@ -140,7 +142,7 @@ svoid *gnutls_PRF( opaque* secret, int secret_size, uint8* label, int label_size
 }
 
 /* if  master_secret, client_random and server_random have been initialized,
- * this functions creates the keys and stores them into state->cipher_specs
+ * this function creates the keys and stores them into state->cipher_specs
  */
 int _gnutls_set_keys( GNUTLS_STATE state) {
        char* key_block;
@@ -285,102 +287,60 @@ int gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type, char* data, in
 }
 
 
-#if 0
 int gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, char* data, int sizeofdata) {
         GNUTLSPlaintext *gtxt;
         GNUTLSCompressed *gcomp;
-        GNUTLSCiphertext *gcipher;
+        GNUTLSCiphertext gcipher;
        int iterations, i, err;
-       uint16 length;
-       int ret=0, Size;
+       char* tmpdata;
+       int ret=0;
        
        if (sizeofdata==0) return 0;
 
-       if (sizeofdata<16384) {
-               iterations=1;
-               Size=sizeofdata;
-       } else {
-               iterations = sizeofdata/16384; 
-               Size = 16384;
-       }
-       for (i=0;i<iterations;i++) {
-               err = _gnutls_text2TLSPlaintext(type, &gtxt, &data[i*Size], Size);
-               if (err<0) {
-                       /*gnutls_perror(err);*/
-                       return err;
+       do {
+               read( cd, &gcipher.type, sizeof(ContentType));
+               read( cd, &gcipher.version, sizeof(ProtocolVersion));
+               if ( gcipher.version.major != GNUTLS_VERSION_MAJOR || gcipher.version.minor != GNUTLS_VERSION_MINOR) {
+                       return GNUTLS_E_UNSUPPORTED_VERSION_PACKET;
                }
 
-               err = _gnutls_TLSPlaintext2TLSCompressed(state, &gcomp, gtxt);
-               if (err<0) {
-                       /*gnutls_perror(err);*/
-                       return err;
+               read( cd, &gcipher.length, sizeof(uint16));
+#ifndef WORDS_BIGENDIAN
+               gcipher.length = byteswap16(gcipher.length);
+#endif
+               gcipher.fragment = gnutls_malloc(gcipher.length);
+       
+               /* read ciphertext */
+               if (read( cd, gcipher.fragment, gcipher.length)!= gcipher.length) {
+                       gnutls_free(gcipher.fragment);
+                       return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
                }
 
-               _gnutls_freeTLSPlaintext(gtxt);
+               if (ret = _gnutls_TLSCiphertext2TLSCompressed( state, &gcomp, &gcipher) < 0){
+                       gnutls_free(gcipher.fragment);
+                       return ret;
+               }
+               gnutls_free(gcipher.fragment);
        
-               err = _gnutls_TLSCompressed2TLSCiphertext( state, &gcipher, gcomp);
-               if (err<0) {
-                       /*gnutls_perror(err);*/
-                       return err;
+               if (ret = _gnutls_TLSCompressed2TLSPlaintext( state, &gtxt, gcomp) < 0){
+                       return ret;
                }
-
                _gnutls_freeTLSCompressed(gcomp);
-               
-               write( cd, &gcipher->type, sizeof(ContentType));
-               write( cd, &gcipher->version.major, 1);
-               write( cd, &gcipher->version.minor, 1);
-#ifdef WORDS_BIGENDIAN
-               length=gcipher->length;
-#else
-               length=byteswap16(gcipher->length);
-#endif
-               write( cd, &length, sizeof(uint16));
-               _print_TLSCiphertext( gcipher);
-               write( cd, gcipher->fragment, gcipher->length);
-               state->connection_state.write_sequence_number++;
-               ret += Size;
-               
-               _gnutls_freeTLSCiphertext(gcipher);
-       }
-       /* rest data */
-       if (iterations>1) {
-               Size=sizeofdata%16384;
-               err = _gnutls_text2TLSPlaintext(type, &gtxt, &data[ret], Size);
-               if (err<0) {
-                       /*gnutls_perror(err);*/
-                       return err;
+       
+               if (ret = _gnutls_TLSPlaintext2text( &tmpdata, gtxt) < 0){
+                       return ret;
                }
 
-               err = _gnutls_TLSPlaintext2TLSCompressed(state, &gcomp, gtxt);
-               if (err<0) {
-                       /*gnutls_perror(err);*/
-                       return err;
-               }
+               gnutls_insertDataBuffer(state, type, tmpdata, gtxt->length);
 
                _gnutls_freeTLSPlaintext(gtxt);
-       
-               err = _gnutls_TLSCompressed2TLSCiphertext( state, &gcipher, gcomp);
-               if (err<0) {
-                       /*gnutls_perror(err);*/
-                       return err;
-               }
-               _gnutls_freeTLSCompressed(gcomp);
-#ifdef WORDS_BIGENDIAN
-               length=gcipher->length;
-#else
-               length=byteswap16(gcipher->length);
-#endif
-               write( cd, &gcipher->type, sizeof(ContentType));
-               write( cd, &gcipher->version.major, 1);
-               write( cd, &gcipher->version.minor, 1);
-               write( cd, &length, sizeof(uint16));
-               write( cd, gcipher->fragment, gcipher->length);
-               state->connection_state.write_sequence_number++;
-               ret += Size;
+
+               /* Incread sequence number */
+               state->connection_state.read_sequence_number++;
                
-               _gnutls_freeTLSCiphertext(gcipher);
-       }
+       } while( gnutls_getDataBufferSize(state, type) < sizeofdata);
 
+       ret = gnutls_getDataFromBuffer(state, type, data, sizeofdata);
+       
        return ret;
 }
-#endif
index 896c60b00ffb0bc8836e0cfe09004264a02eb084..14612edc3b405fc29beeffcf4375f66d9f6f519d 100644 (file)
@@ -72,10 +72,16 @@ typedef struct {
        uint64  write_sequence_number;
 } ConnectionState;
 
+typedef struct {
+       char*   buffer;
+       uint32  bufferSize;
+} GNUTLS_INTERNALS;
+
 typedef struct {
        SecurityParameters security_parameters;
        CipherSpecs cipher_specs;
        ConnectionState connection_state;
+       GNUTLS_INTERNALS gnutls_internals;
 } GNUTLS_STATE_INT;
 
 typedef GNUTLS_STATE_INT *GNUTLS_STATE;
@@ -135,6 +141,8 @@ typedef struct {
 
 int gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type, char* data, int sizeofdata);
 #define gnutls_send( x, y, z, w) gnutls_send_int( x, y, GNUTLS_APPLICATION_DATA, z, w)
+int gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, char* data, int sizeofdata);
+#define gnutls_recv( x, y, z, w) gnutls_recv_int( x, y, GNUTLS_APPLICATION_DATA, z, w)
 
 #define        GNUTLS_E_MAC_FAILED -1
 #define        GNUTLS_E_UNKNOWN_CIPHER -2
@@ -143,4 +151,6 @@ int gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type, char* data, in
 #define        GNUTLS_E_UNKNOWN_ERROR -5
 #define        GNUTLS_E_UNKNOWN_CIPHER_TYPE -6
 #define        GNUTLS_E_LARGE_PACKET -7
-       
+#define GNUTLS_E_UNSUPPORTED_VERSION_PACKET -8
+#define GNUTLS_E_UNEXPECTED_PACKET_LENGTH -9
+
index 2001921b46ae7589da9f3ceec303c48c622290ff..4a63d244cc622bae0d58cf522b27fb142a823467 100644 (file)
@@ -9,7 +9,7 @@
 #define MD5_DIGEST 16
 #define SHA_DIGEST 20
 
-/* Sets the specified cipher into the state */
+/* Sets the specified cipher into the pending state */
 int _gnutls_set_cipher( GNUTLS_STATE state, BulkCipherAlgorithm algo) {
 
        switch (algo) {
@@ -38,7 +38,7 @@ int _gnutls_set_cipher( GNUTLS_STATE state, BulkCipherAlgorithm algo) {
        
 }
 
-/* Sets the specified algorithm into compression state */
+/* Sets the specified algorithm into pending compression state */
 int _gnutls_set_compression( GNUTLS_STATE state, CompressionMethod algo) {
 
        switch (algo) {
@@ -52,7 +52,7 @@ int _gnutls_set_compression( GNUTLS_STATE state, CompressionMethod algo) {
        
 }
 
-
+/* Sets the specified mac algorithm into pending state */
 int _gnutls_set_mac( GNUTLS_STATE state, MACAlgorithm algo) {
 
        switch (algo) {
@@ -80,7 +80,7 @@ int _gnutls_set_mac( GNUTLS_STATE state, MACAlgorithm algo) {
 }
 
 /* Sets the current connection state to conform with the
- * Security parameters, and initializes encryption.
+ * Security parameters(pending state), and initializes encryption.
  */
 int _gnutls_connection_state_init(GNUTLS_STATE state) {
        int rc;
@@ -421,7 +421,7 @@ int _gnutls_TLSCiphertext2TLSCompressed(GNUTLS_STATE state,
        }
 
 //     gnutls_free( MAC);
-       free( MAC);
+       if (td>=0) free( MAC);
        gnutls_free( content);
 
        return 0;
index e65ade73cbc83e4a85b74588978fa7f5f9667a91..6252285cc01c1e98da820db713134e61442e4ea1 100644 (file)
@@ -9,15 +9,18 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 
+//#define ENCRYPT
                      
 int main()
 {
        GNUTLS_STATE state;
-       char text[] = "ena xelidoni sto bouno\n";
+       char text[] = "A very large english test\n";
        GNUTLSPlaintext *gtxt;
        GNUTLSCompressed *gcomp;
        GNUTLSCiphertext *gcipher;
        int cd;
+       int ret;
+       char tmp[11];
        
        
        gnutls_init(&state, GNUTLS_CLIENT);
@@ -29,12 +32,26 @@ int main()
        _gnutls_set_keys( state);
        _gnutls_connection_state_init( state);
 
+#ifdef ENCRYPT
        remove("ciphertext");
        cd = open( "ciphertext", O_WRONLY|O_CREAT, S_IRWXU);
 
        gnutls_send( cd, state, text, strlen(text));
 
        close(cd);
+#else
+       cd = open( "ciphertext", O_RDONLY);
+
+       memset( tmp, 0, 10);
+       ret = gnutls_recv( cd, state, tmp, 10);
+       if (ret < 0) 
+               fprintf(stderr, "ret: %d\n", ret);
+       
+       tmp[10]='\0';
+       fprintf(stderr, "tmp: %s\n", tmp);
+
+       close(cd);
+#endif
        gnutls_deinit(&state);
        return 0;
 }