1*62c56f98SSadaf Ebrahimi/* BEGIN_HEADER */ 2*62c56f98SSadaf Ebrahimi#include "mbedtls/cipher.h" 3*62c56f98SSadaf Ebrahimi#include "mbedtls/cmac.h" 4*62c56f98SSadaf Ebrahimi/* END_HEADER */ 5*62c56f98SSadaf Ebrahimi 6*62c56f98SSadaf Ebrahimi/* BEGIN_DEPENDENCIES 7*62c56f98SSadaf Ebrahimi * depends_on:MBEDTLS_CMAC_C 8*62c56f98SSadaf Ebrahimi * END_DEPENDENCIES 9*62c56f98SSadaf Ebrahimi */ 10*62c56f98SSadaf Ebrahimi 11*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */ 12*62c56f98SSadaf Ebrahimivoid mbedtls_cmac_self_test() 13*62c56f98SSadaf Ebrahimi{ 14*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cmac_self_test(1) == 0); 15*62c56f98SSadaf Ebrahimi} 16*62c56f98SSadaf Ebrahimi/* END_CASE */ 17*62c56f98SSadaf Ebrahimi 18*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 19*62c56f98SSadaf Ebrahimivoid mbedtls_cmac_null_args() 20*62c56f98SSadaf Ebrahimi{ 21*62c56f98SSadaf Ebrahimi mbedtls_cipher_context_t ctx; 22*62c56f98SSadaf Ebrahimi const mbedtls_cipher_info_t *cipher_info; 23*62c56f98SSadaf Ebrahimi unsigned char test_key[MBEDTLS_CMAC_MAX_BLOCK_SIZE]; 24*62c56f98SSadaf Ebrahimi unsigned char test_data[MBEDTLS_CMAC_MAX_BLOCK_SIZE]; 25*62c56f98SSadaf Ebrahimi unsigned char test_output[MBEDTLS_CMAC_MAX_BLOCK_SIZE]; 26*62c56f98SSadaf Ebrahimi 27*62c56f98SSadaf Ebrahimi mbedtls_cipher_init(&ctx); 28*62c56f98SSadaf Ebrahimi 29*62c56f98SSadaf Ebrahimi /* Test NULL cipher info */ 30*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, test_data, 16) == 31*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 32*62c56f98SSadaf Ebrahimi 33*62c56f98SSadaf Ebrahimi cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_ECB); 34*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_setup(&ctx, cipher_info) == 0); 35*62c56f98SSadaf Ebrahimi 36*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_starts(NULL, test_key, 128) == 37*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 38*62c56f98SSadaf Ebrahimi 39*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_starts(&ctx, NULL, 128) == 40*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 41*62c56f98SSadaf Ebrahimi 42*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_update(NULL, test_data, 16) == 43*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 44*62c56f98SSadaf Ebrahimi 45*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, NULL, 16) == 46*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 47*62c56f98SSadaf Ebrahimi 48*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_finish(NULL, test_output) == 49*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 50*62c56f98SSadaf Ebrahimi 51*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, NULL) == 52*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 53*62c56f98SSadaf Ebrahimi 54*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_reset(NULL) == 55*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 56*62c56f98SSadaf Ebrahimi 57*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac(NULL, 58*62c56f98SSadaf Ebrahimi test_key, 128, 59*62c56f98SSadaf Ebrahimi test_data, 16, 60*62c56f98SSadaf Ebrahimi test_output) == 61*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 62*62c56f98SSadaf Ebrahimi 63*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac(cipher_info, 64*62c56f98SSadaf Ebrahimi NULL, 128, 65*62c56f98SSadaf Ebrahimi test_data, 16, 66*62c56f98SSadaf Ebrahimi test_output) == 67*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 68*62c56f98SSadaf Ebrahimi 69*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac(cipher_info, 70*62c56f98SSadaf Ebrahimi test_key, 128, 71*62c56f98SSadaf Ebrahimi NULL, 16, 72*62c56f98SSadaf Ebrahimi test_output) == 73*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 74*62c56f98SSadaf Ebrahimi 75*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac(cipher_info, 76*62c56f98SSadaf Ebrahimi test_key, 128, 77*62c56f98SSadaf Ebrahimi test_data, 16, 78*62c56f98SSadaf Ebrahimi NULL) == 79*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 80*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_AES_C) 81*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_aes_cmac_prf_128(NULL, 16, 82*62c56f98SSadaf Ebrahimi test_data, 16, 83*62c56f98SSadaf Ebrahimi test_output) == 84*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 85*62c56f98SSadaf Ebrahimi 86*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_aes_cmac_prf_128(test_key, 16, 87*62c56f98SSadaf Ebrahimi NULL, 16, 88*62c56f98SSadaf Ebrahimi test_output) == 89*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 90*62c56f98SSadaf Ebrahimi 91*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_aes_cmac_prf_128(test_key, 16, 92*62c56f98SSadaf Ebrahimi test_data, 16, 93*62c56f98SSadaf Ebrahimi NULL) == 94*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 95*62c56f98SSadaf Ebrahimi#endif 96*62c56f98SSadaf Ebrahimiexit: 97*62c56f98SSadaf Ebrahimi mbedtls_cipher_free(&ctx); 98*62c56f98SSadaf Ebrahimi} 99*62c56f98SSadaf Ebrahimi/* END_CASE */ 100*62c56f98SSadaf Ebrahimi 101*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 102*62c56f98SSadaf Ebrahimivoid mbedtls_cmac_setkey(int cipher_type, int key_size, int result) 103*62c56f98SSadaf Ebrahimi{ 104*62c56f98SSadaf Ebrahimi const mbedtls_cipher_info_t *cipher_info; 105*62c56f98SSadaf Ebrahimi unsigned char key[32]; 106*62c56f98SSadaf Ebrahimi unsigned char buf[16]; 107*62c56f98SSadaf Ebrahimi unsigned char tmp[16]; 108*62c56f98SSadaf Ebrahimi 109*62c56f98SSadaf Ebrahimi memset(key, 0x2A, sizeof(key)); 110*62c56f98SSadaf Ebrahimi TEST_ASSERT((unsigned) key_size <= 8 * sizeof(key)); 111*62c56f98SSadaf Ebrahimi 112*62c56f98SSadaf Ebrahimi TEST_ASSERT((cipher_info = mbedtls_cipher_info_from_type(cipher_type)) 113*62c56f98SSadaf Ebrahimi != NULL); 114*62c56f98SSadaf Ebrahimi#if !defined(MBEDTLS_DEPRECATED_REMOVED) 115*62c56f98SSadaf Ebrahimi TEST_LE_U(mbedtls_cipher_info_get_block_size(cipher_info), 116*62c56f98SSadaf Ebrahimi MBEDTLS_CIPHER_BLKSIZE_MAX); 117*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_DEPRECATED_REMOVED */ 118*62c56f98SSadaf Ebrahimi TEST_LE_U(mbedtls_cipher_info_get_block_size(cipher_info), 119*62c56f98SSadaf Ebrahimi MBEDTLS_CMAC_MAX_BLOCK_SIZE); 120*62c56f98SSadaf Ebrahimi 121*62c56f98SSadaf Ebrahimi memset(buf, 0x2A, sizeof(buf)); 122*62c56f98SSadaf Ebrahimi TEST_ASSERT((result == mbedtls_cipher_cmac(cipher_info, key, key_size, 123*62c56f98SSadaf Ebrahimi buf, 16, tmp)) != 0); 124*62c56f98SSadaf Ebrahimi} 125*62c56f98SSadaf Ebrahimi/* END_CASE */ 126*62c56f98SSadaf Ebrahimi 127*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 128*62c56f98SSadaf Ebrahimivoid mbedtls_cmac_multiple_blocks(int cipher_type, data_t *key, 129*62c56f98SSadaf Ebrahimi int keybits, int block_size, 130*62c56f98SSadaf Ebrahimi data_t *block1, int block1_len, 131*62c56f98SSadaf Ebrahimi data_t *block2, int block2_len, 132*62c56f98SSadaf Ebrahimi data_t *block3, int block3_len, 133*62c56f98SSadaf Ebrahimi data_t *block4, int block4_len, 134*62c56f98SSadaf Ebrahimi data_t *expected_result) 135*62c56f98SSadaf Ebrahimi{ 136*62c56f98SSadaf Ebrahimi const mbedtls_cipher_info_t *cipher_info; 137*62c56f98SSadaf Ebrahimi mbedtls_cipher_context_t ctx; 138*62c56f98SSadaf Ebrahimi unsigned char output[MBEDTLS_CMAC_MAX_BLOCK_SIZE]; 139*62c56f98SSadaf Ebrahimi 140*62c56f98SSadaf Ebrahimi /* Convert the test parameters to binary data */ 141*62c56f98SSadaf Ebrahimi 142*62c56f98SSadaf Ebrahimi mbedtls_cipher_init(&ctx); 143*62c56f98SSadaf Ebrahimi 144*62c56f98SSadaf Ebrahimi /* Validate the test inputs */ 145*62c56f98SSadaf Ebrahimi TEST_ASSERT(block1_len <= 100); 146*62c56f98SSadaf Ebrahimi TEST_ASSERT(block2_len <= 100); 147*62c56f98SSadaf Ebrahimi TEST_ASSERT(block3_len <= 100); 148*62c56f98SSadaf Ebrahimi TEST_ASSERT(block4_len <= 100); 149*62c56f98SSadaf Ebrahimi 150*62c56f98SSadaf Ebrahimi /* Set up */ 151*62c56f98SSadaf Ebrahimi TEST_ASSERT((cipher_info = mbedtls_cipher_info_from_type(cipher_type)) 152*62c56f98SSadaf Ebrahimi != NULL); 153*62c56f98SSadaf Ebrahimi 154*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_setup(&ctx, cipher_info) == 0); 155*62c56f98SSadaf Ebrahimi 156*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_starts(&ctx, 157*62c56f98SSadaf Ebrahimi (const unsigned char *) key->x, 158*62c56f98SSadaf Ebrahimi keybits) == 0); 159*62c56f98SSadaf Ebrahimi 160*62c56f98SSadaf Ebrahimi /* Multiple partial and complete blocks. A negative length means skip the 161*62c56f98SSadaf Ebrahimi * update operation */ 162*62c56f98SSadaf Ebrahimi if (block1_len >= 0) { 163*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 164*62c56f98SSadaf Ebrahimi (unsigned char *) block1->x, 165*62c56f98SSadaf Ebrahimi block1_len) == 0); 166*62c56f98SSadaf Ebrahimi } 167*62c56f98SSadaf Ebrahimi 168*62c56f98SSadaf Ebrahimi if (block2_len >= 0) { 169*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 170*62c56f98SSadaf Ebrahimi (unsigned char *) block2->x, 171*62c56f98SSadaf Ebrahimi block2_len) == 0); 172*62c56f98SSadaf Ebrahimi } 173*62c56f98SSadaf Ebrahimi 174*62c56f98SSadaf Ebrahimi if (block3_len >= 0) { 175*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 176*62c56f98SSadaf Ebrahimi (unsigned char *) block3->x, 177*62c56f98SSadaf Ebrahimi block3_len) == 0); 178*62c56f98SSadaf Ebrahimi } 179*62c56f98SSadaf Ebrahimi 180*62c56f98SSadaf Ebrahimi if (block4_len >= 0) { 181*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 182*62c56f98SSadaf Ebrahimi (unsigned char *) block4->x, 183*62c56f98SSadaf Ebrahimi block4_len) == 0); 184*62c56f98SSadaf Ebrahimi } 185*62c56f98SSadaf Ebrahimi 186*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, output) == 0); 187*62c56f98SSadaf Ebrahimi 188*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(output, expected_result->x, block_size) == 0); 189*62c56f98SSadaf Ebrahimi 190*62c56f98SSadaf Ebrahimiexit: 191*62c56f98SSadaf Ebrahimi mbedtls_cipher_free(&ctx); 192*62c56f98SSadaf Ebrahimi} 193*62c56f98SSadaf Ebrahimi/* END_CASE */ 194*62c56f98SSadaf Ebrahimi 195*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 196*62c56f98SSadaf Ebrahimivoid mbedtls_cmac_multiple_operations_same_key(int cipher_type, 197*62c56f98SSadaf Ebrahimi data_t *key, int keybits, 198*62c56f98SSadaf Ebrahimi int block_size, 199*62c56f98SSadaf Ebrahimi data_t *block_a1, 200*62c56f98SSadaf Ebrahimi int block_a1_len, 201*62c56f98SSadaf Ebrahimi data_t *block_a2, 202*62c56f98SSadaf Ebrahimi int block_a2_len, 203*62c56f98SSadaf Ebrahimi data_t *block_a3, 204*62c56f98SSadaf Ebrahimi int block_a3_len, 205*62c56f98SSadaf Ebrahimi data_t *expected_result_a, 206*62c56f98SSadaf Ebrahimi data_t *block_b1, 207*62c56f98SSadaf Ebrahimi int block_b1_len, 208*62c56f98SSadaf Ebrahimi data_t *block_b2, 209*62c56f98SSadaf Ebrahimi int block_b2_len, 210*62c56f98SSadaf Ebrahimi data_t *block_b3, 211*62c56f98SSadaf Ebrahimi int block_b3_len, 212*62c56f98SSadaf Ebrahimi data_t *expected_result_b 213*62c56f98SSadaf Ebrahimi ) 214*62c56f98SSadaf Ebrahimi{ 215*62c56f98SSadaf Ebrahimi const mbedtls_cipher_info_t *cipher_info; 216*62c56f98SSadaf Ebrahimi mbedtls_cipher_context_t ctx; 217*62c56f98SSadaf Ebrahimi unsigned char output[MBEDTLS_CMAC_MAX_BLOCK_SIZE]; 218*62c56f98SSadaf Ebrahimi 219*62c56f98SSadaf Ebrahimi /* Convert the test parameters to binary data */ 220*62c56f98SSadaf Ebrahimi 221*62c56f98SSadaf Ebrahimi 222*62c56f98SSadaf Ebrahimi 223*62c56f98SSadaf Ebrahimi mbedtls_cipher_init(&ctx); 224*62c56f98SSadaf Ebrahimi 225*62c56f98SSadaf Ebrahimi /* Validate the test inputs */ 226*62c56f98SSadaf Ebrahimi TEST_ASSERT(block_a1_len <= 100); 227*62c56f98SSadaf Ebrahimi TEST_ASSERT(block_a2_len <= 100); 228*62c56f98SSadaf Ebrahimi TEST_ASSERT(block_a3_len <= 100); 229*62c56f98SSadaf Ebrahimi 230*62c56f98SSadaf Ebrahimi TEST_ASSERT(block_b1_len <= 100); 231*62c56f98SSadaf Ebrahimi TEST_ASSERT(block_b2_len <= 100); 232*62c56f98SSadaf Ebrahimi TEST_ASSERT(block_b3_len <= 100); 233*62c56f98SSadaf Ebrahimi 234*62c56f98SSadaf Ebrahimi /* Set up */ 235*62c56f98SSadaf Ebrahimi TEST_ASSERT((cipher_info = mbedtls_cipher_info_from_type(cipher_type)) 236*62c56f98SSadaf Ebrahimi != NULL); 237*62c56f98SSadaf Ebrahimi 238*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_setup(&ctx, cipher_info) == 0); 239*62c56f98SSadaf Ebrahimi 240*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_starts(&ctx, 241*62c56f98SSadaf Ebrahimi (const unsigned char *) key->x, 242*62c56f98SSadaf Ebrahimi keybits) == 0); 243*62c56f98SSadaf Ebrahimi 244*62c56f98SSadaf Ebrahimi /* Sequence A */ 245*62c56f98SSadaf Ebrahimi 246*62c56f98SSadaf Ebrahimi /* Multiple partial and complete blocks. A negative length means skip the 247*62c56f98SSadaf Ebrahimi * update operation */ 248*62c56f98SSadaf Ebrahimi if (block_a1_len >= 0) { 249*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 250*62c56f98SSadaf Ebrahimi (unsigned char *) block_a1->x, 251*62c56f98SSadaf Ebrahimi block_a1_len) == 0); 252*62c56f98SSadaf Ebrahimi } 253*62c56f98SSadaf Ebrahimi 254*62c56f98SSadaf Ebrahimi if (block_a2_len >= 0) { 255*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 256*62c56f98SSadaf Ebrahimi (unsigned char *) block_a2->x, 257*62c56f98SSadaf Ebrahimi block_a2_len) == 0); 258*62c56f98SSadaf Ebrahimi } 259*62c56f98SSadaf Ebrahimi 260*62c56f98SSadaf Ebrahimi if (block_a3_len >= 0) { 261*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 262*62c56f98SSadaf Ebrahimi (unsigned char *) block_a3->x, 263*62c56f98SSadaf Ebrahimi block_a3_len) == 0); 264*62c56f98SSadaf Ebrahimi } 265*62c56f98SSadaf Ebrahimi 266*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, output) == 0); 267*62c56f98SSadaf Ebrahimi 268*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(output, expected_result_a->x, block_size) == 0); 269*62c56f98SSadaf Ebrahimi 270*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_reset(&ctx) == 0); 271*62c56f98SSadaf Ebrahimi 272*62c56f98SSadaf Ebrahimi /* Sequence B */ 273*62c56f98SSadaf Ebrahimi 274*62c56f98SSadaf Ebrahimi /* Multiple partial and complete blocks. A negative length means skip the 275*62c56f98SSadaf Ebrahimi * update operation */ 276*62c56f98SSadaf Ebrahimi if (block_b1_len >= 0) { 277*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 278*62c56f98SSadaf Ebrahimi (unsigned char *) block_b1->x, 279*62c56f98SSadaf Ebrahimi block_b1_len) == 0); 280*62c56f98SSadaf Ebrahimi } 281*62c56f98SSadaf Ebrahimi 282*62c56f98SSadaf Ebrahimi if (block_b2_len >= 0) { 283*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 284*62c56f98SSadaf Ebrahimi (unsigned char *) block_b2->x, 285*62c56f98SSadaf Ebrahimi block_b2_len) == 0); 286*62c56f98SSadaf Ebrahimi } 287*62c56f98SSadaf Ebrahimi 288*62c56f98SSadaf Ebrahimi if (block_b3_len >= 0) { 289*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 290*62c56f98SSadaf Ebrahimi (unsigned char *) block_b3->x, 291*62c56f98SSadaf Ebrahimi block_b3_len) == 0); 292*62c56f98SSadaf Ebrahimi } 293*62c56f98SSadaf Ebrahimi 294*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, output) == 0); 295*62c56f98SSadaf Ebrahimi 296*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(output, expected_result_b->x, block_size) == 0); 297*62c56f98SSadaf Ebrahimi 298*62c56f98SSadaf Ebrahimiexit: 299*62c56f98SSadaf Ebrahimi mbedtls_cipher_free(&ctx); 300*62c56f98SSadaf Ebrahimi} 301*62c56f98SSadaf Ebrahimi/* END_CASE */ 302