if (Ai != NULL) BN_free(Ai); BN_CTX_end(ctx); if (ctx != p_ctx) BN_CTX_free(ctx);
int RSA_blinding_on(RSA *rsa, BN_CTX *p_ctx)	{	BIGNUM *A,*Ai = NULL;	BN_CTX *ctx;	int ret=0;	if (p_ctx == NULL)		{		if ((ctx=BN_CTX_new()) == NULL) goto err;		}	else		ctx=p_ctx;	/* XXXXX: Shouldn't this be RSA_blinding_off(rsa)? */	if (rsa->blinding != NULL)		{		BN_BLINDING_free(rsa->blinding);		rsa->blinding = NULL;		}	/* NB: similar code appears in setup_blinding (rsa_eay.c);	 * this should be placed in a new function of its own, but for reasons	 * of binary compatibility can't */	BN_CTX_start(ctx);	A = BN_CTX_get(ctx);	if ((RAND_status() == 0) && rsa->d != NULL && rsa->d->d != NULL)		{		/* if PRNG is not properly seeded, resort to secret exponent as unpredictable seed */		RAND_add(rsa->d->d, rsa->d->dmax * sizeof rsa->d->d[0], 0.0);		if (!BN_pseudo_rand_range(A,rsa->n)) goto err;		}	else		{		if (!BN_rand_range(A,rsa->n)) goto err;		}	if ((Ai=BN_mod_inverse(NULL,A,rsa->n,ctx)) == NULL) goto err;	if (!rsa->meth->bn_mod_exp(A,A,rsa->e,rsa->n,ctx,rsa->_method_mod_n))		goto err;	if ((rsa->blinding=BN_BLINDING_new(A,Ai,rsa->n)) == NULL) goto err;	/* to make things thread-safe without excessive locking,	 * rsa->blinding will be used just by the current thread: */	rsa->blinding->thread_id = CRYPTO_thread_id();	rsa->flags |= RSA_FLAG_BLINDING;	rsa->flags &= ~RSA_FLAG_NO_BLINDING;	ret=1;err:	if (Ai != NULL) BN_free(Ai);	BN_CTX_end(ctx);	if (ctx != p_ctx) BN_CTX_free(ctx);	return(ret);	}