blob: f6703318ce70b6eec517058c8a8697bff40ccc15 [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 Rodgman481a5e42022-12-01 13:31:20 +000020 *result = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010021 for (size_t i = 0; i < olen; i++) {
22 if (MBEDTLS_IS_BIG_ENDIAN) {
23 *result |= ((uint64_t) raw[i]) << (i * 8);
24 } else {
25 *result |= ((uint64_t) raw[i]) << ((olen - i - 1) * 8);
Dave Rodgman481a5e42022-12-01 13:31:20 +000026 }
27 }
28 return 1;
29}
30
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000031/* END_HEADER */
32
33/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010034void mbedtls_unaligned_access(int size, int offset)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000035{
36 /* Define 64-bit aligned raw byte array */
37 uint64_t raw[2];
38
39 /* Populate with known data */
40 uint8_t *x = (uint8_t *) raw;
Gilles Peskine449bd832023-01-11 14:50:10 +010041 for (size_t i = 0; i < sizeof(raw); i++) {
42 x[i] = (uint8_t) i;
43 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000044
Gilles Peskine449bd832023-01-11 14:50:10 +010045 TEST_ASSERT(size == 16 || size == 32 || size == 64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000046
47 uint64_t r = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010048 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000049 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +010050 r = mbedtls_get_unaligned_uint16(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000051 break;
52 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +010053 r = mbedtls_get_unaligned_uint32(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000054 break;
55 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +010056 r = mbedtls_get_unaligned_uint64(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000057 break;
58 }
59
60 /* Generate expected result */
61 uint64_t expected = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010062 for (uint8_t i = 0; i < 8; i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000063 uint8_t shift;
Gilles Peskine449bd832023-01-11 14:50:10 +010064 if (MBEDTLS_IS_BIG_ENDIAN) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000065 /*
Gilles Peskine449bd832023-01-11 14:50:10 +010066 * Similar to little-endian case described below, but the shift needs
67 * to be inverted
68 */
69 shift = 7 - (i * 8);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000070 } else {
71 /* example for offset == 1:
Gilles Peskine449bd832023-01-11 14:50:10 +010072 * expected = (( 1 + 0 ) << (0 * 8)) | (( 1 + 1 ) << (1 * 8)) | (( 1 + 2 ) << (2 * 8)))
73 * = (1 << 0) | (2 << 8) | (3 << 16) ...
74 * = 0x0807060504030201
75 * x = { 0, 1, 2, 3, ... }
76 * ie expected is the value that would be read from x on a LE system, when
77 * byte swapping is not performed
78 */
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000079 shift = i * 8;
80 }
81 uint64_t b = offset + i;
82 expected |= b << shift;
83 }
84
85 /* Mask out excess bits from expected result */
Gilles Peskine449bd832023-01-11 14:50:10 +010086 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000087 case 16:
88 expected &= 0xffff;
89 break;
90 case 32:
91 expected &= 0xffffffff;
92 break;
93 }
94
Gilles Peskine449bd832023-01-11 14:50:10 +010095 TEST_EQUAL(r, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000096
97 /* Write sentinel to the part of the array we will testing writing to */
Gilles Peskine449bd832023-01-11 14:50:10 +010098 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000099 x[i + offset] = 0xff;
100 }
101 /*
Gilles Peskine449bd832023-01-11 14:50:10 +0100102 * Write back to the array with mbedtls_put_unaligned_uint16 and validate
103 * that the array is unchanged as a result.
104 */
105 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000106 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100107 mbedtls_put_unaligned_uint16(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000108 break;
109 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100110 mbedtls_put_unaligned_uint32(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000111 break;
112 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100113 mbedtls_put_unaligned_uint64(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000114 break;
115 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100116 for (size_t i = 0; i < sizeof(x); i++) {
117 TEST_EQUAL(x[i], (uint8_t) i);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000118 }
119}
120/* END_CASE */
121
122/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100123void mbedtls_byteswap(char *input_str, int size, char *expected_str)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000124{
Dave Rodgman481a5e42022-12-01 13:31:20 +0000125 uint64_t input, expected;
Gilles Peskine449bd832023-01-11 14:50:10 +0100126 TEST_ASSERT(parse_hex_string(input_str, &input));
127 TEST_ASSERT(parse_hex_string(expected_str, &expected));
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000128
Dave Rodgman481a5e42022-12-01 13:31:20 +0000129 /* Check against expected result */
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000130 uint64_t r = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100131 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000132 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100133 r = MBEDTLS_BSWAP16(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000134 break;
135 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100136 r = MBEDTLS_BSWAP32(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000137 break;
138 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100139 r = MBEDTLS_BSWAP64(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000140 break;
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000141 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100142 TEST_ASSERT(!"size must be 16, 32 or 64");
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000143 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100144 TEST_EQUAL(r, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000145
146 /*
147 * Check byte by byte by extracting bytes from opposite ends of
148 * input and r.
149 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100150 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000151 size_t s1 = i * 8;
Gilles Peskine449bd832023-01-11 14:50:10 +0100152 size_t s2 = ((size / 8 - 1) - i) * 8;
153 uint64_t a = (input & ((uint64_t) 0xff << s1)) >> s1;
154 uint64_t b = (r & ((uint64_t) 0xff << s2)) >> s2;
155 TEST_EQUAL(a, b);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000156 }
157
158 /* Check BSWAP(BSWAP(x)) == x */
Gilles Peskine449bd832023-01-11 14:50:10 +0100159 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000160 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100161 r = MBEDTLS_BSWAP16(r);
162 TEST_EQUAL(r, input & 0xffff);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000163 break;
164 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100165 r = MBEDTLS_BSWAP32(r);
166 TEST_EQUAL(r, input & 0xffffffff);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000167 break;
168 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100169 r = MBEDTLS_BSWAP64(r);
170 TEST_EQUAL(r, input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000171 break;
172 }
173}
174/* END_CASE */
175
176/* BEGIN_CASE */
177void get_byte()
178{
179 uint8_t data[16];
180
Gilles Peskine449bd832023-01-11 14:50:10 +0100181 for (size_t i = 0; i < sizeof(data); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000182 data[i] = (uint8_t) i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100183 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000184
185 uint64_t u64 = 0x0706050403020100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100186 for (size_t b = 0; b < 8; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000187 uint8_t expected = b;
188 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100189 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000190 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100191 actual = MBEDTLS_BYTE_0(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000192 break;
193 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100194 actual = MBEDTLS_BYTE_1(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000195 break;
196 case 2:
Gilles Peskine449bd832023-01-11 14:50:10 +0100197 actual = MBEDTLS_BYTE_2(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000198 break;
199 case 3:
Gilles Peskine449bd832023-01-11 14:50:10 +0100200 actual = MBEDTLS_BYTE_3(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000201 break;
202 case 4:
Gilles Peskine449bd832023-01-11 14:50:10 +0100203 actual = MBEDTLS_BYTE_4(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000204 break;
205 case 5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100206 actual = MBEDTLS_BYTE_5(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000207 break;
208 case 6:
Gilles Peskine449bd832023-01-11 14:50:10 +0100209 actual = MBEDTLS_BYTE_6(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000210 break;
211 case 7:
Gilles Peskine449bd832023-01-11 14:50:10 +0100212 actual = MBEDTLS_BYTE_7(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000213 break;
214 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100215 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000216 }
217
218 uint32_t u32 = 0x03020100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100219 for (size_t b = 0; b < 4; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000220 uint8_t expected = b;
221 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100222 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000223 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100224 actual = MBEDTLS_BYTE_0(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000225 break;
226 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100227 actual = MBEDTLS_BYTE_1(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000228 break;
229 case 2:
Gilles Peskine449bd832023-01-11 14:50:10 +0100230 actual = MBEDTLS_BYTE_2(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000231 break;
232 case 3:
Gilles Peskine449bd832023-01-11 14:50:10 +0100233 actual = MBEDTLS_BYTE_3(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000234 break;
235 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100236 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000237 }
238
239 uint16_t u16 = 0x0100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100240 for (size_t b = 0; b < 2; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000241 uint8_t expected = b;
242 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100243 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000244 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100245 actual = MBEDTLS_BYTE_0(u16);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000246 break;
247 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100248 actual = MBEDTLS_BYTE_1(u16);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000249 break;
250 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100251 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000252 }
253
254 uint8_t u8 = 0x01;
Gilles Peskine449bd832023-01-11 14:50:10 +0100255 uint8_t actual = MBEDTLS_BYTE_0(u8);
256 TEST_EQUAL(actual, u8);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000257}
258/* END_CASE */
259
260/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100261void unaligned_access_endian_aware(int size, int offset, int big_endian)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000262{
Gilles Peskine449bd832023-01-11 14:50:10 +0100263 TEST_ASSERT(size == 16 || size == 24 || size == 32 || size == 64);
264 TEST_ASSERT(offset >= 0 && offset < 8);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000265
266 /* Define 64-bit aligned raw byte array */
267 uint64_t raw[2];
268 /* Populate with known data: x == { 0, 1, 2, ... } */
269 uint8_t *x = (uint8_t *) raw;
Gilles Peskine449bd832023-01-11 14:50:10 +0100270 for (size_t i = 0; i < sizeof(raw); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000271 x[i] = (uint8_t) i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100272 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000273
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000274 uint64_t read = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100275 if (big_endian) {
276 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000277 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100278 read = MBEDTLS_GET_UINT16_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000279 break;
280 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100281 read = MBEDTLS_GET_UINT24_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000282 break;
283 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100284 read = MBEDTLS_GET_UINT32_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000285 break;
286 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100287 read = MBEDTLS_GET_UINT64_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000288 break;
289 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100290 } else {
291 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000292 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100293 read = MBEDTLS_GET_UINT16_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000294 break;
295 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100296 read = MBEDTLS_GET_UINT24_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000297 break;
298 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100299 read = MBEDTLS_GET_UINT32_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000300 break;
301 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100302 read = MBEDTLS_GET_UINT64_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000303 break;
304 }
305 }
306
307 /* Build up expected value byte by byte, in either big or little endian format */
308 uint64_t expected = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100309 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000310 uint64_t b = x[i + offset];
311 uint8_t shift = (big_endian) ? (8 * ((size / 8 - 1) - i)) : (8 * i);
312 expected |= b << shift;
313 }
314
315 /* Verify read */
Gilles Peskine449bd832023-01-11 14:50:10 +0100316 TEST_EQUAL(read, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000317
318 /* Test writing back to memory. First write sentiel */
Gilles Peskine449bd832023-01-11 14:50:10 +0100319 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000320 x[i + offset] = 0xff;
321 }
322 /* Overwrite sentinel with endian-aware write macro */
Gilles Peskine449bd832023-01-11 14:50:10 +0100323 if (big_endian) {
324 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000325 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100326 MBEDTLS_PUT_UINT16_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000327 break;
328 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100329 MBEDTLS_PUT_UINT24_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000330 break;
331 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100332 MBEDTLS_PUT_UINT32_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000333 break;
334 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100335 MBEDTLS_PUT_UINT64_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000336 break;
337 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100338 } else {
339 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000340 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100341 MBEDTLS_PUT_UINT16_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000342 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100343 case 24:
344 MBEDTLS_PUT_UINT24_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000345 break;
346 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100347 MBEDTLS_PUT_UINT32_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000348 break;
349 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100350 MBEDTLS_PUT_UINT64_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000351 break;
352 }
353 }
354
355 /* Verify write - check memory is correct */
Gilles Peskine449bd832023-01-11 14:50:10 +0100356 for (size_t i = 0; i < sizeof(raw); i++) {
357 TEST_EQUAL(x[i], (uint8_t) i);
358 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000359}
360/* END_CASE */
361
362/* BEGIN_CASE */
363void mbedtls_is_big_endian()
364{
365 uint16_t check = 0x1234;
Gilles Peskine449bd832023-01-11 14:50:10 +0100366 uint8_t *p = (uint8_t *) &check;
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000367
Gilles Peskine449bd832023-01-11 14:50:10 +0100368 if (MBEDTLS_IS_BIG_ENDIAN) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000369 /* Big-endian: data stored MSB first, i.e. p == { 0x12, 0x34 } */
Gilles Peskine449bd832023-01-11 14:50:10 +0100370 TEST_EQUAL(p[0], 0x12);
371 TEST_EQUAL(p[1], 0x34);
372 } else {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000373 /* Little-endian: data stored LSB first, i.e. p == { 0x34, 0x12 } */
Gilles Peskine449bd832023-01-11 14:50:10 +0100374 TEST_EQUAL(p[0], 0x34);
375 TEST_EQUAL(p[1], 0x12);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000376 }
377}
378/* END_CASE */