diff libtomcrypt/src/prngs/rng_get_bytes.c @ 1471:6dba84798cd5

Update to libtomcrypt 1.18.1, merged with Dropbear changes
author Matt Johnston <matt@ucc.asn.au>
date Fri, 09 Feb 2018 21:44:05 +0800
parents f849a5ca2efc
children
line wrap: on
line diff
--- a/libtomcrypt/src/prngs/rng_get_bytes.c	Thu Feb 08 23:11:40 2018 +0800
+++ b/libtomcrypt/src/prngs/rng_get_bytes.c	Fri Feb 09 21:44:05 2018 +0800
@@ -5,42 +5,45 @@
  *
  * The library is free for all purposes without any express
  * guarantee it works.
- *
- * Tom St Denis, [email protected], http://libtom.org
  */
 #include "tomcrypt.h"
 
-/** 
+#ifdef LTC_RNG_GET_BYTES
+/**
    @file rng_get_bytes.c
    portable way to get secure random bits to feed a PRNG (Tom St Denis)
 */
 
-#ifdef LTC_DEVRANDOM
+#if defined(LTC_DEVRANDOM) && !defined(_WIN32)
 /* on *NIX read /dev/random */
-static unsigned long rng_nix(unsigned char *buf, unsigned long len, 
+static unsigned long _rng_nix(unsigned char *buf, unsigned long len,
                              void (*callback)(void))
 {
 #ifdef LTC_NO_FILE
+    LTC_UNUSED_PARAM(callback);
+    LTC_UNUSED_PARAM(buf);
+    LTC_UNUSED_PARAM(len);
     return 0;
 #else
     FILE *f;
     unsigned long x;
-#ifdef TRY_URANDOM_FIRST
+    LTC_UNUSED_PARAM(callback);
+#ifdef LTC_TRY_URANDOM_FIRST
     f = fopen("/dev/urandom", "rb");
     if (f == NULL)
-#endif /* TRY_URANDOM_FIRST */
+#endif /* LTC_TRY_URANDOM_FIRST */
        f = fopen("/dev/random", "rb");
 
     if (f == NULL) {
        return 0;
     }
-    
+
     /* disable buffering */
     if (setvbuf(f, NULL, _IONBF, 0) != 0) {
        fclose(f);
        return 0;
-    }   
- 
+    }
+
     x = (unsigned long)fread(buf, 1, (size_t)len, f);
     fclose(f);
     return x;
@@ -49,21 +52,16 @@
 
 #endif /* LTC_DEVRANDOM */
 
-/* on ANSI C platforms with 100 < CLOCKS_PER_SEC < 10000 */
-#if defined(CLOCKS_PER_SEC) && !defined(WINCE)
+#if !defined(_WIN32_WCE)
 
 #define ANSI_RNG
 
-static unsigned long rng_ansic(unsigned char *buf, unsigned long len, 
+static unsigned long _rng_ansic(unsigned char *buf, unsigned long len,
                                void (*callback)(void))
 {
    clock_t t1;
    int l, acc, bits, a, b;
 
-   if (XCLOCKS_PER_SEC < 100 || XCLOCKS_PER_SEC > 10000) {
-      return 0;
-   }
-
    l = len;
    bits = 8;
    acc  = a = b = 0;
@@ -76,33 +74,37 @@
           } while (a == b);
           acc = (acc << 1) | a;
        }
-       *buf++ = acc; 
+       *buf++ = acc;
        acc  = 0;
        bits = 8;
    }
-   acc = bits = a = b = 0;
    return l;
 }
 
-#endif 
+#endif
 
 /* Try the Microsoft CSP */
-#if defined(WIN32) || defined(WINCE)
-#define _WIN32_WINNT 0x0400
-#ifdef WINCE
+#if defined(_WIN32) || defined(_WIN32_WCE)
+#ifndef _WIN32_WINNT
+  #define _WIN32_WINNT 0x0400
+#endif
+#ifdef _WIN32_WCE
    #define UNDER_CE
    #define ARM
 #endif
+
+#define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #include <wincrypt.h>
 
-static unsigned long rng_win32(unsigned char *buf, unsigned long len, 
+static unsigned long _rng_win32(unsigned char *buf, unsigned long len,
                                void (*callback)(void))
 {
    HCRYPTPROV hProv = 0;
-   if (!CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 
-                            (CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET)) && 
-       !CryptAcquireContext (&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 
+   LTC_UNUSED_PARAM(callback);
+   if (!CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL,
+                            (CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET)) &&
+       !CryptAcquireContext (&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL,
                             CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET | CRYPT_NEWKEYSET))
       return 0;
 
@@ -123,26 +125,35 @@
   @param outlen    Length desired (octets)
   @param callback  Pointer to void function to act as "callback" when RNG is slow.  This can be NULL
   @return Number of octets read
-*/     
-unsigned long rng_get_bytes(unsigned char *out, unsigned long outlen, 
+*/
+unsigned long rng_get_bytes(unsigned char *out, unsigned long outlen,
                             void (*callback)(void))
 {
    unsigned long x;
 
    LTC_ARGCHK(out != NULL);
 
-#if defined(LTC_DEVRANDOM)
-   x = rng_nix(out, outlen, callback);   if (x != 0) { return x; }
+#ifdef LTC_PRNG_ENABLE_LTC_RNG
+   if (ltc_rng) {
+      x = ltc_rng(out, outlen, callback);
+      if (x != 0) {
+         return x;
+      }
+   }
 #endif
-#ifdef WIN32
-   x = rng_win32(out, outlen, callback); if (x != 0) { return x; }
+
+#if defined(_WIN32) || defined(_WIN32_WCE)
+   x = _rng_win32(out, outlen, callback); if (x != 0) { return x; }
+#elif defined(LTC_DEVRANDOM)
+   x = _rng_nix(out, outlen, callback);   if (x != 0) { return x; }
 #endif
 #ifdef ANSI_RNG
-   x = rng_ansic(out, outlen, callback); if (x != 0) { return x; }
+   x = _rng_ansic(out, outlen, callback); if (x != 0) { return x; }
 #endif
    return 0;
 }
+#endif /* #ifdef LTC_RNG_GET_BYTES */
 
-/* $Source$ */
-/* $Revision$ */
-/* $Date$ */
+/* ref:         $Format:%D$ */
+/* git commit:  $Format:%H$ */
+/* commit time: $Format:%ai$ */