blob: 45080cc7b6a713d6ed60a3b24f96cef7e5a2d3b5 [file] [log] [blame]
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +00001/* BEGIN_HEADER */
2#include "../library/alignment.h"
3
4#include <stdint.h>
Dave Rodgman63e6a882022-12-01 10:01:08 +00005
Dave Rodgman9dc55ba2022-12-01 10:49:53 +00006#if defined(__clang__)
Dave Rodgman63e6a882022-12-01 10:01:08 +00007#pragma clang diagnostic ignored "-Wunreachable-code"
Dave Rodgman9dc55ba2022-12-01 10:49:53 +00008#endif
Dave Rodgman481a5e42022-12-01 13:31:20 +00009
10/*
11 * Convert a string of the form "abcd" (case-insensitive) to a uint64_t.
12 */
Gilles Peskine449bd832023-01-11 14:50:10 +010013int parse_hex_string(char *hex_string, uint64_t *result)
Dave Rodgman481a5e42022-12-01 13:31:20 +000014{
15 uint8_t raw[8];
16 size_t olen;
Gilles Peskine449bd832023-01-11 14:50:10 +010017 if (mbedtls_test_unhexify(raw, sizeof(raw), hex_string, &olen) != 0) {
18 return 0;
19 }
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010020
21 /* If < 8 bytes, shift right and pad with leading zeros for big-endian */
22 if (MBEDTLS_IS_BIG_ENDIAN) {
23 if (olen < 8) {
24 int offset = 8 - olen;
25 for (int i = olen - 1; i >= 0; i--) {
26 raw[i + offset] = raw[i];
27 }
28 for (int i = 0; i < offset; i++) {
29 raw[i] = 0;
30 }
31 }
32 }
33
Dave Rodgman481a5e42022-12-01 13:31:20 +000034 *result = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010035 for (size_t i = 0; i < olen; i++) {
36 if (MBEDTLS_IS_BIG_ENDIAN) {
37 *result |= ((uint64_t) raw[i]) << (i * 8);
38 } else {
39 *result |= ((uint64_t) raw[i]) << ((olen - i - 1) * 8);
Dave Rodgman481a5e42022-12-01 13:31:20 +000040 }
41 }
42 return 1;
43}
44
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000045/* END_HEADER */
46
47/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010048void mbedtls_unaligned_access(int size, int offset)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000049{
50 /* Define 64-bit aligned raw byte array */
51 uint64_t raw[2];
52
53 /* Populate with known data */
54 uint8_t *x = (uint8_t *) raw;
Gilles Peskine449bd832023-01-11 14:50:10 +010055 for (size_t i = 0; i < sizeof(raw); i++) {
56 x[i] = (uint8_t) i;
57 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000058
Gilles Peskine449bd832023-01-11 14:50:10 +010059 TEST_ASSERT(size == 16 || size == 32 || size == 64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000060
61 uint64_t r = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010062 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000063 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +010064 r = mbedtls_get_unaligned_uint16(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000065 break;
66 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +010067 r = mbedtls_get_unaligned_uint32(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000068 break;
69 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +010070 r = mbedtls_get_unaligned_uint64(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000071 break;
72 }
73
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010074 /* Define expected result by manually aligning the raw bytes, and
75 * reading back with a normal pointer access. */
76 uint64_t raw_aligned = 0;
77 uint8_t *e8 = (uint8_t *) &raw_aligned;
78 uint8_t *r8 = ((uint8_t *) &raw) + offset;
79 /* Make aligned copy */
80 for (int i = 0; i < size / 8; i++) {
81 e8[i] = r8[i];
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000082 }
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010083 /* Make a 16/32/64 byte read from the aligned location, and copy to expected */
84 uint64_t expected = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010085 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000086 case 16:
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010087 uint16_t *e16 = (uint16_t *) &raw_aligned;
88 expected = *e16;
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000089 break;
90 case 32:
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010091 uint32_t *e32 = (uint32_t *) &raw_aligned;
92 expected = *e32;
93 break;
94 case 64:
95 expected = raw_aligned;
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000096 break;
97 }
98
Gilles Peskine449bd832023-01-11 14:50:10 +010099 TEST_EQUAL(r, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000100
101 /* Write sentinel to the part of the array we will testing writing to */
Gilles Peskine449bd832023-01-11 14:50:10 +0100102 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000103 x[i + offset] = 0xff;
104 }
105 /*
Gilles Peskine449bd832023-01-11 14:50:10 +0100106 * Write back to the array with mbedtls_put_unaligned_uint16 and validate
107 * that the array is unchanged as a result.
108 */
109 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000110 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100111 mbedtls_put_unaligned_uint16(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000112 break;
113 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100114 mbedtls_put_unaligned_uint32(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000115 break;
116 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100117 mbedtls_put_unaligned_uint64(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000118 break;
119 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100120 for (size_t i = 0; i < sizeof(x); i++) {
121 TEST_EQUAL(x[i], (uint8_t) i);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000122 }
123}
124/* END_CASE */
125
126/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100127void mbedtls_byteswap(char *input_str, int size, char *expected_str)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000128{
Dave Rodgman481a5e42022-12-01 13:31:20 +0000129 uint64_t input, expected;
Gilles Peskine449bd832023-01-11 14:50:10 +0100130 TEST_ASSERT(parse_hex_string(input_str, &input));
131 TEST_ASSERT(parse_hex_string(expected_str, &expected));
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000132
Dave Rodgman481a5e42022-12-01 13:31:20 +0000133 /* Check against expected result */
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000134 uint64_t r = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100135 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000136 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100137 r = MBEDTLS_BSWAP16(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000138 break;
139 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100140 r = MBEDTLS_BSWAP32(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000141 break;
142 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100143 r = MBEDTLS_BSWAP64(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000144 break;
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000145 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100146 TEST_ASSERT(!"size must be 16, 32 or 64");
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000147 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100148 TEST_EQUAL(r, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000149
150 /*
151 * Check byte by byte by extracting bytes from opposite ends of
152 * input and r.
153 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100154 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000155 size_t s1 = i * 8;
Gilles Peskine449bd832023-01-11 14:50:10 +0100156 size_t s2 = ((size / 8 - 1) - i) * 8;
157 uint64_t a = (input & ((uint64_t) 0xff << s1)) >> s1;
158 uint64_t b = (r & ((uint64_t) 0xff << s2)) >> s2;
159 TEST_EQUAL(a, b);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000160 }
161
162 /* Check BSWAP(BSWAP(x)) == x */
Gilles Peskine449bd832023-01-11 14:50:10 +0100163 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000164 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100165 r = MBEDTLS_BSWAP16(r);
166 TEST_EQUAL(r, input & 0xffff);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000167 break;
168 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100169 r = MBEDTLS_BSWAP32(r);
170 TEST_EQUAL(r, input & 0xffffffff);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000171 break;
172 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100173 r = MBEDTLS_BSWAP64(r);
174 TEST_EQUAL(r, input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000175 break;
176 }
177}
178/* END_CASE */
179
180/* BEGIN_CASE */
181void get_byte()
182{
183 uint8_t data[16];
184
Gilles Peskine449bd832023-01-11 14:50:10 +0100185 for (size_t i = 0; i < sizeof(data); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000186 data[i] = (uint8_t) i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100187 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000188
189 uint64_t u64 = 0x0706050403020100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100190 for (size_t b = 0; b < 8; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000191 uint8_t expected = b;
192 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100193 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000194 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100195 actual = MBEDTLS_BYTE_0(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000196 break;
197 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100198 actual = MBEDTLS_BYTE_1(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000199 break;
200 case 2:
Gilles Peskine449bd832023-01-11 14:50:10 +0100201 actual = MBEDTLS_BYTE_2(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000202 break;
203 case 3:
Gilles Peskine449bd832023-01-11 14:50:10 +0100204 actual = MBEDTLS_BYTE_3(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000205 break;
206 case 4:
Gilles Peskine449bd832023-01-11 14:50:10 +0100207 actual = MBEDTLS_BYTE_4(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000208 break;
209 case 5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100210 actual = MBEDTLS_BYTE_5(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000211 break;
212 case 6:
Gilles Peskine449bd832023-01-11 14:50:10 +0100213 actual = MBEDTLS_BYTE_6(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000214 break;
215 case 7:
Gilles Peskine449bd832023-01-11 14:50:10 +0100216 actual = MBEDTLS_BYTE_7(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000217 break;
218 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100219 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000220 }
221
222 uint32_t u32 = 0x03020100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100223 for (size_t b = 0; b < 4; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000224 uint8_t expected = b;
225 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100226 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000227 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100228 actual = MBEDTLS_BYTE_0(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000229 break;
230 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100231 actual = MBEDTLS_BYTE_1(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000232 break;
233 case 2:
Gilles Peskine449bd832023-01-11 14:50:10 +0100234 actual = MBEDTLS_BYTE_2(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000235 break;
236 case 3:
Gilles Peskine449bd832023-01-11 14:50:10 +0100237 actual = MBEDTLS_BYTE_3(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000238 break;
239 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100240 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000241 }
242
243 uint16_t u16 = 0x0100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100244 for (size_t b = 0; b < 2; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000245 uint8_t expected = b;
246 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100247 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000248 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100249 actual = MBEDTLS_BYTE_0(u16);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000250 break;
251 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100252 actual = MBEDTLS_BYTE_1(u16);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000253 break;
254 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100255 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000256 }
257
258 uint8_t u8 = 0x01;
Gilles Peskine449bd832023-01-11 14:50:10 +0100259 uint8_t actual = MBEDTLS_BYTE_0(u8);
260 TEST_EQUAL(actual, u8);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000261}
262/* END_CASE */
263
264/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100265void unaligned_access_endian_aware(int size, int offset, int big_endian)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000266{
Gilles Peskine449bd832023-01-11 14:50:10 +0100267 TEST_ASSERT(size == 16 || size == 24 || size == 32 || size == 64);
268 TEST_ASSERT(offset >= 0 && offset < 8);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000269
270 /* Define 64-bit aligned raw byte array */
271 uint64_t raw[2];
272 /* Populate with known data: x == { 0, 1, 2, ... } */
273 uint8_t *x = (uint8_t *) raw;
Gilles Peskine449bd832023-01-11 14:50:10 +0100274 for (size_t i = 0; i < sizeof(raw); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000275 x[i] = (uint8_t) i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100276 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000277
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000278 uint64_t read = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100279 if (big_endian) {
280 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000281 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100282 read = MBEDTLS_GET_UINT16_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000283 break;
284 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100285 read = MBEDTLS_GET_UINT24_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000286 break;
287 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100288 read = MBEDTLS_GET_UINT32_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000289 break;
290 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100291 read = MBEDTLS_GET_UINT64_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000292 break;
293 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100294 } else {
295 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000296 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100297 read = MBEDTLS_GET_UINT16_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000298 break;
299 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100300 read = MBEDTLS_GET_UINT24_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000301 break;
302 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100303 read = MBEDTLS_GET_UINT32_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000304 break;
305 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100306 read = MBEDTLS_GET_UINT64_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000307 break;
308 }
309 }
310
311 /* Build up expected value byte by byte, in either big or little endian format */
312 uint64_t expected = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100313 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000314 uint64_t b = x[i + offset];
315 uint8_t shift = (big_endian) ? (8 * ((size / 8 - 1) - i)) : (8 * i);
316 expected |= b << shift;
317 }
318
319 /* Verify read */
Gilles Peskine449bd832023-01-11 14:50:10 +0100320 TEST_EQUAL(read, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000321
322 /* Test writing back to memory. First write sentiel */
Gilles Peskine449bd832023-01-11 14:50:10 +0100323 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000324 x[i + offset] = 0xff;
325 }
326 /* Overwrite sentinel with endian-aware write macro */
Gilles Peskine449bd832023-01-11 14:50:10 +0100327 if (big_endian) {
328 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000329 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100330 MBEDTLS_PUT_UINT16_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000331 break;
332 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100333 MBEDTLS_PUT_UINT24_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000334 break;
335 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100336 MBEDTLS_PUT_UINT32_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000337 break;
338 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100339 MBEDTLS_PUT_UINT64_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000340 break;
341 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100342 } else {
343 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000344 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100345 MBEDTLS_PUT_UINT16_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000346 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100347 case 24:
348 MBEDTLS_PUT_UINT24_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000349 break;
350 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100351 MBEDTLS_PUT_UINT32_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000352 break;
353 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100354 MBEDTLS_PUT_UINT64_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000355 break;
356 }
357 }
358
359 /* Verify write - check memory is correct */
Gilles Peskine449bd832023-01-11 14:50:10 +0100360 for (size_t i = 0; i < sizeof(raw); i++) {
361 TEST_EQUAL(x[i], (uint8_t) i);
362 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000363}
364/* END_CASE */
365
366/* BEGIN_CASE */
367void mbedtls_is_big_endian()
368{
369 uint16_t check = 0x1234;
Gilles Peskine449bd832023-01-11 14:50:10 +0100370 uint8_t *p = (uint8_t *) &check;
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000371
Gilles Peskine449bd832023-01-11 14:50:10 +0100372 if (MBEDTLS_IS_BIG_ENDIAN) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000373 /* Big-endian: data stored MSB first, i.e. p == { 0x12, 0x34 } */
Gilles Peskine449bd832023-01-11 14:50:10 +0100374 TEST_EQUAL(p[0], 0x12);
375 TEST_EQUAL(p[1], 0x34);
376 } else {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000377 /* Little-endian: data stored LSB first, i.e. p == { 0x34, 0x12 } */
Gilles Peskine449bd832023-01-11 14:50:10 +0100378 TEST_EQUAL(p[0], 0x34);
379 TEST_EQUAL(p[1], 0x12);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000380 }
381}
382/* END_CASE */