X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcmath%2Fsilcprimegen.c;h=b2fe429db40e9ebcd574c204541365b266d9c1f4;hp=ed9b8848aaa908c7f071776c930e0541d6ddceea;hb=e7b6c157b80152bf9fb9266e6bdd93f9fb0db776;hpb=8fd8212bcd16f2b53fbedff2a9b9a4e8c15b9695 diff --git a/lib/silcmath/silcprimegen.c b/lib/silcmath/silcprimegen.c index ed9b8848..b2fe429d 100644 --- a/lib/silcmath/silcprimegen.c +++ b/lib/silcmath/silcprimegen.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2005 Pekka Riikonen + Copyright (C) 1997 - 2007 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 @@ -197,7 +197,7 @@ static SilcUInt32 primetable[] = SilcBool silc_math_gen_prime(SilcMPInt *prime, SilcUInt32 bits, SilcBool verbose, SilcRng rng) { - unsigned char *numbuf = NULL; + unsigned char *numbuf; SilcUInt32 i, b, k; SilcUInt32 *spmods; SilcMPInt r, base, tmp, tmp2, oprime; @@ -214,13 +214,15 @@ SilcBool silc_math_gen_prime(SilcMPInt *prime, SilcUInt32 bits, SILC_LOG_DEBUG(("Generating new prime")); while (valid == FALSE) { + numbuf = silc_malloc((((bits + 7) / 8) + 1) * sizeof(*numbuf)); + if (!numbuf) + return FALSE; + /* Get random number */ if (rng) - numbuf = silc_rng_get_rn_data(rng, (bits / 8)); + silc_rng_get_rn_data(rng, (bits / 8), numbuf, (bits / 8)); else - numbuf = silc_rng_global_get_rn_data((bits / 8)); - if (!numbuf) - return FALSE; + silc_rng_global_get_rn_data(rng, (bits / 8), numbuf, (bits / 8)); /* Convert into MP and set the size */ silc_mp_bin2mp(numbuf, (bits / 8), prime); @@ -339,8 +341,13 @@ SilcBool silc_math_prime_test(SilcMPInt *p) silc_mp_mod_ui(&tmp, p, primetable[i]); /* If mod is 0, the number is composite */ - if (silc_mp_cmp_ui(&tmp, 0) == 0) - ret = -1; + if (silc_mp_cmp_ui(&tmp, 0) == 0) { + SILC_LOG_DEBUG(("Number is not prime")); + silc_mp_uninit(&r); + silc_mp_uninit(&tmp); + silc_mp_uninit(&base); + return FALSE; + } } /* Does the prime pass the Fermat's prime test. @@ -354,8 +361,10 @@ SilcBool silc_math_prime_test(SilcMPInt *p) silc_mp_uninit(&tmp); silc_mp_uninit(&base); - if (ret) + if (ret) { + SILC_LOG_DEBUG(("Number is not prime")); return FALSE; + } /* Number is probably a prime */ return TRUE;