URI: 
       trndseed.c - mixmaster - mixmaster 3.0 patched for libressl
  HTML git clone git://parazyd.org/mixmaster.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
       ---
       trndseed.c (3481B)
       ---
            1 /* Mixmaster version 3.0  --  (C) 1999 - 2006 Anonymizer Inc. and others.
            2 
            3    Mixmaster may be redistributed and modified under certain conditions.
            4    This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
            5    ANY KIND, either express or implied. See the file COPYRIGHT for
            6    details.
            7 
            8    Get randomness from device or user
            9    $Id: rndseed.c 934 2006-06-24 13:40:39Z rabbi $ */
           10 
           11 
           12 #include "mix3.h"
           13 #include <assert.h>
           14 #include <time.h>
           15 #include <fcntl.h>
           16 #include <time.h>
           17 #include <stdlib.h>
           18 #ifdef POSIX
           19 #include <unistd.h>
           20 #include <termios.h>
           21 #else /* end of POSIX */
           22 #include <io.h>
           23 #include <process.h>
           24 #endif /* else if not POSIX */
           25 #if defined(WIN32) || defined(MSDOS)
           26 #include <conio.h>
           27 #endif /* defined(WIN32) || defined(MSDOS) */
           28 #ifdef WIN32
           29 #include <windows.h>
           30 #endif /* WIN32 */
           31 
           32 #define NEEDED 128
           33 
           34 #ifndef O_NDELAY
           35 #define O_NDELAY 0
           36 #endif /* not O_NDELAY */
           37 
           38 int kbd_noecho(void)
           39 {
           40 #ifdef HAVE_TERMIOS
           41   int fd;
           42   struct termios attr;
           43 
           44   setbuf(stdin, NULL);
           45   fd = fileno(stdin);
           46   if (tcgetattr(fd, &attr) != 0)
           47     return (-1);
           48   attr.c_lflag &= ~(ECHO | ICANON);
           49   if (tcsetattr(fd, TCSAFLUSH, &attr) != 0)
           50     return (-1);
           51 #endif /* HAVE_TERMIOS */
           52   return (0);
           53 }
           54 
           55 int kbd_echo(void)
           56 {
           57 #ifdef HAVE_TERMIOS
           58   int fd;
           59   struct termios attr;
           60 
           61   setvbuf(stdin, NULL, _IOLBF, BUFSIZ);
           62   fd = fileno(stdin);
           63   if (tcgetattr(fd, &attr) != 0)
           64     return (-1);
           65   attr.c_lflag |= ECHO | ICANON;
           66   if (tcsetattr(fd, TCSAFLUSH, &attr) != 0)
           67     return (-1);
           68 #endif /* HAVE_TERMIOS */
           69   return (0);
           70 }
           71 
           72 void rnd_error(void)
           73 {
           74   errlog(ERRORMSG,
           75          "Random number generator not initialized. Aborting.\n\
           76 Run the program interactively to seed the generator.\n");
           77   exit(3);
           78 }
           79 
           80 /* get randomness from system or user. If the application has promised that
           81    it will seed the RNG later, we do not ask for user input */
           82 
           83 int rnd_seed(void)
           84 {
           85   int fd = -1;
           86   byte b[512], c = 0;
           87   int bytes = 0;
           88 
           89 #ifdef DEV_RANDOM
           90   fd = open(DEV_RANDOM, O_RDONLY | O_NDELAY);
           91 #endif /* DEV_RANDOM */
           92   if (fd == -1) {
           93 #if 1
           94     if (rnd_state == RND_WILLSEED)
           95       return(-1);
           96     if (!isatty(fileno(stdin)))
           97       rnd_error();
           98 #else /* end of 1 */
           99 #error "should initialize the prng from system ressources"
          100 #endif /* else if not 1 */
          101     fprintf(stderr, "Please enter some random characters.\n");
          102     kbd_noecho();
          103     while (bytes < NEEDED) {
          104       fprintf(stderr, "  %d     \r", NEEDED - bytes);
          105 #ifdef HAVE_GETKEY
          106       if (kbhit(), *b = getkey())
          107 #else /* end of HAVE_GETKEY */
          108       if (read(fileno(stdin), b, 1) > 0)
          109 #endif /* else if not HAVE_GETKEY */
          110         {
          111           rnd_add(b, 1);
          112           rnd_time();
          113           if (*b != c)
          114             bytes++;
          115           c = *b;
          116         }
          117     }
          118     fprintf(stderr, "Thanks.\n");
          119     sleep(1);
          120     kbd_echo();
          121   }
          122 #ifdef DEV_RANDOM
          123   else {
          124     bytes = read(fd, b, sizeof(b));
          125     if (bytes > 0) {
          126       rnd_add(b, bytes);
          127     } else {
          128       bytes = 0;
          129     }
          130     close(fd);
          131     if (bytes < NEEDED) {
          132       fd = open(DEV_RANDOM, O_RDONLY);        /* re-open in blocking mode */
          133       if (isatty(fileno(stdin))) {
          134         fprintf(stderr,
          135                 "Please move the mouse, enter random characters, etc.\n");
          136         kbd_noecho();
          137       }
          138       while (bytes < NEEDED) {
          139         if (isatty(fileno(stdin)))
          140           fprintf(stderr, "  %d     \r", NEEDED - bytes);
          141         if (read(fd, b, 1) > 0) {
          142           rnd_add(b, 1);
          143           bytes++;
          144         }
          145       }
          146       if (isatty(fileno(stdin))) {
          147         fprintf(stderr, "Thanks.\n");
          148         sleep(1);
          149         kbd_echo();
          150       }
          151       close(fd);
          152     }
          153   }
          154 #endif /* DEV_RANDOM */
          155   rnd_state = RND_SEEDED;
          156   return (0);
          157 }