gcry_mpi_mul_ui(n, n, 1 << (sizeof(uint32_t)*4));
gcry_mpi_mul_ui(n, n, 1 << (sizeof(uint32_t)*4));
#endif
- gcry_mpi_add_ui(n, n, ((uint32_t *) &tmp)[j]);
+ gcry_mpi_add_ui(n, n, ntohl (((uint32_t *) &tmp)[j]));
}
hc = tmp;
}
return rc;
}
+/**
+ * If target != size, move target bytes to the
+ * end of the size-sized buffer and zero out the
+ * first target-size bytes.
+ */
+static void
+adjust (unsigned char *buf, size_t size, size_t target)
+{
+ if (size < target)
+ {
+ memmove (&buf[target - size], buf, size);
+ memset (buf, 0, target - size);
+ }
+}
+
+
static void
gen_prime (gcry_mpi_t *ptest, unsigned int nbits, GNUNET_HashCode * hc)
{
gcry_mpi_t prime, pminus1, val_2, val_3, result;
unsigned int i;
unsigned int step;
- unsigned int *mods;
+ unsigned int mods[no_of_small_prime_numbers];
gcry_mpi_t tmp;
gcry_mpi_t sp;
GNUNET_assert (nbits >= 16);
- mods = GNUNET_malloc (no_of_small_prime_numbers * sizeof (*mods));
/* Make nbits fit into mpz_t implementation. */
val_2 = gcry_mpi_set_ui (NULL, 2);
val_3 = gcry_mpi_set_ui (NULL, 3);
result = gcry_mpi_new(0);
pminus1 = gcry_mpi_new(0);
*ptest = gcry_mpi_new(0);
+ tmp = gcry_mpi_new (0);
+ sp = gcry_mpi_new (0);
while (1)
{
/* generate a random number */
gcry_mpi_set_bit (prime, 0);
/* Calculate all remainders. */
- tmp = gcry_mpi_new (0);
- sp = gcry_mpi_new (0);
for (i = 0; i < no_of_small_prime_numbers; i++)
{
size_t written;
gcry_mpi_set_ui(sp, small_prime_numbers[i]);
gcry_mpi_div (NULL, tmp, prime, sp, -1);
mods[i] = 0;
- written = sizeof (*mods);
- gcry_mpi_print (GCRYMPI_FMT_USG, (unsigned char *) &mods[i], sizeof(*mods), &written, tmp);
- }
- gcry_mpi_release (sp);
- gcry_mpi_release (tmp);
+ written = sizeof (unsigned int);
+ GNUNET_assert (0 ==
+ gcry_mpi_print (GCRYMPI_FMT_USG,
+ (unsigned char*) &mods[i], written, &written,
+ tmp));
+ adjust ( (unsigned char*) &mods[i], written, sizeof (unsigned int));
+ mods[i] = ntohl (mods[i]);
+ }
/* Now try some primes starting with prime. */
for (step = 0; step < 20000; step += 2)
{
if ((!gcry_mpi_cmp_ui (result, 1)) && (is_prime (*ptest, 5, hc)))
{
/* Got it. */
+ gcry_mpi_release (sp);
+ gcry_mpi_release (tmp);
gcry_mpi_release (val_2);
gcry_mpi_release (val_3);
gcry_mpi_release (result);
gcry_mpi_release (pminus1);
gcry_mpi_release (prime);
- GNUNET_free (mods);
return;
}
}