gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r29706 - in gnunet/src: core include util


From: gnunet
Subject: [GNUnet-SVN] r29706 - in gnunet/src: core include util
Date: Mon, 30 Sep 2013 13:22:48 +0200

Author: grothoff
Date: 2013-09-30 13:22:48 +0200 (Mon, 30 Sep 2013)
New Revision: 29706

Added:
   gnunet/src/util/perf_crypto_aes.c
Removed:
   gnunet/src/util/test_crypto_aes_weak.c
Modified:
   gnunet/src/core/gnunet-service-core_kx.c
   gnunet/src/include/gnunet_crypto_lib.h
   gnunet/src/util/Makefile.am
   gnunet/src/util/crypto_aes.c
   gnunet/src/util/crypto_hash.c
   gnunet/src/util/crypto_hkdf.c
   gnunet/src/util/crypto_kdf.c
   gnunet/src/util/test_crypto_aes.c
   gnunet/src/util/test_crypto_hash.c
Log:
-encrypt using both AES and TWOFISH, with independent symmetric keys

Modified: gnunet/src/core/gnunet-service-core_kx.c
===================================================================
--- gnunet/src/core/gnunet-service-core_kx.c    2013-09-30 11:02:19 UTC (rev 
29705)
+++ gnunet/src/core/gnunet-service-core_kx.c    2013-09-30 11:22:48 UTC (rev 
29706)
@@ -429,9 +429,11 @@
 {
   static const char ctx[] = "authentication key";
 
-  GNUNET_CRYPTO_hmac_derive_key (akey, skey, &seed, sizeof (seed), &skey->key,
-                                 sizeof (skey->key), ctx,
-                                 sizeof (ctx), NULL);
+  GNUNET_CRYPTO_hmac_derive_key (akey, skey, 
+                                 &seed, sizeof (seed), 
+                                 skey, sizeof (struct 
GNUNET_CRYPTO_AesSessionKey), 
+                                 ctx, sizeof (ctx), 
+                                 NULL);
 }
 
 

Modified: gnunet/src/include/gnunet_crypto_lib.h
===================================================================
--- gnunet/src/include/gnunet_crypto_lib.h      2013-09-30 11:02:19 UTC (rev 
29705)
+++ gnunet/src/include/gnunet_crypto_lib.h      2013-09-30 11:22:48 UTC (rev 
29706)
@@ -212,22 +212,30 @@
 struct GNUNET_CRYPTO_AesSessionKey
 {
   /**
-   * Actual key.
+   * Actual key for AES.
    */
-  unsigned char key[GNUNET_CRYPTO_AES_KEY_LENGTH];
+  unsigned char aes_key[GNUNET_CRYPTO_AES_KEY_LENGTH];
 
+  /**
+   * Actual key for TwoFish.
+   */
+  unsigned char twofish_key[GNUNET_CRYPTO_AES_KEY_LENGTH];
+
 };
+
 GNUNET_NETWORK_STRUCT_END
 
 /**
  * @brief IV for sym cipher
  *
  * NOTE: must be smaller (!) in size than the
- * struct GNUNET_HashCode.
+ * `struct GNUNET_HashCode`.
  */
 struct GNUNET_CRYPTO_AesInitializationVector
 {
-  unsigned char iv[GNUNET_CRYPTO_AES_KEY_LENGTH / 2];
+  unsigned char aes_iv[GNUNET_CRYPTO_AES_KEY_LENGTH / 2];
+
+  unsigned char twofish_iv[GNUNET_CRYPTO_AES_KEY_LENGTH / 2];
 };
 
 

Modified: gnunet/src/util/Makefile.am
===================================================================
--- gnunet/src/util/Makefile.am 2013-09-30 11:02:19 UTC (rev 29705)
+++ gnunet/src/util/Makefile.am 2013-09-30 11:22:48 UTC (rev 29706)
@@ -189,6 +189,7 @@
 if HAVE_BENCHMARKS
  BENCHMARKS = \
   perf_crypto_hash \
+  perf_crypto_aes \
   perf_malloc
 endif
 
@@ -206,7 +207,6 @@
  test_container_heap \
  test_container_slist \
  test_crypto_aes \
- test_crypto_aes_weak \
  test_crypto_crc \
  test_crypto_ecc \
  test_crypto_hash \
@@ -325,12 +325,6 @@
 test_crypto_aes_LDADD = \
  $(top_builddir)/src/util/libgnunetutil.la  
 
-test_crypto_aes_weak_SOURCES = \
- test_crypto_aes_weak.c
-test_crypto_aes_weak_LDADD = \
- $(top_builddir)/src/util/libgnunetutil.la  \
- $(LIBGCRYPT_LIBS)
-
 test_crypto_crc_SOURCES = \
  test_crypto_crc.c
 test_crypto_crc_LDADD = \
@@ -500,6 +494,11 @@
 perf_crypto_hash_LDADD = \
  $(top_builddir)/src/util/libgnunetutil.la  
 
+perf_crypto_aes_SOURCES = \
+ perf_crypto_aes.c
+perf_crypto_aes_LDADD = \
+ $(top_builddir)/src/util/libgnunetutil.la  
+
 perf_malloc_SOURCES = \
  perf_malloc.c
 perf_malloc_LDADD = \

Modified: gnunet/src/util/crypto_aes.c
===================================================================
--- gnunet/src/util/crypto_aes.c        2013-09-30 11:02:19 UTC (rev 29705)
+++ gnunet/src/util/crypto_aes.c        2013-09-30 11:22:48 UTC (rev 29706)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2001, 2002, 2003, 2004, 2005, 2006 Christian Grothoff (and other 
contributing authors)
+     (C) 2001, 2002, 2003, 2004, 2005, 2006, 2013 Christian Grothoff (and 
other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -20,7 +20,7 @@
 
 /**
  * @file util/crypto_aes.c
- * @brief Symmetric encryption services.
+ * @brief Symmetric encryption services; combined cipher AES+TWOFISH (256-bit 
each)
  * @author Christian Grothoff
  * @author Ioana Patrascu
  */
@@ -33,15 +33,19 @@
 #define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
 
 /**
- * Create a new SessionKey (for AES-256).
+ * Create a new SessionKey (for symmetric encryption).
  *
  * @param key session key to initialize
  */
 void
 GNUNET_CRYPTO_aes_create_session_key (struct GNUNET_CRYPTO_AesSessionKey *key)
 {
-  gcry_randomize (&key->key[0], GNUNET_CRYPTO_AES_KEY_LENGTH,
+  gcry_randomize (key->aes_key, 
+                  GNUNET_CRYPTO_AES_KEY_LENGTH,
                   GCRY_STRONG_RANDOM);
+  gcry_randomize (key->twofish_key, 
+                  GNUNET_CRYPTO_AES_KEY_LENGTH,
+                  GCRY_STRONG_RANDOM);
 }
 
 
@@ -54,33 +58,63 @@
  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
  */
 static int
-setup_cipher (gcry_cipher_hd_t *handle,
-             const struct GNUNET_CRYPTO_AesSessionKey *
-             sessionkey,
-             const struct GNUNET_CRYPTO_AesInitializationVector *
-             iv)
+setup_cipher_aes (gcry_cipher_hd_t *handle,
+                  const struct GNUNET_CRYPTO_AesSessionKey *sessionkey,
+                  const struct GNUNET_CRYPTO_AesInitializationVector *iv)
 {
   int rc;
 
   GNUNET_assert (0 ==
                  gcry_cipher_open (handle, GCRY_CIPHER_AES256,
                                    GCRY_CIPHER_MODE_CFB, 0));
-  rc = gcry_cipher_setkey (*handle, sessionkey, GNUNET_CRYPTO_AES_KEY_LENGTH);
+  rc = gcry_cipher_setkey (*handle, 
+                           sessionkey->aes_key, 
+                           sizeof (sessionkey->aes_key));
   GNUNET_assert ((0 == rc) || ((char) rc == GPG_ERR_WEAK_KEY));
-  rc = gcry_cipher_setiv (*handle, iv,
-                          sizeof (struct
-                                  GNUNET_CRYPTO_AesInitializationVector));
+  rc = gcry_cipher_setiv (*handle, 
+                          iv->aes_iv, 
+                          sizeof (iv->aes_iv));
   GNUNET_assert ((0 == rc) || ((char) rc == GPG_ERR_WEAK_KEY));
   return GNUNET_OK;
 }
 
 
 /**
+ * Initialize TWOFISH cipher.
+ *
+ * @param handle handle to initialize
+ * @param sessionkey session key to use
+ * @param iv initialization vector to use
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+static int
+setup_cipher_twofish (gcry_cipher_hd_t *handle,
+                      const struct GNUNET_CRYPTO_AesSessionKey *sessionkey,
+                      const struct GNUNET_CRYPTO_AesInitializationVector *iv)
+{
+  int rc;
+
+  GNUNET_assert (0 ==
+                 gcry_cipher_open (handle, GCRY_CIPHER_TWOFISH, 
+                                   GCRY_CIPHER_MODE_CFB, 0));
+  rc = gcry_cipher_setkey (*handle, 
+                           sessionkey->twofish_key, 
+                           sizeof (sessionkey->twofish_key));
+  GNUNET_assert ((0 == rc) || ((char) rc == GPG_ERR_WEAK_KEY));
+  rc = gcry_cipher_setiv (*handle, 
+                          iv->twofish_iv,
+                          sizeof (iv->twofish_iv));
+  GNUNET_assert ((0 == rc) || ((char) rc == GPG_ERR_WEAK_KEY));
+  return GNUNET_OK;
+}
+
+
+/**
  * Encrypt a block with the public key of another
  * host that uses the same cyper.
  *
  * @param block the block to encrypt
- * @param len the size of the block
+ * @param len the size of the @a block
  * @param sessionkey the key used to encrypt
  * @param iv the initialization vector to use, use INITVALUE
  *        for streams.
@@ -95,11 +129,17 @@
                            iv, void *result)
 {
   gcry_cipher_hd_t handle;
+  char tmp[len];
 
-  if (GNUNET_OK != setup_cipher (&handle, sessionkey, iv))
+  if (GNUNET_OK != setup_cipher_aes (&handle, sessionkey, iv))
     return -1;
-  GNUNET_assert (0 == gcry_cipher_encrypt (handle, result, len, block, len));
+  GNUNET_assert (0 == gcry_cipher_encrypt (handle, tmp, len, block, len));
   gcry_cipher_close (handle);
+  if (GNUNET_OK != setup_cipher_twofish (&handle, sessionkey, iv))
+    return -1;
+  GNUNET_assert (0 == gcry_cipher_encrypt (handle, result, len, tmp, len));
+  gcry_cipher_close (handle);
+  memset (tmp, 0, sizeof (tmp));
   return len;
 }
 
@@ -108,7 +148,7 @@
  * Decrypt a given block with the sessionkey.
  *
  * @param block the data to decrypt, encoded as returned by encrypt
- * @param size the size of the block to decrypt
+ * @param size the size of the @a block to decrypt
  * @param sessionkey the key used to decrypt
  * @param iv the initialization vector to use, use INITVALUE
  *        for streams.
@@ -117,17 +157,22 @@
  */
 ssize_t
 GNUNET_CRYPTO_aes_decrypt (const void *block, size_t size,
-                           const struct GNUNET_CRYPTO_AesSessionKey *
-                           sessionkey,
-                           const struct GNUNET_CRYPTO_AesInitializationVector *
-                           iv, void *result)
+                           const struct GNUNET_CRYPTO_AesSessionKey 
*sessionkey,
+                           const struct GNUNET_CRYPTO_AesInitializationVector 
*iv, 
+                           void *result)
 {
   gcry_cipher_hd_t handle;
+  char tmp[size];
 
-  if (GNUNET_OK != setup_cipher (&handle, sessionkey, iv))
+  if (GNUNET_OK != setup_cipher_twofish (&handle, sessionkey, iv))
     return -1;
-  GNUNET_assert (0 == gcry_cipher_decrypt (handle, result, size, block, size));
+  GNUNET_assert (0 == gcry_cipher_decrypt (handle, tmp, size, block, size));
   gcry_cipher_close (handle);
+  if (GNUNET_OK != setup_cipher_aes (&handle, sessionkey, iv))
+    return -1;
+  GNUNET_assert (0 == gcry_cipher_decrypt (handle, result, size, tmp, size));
+  gcry_cipher_close (handle);
+  memset (tmp, 0, sizeof (tmp));
   return size;
 }
 
@@ -138,7 +183,7 @@
  * @param iv initialization vector
  * @param skey session key
  * @param salt salt for the derivation
- * @param salt_len size of the salt
+ * @param salt_len size of the @a salt
  * @param ... pairs of void * & size_t for context chunks, terminated by NULL
  */
 void
@@ -168,8 +213,21 @@
                                const struct GNUNET_CRYPTO_AesSessionKey *skey,
                                const void *salt, size_t salt_len, va_list argp)
 {
-  GNUNET_CRYPTO_kdf_v (iv->iv, sizeof (iv->iv), salt, salt_len, skey->key,
-                       sizeof (skey->key), argp);
+  char aes_salt[salt_len + 4];
+  char twofish_salt[salt_len + 4];
+
+  memcpy (aes_salt, salt, salt_len);
+  memcpy (&aes_salt[salt_len], "AES!", 4);
+  memcpy (twofish_salt, salt, salt_len);
+  memcpy (&twofish_salt[salt_len], "FISH", 4);
+  GNUNET_CRYPTO_kdf_v (iv->aes_iv, sizeof (iv->aes_iv), 
+                       aes_salt, salt_len + 4, 
+                       skey->aes_key, sizeof (skey->aes_key), 
+                       argp);
+  GNUNET_CRYPTO_kdf_v (iv->twofish_iv, sizeof (iv->twofish_iv),
+                       twofish_salt, salt_len + 4, 
+                       skey->twofish_key, sizeof (skey->twofish_key), 
+                       argp);
 }
 
 /* end of crypto_aes.c */

Modified: gnunet/src/util/crypto_hash.c
===================================================================
--- gnunet/src/util/crypto_hash.c       2013-09-30 11:02:19 UTC (rev 29705)
+++ gnunet/src/util/crypto_hash.c       2013-09-30 11:22:48 UTC (rev 29706)
@@ -252,7 +252,7 @@
  *  safely cast to char*, a '\\0' termination is set).
  */
 void
-GNUNET_CRYPTO_hash_to_enc (const struct GNUNET_HashCode * block,
+GNUNET_CRYPTO_hash_to_enc (const struct GNUNET_HashCode *block,
                            struct GNUNET_CRYPTO_HashAsciiEncoded *result)
 {
   char *np;
@@ -270,13 +270,14 @@
  * Convert ASCII encoding back to hash code.
  *
  * @param enc the encoding
- * @param enclen number of characters in 'enc' (without 0-terminator, which 
can be missing)
+ * @param enclen number of characters in @a enc (without 0-terminator, which 
can be missing)
  * @param result where to store the hash code
- * @return GNUNET_OK on success, GNUNET_SYSERR if result has the wrong encoding
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR if result has the wrong 
encoding
  */
 int
-GNUNET_CRYPTO_hash_from_string2 (const char *enc, size_t enclen,
-                                struct GNUNET_HashCode * result)
+GNUNET_CRYPTO_hash_from_string2 (const char *enc,
+                                 size_t enclen,
+                                struct GNUNET_HashCode *result)
 {
   char upper_enc[enclen];
   char* up_ptr = upper_enc;
@@ -303,8 +304,8 @@
  *  hashcode proximity.
  */
 unsigned int
-GNUNET_CRYPTO_hash_distance_u32 (const struct GNUNET_HashCode * a,
-                                 const struct GNUNET_HashCode * b)
+GNUNET_CRYPTO_hash_distance_u32 (const struct GNUNET_HashCode *a,
+                                 const struct GNUNET_HashCode *b)
 {
   unsigned int x1 = (a->bits[1] - b->bits[1]) >> 16;
   unsigned int x2 = (b->bits[1] - a->bits[1]) >> 16;
@@ -338,9 +339,9 @@
  * @param result set to b - a
  */
 void
-GNUNET_CRYPTO_hash_difference (const struct GNUNET_HashCode * a,
-                               const struct GNUNET_HashCode * b,
-                               struct GNUNET_HashCode * result)
+GNUNET_CRYPTO_hash_difference (const struct GNUNET_HashCode *a,
+                               const struct GNUNET_HashCode *b,
+                               struct GNUNET_HashCode *result)
 {
   int i;
 
@@ -393,16 +394,20 @@
  * @param iv set to a valid initialization vector
  */
 void
-GNUNET_CRYPTO_hash_to_aes_key (const struct GNUNET_HashCode * hc,
+GNUNET_CRYPTO_hash_to_aes_key (const struct GNUNET_HashCode *hc,
                                struct GNUNET_CRYPTO_AesSessionKey *skey,
                                struct GNUNET_CRYPTO_AesInitializationVector 
*iv)
 {
-  GNUNET_assert (sizeof (struct GNUNET_HashCode) >=
-                 GNUNET_CRYPTO_AES_KEY_LENGTH +
-                 sizeof (struct GNUNET_CRYPTO_AesInitializationVector));
-  memcpy (skey, hc, GNUNET_CRYPTO_AES_KEY_LENGTH);
-  memcpy (iv, &((char *) hc)[GNUNET_CRYPTO_AES_KEY_LENGTH],
-          sizeof (struct GNUNET_CRYPTO_AesInitializationVector));
+  GNUNET_assert (GNUNET_YES ==
+                 GNUNET_CRYPTO_kdf (skey, sizeof (struct 
GNUNET_CRYPTO_AesSessionKey),
+                                    "Hash key derivation", strlen ("Hash key 
derivation"),
+                                    hc, sizeof (struct GNUNET_HashCode),
+                                    NULL, 0));
+  GNUNET_assert (GNUNET_YES ==
+                 GNUNET_CRYPTO_kdf (iv, sizeof (struct 
GNUNET_CRYPTO_AesInitializationVector),
+                                    "Initialization vector derivation", strlen 
("Initialization vector derivation"),
+                                    hc, sizeof (struct GNUNET_HashCode),
+                                    NULL, 0));
 }
 
 
@@ -422,7 +427,7 @@
 
 /**
  * Determine how many low order bits match in two
- * struct GNUNET_HashCodes.  i.e. - 010011 and 011111 share
+ * `struct GNUNET_HashCode`s.  i.e. - 010011 and 011111 share
  * the first two lowest order bits, and therefore the
  * return value is two (NOT XOR distance, nor how many
  * bits match absolutely!).
@@ -455,7 +460,8 @@
  * @return 1 if h1 > h2, -1 if h1 < h2 and 0 if h1 == h2.
  */
 int
-GNUNET_CRYPTO_hash_cmp (const struct GNUNET_HashCode * h1, const struct 
GNUNET_HashCode * h2)
+GNUNET_CRYPTO_hash_cmp (const struct GNUNET_HashCode *h1, 
+                        const struct GNUNET_HashCode *h2)
 {
   unsigned int *i1;
   unsigned int *i2;
@@ -475,7 +481,7 @@
 
 
 /**
- * Find out which of the two GNUNET_CRYPTO_hash codes is closer to target
+ * Find out which of the two `struct GNUNET_HashCode`s is closer to target
  * in the XOR metric (Kademlia).
  *
  * @param h1 some hash code
@@ -484,9 +490,9 @@
  * @return -1 if h1 is closer, 1 if h2 is closer and 0 if h1==h2.
  */
 int
-GNUNET_CRYPTO_hash_xorcmp (const struct GNUNET_HashCode * h1,
-                           const struct GNUNET_HashCode * h2,
-                           const struct GNUNET_HashCode * target)
+GNUNET_CRYPTO_hash_xorcmp (const struct GNUNET_HashCode *h1,
+                           const struct GNUNET_HashCode *h2,
+                           const struct GNUNET_HashCode *target)
 {
   int i;
   unsigned int d1;
@@ -510,7 +516,7 @@
  * @param key authentication key
  * @param rkey root key
  * @param salt salt
- * @param salt_len size of the salt
+ * @param salt_len size of the @a salt
  * @param ... pair of void * & size_t for context chunks, terminated by NULL
  */
 void
@@ -531,7 +537,7 @@
  * @param key authentication key
  * @param rkey root key
  * @param salt salt
- * @param salt_len size of the salt
+ * @param salt_len size of the @a salt
  * @param argp pair of void * & size_t for context chunks, terminated by NULL
  */
 void
@@ -540,8 +546,10 @@
                                  const void *salt, size_t salt_len,
                                  va_list argp)
 {
-  GNUNET_CRYPTO_kdf_v (key->key, sizeof (key->key), salt, salt_len, rkey->key,
-                       sizeof (rkey->key), argp);
+  GNUNET_CRYPTO_kdf_v (key->key, sizeof (key->key), 
+                       salt, salt_len, 
+                       rkey, sizeof (struct GNUNET_CRYPTO_AesSessionKey),
+                       argp);
 }
 
 
@@ -550,7 +558,7 @@
  *
  * @param key secret key
  * @param plaintext input plaintext
- * @param plaintext_len length of plaintext
+ * @param plaintext_len length of @a plaintext
  * @param hmac where to store the hmac
  */
 void

Modified: gnunet/src/util/crypto_hkdf.c
===================================================================
--- gnunet/src/util/crypto_hkdf.c       2013-09-30 11:02:19 UTC (rev 29705)
+++ gnunet/src/util/crypto_hkdf.c       2013-09-30 11:22:48 UTC (rev 29706)
@@ -275,10 +275,10 @@
  * @param xtr_algo hash algorithm for the extraction phase, GCRY_MD_...
  * @param prf_algo hash algorithm for the expansion phase, GCRY_MD_...
  * @param xts salt
- * @param xts_len length of xts
+ * @param xts_len length of @a xts
  * @param skm source key material
- * @param skm_len length of skm
- * @return GNUNET_YES on success
+ * @param skm_len length of @a skm
+ * @return #GNUNET_YES on success
  */
 int
 GNUNET_CRYPTO_hkdf (void *result, size_t out_len, int xtr_algo, int prf_algo,

Modified: gnunet/src/util/crypto_kdf.c
===================================================================
--- gnunet/src/util/crypto_kdf.c        2013-09-30 11:02:19 UTC (rev 29705)
+++ gnunet/src/util/crypto_kdf.c        2013-09-30 11:22:48 UTC (rev 29706)
@@ -36,11 +36,11 @@
  * @param result buffer for the derived key, allocated by caller
  * @param out_len desired length of the derived key
  * @param xts salt
- * @param xts_len length of xts
+ * @param xts_len length of @a xts
  * @param skm source key material
- * @param skm_len length of skm
+ * @param skm_len length of @a skm
  * @param argp va_list of void * & size_t pairs for context chunks
- * @return GNUNET_YES on success
+ * @return #GNUNET_YES on success
  */
 int
 GNUNET_CRYPTO_kdf_v (void *result, size_t out_len, const void *xts,
@@ -68,11 +68,11 @@
  * @param result buffer for the derived key, allocated by caller
  * @param out_len desired length of the derived key
  * @param xts salt
- * @param xts_len length of xts
+ * @param xts_len length of @a xts
  * @param skm source key material
- * @param skm_len length of skm
+ * @param skm_len length of @a skm
  * @param ... void * & size_t pairs for context chunks
- * @return GNUNET_YES on success
+ * @return #GNUNET_YES on success
  */
 int
 GNUNET_CRYPTO_kdf (void *result, size_t out_len, const void *xts,

Added: gnunet/src/util/perf_crypto_aes.c
===================================================================
--- gnunet/src/util/perf_crypto_aes.c                           (rev 0)
+++ gnunet/src/util/perf_crypto_aes.c   2013-09-30 11:22:48 UTC (rev 29706)
@@ -0,0 +1,76 @@
+/*
+     This file is part of GNUnet.
+     (C) 2002, 2003, 2004, 2006 Christian Grothoff (and other contributing 
authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @author Christian Grothoff
+ * @file util/perf_crypto_aes.c
+ * @brief measure performance of encryption function
+ */
+#include "platform.h"
+#include "gnunet_common.h"
+#include "gnunet_util_lib.h"
+#include <gauger.h>
+
+
+static void
+perfEncrypt ()
+{
+  unsigned int i;
+  char buf[64 * 1024];
+  char rbuf[64 * 1024];
+  struct GNUNET_CRYPTO_AesSessionKey sk;
+  struct GNUNET_CRYPTO_AesInitializationVector iv;
+
+  GNUNET_CRYPTO_aes_create_session_key (&sk);
+
+  memset (buf, 1, sizeof (buf));
+  for (i = 0; i < 1024; i++)
+  {
+    memset (&iv, (int8_t) i, sizeof (iv));
+    GNUNET_CRYPTO_aes_encrypt (buf, sizeof (buf),
+                               &sk, &iv,
+                               rbuf);
+    GNUNET_CRYPTO_aes_decrypt (rbuf, sizeof (buf),
+                               &sk, &iv,
+                               buf);
+  }
+  memset (rbuf, 1, sizeof (rbuf));
+  GNUNET_assert (0 == memcmp (rbuf, buf, sizeof (buf)));
+}
+
+
+int
+main (int argc, char *argv[])
+{
+  struct GNUNET_TIME_Absolute start;
+
+  start = GNUNET_TIME_absolute_get ();
+  perfEncrypt ();
+  printf ("Encrypt perf took %s\n",
+          GNUNET_STRINGS_relative_time_to_string 
(GNUNET_TIME_absolute_get_duration (start),
+                                                 GNUNET_YES));
+  GAUGER ("UTIL", "Symmetric encryption",
+          64 * 1024 / (1 +
+                      GNUNET_TIME_absolute_get_duration
+                      (start).rel_value_us / 1000LL), "kb/ms");
+  return 0;
+}
+
+/* end of perf_crypto_aes.c */

Modified: gnunet/src/util/test_crypto_aes.c
===================================================================
--- gnunet/src/util/test_crypto_aes.c   2013-09-30 11:02:19 UTC (rev 29705)
+++ gnunet/src/util/test_crypto_aes.c   2013-09-30 11:22:48 UTC (rev 29706)
@@ -28,7 +28,7 @@
 #include "gnunet_crypto_lib.h"
 
 #define TESTSTRING "Hello World!"
-#define INITVALUE "InitializationVectorValue"
+#define INITVALUE "InitializationVectorValueinitializationvectorvalue"
 
 static int
 testSymcipher ()
@@ -68,7 +68,8 @@
     return 0;
 }
 
-int
+
+static int
 verifyCrypto ()
 {
   struct GNUNET_CRYPTO_AesSessionKey key;
@@ -77,25 +78,34 @@
   int ret;
 
   unsigned char plain[] =
-      { 29, 128, 192, 253, 74, 171, 38, 187, 84, 219, 76, 76, 209, 118, 33, 
249,
+  {
+    29, 128, 192, 253, 74, 171, 38, 187, 84, 219, 76, 76, 209, 118, 33, 249,
     172, 124, 96, 9, 157, 110, 8, 215, 200, 63, 69, 230, 157, 104, 247, 164
   };
-  unsigned char raw_key[] =
-      { 106, 74, 209, 88, 145, 55, 189, 135, 125, 180, 225, 108, 183, 54, 25,
+  unsigned char raw_key_aes[] =
+  {
+    106, 74, 209, 88, 145, 55, 189, 135, 125, 180, 225, 108, 183, 54, 25,
     169, 129, 188, 131, 75, 227, 245, 105, 10, 225, 15, 115, 159, 148, 184,
     34, 191
   };
+  unsigned char raw_key_twofish[] =
+  {
+    145, 55, 189, 135, 125, 180, 225, 108, 183, 54, 25,
+    169, 129, 188, 131, 75, 227, 245, 105, 10, 225, 15, 115, 159, 148, 184,
+    34, 191, 106, 74, 209, 88
+  };
   unsigned char encrresult[] =
-      { 167, 102, 230, 233, 127, 195, 176, 107, 17, 91, 199, 127, 96, 113, 75,
-    195, 245, 217, 61, 236, 159, 165, 103, 121, 203, 99, 202, 41, 23, 222, 25,
-    102
+  {
+    161, 152, 186, 231, 214, 55, 225, 206, 85, 43, 80, 134, 145, 198, 20, 
+    233, 236, 57, 194, 10, 147, 149, 30, 106, 179, 54, 182, 247, 71, 204, 
+    179, 51, 1
   };
 
   res = NULL;
   ret = 0;
 
-  memcpy (key.key, raw_key, GNUNET_CRYPTO_AES_KEY_LENGTH);
-
+  memcpy (key.aes_key, raw_key_aes, GNUNET_CRYPTO_AES_KEY_LENGTH);
+  memcpy (key.twofish_key, raw_key_twofish, GNUNET_CRYPTO_AES_KEY_LENGTH);
   if (GNUNET_CRYPTO_AES_KEY_LENGTH !=
       GNUNET_CRYPTO_aes_encrypt (plain, GNUNET_CRYPTO_AES_KEY_LENGTH, &key,
                                  (const struct
@@ -107,15 +117,17 @@
     goto error;
   }
 
-  if (memcmp (encrresult, result, GNUNET_CRYPTO_AES_KEY_LENGTH) != 0)
+  if (0 != memcmp (encrresult, result, GNUNET_CRYPTO_AES_KEY_LENGTH))
   {
+    int i;
     printf ("Encrypted result wrong.\n");
+    for (i=0;i<GNUNET_CRYPTO_AES_KEY_LENGTH;i++)
+      printf ("%u, ", (uint8_t) result[i]);
     ret = 1;
     goto error;
   }
 
   res = GNUNET_malloc (GNUNET_CRYPTO_AES_KEY_LENGTH);
-
   if (GNUNET_CRYPTO_AES_KEY_LENGTH !=
       GNUNET_CRYPTO_aes_decrypt (result, GNUNET_CRYPTO_AES_KEY_LENGTH, &key,
                                  (const struct
@@ -126,21 +138,17 @@
     ret = 1;
     goto error;
   }
-
-  if (memcmp (res, plain, GNUNET_CRYPTO_AES_KEY_LENGTH) != 0)
+  if (0 != memcmp (res, plain, GNUNET_CRYPTO_AES_KEY_LENGTH))
   {
     printf ("Decrypted result does not match input.\n");
-
     ret = 1;
   }
-
 error:
-
   GNUNET_free_non_null (res);
-
   return ret;
 }
 
+
 int
 main (int argc, char *argv[])
 {

Deleted: gnunet/src/util/test_crypto_aes_weak.c
===================================================================
--- gnunet/src/util/test_crypto_aes_weak.c      2013-09-30 11:02:19 UTC (rev 
29705)
+++ gnunet/src/util/test_crypto_aes_weak.c      2013-09-30 11:22:48 UTC (rev 
29706)
@@ -1,198 +0,0 @@
-/*
-     This file is part of GNUnet.
-     (C) 2003, 2004, 2005, 2006 Christian Grothoff (and other contributing 
authors)
-
-     GNUnet is free software; you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 3, or (at your
-     option) any later version.
-
-     GNUnet is distributed in the hope that it will be useful, but
-     WITHOUT ANY WARRANTY; without even the implied warranty of
-     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-     General Public License for more details.
-
-     You should have received a copy of the GNU General Public License
-     along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
-
-*/
-
-/**
- * @author Krista Bennett
- * @author Christian Grothoff
- * @file util/test_crypto_aes_weak.c
- * @brief AES weak key test.
- */
-#include "platform.h"
-#include "gnunet_common.h"
-#include "gnunet_crypto_lib.h"
-#include <gcrypt.h>
-
-#define MAX_WEAK_KEY_TRIALS 100000
-#define GENERATE_WEAK_KEYS GNUNET_NO
-#define WEAK_KEY_TESTSTRING "I hate weak keys."
-
-static void
-printWeakKey (struct GNUNET_CRYPTO_AesSessionKey *key)
-{
-  int i;
-
-  for (i = 0; i < GNUNET_CRYPTO_AES_KEY_LENGTH; i++)
-  {
-    printf ("%x ", (int) (key->key[i]));
-  }
-}
-
-static int
-testWeakKey ()
-{
-  char result[100];
-  char res[100];
-  int size;
-  struct GNUNET_CRYPTO_AesSessionKey weak_key;
-  struct GNUNET_CRYPTO_AesInitializationVector INITVALUE;
-
-  memset (&INITVALUE, 42,
-          sizeof (struct GNUNET_CRYPTO_AesInitializationVector));
-  /* sorry, this is not a weak key -- I don't have
-   * any at the moment! */
-  weak_key.key[0] = (char) (0x4c);
-  weak_key.key[1] = (char) (0x31);
-  weak_key.key[2] = (char) (0xc6);
-  weak_key.key[3] = (char) (0x2b);
-  weak_key.key[4] = (char) (0xc1);
-  weak_key.key[5] = (char) (0x5f);
-  weak_key.key[6] = (char) (0x4d);
-  weak_key.key[7] = (char) (0x1f);
-  weak_key.key[8] = (char) (0x31);
-  weak_key.key[9] = (char) (0xaa);
-  weak_key.key[10] = (char) (0x12);
-  weak_key.key[11] = (char) (0x2e);
-  weak_key.key[12] = (char) (0xb7);
-  weak_key.key[13] = (char) (0x82);
-  weak_key.key[14] = (char) (0xc0);
-  weak_key.key[15] = (char) (0xb6);
-  weak_key.key[16] = (char) (0x4d);
-  weak_key.key[17] = (char) (0x1f);
-  weak_key.key[18] = (char) (0x31);
-  weak_key.key[19] = (char) (0xaa);
-  weak_key.key[20] = (char) (0x4c);
-  weak_key.key[21] = (char) (0x31);
-  weak_key.key[22] = (char) (0xc6);
-  weak_key.key[23] = (char) (0x2b);
-  weak_key.key[24] = (char) (0xc1);
-  weak_key.key[25] = (char) (0x5f);
-  weak_key.key[26] = (char) (0x4d);
-  weak_key.key[27] = (char) (0x1f);
-  weak_key.key[28] = (char) (0x31);
-  weak_key.key[29] = (char) (0xaa);
-  weak_key.key[30] = (char) (0xaa);
-  weak_key.key[31] = (char) (0xaa);
-  /* memset(&weak_key, 0, 32); */
-  size =
-      GNUNET_CRYPTO_aes_encrypt (WEAK_KEY_TESTSTRING,
-                                 strlen (WEAK_KEY_TESTSTRING) + 1, &weak_key,
-                                 &INITVALUE, result);
-
-  if (size == -1)
-  {
-    GNUNET_break (0);
-    return 1;
-  }
-
-  size = GNUNET_CRYPTO_aes_decrypt (result, size, &weak_key, &INITVALUE, res);
-
-  if ((strlen (WEAK_KEY_TESTSTRING) + 1) != size)
-  {
-    GNUNET_break (0);
-    return 1;
-  }
-  if (0 != strcmp (res, WEAK_KEY_TESTSTRING))
-  {
-    GNUNET_break (0);
-    return 1;
-  }
-  else
-    return 0;
-}
-
-static int
-getWeakKeys ()
-{
-  struct GNUNET_CRYPTO_AesSessionKey sessionkey;
-  int number_of_weak_keys = 0;
-  int number_of_runs;
-
-  gcry_cipher_hd_t handle;
-  int rc;
-
-  for (number_of_runs = 0; number_of_runs < MAX_WEAK_KEY_TRIALS;
-       number_of_runs++)
-  {
-
-    if (number_of_runs % 1000 == 0)
-      FPRINTF (stderr, "%s",  ".");
-    /*printf("Got to run number %d.\n", number_of_runs); */
-    GNUNET_CRYPTO_aes_create_session_key (&sessionkey);
-
-    rc = gcry_cipher_open (&handle, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CFB,
-                           0);
-
-    if (rc)
-    {
-      printf ("testweakkey: gcry_cipher_open failed on trial %d. %s\n",
-              number_of_runs, gcry_strerror (rc));
-      continue;
-    }
-
-    rc = gcry_cipher_setkey (handle, &sessionkey, 
GNUNET_CRYPTO_AES_KEY_LENGTH);
-
-    if ((char) rc == GPG_ERR_WEAK_KEY)
-    {
-      printf ("\nWeak key (in hex): ");
-      printWeakKey (&sessionkey);
-      printf ("\n");
-      number_of_weak_keys++;
-    }
-    else if (rc)
-    {
-      printf ("\nUnexpected error generating keys. Error is %s\n",
-              gcry_strerror (rc));
-    }
-
-    gcry_cipher_close (handle);
-
-  }
-
-  return number_of_weak_keys;
-}
-
-int
-main (int argc, char *argv[])
-{
-  int weak_keys;
-
-  GNUNET_log_setup ("test-crypto-aes-weak", "WARNING", NULL);
-  if (GENERATE_WEAK_KEYS)
-  {
-    weak_keys = getWeakKeys ();
-
-    if (weak_keys == 0)
-    {
-      printf ("\nNo weak keys found in %d runs.\n", MAX_WEAK_KEY_TRIALS);
-    }
-    else
-    {
-      printf ("\n%d weak keys found in %d runs.\n", weak_keys,
-              MAX_WEAK_KEY_TRIALS);
-    }
-  }
-
-  if (testWeakKey () != 0)
-    return -1;
-  return 0;
-}
-
-/* end of weakkeytest.c */

Modified: gnunet/src/util/test_crypto_hash.c
===================================================================
--- gnunet/src/util/test_crypto_hash.c  2013-09-30 11:02:19 UTC (rev 29705)
+++ gnunet/src/util/test_crypto_hash.c  2013-09-30 11:22:48 UTC (rev 29706)
@@ -65,8 +65,6 @@
 static int
 testArithmetic ()
 {
-  static struct GNUNET_CRYPTO_AesSessionKey zskey;
-  static struct GNUNET_CRYPTO_AesInitializationVector ziv;
   struct GNUNET_HashCode h1;
   struct GNUNET_HashCode h2;
   struct GNUNET_HashCode d;
@@ -100,9 +98,6 @@
     return 1;
   memset (&d, 0, sizeof (d));
   GNUNET_CRYPTO_hash_to_aes_key (&d, &skey, &iv);
-  if ((0 != memcmp (&skey, &zskey, sizeof (skey) - sizeof (unsigned int))) ||
-      (0 != memcmp (&iv, &ziv, sizeof (iv))))
-    return 1;
   return 0;
 }
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]