コード例 #1
0
ファイル: testutils.c プロジェクト: AllardJ/Tomato
void
test_dsa_key(struct dsa_public_key *pub,
	     struct dsa_private_key *key,
	     unsigned q_size)
{
  mpz_t t;

  mpz_init(t);

  ASSERT(mpz_sizeinbase(pub->q, 2) == q_size);
  ASSERT(mpz_sizeinbase(pub->p, 2) >= DSA_SHA1_MIN_P_BITS);
  
  ASSERT(mpz_probab_prime_p(pub->p, 10));

  ASSERT(mpz_probab_prime_p(pub->q, 10));

  mpz_fdiv_r(t, pub->p, pub->q);

  ASSERT(0 == mpz_cmp_ui(t, 1));

  ASSERT(mpz_cmp_ui(pub->g, 1) > 0);
  
  mpz_powm(t, pub->g, pub->q, pub->p);
  ASSERT(0 == mpz_cmp_ui(t, 1));
  
  mpz_powm(t, pub->g, key->x, pub->p);
  ASSERT(0 == mpz_cmp(t, pub->y));

  mpz_clear(t);
}
コード例 #2
0
ファイル: prime.c プロジェクト: pbos/optimus
void factor(mpz_t num)
{
	if(mpz_probab_prime_p(num, 10) > 0)
	{
		mpz_set(factors[num_factors++], num);
		return;
	}

	// Trial division, "fairly cheap" compared to rest of QS
	for(size_t i = 0; i < num_primes; ++i)
	{
		while(mpz_tdiv_q_ui(q, num, primes[i]) == 0)
		{
			mpz_set_ui(factors[num_factors++], primes[i]);
			mpz_set(num, q);
		}
	}

	if(!mpz_cmp_ui(num, 1)) // If num==1 we're done
		return;

	if(mpz_probab_prime_p(num, 10) > 0)
	{
		mpz_set(factors[num_factors++], num);
		return;
	}

	sieve_factor(num);
}
コード例 #3
0
void
paillier_keygen( int modulusbits,
								 paillier_pubkey_t** pub,
								 paillier_prvkey_t** prv,
								 paillier_get_rand_t get_rand )
{
	mpz_t p;
	mpz_t q;
	gmp_randstate_t rand;

	/* allocate the new key structures */

	*pub = (paillier_pubkey_t*) malloc(sizeof(paillier_pubkey_t));
	*prv = (paillier_prvkey_t*) malloc(sizeof(paillier_prvkey_t));

	/* initialize our integers */

	mpz_init((*pub)->n);
	mpz_init((*pub)->n_squared);
	mpz_init((*pub)->n_plusone);
	mpz_init((*prv)->lambda);
	mpz_init((*prv)->x);
	mpz_init(p);
	mpz_init(q);

	/* pick random (modulusbits/2)-bit primes p and q */

	init_rand(rand, get_rand, modulusbits / 8 + 1);
	do
	{
		do
			mpz_urandomb(p, rand, modulusbits / 2);
		while( !mpz_probab_prime_p(p, 10) );

		do
			mpz_urandomb(q, rand, modulusbits / 2);
		while( !mpz_probab_prime_p(q, 10) );

		/* compute the public modulus n = p q */

		mpz_mul((*pub)->n, p, q);
	} while( !mpz_tstbit((*pub)->n, modulusbits - 1) );
	complete_pubkey(*pub);
	(*pub)->bits = modulusbits;

	/* compute the private key lambda = lcm(p-1,q-1) */

	mpz_sub_ui(p, p, 1);
	mpz_sub_ui(q, q, 1);
	mpz_lcm((*prv)->lambda, p, q);
	complete_prvkey(*prv, *pub);

	/* clear temporary integers and randstate */

	mpz_clear(p);
	mpz_clear(q);
  gmp_randclear(rand);
}
コード例 #4
0
ファイル: gmp_ecm.c プロジェクト: coolpraku/msieve
/*--------------------------------------------------------------------*/
static uint32 postprocess(msieve_obj *obj, mpz_t factor, 
			  mpz_t n, pm1_pp1_t *non_ecm_vals,
			  factor_list_t *factor_list) {

	/* handling for factors found. When complete, n
	   is changed to new input to be factored */

	uint32 i;
	mpz_t q, r;
	mp_t mp_factor;
	uint32 is_prime0, is_prime1;

	/* divide out all instances of factor from n */

	mpz_init(q);
	mpz_init(r);
	while (1) {
		mpz_tdiv_qr(q, r, n, factor);
		if (mpz_cmp_ui(q, (unsigned long)0) == 0 || 
		    mpz_cmp_ui(r, (unsigned long)0) != 0)
			break;

		mpz_set(n, q);
	}
	mpz_clear(q);
	mpz_clear(r);

	if (mpz_cmp_ui(n, (unsigned long)1) == 0) {
		mpz_set(n, factor);
	}
	else {
		/* in the worst case, n and factor are both composite.
     		   We would have to give up factoring one of them and
     		   continue on the other */

		is_prime0 = mpz_probab_prime_p(factor, 1);
		is_prime1 = mpz_probab_prime_p(n, 1);
		if ( (is_prime1 > 0 && is_prime0 == 0) ||
		     (is_prime1 == 0 && is_prime0 == 0 &&
				mpz_cmp(factor, n) > 0) ) {
			mpz_swap(factor, n);
		}

		/* switch the P+-1 stage 1 values to 
		   be modulo the new n */

		for (i = 0; i < NUM_NON_ECM; i++) {
			mpz_mod(non_ecm_vals[i].start_val,
				non_ecm_vals[i].start_val, n);
		}
	}

	gmp2mp(factor, &mp_factor);
	return factor_list_add(obj, factor_list, &mp_factor);
}
コード例 #5
0
ファイル: crypt.c プロジェクト: MFreeze/m2moca
void rsaKeyGen(rsapvk_t *pvk, rsapbk_t *pbk) {
    // Temporary variable
    mpz_t tmp;
    mpz_init(tmp);

    // Integer used for random numbers
    if (!seed_initialized)
        rnInit();

    do {
        mpz_urandomb(pvk->p, seed, RSA_KEY_SIZE);        
    } while (!mpz_probab_prime_p(pvk->p, NB_TURN));

    do {
        mpz_urandomb(pvk->q, seed, RSA_KEY_SIZE);        
    } while (!mpz_probab_prime_p(pvk->q, NB_TURN));

    // Initialize keys
    mpz_mul(pbk->n, pvk->p, pvk->q);
    mpz_set(pvk->n, pbk->n);

    // Compute phi = (p-1)(q-1) = q(p-1) - (p-1)
    // I don't compute p-1 and q-1 to avoid many initializations
    mpz_sub_ui(tmp, pvk->p, 1);
    mpz_mul(pvk->phi, pvk->q, tmp);
    mpz_sub(pvk->phi, pvk->phi, tmp);

    // Find a random number prime with phi
    do {
        mpz_urandomb(pbk->pbk, seed, RSA_KEY_SIZE);        
        mpz_gcd(tmp, pbk->pbk, pvk->phi);
    } while (mpz_cmp_ui(tmp, 1));

    // Compute pvk
    mpz_invert(pvk->pvk, pbk->pbk, pvk->phi);

    // Compute k
    mpz_set_ui(tmp, NB_CHAR);
    pvk->k = 0;
    while (mpz_cmp(tmp, pbk->n) < 0) {
        mpz_mul_ui(tmp, tmp, NB_CHAR);
        pvk->k ++;
    }

    pvk->k --;

    pbk->k = pvk->k;

    // Clearing variables
    mpz_clear(tmp);
}
コード例 #6
0
void damgard_jurik::key_gen(int modulusbits) {
    mpz_t p, q;

    gmp_randstate_t rand;
    mpz_init(pubkey->n);
    mpz_init(pubkey->g);
    mpz_init(prvkey->lambda);
    mpz_init(p);
    mpz_init(q);

    init_rand(rand, modulusbits / 8 + 1);
    do
    {
        do
            mpz_urandomb(p, rand, modulusbits / 2);
        while( !mpz_probab_prime_p(p, 10) );

        do
            mpz_urandomb(q, rand, modulusbits / 2);
        while( !mpz_probab_prime_p(q, 10) );

        /* compute the public modulus n = p q */

        mpz_mul(pubkey->n, p, q);
    } while( !mpz_tstbit(pubkey->n, modulusbits - 1));
    pubkey->bits = modulusbits;

    mpz_add_ui(pubkey->g, pubkey->n, 1);
    pubkey->n_j = new mpz_t[s_max + 2];
    pubkey->k_n = new mpz_t[s_max + 2];
    mpz_init(pubkey->n_j[0]);
    mpz_set_ui(pubkey->n_j[0], 1);
    mpz_init(pubkey->k_n[0]);
    mpz_set_ui(pubkey->k_n[0], 1);
    for (int i = 1;i <= s_max + 1;i++) {
        mpz_init(pubkey->n_j[i]);
        mpz_mul(pubkey->n_j[i], pubkey->n_j[i - 1], pubkey->n);
        mpz_init(pubkey->k_n[i]);
        mpz_mul_ui(pubkey->k_n[i], pubkey->k_n[i - 1], i);
    }

    /* Compute Private Key */
    mpz_sub_ui(p, p, 1);
    mpz_sub_ui(q, q, 1);
    mpz_lcm(prvkey->lambda, p, q);

    mpz_clear(p);
    mpz_clear(q);
    gmp_randclear(rand);
}
コード例 #7
0
ファイル: paillier.cpp プロジェクト: kolhagen/bitvoting
void
genSafePrimes( mpz_t* p1, mpz_t* p, int modulusbits, gmp_randstate_t rand )
{
    mpz_init(*p1);
    mpz_init(*p);
    do
    {
        do
            mpz_urandomb(*p1, rand, (modulusbits / 2) - 1);
        while( !mpz_probab_prime_p(*p1, 10) );
        mpz_mul_ui(*p,*p1,2);
        mpz_add_ui(*p,*p,1);
    }
    while( !mpz_probab_prime_p(*p, 10) );
}
コード例 #8
0
void factor(mpz_t N)
{
	int res;
	char *str;
	mpz_t divisor;
	mpz_t next;

	mpz_init(divisor);
	mpz_init(next);


	if (mpz_cmp(N, one) == 0)
		return;

	res = mpz_probab_prime_p(N, 10);
	if (res) {
		str = mpz_to_str(N);
		if (!str)
			return;

		printf(" %s", str);
		free(str);
		return;
	}

	rho(divisor, N);

	factor(divisor);
	mpz_tdiv_q(next, N, divisor);
	factor(next);
}
コード例 #9
0
static int isprime(void *a, int *b)
{
   LTC_ARGCHK(a != NULL);
   LTC_ARGCHK(b != NULL);
   *b = mpz_probab_prime_p(a, 8) > 0 ? LTC_MP_YES : LTC_MP_NO;
   return CRYPT_OK;
}
コード例 #10
0
ファイル: gmpy2_mpz_misc.c プロジェクト: martingkelly/gmpy
static PyObject *
GMPy_MPZ_Method_IsPrime(PyObject *self, PyObject *args)
{
    int i;
    unsigned long reps = 25;
    Py_ssize_t argc;

    argc = PyTuple_GET_SIZE(args);

    if (argc > 1) {
        TYPE_ERROR("is_prime() takes at most 1 argument");
        return NULL;
    }

    if (PyTuple_GET_SIZE(args) == 1) {
        reps = c_ulong_From_Integer(PyTuple_GET_ITEM(args, 0));
        if (reps == -1 && PyErr_Occurred()) {
            return NULL;
        }
        /* Silently limit n to a reasonable value. */
        if (reps > 1000) {
            reps = 1000;
        }
    }

    i = mpz_probab_prime_p(MPZ(self), (int)reps);

    if (i)
        Py_RETURN_TRUE;
    else
        Py_RETURN_FALSE;
}
コード例 #11
0
ファイル: primes.c プロジェクト: AlexeiSheplyakov/gmp.pkg
/* Find primes in region [fr,fr+rsize), using the previously sieved s[].  */
void
find_primes (unsigned char *s, mpz_t  fr, unsigned long ssize,
	     mpz_t siev_sqr_lim)
{
  unsigned long j, ij;
  mpz_t tmp;

  mpz_init (tmp);
  for (j = 0; j < (ssize + sizeof (long) - 1) / sizeof (long); j++)
    {
      if (((long *) s) [j] != 0)
	{
	  for (ij = 0; ij < sizeof (long); ij++)
	    {
	      if (s[j * sizeof (long) + ij] != 0)
		{
		  if (j * sizeof (long) + ij >= ssize)
		    goto out;
		  mpz_add_ui (tmp, fr, (j * sizeof (long) + ij) * 2);
		  if (mpz_cmp (tmp, siev_sqr_lim) < 0 ||
		      mpz_probab_prime_p (tmp, 10))
		    report (tmp);
		}
	    }
	}
    }
 out:
  mpz_clear (tmp);
}
コード例 #12
0
ファイル: prob-058.cpp プロジェクト: koonom/project-euler
int main() {
    for (int n = 2; n <= N / 2; ++n)
        if (!composite[n])
            for (int m = n + n; m <= N; m += n) composite[m] = true;

    mpz_class n = 1;
    int l = 1, numberOfPrimes = 0, numberOfTests = 1;
    while (l += 2) {
        for (int j = 0; j < 4; ++j) {
            n += l - 1;
            ++numberOfTests;

            if (n <= N) {
                if (!composite[n.get_ui()]) ++numberOfPrimes;
            }
            else {
                if (mpz_probab_prime_p(n.get_mpz_t(), 5)) ++numberOfPrimes;
            }
        }

        double ratio = double(numberOfPrimes) / numberOfTests;
        if (ratio < 0.1) break;
    }

    std::cout << l << "\n";
    return 0;
}
コード例 #13
0
ファイル: factors.c プロジェクト: mharrys/factor
int
factors_remove_composite(struct factors *f, mpz_t factor)
{
	int i = 0;
	int composite = 0;

	for (; i < f->size; i++) {
		if (mpz_probab_prime_p(f->factors[i], MILLERRABIN_REPEATS) == 0) {
			mpz_set(factor, f->factors[i]);
			composite = 1;
			break;
		}
	}

	if (composite == 0) {
		return 0;
	}

	/*
	 * fill gap if factor was not located at the end
	 */
	for (; i < (f->size - 1); i++) {
		mpz_set(f->factors[i], f->factors[i + 1]);
	}

	mpz_clear(f->factors[f->size - 1]);
	f->size--;

	return 1;
}
コード例 #14
0
ファイル: t-nextprime.c プロジェクト: 119/aircam-openwrt
void
refmpz_nextprime (mpz_ptr p, mpz_srcptr t)
{
  mpz_add_ui (p, t, 1L);
  while (! mpz_probab_prime_p (p, 10))
    mpz_add_ui (p, p, 1L);
}
コード例 #15
0
ファイル: main.c プロジェクト: GorrieXIV/4F03bygxiv
int findMatch(long int q, long int n) {
	long int poopy = n/q;
	mpz_t l;
	mpz_init(l);
	mpz_set_si(l, poopy);
	if (n%q == 0) {
		if (mpz_probab_prime_p(l, 20) == 1){
			return 1;
		} else if (mpz_probab_prime_p(l, 20) == 0){
			return 0;
		} else {
			return 1;
		}
	} else {
		return 0;
	}
}
コード例 #16
0
ファイル: miller_rabin.c プロジェクト: Chris--B/Cprimes
/* for benchmarking */
int gmp_miller_rabin(const char* num_str, int rounds) {
	mpz_t num;
	int res;
	mpz_init_set_str(num, num_str, 10);
	res = mpz_probab_prime_p(num, rounds);
	mpz_clear(num);
	return res;
}
コード例 #17
0
static int allprime_factor_array(mpz_t* farray, int nfacs)
{
  int i;
  for (i = 0; i < nfacs; i++) {
    if (!mpz_probab_prime_p(farray[i], 5))   /* Be lazy */
      return 0;
  }
  return 1;
}
コード例 #18
0
ファイル: main.c プロジェクト: mharrys/factor
int
main(int argc, char **argv)
{
	char line[INTEGER_LIMIT];
	if (argc > 1)
		strncpy(&line[0], argv[1], INTEGER_LIMIT);
	else if (scanf("%s\n", &line[0]) != 1) {
		fprintf(stderr, "factor: unable to read number from stdin\n");
		return 1;
	}

	mpz_t n;
	mpz_init(n);

	if (mpz_set_str(n, &line[0], 0) == -1 || mpz_cmp_ui(n, 1) < 0) {
		fprintf(stderr, "factor: input must be a positive integer\n");
		mpz_clear(n);
		return 1;
	}

	if (mpz_cmp_ui(n, 1) == 0 || mpz_probab_prime_p(n, MILLERRABIN_REPEATS) > 0) {
		gmp_printf("%Zd: %Zd\n", n, n);
		mpz_clear(n);
		return 0;
	}

	mpz_t t;
	mpz_init(t);
	mpz_sqrt(t, n);

	struct factors *f = factors_create();
	struct prime_sieve *ps = prime_sieve_create(MIN(TRIALDIVISION_LIMIT, mpz_get_ui(t)));

	if (mpz_perfect_square_p(n)) {
		factors_push(f, t);
		factors_push(f, t);
	} else {
		mpz_set(t, n);
		factors_push(f, t);
	}

	/* run trial division to find find small factors */
	while (factors_remove_composite(f, t) && trial_division(t, f, ps));
	prime_sieve_destroy(ps);

	/* run quadratic sieve until factorized into only prime numbers */
	while (factors_remove_composite(f, t) && quadratic_sieve(t, f, QUADRATIC_SIEVE_SIZE));

	factors_sort(f);
	print_result(n, f);

	mpz_clears(n, t, NULL);
	factors_destroy(f);

	return 0;
}
コード例 #19
0
ファイル: task037.cpp プロジェクト: berlios/pe
bool TruncatablePrime(const mpz_class &num) {
  mpz_class copy = num;
  while (copy != 0) {
    if (mpz_probab_prime_p(copy.get_mpz_t(), 15) == 0) {
      return false;
    }
    copy = DeleteFirstDigit(copy);
  }

  copy = num;
  while (copy != 0) {
    if (mpz_probab_prime_p(copy.get_mpz_t(), 15) == 0) {
      return false;
    }
    copy = DeleteLastDigit(copy);
  }

  return true;
}
コード例 #20
0
ファイル: gmp_desc.c プロジェクト: mangos/mangosDeps
static int isprime(void *a, int b, int *c)
{
   LTC_ARGCHK(a != NULL);
   LTC_ARGCHK(c != NULL);
   if (b == 0) {
       b = LTC_MILLER_RABIN_REPS;
   } /* if */
   *c = mpz_probab_prime_p(a, b) > 0 ? LTC_MP_YES : LTC_MP_NO;
   return CRYPT_OK;
}
コード例 #21
0
ファイル: mpi.c プロジェクト: gnutls/gnutls
static int wrap_nettle_prime_check(bigint_t pp)
{
	int ret;

	ret = mpz_probab_prime_p(TOMPZ(pp), PRIME_CHECK_PARAM);
	if (ret > 0) {
		return 0;
	}

	return GNUTLS_E_INTERNAL_ERROR;	/* ignored */
}
コード例 #22
0
ファイル: pp1.c プロジェクト: CplusHua/yafu-setup-package
/* checks if the factor p was found by P+1 or P-1 (when prime).
   a is the initial seed.
*/
static void
pp1_check_factor (mpz_t a, mpz_t p)
{
  if (mpz_probab_prime_p (p, PROBAB_PRIME_TESTS))
    {
      mpz_mul (a, a, a);
      mpz_sub_ui (a, a, 4);
      if (mpz_jacobi (a, p) == 1)
        outputf (OUTPUT_NORMAL, "[factor found by P-1]\n");
    }
}
コード例 #23
0
ファイル: reesa.c プロジェクト: hylje/tira-reesa
void genprime(mpz_t rop, gmp_randstate_t state) {
  /* Generate a random number using GMP facilities

     Validate the random number as a likely prime using GMP facilities
     (TODO: reimplement primality checking)
   */
  do {
    mpz_urandomb(rop, state, 128);
  }
  while (mpz_probab_prime_p(rop, 25) == 0);
}
コード例 #24
0
ファイル: prime-check.c プロジェクト: gnutls/gnutls
static void test_prime(const gnutls_datum_t * prime)
{
	mpz_t p;
	unsigned bits = prime->size * 8;

	nettle_mpz_init_set_str_256_u(p, prime->size, prime->data);

	assert(mpz_sizeinbase(p, 2) == bits);
	assert(mpz_probab_prime_p(p, 18));

	mpz_clear(p);
}
コード例 #25
0
ファイル: damgard_jurik.cpp プロジェクト: jianyu-m/OnionOram
void damgard_jurik::key_gen(int modulusbits) {
    mpz_t p, q;

    gmp_randstate_t rand;
    mpz_init(pubkey->n);
    mpz_init(pubkey->g);
    mpz_init(prvkey->lambda);
    mpz_init(p);
    mpz_init(q);

    init_rand(rand, modulusbits / 8 + 1);
    do
    {
        do
            mpz_urandomb(p, rand, modulusbits / 2);
        while( !mpz_probab_prime_p(p, 10) );

        do
            mpz_urandomb(q, rand, modulusbits / 2);
        while( !mpz_probab_prime_p(q, 10) );

        /* compute the public modulus n = p q */

        mpz_mul(pubkey->n, p, q);
    } while( !mpz_tstbit(pubkey->n, modulusbits - 1));
    pubkey->bits = modulusbits;

    mpz_add_ui(pubkey->g, pubkey->n, 1);

    compute_cache();

    /* Compute Private Key */
    mpz_sub_ui(p, p, 1);
    mpz_sub_ui(q, q, 1);
    mpz_lcm(prvkey->lambda, p, q);

    mpz_clear(p);
    mpz_clear(q);
    gmp_randclear(rand);
}
コード例 #26
0
ファイル: factor.c プロジェクト: alexlibi/save
// Liefert die Primfaktorzerlegung einer Zahl als String.
char *factorize(mpz_t number)
{
	// Primtest (Miller-Rabin).
	if (mpz_probab_prime_p(number, 10) > 0)
		return mpz_get_str(NULL, 10, number);

	mpz_t factor, cofactor;
	mpz_init(factor);
	mpz_init(cofactor);
	char *str1, *str2, *result;
	int B1 = INITB1, B2 = INITB2, curves = INITCURVES;

	// Zunaechst eine einfache Probedivision.
	trial(number, factor, 3e3);
	if (mpz_cmp_si(factor, 1) == 0)
	{
		// Zweite Strategie: Pollard-Rho.
		do
		{
			rho(number, factor, 4e4);
		} while (mpz_cmp(factor, number) == 0);
		// Falls immer noch kein Faktor gefunden wurde, mit ECM fortfahren.
		while (mpz_cmp_si(factor, 1) == 0)
		{
			ecm(number, factor, B1, B2, curves);
			if (mpz_cmp(factor, number) == 0)
			{
				mpz_set_si(factor, 1);
				B1 = INITB1;
				B2 = INITB2;
				curves = INITCURVES;
				continue;
			}
			// Anpassung der Parameter.
			B1 *= 4;
			B2 *= 5;
			curves = (curves * 5) / 2;
		}
	}

	mpz_divexact(cofactor, number, factor);
	str1 = factorize(factor);
	str2 = factorize(cofactor);
	result = (char *) malloc(strlen(str1) + strlen(str2) + 4);
	strcpy(result, str1);
	strcat(result, " * ");
	strcat(result, str2);

	mpz_clear(factor);
	mpz_clear(cofactor);
	return result;
}
コード例 #27
0
int prime_q(unsigned long int n)
{
  mpz_t tester;
  mpz_init(tester);
  
  mpz_set_ui(tester, n);
  int r = mpz_probab_prime_p(tester, 25);


  mpz_clear(tester);

  return r;

}
コード例 #28
0
ファイル: ntheory.cpp プロジェクト: nitish-mittal/csympy
// Factorization
int factor(const Ptr<RCP<const Integer>> &f, const Integer &n, double B1)
{
    int ret_val = 0;
    mpz_class _n, _f;

    _n = n.as_mpz();

#ifdef HAVE_CSYMPY_ECM
    if (mpz_perfect_power_p(_n.get_mpz_t())) {

        unsigned long int i = 1;
        mpz_class m, rem;
        rem = 1; // Any non zero number
        m = 2; // set `m` to 2**i, i = 1 at the begining

        // calculate log2n, this can be improved
        for (; m < _n; i++)
            m = m * 2;

        // eventually `rem` = 0 zero as `n` is a perfect power. `f_t` will
        // be set to a factor of `n` when that happens
        while (i > 1 && rem != 0) {
            mpz_rootrem(_f.get_mpz_t(), rem.get_mpz_t(), _n.get_mpz_t(), i);
            i--;
        }

        ret_val = 1;
    }
    else {

        if (mpz_probab_prime_p(_n.get_mpz_t(), 25) > 0) { // most probably, n is a prime
            ret_val = 0;
            _f = _n;
        }
        else {

            for (int i = 0; i < 10 && !ret_val; i++)
                ret_val = ecm_factor(_f.get_mpz_t(), _n.get_mpz_t(), B1, NULL);
            if (!ret_val)
                throw std::runtime_error("ECM failed to factor the given number");
        }
    }
#else
    // B1 is discarded if gmp-ecm is not installed
    ret_val = _factor_trial_division_sieve(_f, _n);
#endif // HAVE_CSYMPY_ECM
    *f = integer(_f);

    return ret_val;
}
コード例 #29
0
ファイル: rsa.c プロジェクト: dfeldman94/proj2
/* Generate a random probable prime. numbits must be a multiple of 8 (i.e., a
 * round number of bytes). The base-2 logarithm of the result will lie in the
 * interval [numbits - 0.5, numbits). Calls abort if any error occurs. */
static void generate_prime(mpz_t p, unsigned int numbits)
{
	//Check if numbits is devisible by 8
	if(!((numbits % 8) == 0)) {
		printf("Error: Cannot generate prime of %d bits (must be multiple of 8)", numbits);
		abort();
	}

	//Allocate array to read into
	unsigned int num_bytes = numbits / 8;	
	char *rand_array = malloc(num_bytes);
	if(rand_array == NULL) {
		printf("Unable to allocate array for prime generation\n");
		abort();
	}

	//Open dev/urandom
	FILE *rand_data;
	rand_data = fopen("/dev/urandom", "r");

	//Init prime test var
	int prime_test = 0;
	
	//While our number is not prime, read more from urandom and generate new numbers
	while(!((prime_test == 2) || (prime_test == 1))) {
		//Read from dev/urandom
		size_t result = fread(rand_array, 1, num_bytes, rand_data);

		//Check if read was successfull
		if((int) result != (int) num_bytes) {
			printf("Error: Could not read %d bits from dev/random", num_bytes);
			abort();
		}

		//Flip to the top two bits
		*(rand_array) = *(rand_array) | 0xc0;

		//Copy to mpz var
		mpz_import(p, num_bytes, 1, sizeof(*(rand_array)), 0, 0, rand_array);
		
		//Test for primality
		prime_test = mpz_probab_prime_p(p, 25);
	}

	//Prime found, clean up
	free(rand_array);
	fclose(rand_data);

}
コード例 #30
0
ファイル: ext_gmp.cpp プロジェクト: SanjeebJena/hhvm
static Variant HHVM_FUNCTION(gmp_prob_prime,
                             const Variant& data,
                             int64_t reps = 10) {
  mpz_t gmpData;

  if (!variantToGMPData(cs_GMP_FUNC_NAME_GMP_PROB_PRIME, gmpData, data)) {
    return false;
  }

  int64_t probPrime = mpz_probab_prime_p(gmpData, reps);

  mpz_clear(gmpData);

  return probPrime;
}