|
@@ -37,7 +37,7 @@ we reseed automatically when len(pool0) >= 64 or every LTC_FORTUNA_WD calls to t
|
|
|
|
|
|
const struct ltc_prng_descriptor fortuna_desc = {
|
|
|
"fortuna",
|
|
|
- (32 * LTC_FORTUNA_POOLS), /* default: 1024 */
|
|
|
+ 64,
|
|
|
&fortuna_start,
|
|
|
&fortuna_add_entropy,
|
|
|
&fortuna_ready,
|
|
@@ -337,71 +337,7 @@ LBL_UNLOCK:
|
|
|
@param prng The PRNG to export
|
|
|
@return CRYPT_OK if successful
|
|
|
*/
|
|
|
-int fortuna_export(unsigned char *out, unsigned long *outlen, prng_state *prng)
|
|
|
-{
|
|
|
- int x, err;
|
|
|
- hash_state *md;
|
|
|
- unsigned long len = fortuna_desc.export_size;
|
|
|
-
|
|
|
- LTC_ARGCHK(out != NULL);
|
|
|
- LTC_ARGCHK(outlen != NULL);
|
|
|
- LTC_ARGCHK(prng != NULL);
|
|
|
-
|
|
|
- LTC_MUTEX_LOCK(&prng->lock);
|
|
|
-
|
|
|
- if (!prng->ready) {
|
|
|
- err = CRYPT_ERROR;
|
|
|
- goto LBL_UNLOCK;
|
|
|
- }
|
|
|
-
|
|
|
- /* we'll write bytes for s&g's */
|
|
|
- if (*outlen < len) {
|
|
|
- *outlen = len;
|
|
|
- err = CRYPT_BUFFER_OVERFLOW;
|
|
|
- goto LBL_UNLOCK;
|
|
|
- }
|
|
|
-
|
|
|
- md = XMALLOC(sizeof(hash_state));
|
|
|
- if (md == NULL) {
|
|
|
- err = CRYPT_MEM;
|
|
|
- goto LBL_UNLOCK;
|
|
|
- }
|
|
|
-
|
|
|
- /* to emit the state we copy each pool, terminate it then hash it again so
|
|
|
- * an attacker who sees the state can't determine the current state of the PRNG
|
|
|
- */
|
|
|
- for (x = 0; x < LTC_FORTUNA_POOLS; x++) {
|
|
|
- /* copy the PRNG */
|
|
|
- XMEMCPY(md, &(prng->fortuna.pool[x]), sizeof(*md));
|
|
|
-
|
|
|
- /* terminate it */
|
|
|
- if ((err = sha256_done(md, out+x*32)) != CRYPT_OK) {
|
|
|
- goto LBL_ERR;
|
|
|
- }
|
|
|
-
|
|
|
- /* now hash it */
|
|
|
- if ((err = sha256_init(md)) != CRYPT_OK) {
|
|
|
- goto LBL_ERR;
|
|
|
- }
|
|
|
- if ((err = sha256_process(md, out+x*32, 32)) != CRYPT_OK) {
|
|
|
- goto LBL_ERR;
|
|
|
- }
|
|
|
- if ((err = sha256_done(md, out+x*32)) != CRYPT_OK) {
|
|
|
- goto LBL_ERR;
|
|
|
- }
|
|
|
- }
|
|
|
- *outlen = len;
|
|
|
- err = CRYPT_OK;
|
|
|
-
|
|
|
-LBL_ERR:
|
|
|
-#ifdef LTC_CLEAN_STACK
|
|
|
- zeromem(md, sizeof(*md));
|
|
|
-#endif
|
|
|
- XFREE(md);
|
|
|
-LBL_UNLOCK:
|
|
|
- LTC_MUTEX_UNLOCK(&prng->lock);
|
|
|
- return err;
|
|
|
-}
|
|
|
+_LTC_PRNG_EXPORT(fortuna)
|
|
|
|
|
|
/**
|
|
|
Import a PRNG state
|