constant_time_test.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. /*
  2. * Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
  3. *
  4. * Licensed under the OpenSSL license (the "License"). You may not use
  5. * this file except in compliance with the License. You can obtain a copy
  6. * in the file LICENSE in the source distribution or at
  7. * https://www.openssl.org/source/license.html
  8. */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include "e_os.h"
  12. #include "internal/constant_time_locl.h"
  13. #include "testutil.h"
  14. #include "internal/numbers.h"
  15. static const unsigned int CONSTTIME_TRUE = (unsigned)(~0);
  16. static const unsigned int CONSTTIME_FALSE = 0;
  17. static const unsigned char CONSTTIME_TRUE_8 = 0xff;
  18. static const unsigned char CONSTTIME_FALSE_8 = 0;
  19. static const size_t CONSTTIME_TRUE_S = ~((size_t)0);
  20. static const size_t CONSTTIME_FALSE_S = 0;
  21. static int test_binary_op(unsigned int (*op) (unsigned int a, unsigned int b),
  22. const char *op_name, unsigned int a, unsigned int b,
  23. int is_true)
  24. {
  25. if (is_true && !TEST_uint_eq(op(a, b), CONSTTIME_TRUE))
  26. return 0;
  27. if (!is_true && !TEST_uint_eq(op(a, b), CONSTTIME_FALSE))
  28. return 0;
  29. return 1;
  30. }
  31. static int test_binary_op_8(unsigned
  32. char (*op) (unsigned int a, unsigned int b),
  33. const char *op_name, unsigned int a,
  34. unsigned int b, int is_true)
  35. {
  36. if (is_true && !TEST_uint_eq(op(a, b), CONSTTIME_TRUE_8))
  37. return 0;
  38. if (!is_true && !TEST_uint_eq(op(a, b), CONSTTIME_FALSE_8))
  39. return 0;
  40. return 1;
  41. }
  42. static int test_binary_op_s(size_t (*op) (size_t a, size_t b),
  43. const char *op_name, size_t a, size_t b,
  44. int is_true)
  45. {
  46. if (is_true && !TEST_size_t_eq(op(a,b), CONSTTIME_TRUE_S))
  47. return 0;
  48. if (!is_true && !TEST_uint_eq(op(a,b), CONSTTIME_FALSE_S))
  49. return 0;
  50. return 1;
  51. }
  52. static int test_is_zero(unsigned int a)
  53. {
  54. if (a == 0 && !TEST_uint_eq(constant_time_is_zero(a), CONSTTIME_TRUE))
  55. return 0;
  56. if (a != 0 && !TEST_uint_eq(constant_time_is_zero(a), CONSTTIME_FALSE))
  57. return 0;
  58. return 1;
  59. }
  60. static int test_is_zero_8(unsigned int a)
  61. {
  62. if (a == 0 && !TEST_uint_eq(constant_time_is_zero_8(a), CONSTTIME_TRUE_8))
  63. return 0;
  64. if (a != 0 && !TEST_uint_eq(constant_time_is_zero_8(a), CONSTTIME_FALSE_8))
  65. return 0;
  66. return 1;
  67. }
  68. static int test_is_zero_s(unsigned int a)
  69. {
  70. if (a == 0 && !TEST_size_t_eq(constant_time_is_zero_s(a), CONSTTIME_TRUE_S))
  71. return 0;
  72. if (a != 0 && !TEST_uint_eq(constant_time_is_zero_s(a), CONSTTIME_FALSE_S))
  73. return 0;
  74. return 1;
  75. }
  76. static int test_select(unsigned int a, unsigned int b)
  77. {
  78. if (!TEST_uint_eq(constant_time_select(CONSTTIME_TRUE, a, b), a))
  79. return 0;
  80. if (!TEST_uint_eq(constant_time_select(CONSTTIME_FALSE, a, b), b))
  81. return 0;
  82. return 1;
  83. }
  84. static int test_select_8(unsigned char a, unsigned char b)
  85. {
  86. if (!TEST_uint_eq(constant_time_select_8(CONSTTIME_TRUE_8, a, b), a))
  87. return 0;
  88. if (!TEST_uint_eq(constant_time_select_8(CONSTTIME_FALSE_8, a, b), b))
  89. return 0;
  90. return 1;
  91. }
  92. static int test_select_s(unsigned char a, unsigned char b)
  93. {
  94. if (!TEST_uint_eq(constant_time_select_s(CONSTTIME_TRUE_S, a, b), a))
  95. return 0;
  96. if (!TEST_uint_eq(constant_time_select_s(CONSTTIME_FALSE_S, a, b), b))
  97. return 0;
  98. return 1;
  99. }
  100. static int test_select_int(int a, int b)
  101. {
  102. if (!TEST_int_eq(constant_time_select_int(CONSTTIME_TRUE, a, b), a))
  103. return 0;
  104. if (!TEST_int_eq(constant_time_select_int(CONSTTIME_FALSE, a, b), b))
  105. return 0;
  106. return 1;
  107. }
  108. static int test_eq_int_8(int a, int b)
  109. {
  110. if (a == b && !TEST_int_eq(constant_time_eq_int_8(a, b), CONSTTIME_TRUE_8))
  111. return 0;
  112. if (a != b && !TEST_int_eq(constant_time_eq_int_8(a, b), CONSTTIME_FALSE_8))
  113. return 0;
  114. return 1;
  115. }
  116. static int test_eq_s(size_t a, size_t b)
  117. {
  118. if (a == b && !TEST_size_t_eq(constant_time_eq_s(a, b), CONSTTIME_TRUE_S))
  119. return 0;
  120. if (a != b && !TEST_int_eq(constant_time_eq_s(a, b), CONSTTIME_FALSE_S))
  121. return 0;
  122. return 1;
  123. }
  124. static int test_eq_int(int a, int b)
  125. {
  126. if (a == b && !TEST_uint_eq(constant_time_eq_int(a, b), CONSTTIME_TRUE))
  127. return 0;
  128. if (a != b && !TEST_uint_eq(constant_time_eq_int(a, b), CONSTTIME_FALSE))
  129. return 0;
  130. return 1;
  131. }
  132. static unsigned int test_values[] =
  133. { 0, 1, 1024, 12345, 32000, UINT_MAX / 2 - 1,
  134. UINT_MAX / 2, UINT_MAX / 2 + 1, UINT_MAX - 1,
  135. UINT_MAX
  136. };
  137. static unsigned char test_values_8[] =
  138. { 0, 1, 2, 20, 32, 127, 128, 129, 255 };
  139. static int signed_test_values[] = { 0, 1, -1, 1024, -1024, 12345, -12345,
  140. 32000, -32000, INT_MAX, INT_MIN, INT_MAX - 1,
  141. INT_MIN + 1
  142. };
  143. static size_t test_values_s[] =
  144. { 0, 1, 1024, 12345, 32000, SIZE_MAX / 2 - 1,
  145. SIZE_MAX / 2, SIZE_MAX / 2 + 1, SIZE_MAX - 1,
  146. SIZE_MAX
  147. };
  148. static int test_sizeofs(void)
  149. {
  150. if (!TEST_uint_eq(OSSL_NELEM(test_values), OSSL_NELEM(test_values_s)))
  151. return 0;
  152. return 1;
  153. }
  154. static int test_binops(int i)
  155. {
  156. unsigned int a = test_values[i];
  157. unsigned int g = test_values_s[i];
  158. int j;
  159. int ret = 1;
  160. if (!test_is_zero(a) || !test_is_zero_8(a) || !test_is_zero_s(g))
  161. ret = 0;
  162. for (j = 0; j < (int)OSSL_NELEM(test_values); ++j) {
  163. unsigned int b = test_values[j];
  164. unsigned int h = test_values[j];
  165. if (!test_select(a, b)
  166. || !test_select_s(g, h)
  167. || !test_eq_s(g, h)
  168. || !test_binary_op(&constant_time_lt, "ct_lt",
  169. a, b, a < b)
  170. || !test_binary_op_8(&constant_time_lt_8, "constant_time_lt_8",
  171. a, b, a < b)
  172. || !test_binary_op_s(&constant_time_lt_s, "constant_time_lt_s",
  173. g, h, g < h)
  174. || !test_binary_op(&constant_time_lt, "constant_time_lt",
  175. b, a, b < a)
  176. || !test_binary_op_8(&constant_time_lt_8, "constant_time_lt_8",
  177. b, a, b < a)
  178. || !test_binary_op_s(&constant_time_lt_s, "constant_time_lt_s",
  179. h, g, h < g)
  180. || !test_binary_op(&constant_time_ge, "constant_time_ge",
  181. a, b, a >= b)
  182. || !test_binary_op_8(&constant_time_ge_8, "constant_time_ge_8",
  183. a, b, a >= b)
  184. || !test_binary_op_s(&constant_time_ge_s, "constant_time_ge_s",
  185. g, h, g >= h)
  186. || !test_binary_op(&constant_time_ge, "constant_time_ge",
  187. b, a, b >= a)
  188. || !test_binary_op_8(&constant_time_ge_8, "constant_time_ge_8",
  189. b, a, b >= a)
  190. || !test_binary_op_s(&constant_time_ge_s, "constant_time_ge_s",
  191. h, g, h >= g)
  192. || !test_binary_op(&constant_time_eq, "constant_time_eq",
  193. a, b, a == b)
  194. || !test_binary_op_8(&constant_time_eq_8, "constant_time_eq_8",
  195. a, b, a == b)
  196. || !test_binary_op_s(&constant_time_eq_s, "constant_time_eq_s",
  197. g, h, g == h)
  198. || !test_binary_op(&constant_time_eq, "constant_time_eq",
  199. b, a, b == a)
  200. || !test_binary_op_8(&constant_time_eq_8, "constant_time_eq_8",
  201. b, a, b == a)
  202. || !test_binary_op_s(&constant_time_eq_s, "constant_time_eq_s",
  203. h, g, h == g)) {
  204. ret = 0;
  205. }
  206. }
  207. return ret;
  208. }
  209. static int test_signed(int i)
  210. {
  211. int c = signed_test_values[i];
  212. unsigned int j;
  213. int ret = 1;
  214. for (j = 0; j < OSSL_NELEM(signed_test_values); ++j) {
  215. int d = signed_test_values[j];
  216. if (!test_select_int(c, d)
  217. || !test_eq_int(c, d)
  218. || !test_eq_int_8(c, d))
  219. ret = 0;
  220. }
  221. return ret;
  222. }
  223. static int test_8values(int i)
  224. {
  225. unsigned char e = test_values_8[i];
  226. unsigned int j;
  227. int ret = 1;
  228. for (j = 0; j < sizeof(test_values_8); ++j) {
  229. unsigned char f = test_values_8[j];
  230. if (!test_select_8(e, f))
  231. ret = 0;
  232. }
  233. return ret;
  234. }
  235. void register_tests(void)
  236. {
  237. ADD_TEST(test_sizeofs);
  238. ADD_ALL_TESTS(test_binops, OSSL_NELEM(test_values));
  239. ADD_ALL_TESTS(test_signed, OSSL_NELEM(signed_test_values));
  240. ADD_ALL_TESTS(test_8values, sizeof(test_values_8));
  241. }