tested.
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"
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
#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>
(*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)
}
/* 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;
}
-#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, >xt, &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, >xt, 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, >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
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;
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
#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
+
#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) {
}
-/* 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) {
}
-
+/* Sets the specified mac algorithm into pending state */
int _gnutls_set_mac( GNUTLS_STATE state, MACAlgorithm algo) {
switch (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;
}
// gnutls_free( MAC);
- free( MAC);
+ if (td>=0) free( MAC);
gnutls_free( content);
return 0;
#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);
_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;
}