xref: /dpdk/app/test/test_security_proto.c (revision cf93f07b21eb13a102b517ad0e57f49ffc31ee47)
11d3a3e18SAnoob Joseph /* SPDX-License-Identifier: BSD-3-Clause
21d3a3e18SAnoob Joseph  * Copyright(C) 2023 Marvell.
31d3a3e18SAnoob Joseph  */
41d3a3e18SAnoob Joseph 
51d3a3e18SAnoob Joseph #include <rte_cryptodev.h>
61d3a3e18SAnoob Joseph #include <rte_security.h>
71d3a3e18SAnoob Joseph 
81d3a3e18SAnoob Joseph #include "test_security_proto.h"
91d3a3e18SAnoob Joseph 
10838e8decSVidya Sagar Velumuri struct crypto_param_comb sec_alg_list[RTE_DIM(aead_list) +
11838e8decSVidya Sagar Velumuri 				  (RTE_DIM(cipher_list) *
12838e8decSVidya Sagar Velumuri 				   RTE_DIM(auth_list))];
13838e8decSVidya Sagar Velumuri 
14838e8decSVidya Sagar Velumuri struct crypto_param_comb sec_auth_only_alg_list[2 * (RTE_DIM(auth_list) - 1)];
15838e8decSVidya Sagar Velumuri 
16*cf93f07bSAakash Sasidharan static uint8_t cleartext_pattern[TEST_SEC_CLEARTEXT_MAX_LEN];
17*cf93f07bSAakash Sasidharan 
18838e8decSVidya Sagar Velumuri void
test_sec_alg_list_populate(void)19838e8decSVidya Sagar Velumuri test_sec_alg_list_populate(void)
20838e8decSVidya Sagar Velumuri {
21838e8decSVidya Sagar Velumuri 	unsigned long i, j, index = 0;
22838e8decSVidya Sagar Velumuri 
23838e8decSVidya Sagar Velumuri 	for (i = 0; i < RTE_DIM(aead_list); i++) {
24838e8decSVidya Sagar Velumuri 		sec_alg_list[index].param1 = &aead_list[i];
25838e8decSVidya Sagar Velumuri 		sec_alg_list[index].param2 = NULL;
26838e8decSVidya Sagar Velumuri 		index++;
27838e8decSVidya Sagar Velumuri 	}
28838e8decSVidya Sagar Velumuri 
29838e8decSVidya Sagar Velumuri 	for (i = 0; i < RTE_DIM(cipher_list); i++) {
30838e8decSVidya Sagar Velumuri 		for (j = 0; j < RTE_DIM(auth_list); j++) {
31838e8decSVidya Sagar Velumuri 			sec_alg_list[index].param1 = &cipher_list[i];
32838e8decSVidya Sagar Velumuri 			sec_alg_list[index].param2 = &auth_list[j];
33838e8decSVidya Sagar Velumuri 			index++;
34838e8decSVidya Sagar Velumuri 		}
35838e8decSVidya Sagar Velumuri 	}
36838e8decSVidya Sagar Velumuri }
37838e8decSVidya Sagar Velumuri 
38838e8decSVidya Sagar Velumuri void
test_sec_auth_only_alg_list_populate(void)39838e8decSVidya Sagar Velumuri test_sec_auth_only_alg_list_populate(void)
40838e8decSVidya Sagar Velumuri {
41838e8decSVidya Sagar Velumuri 	unsigned long i, index = 0;
42838e8decSVidya Sagar Velumuri 
43838e8decSVidya Sagar Velumuri 	for (i = 1; i < RTE_DIM(auth_list); i++) {
44838e8decSVidya Sagar Velumuri 		sec_auth_only_alg_list[index].param1 = &auth_list[i];
45838e8decSVidya Sagar Velumuri 		sec_auth_only_alg_list[index].param2 = NULL;
46838e8decSVidya Sagar Velumuri 		index++;
47838e8decSVidya Sagar Velumuri 	}
48838e8decSVidya Sagar Velumuri 
49838e8decSVidya Sagar Velumuri 	for (i = 1; i < RTE_DIM(auth_list); i++) {
50838e8decSVidya Sagar Velumuri 		/* NULL cipher */
51838e8decSVidya Sagar Velumuri 		sec_auth_only_alg_list[index].param1 = &cipher_list[0];
52838e8decSVidya Sagar Velumuri 
53838e8decSVidya Sagar Velumuri 		sec_auth_only_alg_list[index].param2 = &auth_list[i];
54838e8decSVidya Sagar Velumuri 		index++;
55838e8decSVidya Sagar Velumuri 	}
56838e8decSVidya Sagar Velumuri }
57838e8decSVidya Sagar Velumuri 
581d3a3e18SAnoob Joseph int
test_sec_crypto_caps_aead_verify(const struct rte_security_capability * sec_cap,struct rte_crypto_sym_xform * aead)591d3a3e18SAnoob Joseph test_sec_crypto_caps_aead_verify(const struct rte_security_capability *sec_cap,
601d3a3e18SAnoob Joseph 		struct rte_crypto_sym_xform *aead)
611d3a3e18SAnoob Joseph {
621d3a3e18SAnoob Joseph 	const struct rte_cryptodev_symmetric_capability *sym_cap;
631d3a3e18SAnoob Joseph 	const struct rte_cryptodev_capabilities *crypto_cap;
641d3a3e18SAnoob Joseph 	int j = 0;
651d3a3e18SAnoob Joseph 
661d3a3e18SAnoob Joseph 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
671d3a3e18SAnoob Joseph 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
681d3a3e18SAnoob Joseph 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
691d3a3e18SAnoob Joseph 				crypto_cap->sym.xform_type == aead->type &&
701d3a3e18SAnoob Joseph 				crypto_cap->sym.aead.algo == aead->aead.algo) {
711d3a3e18SAnoob Joseph 			sym_cap = &crypto_cap->sym;
721d3a3e18SAnoob Joseph 			if (rte_cryptodev_sym_capability_check_aead(sym_cap,
731d3a3e18SAnoob Joseph 					aead->aead.key.length,
741d3a3e18SAnoob Joseph 					aead->aead.digest_length,
751d3a3e18SAnoob Joseph 					aead->aead.aad_length,
761d3a3e18SAnoob Joseph 					aead->aead.iv.length) == 0)
771d3a3e18SAnoob Joseph 				return 0;
781d3a3e18SAnoob Joseph 		}
791d3a3e18SAnoob Joseph 	}
801d3a3e18SAnoob Joseph 
811d3a3e18SAnoob Joseph 	return -ENOTSUP;
821d3a3e18SAnoob Joseph }
831d3a3e18SAnoob Joseph 
841d3a3e18SAnoob Joseph int
test_sec_crypto_caps_cipher_verify(const struct rte_security_capability * sec_cap,struct rte_crypto_sym_xform * cipher)851d3a3e18SAnoob Joseph test_sec_crypto_caps_cipher_verify(const struct rte_security_capability *sec_cap,
861d3a3e18SAnoob Joseph 		struct rte_crypto_sym_xform *cipher)
871d3a3e18SAnoob Joseph {
881d3a3e18SAnoob Joseph 	const struct rte_cryptodev_symmetric_capability *sym_cap;
891d3a3e18SAnoob Joseph 	const struct rte_cryptodev_capabilities *cap;
901d3a3e18SAnoob Joseph 	int j = 0;
911d3a3e18SAnoob Joseph 
921d3a3e18SAnoob Joseph 	while ((cap = &sec_cap->crypto_capabilities[j++])->op !=
931d3a3e18SAnoob Joseph 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
941d3a3e18SAnoob Joseph 		if (cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
951d3a3e18SAnoob Joseph 				cap->sym.xform_type == cipher->type &&
961d3a3e18SAnoob Joseph 				cap->sym.cipher.algo == cipher->cipher.algo) {
971d3a3e18SAnoob Joseph 			sym_cap = &cap->sym;
981d3a3e18SAnoob Joseph 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
991d3a3e18SAnoob Joseph 					cipher->cipher.key.length,
1001d3a3e18SAnoob Joseph 					cipher->cipher.iv.length) == 0)
1011d3a3e18SAnoob Joseph 				return 0;
1021d3a3e18SAnoob Joseph 		}
1031d3a3e18SAnoob Joseph 	}
1041d3a3e18SAnoob Joseph 
1051d3a3e18SAnoob Joseph 	return -ENOTSUP;
1061d3a3e18SAnoob Joseph }
1071d3a3e18SAnoob Joseph 
1081d3a3e18SAnoob Joseph int
test_sec_crypto_caps_auth_verify(const struct rte_security_capability * sec_cap,struct rte_crypto_sym_xform * auth)1091d3a3e18SAnoob Joseph test_sec_crypto_caps_auth_verify(const struct rte_security_capability *sec_cap,
1101d3a3e18SAnoob Joseph 		struct rte_crypto_sym_xform *auth)
1111d3a3e18SAnoob Joseph {
1121d3a3e18SAnoob Joseph 	const struct rte_cryptodev_symmetric_capability *sym_cap;
1131d3a3e18SAnoob Joseph 	const struct rte_cryptodev_capabilities *cap;
1141d3a3e18SAnoob Joseph 	int j = 0;
1151d3a3e18SAnoob Joseph 
1161d3a3e18SAnoob Joseph 	while ((cap = &sec_cap->crypto_capabilities[j++])->op !=
1171d3a3e18SAnoob Joseph 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
1181d3a3e18SAnoob Joseph 		if (cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
1191d3a3e18SAnoob Joseph 				cap->sym.xform_type == auth->type &&
1201d3a3e18SAnoob Joseph 				cap->sym.auth.algo == auth->auth.algo) {
1211d3a3e18SAnoob Joseph 			sym_cap = &cap->sym;
1221d3a3e18SAnoob Joseph 			if (rte_cryptodev_sym_capability_check_auth(sym_cap,
1231d3a3e18SAnoob Joseph 					auth->auth.key.length,
1241d3a3e18SAnoob Joseph 					auth->auth.digest_length,
1251d3a3e18SAnoob Joseph 					auth->auth.iv.length) == 0)
1261d3a3e18SAnoob Joseph 				return 0;
1271d3a3e18SAnoob Joseph 		}
1281d3a3e18SAnoob Joseph 	}
1291d3a3e18SAnoob Joseph 
1301d3a3e18SAnoob Joseph 	return -ENOTSUP;
1311d3a3e18SAnoob Joseph }
1323cf0c56cSAnoob Joseph 
1333cf0c56cSAnoob Joseph void
test_sec_alg_display(const struct crypto_param * param1,const struct crypto_param * param2)1343cf0c56cSAnoob Joseph test_sec_alg_display(const struct crypto_param *param1, const struct crypto_param *param2)
1353cf0c56cSAnoob Joseph {
1363cf0c56cSAnoob Joseph 	if (param1->type == RTE_CRYPTO_SYM_XFORM_AEAD) {
1373cf0c56cSAnoob Joseph 		printf("\t%s [%d]",
1383cf0c56cSAnoob Joseph 		       rte_cryptodev_get_aead_algo_string(param1->alg.aead),
1393cf0c56cSAnoob Joseph 		       param1->key_length * 8);
1403cf0c56cSAnoob Joseph 	} else if (param1->type == RTE_CRYPTO_SYM_XFORM_AUTH) {
1413cf0c56cSAnoob Joseph 		printf("\t%s",
1423cf0c56cSAnoob Joseph 		       rte_cryptodev_get_auth_algo_string(param1->alg.auth));
1433cf0c56cSAnoob Joseph 		if (param1->alg.auth != RTE_CRYPTO_AUTH_NULL)
1443cf0c56cSAnoob Joseph 			printf(" [%dB ICV]", param1->digest_length);
1453cf0c56cSAnoob Joseph 	} else {
1463cf0c56cSAnoob Joseph 		printf("\t%s",
1473cf0c56cSAnoob Joseph 		       rte_cryptodev_get_cipher_algo_string(param1->alg.cipher));
1483cf0c56cSAnoob Joseph 		if (param1->alg.cipher != RTE_CRYPTO_CIPHER_NULL)
1493cf0c56cSAnoob Joseph 			printf(" [%d]", param1->key_length * 8);
1503cf0c56cSAnoob Joseph 		printf(" %s",
1513cf0c56cSAnoob Joseph 		       rte_cryptodev_get_auth_algo_string(param2->alg.auth));
1523cf0c56cSAnoob Joseph 		if (param2->alg.auth != RTE_CRYPTO_AUTH_NULL)
1533cf0c56cSAnoob Joseph 			printf(" [%dB ICV]", param2->digest_length);
1543cf0c56cSAnoob Joseph 	}
1553cf0c56cSAnoob Joseph 	printf("\n");
1563cf0c56cSAnoob Joseph }
157*cf93f07bSAakash Sasidharan 
158*cf93f07bSAakash Sasidharan void
test_sec_proto_pattern_generate(void)159*cf93f07bSAakash Sasidharan test_sec_proto_pattern_generate(void)
160*cf93f07bSAakash Sasidharan {
161*cf93f07bSAakash Sasidharan 	unsigned int i;
162*cf93f07bSAakash Sasidharan 
163*cf93f07bSAakash Sasidharan 	for (i = 0; i < TEST_SEC_CLEARTEXT_MAX_LEN; i++)
164*cf93f07bSAakash Sasidharan 		cleartext_pattern[i] = (i + 1) & 0xff;
165*cf93f07bSAakash Sasidharan }
166*cf93f07bSAakash Sasidharan 
167*cf93f07bSAakash Sasidharan void
test_sec_proto_pattern_set(uint8_t * buf,int len)168*cf93f07bSAakash Sasidharan test_sec_proto_pattern_set(uint8_t *buf, int len)
169*cf93f07bSAakash Sasidharan {
170*cf93f07bSAakash Sasidharan 	rte_memcpy(buf, cleartext_pattern, len);
171*cf93f07bSAakash Sasidharan }
172