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