Further windows specific .gitignore entries
[oweals/openssl.git] / crypto / constant_time_locl.h
index ccf7b62f5fd147c2f8e08a5ec5b544a9eb286a9f..8af98c168329e97ce12d71b826fa08906f62a05a 100644 (file)
@@ -106,6 +106,11 @@ static inline unsigned char constant_time_is_zero_8(unsigned int a);
 static inline unsigned int constant_time_eq(unsigned int a, unsigned int b);
 /* Convenience method for getting an 8-bit mask. */
 static inline unsigned char constant_time_eq_8(unsigned int a, unsigned int b);
+/* Signed integers. */
+static inline unsigned int constant_time_eq_int(int a, int b);
+/* Convenience method for getting an 8-bit mask. */
+static inline unsigned char constant_time_eq_int_8(int a, int b);
+
 
 /*
  * Returns (mask & a) | (~mask & b).
@@ -124,17 +129,12 @@ static inline int constant_time_select_int(unsigned int mask, int a, int b);
 
 static inline unsigned int constant_time_msb(unsigned int a)
        {
-       return (unsigned int)((int)(a) >> (sizeof(int) * 8 - 1));
+       return 0-(a >> (sizeof(a) * 8 - 1));
        }
 
 static inline unsigned int constant_time_lt(unsigned int a, unsigned int b)
        {
-       unsigned int lt;
-       /* Case 1: msb(a) == msb(b). a < b iff the MSB of a - b is set.*/
-       lt = ~(a ^ b) & (a - b);
-       /* Case 2: msb(a) != msb(b). a < b iff the MSB of b is set. */
-       lt |= ~a & b;
-       return constant_time_msb(lt);
+       return constant_time_msb(a^((a^b)|((a-b)^b)));
        }
 
 static inline unsigned char constant_time_lt_8(unsigned int a, unsigned int b)
@@ -144,12 +144,7 @@ static inline unsigned char constant_time_lt_8(unsigned int a, unsigned int b)
 
 static inline unsigned int constant_time_ge(unsigned int a, unsigned int b)
        {
-       unsigned int ge;
-       /* Case 1: msb(a) == msb(b). a >= b iff the MSB of a - b is not set.*/
-       ge = ~((a ^ b) | (a - b));
-       /* Case 2: msb(a) != msb(b). a >= b iff the MSB of a is set. */
-       ge |= a & ~b;
-       return constant_time_msb(ge);
+       return ~constant_time_lt(a, b);
        }
 
 static inline unsigned char constant_time_ge_8(unsigned int a, unsigned int b)
@@ -177,6 +172,16 @@ static inline unsigned char constant_time_eq_8(unsigned int a, unsigned int b)
        return (unsigned char)(constant_time_eq(a, b));
        }
 
+static inline unsigned int constant_time_eq_int(int a, int b)
+       {
+       return constant_time_eq((unsigned)(a), (unsigned)(b));
+       }
+
+static inline unsigned char constant_time_eq_int_8(int a, int b)
+       {
+       return constant_time_eq_8((unsigned)(a), (unsigned)(b));
+       }
+
 static inline unsigned int constant_time_select(unsigned int mask,
        unsigned int a, unsigned int b)
        {
@@ -189,7 +194,7 @@ static inline unsigned char constant_time_select_8(unsigned char mask,
        return (unsigned char)(constant_time_select(mask, a, b));
        }
 
-inline int constant_time_select_int(unsigned int mask, int a, int b)
+static inline int constant_time_select_int(unsigned int mask, int a, int b)
        {
        return (int)(constant_time_select(mask, (unsigned)(a), (unsigned)(b)));
        }