Example #1
0
mp_result find_strong_prime(mp_int seed, FILE *fb)
{
  mp_result res;
  mpz_t     t;

  mp_int_init(&t);
  for(;;) {
    if ((res = find_prime(seed, fb)) != MP_TRUE)
      break;
    if ((res = mp_int_copy(seed, &t)) != MP_OK)
      break;

    if ((res = mp_int_mul_pow2(&t, 1, &t)) != MP_OK ||
	(res = mp_int_add_value(&t, 1, &t)) != MP_OK) 
      break;

    if ((res = mp_int_is_prime(&t)) == MP_TRUE) {
      if (fb != NULL)
	fputc('!', fb);

      res = mp_int_copy(&t, seed);
      break;
    }
    else if (res != MP_FALSE) 
      break;

    if (fb != NULL)
      fputc('x', fb);
    if ((res = mp_int_add_value(seed, 2, seed)) != MP_OK)
      break;
  }

  mp_int_clear(&t);
  return res;
}
Example #2
0
/* Test the IMath internals assumed by the imath implementation of isl_int.
 *
 * In particular, we test the ranges of IMath-defined types.
 *
 * Also, isl uses the existence and function of imath's struct
 * fields. The digits are stored with less significant digits at lower array
 * indices. Where they are stored (on the heap or in the field 'single') does
 * not matter.
 */
int test_imath_internals()
{
	mpz_t val;
	mp_result retval;

	assert(sizeof(mp_small) == sizeof(long));
	assert(MP_SMALL_MIN == LONG_MIN);
	assert(MP_SMALL_MAX == LONG_MAX);

	assert(sizeof(mp_usmall) == sizeof(unsigned long));
	assert(MP_USMALL_MIN == ULONG_MIN);
	assert(MP_USMALL_MAX == ULONG_MAX);

	retval = mp_int_init_value(&val, 0);
	assert(retval == MP_OK);
	assert(val.alloc >= val.used);
	assert(val.used == 1);
	assert(val.sign == MP_ZPOS);
	assert(val.digits[0] == 0);

	retval = mp_int_set_value(&val, -1);
	assert(retval == MP_OK);
	assert(val.alloc >= val.used);
	assert(val.used == 1);
	assert(val.sign == MP_NEG);
	assert(val.digits[0] == 1);

	retval = mp_int_set_value(&val, 1);
	assert(retval == MP_OK);
	assert(val.alloc >= val.used);
	assert(val.used == 1);
	assert(val.sign == MP_ZPOS);
	assert(val.digits[0] == 1);

	retval = mp_int_mul_pow2(&val, sizeof(mp_digit) * CHAR_BIT, &val);
	assert(retval == MP_OK);
	assert(val.alloc >= val.used);
	assert(val.used == 2);
	assert(val.sign == MP_ZPOS);
	assert(val.digits[0] == 0);
	assert(val.digits[1] == 1);

	mp_int_clear(&val);
	return 0;
}
int test_mulp2(testspec_t *t, FILE *ofp)
{
  mp_int in[3], out[1];
  mp_result res, expect;
  int p2;

  if(!parse_int_values(t, in, out, &expect))
    return imath_errno = MP_BADARG, 0;

  if((res = mp_int_to_int(in[1], &p2)) != MP_OK) 
    return imath_errno = res, 0;

  if((res = mp_int_mul_pow2(in[0], p2, in[2])) != expect)
    return imath_errno = res, 0;

  if(expect == MP_OK && mp_int_compare(in[2], out[0]) != 0) {
    mp_int_to_string(in[2], 10, g_output, OUTPUT_LIMIT);
    return imath_errno = OTHER_ERROR, 0;
  }

  return 1;
}