use ERR_peek_last_error() instead of ERR_peek_error() to ignore
[openssl.git] / crypto / bn / bn_lib.c
index 87972ce7b08fcfe7c66c1e2cb408f00e971a46b8..a016cb7f5379776658357367bd86d5383e297392 100644 (file)
@@ -62,6 +62,7 @@
 #endif
 
 #include <assert.h>
+#include <limits.h>
 #include <stdio.h>
 #include "cryptlib.h"
 #include "bn_lcl.h"
@@ -127,7 +128,7 @@ int BN_get_params(int which)
        else return(0);
        }
 
-BIGNUM *BN_value_one(void)
+const BIGNUM *BN_value_one(void)
        {
        static BN_ULONG data_one=1L;
        static BIGNUM const_one={&data_one,1,1,0};
@@ -312,6 +313,12 @@ static BN_ULONG *bn_expand_internal(const BIGNUM *b, int words)
        const BN_ULONG *B;
        int i;
 
+       if (words > (INT_MAX/(4*BN_BITS2)))
+               {
+               BNerr(BN_F_BN_EXPAND_INTERNAL,BN_R_BIGNUM_TOO_LONG);
+               return NULL;
+               }
+
        bn_check_top(b);        
        if (BN_get_flags(b,BN_FLG_STATIC_DATA))
                {
@@ -778,6 +785,13 @@ int bn_cmp_words(const BN_ULONG *a, const BN_ULONG *b, int n)
        return(0);
        }
 
+/* Here follows a specialised variants of bn_cmp_words().  It has the
+   property of performing the operation on arrays of different sizes.
+   The sizes of those arrays is expressed through cl, which is the
+   common length ( basicall, min(len(a),len(b)) ), and dl, which is the
+   delta between the two lengths, calculated as len(a)-len(b).
+   All lengths are the number of BN_ULONGs...  */
+
 int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b,
        int cl, int dl)
        {
@@ -786,9 +800,9 @@ int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b,
 
        if (dl < 0)
                {
-               for (i=-dl; i>0; i++)
+               for (i=dl; i<0; i++)
                        {
-                       if (b[n+i] != 0)
+                       if (b[n-i] != 0)
                                return -1; /* a < b */
                        }
                }