if (!BN_gcd(r,b,c,ctx)) goto err;
if (!BN_gcd(r,c,a,ctx)) goto err; #elif defined(TEST_KRON) if (-2 == BN_kronecker(a,b,ctx)) goto err; if (-2 == BN_kronecker(b,c,ctx)) goto err; if (-2 == BN_kronecker(c,a,ctx)) goto err;
void do_mul_exp(BIGNUM *r, BIGNUM *a, BIGNUM *b, BIGNUM *c, BN_CTX *ctx)	{	int i,k;	double tm;	long num;#if defined(TEST_EXP) + defined(TEST_GCD) + defined(TEST_INV) != 1#  error "choose one test"#endif#ifdef TEST_INV#  define C_PRIME#endif	num=BASENUM;	for (i=NUM_START; i<NUM_SIZES; i++)		{#ifdef C_PRIME		if (!BN_generate_prime(c,sizes[i],0,NULL,NULL,genprime_cb,NULL)) goto err;		putc('\n', stderr);		fflush(stderr);#endif		Time_F(START);		for (k=0; k<num; k++)			{			if (k%50 == 0) /* Average over num/50 different choices of random numbers. */				{				if (!BN_pseudo_rand(a,sizes[i],1,0)) goto err;				if (!BN_pseudo_rand(b,sizes[i],1,0)) goto err;#ifndef C_PRIME				if (!BN_pseudo_rand(c,sizes[i],1,1)) goto err;#endif				}#if defined(TEST_EXP)			if (!BN_mod_exp(r,a,b,c,ctx)) goto err;#elif defined(TEST_GCD)			if (!BN_gcd(r,a,b,ctx)) goto err;			if (!BN_gcd(r,b,c,ctx)) goto err;			if (!BN_gcd(r,b,c,ctx)) goto err;#else /* TEST_INV */			if (!BN_mod_inverse(r,a,c,ctx)) goto err;			if (!BN_mod_inverse(r,b,c,ctx)) goto err;#endif			}		tm=Time_F(STOP);		printf(#if defined(TEST_EXP)			"modexp %4d ^ %4d %% %4d"#elif defined(TEST_GCD)			"3*gcd %4d %4d %4d"#else /* TEST_INV */			"2*inv %4d %4d mod %4d"#endif			" -> %8.3fms %5.1f (%d)\n",sizes[i],sizes[i],sizes[i],tm*1000.0/num,tm*mul_c[i]/num, num);		num/=7;		if (num <= 0) num=1;		}	return; err:	ERR_print_errors_fp(stderr);	}