Author: Pekka Riikonen <priikone@silcnet.org>
- 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
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;
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);
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.
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;