## Process this file with automake to produce Makefile.in
-EXTRA_DIST = gcrypt.m4
+EXTRA_DIST =
SUBDIRS = lib src doc
\ No newline at end of file
#undef NAME_OF_DEV_URANDOM
#undef HAVE_DEV_RANDOM
+#undef USE_MHASH
+#undef USE_MCRYPT
+
#undef PACKAGE
#undef VERSION
opt_maintainer_mode=$enableval)
AC_MSG_RESULT($opt_maintainer_mode)
+AC_ARG_WITH( mcrypt, [ --with-mcrypt enable mcrypt support],
+ [ AC_CHECK_LIB(dl, dlopen)
+ AC_CHECK_LIB(mcrypt, mcrypt_module_open,
+ LIBS="${LIBS} -lmcrypt"
+ AC_DEFINE(USE_MCRYPT),
+ [
+ AC_CHECK_LIB(dld, dld_init)
+ AC_CHECK_LIB(ltdl, lt_dlinit)
+ AC_CHECK_LIB(mcrypt, mcrypt_enc_get_key_size,
+ LIBS="${LIBS} -lmcrypt"
+ AC_DEFINE(USE_MCRYPT),
+ AC_MSG_ERROR("You need libmcrypt 2.4.x or libmcrypt-nm to compile this program. http://mcrypt.hellug.gr"))
+ ])
+ ]
+
+)
+
+AC_ARG_WITH( mhash, [ --with-mhash enable mhash support],
+ [AC_CHECK_LIB(mhash, mhash_init_m, AC_DEFINE(USE_MHASH))])
if test $ac_cv_prog_gcc != no; then
CFLAGS="${CFLAGS} -O2 -g -ffast-math"
static gnutls_cipher_entry algorithms[] = {
GNUTLS_CIPHER_ENTRY(GNUTLS_3DES, 8, 24, 1, 8, -1),
- GNUTLS_CIPHER_ENTRY(GNUTLS_ARCFOUR, 1, 16, 0, 0, -2),
+ GNUTLS_CIPHER_ENTRY(GNUTLS_ARCFOUR, 1, 16, 0, 0, -1),
GNUTLS_CIPHER_ENTRY(GNUTLS_NULL, 1, 0, 0, 0, -1),
{0}
};
gnutls_free(state->connection_state.read_mac_secret);
if (state->connection_state.read_cipher_state != NULL)
- gcry_cipher_close(state->
+ gnutls_cipher_deinit(state->
connection_state.read_cipher_state);
if (state->connection_state.write_cipher_state != NULL)
- gcry_cipher_close(state->
+ gnutls_cipher_deinit(state->
connection_state.write_cipher_state);
gnutls_free(state->connection_state.read_compression_state);
*/
#include <defines.h>
-#include "gnutls_int.h"
-#include "gnutls_errors.h"
+#include <gnutls_int.h>
+#include <gnutls_errors.h>
+#include <gnutls_cipher_int.h>
GNUTLS_CIPHER_HANDLE gnutls_cipher_init( BulkCipherAlgorithm cipher, void* key, int keysize, void* iv, int ivsize)
{
ret = GNUTLS_CIPHER_FAILED;
break;
case GNUTLS_3DES:
+#ifdef USE_MCRYPT
+ ret = mcrypt_module_open( "tripledes", NULL, "cbc", NULL);
+#else
ret = gcry_cipher_open(GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_CBC, 0);
+#endif
+ break;
+ case GNUTLS_ARCFOUR:
+#ifdef USE_MCRYPT
+ ret = mcrypt_module_open( "arcfour", NULL, "stream", NULL);
+#else
+ ret = GNUTLS_CIPHER_FAILED;
+#endif
break;
default:
ret = GNUTLS_CIPHER_FAILED;
}
- if (ret!=NULL) {
+ if (ret!=GNUTLS_CIPHER_FAILED) {
+#ifdef USE_MCRYPT
+ /* ivsize is assumed to be blocksize */
+ if ( mcrypt_generic_init( ret, key, keysize, iv) < 0) {
+ return GNUTLS_CIPHER_FAILED;
+ };
+#else
gcry_cipher_setkey(ret, key, keysize);
gcry_cipher_setiv(ret, iv, ivsize);
+#endif
}
return ret;
int gnutls_cipher_encrypt(GNUTLS_CIPHER_HANDLE handle, void* text, int textlen) {
if (handle!=NULL) {
+#ifdef USE_MCRYPT
+ mcrypt_generic( handle, text, textlen);
+#else
gcry_cipher_encrypt( handle, text, textlen, text, textlen);
+#endif
}
return 0;
}
int gnutls_cipher_decrypt(GNUTLS_CIPHER_HANDLE handle, void* ciphertext, int ciphertextlen) {
if (handle!=NULL) {
+#ifdef USE_MCRYPT
+ mdecrypt_generic( handle, ciphertext, ciphertextlen);
+#else
gcry_cipher_decrypt( handle, ciphertext, ciphertextlen, ciphertext, ciphertextlen);
+#endif
}
return 0;
}
void gnutls_cipher_deinit(GNUTLS_CIPHER_HANDLE handle) {
if (handle!=NULL) {
+#ifdef USE_MCRYPT
+ mcrypt_generic_end( handle);
+#else
gcry_cipher_close(handle);
+#endif
}
}
+#ifndef GNUTLS_CIPHER_INT
+# define GNUTLS_CIPHER_INT
+
+#ifdef USE_MCRYPT
+# include <mcrypt.h>
+# define GNUTLS_CIPHER_HANDLE MCRYPT
+# define GNUTLS_CIPHER_FAILED MCRYPT_FAILED
+#else
+# include <gcrypt.h>
+# define GNUTLS_CIPHER_HANDLE GCRY_CIPHER_HD
+# define GNUTLS_CIPHER_FAILED NULL
+#endif
+
GNUTLS_CIPHER_HANDLE gnutls_cipher_init( BulkCipherAlgorithm cipher, void* key, int keysize, void* iv, int ivsize);
int gnutls_cipher_encrypt(GNUTLS_CIPHER_HANDLE handle, void* text, int textlen);
int gnutls_cipher_decrypt(GNUTLS_CIPHER_HANDLE handle, void* ciphertext, int ciphertextlen);
void gnutls_cipher_deinit(GNUTLS_CIPHER_HANDLE handle);
+
+#endif /* GNUTLS_CIPHER_INT */
break;
case GNUTLS_MAC_SHA:
#ifdef USE_MHASH
- ret = mhash_init( MHASH_SHA1);
+ ret = mhash_init_m( MHASH_SHA1, gnutls_malloc);
#else
ret = gcry_md_open( GCRY_MD_SHA1, 0);
#endif
break;
case GNUTLS_MAC_MD5:
#ifdef USE_MHASH
- ret = mhash_init( MHASH_SHA1);
+ ret = mhash_init_m( MHASH_MD5, gnutls_malloc);
#else
ret = gcry_md_open( GCRY_MD_MD5, 0);
#endif
break;
case GNUTLS_MAC_MD5:
#ifdef USE_MHASH
- ret = mhash_get_block_size(MHASH_SHA1);
+ ret = mhash_get_block_size(MHASH_MD5);
#else
ret = gcry_md_get_algo_dlen( GCRY_MD_MD5);
#endif
}
int gnutls_hash(GNUTLS_HASH_HANDLE handle, void* text, int textlen) {
-
+#ifdef USE_MHASH
+ mhash( handle, text, textlen);
+#else
gcry_md_write( handle, text, textlen);
+#endif
return 0;
}
break;
case GNUTLS_MAC_SHA:
#ifdef USE_MHASH
- ret = mhash_hmac_init( MHASH_SHA1, key, keylen, 0);
+ ret = mhash_hmac_init_m( MHASH_SHA1, key, keylen, 0, gnutls_malloc);
#else
ret = gcry_md_open( GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC);
#endif
break;
case GNUTLS_MAC_MD5:
#ifdef USE_MHASH
- ret = mhash_hmac_init( MHASH_SHA1, key, keylen, 0);
+ ret = mhash_hmac_init_m( MHASH_MD5, key, keylen, 0, gnutls_malloc);
#else
ret = gcry_md_open( GCRY_MD_MD5, GCRY_MD_FLAG_HMAC);
#endif
break;
case GNUTLS_MAC_MD5:
#ifdef USE_MHASH
- ret = mhash_get_block_size(MHASH_SHA1);
+ ret = mhash_get_block_size(MHASH_MD5);
#else
ret = gcry_md_get_algo_dlen( GCRY_MD_MD5);
#endif
#define GNUTLS_INT_H
-#undef HARD_DEBUG
+#define HARD_DEBUG
#undef READ_DEBUG
#undef WRITE_DEBUG
#define DEBUG
#define MAX24 16777215
#define MAX16 65535
-
-/* for symmetric ciphers */
-#define GNUTLS_CIPHER_HANDLE GCRY_CIPHER_HD
-#define GNUTLS_CIPHER_FAILED NULL
-
/* for big numbers support */ /* FIXME */
+#include <gcrypt.h>
+
#define GNUTLS_MPI MPI
#define gnutls_mpi_release mpi_release
typedef enum CompressionMethod CompressionMethod;
#include <gnutls_hash_int.h>
+#include <gnutls_cipher_int.h>
typedef struct {
ConnectionEnd entity;