SilcUInt8 silc_rng_get_byte(SilcRng rng)
{
+ SilcUInt8 byte;
+
rng->threshold++;
/* Get more soft noise after 64 bits threshold */
silc_rng_get_hard_noise(rng);
}
- return rng->pool[silc_rng_get_position(rng)];
+ do byte = rng->pool[silc_rng_get_position(rng)]; while (byte == 0x00);
+ return byte;
}
/* Return random byte as fast as possible. Reads from /dev/urandom if
if (read(rng->fd_devurandom, buf, sizeof(buf)) < 0)
return silc_rng_get_byte(rng);
- return buf[0];
+ return buf[0] != 0x00 ? buf[0] : silc_rng_get_byte(rng);
#else
return silc_rng_get_byte(rng);
#endif
return num;
}
-/* Returns random number string. Returned string is in HEX format. */
+/* Returns non-zero random number string. Returned string is in HEX format. */
unsigned char *silc_rng_get_rn_string(SilcRng rng, SilcUInt32 len)
{
return string;
}
-/* Returns random number binary data. */
+/* Returns non-zero random number binary data. */
unsigned char *silc_rng_get_rn_data(SilcRng rng, SilcUInt32 len)
{
/*
- silcrng.h
+ silcrng.h
Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 1997 - 2002 Pekka Riikonen
+ Copyright (C) 1997 - 2003 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/****s* silccrypt/SilcRNGAPI/SilcRng
*
* NAME
- *
+ *
* typedef struct SilcRngStruct *SilcRng;
*
* DESCRIPTION
* DESCRIPTION
*
* Returns random string in HEX form of the length of `len' bytes.
- * The caller must free returned data buffer.
+ * The caller must free returned data buffer. It is guaranteed the
+ * data string goes not include any zero (0x00) bytes.
*
***/
unsigned char *silc_rng_get_rn_string(SilcRng rng, SilcUInt32 len);
*
* DESCRIPTION
*
- * Returns random binary data of the length of `len' bytes. The
- * caller must free returned data buffer.
+ * Returns random binary data of the length of `len' bytes. The
+ * caller must free returned data buffer. It is guaranteed the data
+ * buffer does not include any zero (0x00) bytes.
*
***/
unsigned char *silc_rng_get_rn_data(SilcRng rng, SilcUInt32 len);
*
* DESCRIPTION
*
- * Add the data buffer indicated by `buffer' of length of `len' bytes
+ * Add the data buffer indicated by `buffer' of length of `len' bytes
* as noise to the random number generator. The random number generator
* is restirred (reseeded) when this function is called.
*
* DESCRIPTION
*
* Returns random string in HEX form of the length of `len' bytes.
- * The caller must free returned data buffer.
+ * The caller must free returned data buffer. It is guaranteed the
+ * data string goes not include any zero (0x00) bytes.
*
***/
unsigned char *silc_rng_global_get_rn_string(SilcUInt32 len);
*
* DESCRIPTION
*
- * Returns random binary data of the length of `len' bytes. The
- * caller must free returned data buffer.
+ * Returns random binary data of the length of `len' bytes. The
+ * caller must free returned data buffer. It is guaranteed the data
+ * buffer does not include any zero (0x00) bytes.
*
***/
unsigned char *silc_rng_global_get_rn_data(SilcUInt32 len);
*
* DESCRIPTION
*
- * Add the data buffer indicated by `buffer' of length of `len' bytes
+ * Add the data buffer indicated by `buffer' of length of `len' bytes
* as noise to the random number generator. The random number generator
* is restirred (reseeded) when this function is called.
*