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