From: Nikos Mavrogiannopoulos Date: Mon, 13 Mar 2000 19:52:53 +0000 (+0000) Subject: Added gnutls_recv... Works only for application data, and it is not X-Git-Tag: gnutls0-0-4~113 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=13d6edeacce11a8db7456ff808e4161ae90f097b;p=thirdparty%2Fgnutls.git Added gnutls_recv... Works only for application data, and it is not tested. --- diff --git a/configure.in b/configure.in index b1d759566a..3e24d4a3f6 100644 --- a/configure.in +++ b/configure.in @@ -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" diff --git a/src/Makefile.am b/src/Makefile.am index 8010cac539..ab81c6b0a9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 diff --git a/src/gnutls.c b/src/gnutls.c index 9f528d43ee..39f131eda9 100644 --- a/src/gnutls.c +++ b/src/gnutls.c @@ -4,6 +4,7 @@ #include "gnutls_compress.h" #include "gnutls_plaintext.h" #include "gnutls_cipher.h" +#include "gnutls_buffers.h" #include #include #include @@ -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;itype, 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, >xt, &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 diff --git a/src/gnutls.h b/src/gnutls.h index 896c60b00f..14612edc3b 100644 --- a/src/gnutls.h +++ b/src/gnutls.h @@ -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 + diff --git a/src/gnutls_cipher.c b/src/gnutls_cipher.c index 2001921b46..4a63d244cc 100644 --- a/src/gnutls_cipher.c +++ b/src/gnutls_cipher.c @@ -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; diff --git a/src/test.c b/src/test.c index e65ade73cb..6252285cc0 100644 --- a/src/test.c +++ b/src/test.c @@ -9,15 +9,18 @@ #include #include +//#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; }