* random.c (_gcry_fast_random_poll): Initialize the module so the
authorWerner Koch <wk@gnupg.org>
Thu, 2 May 2002 14:09:27 +0000 (14:09 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 2 May 2002 14:09:27 +0000 (14:09 +0000)
mutex can be used.

* primegen.c (small_prime_numbers): Moved table from smallprime.c
* smallprime.c: Fiel removed.

* des.c (leftkey_swap, rightkey_swap, working_memcmp): Made static.

* cipher.c (gcry_cipher_map_name): Map "RIJNDAEL" to "AES".
* rijndael.c (rijndael_get_info): We do only support a 128 bit
blocksize so it makes sense to change the algorithm strings to
AES.

* tiger.c (tiger_final): Removed superfluous token pasting operators.
* md5.c (md5_final): Ditto.

12 files changed:
cipher/ChangeLog
cipher/Makefile.am
cipher/cipher.c
cipher/des.c
cipher/md.c
cipher/md5.c
cipher/primegen.c
cipher/random.c
cipher/rijndael.c
cipher/sha1.c
cipher/smallprime.c [deleted file]
cipher/tiger.c

index 45e6669..082ee77 100644 (file)
@@ -1,3 +1,45 @@
+2002-05-02  Werner Koch  <wk@gnupg.org>
+
+       * random.c (_gcry_fast_random_poll): Initialize the module so the
+       mutex can be used.
+
+       * primegen.c (small_prime_numbers): Moved table from smallprime.c
+       * smallprime.c: Fiel removed.
+
+       * des.c (leftkey_swap, rightkey_swap, working_memcmp): Made static.
+
+       * cipher.c (gcry_cipher_map_name): Map "RIJNDAEL" to "AES".
+       * rijndael.c (rijndael_get_info): We do only support a 128 bit
+       blocksize so it makes sense to change the algorithm strings to
+       AES.
+
+       * tiger.c (tiger_final): Removed superfluous token pasting operators.
+       * md5.c (md5_final): Ditto.
+
+2002-04-30  Werner Koch  <wk@gnupg.org>
+
+       * cipher.c: Fixed list of copyright years.
+
+2002-03-18  Werner Koch  <wk@gnupg.org>
+
+       * random.c (initialize): Initialize the new pool lock mutex.
+       (_gcry_fast_random_poll): Add locking and moved main
+       code out to...
+       (do_fast_random_poll): new function.
+       (read_pool): Use the new function here.
+       (get_random_bytes): Add locking.
+       (_gcry_update_random_seed_file): Ditto.
+
+2002-03-11  Werner Koch  <wk@gnupg.org>
+
+       * md.c: Add rsaSignatureWithripemd160 to OID table.
+
+2002-02-20  Werner Koch  <wk@gnupg.org>
+
+       * sha1.c: Removed a left over comment note.  The code has been
+       rewritten from scratch in 1998.  Thanks to Niels Möller for
+       reporting this misleading comment.
+
 2002-02-18  Werner Koch  <wk@gnupg.org>
 
        * rndunix.c (rndunix_constructor): Use the the new prefixed
index 04bbf1f..8ab7683 100644 (file)
@@ -74,7 +74,6 @@ libcipher_la_SOURCES = cipher.c  \
                 dsa.h          \
                 dsa.c          \
                 rsa.c rsa.h    \
-                smallprime.c   \
                 construct.c
 
 # configure creates the constructor file
index 0a076f2..56a5122 100644 (file)
@@ -1,5 +1,5 @@
 /* cipher.c  - cipher dispatcher
- *     Copyright (C) 1998 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
@@ -328,25 +328,38 @@ search_oid (const char *string)
 int
 gcry_cipher_map_name( const char *string )
 {
-    int i;
-    const char *s;
-
-    if (!string)
-      return 0;
+  int i;
+  const char *s;
+  
+  if (!string)
+    return 0;
 
-    /* If the string starts with a digit (optionally prefixed with
-       either "OID." or "oid."), we first look into our table of ASN.1
-       object identifiers to figure out the algorithm */
-    i = search_oid (string);
-    if (i != -1)
-      return oid_table[i].algo;
+  /* kludge to alias RIJNDAEL to AES */
+  if ( *string == 'R' || *string == 'r')
+    {
+      if (!strcasecmp (string, "RIJNDAEL"))
+        string = "AES";
+      else if (!strcasecmp (string, "RIJNDAEL192"))
+        string = "AES192";
+      else if (!strcasecmp (string, "RIJNDAEL256"))
+        string = "AES256";
+    }
 
-    do {
-       for(i=0; (s=cipher_table[i].name); i++ )
-           if( !stricmp( s, string ) )
-               return cipher_table[i].algo;
-    } while( load_cipher_modules() );
-    return 0;
+  /* If the string starts with a digit (optionally prefixed with
+     either "OID." or "oid."), we first look into our table of ASN.1
+     object identifiers to figure out the algorithm */
+  i = search_oid (string);
+  if (i != -1)
+    return oid_table[i].algo;
+  
+  do 
+    {
+      for (i=0; (s=cipher_table[i].name); i++ )
+        if ( !stricmp( s, string ) )
+          return cipher_table[i].algo;
+    } 
+  while ( load_cipher_modules() );
+  return 0;
 }
 
 int
@@ -991,7 +1004,7 @@ gcry_cipher_info( GCRY_CIPHER_HD h, int cmd, void *buffer, size_t *nbytes)
  *
  * On error the value -1 is returned and the error reason may be
  * retrieved by gcry_errno().
- * Note:  Because this function is in most caes used to return an
+ * Note:  Because this function is in most cases used to return an
  * integer value, we can make it easier for the caller to just look at
  * the return value.  The caller will in all cases consult the value
  * and thereby detecting whether a error occured or not (i.e. while checking
index 7d089c5..9737133 100644 (file)
  * According to the SunOS man page, memcmp returns indeterminate sign
  * depending on whether characters are signed or not.
  */
-int
+static int
 working_memcmp( const char *a, const char *b, size_t n )
 {
     for( ; n; n--, a++, b++ )
@@ -304,7 +304,7 @@ static u32 sbox8[64] =
  * These two tables are part of the 'permuted choice 1' function.
  * In this implementation several speed improvements are done.
  */
-u32 leftkey_swap[16] =
+static u32 leftkey_swap[16] =
 {
   0x00000000, 0x00000001, 0x00000100, 0x00000101,
   0x00010000, 0x00010001, 0x00010100, 0x00010101,
@@ -312,7 +312,7 @@ u32 leftkey_swap[16] =
   0x01010000, 0x01010001, 0x01010100, 0x01010101
 };
 
-u32 rightkey_swap[16] =
+static u32 rightkey_swap[16] =
 {
   0x00000000, 0x01000000, 0x00010000, 0x01010000,
   0x00000100, 0x01000100, 0x00010100, 0x01010100,
index 26382a1..b6dfada 100644 (file)
@@ -43,6 +43,9 @@ static struct {
   { "1.2.840.10040.4.3",     GCRY_MD_SHA1 },
   /* from NIST's OIW  (sha1) */
   { "1.3.14.3.2.26",         GCRY_MD_SHA1 },
+  /* rsaSignatureWithripemd160 */
+  { "1.3.36.3.3.1.2",       GCRY_MD_RMD160 },
+
   {NULL}
 };
 
@@ -129,7 +132,7 @@ new_list_item( int algo,
 
 
 /****************
- * Try to load the modules with the requeste algorithm
+ * Try to load the modules with the requested algorithm
  * and return true if new modules are available
  * If req_alog is -1 try to load all digest algorithms.
  */
index 6258430..6297de1 100644 (file)
@@ -1,5 +1,5 @@
 /* md5.c - MD5 Message-Digest Algorithm
- * Copyright (C) 1995, 1996, 1998, 1999, 2001 Free Software Foundation, Inc.
+ * Copyright (C) 1995,1996,1998,1999,2001,2002 Free Software Foundation, Inc.
  *
  * according to the definition of MD5 in RFC 1321 from April 1992.
  * NOTE: This is *not* the same file as the one from glibc.
@@ -19,7 +19,7 @@
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 /* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.  */
-/* heavily modified for GnuPG by <werner.koch@guug.de> */
+/* heavily modified for GnuPG by Werner Koch <wk@gnupg.org> */
 
 /* Test values:
  * ""                  D4 1D 8C D9 8F 00 B2 04  E9 80 09 98 EC F8 42 7E
@@ -310,12 +310,9 @@ md5_final( MD5_CONTEXT *hd )
 
     p = hd->buf;
   #ifdef BIG_ENDIAN_HOST
-    #define X(a) do { *p++ = hd->##a     ; *p++ = hd->##a >> 8;      \
-                     *p++ = hd->##a >> 16; *p++ = hd->##a >> 24; } while(0)
+    #define X(a) do { *p++ = hd->a      ; *p++ = hd->a >> 8;      \
+                     *p++ = hd->a >> 16; *p++ = hd->a >> 24; } while(0)
   #else /* little endian */
-    /*#define X(a) do { *(u32*)p = hd->##a ; p += 4; } while(0)*/
-    /* Unixware's cpp doesn't like the above construct so we do it his way:
-     * (reported by Allan Clark) */
     #define X(a) do { *(u32*)p = (*hd).a ; p += 4; } while(0)
   #endif
     X(A);
@@ -419,6 +416,4 @@ _gcry_md5_constructor(void)
 }
 #endif
 
-
-
 /* end of file */
index 9376d30..837b123 100644 (file)
@@ -1,5 +1,5 @@
 /* primegen.c - prime number generator
- *     Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
@@ -41,6 +41,92 @@ static void m_out_of_n( char *array, int m, int n );
 static void (*progress_cb) ( void *, int );
 static void *progress_cb_data;
 
+/* Note: 2 is not included because it can be tested more easily by
+   looking at bit 0. The last entry in this list is marked by a zero */
+static ushort small_prime_numbers[] = {
+    3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43,
+    47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101,
+    103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
+    157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
+    211, 223, 227, 229, 233, 239, 241, 251, 257, 263,
+    269, 271, 277, 281, 283, 293, 307, 311, 313, 317,
+    331, 337, 347, 349, 353, 359, 367, 373, 379, 383,
+    389, 397, 401, 409, 419, 421, 431, 433, 439, 443,
+    449, 457, 461, 463, 467, 479, 487, 491, 499, 503,
+    509, 521, 523, 541, 547, 557, 563, 569, 571, 577,
+    587, 593, 599, 601, 607, 613, 617, 619, 631, 641,
+    643, 647, 653, 659, 661, 673, 677, 683, 691, 701,
+    709, 719, 727, 733, 739, 743, 751, 757, 761, 769,
+    773, 787, 797, 809, 811, 821, 823, 827, 829, 839,
+    853, 857, 859, 863, 877, 881, 883, 887, 907, 911,
+    919, 929, 937, 941, 947, 953, 967, 971, 977, 983,
+    991, 997, 1009, 1013, 1019, 1021, 1031, 1033,
+    1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091,
+    1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151,
+    1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213,
+    1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277,
+    1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307,
+    1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399,
+    1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451,
+    1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493,
+    1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559,
+    1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609,
+    1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667,
+    1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733,
+    1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789,
+    1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871,
+    1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931,
+    1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997,
+    1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053,
+    2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111,
+    2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161,
+    2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243,
+    2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297,
+    2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357,
+    2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411,
+    2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473,
+    2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551,
+    2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633,
+    2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687,
+    2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729,
+    2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791,
+    2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851,
+    2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917,
+    2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999,
+    3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061,
+    3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137,
+    3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209,
+    3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271,
+    3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331,
+    3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391,
+    3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467,
+    3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533,
+    3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583,
+    3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643,
+    3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709,
+    3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779,
+    3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851,
+    3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917,
+    3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989,
+    4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049,
+    4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111,
+    4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177,
+    4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243,
+    4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297,
+    4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391,
+    4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457,
+    4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519,
+    4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597,
+    4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657,
+    4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729,
+    4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799,
+    4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889,
+    4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951,
+    4957, 4967, 4969, 4973, 4987, 4993, 4999,
+    0
+};
+
+
 void
 _gcry_register_primegen_progress ( void (*cb)( void *, int), void *cb_data )
 {
index 2ae2fc8..f573db5 100644 (file)
@@ -56,7 +56,7 @@
 #include "rand-internal.h"
 #include "dynload.h"
 #include "cipher.h" /* only used for the rmd160_hash_buffer() prototype */
-
+#include "mutex.h"
 
 #ifndef RAND_MAX   /* for SunOS */
   #define RAND_MAX 32767
@@ -106,11 +106,14 @@ static int secure_alloc;
 static int quick_test;
 static int faked_rng;
 
+static mutex_t pool_lock;
+static int pool_is_locked; /* only for assertion */
 
 static byte *get_random_bytes( size_t nbytes, int level, int secure );
 static void read_pool( byte *buffer, size_t length, int level );
 static void add_randomness( const void *buffer, size_t length, int source );
 static void random_poll(void);
+static void do_fast_random_poll (void);
 static void read_random_source( int requester, size_t length, int level);
 static int gather_faked( void (*add)(const void*, size_t, int), int requester,
                                                    size_t length, int level );
@@ -128,18 +131,27 @@ static struct {
     ulong naddbytes;
 } rndstats;
 
+
+/* Note, we assume that this function is used before any concurrent
+   access happens */
 static void
 initialize(void)
 {
-    /* The data buffer is allocated somewhat larger, so that
-     * we can use this extra space (which is allocated in secure memory)
-     * as a temporary hash buffer */
-    rndpool = secure_alloc ? gcry_xcalloc_secure(1,POOLSIZE+BLOCKLEN)
-                          : gcry_xcalloc(1,POOLSIZE+BLOCKLEN);
-    keypool = secure_alloc ? gcry_xcalloc_secure(1,POOLSIZE+BLOCKLEN)
-                          : gcry_xcalloc(1,POOLSIZE+BLOCKLEN);
-    is_initialized = 1;
-    _gcry_cipher_modules_constructor();
+  int err;
+
+  err = mutex_init (pool_lock);
+  if (err)
+    log_fatal ("failed to create the pool lock: %s\n", strerror (err) );
+    
+  /* The data buffer is allocated somewhat larger, so that we can use
+    this extra space (which is allocated in secure memory) as a
+    temporary hash buffer */
+  rndpool = secure_alloc ? gcry_xcalloc_secure(1,POOLSIZE+BLOCKLEN)
+                         : gcry_xcalloc(1,POOLSIZE+BLOCKLEN);
+  keypool = secure_alloc ? gcry_xcalloc_secure(1,POOLSIZE+BLOCKLEN)
+                         : gcry_xcalloc(1,POOLSIZE+BLOCKLEN);
+  is_initialized = 1;
+  _gcry_cipher_modules_constructor ();
 }
 
 static void
@@ -178,6 +190,9 @@ _gcry_quick_random_gen( int onoff )
 {
     int last;
 
+    /* No need to lock it here because we are only initializing.  A
+       prerequisite of the entire code is that it has already been
+       initialized before any possible concurrent access */
     read_random_source(0,0,0); /* init */
     last = quick_test;
     if( onoff != -1 )
@@ -217,10 +232,16 @@ static byte *
 get_random_bytes( size_t nbytes, int level, int secure )
 {
     byte *buf, *p;
+    int err;
 
     if( quick_test && level > 1 )
        level = 1;
     MASK_LEVEL(level);
+
+    err = mutex_lock (pool_lock);
+    if (err)
+      log_fatal ("failed to acquire the pool lock: %s\n", strerror (err));
+    pool_is_locked = 1;
     if( level == 1 ) {
        rndstats.getbytes1 += nbytes;
        rndstats.ngetbytes1++;
@@ -238,6 +259,11 @@ get_random_bytes( size_t nbytes, int level, int secure )
        nbytes -= n;
        p += n;
     }
+
+    pool_is_locked = 0;
+    err = mutex_unlock (pool_lock);
+    if (err)
+      log_fatal ("failed to release the pool lock: %s\n", strerror (err));
     return buf;
 }
 
@@ -295,10 +321,11 @@ mix_pool(byte *pool)
     int i, n;
     RMD160_CONTEXT md;
 
+    assert (pool_is_locked);
     _gcry_rmd160_init( &md );
- #if DIGESTLEN != 20
-    #error must have a digest length of 20 for ripe-md-160
- #endif
+#if DIGESTLEN != 20
+#  error must have a digest length of 20 for ripe-md-160
+#endif
     /* loop over the pool */
     pend = pool + POOLSIZE;
     memcpy(hashbuf, pend - DIGESTLEN, DIGESTLEN );
@@ -362,6 +389,7 @@ read_seed_file()
     unsigned char buffer[POOLSIZE];
     int n;
 
+    assert (pool_is_locked);
     if( !seed_file_name )
        return 0;
 
@@ -436,43 +464,56 @@ read_seed_file()
 void
 _gcry_update_random_seed_file()
 {
-    ulong *sp, *dp;
-    int fd, i;
-
-    if( !seed_file_name || !is_initialized || !pool_filled )
-       return;
-    if( !allow_seed_file_update ) {
-       log_info(_("note: random_seed file not updated\n"));
-       return;
-    }
-
+  ulong *sp, *dp;
+  int fd, i;
+  int err;
+  
+  if ( !seed_file_name || !is_initialized || !pool_filled )
+    return;
+  if ( !allow_seed_file_update )
+    {
+      log_info(_("note: random_seed file not updated\n"));
+      return;
+    }
+
+  err = mutex_lock (pool_lock);
+  if (err)
+    log_fatal ("failed to acquire the pool lock: %s\n", strerror (err));
+  pool_is_locked = 1;
 
     /* copy the entropy pool to a scratch pool and mix both of them */
-    for(i=0,dp=(ulong*)keypool, sp=(ulong*)rndpool;
-                                   i < POOLWORDS; i++, dp++, sp++ ) {
-       *dp = *sp + ADD_VALUE;
+  for (i=0,dp=(ulong*)keypool, sp=(ulong*)rndpool;
+       i < POOLWORDS; i++, dp++, sp++ ) 
+    {
+      *dp = *sp + ADD_VALUE;
     }
-    mix_pool(rndpool); rndstats.mixrnd++;
-    mix_pool(keypool); rndstats.mixkey++;
+  mix_pool(rndpool); rndstats.mixrnd++;
+  mix_pool(keypool); rndstats.mixkey++;
 
-  #ifdef HAVE_DOSISH_SYSTEM
-    fd = open( seed_file_name, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,
-                                                       S_IRUSR|S_IWUSR );
-  #else
-    fd = open( seed_file_name, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR );
-  #endif
-    if( fd == -1 ) {
-       log_info(_("can't create `%s': %s\n"), seed_file_name, strerror(errno) );
-       return;
-    }
-    do {
-       i = write( fd, keypool, POOLSIZE );
-    } while( i == -1 && errno == EINTR );
-    if( i != POOLSIZE ) {
-       log_info(_("can't write `%s': %s\n"), seed_file_name, strerror(errno) );
-    }
-    if( close(fd) )
-       log_info(_("can't close `%s': %s\n"), seed_file_name, strerror(errno) );
+#ifdef HAVE_DOSISH_SYSTEM
+  fd = open (seed_file_name, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,
+             S_IRUSR|S_IWUSR );
+#else
+  fd = open (seed_file_name, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR );
+#endif
+
+  if (fd == -1 )
+    log_info (_("can't create `%s': %s\n"), seed_file_name, strerror(errno) );
+  else 
+    {
+      do {
+       i = write (fd, keypool, POOLSIZE );
+      } while( i == -1 && errno == EINTR );
+    if (i != POOLSIZE) 
+      log_info(_("can't write `%s': %s\n"), seed_file_name, strerror(errno) );
+    if (close(fd))
+      log_info(_("can't close `%s': %s\n"), seed_file_name, strerror(errno) );
+    }
+
+  pool_is_locked = 0;
+  err = mutex_unlock (pool_lock);
+  if (err)
+    log_fatal ("failed to release the pool lock: %s\n", strerror (err));
 }
 
 
@@ -482,6 +523,7 @@ read_pool( byte *buffer, size_t length, int level )
     int i;
     ulong *sp, *dp;
 
+    assert (pool_is_locked);
     if( length > POOLSIZE ) {
        log_bug("too many random bits requested\n");
     }
@@ -491,7 +533,7 @@ read_pool( byte *buffer, size_t length, int level )
            pool_filled = 1;
     }
 
-    /* For level 2 quality (key generation) we alwas make
+    /* For level 2 quality (key generation) we always make
      * sure that the pool has been seeded enough initially */
     if( level == 2 && !did_initial_extra_seeding ) {
        size_t needed;
@@ -524,8 +566,8 @@ read_pool( byte *buffer, size_t length, int level )
     while( !pool_filled )
        random_poll();
 
-    /* do always a fast random poll */
-    fast_random_poll();
+    /* always do a fast random poll - we have to use the unlocked version*/
+    do_fast_random_poll();
 
     if( !level ) { /* no need for cryptographic strong random */
        /* create a new pool */
@@ -582,6 +624,7 @@ add_randomness( const void *buffer, size_t length, int source )
 {
     const byte *p = buffer;
 
+    assert (pool_is_locked);
     if( !is_initialized )
        initialize();
     rndstats.addbytes += length;
@@ -608,12 +651,14 @@ random_poll()
 }
 
 
-void
-_gcry_fast_random_poll()
+
+static void
+do_fast_random_poll ()
 {
     static void (*fnc)( void (*)(const void*, size_t, int), int) = NULL;
     static int initialized = 0;
 
+    assert (pool_is_locked);
     rndstats.fastpolls++;
     if( !initialized ) {
        if( !is_initialized )
@@ -685,6 +730,32 @@ _gcry_fast_random_poll()
 }
 
 
+void
+_gcry_fast_random_poll()
+{
+  int err;
+
+  /* We have to make sure that the intialization is done because this
+     gatherer might be called before any other functions and it is not
+     sufficient to initialize it within do_fast_random_pool becuase we
+     want to use the mutex here. FIXME: Weh should initialie the mutex
+     using a global constructore independent from the initialization
+     of the pool. */
+  if (!is_initialized)
+    initialize ();
+  err = mutex_lock (pool_lock);
+  if (err)
+    log_fatal ("failed to acquire the pool lock: %s\n", strerror (err));
+  pool_is_locked = 1;
+  do_fast_random_poll ();
+  pool_is_locked = 0;
+  err = mutex_unlock (pool_lock);
+  if (err)
+    log_fatal ("failed to acquire the pool lock: %s\n", strerror (err));
+
+}
+
+
 
 static void
 read_random_source( int requester, size_t length, int level )
@@ -720,31 +791,28 @@ gather_faked( void (*add)(const void*, size_t, int), int requester,
        /* we can't use tty_printf here - do we need this function at
          all - does it really make sense or canit be viewed as a potential
          security problem ? wk 17.11.99 */
-#if __GNUC__ >= 2
-#     warning Extended warning disabled
-#endif
-      #if 0
+#if 0
        tty_printf(_("The random number generator is only a kludge to let\n"
                   "it run - it is in no way a strong RNG!\n\n"
                   "DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n\n"));
-      #endif
+#endif
        initialized=1;
-      #ifdef HAVE_RAND
+#ifdef HAVE_RAND
        srand( time(NULL)*getpid());
-      #else
+#else
        srandom( time(NULL)*getpid());
-      #endif
+#endif
     }
 
     p = buffer = gcry_xmalloc( length );
     n = length;
-  #ifdef HAVE_RAND
+#ifdef HAVE_RAND
     while( n-- )
        *p++ = ((unsigned)(1 + (int) (256.0*rand()/(RAND_MAX+1.0)))-1);
-  #else
+#else
     while( n-- )
        *p++ = ((unsigned)(1 + (int) (256.0*random()/(RAND_MAX+1.0)))-1);
-  #endif
+#endif
     add_randomness( buffer, length, requester );
     gcry_free(buffer);
     return 0; /* okay */
index fa43adb..e643048 100644 (file)
@@ -2151,11 +2151,11 @@ _gcry_rijndael_get_info (int algo, size_t *keylen,
                                                        = rijndael_decrypt;
 
     if( algo == 7 )
-       return "RIJNDAEL";
+       return "AES";
     if (algo == 8)
-        return "RIJNDAEL192";
+        return "AES192";
     if (algo == 9)
-        return "RIJNDAEL256";
+        return "AES256";
     return NULL;
 }
 
@@ -2221,12 +2221,3 @@ gnupgext_enum_func ( int what, int *sequence, int *class, int *vers )
     return ret;
 }
 #endif
-
-
-
-
-
-
-
-
-
index 8f0cfc1..1ed6514 100644 (file)
@@ -1,7 +1,5 @@
 /* sha1.c - SHA1 hash function
- *     Copyright (C) 1998, 2001 Free Software Foundation, Inc.
- *
- * Please see below for more legal information!
+ *     Copyright (C) 1998, 2001, 2002 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
diff --git a/cipher/smallprime.c b/cipher/smallprime.c
deleted file mode 100644 (file)
index 3673319..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/* smallprime.c - List of small primes
- *     Copyright (C) 1998 Free Software Foundation, Inc.
- *
- * This file is part of Libgcrypt.
- *
- * Libgcrypt 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 2 of the License, or
- * (at your option) any later version.
- *
- * Libgcrypt 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 this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <config.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "types.h"
-
-/* Note: 2 is not included because it can be tested more easily
- * by looking at bit 0. The last entry in this list is marked by a zero
- */
-ushort
-small_prime_numbers[] = {
-    3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43,
-    47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101,
-    103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
-    157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
-    211, 223, 227, 229, 233, 239, 241, 251, 257, 263,
-    269, 271, 277, 281, 283, 293, 307, 311, 313, 317,
-    331, 337, 347, 349, 353, 359, 367, 373, 379, 383,
-    389, 397, 401, 409, 419, 421, 431, 433, 439, 443,
-    449, 457, 461, 463, 467, 479, 487, 491, 499, 503,
-    509, 521, 523, 541, 547, 557, 563, 569, 571, 577,
-    587, 593, 599, 601, 607, 613, 617, 619, 631, 641,
-    643, 647, 653, 659, 661, 673, 677, 683, 691, 701,
-    709, 719, 727, 733, 739, 743, 751, 757, 761, 769,
-    773, 787, 797, 809, 811, 821, 823, 827, 829, 839,
-    853, 857, 859, 863, 877, 881, 883, 887, 907, 911,
-    919, 929, 937, 941, 947, 953, 967, 971, 977, 983,
-    991, 997, 1009, 1013, 1019, 1021, 1031, 1033,
-    1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091,
-    1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151,
-    1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213,
-    1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277,
-    1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307,
-    1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399,
-    1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451,
-    1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493,
-    1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559,
-    1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609,
-    1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667,
-    1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733,
-    1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789,
-    1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871,
-    1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931,
-    1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997,
-    1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053,
-    2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111,
-    2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161,
-    2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243,
-    2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297,
-    2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357,
-    2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411,
-    2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473,
-    2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551,
-    2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633,
-    2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687,
-    2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729,
-    2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791,
-    2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851,
-    2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917,
-    2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999,
-    3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061,
-    3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137,
-    3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209,
-    3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271,
-    3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331,
-    3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391,
-    3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467,
-    3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533,
-    3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583,
-    3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643,
-    3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709,
-    3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779,
-    3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851,
-    3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917,
-    3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989,
-    4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049,
-    4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111,
-    4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177,
-    4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243,
-    4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297,
-    4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391,
-    4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457,
-    4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519,
-    4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597,
-    4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657,
-    4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729,
-    4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799,
-    4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889,
-    4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951,
-    4957, 4967, 4969, 4973, 4987, 4993, 4999,
-    0
-};
-
-
index c4b107d..6e0b8fa 100644 (file)
@@ -1,5 +1,5 @@
 /* tiger.c  -  The TIGER hash function
- *     Copyright (C) 1998, 2001 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 2001, 2002 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
@@ -813,12 +813,12 @@ tiger_final( TIGER_CONTEXT *hd )
 
     p = hd->buf;
   #ifdef BIG_ENDIAN_HOST
-    #define X(a) do { *(u64*)p = hd->##a ; p += 8; } while(0)
+    #define X(a) do { *(u64*)p = hd->a ; p += 8; } while(0)
   #else /* little endian */
-    #define X(a) do { *p++ = hd->##a >> 56; *p++ = hd->##a >> 48; \
-                     *p++ = hd->##a >> 40; *p++ = hd->##a >> 32; \
-                     *p++ = hd->##a >> 24; *p++ = hd->##a >> 16; \
-                     *p++ = hd->##a >>  8; *p++ = hd->##a; } while(0)
+    #define X(a) do { *p++ = hd->a >> 56; *p++ = hd->a >> 48; \
+                     *p++ = hd->a >> 40; *p++ = hd->a >> 32; \
+                     *p++ = hd->a >> 24; *p++ = hd->a >> 16; \
+                     *p++ = hd->a >>  8; *p++ = hd->a; } while(0)
   #endif
     X(a);
     X(b);
@@ -958,4 +958,3 @@ tiger_constructor(void)
 
 
 #endif /* HAVE_U64_TYPEDEF */
-