X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fcryptodev%2Frte_cryptodev.c;h=42f32210526d8bfc0d037ba166dbf4911365fa79;hb=670692191a938fb8aaa887aa268437aacc51de7d;hp=562cb4a2c489b91db1212611c3c53608ad3ccd2c;hpb=a29bb248988666f5f7d8624287a2242a33301934;p=dpdk.git diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c index 562cb4a2c4..42f3221052 100644 --- a/lib/cryptodev/rte_cryptodev.c +++ b/lib/cryptodev/rte_cryptodev.c @@ -2,36 +2,25 @@ * Copyright(c) 2015-2020 Intel Corporation */ -#include #include #include #include #include #include -#include #include #include #include -#include #include #include #include -#include #include #include #include -#include -#include #include -#include -#include -#include -#include #include #include #include -#include #include #include #include @@ -188,10 +177,17 @@ const char *rte_crypto_asym_op_strings[] = { [RTE_CRYPTO_ASYM_OP_ENCRYPT] = "encrypt", [RTE_CRYPTO_ASYM_OP_DECRYPT] = "decrypt", [RTE_CRYPTO_ASYM_OP_SIGN] = "sign", - [RTE_CRYPTO_ASYM_OP_VERIFY] = "verify", - [RTE_CRYPTO_ASYM_OP_PRIVATE_KEY_GENERATE] = "priv_key_generate", - [RTE_CRYPTO_ASYM_OP_PUBLIC_KEY_GENERATE] = "pub_key_generate", - [RTE_CRYPTO_ASYM_OP_SHARED_SECRET_COMPUTE] = "sharedsecret_compute", + [RTE_CRYPTO_ASYM_OP_VERIFY] = "verify" +}; + +/** + * Asymmetric crypto key exchange operation strings identifiers. + */ +const char *rte_crypto_asym_ke_strings[] = { + [RTE_CRYPTO_ASYM_KE_PRIV_KEY_GENERATE] = "priv_key_generate", + [RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE] = "pub_key_generate", + [RTE_CRYPTO_ASYM_KE_SHARED_SECRET_COMPUTE] = "sharedsecret_compute", + [RTE_CRYPTO_ASYM_KE_PUB_KEY_VERIFY] = "pub_ec_key_verify" }; /** @@ -210,6 +206,8 @@ struct rte_cryptodev_sym_session_pool_private_data { struct rte_cryptodev_asym_session_pool_private_data { uint16_t max_priv_session_sz; /**< Size of private session data used when creating mempool */ + uint16_t user_data_sz; + /**< Session user data will be placed after sess_private_data */ }; int @@ -1803,12 +1801,13 @@ rte_cryptodev_sym_session_pool_create(const char *name, uint32_t nb_elts, struct rte_mempool * rte_cryptodev_asym_session_pool_create(const char *name, uint32_t nb_elts, - uint32_t cache_size, int socket_id) + uint32_t cache_size, uint16_t user_data_size, int socket_id) { struct rte_mempool *mp; struct rte_cryptodev_asym_session_pool_private_data *pool_priv; uint32_t obj_sz, obj_sz_aligned; - uint8_t dev_id, priv_sz, max_priv_sz = 0; + uint8_t dev_id; + unsigned int priv_sz, max_priv_sz = 0; for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++) if (rte_cryptodev_is_valid_dev(dev_id)) { @@ -1821,7 +1820,8 @@ rte_cryptodev_asym_session_pool_create(const char *name, uint32_t nb_elts, return NULL; } - obj_sz = rte_cryptodev_asym_get_header_session_size() + max_priv_sz; + obj_sz = rte_cryptodev_asym_get_header_session_size() + max_priv_sz + + user_data_size; obj_sz_aligned = RTE_ALIGN_CEIL(obj_sz, RTE_CACHE_LINE_SIZE); mp = rte_mempool_create(name, nb_elts, obj_sz_aligned, cache_size, @@ -1842,9 +1842,10 @@ rte_cryptodev_asym_session_pool_create(const char *name, uint32_t nb_elts, return NULL; } pool_priv->max_priv_session_sz = max_priv_sz; + pool_priv->user_data_sz = user_data_size; rte_cryptodev_trace_asym_session_pool_create(name, nb_elts, - cache_size, mp); + user_data_size, cache_size, mp); return mp; } @@ -1908,9 +1909,10 @@ rte_cryptodev_sym_session_create(struct rte_mempool *mp) return sess; } -void * +int rte_cryptodev_asym_session_create(uint8_t dev_id, - struct rte_crypto_asym_xform *xforms, struct rte_mempool *mp) + struct rte_crypto_asym_xform *xforms, struct rte_mempool *mp, + void **session) { struct rte_cryptodev_asym_session *sess; uint32_t session_priv_data_sz; @@ -1922,17 +1924,17 @@ rte_cryptodev_asym_session_create(uint8_t dev_id, if (!rte_cryptodev_is_valid_dev(dev_id)) { CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id); - return NULL; + return -EINVAL; } dev = rte_cryptodev_pmd_get_dev(dev_id); if (dev == NULL) - return NULL; + return -EINVAL; if (!mp) { CDEV_LOG_ERR("invalid mempool\n"); - return NULL; + return -EINVAL; } session_priv_data_sz = rte_cryptodev_asym_get_private_session_size( @@ -1942,29 +1944,31 @@ rte_cryptodev_asym_session_create(uint8_t dev_id, if (pool_priv->max_priv_session_sz < session_priv_data_sz) { CDEV_LOG_DEBUG( "The private session data size used when creating the mempool is smaller than this device's private session data."); - return NULL; + return -EINVAL; } /* Verify if provided mempool can hold elements big enough. */ if (mp->elt_size < session_header_size + session_priv_data_sz) { CDEV_LOG_ERR( "mempool elements too small to hold session objects"); - return NULL; + return -EINVAL; } /* Allocate a session structure from the session pool */ - if (rte_mempool_get(mp, (void **)&sess)) { + if (rte_mempool_get(mp, session)) { CDEV_LOG_ERR("couldn't get object from session mempool"); - return NULL; + return -ENOMEM; } + sess = *session; sess->driver_id = dev->driver_id; + sess->user_data_sz = pool_priv->user_data_sz; sess->max_priv_data_sz = pool_priv->max_priv_session_sz; /* Clear device session pointer.*/ - memset(sess->sess_private_data, 0, session_priv_data_sz); + memset(sess->sess_private_data, 0, session_priv_data_sz + sess->user_data_sz); - RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->asym_session_configure, NULL); + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->asym_session_configure, -ENOTSUP); if (sess->sess_private_data[0] == 0) { ret = dev->dev_ops->asym_session_configure(dev, xforms, sess); @@ -1972,12 +1976,12 @@ rte_cryptodev_asym_session_create(uint8_t dev_id, CDEV_LOG_ERR( "dev_id %d failed to configure session details", dev_id); - return NULL; + return ret; } } - rte_cryptodev_trace_asym_session_create(dev_id, xforms, mp); - return sess; + rte_cryptodev_trace_asym_session_create(dev_id, xforms, mp, sess); + return 0; } int @@ -2054,6 +2058,8 @@ rte_cryptodev_asym_session_free(uint8_t dev_id, void *sess) dev->dev_ops->asym_session_clear(dev, sess); + rte_free(((struct rte_cryptodev_asym_session *)sess)->event_mdata); + /* Return session to mempool */ sess_mp = rte_mempool_from_obj(sess); rte_mempool_put(sess_mp, sess); @@ -2159,6 +2165,33 @@ rte_cryptodev_sym_session_get_user_data( return (void *)(sess->sess_data + sess->nb_drivers); } +int +rte_cryptodev_asym_session_set_user_data(void *session, void *data, uint16_t size) +{ + struct rte_cryptodev_asym_session *sess = session; + if (sess == NULL) + return -EINVAL; + + if (sess->user_data_sz < size) + return -ENOMEM; + + rte_memcpy(sess->sess_private_data + + sess->max_priv_data_sz, + data, size); + return 0; +} + +void * +rte_cryptodev_asym_session_get_user_data(void *session) +{ + struct rte_cryptodev_asym_session *sess = session; + if (sess == NULL || sess->user_data_sz == 0) + return NULL; + + return (void *)(sess->sess_private_data + + sess->max_priv_data_sz); +} + static inline void sym_crypto_fill_status(struct rte_crypto_sym_vec *vec, int32_t errnum) { @@ -2235,6 +2268,47 @@ rte_cryptodev_configure_raw_dp_ctx(uint8_t dev_id, uint16_t qp_id, sess_type, session_ctx, is_update); } +int +rte_cryptodev_session_event_mdata_set(uint8_t dev_id, void *sess, + enum rte_crypto_op_type op_type, + enum rte_crypto_op_sess_type sess_type, + void *ev_mdata, + uint16_t size) +{ + struct rte_cryptodev *dev; + + if (sess == NULL || ev_mdata == NULL) + return -EINVAL; + + if (!rte_cryptodev_is_valid_dev(dev_id)) + goto skip_pmd_op; + + dev = rte_cryptodev_pmd_get_dev(dev_id); + if (dev->dev_ops->session_ev_mdata_set == NULL) + goto skip_pmd_op; + + return (*dev->dev_ops->session_ev_mdata_set)(dev, sess, op_type, + sess_type, ev_mdata); + +skip_pmd_op: + if (op_type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) + return rte_cryptodev_sym_session_set_user_data(sess, ev_mdata, + size); + else if (op_type == RTE_CRYPTO_OP_TYPE_ASYMMETRIC) { + struct rte_cryptodev_asym_session *s = sess; + + if (s->event_mdata == NULL) { + s->event_mdata = rte_malloc(NULL, size, 0); + if (s->event_mdata == NULL) + return -ENOMEM; + } + rte_memcpy(s->event_mdata, ev_mdata, size); + + return 0; + } else + return -ENOTSUP; +} + uint32_t rte_cryptodev_raw_enqueue_burst(struct rte_crypto_raw_dp_ctx *ctx, struct rte_crypto_sym_vec *vec, union rte_crypto_sym_ofs ofs,