blob: ed8f918d8c3b5be9a0664c63f0ef708086f522db [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{
Dave Rodgman9145dc42023-04-13 14:59:03 +010015 uint8_t raw[8] = {0};
Dave Rodgman481a5e42022-12-01 13:31:20 +000016 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
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++) {
Dave Rodgmanc07df362023-04-13 14:54:12 +010023 *result |= ((uint64_t) raw[i]) << ((olen - i - 1) * 8);
Dave Rodgman481a5e42022-12-01 13:31:20 +000024 }
25 return 1;
26}
27
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000028/* END_HEADER */
29
30/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010031void mbedtls_unaligned_access(int size, int offset)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000032{
33 /* Define 64-bit aligned raw byte array */
34 uint64_t raw[2];
35
36 /* Populate with known data */
37 uint8_t *x = (uint8_t *) raw;
Gilles Peskine449bd832023-01-11 14:50:10 +010038 for (size_t i = 0; i < sizeof(raw); i++) {
39 x[i] = (uint8_t) i;
40 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000041
Gilles Peskine449bd832023-01-11 14:50:10 +010042 TEST_ASSERT(size == 16 || size == 32 || size == 64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000043
44 uint64_t r = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010045 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000046 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +010047 r = mbedtls_get_unaligned_uint16(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000048 break;
49 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +010050 r = mbedtls_get_unaligned_uint32(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000051 break;
52 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +010053 r = mbedtls_get_unaligned_uint64(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000054 break;
55 }
56
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010057 /* Define expected result by manually aligning the raw bytes, and
58 * reading back with a normal pointer access. */
Dave Rodgmandf2d5b12023-04-13 13:41:09 +010059 uint64_t raw_aligned_64;
60 uint16_t *raw_aligned_16 = (uint16_t *) &raw_aligned_64;
61 uint32_t *raw_aligned_32 = (uint32_t *) &raw_aligned_64;
62 memcpy(&raw_aligned_64, ((uint8_t *) &raw) + offset, size / 8);
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010063 /* Make a 16/32/64 byte read from the aligned location, and copy to expected */
64 uint64_t expected = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010065 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000066 case 16:
Dave Rodgmandf2d5b12023-04-13 13:41:09 +010067 expected = *raw_aligned_16;
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000068 break;
69 case 32:
Dave Rodgmandf2d5b12023-04-13 13:41:09 +010070 expected = *raw_aligned_32;
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010071 break;
72 case 64:
Dave Rodgmandf2d5b12023-04-13 13:41:09 +010073 expected = raw_aligned_64;
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000074 break;
75 }
76
Gilles Peskine449bd832023-01-11 14:50:10 +010077 TEST_EQUAL(r, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000078
Dave Rodgman0a05e702023-04-13 13:01:34 +010079 /* Write sentinel to the part of the array we will test writing to */
Gilles Peskine449bd832023-01-11 14:50:10 +010080 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000081 x[i + offset] = 0xff;
82 }
83 /*
Gilles Peskine449bd832023-01-11 14:50:10 +010084 * Write back to the array with mbedtls_put_unaligned_uint16 and validate
85 * that the array is unchanged as a result.
86 */
87 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000088 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +010089 mbedtls_put_unaligned_uint16(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000090 break;
91 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +010092 mbedtls_put_unaligned_uint32(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000093 break;
94 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +010095 mbedtls_put_unaligned_uint64(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000096 break;
97 }
Gilles Peskine449bd832023-01-11 14:50:10 +010098 for (size_t i = 0; i < sizeof(x); i++) {
99 TEST_EQUAL(x[i], (uint8_t) i);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000100 }
101}
102/* END_CASE */
103
104/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100105void mbedtls_byteswap(char *input_str, int size, char *expected_str)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000106{
Dave Rodgman9145dc42023-04-13 14:59:03 +0100107 uint64_t input = 0, expected = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100108 TEST_ASSERT(parse_hex_string(input_str, &input));
109 TEST_ASSERT(parse_hex_string(expected_str, &expected));
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000110
Dave Rodgman481a5e42022-12-01 13:31:20 +0000111 /* Check against expected result */
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000112 uint64_t r = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100113 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000114 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100115 r = MBEDTLS_BSWAP16(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000116 break;
117 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100118 r = MBEDTLS_BSWAP32(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000119 break;
120 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100121 r = MBEDTLS_BSWAP64(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000122 break;
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000123 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100124 TEST_ASSERT(!"size must be 16, 32 or 64");
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000125 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100126 TEST_EQUAL(r, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000127
128 /*
129 * Check byte by byte by extracting bytes from opposite ends of
130 * input and r.
131 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100132 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000133 size_t s1 = i * 8;
Gilles Peskine449bd832023-01-11 14:50:10 +0100134 size_t s2 = ((size / 8 - 1) - i) * 8;
135 uint64_t a = (input & ((uint64_t) 0xff << s1)) >> s1;
136 uint64_t b = (r & ((uint64_t) 0xff << s2)) >> s2;
137 TEST_EQUAL(a, b);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000138 }
139
140 /* Check BSWAP(BSWAP(x)) == x */
Gilles Peskine449bd832023-01-11 14:50:10 +0100141 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000142 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100143 r = MBEDTLS_BSWAP16(r);
144 TEST_EQUAL(r, input & 0xffff);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000145 break;
146 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100147 r = MBEDTLS_BSWAP32(r);
148 TEST_EQUAL(r, input & 0xffffffff);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000149 break;
150 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100151 r = MBEDTLS_BSWAP64(r);
152 TEST_EQUAL(r, input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000153 break;
154 }
155}
156/* END_CASE */
157
158/* BEGIN_CASE */
159void get_byte()
160{
161 uint8_t data[16];
162
Gilles Peskine449bd832023-01-11 14:50:10 +0100163 for (size_t i = 0; i < sizeof(data); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000164 data[i] = (uint8_t) i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100165 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000166
167 uint64_t u64 = 0x0706050403020100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100168 for (size_t b = 0; b < 8; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000169 uint8_t expected = b;
170 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100171 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000172 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100173 actual = MBEDTLS_BYTE_0(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000174 break;
175 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100176 actual = MBEDTLS_BYTE_1(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000177 break;
178 case 2:
Gilles Peskine449bd832023-01-11 14:50:10 +0100179 actual = MBEDTLS_BYTE_2(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000180 break;
181 case 3:
Gilles Peskine449bd832023-01-11 14:50:10 +0100182 actual = MBEDTLS_BYTE_3(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000183 break;
184 case 4:
Gilles Peskine449bd832023-01-11 14:50:10 +0100185 actual = MBEDTLS_BYTE_4(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000186 break;
187 case 5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100188 actual = MBEDTLS_BYTE_5(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000189 break;
190 case 6:
Gilles Peskine449bd832023-01-11 14:50:10 +0100191 actual = MBEDTLS_BYTE_6(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000192 break;
193 case 7:
Gilles Peskine449bd832023-01-11 14:50:10 +0100194 actual = MBEDTLS_BYTE_7(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000195 break;
196 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100197 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000198 }
199
200 uint32_t u32 = 0x03020100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100201 for (size_t b = 0; b < 4; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000202 uint8_t expected = b;
203 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100204 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000205 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100206 actual = MBEDTLS_BYTE_0(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000207 break;
208 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100209 actual = MBEDTLS_BYTE_1(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000210 break;
211 case 2:
Gilles Peskine449bd832023-01-11 14:50:10 +0100212 actual = MBEDTLS_BYTE_2(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000213 break;
214 case 3:
Gilles Peskine449bd832023-01-11 14:50:10 +0100215 actual = MBEDTLS_BYTE_3(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000216 break;
217 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100218 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000219 }
220
221 uint16_t u16 = 0x0100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100222 for (size_t b = 0; b < 2; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000223 uint8_t expected = b;
224 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100225 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000226 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100227 actual = MBEDTLS_BYTE_0(u16);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000228 break;
229 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100230 actual = MBEDTLS_BYTE_1(u16);
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 uint8_t u8 = 0x01;
Gilles Peskine449bd832023-01-11 14:50:10 +0100237 uint8_t actual = MBEDTLS_BYTE_0(u8);
238 TEST_EQUAL(actual, u8);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000239}
240/* END_CASE */
241
242/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100243void unaligned_access_endian_aware(int size, int offset, int big_endian)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000244{
Gilles Peskine449bd832023-01-11 14:50:10 +0100245 TEST_ASSERT(size == 16 || size == 24 || size == 32 || size == 64);
246 TEST_ASSERT(offset >= 0 && offset < 8);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000247
248 /* Define 64-bit aligned raw byte array */
249 uint64_t raw[2];
250 /* Populate with known data: x == { 0, 1, 2, ... } */
251 uint8_t *x = (uint8_t *) raw;
Gilles Peskine449bd832023-01-11 14:50:10 +0100252 for (size_t i = 0; i < sizeof(raw); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000253 x[i] = (uint8_t) i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100254 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000255
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000256 uint64_t read = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100257 if (big_endian) {
258 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000259 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100260 read = MBEDTLS_GET_UINT16_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000261 break;
262 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100263 read = MBEDTLS_GET_UINT24_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000264 break;
265 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100266 read = MBEDTLS_GET_UINT32_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000267 break;
268 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100269 read = MBEDTLS_GET_UINT64_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000270 break;
271 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100272 } else {
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_LE(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_LE(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_LE(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_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000285 break;
286 }
287 }
288
289 /* Build up expected value byte by byte, in either big or little endian format */
290 uint64_t expected = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100291 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000292 uint64_t b = x[i + offset];
293 uint8_t shift = (big_endian) ? (8 * ((size / 8 - 1) - i)) : (8 * i);
294 expected |= b << shift;
295 }
296
297 /* Verify read */
Gilles Peskine449bd832023-01-11 14:50:10 +0100298 TEST_EQUAL(read, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000299
Dave Rodgman0a05e702023-04-13 13:01:34 +0100300 /* Test writing back to memory. First write sentinel */
Gilles Peskine449bd832023-01-11 14:50:10 +0100301 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000302 x[i + offset] = 0xff;
303 }
304 /* Overwrite sentinel with endian-aware write macro */
Gilles Peskine449bd832023-01-11 14:50:10 +0100305 if (big_endian) {
306 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000307 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100308 MBEDTLS_PUT_UINT16_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000309 break;
310 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100311 MBEDTLS_PUT_UINT24_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000312 break;
313 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100314 MBEDTLS_PUT_UINT32_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000315 break;
316 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100317 MBEDTLS_PUT_UINT64_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000318 break;
319 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100320 } else {
321 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000322 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100323 MBEDTLS_PUT_UINT16_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000324 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100325 case 24:
326 MBEDTLS_PUT_UINT24_LE(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_LE(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_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000333 break;
334 }
335 }
336
337 /* Verify write - check memory is correct */
Gilles Peskine449bd832023-01-11 14:50:10 +0100338 for (size_t i = 0; i < sizeof(raw); i++) {
339 TEST_EQUAL(x[i], (uint8_t) i);
340 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000341}
342/* END_CASE */
343
344/* BEGIN_CASE */
345void mbedtls_is_big_endian()
346{
347 uint16_t check = 0x1234;
Gilles Peskine449bd832023-01-11 14:50:10 +0100348 uint8_t *p = (uint8_t *) &check;
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000349
Gilles Peskine449bd832023-01-11 14:50:10 +0100350 if (MBEDTLS_IS_BIG_ENDIAN) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000351 /* Big-endian: data stored MSB first, i.e. p == { 0x12, 0x34 } */
Gilles Peskine449bd832023-01-11 14:50:10 +0100352 TEST_EQUAL(p[0], 0x12);
353 TEST_EQUAL(p[1], 0x34);
354 } else {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000355 /* Little-endian: data stored LSB first, i.e. p == { 0x34, 0x12 } */
Gilles Peskine449bd832023-01-11 14:50:10 +0100356 TEST_EQUAL(p[0], 0x34);
357 TEST_EQUAL(p[1], 0x12);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000358 }
359}
360/* END_CASE */