cryptodev: add asymmetric capability

Extend cryptodev with asymmetric capability APIs and
definitions.

Signed-off-by: Shally Verma <shally.verma@caviumnetworks.com>
Signed-off-by: Sunila Sahu <sunila.sahu@caviumnetworks.com>
Signed-off-by: Ashish Gupta <ashish.gupta@caviumnetworks.com>
Signed-off-by: Umesh Kartha <umesh.kartha@caviumnetworks.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
This commit is contained in:
Sunila Sahu 2018-07-10 21:03:20 +05:30 committed by Pablo de Lara
parent cea66374dc
commit b88c24bf25
3 changed files with 184 additions and 1 deletions

View File

@ -242,6 +242,24 @@ rte_cryptodev_get_aead_algo_enum(enum rte_crypto_aead_algorithm *algo_enum,
return -1;
}
int __rte_experimental
rte_cryptodev_asym_get_xform_enum(enum rte_crypto_asym_xform_type *xform_enum,
const char *xform_string)
{
unsigned int i;
for (i = 1; i < RTE_DIM(rte_crypto_asym_xform_strings); i++) {
if (strcmp(xform_string,
rte_crypto_asym_xform_strings[i]) == 0) {
*xform_enum = (enum rte_crypto_asym_xform_type) i;
return 0;
}
}
/* Invalid string */
return -1;
}
/**
* The crypto auth operation strings identifiers.
* It could be used in application command line.
@ -312,6 +330,28 @@ param_range_check(uint16_t size, const struct rte_crypto_param_range *range)
return -1;
}
const struct rte_cryptodev_asymmetric_xform_capability * __rte_experimental
rte_cryptodev_asym_capability_get(uint8_t dev_id,
const struct rte_cryptodev_asym_capability_idx *idx)
{
const struct rte_cryptodev_capabilities *capability;
struct rte_cryptodev_info dev_info;
unsigned int i = 0;
memset(&dev_info, 0, sizeof(struct rte_cryptodev_info));
rte_cryptodev_info_get(dev_id, &dev_info);
while ((capability = &dev_info.capabilities[i++])->op !=
RTE_CRYPTO_OP_TYPE_UNDEFINED) {
if (capability->op != RTE_CRYPTO_OP_TYPE_ASYMMETRIC)
continue;
if (capability->asym.xform_capa.xform_type == idx->type)
return &capability->asym.xform_capa;
}
return NULL;
};
int
rte_cryptodev_sym_capability_check_cipher(
const struct rte_cryptodev_symmetric_capability *capability,
@ -363,6 +403,42 @@ rte_cryptodev_sym_capability_check_aead(
return 0;
}
int __rte_experimental
rte_cryptodev_asym_xform_capability_check_optype(
const struct rte_cryptodev_asymmetric_xform_capability *capability,
enum rte_crypto_asym_op_type op_type)
{
if (capability->op_types & (1 << op_type))
return 1;
return 0;
}
int __rte_experimental
rte_cryptodev_asym_xform_capability_check_modlen(
const struct rte_cryptodev_asymmetric_xform_capability *capability,
uint16_t modlen)
{
/* no need to check for limits, if min or max = 0 */
if (capability->modlen.min != 0) {
if (modlen < capability->modlen.min)
return -1;
}
if (capability->modlen.max != 0) {
if (modlen > capability->modlen.max)
return -1;
}
/* in any case, check if given modlen is module increment */
if (capability->modlen.increment != 0) {
if (modlen % (capability->modlen.increment))
return -1;
}
return 0;
}
const char *
rte_cryptodev_get_feature_name(uint64_t flag)

View File

@ -143,6 +143,35 @@ struct rte_cryptodev_symmetric_capability {
};
};
/**
* Asymmetric Xform Crypto Capability
*
*/
struct rte_cryptodev_asymmetric_xform_capability {
enum rte_crypto_asym_xform_type xform_type;
/**< Transform type: RSA/MODEXP/DH/DSA/MODINV */
uint32_t op_types;
/**< bitmask for supported rte_crypto_asym_op_type */
__extension__
union {
struct rte_crypto_param_range modlen;
/**< Range of modulus length supported by modulus based xform.
* Value 0 mean implementation default
*/
};
};
/**
* Asymmetric Crypto Capability
*
*/
struct rte_cryptodev_asymmetric_capability {
struct rte_cryptodev_asymmetric_xform_capability xform_capa;
};
/** Structure used to capture a capability of a crypto device */
struct rte_cryptodev_capabilities {
enum rte_crypto_op_type op;
@ -152,6 +181,8 @@ struct rte_cryptodev_capabilities {
union {
struct rte_cryptodev_symmetric_capability sym;
/**< Symmetric operation capability parameters */
struct rte_cryptodev_asymmetric_capability asym;
/**< Asymmetric operation capability parameters */
};
};
@ -166,7 +197,17 @@ struct rte_cryptodev_sym_capability_idx {
};
/**
* Provide capabilities available for defined device and algorithm
* Structure used to describe asymmetric crypto xforms
* Each xform maps to one asym algorithm.
*
*/
struct rte_cryptodev_asym_capability_idx {
enum rte_crypto_asym_xform_type type;
/**< Asymmetric xform (algo) type */
};
/**
* Provide capabilities available for defined device and algorithm
*
* @param dev_id The identifier of the device.
* @param idx Description of crypto algorithms.
@ -179,6 +220,20 @@ const struct rte_cryptodev_symmetric_capability *
rte_cryptodev_sym_capability_get(uint8_t dev_id,
const struct rte_cryptodev_sym_capability_idx *idx);
/**
* Provide capabilities available for defined device and xform
*
* @param dev_id The identifier of the device.
* @param idx Description of asym crypto xform.
*
* @return
* - Return description of the asymmetric crypto capability if exist.
* - Return NULL if the capability not exist.
*/
const struct rte_cryptodev_asymmetric_xform_capability * __rte_experimental
rte_cryptodev_asym_capability_get(uint8_t dev_id,
const struct rte_cryptodev_asym_capability_idx *idx);
/**
* Check if key size and initial vector are supported
* in crypto cipher capability
@ -234,6 +289,36 @@ rte_cryptodev_sym_capability_check_aead(
uint16_t key_size, uint16_t digest_size, uint16_t aad_size,
uint16_t iv_size);
/**
* Check if op type is supported
*
* @param capability Description of the asymmetric crypto capability.
* @param op_type op type
*
* @return
* - Return 1 if the op type is supported
* - Return 0 if unsupported
*/
int __rte_experimental
rte_cryptodev_asym_xform_capability_check_optype(
const struct rte_cryptodev_asymmetric_xform_capability *capability,
enum rte_crypto_asym_op_type op_type);
/**
* Check if modulus length is in supported range
*
* @param capability Description of the asymmetric crypto capability.
* @param modlen modulus length.
*
* @return
* - Return 0 if the parameters are in range of the capability.
* - Return -1 if the parameters are out of range of the capability.
*/
int __rte_experimental
rte_cryptodev_asym_xform_capability_check_modlen(
const struct rte_cryptodev_asymmetric_xform_capability *capability,
uint16_t modlen);
/**
* Provide the cipher algorithm enum, given an algorithm string
*
@ -279,6 +364,22 @@ int
rte_cryptodev_get_aead_algo_enum(enum rte_crypto_aead_algorithm *algo_enum,
const char *algo_string);
/**
* Provide the Asymmetric xform enum, given an xform string
*
* @param xform_enum A pointer to the xform type
* enum to be filled
* @param xform_string xform string
*
* @return
* - Return -1 if string is not valid
* - Return 0 if the string is valid
*/
int __rte_experimental
rte_cryptodev_asym_get_xform_enum(enum rte_crypto_asym_xform_type *xform_enum,
const char *xform_string);
/** Macro used at end of crypto PMD list */
#define RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() \
{ RTE_CRYPTO_OP_TYPE_UNDEFINED }

View File

@ -91,12 +91,18 @@ DPDK_18.05 {
EXPERIMENTAL {
global:
rte_cryptodev_asym_capability_get;
rte_cryptodev_asym_get_header_session_size;
rte_cryptodev_asym_get_private_session_size;
rte_cryptodev_asym_get_xform_enum;
rte_cryptodev_asym_session_clear;
rte_cryptodev_asym_session_create;
rte_cryptodev_asym_session_free;
rte_cryptodev_asym_session_init;
rte_cryptodev_asym_xform_capability_check_modlen;
rte_cryptodev_asym_xform_capability_check_optype;
rte_cryptodev_sym_session_get_user_data;
rte_cryptodev_sym_session_set_user_data;
rte_crypto_asym_op_strings;
rte_crypto_asym_xform_strings;
};