Don't allow BIGNUMs to become so large that computations with dmax
authorBodo Möller <bodo@openssl.org>
Sun, 3 Dec 2000 09:37:15 +0000 (09:37 +0000)
committerBodo Möller <bodo@openssl.org>
Sun, 3 Dec 2000 09:37:15 +0000 (09:37 +0000)
might overflow.

crypto/bn/bn.h
crypto/bn/bn_err.c
crypto/bn/bn_lib.c

index 3f6864fcf303821ddb0622e3b9b59c4671bb0f33..f4649819292fec04e2276b2c314ed77312d0fd7c 100644 (file)
@@ -505,6 +505,7 @@ BN_ULONG bn_sub_words(BN_ULONG *rp, BN_ULONG *ap, BN_ULONG *bp,int num);
 #define BN_R_INVALID_LENGTH                             106
 #define BN_R_NOT_INITIALIZED                            107
 #define BN_R_NO_INVERSE                                         108
+#define BN_R_TOO_LARGE                                  114
 #define BN_R_TOO_MANY_TEMPORARY_VARIABLES               109
 
 #ifdef  __cplusplus
index 86550c4c21d5804732d09d9f71fe7805c9240902..673a994996c97b8bb5a1cc72fae4b361e22c9a58 100644 (file)
@@ -99,6 +99,7 @@ static ERR_STRING_DATA BN_str_reasons[]=
 {BN_R_INVALID_LENGTH                     ,"invalid length"},
 {BN_R_NOT_INITIALIZED                    ,"not initialized"},
 {BN_R_NO_INVERSE                         ,"no inverse"},
+{BN_R_TOO_LARGE                          ,"too large"},
 {BN_R_TOO_MANY_TEMPORARY_VARIABLES       ,"too many temporary variables"},
 {0,NULL}
        };
index b6b0ce4b3c9fe134396a5187b1dae3e4785e1034..c32958c1012e1e8a1aaae3baa607efa342b22238 100644 (file)
@@ -319,6 +319,12 @@ BIGNUM *bn_expand2(BIGNUM *b, int words)
 
        if (words > b->dmax)
                {
+               if (words > (INT_MAX/(4*BN_BITS2)))
+                       {
+                       BNerr(BN_F_BN_EXPAND2,BN_R_TOO_LARGE);
+                       return NULL;
+                       }
+                       
                bn_check_top(b);        
                if (BN_get_flags(b,BN_FLG_STATIC_DATA))
                        {