Harmonized behaviour when point length is invalid.
[BearSSL] / src / ec / ec_p256_m31.c
index 0462c15..b185937 100644 (file)
@@ -423,17 +423,17 @@ mul_f256(uint32_t *d, const uint32_t *a, const uint32_t *b)
        }
 
        for (i = 17; i >= 9; i --) {
        }
 
        for (i = 17; i >= 9; i --) {
-               uint64_t x;
-
-               x = s[i];
-               s[i - 1] += ARSHW(x, 2);
-               s[i - 2] += (x << 28) & 0x3FFFFFFF;
-               s[i - 2] -= ARSHW(x, 4);
-               s[i - 3] -= (x << 26) & 0x3FFFFFFF;
-               s[i - 5] -= ARSHW(x, 10);
-               s[i - 6] -= (x << 20) & 0x3FFFFFFF;
-               s[i - 8] += ARSHW(x, 16);
-               s[i - 9] += (x << 14) & 0x3FFFFFFF;
+               uint64_t y;
+
+               y = s[i];
+               s[i - 1] += ARSHW(y, 2);
+               s[i - 2] += (y << 28) & 0x3FFFFFFF;
+               s[i - 2] -= ARSHW(y, 4);
+               s[i - 3] -= (y << 26) & 0x3FFFFFFF;
+               s[i - 5] -= ARSHW(y, 10);
+               s[i - 6] -= (y << 20) & 0x3FFFFFFF;
+               s[i - 8] += ARSHW(y, 16);
+               s[i - 9] += (y << 14) & 0x3FFFFFFF;
        }
 
        /*
        }
 
        /*
@@ -535,17 +535,17 @@ square_f256(uint32_t *d, const uint32_t *a)
        }
 
        for (i = 17; i >= 9; i --) {
        }
 
        for (i = 17; i >= 9; i --) {
-               uint64_t x;
-
-               x = s[i];
-               s[i - 1] += ARSHW(x, 2);
-               s[i - 2] += (x << 28) & 0x3FFFFFFF;
-               s[i - 2] -= ARSHW(x, 4);
-               s[i - 3] -= (x << 26) & 0x3FFFFFFF;
-               s[i - 5] -= ARSHW(x, 10);
-               s[i - 6] -= (x << 20) & 0x3FFFFFFF;
-               s[i - 8] += ARSHW(x, 16);
-               s[i - 9] += (x << 14) & 0x3FFFFFFF;
+               uint64_t y;
+
+               y = s[i];
+               s[i - 1] += ARSHW(y, 2);
+               s[i - 2] += (y << 28) & 0x3FFFFFFF;
+               s[i - 2] -= ARSHW(y, 4);
+               s[i - 3] -= (y << 26) & 0x3FFFFFFF;
+               s[i - 5] -= ARSHW(y, 10);
+               s[i - 6] -= (y << 20) & 0x3FFFFFFF;
+               s[i - 8] += ARSHW(y, 16);
+               s[i - 9] += (y << 14) & 0x3FFFFFFF;
        }
 
        /*
        }
 
        /*
@@ -1089,7 +1089,7 @@ p256_decode(p256_jacobian *P, const void *src, size_t len)
        memcpy(P->y, ty, sizeof ty);
        memset(P->z, 0, sizeof P->z);
        P->z[0] = 1;
        memcpy(P->y, ty, sizeof ty);
        memset(P->z, 0, sizeof P->z);
        P->z[0] = 1;
-       return NEQ(bad, 0) ^ 1;
+       return EQ(bad, 0);
 }
 
 /*
 }
 
 /*
@@ -1384,12 +1384,13 @@ api_mul(unsigned char *G, size_t Glen,
        p256_jacobian P;
 
        (void)curve;
        p256_jacobian P;
 
        (void)curve;
+       if (Glen != 65) {
+               return 0;
+       }
        r = p256_decode(&P, G, Glen);
        p256_mul(&P, x, xlen);
        r = p256_decode(&P, G, Glen);
        p256_mul(&P, x, xlen);
-       if (Glen >= 65) {
-               p256_to_affine(&P);
-               p256_encode(G, &P);
-       }
+       p256_to_affine(&P);
+       p256_encode(G, &P);
        return r;
 }
 
        return r;
 }
 
@@ -1404,16 +1405,6 @@ api_mulgen(unsigned char *R,
        p256_to_affine(&P);
        p256_encode(R, &P);
        return 65;
        p256_to_affine(&P);
        p256_encode(R, &P);
        return 65;
-
-       /*
-       const unsigned char *G;
-       size_t Glen;
-
-       G = api_generator(curve, &Glen);
-       memcpy(R, G, Glen);
-       api_mul(R, Glen, x, xlen, curve);
-       return Glen;
-       */
 }
 
 static uint32_t
 }
 
 static uint32_t
@@ -1426,6 +1417,9 @@ api_muladd(unsigned char *A, const unsigned char *B, size_t len,
        int i;
 
        (void)curve;
        int i;
 
        (void)curve;
+       if (len != 65) {
+               return 0;
+       }
        r = p256_decode(&P, A, len);
        p256_mul(&P, x, xlen);
        if (B == NULL) {
        r = p256_decode(&P, A, len);
        p256_mul(&P, x, xlen);
        if (B == NULL) {