Fix crypto/ec/ec_mult.c to work properly with scalars of value 0
[openssl.git] / crypto / ec / ectest.c
index 9b32f55be80856b96d4dc5ae1ea0278a4bc6737b..b74d6435be9680faf49dc570a13ff204982e6544 100644 (file)
@@ -92,6 +92,13 @@ int main(int argc, char * argv[]) { puts("Elliptic curves are disabled."); retur
 #include <openssl/err.h>
 #include <openssl/obj_mac.h>
 #include <openssl/objects.h>
+#include <openssl/rand.h>
+#include <openssl/bn.h>
+
+#if defined(_MSC_VER) && defined(_MIPS_) && (_MSC_VER/100==12)
+/* suppress "too big too optimize" warning */
+#pragma warning(disable:4959)
+#endif
 
 #define ABORT do { \
        fflush(stdout); \
@@ -224,7 +231,7 @@ void prime_field_tests()
                EC_GROUP *tmp;
                tmp = EC_GROUP_new(EC_GROUP_method_of(group));
                if (!tmp) ABORT;
-               if (!EC_GROUP_copy(tmp, group));
+               if (!EC_GROUP_copy(tmp, group)) ABORT;
                EC_GROUP_free(group);
                group = tmp;
        }
@@ -642,13 +649,15 @@ void prime_field_tests()
        if (!EC_POINT_is_at_infinity(group, R)) ABORT; /* R = P + 2Q */
 
        {
-               const EC_POINT *points[3];
-               const BIGNUM *scalars[3];
+               const EC_POINT *points[4];
+               const BIGNUM *scalars[4];
+               BIGNUM scalar3;
        
                if (EC_POINT_is_at_infinity(group, Q)) ABORT;
                points[0] = Q;
                points[1] = Q;
                points[2] = Q;
+               points[3] = Q;
 
                if (!BN_add(y, z, BN_value_one())) ABORT;
                if (BN_is_odd(y)) ABORT;
@@ -670,7 +679,7 @@ void prime_field_tests()
 
                if (!BN_pseudo_rand(y, BN_num_bits(y), 0, 0)) ABORT;
                if (!BN_add(z, z, y)) ABORT;
-               BN_set_sign(z, 1);
+               BN_set_negative(z, 1);
                scalars[0] = y;
                scalars[1] = z; /* z = -(order + y) */
 
@@ -682,15 +691,21 @@ void prime_field_tests()
 
                if (!BN_pseudo_rand(x, BN_num_bits(y) - 1, 0, 0)) ABORT;
                if (!BN_add(z, x, y)) ABORT;
-               BN_set_sign(z, 1);
+               BN_set_negative(z, 1);
                scalars[0] = x;
                scalars[1] = y;
                scalars[2] = z; /* z = -(x+y) */
 
-               if (!EC_POINTs_mul(group, P, NULL, 3, points, scalars, ctx)) ABORT;
+               BN_init(&scalar3);
+               BN_zero(&scalar3);
+               scalars[3] = &scalar3;
+
+               if (!EC_POINTs_mul(group, P, NULL, 4, points, scalars, ctx)) ABORT;
                if (!EC_POINT_is_at_infinity(group, P)) ABORT;
 
                fprintf(stdout, " ok\n\n");
+
+               BN_free(&scalar3);
        }
 
 
@@ -827,7 +842,7 @@ void char2_field_tests()
                EC_GROUP *tmp;
                tmp = EC_GROUP_new(EC_GROUP_method_of(group));
                if (!tmp) ABORT;
-               if (!EC_GROUP_copy(tmp, group));
+               if (!EC_GROUP_copy(tmp, group)) ABORT;
                EC_GROUP_free(group);
                group = tmp;
        }
@@ -1145,7 +1160,7 @@ void char2_field_tests()
 
                if (!BN_pseudo_rand(y, BN_num_bits(y), 0, 0)) ABORT;
                if (!BN_add(z, z, y)) ABORT;
-               BN_set_sign(z, 1);
+               BN_set_negative(z, 1);
                scalars[0] = y;
                scalars[1] = z; /* z = -(order + y) */
 
@@ -1157,7 +1172,7 @@ void char2_field_tests()
 
                if (!BN_pseudo_rand(x, BN_num_bits(y) - 1, 0, 0)) ABORT;
                if (!BN_add(z, x, y)) ABORT;
-               BN_set_sign(z, 1);
+               BN_set_negative(z, 1);
                scalars[0] = x;
                scalars[1] = y;
                scalars[2] = z; /* z = -(x+y) */
@@ -1250,10 +1265,10 @@ void internal_curve_test(void)
                {
                EC_GROUP *group = NULL;
                int nid = curves[n].nid;
-               if ((group = EC_GROUP_new_by_nid(nid)) == NULL)
+               if ((group = EC_GROUP_new_by_curve_name(nid)) == NULL)
                        {
                        ok = 0;
-                       fprintf(stdout, "\nEC_GROUP_new_by_nid() failed with"
+                       fprintf(stdout, "\nEC_GROUP_new_curve_name() failed with"
                                " curve %s\n", OBJ_nid2sn(nid));
                        /* try next curve */
                        continue;