- /* Get random number */
- numbuf = silc_rng_global_get_rn_string((bits / 8));
- if (!numbuf)
- return FALSE;
-
- /* Convert into MP and set the size */
- silc_mp_set_str(prime, numbuf, 16);
- silc_mp_mod_2exp(prime, prime, bits);
-
- /* Empty buffer */
- memset(numbuf, 0, (bits / 8));
- silc_free(numbuf);
-
- /* Number could be even number, so we'll make it odd. */
- silc_mp_set_ui(&tmp, 1);
- silc_mp_or(prime, prime, &tmp); /* OR operator */
+ while (valid == FALSE) {
+ /* Get random number */
+ if (rng)
+ numbuf = silc_rng_get_rn_data(rng, (bits / 8));
+ else
+ numbuf = silc_rng_global_get_rn_data((bits / 8));
+ if (!numbuf)
+ return FALSE;
+
+ /* Convert into MP and set the size */
+ silc_mp_bin2mp(numbuf, (bits / 8), prime);
+ silc_mp_mod_2exp(prime, prime, bits);
+
+ /* Empty buffer */
+ memset(numbuf, 0, (bits / 8));
+ silc_free(numbuf);
+
+ /* Set highest bit */
+ silc_mp_set_ui(&tmp, 1);
+ silc_mp_mul_2exp(&tmp, &tmp, bits - 1);
+ silc_mp_or(prime, prime, &tmp);
+
+ /* Number could be even number, so we'll make it odd. */
+ silc_mp_set_ui(&tmp, 1);
+ silc_mp_or(prime, prime, &tmp);
+
+ /* Init modulo table with the prime candidate and the primes
+ in the primetable. */
+ spmods = silc_calloc(1, sizeof(primetable) * sizeof(SilcUInt32));
+ for (i = 0; primetable[i] != 0; i++) {
+ silc_mp_mod_ui(&tmp, prime, primetable[i]);
+ spmods[i] = silc_mp_get_ui(&tmp);
+ }