if(BN_is_zero(a)) return BN_set_word(a,w);
if(BN_is_zero(a)) { i = BN_set_word(a,w); if (i != 0) BN_set_negative(a, 1); return i; }
int BN_sub_word(BIGNUM *a, BN_ULONG w)	{	int i;	bn_check_top(a);	w &= BN_MASK2;	/* degenerate case: w is zero */	if (!w) return 1;	/* degenerate case: a is zero */	if(BN_is_zero(a)) return BN_set_word(a,w);	/* handle 'a' when negative */	if (a->neg)		{		a->neg=0;		i=BN_add_word(a,w);		a->neg=1;		return(i);		}	if ((a->top == 1) && (a->d[0] < w))		{		a->d[0]=w-a->d[0];		a->neg=1;		return(1);		}	i=0;	for (;;)		{		if (a->d[i] >= w)			{			a->d[i]-=w;			break;			}		else			{			a->d[i]=(a->d[i]-w)&BN_MASK2;			i++;			w=1;			}		}	if ((a->d[i] == 0) && (i == (a->top-1)))		a->top--;	bn_check_top(a);	return(1);	}