1f64adb67SMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause 2f64adb67SMarko Kovacevic * Copyright(c) 2018 Intel Corporation 3f64adb67SMarko Kovacevic */ 4f64adb67SMarko Kovacevic 5f64adb67SMarko Kovacevic #include <string.h> 6f64adb67SMarko Kovacevic #include <time.h> 7f64adb67SMarko Kovacevic #include <stdio.h> 8f64adb67SMarko Kovacevic 9f64adb67SMarko Kovacevic #include <rte_cryptodev.h> 10f64adb67SMarko Kovacevic 11f64adb67SMarko Kovacevic #include "fips_validation.h" 12f64adb67SMarko Kovacevic 13f64adb67SMarko Kovacevic #define ALGO_PREFIX "[L=" 14f64adb67SMarko Kovacevic #define KEYLEN_STR "Klen = " 15f64adb67SMarko Kovacevic #define TAGLEN_STR "Tlen = " 16f64adb67SMarko Kovacevic 17f64adb67SMarko Kovacevic #define COUNT_STR "Count = " 18f64adb67SMarko Kovacevic #define KEY_STR "Key = " 19f64adb67SMarko Kovacevic #define PT_STR "Msg = " 20f64adb67SMarko Kovacevic #define TAG_STR "Mac = " 21f64adb67SMarko Kovacevic 22f64adb67SMarko Kovacevic struct hash_size_conversion { 23f64adb67SMarko Kovacevic const char *str; 24f64adb67SMarko Kovacevic enum rte_crypto_auth_algorithm algo; 25f64adb67SMarko Kovacevic } hsc[] = { 26f64adb67SMarko Kovacevic {"20", RTE_CRYPTO_AUTH_SHA1_HMAC}, 27f64adb67SMarko Kovacevic {"28", RTE_CRYPTO_AUTH_SHA224_HMAC}, 28f64adb67SMarko Kovacevic {"32", RTE_CRYPTO_AUTH_SHA256_HMAC}, 29f64adb67SMarko Kovacevic {"48", RTE_CRYPTO_AUTH_SHA384_HMAC}, 30f64adb67SMarko Kovacevic {"64", RTE_CRYPTO_AUTH_SHA512_HMAC}, 31f64adb67SMarko Kovacevic }; 32f64adb67SMarko Kovacevic 33f64adb67SMarko Kovacevic static int 34*f2fc83b4SThomas Monjalon parse_interim_algo(__rte_unused const char *key, 35f64adb67SMarko Kovacevic char *text, 36*f2fc83b4SThomas Monjalon __rte_unused struct fips_val *val) 37f64adb67SMarko Kovacevic { 38f64adb67SMarko Kovacevic 39f64adb67SMarko Kovacevic uint32_t i; 40f64adb67SMarko Kovacevic 41f64adb67SMarko Kovacevic for (i = 0; i < RTE_DIM(hsc); i++) { 42f64adb67SMarko Kovacevic if (strstr(text, hsc[i].str)) { 43f64adb67SMarko Kovacevic info.interim_info.hmac_data.algo = hsc[i].algo; 44f64adb67SMarko Kovacevic break; 45f64adb67SMarko Kovacevic } 46f64adb67SMarko Kovacevic } 47f64adb67SMarko Kovacevic 48f64adb67SMarko Kovacevic if (i == RTE_DIM(hsc)) 49f64adb67SMarko Kovacevic return -1; 50f64adb67SMarko Kovacevic 51f64adb67SMarko Kovacevic return 0; 52f64adb67SMarko Kovacevic } 53f64adb67SMarko Kovacevic 54f64adb67SMarko Kovacevic struct fips_test_callback hmac_tests_vectors[] = { 55f64adb67SMarko Kovacevic {KEYLEN_STR, parser_read_uint32_val, &vec.cipher_auth.key}, 56f64adb67SMarko Kovacevic {TAGLEN_STR, parser_read_uint32_val, &vec.cipher_auth.digest}, 57f64adb67SMarko Kovacevic {KEY_STR, parse_uint8_hex_str, &vec.cipher_auth.key}, 58f64adb67SMarko Kovacevic {PT_STR, parse_uint8_hex_str, &vec.pt}, 59f64adb67SMarko Kovacevic {TAG_STR, parse_uint8_hex_str, &vec.cipher_auth.digest}, 60f64adb67SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 61f64adb67SMarko Kovacevic }; 62f64adb67SMarko Kovacevic 63f64adb67SMarko Kovacevic struct fips_test_callback hmac_tests_interim_vectors[] = { 64f64adb67SMarko Kovacevic {ALGO_PREFIX, parse_interim_algo, NULL}, 65f64adb67SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 66f64adb67SMarko Kovacevic }; 67f64adb67SMarko Kovacevic 68f64adb67SMarko Kovacevic static int 69f64adb67SMarko Kovacevic parse_test_hmac_writeback(struct fips_val *val) 70f64adb67SMarko Kovacevic { 71f64adb67SMarko Kovacevic struct fips_val val_local; 72f64adb67SMarko Kovacevic 73f64adb67SMarko Kovacevic fprintf(info.fp_wr, "%s", TAG_STR); 74f64adb67SMarko Kovacevic 75f64adb67SMarko Kovacevic val_local.val = val->val + vec.pt.len; 76f64adb67SMarko Kovacevic val_local.len = vec.cipher_auth.digest.len; 77f64adb67SMarko Kovacevic 78f64adb67SMarko Kovacevic parse_write_hex_str(&val_local); 79f64adb67SMarko Kovacevic return 0; 80f64adb67SMarko Kovacevic } 81f64adb67SMarko Kovacevic 82f64adb67SMarko Kovacevic static int 83f64adb67SMarko Kovacevic rsp_test_hmac_check(struct fips_val *val) 84f64adb67SMarko Kovacevic { 85f64adb67SMarko Kovacevic if (memcmp(val->val + vec.pt.len, vec.cipher_auth.digest.val, 86f64adb67SMarko Kovacevic vec.cipher_auth.digest.len) == 0) 87f64adb67SMarko Kovacevic fprintf(info.fp_wr, "Success\n"); 88f64adb67SMarko Kovacevic else 89f64adb67SMarko Kovacevic fprintf(info.fp_wr, "Failed\n"); 90f64adb67SMarko Kovacevic 91f64adb67SMarko Kovacevic return 0; 92f64adb67SMarko Kovacevic } 93f64adb67SMarko Kovacevic 94f64adb67SMarko Kovacevic int 95f64adb67SMarko Kovacevic parse_test_hmac_init(void) 96f64adb67SMarko Kovacevic { 97f64adb67SMarko Kovacevic info.op = FIPS_TEST_ENC_AUTH_GEN; 98f64adb67SMarko Kovacevic info.parse_writeback = parse_test_hmac_writeback; 99f64adb67SMarko Kovacevic info.callbacks = hmac_tests_vectors; 100f64adb67SMarko Kovacevic info.interim_callbacks = hmac_tests_interim_vectors; 101f64adb67SMarko Kovacevic info.writeback_callbacks = NULL; 102f64adb67SMarko Kovacevic info.kat_check = rsp_test_hmac_check; 103f64adb67SMarko Kovacevic 104f64adb67SMarko Kovacevic return 0; 105f64adb67SMarko Kovacevic } 106