1a8e1175bSopenharmony_ci/* BEGIN_HEADER */ 2a8e1175bSopenharmony_ci#include "mbedtls/sha1.h" 3a8e1175bSopenharmony_ci#include "mbedtls/sha256.h" 4a8e1175bSopenharmony_ci#include "mbedtls/sha512.h" 5a8e1175bSopenharmony_ci#include "mbedtls/sha3.h" 6a8e1175bSopenharmony_ci/* END_HEADER */ 7a8e1175bSopenharmony_ci 8a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA1_C */ 9a8e1175bSopenharmony_civoid mbedtls_sha1(data_t *src_str, data_t *hash) 10a8e1175bSopenharmony_ci{ 11a8e1175bSopenharmony_ci unsigned char output[41]; 12a8e1175bSopenharmony_ci 13a8e1175bSopenharmony_ci memset(output, 0x00, 41); 14a8e1175bSopenharmony_ci 15a8e1175bSopenharmony_ci 16a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_sha1(src_str->x, src_str->len, output) == 0); 17a8e1175bSopenharmony_ci 18a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, hash->x, 20, hash->len) == 0); 19a8e1175bSopenharmony_ci} 20a8e1175bSopenharmony_ci/* END_CASE */ 21a8e1175bSopenharmony_ci 22a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */ 23a8e1175bSopenharmony_civoid sha256_invalid_param() 24a8e1175bSopenharmony_ci{ 25a8e1175bSopenharmony_ci mbedtls_sha256_context ctx; 26a8e1175bSopenharmony_ci unsigned char buf[64] = { 0 }; 27a8e1175bSopenharmony_ci size_t const buflen = sizeof(buf); 28a8e1175bSopenharmony_ci int invalid_type = 42; 29a8e1175bSopenharmony_ci 30a8e1175bSopenharmony_ci TEST_EQUAL(MBEDTLS_ERR_SHA256_BAD_INPUT_DATA, 31a8e1175bSopenharmony_ci mbedtls_sha256_starts(&ctx, invalid_type)); 32a8e1175bSopenharmony_ci 33a8e1175bSopenharmony_ci TEST_EQUAL(MBEDTLS_ERR_SHA256_BAD_INPUT_DATA, 34a8e1175bSopenharmony_ci mbedtls_sha256(buf, buflen, 35a8e1175bSopenharmony_ci buf, invalid_type)); 36a8e1175bSopenharmony_ci 37a8e1175bSopenharmony_ciexit: 38a8e1175bSopenharmony_ci return; 39a8e1175bSopenharmony_ci} 40a8e1175bSopenharmony_ci/* END_CASE */ 41a8e1175bSopenharmony_ci 42a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA224_C */ 43a8e1175bSopenharmony_civoid sha224(data_t *src_str, data_t *hash) 44a8e1175bSopenharmony_ci{ 45a8e1175bSopenharmony_ci unsigned char output[57]; 46a8e1175bSopenharmony_ci 47a8e1175bSopenharmony_ci memset(output, 0x00, 57); 48a8e1175bSopenharmony_ci 49a8e1175bSopenharmony_ci 50a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha256(src_str->x, src_str->len, output, 1), 0); 51a8e1175bSopenharmony_ci 52a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_hexcmp(output, hash->x, 28, hash->len), 0); 53a8e1175bSopenharmony_ci} 54a8e1175bSopenharmony_ci/* END_CASE */ 55a8e1175bSopenharmony_ci 56a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */ 57a8e1175bSopenharmony_civoid mbedtls_sha256(data_t *src_str, data_t *hash) 58a8e1175bSopenharmony_ci{ 59a8e1175bSopenharmony_ci unsigned char output[65]; 60a8e1175bSopenharmony_ci 61a8e1175bSopenharmony_ci memset(output, 0x00, 65); 62a8e1175bSopenharmony_ci 63a8e1175bSopenharmony_ci 64a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha256(src_str->x, src_str->len, output, 0), 0); 65a8e1175bSopenharmony_ci 66a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_hexcmp(output, hash->x, 32, hash->len), 0); 67a8e1175bSopenharmony_ci} 68a8e1175bSopenharmony_ci/* END_CASE */ 69a8e1175bSopenharmony_ci 70a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA512_C */ 71a8e1175bSopenharmony_civoid sha512_invalid_param() 72a8e1175bSopenharmony_ci{ 73a8e1175bSopenharmony_ci mbedtls_sha512_context ctx; 74a8e1175bSopenharmony_ci unsigned char buf[64] = { 0 }; 75a8e1175bSopenharmony_ci size_t const buflen = sizeof(buf); 76a8e1175bSopenharmony_ci int invalid_type = 42; 77a8e1175bSopenharmony_ci 78a8e1175bSopenharmony_ci TEST_EQUAL(MBEDTLS_ERR_SHA512_BAD_INPUT_DATA, 79a8e1175bSopenharmony_ci mbedtls_sha512_starts(&ctx, invalid_type)); 80a8e1175bSopenharmony_ci 81a8e1175bSopenharmony_ci TEST_EQUAL(MBEDTLS_ERR_SHA512_BAD_INPUT_DATA, 82a8e1175bSopenharmony_ci mbedtls_sha512(buf, buflen, 83a8e1175bSopenharmony_ci buf, invalid_type)); 84a8e1175bSopenharmony_ci 85a8e1175bSopenharmony_ciexit: 86a8e1175bSopenharmony_ci return; 87a8e1175bSopenharmony_ci} 88a8e1175bSopenharmony_ci/* END_CASE */ 89a8e1175bSopenharmony_ci 90a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA384_C */ 91a8e1175bSopenharmony_civoid sha384(data_t *src_str, data_t *hash) 92a8e1175bSopenharmony_ci{ 93a8e1175bSopenharmony_ci unsigned char output[97]; 94a8e1175bSopenharmony_ci 95a8e1175bSopenharmony_ci memset(output, 0x00, 97); 96a8e1175bSopenharmony_ci 97a8e1175bSopenharmony_ci 98a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha512(src_str->x, src_str->len, output, 1), 0); 99a8e1175bSopenharmony_ci 100a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_hexcmp(output, hash->x, 48, hash->len), 0); 101a8e1175bSopenharmony_ci} 102a8e1175bSopenharmony_ci/* END_CASE */ 103a8e1175bSopenharmony_ci 104a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA512_C */ 105a8e1175bSopenharmony_civoid mbedtls_sha512(data_t *src_str, data_t *hash) 106a8e1175bSopenharmony_ci{ 107a8e1175bSopenharmony_ci unsigned char output[129]; 108a8e1175bSopenharmony_ci 109a8e1175bSopenharmony_ci memset(output, 0x00, 129); 110a8e1175bSopenharmony_ci 111a8e1175bSopenharmony_ci 112a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha512(src_str->x, src_str->len, output, 0), 0); 113a8e1175bSopenharmony_ci 114a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_hexcmp(output, hash->x, 64, hash->len), 0); 115a8e1175bSopenharmony_ci} 116a8e1175bSopenharmony_ci/* END_CASE */ 117a8e1175bSopenharmony_ci 118a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA1_C:MBEDTLS_SELF_TEST */ 119a8e1175bSopenharmony_civoid sha1_selftest() 120a8e1175bSopenharmony_ci{ 121a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_sha1_self_test(1) == 0); 122a8e1175bSopenharmony_ci} 123a8e1175bSopenharmony_ci/* END_CASE */ 124a8e1175bSopenharmony_ci 125a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA224_C:MBEDTLS_SELF_TEST */ 126a8e1175bSopenharmony_civoid sha224_selftest() 127a8e1175bSopenharmony_ci{ 128a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha224_self_test(1), 0); 129a8e1175bSopenharmony_ci} 130a8e1175bSopenharmony_ci/* END_CASE */ 131a8e1175bSopenharmony_ci 132a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C:MBEDTLS_SELF_TEST */ 133a8e1175bSopenharmony_civoid sha256_selftest() 134a8e1175bSopenharmony_ci{ 135a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha256_self_test(1), 0); 136a8e1175bSopenharmony_ci} 137a8e1175bSopenharmony_ci/* END_CASE */ 138a8e1175bSopenharmony_ci 139a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA384_C:MBEDTLS_SELF_TEST */ 140a8e1175bSopenharmony_civoid sha384_selftest() 141a8e1175bSopenharmony_ci{ 142a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha384_self_test(1), 0); 143a8e1175bSopenharmony_ci} 144a8e1175bSopenharmony_ci/* END_CASE */ 145a8e1175bSopenharmony_ci 146a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA512_C:MBEDTLS_SELF_TEST */ 147a8e1175bSopenharmony_civoid sha512_selftest() 148a8e1175bSopenharmony_ci{ 149a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha512_self_test(1), 0); 150a8e1175bSopenharmony_ci} 151a8e1175bSopenharmony_ci/* END_CASE */ 152a8e1175bSopenharmony_ci 153a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA3_C */ 154a8e1175bSopenharmony_civoid mbedtls_sha3(int family, data_t *in, data_t *hash) 155a8e1175bSopenharmony_ci{ 156a8e1175bSopenharmony_ci unsigned char *output = NULL; 157a8e1175bSopenharmony_ci 158a8e1175bSopenharmony_ci TEST_CALLOC(output, hash->len); 159a8e1175bSopenharmony_ci 160a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_sha3(family, in->x, in->len, output, hash->len) == 0); 161a8e1175bSopenharmony_ci 162a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output, hash->len, hash->x, hash->len); 163a8e1175bSopenharmony_ci 164a8e1175bSopenharmony_ciexit: 165a8e1175bSopenharmony_ci mbedtls_free(output); 166a8e1175bSopenharmony_ci} 167a8e1175bSopenharmony_ci/* END_CASE */ 168a8e1175bSopenharmony_ci 169a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA3_C */ 170a8e1175bSopenharmony_civoid sha3_invalid_param() 171a8e1175bSopenharmony_ci{ 172a8e1175bSopenharmony_ci unsigned char output[32]; 173a8e1175bSopenharmony_ci mbedtls_sha3_context ctx; 174a8e1175bSopenharmony_ci 175a8e1175bSopenharmony_ci mbedtls_sha3_init(&ctx); 176a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha3_starts(&ctx, MBEDTLS_SHA3_NONE), MBEDTLS_ERR_SHA3_BAD_INPUT_DATA); 177a8e1175bSopenharmony_ci 178a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha3_starts(&ctx, MBEDTLS_SHA3_256), 0); 179a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha3_finish(&ctx, output, 0), MBEDTLS_ERR_SHA3_BAD_INPUT_DATA); 180a8e1175bSopenharmony_ci 181a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha3_starts(&ctx, MBEDTLS_SHA3_256), 0); 182a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha3_finish(&ctx, output, 31), MBEDTLS_ERR_SHA3_BAD_INPUT_DATA); 183a8e1175bSopenharmony_ci 184a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha3_starts(&ctx, MBEDTLS_SHA3_256), 0); 185a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_sha3_finish(&ctx, output, 32), 0); 186a8e1175bSopenharmony_ci 187a8e1175bSopenharmony_ciexit: 188a8e1175bSopenharmony_ci return; 189a8e1175bSopenharmony_ci} 190a8e1175bSopenharmony_ci/* END_CASE */ 191a8e1175bSopenharmony_ci 192a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA3_C */ 193a8e1175bSopenharmony_civoid mbedtls_sha3_multi(int family, data_t *in, data_t *hash) 194a8e1175bSopenharmony_ci{ 195a8e1175bSopenharmony_ci unsigned char *output = NULL; 196a8e1175bSopenharmony_ci mbedtls_sha3_context ctx; 197a8e1175bSopenharmony_ci const unsigned int block_size = 256; 198a8e1175bSopenharmony_ci 199a8e1175bSopenharmony_ci TEST_CALLOC(output, hash->len); 200a8e1175bSopenharmony_ci 201a8e1175bSopenharmony_ci mbedtls_sha3_init(&ctx); 202a8e1175bSopenharmony_ci mbedtls_sha3_starts(&ctx, family); 203a8e1175bSopenharmony_ci 204a8e1175bSopenharmony_ci for (size_t l = 0; l < in->len; l += block_size) { 205a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_sha3_update(&ctx, in->x + l, MIN(in->len - l, block_size)) == 0); 206a8e1175bSopenharmony_ci } 207a8e1175bSopenharmony_ci 208a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_sha3_finish(&ctx, output, hash->len) == 0); 209a8e1175bSopenharmony_ci 210a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output, hash->len, hash->x, hash->len); 211a8e1175bSopenharmony_ci 212a8e1175bSopenharmony_ciexit: 213a8e1175bSopenharmony_ci mbedtls_free(output); 214a8e1175bSopenharmony_ci} 215a8e1175bSopenharmony_ci/* END_CASE */ 216a8e1175bSopenharmony_ci 217a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA3_C */ 218a8e1175bSopenharmony_civoid sha3_streaming(int type, data_t *input) 219a8e1175bSopenharmony_ci{ 220a8e1175bSopenharmony_ci mbedtls_sha3_context ctx; 221a8e1175bSopenharmony_ci unsigned char reference_hash[64]; 222a8e1175bSopenharmony_ci unsigned char hash[64]; 223a8e1175bSopenharmony_ci size_t chunk_size; 224a8e1175bSopenharmony_ci size_t hash_length = (type == MBEDTLS_SHA3_224 ? 28 : 225a8e1175bSopenharmony_ci type == MBEDTLS_SHA3_256 ? 32 : 226a8e1175bSopenharmony_ci type == MBEDTLS_SHA3_384 ? 48 : 227a8e1175bSopenharmony_ci type == MBEDTLS_SHA3_512 ? 64 : 228a8e1175bSopenharmony_ci 0); 229a8e1175bSopenharmony_ci 230a8e1175bSopenharmony_ci mbedtls_sha3_init(&ctx); 231a8e1175bSopenharmony_ci memset(reference_hash, 0, sizeof(reference_hash)); 232a8e1175bSopenharmony_ci memset(hash, 0, sizeof(hash)); 233a8e1175bSopenharmony_ci TEST_ASSERT(hash_length != 0); 234a8e1175bSopenharmony_ci 235a8e1175bSopenharmony_ci /* Generate a reference hash */ 236a8e1175bSopenharmony_ci mbedtls_sha3(type, input->x, input->len, reference_hash, hash_length); 237a8e1175bSopenharmony_ci 238a8e1175bSopenharmony_ci /* Repeat each test with increasingly-sized data chunks 239a8e1175bSopenharmony_ci * E.g. start by processing bytes individual bytes, then 2-byte chunks, 240a8e1175bSopenharmony_ci * then 3-byte chunks, and so on... 241a8e1175bSopenharmony_ci * At each test ensure that the same hash is generated. 242a8e1175bSopenharmony_ci */ 243a8e1175bSopenharmony_ci for (chunk_size = 1; chunk_size < input->len; chunk_size++) { 244a8e1175bSopenharmony_ci size_t i; 245a8e1175bSopenharmony_ci size_t remaining = input->len; 246a8e1175bSopenharmony_ci 247a8e1175bSopenharmony_ci mbedtls_sha3_init(&ctx); 248a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_sha3_starts(&ctx, type) == 0); 249a8e1175bSopenharmony_ci 250a8e1175bSopenharmony_ci for (i = 0; i < input->len; i += chunk_size) { 251a8e1175bSopenharmony_ci size_t len = remaining >= chunk_size ? chunk_size : remaining; 252a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_sha3_update(&ctx, input->x + i, len) == 0); 253a8e1175bSopenharmony_ci remaining -= len; 254a8e1175bSopenharmony_ci } 255a8e1175bSopenharmony_ci 256a8e1175bSopenharmony_ci mbedtls_sha3_finish(&ctx, hash, hash_length); 257a8e1175bSopenharmony_ci mbedtls_sha3_free(&ctx); 258a8e1175bSopenharmony_ci 259a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(hash, hash_length, reference_hash, hash_length); 260a8e1175bSopenharmony_ci } 261a8e1175bSopenharmony_ci 262a8e1175bSopenharmony_ciexit: 263a8e1175bSopenharmony_ci mbedtls_sha3_free(&ctx); 264a8e1175bSopenharmony_ci} 265a8e1175bSopenharmony_ci/* END_CASE */ 266a8e1175bSopenharmony_ci 267a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA3_C */ 268a8e1175bSopenharmony_civoid sha3_reuse(data_t *input1, data_t *hash1, 269a8e1175bSopenharmony_ci data_t *input2, data_t *hash2) 270a8e1175bSopenharmony_ci{ 271a8e1175bSopenharmony_ci unsigned char output[64]; 272a8e1175bSopenharmony_ci mbedtls_sha3_context ctx; 273a8e1175bSopenharmony_ci mbedtls_sha3_id type1, type2; 274a8e1175bSopenharmony_ci 275a8e1175bSopenharmony_ci mbedtls_sha3_init(&ctx); 276a8e1175bSopenharmony_ci switch (hash1->len) { 277a8e1175bSopenharmony_ci case 28: type1 = MBEDTLS_SHA3_224; break; 278a8e1175bSopenharmony_ci case 32: type1 = MBEDTLS_SHA3_256; break; 279a8e1175bSopenharmony_ci case 48: type1 = MBEDTLS_SHA3_384; break; 280a8e1175bSopenharmony_ci case 64: type1 = MBEDTLS_SHA3_512; break; 281a8e1175bSopenharmony_ci default: TEST_FAIL("hash1->len validity"); break; 282a8e1175bSopenharmony_ci } 283a8e1175bSopenharmony_ci switch (hash2->len) { 284a8e1175bSopenharmony_ci case 28: type2 = MBEDTLS_SHA3_224; break; 285a8e1175bSopenharmony_ci case 32: type2 = MBEDTLS_SHA3_256; break; 286a8e1175bSopenharmony_ci case 48: type2 = MBEDTLS_SHA3_384; break; 287a8e1175bSopenharmony_ci case 64: type2 = MBEDTLS_SHA3_512; break; 288a8e1175bSopenharmony_ci default: TEST_FAIL("hash2->len validity"); break; 289a8e1175bSopenharmony_ci } 290a8e1175bSopenharmony_ci 291a8e1175bSopenharmony_ci /* Round 1 */ 292a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_sha3_starts(&ctx, type1) == 0); 293a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_sha3_update(&ctx, input1->x, input1->len) == 0); 294a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_sha3_finish(&ctx, output, sizeof(output)) == 0); 295a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output, hash1->len, hash1->x, hash1->len); 296a8e1175bSopenharmony_ci 297a8e1175bSopenharmony_ci /* Round 2 */ 298a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_sha3_starts(&ctx, type2) == 0); 299a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_sha3_update(&ctx, input2->x, input2->len) == 0); 300a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_sha3_finish(&ctx, output, sizeof(output)) == 0); 301a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output, hash2->len, hash2->x, hash2->len); 302a8e1175bSopenharmony_ci 303a8e1175bSopenharmony_ciexit: 304a8e1175bSopenharmony_ci mbedtls_sha3_free(&ctx); 305a8e1175bSopenharmony_ci} 306a8e1175bSopenharmony_ci/* END_CASE */ 307a8e1175bSopenharmony_ci 308a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA3_C:MBEDTLS_SELF_TEST */ 309a8e1175bSopenharmony_civoid sha3_selftest() 310a8e1175bSopenharmony_ci{ 311a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_sha3_self_test(0) == 0); 312a8e1175bSopenharmony_ci} 313a8e1175bSopenharmony_ci/* END_CASE */ 314