blob: 167962fb4aa482b5ff16f2637d8c0fb539e38424 [file] [log] [blame]
Gilles Peskine3ffd6bc2022-11-29 15:44:21 +01001/* BEGIN_HEADER */
2/** \file test_suite_constant_time.function
3 *
4 * Functional testing of functions in the constant_time module.
5 *
6 * The tests are instrumented with #TEST_CF_SECRET and #TEST_CF_PUBLIC
7 * (see tests/include/test/constant_flow.h) so that running the tests
8 * under MSan or Valgrind will detect a non-constant-time implementation.
9 */
10
11#include <mbedtls/constant_time.h>
12#include <constant_time_internal.h>
13#include <constant_time_invasive.h>
14
15#include <test/constant_flow.h>
16/* END_HEADER */
17
Dave Rodgman39188c02022-12-23 12:27:04 +000018/* BEGIN_CASE */
19void mbedtls_ct_memcmp_null()
20{
21 uint32_t x;
22 TEST_ASSERT(mbedtls_ct_memcmp(&x, NULL, 0) == 0);
23 TEST_ASSERT(mbedtls_ct_memcmp(NULL, &x, 0) == 0);
24 TEST_ASSERT(mbedtls_ct_memcmp(NULL, NULL, 0) == 0);
25}
26/* END_CASE */
27
28/* BEGIN_CASE */
29void mbedtls_ct_memcmp(int same, int size, int offset)
30{
31 uint8_t *a = NULL, *b = NULL;
32 ASSERT_ALLOC(a, size + offset);
33 ASSERT_ALLOC(b, size + offset);
34
35 TEST_CF_SECRET(a + offset, size);
36 TEST_CF_SECRET(b + offset, size);
37
Dave Rodgman22b0d1a2023-01-21 10:29:00 +000038 /* Construct data that matches, if same == -1, otherwise
39 * same gives the number of bytes (after the initial offset)
40 * that will match; after that it will differ.
41 */
Dave Rodgman39188c02022-12-23 12:27:04 +000042 for (int i = 0; i < size + offset; i++) {
43 a[i] = i & 0xff;
Dave Rodgman22b0d1a2023-01-21 10:29:00 +000044 if (same == -1 || (i - offset) < same) {
45 b[i] = a[i];
46 } else {
47 b[i] = (i + 1) & 0xff;
48 }
Dave Rodgman39188c02022-12-23 12:27:04 +000049 }
50
51 int reference = memcmp(a + offset, b + offset, size);
52 int actual = mbedtls_ct_memcmp(a + offset, b + offset, size);
53 TEST_CF_PUBLIC(a + offset, size);
54 TEST_CF_PUBLIC(b + offset, size);
55
Dave Rodgman22b0d1a2023-01-21 10:29:00 +000056 if (same == -1 || same >= size) {
Dave Rodgman39188c02022-12-23 12:27:04 +000057 TEST_ASSERT(reference == 0);
58 TEST_ASSERT(actual == 0);
59 } else {
60 TEST_ASSERT(reference != 0);
61 TEST_ASSERT(actual != 0);
62 }
63exit:
64 mbedtls_free(a);
65 mbedtls_free(b);
66}
67/* END_CASE */
68
69/* BEGIN_CASE depends_on:MBEDTLS_SSL_SOME_SUITES_USE_MAC */
70void mbedtls_ct_memcpy_if_eq(int eq, int size, int offset)
71{
72 uint8_t *src = NULL, *result = NULL, *expected = NULL;
73 ASSERT_ALLOC(src, size + offset);
74 ASSERT_ALLOC(result, size + offset);
75 ASSERT_ALLOC(expected, size + offset);
76
77 for (int i = 0; i < size + offset; i++) {
78 src[i] = 1;
79 result[i] = 0xff;
80 expected[i] = eq ? 1 : 0xff;
81 }
82
83 mbedtls_ct_memcpy_if_eq(result + offset, src, size, eq, 1);
84 ASSERT_COMPARE(expected, size, result + offset, size);
85
86 for (int i = 0; i < size + offset; i++) {
87 src[i] = 1;
88 result[i] = 0xff;
89 expected[i] = eq ? 1 : 0xff;
90 }
91 mbedtls_ct_memcpy_if_eq(result, src + offset, size, eq, 1);
92 ASSERT_COMPARE(expected, size, result, size);
93
94exit:
95 mbedtls_free(src);
96 mbedtls_free(result);
97 mbedtls_free(expected);
98}
99/* END_CASE */
100
Gilles Peskine3ffd6bc2022-11-29 15:44:21 +0100101/* BEGIN_CASE depends_on:MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC:MBEDTLS_TEST_HOOKS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100102void ssl_cf_memcpy_offset(int offset_min, int offset_max, int len)
Gilles Peskine3ffd6bc2022-11-29 15:44:21 +0100103{
104 unsigned char *dst = NULL;
105 unsigned char *src = NULL;
106 size_t src_len = offset_max + len;
107 size_t secret;
108
Gilles Peskine449bd832023-01-11 14:50:10 +0100109 ASSERT_ALLOC(dst, len);
110 ASSERT_ALLOC(src, src_len);
Gilles Peskine3ffd6bc2022-11-29 15:44:21 +0100111
112 /* Fill src in a way that we can detect if we copied the right bytes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100113 mbedtls_test_rnd_std_rand(NULL, src, src_len);
Gilles Peskine3ffd6bc2022-11-29 15:44:21 +0100114
Gilles Peskine449bd832023-01-11 14:50:10 +0100115 for (secret = offset_min; secret <= (size_t) offset_max; secret++) {
116 mbedtls_test_set_step((int) secret);
Gilles Peskine3ffd6bc2022-11-29 15:44:21 +0100117
Gilles Peskine449bd832023-01-11 14:50:10 +0100118 TEST_CF_SECRET(&secret, sizeof(secret));
119 mbedtls_ct_memcpy_offset(dst, src, secret,
120 offset_min, offset_max, len);
121 TEST_CF_PUBLIC(&secret, sizeof(secret));
122 TEST_CF_PUBLIC(dst, len);
Gilles Peskine3ffd6bc2022-11-29 15:44:21 +0100123
Gilles Peskine449bd832023-01-11 14:50:10 +0100124 ASSERT_COMPARE(dst, len, src + secret, len);
Gilles Peskine3ffd6bc2022-11-29 15:44:21 +0100125 }
126
127exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100128 mbedtls_free(dst);
129 mbedtls_free(src);
Gilles Peskine3ffd6bc2022-11-29 15:44:21 +0100130}
131/* END_CASE */