BN_CTX_end(ctx);
static int cswift_mod_exp_crt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,			const BIGNUM *q, const BIGNUM *dmp1,			const BIGNUM *dmq1, const BIGNUM *iqmp, BN_CTX *ctx)	{	SW_STATUS sw_status;	SW_LARGENUMBER arg, res;	SW_PARAM sw_param;	SW_CONTEXT_HANDLE hac;	BIGNUM *rsa_p = NULL;	BIGNUM *rsa_q = NULL;	BIGNUM *rsa_dmp1 = NULL;	BIGNUM *rsa_dmq1 = NULL;	BIGNUM *rsa_iqmp = NULL;	BIGNUM *argument = NULL;	BIGNUM *result = NULL;	int to_return = 0; /* expect failure */	int acquired = 0; 	if(!get_context(&hac))		{		CSWIFTerr(CSWIFT_F_CSWIFT_MOD_EXP_CRT,CSWIFT_R_UNIT_FAILURE);		goto err;		}	acquired = 1;	/* Prepare the params */	BN_CTX_start(ctx);	rsa_p = BN_CTX_get(ctx);	rsa_q = BN_CTX_get(ctx);	rsa_dmp1 = BN_CTX_get(ctx);	rsa_dmq1 = BN_CTX_get(ctx);	rsa_iqmp = BN_CTX_get(ctx);	argument = BN_CTX_get(ctx);	result = BN_CTX_get(ctx);	if(!result)		{		CSWIFTerr(CSWIFT_F_CSWIFT_MOD_EXP_CRT,CSWIFT_R_BN_CTX_FULL);		goto err;		}	if(!bn_wexpand(rsa_p, p->top) || !bn_wexpand(rsa_q, q->top) ||			!bn_wexpand(rsa_dmp1, dmp1->top) ||			!bn_wexpand(rsa_dmq1, dmq1->top) ||			!bn_wexpand(rsa_iqmp, iqmp->top) ||			!bn_wexpand(argument, a->top) ||			!bn_wexpand(result, p->top + q->top))		{		CSWIFTerr(CSWIFT_F_CSWIFT_MOD_EXP_CRT,CSWIFT_R_BN_EXPAND_FAIL);		goto err;		}	sw_param.type = SW_ALG_CRT;	sw_param.up.crt.p.nbytes = BN_bn2bin(p, (unsigned char *)rsa_p->d);	sw_param.up.crt.p.value = (unsigned char *)rsa_p->d;	sw_param.up.crt.q.nbytes = BN_bn2bin(q, (unsigned char *)rsa_q->d);	sw_param.up.crt.q.value = (unsigned char *)rsa_q->d;	sw_param.up.crt.dmp1.nbytes = BN_bn2bin(dmp1,		(unsigned char *)rsa_dmp1->d);	sw_param.up.crt.dmp1.value = (unsigned char *)rsa_dmp1->d;	sw_param.up.crt.dmq1.nbytes = BN_bn2bin(dmq1,		(unsigned char *)rsa_dmq1->d);	sw_param.up.crt.dmq1.value = (unsigned char *)rsa_dmq1->d;	sw_param.up.crt.iqmp.nbytes = BN_bn2bin(iqmp,		(unsigned char *)rsa_iqmp->d);	sw_param.up.crt.iqmp.value = (unsigned char *)rsa_iqmp->d;	/* Attach the key params */	sw_status = p_CSwift_AttachKeyParam(hac, &sw_param);	switch(sw_status)		{	case SW_OK:		break;	case SW_ERR_INPUT_SIZE:		CSWIFTerr(CSWIFT_F_CSWIFT_MOD_EXP_CRT,CSWIFT_R_BAD_KEY_SIZE);		goto err;	default:		{		char tmpbuf[DECIMAL_SIZE(sw_status)+1];		CSWIFTerr(CSWIFT_F_CSWIFT_MOD_EXP_CRT,CSWIFT_R_REQUEST_FAILED);		sprintf(tmpbuf, "%ld", sw_status);		ERR_add_error_data(2, "CryptoSwift error number is ",tmpbuf);		}		goto err;		}	/* Prepare the argument and response */	arg.nbytes = BN_bn2bin(a, (unsigned char *)argument->d);	arg.value = (unsigned char *)argument->d;	res.nbytes = 2 * BN_num_bytes(p);	memset(result->d, 0, res.nbytes);	res.value = (unsigned char *)result->d;	/* Perform the operation */	if((sw_status = p_CSwift_SimpleRequest(hac, SW_CMD_MODEXP_CRT, &arg, 1,		&res, 1)) != SW_OK)		{		char tmpbuf[DECIMAL_SIZE(sw_status)+1];		CSWIFTerr(CSWIFT_F_CSWIFT_MOD_EXP_CRT,CSWIFT_R_REQUEST_FAILED);		sprintf(tmpbuf, "%ld", sw_status);		ERR_add_error_data(2, "CryptoSwift error number is ",tmpbuf);		goto err;		}	/* Convert the response */	BN_bin2bn((unsigned char *)result->d, res.nbytes, r);	to_return = 1;err:	if(acquired)		release_context(hac);	BN_CTX_end(ctx);	return to_return;	}