int test_kron(BIO *bp, BN_CTX *ctx)
	{
	BIGNUM *a,*b,*r,*t;
	int i;
	int legendre, kronecker;
	int ret = 0;

	a = BN_new();
	b = BN_new();
	r = BN_new();
	t = BN_new();
	if (a == NULL || b == NULL || r == NULL || t == NULL) goto err;
	
	/* We test BN_kronecker(a, b, ctx) just for  b  odd (Jacobi symbol).
	 * In this case we know that if  b  is prime, then BN_kronecker(a, b, ctx)
	 * is congruent to $a^{(b-1)/2}$, modulo $b$ (Legendre symbol).
	 * So we generate a random prime  b  and compare these values
	 * for a number of random  a's.  (That is, we run the Solovay-Strassen
	 * primality test to confirm that  b  is prime, except that we
	 * don't want to test whether  b  is prime but whether BN_kronecker
	 * works.) */

#if 0
	if (!BN_generate_prime(b, 512, 0, NULL, NULL, genprime_cb, NULL)) goto err;
#else
	BN_set_word(b,65537);
#endif
	putc('\n', stderr);

	for (i = 0; i < num0; i++)
		{
		if (!BN_rand(a, 512, 0, 0)) goto err;
		a->neg = rand_neg();

		/* t := (b-1)/2  (note that b is odd) */
		if (!BN_copy(t, b)) goto err;
		if (!BN_sub_word(t, 1)) goto err;
		if (!BN_rshift1(t, t)) goto err;
		/* r := a^t mod b */
#if 1
		if (!BN_mod_exp(r, a, t, b, ctx)) goto err;
#elif 0
		if (!BN_mod_exp_recp(r, a, t, b, ctx)) goto err;
#else
		if (!BN_mod_exp_simple(r, a, t, b, ctx)) goto err;
#endif

		if (BN_is_word(r, 1))
			legendre = 1;
		else
			{
			if (!BN_add_word(r, 1)) goto err;
			if (0 != BN_cmp(r, b))
				{
				fprintf(stderr, "Legendre symbol computation failed\n");
				goto err;
				}
			legendre = -1;
			}

		kronecker = BN_kronecker(a, b, ctx);
		if (kronecker < -1) goto err;
		
		if (legendre != kronecker)
			{
			fprintf(stderr, "legendre != kronecker; a = ");
			BN_print_fp(stderr, a);
			fprintf(stderr, ", a = ");
			BN_print_fp(stderr, b);
			fprintf(stderr, "\n");
			goto err;
			}

		putc('.', stderr);
		fflush(stderr);
		}

	putc('\n', stderr);
	fflush(stderr);
	ret = 1;
 err:
	if (a != NULL) BN_free(a);
	if (b != NULL) BN_free(b);
	if (r != NULL) BN_free(r);
	if (t != NULL) BN_free(t);
	return ret;
	}