mont->ri=BN_num_bits(mod); BN_zero(R); BN_set_bit(R,mont->ri);			  if ((BN_mod_inverse(&Ri,R,mod,ctx)) == NULL)
mont->ri=BN_num_bits(&mont->N); if (!BN_zero(R)) goto err; if (!BN_set_bit(R,mont->ri)) goto err;    if ((BN_mod_inverse(&Ri,R,&mont->N,ctx)) == NULL)
int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx)	{	BIGNUM Ri,*R;	BN_init(&Ri);	R= &(mont->RR);					/* grab RR as a temp */	BN_copy(&(mont->N),mod);			/* Set N */#ifdef MONT_WORD		{		BIGNUM tmod;		BN_ULONG buf[2];		mont->ri=(BN_num_bits(mod)+(BN_BITS2-1))/BN_BITS2*BN_BITS2;		BN_zero(R);		BN_set_bit(R,BN_BITS2);			/* R */		buf[0]=mod->d[0]; /* tmod = N mod word size */		buf[1]=0;		tmod.d=buf;		tmod.top=1;		tmod.dmax=2;		tmod.neg=mod->neg;							/* Ri = R^-1 mod N*/		if ((BN_mod_inverse(&Ri,R,&tmod,ctx)) == NULL)			goto err;		BN_lshift(&Ri,&Ri,BN_BITS2);		/* R*Ri */		if (!BN_is_zero(&Ri))			BN_sub_word(&Ri,1);		else /* if N mod word size == 1 */			BN_set_word(&Ri,BN_MASK2);  /* Ri-- (mod word size) */		BN_div(&Ri,NULL,&Ri,&tmod,ctx);	/* Ni = (R*Ri-1)/N,		                                 * keep only least significant word: */		mont->n0=Ri.d[0];		BN_free(&Ri);		}#else /* !MONT_WORD */		{ /* bignum version */		mont->ri=BN_num_bits(mod);		BN_zero(R);		BN_set_bit(R,mont->ri);			/* R = 2^ri */							/* Ri = R^-1 mod N*/		if ((BN_mod_inverse(&Ri,R,mod,ctx)) == NULL)			goto err;		BN_lshift(&Ri,&Ri,mont->ri);		/* R*Ri */		BN_sub_word(&Ri,1);							/* Ni = (R*Ri-1) / N */		BN_div(&(mont->Ni),NULL,&Ri,mod,ctx);		BN_free(&Ri);		}#endif	/* setup RR for conversions */	BN_zero(&(mont->RR));	BN_set_bit(&(mont->RR),mont->ri*2);	BN_mod(&(mont->RR),&(mont->RR),&(mont->N),ctx);	return(1);err:	return(0);	}