Additional comment changes for reformat of 1.0.2
[openssl.git] / crypto / ec / ecp_nistp256.c
index a1cef699a0acb673b8f16477b225fb977df388ba..c80a26186bf43412104b142c619704e4f9c0a90f 100644 (file)
  * work which got its smarts from Daniel J. Bernstein's work on the same.
  */
 
-#ifdef EC_NISTP_64_GCC_128
+#include <openssl/opensslconf.h>
+#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128
 
+#ifndef OPENSSL_SYS_VMS
 #include <stdint.h>
+#else
+#include <inttypes.h>
+#endif
+
 #include <string.h>
 #include <openssl/err.h>
 #include "ec_lcl.h"
@@ -78,7 +84,8 @@ static const felem_bytearray nistp256_curve_params[5] = {
         0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5}
 };
 
-/* The representation of field elements.
+/*-
+ * The representation of field elements.
  * ------------------------------------
  *
  * We represent field elements with either four 128-bit values, eight 128-bit
@@ -107,7 +114,6 @@ typedef u64 smallfelem[NLIMBS];
 
 /* This is the value of the prime as four 64-bit words, little-endian. */
 static const u64 kPrime[4] = { 0xfffffffffffffffful, 0xffffffff, 0, 0xffffffff00000001ul };
-static const limb bottom32bits = 0xffffffff;
 static const u64 bottom63bits = 0x7ffffffffffffffful;
 
 /* bin32_to_felem takes a little-endian byte array and converts it into felem
@@ -174,8 +180,10 @@ static BIGNUM *smallfelem_to_BN(BIGNUM *out, const smallfelem in)
        }
 
 
-/* Field operations
- * ---------------- */
+/*-
+ * Field operations
+ * ----------------
+ */
 
 static void smallfelem_one(smallfelem out)
        {
@@ -248,7 +256,8 @@ static void longfelem_scalar(longfelem out, const u64 scalar)
 /* zero105 is 0 mod p */
 static const felem zero105 = { two105m41m9, two105, two105m41p9, two105m41p9 };
 
-/* smallfelem_neg sets |out| to |-small|
+/*-
+ * smallfelem_neg sets |out| to |-small|
  * On exit:
  *   out[i] < out[i] + 2^105
  */
@@ -261,7 +270,8 @@ static void smallfelem_neg(felem out, const smallfelem small)
        out[3] = zero105[3] - small[3];
        }
 
-/* felem_diff subtracts |in| from |out|
+/*-
+ * felem_diff subtracts |in| from |out|
  * On entry:
  *   in[i] < 2^104
  * On exit:
@@ -288,7 +298,8 @@ static void felem_diff(felem out, const felem in)
 /* zero107 is 0 mod p */
 static const felem zero107 = { two107m43m11, two107, two107m43p11, two107m43p11 };
 
-/* An alternative felem_diff for larger inputs |in|
+/*-
+ * An alternative felem_diff for larger inputs |in|
  * felem_diff_zero107 subtracts |in| from |out|
  * On entry:
  *   in[i] < 2^106
@@ -309,7 +320,8 @@ static void felem_diff_zero107(felem out, const felem in)
        out[3] -= in[3];
        }
 
-/* longfelem_diff subtracts |in| from |out|
+/*-
+ * longfelem_diff subtracts |in| from |out|
  * On entry:
  *   in[i] < 7*2^67
  * On exit:
@@ -352,7 +364,8 @@ static void longfelem_diff(longfelem out, const longfelem in)
 /* zero110 is 0 mod p */
 static const felem zero110 = { two64m0, two110p32m0, two64m46, two64m32 };
 
-/* felem_shrink converts an felem into a smallfelem. The result isn't quite
+/*-
+ * felem_shrink converts an felem into a smallfelem. The result isn't quite
  * minimal as the value may be greater than p.
  *
  * On entry:
@@ -363,6 +376,10 @@ static const felem zero110 = { two64m0, two110p32m0, two64m46, two64m32 };
 static void felem_shrink(smallfelem out, const felem in)
        {
        felem tmp;
+       u64 a, b, mask;
+       s64 high, low;
+       static const u64 kPrime3Test = 0x7fffffff00000001ul; /* 2^63 - 2^32 + 1 */
+
        /* Carry 2->3 */
        tmp[3] = zero110[3] + in[3] + ((u64) (in[2] >> 64));
        /* tmp[3] < 2^110 */
@@ -375,13 +392,13 @@ static void felem_shrink(smallfelem out, const felem in)
        /* We perform two partial reductions where we eliminate the
         * high-word of tmp[3]. We don't update the other words till the end.
         */
-       u64 a = tmp[3] >> 64; /* a < 2^46 */
+       a = tmp[3] >> 64; /* a < 2^46 */
        tmp[3] = (u64) tmp[3];
        tmp[3] -= a;
        tmp[3] += ((limb)a) << 32;
        /* tmp[3] < 2^79 */
 
-       u64 b = a;
+       b = a;
        a = tmp[3] >> 64; /* a < 2^15 */
        b += a; /* b < 2^46 + 2^15 < 2^47 */
        tmp[3] = (u64) tmp[3];
@@ -396,17 +413,18 @@ static void felem_shrink(smallfelem out, const felem in)
 
        /* In order to make space in tmp[3] for the carry from 2 -> 3, we
         * conditionally subtract kPrime if tmp[3] is large enough. */
-       static const u64 kPrime3Test = 0x7fffffff00000001ul; /* 2^63 - 2^32 + 1 */
-       s64 high = tmp[3] >> 64;
+       high = tmp[3] >> 64;
        /* As tmp[3] < 2^65, high is either 1 or 0 */
        high <<= 63;
        high >>= 63;
-       /* high is:
+       /*-
+        * high is:
         *   all ones   if the high word of tmp[3] is 1
         *   all zeros  if the high word of tmp[3] if 0 */
-       s64 low = tmp[3];
-       u64 mask = low >> 63;
-       /* mask is:
+       low = tmp[3];
+       mask = low >> 63;
+       /*-
+        * mask is:
         *   all ones   if the MSB of low is 1
         *   all zeros  if the MSB of low if 0 */
        low &= bottom63bits;
@@ -414,7 +432,8 @@ static void felem_shrink(smallfelem out, const felem in)
        /* if low was greater than kPrime3Test then the MSB is zero */
        low = ~low;
        low >>= 63;
-       /* low is:
+       /*-
+        * low is:
         *   all ones   if low was > kPrime3Test
         *   all zeros  if low was <= kPrime3Test */
        mask = (mask & low) | high;
@@ -444,7 +463,8 @@ static void smallfelem_expand(felem out, const smallfelem in)
        out[3] = in[3];
        }
 
-/* smallfelem_square sets |out| = |small|^2
+/*- 
+ * smallfelem_square sets |out| = |small|^2
  * On entry:
  *   small[i] < 2^64
  * On exit:
@@ -522,7 +542,8 @@ static void smallfelem_square(longfelem out, const smallfelem small)
        out[7] = high;
        }
 
-/* felem_square sets |out| = |in|^2
+/*-
+ * felem_square sets |out| = |in|^2
  * On entry:
  *   in[i] < 2^109
  * On exit:
@@ -535,7 +556,8 @@ static void felem_square(longfelem out, const felem in)
        smallfelem_square(out, small);
        }
 
-/* smallfelem_mul sets |out| = |small1| * |small2|
+/*-
+ * smallfelem_mul sets |out| = |small1| * |small2|
  * On entry:
  *   small1[i] < 2^64
  *   small2[i] < 2^64
@@ -650,7 +672,8 @@ static void smallfelem_mul(longfelem out, const smallfelem small1, const smallfe
        out[7] = high;
        }
 
-/* felem_mul sets |out| = |in1| * |in2|
+/*-
+ * felem_mul sets |out| = |in1| * |in2|
  * On entry:
  *   in1[i] < 2^109
  *   in2[i] < 2^109
@@ -665,7 +688,8 @@ static void felem_mul(longfelem out, const felem in1, const felem in2)
        smallfelem_mul(out, small1, small2);
        }
 
-/* felem_small_mul sets |out| = |small1| * |in2|
+/*-
+ * felem_small_mul sets |out| = |small1| * |in2|
  * On entry:
  *   small1[i] < 2^64
  *   in2[i] < 2^109
@@ -685,7 +709,8 @@ static void felem_small_mul(longfelem out, const smallfelem small1, const felem
 /* zero100 is 0 mod p */
 static const felem zero100 = { two100m36m4, two100, two100m36p4, two100m36p4 };
 
-/* Internal function for the different flavours of felem_reduce.
+/*-
+ * Internal function for the different flavours of felem_reduce.
  * felem_reduce_ reduces the higher coefficients in[4]-in[7].
  * On entry:
  *   out[0] >= in[6] + 2^32*in[6] + in[7] + 2^32*in[7] 
@@ -732,7 +757,8 @@ static void felem_reduce_(felem out, const longfelem in)
        out[3] += (in[7] * 3);
        }
 
-/* felem_reduce converts a longfelem into an felem.
+/*-
+ * felem_reduce converts a longfelem into an felem.
  * To be called directly after felem_square or felem_mul.
  * On entry:
  *   in[0] < 2^64, in[1] < 3*2^64, in[2] < 5*2^64, in[3] < 7*2^64
@@ -749,7 +775,8 @@ static void felem_reduce(felem out, const longfelem in)
 
        felem_reduce_(out, in);
 
-       /* out[0] > 2^100 - 2^36 - 2^4 - 3*2^64 - 3*2^96 - 2^64 - 2^96 > 0
+       /*-
+        * out[0] > 2^100 - 2^36 - 2^4 - 3*2^64 - 3*2^96 - 2^64 - 2^96 > 0
         * out[1] > 2^100 - 2^64 - 7*2^96 > 0
         * out[2] > 2^100 - 2^36 + 2^4 - 5*2^64 - 5*2^96 > 0
         * out[3] > 2^100 - 2^36 + 2^4 - 7*2^64 - 5*2^96 - 3*2^96 > 0
@@ -761,7 +788,8 @@ static void felem_reduce(felem out, const longfelem in)
         */
        }
 
-/* felem_reduce_zero105 converts a larger longfelem into an felem.
+/*-
+ * felem_reduce_zero105 converts a larger longfelem into an felem.
  * On entry:
  *   in[0] < 2^71
  * On exit:
@@ -776,7 +804,8 @@ static void felem_reduce_zero105(felem out, const longfelem in)
 
        felem_reduce_(out, in);
 
-       /* out[0] > 2^105 - 2^41 - 2^9 - 2^71 - 2^103 - 2^71 - 2^103 > 0
+       /*-
+        * out[0] > 2^105 - 2^41 - 2^9 - 2^71 - 2^103 - 2^71 - 2^103 > 0
         * out[1] > 2^105 - 2^71 - 2^103 > 0
         * out[2] > 2^105 - 2^41 + 2^9 - 2^71 - 2^103 > 0
         * out[3] > 2^105 - 2^41 + 2^9 - 2^71 - 2^103 - 2^103 > 0
@@ -815,7 +844,9 @@ static void felem_contract(smallfelem out, const felem in)
         * compare each u64, from most-significant to least significant. For
         * each one, if all words so far have been equal (m is all ones) then a
         * non-equal result is the answer. Otherwise we continue. */
-       for (i = 3; i < 4; i--) {
+       for (i = 3; i < 4; i--)
+               {
+               u64 equal;
                uint128_t a = ((uint128_t) kPrime[i]) - out[i];
                /* if out[i] > kPrime[i] then a will underflow and the high
                 * 64-bits will all be set. */
@@ -823,7 +854,7 @@ static void felem_contract(smallfelem out, const felem in)
 
                /* if kPrime[i] == out[i] then |equal| will be all zeros and
                 * the decrement will make it all ones. */
-               u64 equal = kPrime[i] ^ out[i];
+               equal = kPrime[i] ^ out[i];
                equal--;
                equal &= equal << 32;
                equal &= equal << 16;
@@ -834,7 +865,7 @@ static void felem_contract(smallfelem out, const felem in)
                equal = ((s64) equal) >> 63;
 
                all_equal_so_far &= equal;
-       }
+               }
 
        /* if all_equal_so_far is still all ones then the two values are equal
         * and so out >= kPrime is true. */
@@ -876,7 +907,8 @@ static void smallfelem_mul_contract(smallfelem out, const smallfelem in1, const
        felem_contract(out, tmp);
        }
 
-/* felem_is_zero returns a limb with all bits set if |in| == 0 (mod p) and 0
+/*-
+ * felem_is_zero returns a limb with all bits set if |in| == 0 (mod p) and 0
  * otherwise.
  * On entry:
  *   small[i] < 2^64
@@ -884,6 +916,7 @@ static void smallfelem_mul_contract(smallfelem out, const smallfelem in1, const
 static limb smallfelem_is_zero(const smallfelem small)
        {
        limb result;
+       u64 is_p;
 
        u64 is_zero = small[0] | small[1] | small[2] | small[3];
        is_zero--;
@@ -895,10 +928,10 @@ static limb smallfelem_is_zero(const smallfelem small)
        is_zero &= is_zero << 1;
        is_zero = ((s64) is_zero) >> 63;
 
-       u64 is_p = (small[0] ^ kPrime[0]) |
-                  (small[1] ^ kPrime[1]) |
-                  (small[2] ^ kPrime[2]) |
-                  (small[3] ^ kPrime[3]);
+       is_p = (small[0] ^ kPrime[0]) |
+              (small[1] ^ kPrime[1]) |
+              (small[2] ^ kPrime[2]) |
+              (small[3] ^ kPrime[3]);
        is_p--;
        is_p &= is_p << 32;
        is_p &= is_p << 16;
@@ -920,7 +953,8 @@ static int smallfelem_is_zero_int(const smallfelem small)
        return (int) (smallfelem_is_zero(small) & ((limb)1));
        }
 
-/* felem_inv calculates |out| = |in|^{-1}
+/*-
+ * felem_inv calculates |out| = |in|^{-1}
  *
  * Based on Fermat's Little Theorem:
  *   a^p = a (mod p)
@@ -999,14 +1033,16 @@ static void smallfelem_inv_contract(smallfelem out, const smallfelem in)
        felem_contract(out, tmp);
        }
 
-/* Group operations
+/*-
+ * Group operations
  * ----------------
  *
  * Building on top of the field operations we have the operations on the
  * elliptic curve group itself. Points on the curve are represented in Jacobian
  * coordinates */
 
-/* point_double calculates 2*(x_in, y_in, z_in)
+/*-
+ * point_double calculates 2*(x_in, y_in, z_in)
  *
  * The method is taken from:
  *   http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b
@@ -1134,7 +1170,8 @@ copy_small_conditional(felem out, const smallfelem in, limb mask)
                }
        }
 
-/* point_add calcuates (x1, y1, z1) + (x2, y2, z2)
+/*-
+ * point_add calcuates (x1, y1, z1) + (x2, y2, z2)
  *
  * The method is taken from:
  *   http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-add-2007-bl,
@@ -1323,7 +1360,8 @@ static void point_add_small(smallfelem x3, smallfelem y3, smallfelem z3,
        felem_shrink(z3, felem_z3);
        }
 
-/* Base point pre computation
+/*-
+ * Base point pre computation
  * --------------------------
  *
  * Two different sorts of precomputed tables are used in the following code.
@@ -1457,9 +1495,9 @@ static const smallfelem gmul[2][16][3] =
    {0x501e82885bc98cda, 0x41ef80e5d046ac04, 0x557d9f49461210fb, 0x4ab5b6b2b8753f81},
    {1, 0, 0, 0}}}};
 
-/* select_point selects the |index|th point from a precomputation table and
+/* select_point selects the |idx|th point from a precomputation table and
  * copies it to out. */
-static void select_point(const u64 index, unsigned int size, const smallfelem pre_comp[16][3], smallfelem out[3])
+static void select_point(const u64 idx, unsigned int size, const smallfelem pre_comp[16][3], smallfelem out[3])
        {
        unsigned i, j;
        u64 *outlimbs = &out[0][0];
@@ -1468,7 +1506,7 @@ static void select_point(const u64 index, unsigned int size, const smallfelem pr
        for (i = 0; i < size; i++)
                {
                const u64 *inlimbs = (u64*) &pre_comp[i][0][0];
-               u64 mask = i ^ index;
+               u64 mask = i ^ idx;
                mask |= mask >> 4;
                mask |= mask >> 2;
                mask |= mask >> 1;
@@ -1623,9 +1661,9 @@ const EC_METHOD *EC_GFp_nistp256_method(void)
                ec_GFp_simple_get_Jprojective_coordinates_GFp,
                ec_GFp_simple_point_set_affine_coordinates,
                ec_GFp_nistp256_point_get_affine_coordinates,
-                0 /* point_set_compressed_coordinates */,
-                0 /* point2oct */,
-                0 /* oct2point */,
+               0 /* point_set_compressed_coordinates */,
+               0 /* point2oct */,
+               0 /* oct2point */,
                ec_GFp_simple_add,
                ec_GFp_simple_dbl,
                ec_GFp_simple_invert,
@@ -1784,16 +1822,17 @@ int ec_GFp_nistp256_point_get_affine_coordinates(const EC_GROUP *group,
        felem_contract(y_out, y_in);
        if (y != NULL)
                {
-               if (!smallfelem_to_BN(y, y_out)) {
-               ECerr(EC_F_EC_GFP_NISTP256_POINT_GET_AFFINE_COORDINATES,
-                       ERR_R_BN_LIB);
-               return 0;
-               }
+               if (!smallfelem_to_BN(y, y_out))
+                       {
+                       ECerr(EC_F_EC_GFP_NISTP256_POINT_GET_AFFINE_COORDINATES,
+                               ERR_R_BN_LIB);
+                       return 0;
+                       }
                }
        return 1;
        }
 
-static void make_points_affine(size_t num, smallfelem points[num][3], smallfelem tmp_smallfelems[num+1])
+static void make_points_affine(size_t num, smallfelem points[/* num */][3], smallfelem tmp_smallfelems[/* num+1 */])
        {
        /* Runs in constant time, unless an input is the point at infinity
         * (which normally shouldn't happen). */