summaryrefslogtreecommitdiffstats
path: root/include/internal/constant_time_locl.h
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2016-10-19 17:13:13 +0100
committerMatt Caswell <matt@openssl.org>2016-11-04 12:09:46 +0000
commit2688e7a0beb0f5e76a98749f25b978ddfb40ac7f (patch)
tree961020c53af8ff662dc7ae44db42e53c270c6614 /include/internal/constant_time_locl.h
parent708e06c55d9fee5d59e4a4f409d115423ea1fa56 (diff)
Provide some constant time functions for dealing with size_t values
Also implement the using of them Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'include/internal/constant_time_locl.h')
-rw-r--r--include/internal/constant_time_locl.h49
1 files changed, 49 insertions, 0 deletions
diff --git a/include/internal/constant_time_locl.h b/include/internal/constant_time_locl.h
index d27fb14c80..be2730ea95 100644
--- a/include/internal/constant_time_locl.h
+++ b/include/internal/constant_time_locl.h
@@ -10,6 +10,7 @@
#ifndef HEADER_CONSTANT_TIME_LOCL_H
# define HEADER_CONSTANT_TIME_LOCL_H
+# include <stdlib.h>
# include <openssl/e_os2.h> /* For 'ossl_inline' */
#ifdef __cplusplus
@@ -102,12 +103,22 @@ static ossl_inline unsigned int constant_time_msb(unsigned int a)
return 0 - (a >> (sizeof(a) * 8 - 1));
}
+static ossl_inline size_t constant_time_msb_s(size_t a)
+{
+ return 0 - (a >> (sizeof(a) * 8 - 1));
+}
+
static ossl_inline unsigned int constant_time_lt(unsigned int a,
unsigned int b)
{
return constant_time_msb(a ^ ((a ^ b) | ((a - b) ^ b)));
}
+static ossl_inline size_t constant_time_lt_s(size_t a, size_t b)
+{
+ return constant_time_msb_s(a ^ ((a ^ b) | ((a - b) ^ b)));
+}
+
static ossl_inline unsigned char constant_time_lt_8(unsigned int a,
unsigned int b)
{
@@ -120,17 +131,32 @@ static ossl_inline unsigned int constant_time_ge(unsigned int a,
return ~constant_time_lt(a, b);
}
+static ossl_inline size_t constant_time_ge_s(size_t a, size_t b)
+{
+ return ~constant_time_lt_s(a, b);
+}
+
static ossl_inline unsigned char constant_time_ge_8(unsigned int a,
unsigned int b)
{
return (unsigned char)(constant_time_ge(a, b));
}
+static ossl_inline unsigned char constant_time_ge_8_s(size_t a, size_t b)
+{
+ return (unsigned char)(constant_time_ge_s(a, b));
+}
+
static ossl_inline unsigned int constant_time_is_zero(unsigned int a)
{
return constant_time_msb(~a & (a - 1));
}
+static ossl_inline size_t constant_time_is_zero_s(size_t a)
+{
+ return constant_time_msb_s(~a & (a - 1));
+}
+
static ossl_inline unsigned char constant_time_is_zero_8(unsigned int a)
{
return (unsigned char)(constant_time_is_zero(a));
@@ -142,12 +168,22 @@ static ossl_inline unsigned int constant_time_eq(unsigned int a,
return constant_time_is_zero(a ^ b);
}
+static ossl_inline size_t constant_time_eq_s(size_t a, size_t b)
+{
+ return constant_time_is_zero_s(a ^ b);
+}
+
static ossl_inline unsigned char constant_time_eq_8(unsigned int a,
unsigned int b)
{
return (unsigned char)(constant_time_eq(a, b));
}
+static ossl_inline unsigned char constant_time_eq_8_s(size_t a, size_t b)
+{
+ return (unsigned char)(constant_time_eq_s(a, b));
+}
+
static ossl_inline unsigned int constant_time_eq_int(int a, int b)
{
return constant_time_eq((unsigned)(a), (unsigned)(b));
@@ -165,6 +201,13 @@ static ossl_inline unsigned int constant_time_select(unsigned int mask,
return (mask & a) | (~mask & b);
}
+static ossl_inline size_t constant_time_select_s(size_t mask,
+ size_t a,
+ size_t b)
+{
+ return (mask & a) | (~mask & b);
+}
+
static ossl_inline unsigned char constant_time_select_8(unsigned char mask,
unsigned char a,
unsigned char b)
@@ -178,6 +221,12 @@ static ossl_inline int constant_time_select_int(unsigned int mask, int a,
return (int)(constant_time_select(mask, (unsigned)(a), (unsigned)(b)));
}
+static ossl_inline int constant_time_select_int_s(size_t mask, int a, int b)
+{
+ return (int)(constant_time_select((unsigned)mask, (unsigned)(a),
+ (unsigned)(b)));
+}
+
#ifdef __cplusplus
}
#endif