blob: b027c4b116506624f8816145a4b2cf14d5abb387 [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) {
Dave Rodgmanb1696712023-04-13 13:46:46 +010023 memmove(raw + 8 - olen, raw, olen);
24 memset(raw, 0, 8 - olen);
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010025 }
26
Dave Rodgman481a5e42022-12-01 13:31:20 +000027 *result = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010028 for (size_t i = 0; i < olen; i++) {
29 if (MBEDTLS_IS_BIG_ENDIAN) {
30 *result |= ((uint64_t) raw[i]) << (i * 8);
31 } else {
32 *result |= ((uint64_t) raw[i]) << ((olen - i - 1) * 8);
Dave Rodgman481a5e42022-12-01 13:31:20 +000033 }
34 }
35 return 1;
36}
37
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000038/* END_HEADER */
39
40/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010041void mbedtls_unaligned_access(int size, int offset)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000042{
43 /* Define 64-bit aligned raw byte array */
44 uint64_t raw[2];
45
46 /* Populate with known data */
47 uint8_t *x = (uint8_t *) raw;
Gilles Peskine449bd832023-01-11 14:50:10 +010048 for (size_t i = 0; i < sizeof(raw); i++) {
49 x[i] = (uint8_t) i;
50 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000051
Gilles Peskine449bd832023-01-11 14:50:10 +010052 TEST_ASSERT(size == 16 || size == 32 || size == 64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000053
54 uint64_t r = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010055 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000056 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +010057 r = mbedtls_get_unaligned_uint16(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000058 break;
59 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +010060 r = mbedtls_get_unaligned_uint32(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000061 break;
62 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +010063 r = mbedtls_get_unaligned_uint64(x + offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000064 break;
65 }
66
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010067 /* Define expected result by manually aligning the raw bytes, and
68 * reading back with a normal pointer access. */
Dave Rodgmandf2d5b12023-04-13 13:41:09 +010069 uint64_t raw_aligned_64;
70 uint16_t *raw_aligned_16 = (uint16_t *) &raw_aligned_64;
71 uint32_t *raw_aligned_32 = (uint32_t *) &raw_aligned_64;
72 memcpy(&raw_aligned_64, ((uint8_t *) &raw) + offset, size / 8);
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010073 /* Make a 16/32/64 byte read from the aligned location, and copy to expected */
74 uint64_t expected = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010075 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000076 case 16:
Dave Rodgmandf2d5b12023-04-13 13:41:09 +010077 expected = *raw_aligned_16;
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000078 break;
79 case 32:
Dave Rodgmandf2d5b12023-04-13 13:41:09 +010080 expected = *raw_aligned_32;
Dave Rodgman9dc8b6a2023-04-13 12:53:35 +010081 break;
82 case 64:
Dave Rodgmandf2d5b12023-04-13 13:41:09 +010083 expected = raw_aligned_64;
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000084 break;
85 }
86
Gilles Peskine449bd832023-01-11 14:50:10 +010087 TEST_EQUAL(r, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000088
Dave Rodgman0a05e702023-04-13 13:01:34 +010089 /* Write sentinel to the part of the array we will test writing to */
Gilles Peskine449bd832023-01-11 14:50:10 +010090 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000091 x[i + offset] = 0xff;
92 }
93 /*
Gilles Peskine449bd832023-01-11 14:50:10 +010094 * Write back to the array with mbedtls_put_unaligned_uint16 and validate
95 * that the array is unchanged as a result.
96 */
97 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +000098 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +010099 mbedtls_put_unaligned_uint16(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000100 break;
101 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100102 mbedtls_put_unaligned_uint32(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000103 break;
104 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100105 mbedtls_put_unaligned_uint64(x + offset, r);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000106 break;
107 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100108 for (size_t i = 0; i < sizeof(x); i++) {
109 TEST_EQUAL(x[i], (uint8_t) i);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000110 }
111}
112/* END_CASE */
113
114/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100115void mbedtls_byteswap(char *input_str, int size, char *expected_str)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000116{
Dave Rodgman481a5e42022-12-01 13:31:20 +0000117 uint64_t input, expected;
Gilles Peskine449bd832023-01-11 14:50:10 +0100118 TEST_ASSERT(parse_hex_string(input_str, &input));
119 TEST_ASSERT(parse_hex_string(expected_str, &expected));
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000120
Dave Rodgman481a5e42022-12-01 13:31:20 +0000121 /* Check against expected result */
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000122 uint64_t r = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100123 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000124 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100125 r = MBEDTLS_BSWAP16(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000126 break;
127 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100128 r = MBEDTLS_BSWAP32(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000129 break;
130 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100131 r = MBEDTLS_BSWAP64(input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000132 break;
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000133 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100134 TEST_ASSERT(!"size must be 16, 32 or 64");
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000135 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100136 TEST_EQUAL(r, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000137
138 /*
139 * Check byte by byte by extracting bytes from opposite ends of
140 * input and r.
141 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100142 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000143 size_t s1 = i * 8;
Gilles Peskine449bd832023-01-11 14:50:10 +0100144 size_t s2 = ((size / 8 - 1) - i) * 8;
145 uint64_t a = (input & ((uint64_t) 0xff << s1)) >> s1;
146 uint64_t b = (r & ((uint64_t) 0xff << s2)) >> s2;
147 TEST_EQUAL(a, b);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000148 }
149
150 /* Check BSWAP(BSWAP(x)) == x */
Gilles Peskine449bd832023-01-11 14:50:10 +0100151 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000152 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100153 r = MBEDTLS_BSWAP16(r);
154 TEST_EQUAL(r, input & 0xffff);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000155 break;
156 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100157 r = MBEDTLS_BSWAP32(r);
158 TEST_EQUAL(r, input & 0xffffffff);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000159 break;
160 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100161 r = MBEDTLS_BSWAP64(r);
162 TEST_EQUAL(r, input);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000163 break;
164 }
165}
166/* END_CASE */
167
168/* BEGIN_CASE */
169void get_byte()
170{
171 uint8_t data[16];
172
Gilles Peskine449bd832023-01-11 14:50:10 +0100173 for (size_t i = 0; i < sizeof(data); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000174 data[i] = (uint8_t) i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100175 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000176
177 uint64_t u64 = 0x0706050403020100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100178 for (size_t b = 0; b < 8; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000179 uint8_t expected = b;
180 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100181 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000182 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100183 actual = MBEDTLS_BYTE_0(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000184 break;
185 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100186 actual = MBEDTLS_BYTE_1(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000187 break;
188 case 2:
Gilles Peskine449bd832023-01-11 14:50:10 +0100189 actual = MBEDTLS_BYTE_2(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000190 break;
191 case 3:
Gilles Peskine449bd832023-01-11 14:50:10 +0100192 actual = MBEDTLS_BYTE_3(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000193 break;
194 case 4:
Gilles Peskine449bd832023-01-11 14:50:10 +0100195 actual = MBEDTLS_BYTE_4(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000196 break;
197 case 5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100198 actual = MBEDTLS_BYTE_5(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000199 break;
200 case 6:
Gilles Peskine449bd832023-01-11 14:50:10 +0100201 actual = MBEDTLS_BYTE_6(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000202 break;
203 case 7:
Gilles Peskine449bd832023-01-11 14:50:10 +0100204 actual = MBEDTLS_BYTE_7(u64);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000205 break;
206 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100207 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000208 }
209
210 uint32_t u32 = 0x03020100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100211 for (size_t b = 0; b < 4; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000212 uint8_t expected = b;
213 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100214 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000215 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100216 actual = MBEDTLS_BYTE_0(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000217 break;
218 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100219 actual = MBEDTLS_BYTE_1(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000220 break;
221 case 2:
Gilles Peskine449bd832023-01-11 14:50:10 +0100222 actual = MBEDTLS_BYTE_2(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000223 break;
224 case 3:
Gilles Peskine449bd832023-01-11 14:50:10 +0100225 actual = MBEDTLS_BYTE_3(u32);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000226 break;
227 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100228 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000229 }
230
231 uint16_t u16 = 0x0100;
Gilles Peskine449bd832023-01-11 14:50:10 +0100232 for (size_t b = 0; b < 2; b++) {
Dave Rodgman7fc53dd2022-12-01 11:42:29 +0000233 uint8_t expected = b;
234 uint8_t actual = b + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100235 switch (b) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000236 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100237 actual = MBEDTLS_BYTE_0(u16);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000238 break;
239 case 1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100240 actual = MBEDTLS_BYTE_1(u16);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000241 break;
242 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100243 TEST_EQUAL(actual, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000244 }
245
246 uint8_t u8 = 0x01;
Gilles Peskine449bd832023-01-11 14:50:10 +0100247 uint8_t actual = MBEDTLS_BYTE_0(u8);
248 TEST_EQUAL(actual, u8);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000249}
250/* END_CASE */
251
252/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100253void unaligned_access_endian_aware(int size, int offset, int big_endian)
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000254{
Gilles Peskine449bd832023-01-11 14:50:10 +0100255 TEST_ASSERT(size == 16 || size == 24 || size == 32 || size == 64);
256 TEST_ASSERT(offset >= 0 && offset < 8);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000257
258 /* Define 64-bit aligned raw byte array */
259 uint64_t raw[2];
260 /* Populate with known data: x == { 0, 1, 2, ... } */
261 uint8_t *x = (uint8_t *) raw;
Gilles Peskine449bd832023-01-11 14:50:10 +0100262 for (size_t i = 0; i < sizeof(raw); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000263 x[i] = (uint8_t) i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100264 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000265
Dave Rodgman9dc55ba2022-12-01 10:49:53 +0000266 uint64_t read = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100267 if (big_endian) {
268 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000269 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100270 read = MBEDTLS_GET_UINT16_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000271 break;
272 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100273 read = MBEDTLS_GET_UINT24_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000274 break;
275 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100276 read = MBEDTLS_GET_UINT32_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000277 break;
278 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100279 read = MBEDTLS_GET_UINT64_BE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000280 break;
281 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100282 } else {
283 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000284 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100285 read = MBEDTLS_GET_UINT16_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000286 break;
287 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100288 read = MBEDTLS_GET_UINT24_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000289 break;
290 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100291 read = MBEDTLS_GET_UINT32_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000292 break;
293 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100294 read = MBEDTLS_GET_UINT64_LE(x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000295 break;
296 }
297 }
298
299 /* Build up expected value byte by byte, in either big or little endian format */
300 uint64_t expected = 0;
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 uint64_t b = x[i + offset];
303 uint8_t shift = (big_endian) ? (8 * ((size / 8 - 1) - i)) : (8 * i);
304 expected |= b << shift;
305 }
306
307 /* Verify read */
Gilles Peskine449bd832023-01-11 14:50:10 +0100308 TEST_EQUAL(read, expected);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000309
Dave Rodgman0a05e702023-04-13 13:01:34 +0100310 /* Test writing back to memory. First write sentinel */
Gilles Peskine449bd832023-01-11 14:50:10 +0100311 for (size_t i = 0; i < (size_t) (size / 8); i++) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000312 x[i + offset] = 0xff;
313 }
314 /* Overwrite sentinel with endian-aware write macro */
Gilles Peskine449bd832023-01-11 14:50:10 +0100315 if (big_endian) {
316 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000317 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100318 MBEDTLS_PUT_UINT16_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000319 break;
320 case 24:
Gilles Peskine449bd832023-01-11 14:50:10 +0100321 MBEDTLS_PUT_UINT24_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000322 break;
323 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100324 MBEDTLS_PUT_UINT32_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000325 break;
326 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100327 MBEDTLS_PUT_UINT64_BE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000328 break;
329 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100330 } else {
331 switch (size) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000332 case 16:
Gilles Peskine449bd832023-01-11 14:50:10 +0100333 MBEDTLS_PUT_UINT16_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000334 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100335 case 24:
336 MBEDTLS_PUT_UINT24_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000337 break;
338 case 32:
Gilles Peskine449bd832023-01-11 14:50:10 +0100339 MBEDTLS_PUT_UINT32_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000340 break;
341 case 64:
Gilles Peskine449bd832023-01-11 14:50:10 +0100342 MBEDTLS_PUT_UINT64_LE(read, x, offset);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000343 break;
344 }
345 }
346
347 /* Verify write - check memory is correct */
Gilles Peskine449bd832023-01-11 14:50:10 +0100348 for (size_t i = 0; i < sizeof(raw); i++) {
349 TEST_EQUAL(x[i], (uint8_t) i);
350 }
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000351}
352/* END_CASE */
353
354/* BEGIN_CASE */
355void mbedtls_is_big_endian()
356{
357 uint16_t check = 0x1234;
Gilles Peskine449bd832023-01-11 14:50:10 +0100358 uint8_t *p = (uint8_t *) &check;
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000359
Gilles Peskine449bd832023-01-11 14:50:10 +0100360 if (MBEDTLS_IS_BIG_ENDIAN) {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000361 /* Big-endian: data stored MSB first, i.e. p == { 0x12, 0x34 } */
Gilles Peskine449bd832023-01-11 14:50:10 +0100362 TEST_EQUAL(p[0], 0x12);
363 TEST_EQUAL(p[1], 0x34);
364 } else {
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000365 /* Little-endian: data stored LSB first, i.e. p == { 0x34, 0x12 } */
Gilles Peskine449bd832023-01-11 14:50:10 +0100366 TEST_EQUAL(p[0], 0x34);
367 TEST_EQUAL(p[1], 0x12);
Dave Rodgmanfb5fedc2022-11-30 15:20:33 +0000368 }
369}
370/* END_CASE */