Пример #1
0
/* Full initialization of this module. */
static void
initialize(void)
{
  /* Although the basic initialization should have happened already,
     we call it here to make sure that all prerequisites are met.  */
  initialize_basics ();

  /* Now we can look the pool and complete the initialization if
     necessary.  */
  lock_pool ();
  if (!rndpool)
    {
      /* 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
                 ? xcalloc_secure (1, POOLSIZE + BLOCKLEN)
                 : xcalloc (1, POOLSIZE + BLOCKLEN));
      keypool = (secure_alloc
                 ? xcalloc_secure (1, POOLSIZE + BLOCKLEN)
                 : xcalloc (1, POOLSIZE + BLOCKLEN));

      /* Setup the slow entropy gathering function.  The code requires
         that this function exists. */
      slow_gather_fnc = getfnc_gather_random ();

      /* Setup the fast entropy gathering function.  */
      fast_gather_fnc = getfnc_fast_random_poll ();

    }
  unlock_pool ();
}
Пример #2
0
/* Initialize this random subsystem.  If FULL is false, this function
   merely calls the initialize and does not do anything more.  Doing
   this is not really required but when running in a threaded
   environment we might get a race condition otherwise. */
void
_gcry_random_initialize (int full)
{
    if (!full)
        initialize_basics ();
    else if (!is_initialized)
        initialize ();
}
Пример #3
0
/* Initialize this random subsystem.  If FULL is false, this function
   merely calls the initialize and does not do anything more.  Doing
   this is not really required but when running in a threaded
   environment we might get a race condition otherwise. */
void
_gcry_rngcsprng_initialize (int full)
{
  if (!full)
	initialize_basics ();
  else
	initialize ();
}
Пример #4
0
/* The fast random pool function as called at some places in
   libgcrypt.  This is merely a wrapper to make sure that this module
   is initalized and to look the pool.  Note, that this function is a
   NOP unless a random function has been used or _gcry_initialize (1)
   has been used.  We use this hack so that the internal use of this
   function in cipher_open and md_open won't start filling up the
   random pool, even if no random will be required by the process. */
void
_gcry_rngcsprng_fast_poll (void)
{
  initialize_basics ();

  lock_pool ();
  if (rndpool)
	{
	  /* Yes, we are fully initialized. */
	  do_fast_random_poll ();
	}
  unlock_pool ();
}
Пример #5
0
static void
initialize(void)
{
    initialize_basics ();
    /* 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;

}
Пример #6
0
/* Add BUFLEN bytes from BUF to the internal random pool.  QUALITY
   should be in the range of 0..100 to indicate the goodness of the
   entropy added, or -1 for goodness not known.  */
gcry_error_t
_gcry_rngcsprng_add_bytes (const void *buf, size_t buflen, int quality)
{
  size_t nbytes;
  const char *bufptr;

  if (quality == -1)
	quality = 35;
  else if (quality > 100)
	quality = 100;
  else if (quality < 0)
	quality = 0;
	  
  if (!buf)
	return gpg_error (GPG_ERR_INV_ARG);

  if (!buflen || quality < 10)
	return 0; /* Take a shortcut. */

  /* Because we don't increment the entropy estimation with FASTPOLL,
	 we don't need to take lock that estimation while adding from an
	 external source.  This limited entropy estimation also means that
	 we can't take QUALITY into account.  */
  initialize_basics ();
  bufptr = buf;
  while (buflen)
	{
	  nbytes = buflen > POOLSIZE? POOLSIZE : buflen;
	  lock_pool ();
	  if (rndpool)
		add_randomness (bufptr, nbytes, RANDOM_ORIGIN_EXTERNAL);
	  unlock_pool ();
	  bufptr += nbytes;
	  buflen -= nbytes;
	}
  return 0;
}   
Пример #7
0
void
_gcry_rngcsprng_update_seed_file (void)
{
  unsigned long *sp, *dp;
  int fd, i;

  /* We do only a basic initialization so that we can lock the pool.
	 This is required to cope with the case that this function is
	 called by some cleanup code at a point where the RNG has never
	 been initialized.  */
  initialize_basics ();
  lock_pool ();

  if ( !seed_file_name || !rndpool || !pool_filled )
	{
	  unlock_pool ();
	  return;
	}
  if ( !allow_seed_file_update )
	{
	  unlock_pool ();
	  log_info(_("note: random_seed file not updated\n"));
	  return;
	}

  /* At this point we know that there is something in the pool and
	 thus we can conclude that the pool has been fully initialized.  */


  /* Copy the entropy pool to a scratch pool and mix both of them. */
  for (i=0,dp=(unsigned long*)keypool, sp=(unsigned long*)rndpool;
	   i < POOLWORDS; i++, dp++, sp++ ) 
	{
	  *dp = *sp + ADD_VALUE;
	}
  mix_pool(rndpool); rndstats.mixrnd++;
  mix_pool(keypool); rndstats.mixkey++;

#if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
  fd = open (seed_file_name, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,
			 S_IRUSR|S_IWUSR );
#else
# if LOCK_SEED_FILE
	fd = open (seed_file_name, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR );
# else
	fd = open (seed_file_name, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR );
# endif
#endif

  if (fd == -1 )
	log_info (_("can't create `%s': %s\n"), seed_file_name, strerror(errno) );
  else if (lock_seed_file (fd, seed_file_name, 1))
	{
	  close (fd);
	}
#if LOCK_SEED_FILE
  else if (ftruncate (fd, 0))
	{
	  log_info(_("can't write `%s': %s\n"), seed_file_name, strerror(errno));
	  close (fd);
	}
#endif /*LOCK_SEED_FILE*/
  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));
	}
  
  unlock_pool ();
}