1474f1202SAnoob Joseph /* SPDX-License-Identifier: BSD-3-Clause 2474f1202SAnoob Joseph * Copyright(C) 2021 Marvell. 3474f1202SAnoob Joseph */ 4474f1202SAnoob Joseph 5474f1202SAnoob Joseph #include <rte_common.h> 6474f1202SAnoob Joseph #include <rte_cryptodev.h> 7*cd928003STejasree Kondoj #include <rte_esp.h> 8474f1202SAnoob Joseph #include <rte_ip.h> 9474f1202SAnoob Joseph #include <rte_security.h> 10474f1202SAnoob Joseph 11474f1202SAnoob Joseph #include "test.h" 12474f1202SAnoob Joseph #include "test_cryptodev_security_ipsec.h" 13474f1202SAnoob Joseph 14*cd928003STejasree Kondoj #define IV_LEN_MAX 16 15*cd928003STejasree Kondoj 166622d9c9SAnoob Joseph extern struct ipsec_test_data pkt_aes_256_gcm; 176622d9c9SAnoob Joseph 18474f1202SAnoob Joseph int 19474f1202SAnoob Joseph test_ipsec_sec_caps_verify(struct rte_security_ipsec_xform *ipsec_xform, 20474f1202SAnoob Joseph const struct rte_security_capability *sec_cap, 21474f1202SAnoob Joseph bool silent) 22474f1202SAnoob Joseph { 23474f1202SAnoob Joseph /* Verify security capabilities */ 24474f1202SAnoob Joseph 25474f1202SAnoob Joseph if (ipsec_xform->options.esn == 1 && sec_cap->ipsec.options.esn == 0) { 26474f1202SAnoob Joseph if (!silent) 27474f1202SAnoob Joseph RTE_LOG(INFO, USER1, "ESN is not supported\n"); 28474f1202SAnoob Joseph return -ENOTSUP; 29474f1202SAnoob Joseph } 30474f1202SAnoob Joseph 31474f1202SAnoob Joseph if (ipsec_xform->options.udp_encap == 1 && 32474f1202SAnoob Joseph sec_cap->ipsec.options.udp_encap == 0) { 33474f1202SAnoob Joseph if (!silent) 34474f1202SAnoob Joseph RTE_LOG(INFO, USER1, "UDP encapsulation is not supported\n"); 35474f1202SAnoob Joseph return -ENOTSUP; 36474f1202SAnoob Joseph } 37474f1202SAnoob Joseph 38474f1202SAnoob Joseph if (ipsec_xform->options.copy_dscp == 1 && 39474f1202SAnoob Joseph sec_cap->ipsec.options.copy_dscp == 0) { 40474f1202SAnoob Joseph if (!silent) 41474f1202SAnoob Joseph RTE_LOG(INFO, USER1, "Copy DSCP is not supported\n"); 42474f1202SAnoob Joseph return -ENOTSUP; 43474f1202SAnoob Joseph } 44474f1202SAnoob Joseph 45474f1202SAnoob Joseph if (ipsec_xform->options.copy_flabel == 1 && 46474f1202SAnoob Joseph sec_cap->ipsec.options.copy_flabel == 0) { 47474f1202SAnoob Joseph if (!silent) 48474f1202SAnoob Joseph RTE_LOG(INFO, USER1, "Copy Flow Label is not supported\n"); 49474f1202SAnoob Joseph return -ENOTSUP; 50474f1202SAnoob Joseph } 51474f1202SAnoob Joseph 52474f1202SAnoob Joseph if (ipsec_xform->options.copy_df == 1 && 53474f1202SAnoob Joseph sec_cap->ipsec.options.copy_df == 0) { 54474f1202SAnoob Joseph if (!silent) 55474f1202SAnoob Joseph RTE_LOG(INFO, USER1, "Copy DP bit is not supported\n"); 56474f1202SAnoob Joseph return -ENOTSUP; 57474f1202SAnoob Joseph } 58474f1202SAnoob Joseph 59474f1202SAnoob Joseph if (ipsec_xform->options.dec_ttl == 1 && 60474f1202SAnoob Joseph sec_cap->ipsec.options.dec_ttl == 0) { 61474f1202SAnoob Joseph if (!silent) 62474f1202SAnoob Joseph RTE_LOG(INFO, USER1, "Decrement TTL is not supported\n"); 63474f1202SAnoob Joseph return -ENOTSUP; 64474f1202SAnoob Joseph } 65474f1202SAnoob Joseph 66474f1202SAnoob Joseph if (ipsec_xform->options.ecn == 1 && sec_cap->ipsec.options.ecn == 0) { 67474f1202SAnoob Joseph if (!silent) 68474f1202SAnoob Joseph RTE_LOG(INFO, USER1, "ECN is not supported\n"); 69474f1202SAnoob Joseph return -ENOTSUP; 70474f1202SAnoob Joseph } 71474f1202SAnoob Joseph 72474f1202SAnoob Joseph if (ipsec_xform->options.stats == 1 && 73474f1202SAnoob Joseph sec_cap->ipsec.options.stats == 0) { 74474f1202SAnoob Joseph if (!silent) 75474f1202SAnoob Joseph RTE_LOG(INFO, USER1, "Stats is not supported\n"); 76474f1202SAnoob Joseph return -ENOTSUP; 77474f1202SAnoob Joseph } 78474f1202SAnoob Joseph 79474f1202SAnoob Joseph return 0; 80474f1202SAnoob Joseph } 81474f1202SAnoob Joseph 82474f1202SAnoob Joseph int 83474f1202SAnoob Joseph test_ipsec_crypto_caps_aead_verify( 84474f1202SAnoob Joseph const struct rte_security_capability *sec_cap, 85474f1202SAnoob Joseph struct rte_crypto_sym_xform *aead) 86474f1202SAnoob Joseph { 87474f1202SAnoob Joseph const struct rte_cryptodev_symmetric_capability *sym_cap; 88474f1202SAnoob Joseph const struct rte_cryptodev_capabilities *crypto_cap; 89474f1202SAnoob Joseph int j = 0; 90474f1202SAnoob Joseph 91474f1202SAnoob Joseph while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op != 92474f1202SAnoob Joseph RTE_CRYPTO_OP_TYPE_UNDEFINED) { 93474f1202SAnoob Joseph if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC && 94474f1202SAnoob Joseph crypto_cap->sym.xform_type == aead->type && 95474f1202SAnoob Joseph crypto_cap->sym.aead.algo == aead->aead.algo) { 96474f1202SAnoob Joseph sym_cap = &crypto_cap->sym; 97474f1202SAnoob Joseph if (rte_cryptodev_sym_capability_check_aead(sym_cap, 98474f1202SAnoob Joseph aead->aead.key.length, 99474f1202SAnoob Joseph aead->aead.digest_length, 100474f1202SAnoob Joseph aead->aead.aad_length, 101474f1202SAnoob Joseph aead->aead.iv.length) == 0) 102474f1202SAnoob Joseph return 0; 103474f1202SAnoob Joseph } 104474f1202SAnoob Joseph } 105474f1202SAnoob Joseph 106474f1202SAnoob Joseph return -ENOTSUP; 107474f1202SAnoob Joseph } 108474f1202SAnoob Joseph 109474f1202SAnoob Joseph void 110474f1202SAnoob Joseph test_ipsec_td_in_from_out(const struct ipsec_test_data *td_out, 111474f1202SAnoob Joseph struct ipsec_test_data *td_in) 112474f1202SAnoob Joseph { 113474f1202SAnoob Joseph memcpy(td_in, td_out, sizeof(*td_in)); 114474f1202SAnoob Joseph 115474f1202SAnoob Joseph /* Populate output text of td_in with input text of td_out */ 116474f1202SAnoob Joseph memcpy(td_in->output_text.data, td_out->input_text.data, 117474f1202SAnoob Joseph td_out->input_text.len); 118474f1202SAnoob Joseph td_in->output_text.len = td_out->input_text.len; 119474f1202SAnoob Joseph 120474f1202SAnoob Joseph /* Populate input text of td_in with output text of td_out */ 121474f1202SAnoob Joseph memcpy(td_in->input_text.data, td_out->output_text.data, 122474f1202SAnoob Joseph td_out->output_text.len); 123474f1202SAnoob Joseph td_in->input_text.len = td_out->output_text.len; 124474f1202SAnoob Joseph 125474f1202SAnoob Joseph td_in->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS; 126474f1202SAnoob Joseph 127474f1202SAnoob Joseph if (td_in->aead) { 128474f1202SAnoob Joseph td_in->xform.aead.aead.op = RTE_CRYPTO_AEAD_OP_DECRYPT; 129474f1202SAnoob Joseph } else { 130474f1202SAnoob Joseph td_in->xform.chain.auth.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 131474f1202SAnoob Joseph td_in->xform.chain.cipher.cipher.op = 132474f1202SAnoob Joseph RTE_CRYPTO_CIPHER_OP_DECRYPT; 133474f1202SAnoob Joseph } 134474f1202SAnoob Joseph } 135474f1202SAnoob Joseph 1366622d9c9SAnoob Joseph void 1376622d9c9SAnoob Joseph test_ipsec_td_prepare(const struct crypto_param *param1, 1386622d9c9SAnoob Joseph const struct crypto_param *param2, 1396622d9c9SAnoob Joseph const struct ipsec_test_flags *flags, 1406622d9c9SAnoob Joseph struct ipsec_test_data *td_array, 1416622d9c9SAnoob Joseph int nb_td) 1426622d9c9SAnoob Joseph 1436622d9c9SAnoob Joseph { 1446622d9c9SAnoob Joseph struct ipsec_test_data *td; 1456622d9c9SAnoob Joseph int i; 1466622d9c9SAnoob Joseph 1476622d9c9SAnoob Joseph memset(td_array, 0, nb_td * sizeof(*td)); 1486622d9c9SAnoob Joseph 1496622d9c9SAnoob Joseph for (i = 0; i < nb_td; i++) { 1506622d9c9SAnoob Joseph td = &td_array[i]; 1516622d9c9SAnoob Joseph /* Copy template for packet & key fields */ 1526622d9c9SAnoob Joseph memcpy(td, &pkt_aes_256_gcm, sizeof(*td)); 1536622d9c9SAnoob Joseph 1546622d9c9SAnoob Joseph /* Override fields based on param */ 1556622d9c9SAnoob Joseph 1566622d9c9SAnoob Joseph if (param1->type == RTE_CRYPTO_SYM_XFORM_AEAD) 1576622d9c9SAnoob Joseph td->aead = true; 1586622d9c9SAnoob Joseph else 1596622d9c9SAnoob Joseph td->aead = false; 1606622d9c9SAnoob Joseph 1616622d9c9SAnoob Joseph td->xform.aead.aead.algo = param1->alg.aead; 1626622d9c9SAnoob Joseph td->xform.aead.aead.key.length = param1->key_length; 1636622d9c9SAnoob Joseph } 1646622d9c9SAnoob Joseph 1656622d9c9SAnoob Joseph RTE_SET_USED(flags); 1666622d9c9SAnoob Joseph RTE_SET_USED(param2); 1676622d9c9SAnoob Joseph } 1686622d9c9SAnoob Joseph 1696622d9c9SAnoob Joseph void 1706622d9c9SAnoob Joseph test_ipsec_td_update(struct ipsec_test_data td_inb[], 1716622d9c9SAnoob Joseph const struct ipsec_test_data td_outb[], 1726622d9c9SAnoob Joseph int nb_td, 1736622d9c9SAnoob Joseph const struct ipsec_test_flags *flags) 1746622d9c9SAnoob Joseph { 1756622d9c9SAnoob Joseph int i; 1766622d9c9SAnoob Joseph 1776622d9c9SAnoob Joseph for (i = 0; i < nb_td; i++) { 1786622d9c9SAnoob Joseph memcpy(td_inb[i].output_text.data, td_outb[i].input_text.data, 1796622d9c9SAnoob Joseph td_outb[i].input_text.len); 1806622d9c9SAnoob Joseph td_inb[i].output_text.len = td_outb->input_text.len; 1816622d9c9SAnoob Joseph 1820f453190STejasree Kondoj if (flags->icv_corrupt) { 1830f453190STejasree Kondoj int icv_pos = td_inb[i].input_text.len - 4; 1840f453190STejasree Kondoj td_inb[i].input_text.data[icv_pos] += 1; 1850f453190STejasree Kondoj } 1860f453190STejasree Kondoj } 1876622d9c9SAnoob Joseph } 1886622d9c9SAnoob Joseph 1896622d9c9SAnoob Joseph void 1906622d9c9SAnoob Joseph test_ipsec_display_alg(const struct crypto_param *param1, 1916622d9c9SAnoob Joseph const struct crypto_param *param2) 1926622d9c9SAnoob Joseph { 1936622d9c9SAnoob Joseph if (param1->type == RTE_CRYPTO_SYM_XFORM_AEAD) 1946622d9c9SAnoob Joseph printf("\t%s [%d]\n", 1956622d9c9SAnoob Joseph rte_crypto_aead_algorithm_strings[param1->alg.aead], 1966622d9c9SAnoob Joseph param1->key_length); 1976622d9c9SAnoob Joseph 1986622d9c9SAnoob Joseph RTE_SET_USED(param2); 1996622d9c9SAnoob Joseph } 2006622d9c9SAnoob Joseph 201474f1202SAnoob Joseph static int 202474f1202SAnoob Joseph test_ipsec_tunnel_hdr_len_get(const struct ipsec_test_data *td) 203474f1202SAnoob Joseph { 204474f1202SAnoob Joseph int len = 0; 205474f1202SAnoob Joseph 206474f1202SAnoob Joseph if (td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_EGRESS) { 207474f1202SAnoob Joseph if (td->ipsec_xform.mode == RTE_SECURITY_IPSEC_SA_MODE_TUNNEL) { 208474f1202SAnoob Joseph if (td->ipsec_xform.tunnel.type == 209474f1202SAnoob Joseph RTE_SECURITY_IPSEC_TUNNEL_IPV4) 210474f1202SAnoob Joseph len += sizeof(struct rte_ipv4_hdr); 211474f1202SAnoob Joseph else 212474f1202SAnoob Joseph len += sizeof(struct rte_ipv6_hdr); 213474f1202SAnoob Joseph } 214474f1202SAnoob Joseph } 215474f1202SAnoob Joseph 216474f1202SAnoob Joseph return len; 217474f1202SAnoob Joseph } 218474f1202SAnoob Joseph 219474f1202SAnoob Joseph static int 220*cd928003STejasree Kondoj test_ipsec_iv_verify_push(struct rte_mbuf *m, const struct ipsec_test_data *td) 221*cd928003STejasree Kondoj { 222*cd928003STejasree Kondoj static uint8_t iv_queue[IV_LEN_MAX * IPSEC_TEST_PACKETS_MAX]; 223*cd928003STejasree Kondoj uint8_t *iv_tmp, *output_text = rte_pktmbuf_mtod(m, uint8_t *); 224*cd928003STejasree Kondoj int i, iv_pos, iv_len; 225*cd928003STejasree Kondoj static int index; 226*cd928003STejasree Kondoj 227*cd928003STejasree Kondoj if (td->aead) 228*cd928003STejasree Kondoj iv_len = td->xform.aead.aead.iv.length - td->salt.len; 229*cd928003STejasree Kondoj else 230*cd928003STejasree Kondoj iv_len = td->xform.chain.cipher.cipher.iv.length; 231*cd928003STejasree Kondoj 232*cd928003STejasree Kondoj iv_pos = test_ipsec_tunnel_hdr_len_get(td) + sizeof(struct rte_esp_hdr); 233*cd928003STejasree Kondoj output_text += iv_pos; 234*cd928003STejasree Kondoj 235*cd928003STejasree Kondoj TEST_ASSERT(iv_len <= IV_LEN_MAX, "IV length greater than supported"); 236*cd928003STejasree Kondoj 237*cd928003STejasree Kondoj /* Compare against previous values */ 238*cd928003STejasree Kondoj for (i = 0; i < index; i++) { 239*cd928003STejasree Kondoj iv_tmp = &iv_queue[i * IV_LEN_MAX]; 240*cd928003STejasree Kondoj 241*cd928003STejasree Kondoj if (memcmp(output_text, iv_tmp, iv_len) == 0) { 242*cd928003STejasree Kondoj printf("IV repeated"); 243*cd928003STejasree Kondoj return TEST_FAILED; 244*cd928003STejasree Kondoj } 245*cd928003STejasree Kondoj } 246*cd928003STejasree Kondoj 247*cd928003STejasree Kondoj /* Save IV for future comparisons */ 248*cd928003STejasree Kondoj 249*cd928003STejasree Kondoj iv_tmp = &iv_queue[index * IV_LEN_MAX]; 250*cd928003STejasree Kondoj memcpy(iv_tmp, output_text, iv_len); 251*cd928003STejasree Kondoj index++; 252*cd928003STejasree Kondoj 253*cd928003STejasree Kondoj if (index == IPSEC_TEST_PACKETS_MAX) 254*cd928003STejasree Kondoj index = 0; 255*cd928003STejasree Kondoj 256*cd928003STejasree Kondoj return TEST_SUCCESS; 257*cd928003STejasree Kondoj } 258*cd928003STejasree Kondoj 259*cd928003STejasree Kondoj static int 260474f1202SAnoob Joseph test_ipsec_td_verify(struct rte_mbuf *m, const struct ipsec_test_data *td, 2616622d9c9SAnoob Joseph bool silent, const struct ipsec_test_flags *flags) 262474f1202SAnoob Joseph { 263474f1202SAnoob Joseph uint8_t *output_text = rte_pktmbuf_mtod(m, uint8_t *); 264474f1202SAnoob Joseph uint32_t skip, len = rte_pktmbuf_pkt_len(m); 265474f1202SAnoob Joseph 2660f453190STejasree Kondoj /* For negative tests, no need to do verification */ 2670f453190STejasree Kondoj if (flags->icv_corrupt && 2680f453190STejasree Kondoj td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) 2690f453190STejasree Kondoj return TEST_SUCCESS; 2700f453190STejasree Kondoj 271474f1202SAnoob Joseph if (len != td->output_text.len) { 272474f1202SAnoob Joseph printf("Output length (%d) not matching with expected (%d)\n", 273474f1202SAnoob Joseph len, td->output_text.len); 274474f1202SAnoob Joseph return TEST_FAILED; 275474f1202SAnoob Joseph } 276474f1202SAnoob Joseph 277474f1202SAnoob Joseph skip = test_ipsec_tunnel_hdr_len_get(td); 278474f1202SAnoob Joseph 279474f1202SAnoob Joseph len -= skip; 280474f1202SAnoob Joseph output_text += skip; 281474f1202SAnoob Joseph 282474f1202SAnoob Joseph if (memcmp(output_text, td->output_text.data + skip, len)) { 283474f1202SAnoob Joseph if (silent) 284474f1202SAnoob Joseph return TEST_FAILED; 285474f1202SAnoob Joseph 286474f1202SAnoob Joseph printf("TestCase %s line %d: %s\n", __func__, __LINE__, 287474f1202SAnoob Joseph "output text not as expected\n"); 288474f1202SAnoob Joseph 289474f1202SAnoob Joseph rte_hexdump(stdout, "expected", td->output_text.data + skip, 290474f1202SAnoob Joseph len); 291474f1202SAnoob Joseph rte_hexdump(stdout, "actual", output_text, len); 292474f1202SAnoob Joseph return TEST_FAILED; 293474f1202SAnoob Joseph } 294474f1202SAnoob Joseph 2956622d9c9SAnoob Joseph return TEST_SUCCESS; 2966622d9c9SAnoob Joseph } 2976622d9c9SAnoob Joseph 2986622d9c9SAnoob Joseph static int 2996622d9c9SAnoob Joseph test_ipsec_res_d_prepare(struct rte_mbuf *m, const struct ipsec_test_data *td, 3006622d9c9SAnoob Joseph struct ipsec_test_data *res_d) 3016622d9c9SAnoob Joseph { 3026622d9c9SAnoob Joseph uint8_t *output_text = rte_pktmbuf_mtod(m, uint8_t *); 3036622d9c9SAnoob Joseph uint32_t len = rte_pktmbuf_pkt_len(m); 3046622d9c9SAnoob Joseph 3056622d9c9SAnoob Joseph memcpy(res_d, td, sizeof(*res_d)); 3066622d9c9SAnoob Joseph memcpy(res_d->input_text.data, output_text, len); 3076622d9c9SAnoob Joseph res_d->input_text.len = len; 3086622d9c9SAnoob Joseph 3096622d9c9SAnoob Joseph res_d->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS; 3106622d9c9SAnoob Joseph if (res_d->aead) { 3116622d9c9SAnoob Joseph res_d->xform.aead.aead.op = RTE_CRYPTO_AEAD_OP_DECRYPT; 3126622d9c9SAnoob Joseph } else { 3136622d9c9SAnoob Joseph printf("Only AEAD supported\n"); 3146622d9c9SAnoob Joseph return TEST_SKIPPED; 3156622d9c9SAnoob Joseph } 3166622d9c9SAnoob Joseph 317474f1202SAnoob Joseph return TEST_SUCCESS; 318474f1202SAnoob Joseph } 319474f1202SAnoob Joseph 320474f1202SAnoob Joseph int 321474f1202SAnoob Joseph test_ipsec_post_process(struct rte_mbuf *m, const struct ipsec_test_data *td, 3226622d9c9SAnoob Joseph struct ipsec_test_data *res_d, bool silent, 3236622d9c9SAnoob Joseph const struct ipsec_test_flags *flags) 324474f1202SAnoob Joseph { 325*cd928003STejasree Kondoj int ret; 326*cd928003STejasree Kondoj 327*cd928003STejasree Kondoj if (flags->iv_gen && 328*cd928003STejasree Kondoj td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_EGRESS) { 329*cd928003STejasree Kondoj ret = test_ipsec_iv_verify_push(m, td); 330*cd928003STejasree Kondoj if (ret != TEST_SUCCESS) 331*cd928003STejasree Kondoj return ret; 332*cd928003STejasree Kondoj } 333*cd928003STejasree Kondoj 334474f1202SAnoob Joseph /* 335474f1202SAnoob Joseph * In case of known vector tests & all inbound tests, res_d provided 336474f1202SAnoob Joseph * would be NULL and output data need to be validated against expected. 337474f1202SAnoob Joseph * For inbound, output_text would be plain packet and for outbound 338474f1202SAnoob Joseph * output_text would IPsec packet. Validate by comparing against 339474f1202SAnoob Joseph * known vectors. 3406622d9c9SAnoob Joseph * 3416622d9c9SAnoob Joseph * In case of combined mode tests, the output_text from outbound 3426622d9c9SAnoob Joseph * operation (ie, IPsec packet) would need to be inbound processed to 3436622d9c9SAnoob Joseph * obtain the plain text. Copy output_text to result data, 'res_d', so 3446622d9c9SAnoob Joseph * that inbound processing can be done. 345474f1202SAnoob Joseph */ 3466622d9c9SAnoob Joseph 3476622d9c9SAnoob Joseph if (res_d == NULL) 3486622d9c9SAnoob Joseph return test_ipsec_td_verify(m, td, silent, flags); 3496622d9c9SAnoob Joseph else 3506622d9c9SAnoob Joseph return test_ipsec_res_d_prepare(m, td, res_d); 351474f1202SAnoob Joseph } 352474f1202SAnoob Joseph 353474f1202SAnoob Joseph int 354474f1202SAnoob Joseph test_ipsec_status_check(struct rte_crypto_op *op, 3556622d9c9SAnoob Joseph const struct ipsec_test_flags *flags, 356474f1202SAnoob Joseph enum rte_security_ipsec_sa_direction dir) 357474f1202SAnoob Joseph { 358474f1202SAnoob Joseph int ret = TEST_SUCCESS; 359474f1202SAnoob Joseph 3600f453190STejasree Kondoj if (dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS && flags->icv_corrupt) { 3610f453190STejasree Kondoj if (op->status != RTE_CRYPTO_OP_STATUS_ERROR) { 3620f453190STejasree Kondoj printf("ICV corruption test case failed\n"); 3630f453190STejasree Kondoj ret = TEST_FAILED; 3640f453190STejasree Kondoj } 3650f453190STejasree Kondoj } else { 366474f1202SAnoob Joseph if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 367474f1202SAnoob Joseph printf("Security op processing failed\n"); 368474f1202SAnoob Joseph ret = TEST_FAILED; 369474f1202SAnoob Joseph } 3700f453190STejasree Kondoj } 371474f1202SAnoob Joseph 372474f1202SAnoob Joseph return ret; 373474f1202SAnoob Joseph } 374