X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilccrypt%2Fsilcrng.c;h=485a60aae4dccaafd25b7368a966b805fd9eefba;hb=c826b9841053da3f00e2c531b25bb22aa49255d5;hp=e9fe1c81ffe3d596b1572aeafa355104f388a2dc;hpb=c0d9618972274f56277acab0c124cd30c52d2953;p=silc.git diff --git a/lib/silccrypt/silcrng.c b/lib/silccrypt/silcrng.c index e9fe1c81..485a60aa 100644 --- a/lib/silccrypt/silcrng.c +++ b/lib/silccrypt/silcrng.c @@ -115,6 +115,7 @@ typedef struct SilcRngObjectStruct { SilcRngState state; SilcHash sha1; uint8 threshhold; + char *devrandom; } SilcRngObject; /* Allocates new RNG object. */ @@ -132,6 +133,8 @@ SilcRng silc_rng_alloc() new->state = NULL; silc_hash_alloc("sha1", &new->sha1); + new->devrandom = strdup("/dev/random"); + return new; } @@ -142,7 +145,8 @@ void silc_rng_free(SilcRng rng) if (rng) { memset(rng->pool, 0, sizeof(rng->pool)); memset(rng->key, 0, sizeof(rng->key)); - silc_free(rng->sha1); + silc_hash_free(rng->sha1); + silc_free(new->devrandom); silc_free(rng); } } @@ -185,6 +189,8 @@ void silc_rng_init(SilcRng rng) silc_rng_get_medium_noise(rng); silc_rng_get_hard_noise(rng); silc_rng_get_soft_noise(rng); + silc_free(rng->devrandom); + rng->devrandom = strdup("/dev/urandom"); } /* This function gets 'soft' noise from environment. */ @@ -275,8 +281,8 @@ static void silc_rng_get_hard_noise(SilcRng rng) char buf[32]; int fd, len, i; - /* Get noise from /dev/random if available */ - fd = open("/dev/random", O_RDONLY); + /* Get noise from /dev/[u]random if available */ + fd = open(rnd->devrandom, O_RDONLY); if (fd < 0) return; @@ -370,7 +376,7 @@ static void silc_rng_stir_pool(SilcRng rng) uint32 iv[5]; /* Get the IV */ - memcpy(iv, &rng->pool[SILC_RNG_POOLSIZE - 256], sizeof(iv)); + memcpy(iv, &rng->pool[16], sizeof(iv)); /* First CFB pass */ for (i = 0; i < SILC_RNG_POOLSIZE; i += 5) {