Call fipsas.pl directly for pa-risc targets.
[openssl.git] / crypto / bn / bn_word.c
index 7aa2a33d2d092e803024f00467558be7ff5b3257..ee7b87c45ccd38839db6261ed81c2d87b9e881b5 100644 (file)
@@ -69,6 +69,9 @@ BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w)
 #endif
        int i;
 
+       if (w == 0)
+               return (BN_ULONG)-1;
+
        bn_check_top(a);
        w&=BN_MASK2;
        for (i=a->top-1; i>=0; i--)
@@ -87,17 +90,23 @@ BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w)
 BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w)
        {
        BN_ULONG ret = 0;
-       int i;
+       int i, j;
 
        bn_check_top(a);
        w &= BN_MASK2;
 
        if (!w)
                /* actually this an error (division by zero) */
-               return 0;
+               return (BN_ULONG)-1;
        if (a->top == 0)
                return 0;
 
+       /* normalize input (so bn_div_words doesn't complain) */
+       j = BN_BITS2 - BN_num_bits_word(w);
+       w <<= j;
+       if (!BN_lshift(a, a, j))
+               return (BN_ULONG)-1;
+
        for (i=a->top-1; i>=0; i--)
                {
                BN_ULONG l,d;
@@ -109,6 +118,7 @@ BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w)
                }
        if ((a->top > 0) && (a->d[a->top-1] == 0))
                a->top--;
+       ret >>= j;
        bn_check_top(a);
        return(ret);
        }
@@ -168,7 +178,13 @@ int BN_sub_word(BIGNUM *a, BN_ULONG w)
        /* 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);
+       if(BN_is_zero(a))
+               {
+               i = BN_set_word(a,w);
+               if (i != 0)
+                       BN_set_negative(a, 1);
+               return i;
+               }
        /* handle 'a' when negative */
        if (a->neg)
                {