blob: 6c98f233afdcad39d1dc513b688c331280084d4a [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#include <stdio.h>
10
11/*
12 * Convert a string of the form "abcd" (case-insensitive) to a uint64_t.
13 */
Gilles Peskine449bd832023-01-11 14:50:10 +010014int parse_hex_string(char *hex_string, uint64_t *result)
Dave Rodgman481a5e42022-12-01 13:31:20 +000015{
16 uint8_t raw[8];
17 size_t olen;
Gilles Peskine449bd832023-01-11 14:50:10 +010018 if (mbedtls_test_unhexify(raw, sizeof(raw), hex_string, &olen) != 0) {
19 return 0;
20 }
Dave Rodgman481a5e42022-12-01 13:31:20 +000021 *result = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010022 for (size_t i = 0; i < olen; i++) {
23 if (MBEDTLS_IS_BIG_ENDIAN) {
24 *result |= ((uint64_t) raw[i]) << (i * 8);
25 } else {
26 *result |= ((uint64_t) raw[i]) << ((olen - i - 1) * 8);
Dave Rodgman481a5e42022-12-01 13:31:20 +000027 }
28 }
29 return 1;
30}
31
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000032/* END_HEADER */
33
34/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010035void mbedtls_unaligned_access(int size, int offset)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000036{
37 /* Define 64-bit aligned raw byte array */
38 uint64_t raw[2];
39
40 /* Populate with known data */
41 uint8_t *x = (uint8_t *) raw;
Gilles Peskine449bd832023-01-11 14:50:10 +010042 for (size_t i = 0; i < sizeof(raw); i++) {
43 x[i] = (uint8_t) i;
44 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000045
Gilles Peskine449bd832023-01-11 14:50:10 +010046 TEST_ASSERT(size == 16 || size == 32 || size == 64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000047
48 uint64_t r = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010049 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000050 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +010051 r = mbedtls_get_unaligned_uint16(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000052 break;
53 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +010054 r = mbedtls_get_unaligned_uint32(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000055 break;
56 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +010057 r = mbedtls_get_unaligned_uint64(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000058 break;
59 }
60
61 /* Generate expected result */
62 uint64_t expected = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010063 for (uint8_t i = 0; i < 8; i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000064 uint8_t shift;
Gilles Peskine449bd832023-01-11 14:50:10 +010065 if (MBEDTLS_IS_BIG_ENDIAN) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000066 /*
Gilles Peskine449bd832023-01-11 14:50:10 +010067 * Similar to little-endian case described below, but the shift needs
68 * to be inverted
69 */
70 shift = 7 - (i * 8);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000071 } else {
72 /* example for offset == 1:
Gilles Peskine449bd832023-01-11 14:50:10 +010073 * expected = (( 1 + 0 ) << (0 * 8)) | (( 1 + 1 ) << (1 * 8)) | (( 1 + 2 ) << (2 * 8)))
74 * = (1 << 0) | (2 << 8) | (3 << 16) ...
75 * = 0x0807060504030201
76 * x = { 0, 1, 2, 3, ... }
77 * ie expected is the value that would be read from x on a LE system, when
78 * byte swapping is not performed
79 */
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000080 shift = i * 8;
81 }
82 uint64_t b = offset + i;
83 expected |= b << shift;
84 }
85
86 /* Mask out excess bits from expected result */
Gilles Peskine449bd832023-01-11 14:50:10 +010087 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000088 case 16:
89 expected &= 0xffff;
90 break;
91 case 32:
92 expected &= 0xffffffff;
93 break;
94 }
95
Gilles Peskine449bd832023-01-11 14:50:10 +010096 TEST_EQUAL(r, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000097
98 /* Write sentinel to the part of the array we will testing writing to */
Gilles Peskine449bd832023-01-11 14:50:10 +010099 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000100 x[i + offset] = 0xff;
101 }
102 /*
Gilles Peskine449bd832023-01-11 14:50:10 +0100103 * Write back to the array with mbedtls_put_unaligned_uint16 and validate
104 * that the array is unchanged as a result.
105 */
106 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000107 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100108 mbedtls_put_unaligned_uint16(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000109 break;
110 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100111 mbedtls_put_unaligned_uint32(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000112 break;
113 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100114 mbedtls_put_unaligned_uint64(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000115 break;
116 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100117 for (size_t i = 0; i < sizeof(x); i++) {
118 TEST_EQUAL(x[i], (uint8_t) i);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000119 }
120}
121/* END_CASE */
122
123/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100124void mbedtls_byteswap(char *input_str, int size, char *expected_str)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000125{
Dave Rodgman481a5e42022-12-01 13:31:20 +0000126 uint64_t input, expected;
Gilles Peskine449bd832023-01-11 14:50:10 +0100127 TEST_ASSERT(parse_hex_string(input_str, &input));
128 TEST_ASSERT(parse_hex_string(expected_str, &expected));
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000129
Dave Rodgman481a5e42022-12-01 13:31:20 +0000130 /* Check against expected result */
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000131 uint64_t r = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100132 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000133 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100134 r = MBEDTLS_BSWAP16(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000135 break;
136 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100137 r = MBEDTLS_BSWAP32(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000138 break;
139 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100140 r = MBEDTLS_BSWAP64(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000141 break;
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000142 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100143 TEST_ASSERT(!"size must be 16, 32 or 64");
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000144 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100145 TEST_EQUAL(r, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000146
147 /*
148 * Check byte by byte by extracting bytes from opposite ends of
149 * input and r.
150 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100151 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000152 size_t s1 = i * 8;
Gilles Peskine449bd832023-01-11 14:50:10 +0100153 size_t s2 = ((size / 8 - 1) - i) * 8;
154 uint64_t a = (input & ((uint64_t) 0xff << s1)) >> s1;
155 uint64_t b = (r & ((uint64_t) 0xff << s2)) >> s2;
156 TEST_EQUAL(a, b);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000157 }
158
159 /* Check BSWAP(BSWAP(x)) == x */
Gilles Peskine449bd832023-01-11 14:50:10 +0100160 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000161 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100162 r = MBEDTLS_BSWAP16(r);
163 TEST_EQUAL(r, input & 0xffff);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000164 break;
165 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100166 r = MBEDTLS_BSWAP32(r);
167 TEST_EQUAL(r, input & 0xffffffff);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000168 break;
169 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100170 r = MBEDTLS_BSWAP64(r);
171 TEST_EQUAL(r, input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000172 break;
173 }
174}
175/* END_CASE */
176
177/* BEGIN_CASE */
178void get_byte()
179{
180 uint8_t data[16];
181
Gilles Peskine449bd832023-01-11 14:50:10 +0100182 for (size_t i = 0; i < sizeof(data); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000183 data[i] = (uint8_t) i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100184 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000185
186 uint64_t u64 = 0x0706050403020100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100187 for (size_t b = 0; b < 8; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000188 uint8_t expected = b;
189 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100190 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000191 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100192 actual = MBEDTLS_BYTE_0(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000193 break;
194 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100195 actual = MBEDTLS_BYTE_1(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000196 break;
197 case 2:
Gilles Peskine449bd832023-01-11 14:50:10 +0100198 actual = MBEDTLS_BYTE_2(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000199 break;
200 case 3:
Gilles Peskine449bd832023-01-11 14:50:10 +0100201 actual = MBEDTLS_BYTE_3(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000202 break;
203 case 4:
Gilles Peskine449bd832023-01-11 14:50:10 +0100204 actual = MBEDTLS_BYTE_4(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000205 break;
206 case 5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100207 actual = MBEDTLS_BYTE_5(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000208 break;
209 case 6:
Gilles Peskine449bd832023-01-11 14:50:10 +0100210 actual = MBEDTLS_BYTE_6(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000211 break;
212 case 7:
Gilles Peskine449bd832023-01-11 14:50:10 +0100213 actual = MBEDTLS_BYTE_7(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000214 break;
215 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100216 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000217 }
218
219 uint32_t u32 = 0x03020100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100220 for (size_t b = 0; b < 4; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000221 uint8_t expected = b;
222 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100223 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000224 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100225 actual = MBEDTLS_BYTE_0(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000226 break;
227 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100228 actual = MBEDTLS_BYTE_1(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000229 break;
230 case 2:
Gilles Peskine449bd832023-01-11 14:50:10 +0100231 actual = MBEDTLS_BYTE_2(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000232 break;
233 case 3:
Gilles Peskine449bd832023-01-11 14:50:10 +0100234 actual = MBEDTLS_BYTE_3(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000235 break;
236 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100237 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000238 }
239
240 uint16_t u16 = 0x0100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100241 for (size_t b = 0; b < 2; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000242 uint8_t expected = b;
243 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100244 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000245 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100246 actual = MBEDTLS_BYTE_0(u16);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000247 break;
248 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100249 actual = MBEDTLS_BYTE_1(u16);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000250 break;
251 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100252 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000253 }
254
255 uint8_t u8 = 0x01;
Gilles Peskine449bd832023-01-11 14:50:10 +0100256 uint8_t actual = MBEDTLS_BYTE_0(u8);
257 TEST_EQUAL(actual, u8);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000258}
259/* END_CASE */
260
261/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100262void unaligned_access_endian_aware(int size, int offset, int big_endian)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000263{
Gilles Peskine449bd832023-01-11 14:50:10 +0100264 TEST_ASSERT(size == 16 || size == 24 || size == 32 || size == 64);
265 TEST_ASSERT(offset >= 0 && offset < 8);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000266
267 /* Define 64-bit aligned raw byte array */
268 uint64_t raw[2];
269 /* Populate with known data: x == { 0, 1, 2, ... } */
270 uint8_t *x = (uint8_t *) raw;
Gilles Peskine449bd832023-01-11 14:50:10 +0100271 for (size_t i = 0; i < sizeof(raw); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000272 x[i] = (uint8_t) i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100273 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000274
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000275 uint64_t read = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100276 if (big_endian) {
277 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000278 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100279 read = MBEDTLS_GET_UINT16_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000280 break;
281 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100282 read = MBEDTLS_GET_UINT24_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000283 break;
284 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100285 read = MBEDTLS_GET_UINT32_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000286 break;
287 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100288 read = MBEDTLS_GET_UINT64_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000289 break;
290 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100291 } else {
292 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000293 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100294 read = MBEDTLS_GET_UINT16_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000295 break;
296 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100297 read = MBEDTLS_GET_UINT24_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000298 break;
299 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100300 read = MBEDTLS_GET_UINT32_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000301 break;
302 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100303 read = MBEDTLS_GET_UINT64_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000304 break;
305 }
306 }
307
308 /* Build up expected value byte by byte, in either big or little endian format */
309 uint64_t expected = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100310 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000311 uint64_t b = x[i + offset];
312 uint8_t shift = (big_endian) ? (8 * ((size / 8 - 1) - i)) : (8 * i);
313 expected |= b << shift;
314 }
315
316 /* Verify read */
Gilles Peskine449bd832023-01-11 14:50:10 +0100317 TEST_EQUAL(read, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000318
319 /* Test writing back to memory. First write sentiel */
Gilles Peskine449bd832023-01-11 14:50:10 +0100320 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000321 x[i + offset] = 0xff;
322 }
323 /* Overwrite sentinel with endian-aware write macro */
Gilles Peskine449bd832023-01-11 14:50:10 +0100324 if (big_endian) {
325 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000326 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100327 MBEDTLS_PUT_UINT16_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000328 break;
329 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100330 MBEDTLS_PUT_UINT24_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000331 break;
332 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100333 MBEDTLS_PUT_UINT32_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000334 break;
335 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100336 MBEDTLS_PUT_UINT64_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000337 break;
338 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100339 } else {
340 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000341 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100342 MBEDTLS_PUT_UINT16_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000343 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100344 case 24:
345 MBEDTLS_PUT_UINT24_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000346 break;
347 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100348 MBEDTLS_PUT_UINT32_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000349 break;
350 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100351 MBEDTLS_PUT_UINT64_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000352 break;
353 }
354 }
355
356 /* Verify write - check memory is correct */
Gilles Peskine449bd832023-01-11 14:50:10 +0100357 for (size_t i = 0; i < sizeof(raw); i++) {
358 TEST_EQUAL(x[i], (uint8_t) i);
359 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000360}
361/* END_CASE */
362
363/* BEGIN_CASE */
364void mbedtls_is_big_endian()
365{
366 uint16_t check = 0x1234;
Gilles Peskine449bd832023-01-11 14:50:10 +0100367 uint8_t *p = (uint8_t *) &check;
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000368
Gilles Peskine449bd832023-01-11 14:50:10 +0100369 if (MBEDTLS_IS_BIG_ENDIAN) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000370 /* Big-endian: data stored MSB first, i.e. p == { 0x12, 0x34 } */
Gilles Peskine449bd832023-01-11 14:50:10 +0100371 TEST_EQUAL(p[0], 0x12);
372 TEST_EQUAL(p[1], 0x34);
373 } else {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000374 /* Little-endian: data stored LSB first, i.e. p == { 0x34, 0x12 } */
Gilles Peskine449bd832023-01-11 14:50:10 +0100375 TEST_EQUAL(p[0], 0x34);
376 TEST_EQUAL(p[1], 0x12);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000377 }
378}
379/* END_CASE */