1a8e1175bSopenharmony_ci/* BEGIN_HEADER */ 2a8e1175bSopenharmony_ci#include "mbedtls/hmac_drbg.h" 3a8e1175bSopenharmony_ci#include "string.h" 4a8e1175bSopenharmony_ci 5a8e1175bSopenharmony_citypedef struct { 6a8e1175bSopenharmony_ci unsigned char *p; 7a8e1175bSopenharmony_ci size_t len; 8a8e1175bSopenharmony_ci} entropy_ctx; 9a8e1175bSopenharmony_ci 10a8e1175bSopenharmony_cistatic int mbedtls_test_entropy_func(void *data, unsigned char *buf, size_t len) 11a8e1175bSopenharmony_ci{ 12a8e1175bSopenharmony_ci entropy_ctx *ctx = (entropy_ctx *) data; 13a8e1175bSopenharmony_ci 14a8e1175bSopenharmony_ci if (len > ctx->len) { 15a8e1175bSopenharmony_ci return -1; 16a8e1175bSopenharmony_ci } 17a8e1175bSopenharmony_ci 18a8e1175bSopenharmony_ci memcpy(buf, ctx->p, len); 19a8e1175bSopenharmony_ci 20a8e1175bSopenharmony_ci ctx->p += len; 21a8e1175bSopenharmony_ci ctx->len -= len; 22a8e1175bSopenharmony_ci 23a8e1175bSopenharmony_ci return 0; 24a8e1175bSopenharmony_ci} 25a8e1175bSopenharmony_ci/* END_HEADER */ 26a8e1175bSopenharmony_ci 27a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES 28a8e1175bSopenharmony_ci * depends_on:MBEDTLS_HMAC_DRBG_C 29a8e1175bSopenharmony_ci * END_DEPENDENCIES 30a8e1175bSopenharmony_ci */ 31a8e1175bSopenharmony_ci 32a8e1175bSopenharmony_ci/* BEGIN_CASE */ 33a8e1175bSopenharmony_civoid hmac_drbg_entropy_usage(int md_alg) 34a8e1175bSopenharmony_ci{ 35a8e1175bSopenharmony_ci unsigned char out[16]; 36a8e1175bSopenharmony_ci unsigned char buf[1024]; 37a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info; 38a8e1175bSopenharmony_ci mbedtls_hmac_drbg_context ctx; 39a8e1175bSopenharmony_ci entropy_ctx entropy; 40a8e1175bSopenharmony_ci size_t i, reps = 10; 41a8e1175bSopenharmony_ci size_t default_entropy_len; 42a8e1175bSopenharmony_ci size_t expected_consumed_entropy = 0; 43a8e1175bSopenharmony_ci 44a8e1175bSopenharmony_ci MD_PSA_INIT(); 45a8e1175bSopenharmony_ci 46a8e1175bSopenharmony_ci mbedtls_hmac_drbg_init(&ctx); 47a8e1175bSopenharmony_ci memset(buf, 0, sizeof(buf)); 48a8e1175bSopenharmony_ci memset(out, 0, sizeof(out)); 49a8e1175bSopenharmony_ci 50a8e1175bSopenharmony_ci entropy.len = sizeof(buf); 51a8e1175bSopenharmony_ci entropy.p = buf; 52a8e1175bSopenharmony_ci 53a8e1175bSopenharmony_ci md_info = mbedtls_md_info_from_type(md_alg); 54a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 55a8e1175bSopenharmony_ci if (mbedtls_md_get_size(md_info) <= 20) { 56a8e1175bSopenharmony_ci default_entropy_len = 16; 57a8e1175bSopenharmony_ci } else if (mbedtls_md_get_size(md_info) <= 28) { 58a8e1175bSopenharmony_ci default_entropy_len = 24; 59a8e1175bSopenharmony_ci } else { 60a8e1175bSopenharmony_ci default_entropy_len = 32; 61a8e1175bSopenharmony_ci } 62a8e1175bSopenharmony_ci 63a8e1175bSopenharmony_ci /* Set reseed interval before seed */ 64a8e1175bSopenharmony_ci mbedtls_hmac_drbg_set_reseed_interval(&ctx, 2 * reps); 65a8e1175bSopenharmony_ci 66a8e1175bSopenharmony_ci /* Init must use entropy */ 67a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_seed(&ctx, md_info, mbedtls_test_entropy_func, &entropy, 68a8e1175bSopenharmony_ci NULL, 0) == 0); 69a8e1175bSopenharmony_ci /* default_entropy_len of entropy, plus half as much for the nonce */ 70a8e1175bSopenharmony_ci expected_consumed_entropy += default_entropy_len * 3 / 2; 71a8e1175bSopenharmony_ci TEST_EQUAL(sizeof(buf) - entropy.len, expected_consumed_entropy); 72a8e1175bSopenharmony_ci 73a8e1175bSopenharmony_ci /* By default, PR is off, and reseed interval was set to 74a8e1175bSopenharmony_ci * 2 * reps so the next few calls should not use entropy */ 75a8e1175bSopenharmony_ci for (i = 0; i < reps; i++) { 76a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random(&ctx, out, sizeof(out) - 4) == 0); 77a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random_with_add(&ctx, out, sizeof(out) - 4, 78a8e1175bSopenharmony_ci buf, 16) == 0); 79a8e1175bSopenharmony_ci } 80a8e1175bSopenharmony_ci TEST_EQUAL(sizeof(buf) - entropy.len, expected_consumed_entropy); 81a8e1175bSopenharmony_ci 82a8e1175bSopenharmony_ci /* While at it, make sure we didn't write past the requested length */ 83a8e1175bSopenharmony_ci TEST_ASSERT(out[sizeof(out) - 4] == 0); 84a8e1175bSopenharmony_ci TEST_ASSERT(out[sizeof(out) - 3] == 0); 85a8e1175bSopenharmony_ci TEST_ASSERT(out[sizeof(out) - 2] == 0); 86a8e1175bSopenharmony_ci TEST_ASSERT(out[sizeof(out) - 1] == 0); 87a8e1175bSopenharmony_ci 88a8e1175bSopenharmony_ci /* There have been 2 * reps calls to random. The next call should reseed */ 89a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random(&ctx, out, sizeof(out)) == 0); 90a8e1175bSopenharmony_ci expected_consumed_entropy += default_entropy_len; 91a8e1175bSopenharmony_ci TEST_EQUAL(sizeof(buf) - entropy.len, expected_consumed_entropy); 92a8e1175bSopenharmony_ci 93a8e1175bSopenharmony_ci /* Set reseed interval after seed */ 94a8e1175bSopenharmony_ci mbedtls_hmac_drbg_set_reseed_interval(&ctx, 4 * reps + 1); 95a8e1175bSopenharmony_ci 96a8e1175bSopenharmony_ci /* The new few calls should not reseed */ 97a8e1175bSopenharmony_ci for (i = 0; i < (2 * reps); i++) { 98a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random(&ctx, out, sizeof(out)) == 0); 99a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random_with_add(&ctx, out, sizeof(out), 100a8e1175bSopenharmony_ci buf, 16) == 0); 101a8e1175bSopenharmony_ci } 102a8e1175bSopenharmony_ci TEST_EQUAL(sizeof(buf) - entropy.len, expected_consumed_entropy); 103a8e1175bSopenharmony_ci 104a8e1175bSopenharmony_ci /* Now enable PR, so the next few calls should all reseed */ 105a8e1175bSopenharmony_ci mbedtls_hmac_drbg_set_prediction_resistance(&ctx, MBEDTLS_HMAC_DRBG_PR_ON); 106a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random(&ctx, out, sizeof(out)) == 0); 107a8e1175bSopenharmony_ci expected_consumed_entropy += default_entropy_len; 108a8e1175bSopenharmony_ci TEST_EQUAL(sizeof(buf) - entropy.len, expected_consumed_entropy); 109a8e1175bSopenharmony_ci 110a8e1175bSopenharmony_ci /* Finally, check setting entropy_len */ 111a8e1175bSopenharmony_ci mbedtls_hmac_drbg_set_entropy_len(&ctx, 42); 112a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random(&ctx, out, sizeof(out)) == 0); 113a8e1175bSopenharmony_ci expected_consumed_entropy += 42; 114a8e1175bSopenharmony_ci TEST_EQUAL(sizeof(buf) - entropy.len, expected_consumed_entropy); 115a8e1175bSopenharmony_ci 116a8e1175bSopenharmony_ci mbedtls_hmac_drbg_set_entropy_len(&ctx, 13); 117a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random(&ctx, out, sizeof(out)) == 0); 118a8e1175bSopenharmony_ci expected_consumed_entropy += 13; 119a8e1175bSopenharmony_ci TEST_EQUAL(sizeof(buf) - entropy.len, expected_consumed_entropy); 120a8e1175bSopenharmony_ci 121a8e1175bSopenharmony_ciexit: 122a8e1175bSopenharmony_ci mbedtls_hmac_drbg_free(&ctx); 123a8e1175bSopenharmony_ci MD_PSA_DONE(); 124a8e1175bSopenharmony_ci} 125a8e1175bSopenharmony_ci/* END_CASE */ 126a8e1175bSopenharmony_ci 127a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */ 128a8e1175bSopenharmony_civoid hmac_drbg_seed_file(int md_alg, char *path, int ret) 129a8e1175bSopenharmony_ci{ 130a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info; 131a8e1175bSopenharmony_ci mbedtls_hmac_drbg_context ctx; 132a8e1175bSopenharmony_ci 133a8e1175bSopenharmony_ci MD_PSA_INIT(); 134a8e1175bSopenharmony_ci 135a8e1175bSopenharmony_ci mbedtls_hmac_drbg_init(&ctx); 136a8e1175bSopenharmony_ci 137a8e1175bSopenharmony_ci md_info = mbedtls_md_info_from_type(md_alg); 138a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 139a8e1175bSopenharmony_ci 140a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_seed(&ctx, md_info, 141a8e1175bSopenharmony_ci mbedtls_test_rnd_std_rand, NULL, 142a8e1175bSopenharmony_ci NULL, 0) == 0); 143a8e1175bSopenharmony_ci 144a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_write_seed_file(&ctx, path) == ret); 145a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_update_seed_file(&ctx, path) == ret); 146a8e1175bSopenharmony_ci 147a8e1175bSopenharmony_ciexit: 148a8e1175bSopenharmony_ci mbedtls_hmac_drbg_free(&ctx); 149a8e1175bSopenharmony_ci MD_PSA_DONE(); 150a8e1175bSopenharmony_ci} 151a8e1175bSopenharmony_ci/* END_CASE */ 152a8e1175bSopenharmony_ci 153a8e1175bSopenharmony_ci/* BEGIN_CASE */ 154a8e1175bSopenharmony_civoid hmac_drbg_buf(int md_alg) 155a8e1175bSopenharmony_ci{ 156a8e1175bSopenharmony_ci unsigned char out[16]; 157a8e1175bSopenharmony_ci unsigned char buf[100]; 158a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info; 159a8e1175bSopenharmony_ci mbedtls_hmac_drbg_context ctx; 160a8e1175bSopenharmony_ci size_t i; 161a8e1175bSopenharmony_ci 162a8e1175bSopenharmony_ci MD_PSA_INIT(); 163a8e1175bSopenharmony_ci 164a8e1175bSopenharmony_ci mbedtls_hmac_drbg_init(&ctx); 165a8e1175bSopenharmony_ci memset(buf, 0, sizeof(buf)); 166a8e1175bSopenharmony_ci memset(out, 0, sizeof(out)); 167a8e1175bSopenharmony_ci 168a8e1175bSopenharmony_ci md_info = mbedtls_md_info_from_type(md_alg); 169a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 170a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_seed_buf(&ctx, md_info, buf, sizeof(buf)) == 0); 171a8e1175bSopenharmony_ci 172a8e1175bSopenharmony_ci /* Make sure it never tries to reseed (would segfault otherwise) */ 173a8e1175bSopenharmony_ci mbedtls_hmac_drbg_set_reseed_interval(&ctx, 3); 174a8e1175bSopenharmony_ci mbedtls_hmac_drbg_set_prediction_resistance(&ctx, MBEDTLS_HMAC_DRBG_PR_ON); 175a8e1175bSopenharmony_ci 176a8e1175bSopenharmony_ci for (i = 0; i < 30; i++) { 177a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random(&ctx, out, sizeof(out)) == 0); 178a8e1175bSopenharmony_ci } 179a8e1175bSopenharmony_ci 180a8e1175bSopenharmony_ciexit: 181a8e1175bSopenharmony_ci mbedtls_hmac_drbg_free(&ctx); 182a8e1175bSopenharmony_ci MD_PSA_DONE(); 183a8e1175bSopenharmony_ci} 184a8e1175bSopenharmony_ci/* END_CASE */ 185a8e1175bSopenharmony_ci 186a8e1175bSopenharmony_ci/* BEGIN_CASE */ 187a8e1175bSopenharmony_civoid hmac_drbg_no_reseed(int md_alg, data_t *entropy, 188a8e1175bSopenharmony_ci data_t *custom, data_t *add1, 189a8e1175bSopenharmony_ci data_t *add2, data_t *output) 190a8e1175bSopenharmony_ci{ 191a8e1175bSopenharmony_ci unsigned char data[1024]; 192a8e1175bSopenharmony_ci unsigned char my_output[512]; 193a8e1175bSopenharmony_ci entropy_ctx p_entropy; 194a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info; 195a8e1175bSopenharmony_ci mbedtls_hmac_drbg_context ctx; 196a8e1175bSopenharmony_ci 197a8e1175bSopenharmony_ci MD_PSA_INIT(); 198a8e1175bSopenharmony_ci 199a8e1175bSopenharmony_ci mbedtls_hmac_drbg_init(&ctx); 200a8e1175bSopenharmony_ci 201a8e1175bSopenharmony_ci p_entropy.p = entropy->x; 202a8e1175bSopenharmony_ci p_entropy.len = entropy->len; 203a8e1175bSopenharmony_ci 204a8e1175bSopenharmony_ci md_info = mbedtls_md_info_from_type(md_alg); 205a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 206a8e1175bSopenharmony_ci 207a8e1175bSopenharmony_ci /* Test the simplified buffer-based variant */ 208a8e1175bSopenharmony_ci memcpy(data, entropy->x, p_entropy.len); 209a8e1175bSopenharmony_ci memcpy(data + p_entropy.len, custom->x, custom->len); 210a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_seed_buf(&ctx, md_info, 211a8e1175bSopenharmony_ci data, p_entropy.len + custom->len) == 0); 212a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random_with_add(&ctx, my_output, output->len, 213a8e1175bSopenharmony_ci add1->x, add1->len) == 0); 214a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random_with_add(&ctx, my_output, output->len, 215a8e1175bSopenharmony_ci add2->x, add2->len) == 0); 216a8e1175bSopenharmony_ci 217a8e1175bSopenharmony_ci /* Reset context for second run */ 218a8e1175bSopenharmony_ci mbedtls_hmac_drbg_free(&ctx); 219a8e1175bSopenharmony_ci 220a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(my_output, output->x, output->len) == 0); 221a8e1175bSopenharmony_ci 222a8e1175bSopenharmony_ci /* And now the normal entropy-based variant */ 223a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_seed(&ctx, md_info, mbedtls_test_entropy_func, &p_entropy, 224a8e1175bSopenharmony_ci custom->x, custom->len) == 0); 225a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random_with_add(&ctx, my_output, output->len, 226a8e1175bSopenharmony_ci add1->x, add1->len) == 0); 227a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random_with_add(&ctx, my_output, output->len, 228a8e1175bSopenharmony_ci add2->x, add2->len) == 0); 229a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(my_output, output->x, output->len) == 0); 230a8e1175bSopenharmony_ci 231a8e1175bSopenharmony_ciexit: 232a8e1175bSopenharmony_ci mbedtls_hmac_drbg_free(&ctx); 233a8e1175bSopenharmony_ci MD_PSA_DONE(); 234a8e1175bSopenharmony_ci} 235a8e1175bSopenharmony_ci/* END_CASE */ 236a8e1175bSopenharmony_ci 237a8e1175bSopenharmony_ci/* BEGIN_CASE */ 238a8e1175bSopenharmony_civoid hmac_drbg_nopr(int md_alg, data_t *entropy, data_t *custom, 239a8e1175bSopenharmony_ci data_t *add1, data_t *add2, data_t *add3, 240a8e1175bSopenharmony_ci data_t *output) 241a8e1175bSopenharmony_ci{ 242a8e1175bSopenharmony_ci unsigned char my_output[512]; 243a8e1175bSopenharmony_ci entropy_ctx p_entropy; 244a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info; 245a8e1175bSopenharmony_ci mbedtls_hmac_drbg_context ctx; 246a8e1175bSopenharmony_ci 247a8e1175bSopenharmony_ci MD_PSA_INIT(); 248a8e1175bSopenharmony_ci 249a8e1175bSopenharmony_ci mbedtls_hmac_drbg_init(&ctx); 250a8e1175bSopenharmony_ci 251a8e1175bSopenharmony_ci p_entropy.p = entropy->x; 252a8e1175bSopenharmony_ci p_entropy.len = entropy->len; 253a8e1175bSopenharmony_ci 254a8e1175bSopenharmony_ci md_info = mbedtls_md_info_from_type(md_alg); 255a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 256a8e1175bSopenharmony_ci 257a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_seed(&ctx, md_info, mbedtls_test_entropy_func, &p_entropy, 258a8e1175bSopenharmony_ci custom->x, custom->len) == 0); 259a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_reseed(&ctx, add1->x, add1->len) == 0); 260a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random_with_add(&ctx, my_output, output->len, 261a8e1175bSopenharmony_ci add2->x, add2->len) == 0); 262a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random_with_add(&ctx, my_output, output->len, 263a8e1175bSopenharmony_ci add3->x, add3->len) == 0); 264a8e1175bSopenharmony_ci 265a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(my_output, output->x, output->len) == 0); 266a8e1175bSopenharmony_ci 267a8e1175bSopenharmony_ciexit: 268a8e1175bSopenharmony_ci mbedtls_hmac_drbg_free(&ctx); 269a8e1175bSopenharmony_ci MD_PSA_DONE(); 270a8e1175bSopenharmony_ci} 271a8e1175bSopenharmony_ci/* END_CASE */ 272a8e1175bSopenharmony_ci 273a8e1175bSopenharmony_ci/* BEGIN_CASE */ 274a8e1175bSopenharmony_civoid hmac_drbg_pr(int md_alg, data_t *entropy, data_t *custom, 275a8e1175bSopenharmony_ci data_t *add1, data_t *add2, data_t *output) 276a8e1175bSopenharmony_ci{ 277a8e1175bSopenharmony_ci unsigned char my_output[512]; 278a8e1175bSopenharmony_ci entropy_ctx p_entropy; 279a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info; 280a8e1175bSopenharmony_ci mbedtls_hmac_drbg_context ctx; 281a8e1175bSopenharmony_ci 282a8e1175bSopenharmony_ci MD_PSA_INIT(); 283a8e1175bSopenharmony_ci 284a8e1175bSopenharmony_ci mbedtls_hmac_drbg_init(&ctx); 285a8e1175bSopenharmony_ci 286a8e1175bSopenharmony_ci p_entropy.p = entropy->x; 287a8e1175bSopenharmony_ci p_entropy.len = entropy->len; 288a8e1175bSopenharmony_ci 289a8e1175bSopenharmony_ci md_info = mbedtls_md_info_from_type(md_alg); 290a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 291a8e1175bSopenharmony_ci 292a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_seed(&ctx, md_info, mbedtls_test_entropy_func, &p_entropy, 293a8e1175bSopenharmony_ci custom->x, custom->len) == 0); 294a8e1175bSopenharmony_ci mbedtls_hmac_drbg_set_prediction_resistance(&ctx, MBEDTLS_HMAC_DRBG_PR_ON); 295a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random_with_add(&ctx, my_output, output->len, 296a8e1175bSopenharmony_ci add1->x, add1->len) == 0); 297a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_random_with_add(&ctx, my_output, output->len, 298a8e1175bSopenharmony_ci add2->x, add2->len) == 0); 299a8e1175bSopenharmony_ci 300a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(my_output, output->x, output->len) == 0); 301a8e1175bSopenharmony_ci 302a8e1175bSopenharmony_ciexit: 303a8e1175bSopenharmony_ci mbedtls_hmac_drbg_free(&ctx); 304a8e1175bSopenharmony_ci MD_PSA_DONE(); 305a8e1175bSopenharmony_ci} 306a8e1175bSopenharmony_ci/* END_CASE */ 307a8e1175bSopenharmony_ci 308a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */ 309a8e1175bSopenharmony_civoid hmac_drbg_selftest() 310a8e1175bSopenharmony_ci{ 311a8e1175bSopenharmony_ci MD_PSA_INIT(); 312a8e1175bSopenharmony_ci 313a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_hmac_drbg_self_test(1) == 0); 314a8e1175bSopenharmony_ci 315a8e1175bSopenharmony_ciexit: 316a8e1175bSopenharmony_ci MD_PSA_DONE(); 317a8e1175bSopenharmony_ci} 318a8e1175bSopenharmony_ci/* END_CASE */ 319