blob: cd4502005f0824ffaa723ff580ebcf4be283eab1 [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 */
Dave Rodgman0a05e702023-04-13 13:01:34 +010022 if (MBEDTLS_IS_BIG_ENDIAN && olen < 8) {
23 int offset = 8 - olen;
24 for (int i = olen - 1; i >= 0; i--) {
25 raw[i + offset] = raw[i];
26 }
27 for (int i = 0; i < offset; i++) {
28 raw[i] = 0;
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010029 }
30 }
31
Dave Rodgman481a5e42022-12-01 13:31:20 +000032 *result = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010033 for (size_t i = 0; i < olen; i++) {
34 if (MBEDTLS_IS_BIG_ENDIAN) {
35 *result |= ((uint64_t) raw[i]) << (i * 8);
36 } else {
37 *result |= ((uint64_t) raw[i]) << ((olen - i - 1) * 8);
Dave Rodgman481a5e42022-12-01 13:31:20 +000038 }
39 }
40 return 1;
41}
42
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000043/* END_HEADER */
44
45/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010046void mbedtls_unaligned_access(int size, int offset)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000047{
48 /* Define 64-bit aligned raw byte array */
49 uint64_t raw[2];
50
51 /* Populate with known data */
52 uint8_t *x = (uint8_t *) raw;
Gilles Peskine449bd832023-01-11 14:50:10 +010053 for (size_t i = 0; i < sizeof(raw); i++) {
54 x[i] = (uint8_t) i;
55 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000056
Gilles Peskine449bd832023-01-11 14:50:10 +010057 TEST_ASSERT(size == 16 || size == 32 || size == 64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000058
59 uint64_t r = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010060 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000061 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +010062 r = mbedtls_get_unaligned_uint16(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000063 break;
64 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +010065 r = mbedtls_get_unaligned_uint32(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000066 break;
67 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +010068 r = mbedtls_get_unaligned_uint64(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000069 break;
70 }
71
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010072 /* Define expected result by manually aligning the raw bytes, and
73 * reading back with a normal pointer access. */
Dave Rodgman0a05e702023-04-13 13:01:34 +010074 uint64_t raw_aligned;
75 memcpy(&raw_aligned, ((uint8_t*)&raw) + offset, size / 8);
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010076 /* Make a 16/32/64 byte read from the aligned location, and copy to expected */
77 uint64_t expected = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010078 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000079 case 16:
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010080 uint16_t *e16 = (uint16_t *) &raw_aligned;
81 expected = *e16;
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000082 break;
83 case 32:
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010084 uint32_t *e32 = (uint32_t *) &raw_aligned;
85 expected = *e32;
86 break;
87 case 64:
88 expected = raw_aligned;
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000089 break;
90 }
91
Gilles Peskine449bd832023-01-11 14:50:10 +010092 TEST_EQUAL(r, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000093
Dave Rodgman0a05e702023-04-13 13:01:34 +010094 /* Write sentinel to the part of the array we will test writing to */
Gilles Peskine449bd832023-01-11 14:50:10 +010095 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000096 x[i + offset] = 0xff;
97 }
98 /*
Gilles Peskine449bd832023-01-11 14:50:10 +010099 * Write back to the array with mbedtls_put_unaligned_uint16 and validate
100 * that the array is unchanged as a result.
101 */
102 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000103 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100104 mbedtls_put_unaligned_uint16(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000105 break;
106 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100107 mbedtls_put_unaligned_uint32(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000108 break;
109 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100110 mbedtls_put_unaligned_uint64(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000111 break;
112 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100113 for (size_t i = 0; i < sizeof(x); i++) {
114 TEST_EQUAL(x[i], (uint8_t) i);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000115 }
116}
117/* END_CASE */
118
119/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100120void mbedtls_byteswap(char *input_str, int size, char *expected_str)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000121{
Dave Rodgman481a5e42022-12-01 13:31:20 +0000122 uint64_t input, expected;
Gilles Peskine449bd832023-01-11 14:50:10 +0100123 TEST_ASSERT(parse_hex_string(input_str, &input));
124 TEST_ASSERT(parse_hex_string(expected_str, &expected));
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000125
Dave Rodgman481a5e42022-12-01 13:31:20 +0000126 /* Check against expected result */
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000127 uint64_t r = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100128 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000129 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100130 r = MBEDTLS_BSWAP16(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000131 break;
132 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100133 r = MBEDTLS_BSWAP32(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000134 break;
135 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100136 r = MBEDTLS_BSWAP64(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000137 break;
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000138 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100139 TEST_ASSERT(!"size must be 16, 32 or 64");
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000140 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100141 TEST_EQUAL(r, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000142
143 /*
144 * Check byte by byte by extracting bytes from opposite ends of
145 * input and r.
146 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100147 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000148 size_t s1 = i * 8;
Gilles Peskine449bd832023-01-11 14:50:10 +0100149 size_t s2 = ((size / 8 - 1) - i) * 8;
150 uint64_t a = (input & ((uint64_t) 0xff << s1)) >> s1;
151 uint64_t b = (r & ((uint64_t) 0xff << s2)) >> s2;
152 TEST_EQUAL(a, b);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000153 }
154
155 /* Check BSWAP(BSWAP(x)) == x */
Gilles Peskine449bd832023-01-11 14:50:10 +0100156 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000157 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100158 r = MBEDTLS_BSWAP16(r);
159 TEST_EQUAL(r, input & 0xffff);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000160 break;
161 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100162 r = MBEDTLS_BSWAP32(r);
163 TEST_EQUAL(r, input & 0xffffffff);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000164 break;
165 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100166 r = MBEDTLS_BSWAP64(r);
167 TEST_EQUAL(r, input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000168 break;
169 }
170}
171/* END_CASE */
172
173/* BEGIN_CASE */
174void get_byte()
175{
176 uint8_t data[16];
177
Gilles Peskine449bd832023-01-11 14:50:10 +0100178 for (size_t i = 0; i < sizeof(data); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000179 data[i] = (uint8_t) i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100180 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000181
182 uint64_t u64 = 0x0706050403020100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100183 for (size_t b = 0; b < 8; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000184 uint8_t expected = b;
185 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100186 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000187 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100188 actual = MBEDTLS_BYTE_0(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000189 break;
190 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100191 actual = MBEDTLS_BYTE_1(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000192 break;
193 case 2:
Gilles Peskine449bd832023-01-11 14:50:10 +0100194 actual = MBEDTLS_BYTE_2(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000195 break;
196 case 3:
Gilles Peskine449bd832023-01-11 14:50:10 +0100197 actual = MBEDTLS_BYTE_3(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000198 break;
199 case 4:
Gilles Peskine449bd832023-01-11 14:50:10 +0100200 actual = MBEDTLS_BYTE_4(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000201 break;
202 case 5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100203 actual = MBEDTLS_BYTE_5(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000204 break;
205 case 6:
Gilles Peskine449bd832023-01-11 14:50:10 +0100206 actual = MBEDTLS_BYTE_6(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000207 break;
208 case 7:
Gilles Peskine449bd832023-01-11 14:50:10 +0100209 actual = MBEDTLS_BYTE_7(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000210 break;
211 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100212 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000213 }
214
215 uint32_t u32 = 0x03020100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100216 for (size_t b = 0; b < 4; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000217 uint8_t expected = b;
218 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100219 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000220 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100221 actual = MBEDTLS_BYTE_0(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000222 break;
223 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100224 actual = MBEDTLS_BYTE_1(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000225 break;
226 case 2:
Gilles Peskine449bd832023-01-11 14:50:10 +0100227 actual = MBEDTLS_BYTE_2(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000228 break;
229 case 3:
Gilles Peskine449bd832023-01-11 14:50:10 +0100230 actual = MBEDTLS_BYTE_3(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000231 break;
232 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100233 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000234 }
235
236 uint16_t u16 = 0x0100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100237 for (size_t b = 0; b < 2; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000238 uint8_t expected = b;
239 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100240 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000241 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100242 actual = MBEDTLS_BYTE_0(u16);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000243 break;
244 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100245 actual = MBEDTLS_BYTE_1(u16);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000246 break;
247 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100248 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000249 }
250
251 uint8_t u8 = 0x01;
Gilles Peskine449bd832023-01-11 14:50:10 +0100252 uint8_t actual = MBEDTLS_BYTE_0(u8);
253 TEST_EQUAL(actual, u8);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000254}
255/* END_CASE */
256
257/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100258void unaligned_access_endian_aware(int size, int offset, int big_endian)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000259{
Gilles Peskine449bd832023-01-11 14:50:10 +0100260 TEST_ASSERT(size == 16 || size == 24 || size == 32 || size == 64);
261 TEST_ASSERT(offset >= 0 && offset < 8);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000262
263 /* Define 64-bit aligned raw byte array */
264 uint64_t raw[2];
265 /* Populate with known data: x == { 0, 1, 2, ... } */
266 uint8_t *x = (uint8_t *) raw;
Gilles Peskine449bd832023-01-11 14:50:10 +0100267 for (size_t i = 0; i < sizeof(raw); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000268 x[i] = (uint8_t) i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100269 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000270
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000271 uint64_t read = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100272 if (big_endian) {
273 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000274 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100275 read = MBEDTLS_GET_UINT16_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000276 break;
277 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100278 read = MBEDTLS_GET_UINT24_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000279 break;
280 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100281 read = MBEDTLS_GET_UINT32_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000282 break;
283 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100284 read = MBEDTLS_GET_UINT64_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000285 break;
286 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100287 } else {
288 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000289 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100290 read = MBEDTLS_GET_UINT16_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000291 break;
292 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100293 read = MBEDTLS_GET_UINT24_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000294 break;
295 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100296 read = MBEDTLS_GET_UINT32_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000297 break;
298 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100299 read = MBEDTLS_GET_UINT64_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000300 break;
301 }
302 }
303
304 /* Build up expected value byte by byte, in either big or little endian format */
305 uint64_t expected = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100306 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000307 uint64_t b = x[i + offset];
308 uint8_t shift = (big_endian) ? (8 * ((size / 8 - 1) - i)) : (8 * i);
309 expected |= b << shift;
310 }
311
312 /* Verify read */
Gilles Peskine449bd832023-01-11 14:50:10 +0100313 TEST_EQUAL(read, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000314
Dave Rodgman0a05e702023-04-13 13:01:34 +0100315 /* Test writing back to memory. First write sentinel */
Gilles Peskine449bd832023-01-11 14:50:10 +0100316 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000317 x[i + offset] = 0xff;
318 }
319 /* Overwrite sentinel with endian-aware write macro */
Gilles Peskine449bd832023-01-11 14:50:10 +0100320 if (big_endian) {
321 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000322 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100323 MBEDTLS_PUT_UINT16_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000324 break;
325 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100326 MBEDTLS_PUT_UINT24_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000327 break;
328 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100329 MBEDTLS_PUT_UINT32_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000330 break;
331 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100332 MBEDTLS_PUT_UINT64_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000333 break;
334 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100335 } else {
336 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000337 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100338 MBEDTLS_PUT_UINT16_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000339 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100340 case 24:
341 MBEDTLS_PUT_UINT24_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000342 break;
343 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100344 MBEDTLS_PUT_UINT32_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000345 break;
346 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100347 MBEDTLS_PUT_UINT64_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000348 break;
349 }
350 }
351
352 /* Verify write - check memory is correct */
Gilles Peskine449bd832023-01-11 14:50:10 +0100353 for (size_t i = 0; i < sizeof(raw); i++) {
354 TEST_EQUAL(x[i], (uint8_t) i);
355 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000356}
357/* END_CASE */
358
359/* BEGIN_CASE */
360void mbedtls_is_big_endian()
361{
362 uint16_t check = 0x1234;
Gilles Peskine449bd832023-01-11 14:50:10 +0100363 uint8_t *p = (uint8_t *) &check;
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000364
Gilles Peskine449bd832023-01-11 14:50:10 +0100365 if (MBEDTLS_IS_BIG_ENDIAN) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000366 /* Big-endian: data stored MSB first, i.e. p == { 0x12, 0x34 } */
Gilles Peskine449bd832023-01-11 14:50:10 +0100367 TEST_EQUAL(p[0], 0x12);
368 TEST_EQUAL(p[1], 0x34);
369 } else {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000370 /* Little-endian: data stored LSB first, i.e. p == { 0x34, 0x12 } */
Gilles Peskine449bd832023-01-11 14:50:10 +0100371 TEST_EQUAL(p[0], 0x34);
372 TEST_EQUAL(p[1], 0x12);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000373 }
374}
375/* END_CASE */