DPDK  20.08.0
rte_crypto_sym.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2016-2020 Intel Corporation
3  */
4 
5 #ifndef _RTE_CRYPTO_SYM_H_
6 #define _RTE_CRYPTO_SYM_H_
7 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
21 #include <string.h>
22 
23 #include <rte_mbuf.h>
24 #include <rte_memory.h>
25 #include <rte_mempool.h>
26 #include <rte_common.h>
27 
35  void *base;
39  uint32_t len;
40 };
41 
50  uint32_t num;
51 };
52 
61  void **iv;
63  void **aad;
65  void **digest;
71  int32_t *status;
73  uint32_t num;
74 };
75 
81  uint64_t raw;
82  struct {
83  struct {
84  uint16_t head;
85  uint16_t tail;
86  } auth, cipher;
87  } ofs;
88 };
89 
142  RTE_CRYPTO_CIPHER_LIST_END
143 
144 };
145 
147 extern const char *
149 
156 };
157 
159 extern const char *
161 
177  struct {
178  const uint8_t *data;
179  uint16_t length;
180  } key;
204  struct {
205  uint16_t offset;
231  uint16_t length;
246  } iv;
247 };
248 
318  RTE_CRYPTO_AUTH_LIST_END
319 };
320 
322 extern const char *
324 
329 };
330 
332 extern const char *
334 
348  struct {
349  const uint8_t *data;
350  uint16_t length;
351  } key;
359  struct {
360  uint16_t offset;
376  uint16_t length;
394  } iv;
396  uint16_t digest_length;
406 };
407 
408 
417  RTE_CRYPTO_AEAD_LIST_END
418 };
419 
421 extern const char *
423 
430 };
431 
433 extern const char *
435 
436 struct rte_crypto_aead_xform {
439  enum rte_crypto_aead_algorithm algo;
442  struct {
443  const uint8_t *data;
444  uint16_t length;
445  } key;
446 
447  struct {
448  uint16_t offset;
468  uint16_t length;
484  } iv;
486  uint16_t digest_length;
487 
488  uint16_t aad_length;
494 };
495 
502 };
503 
517  ;
519  union {
524  struct rte_crypto_aead_xform aead;
526  };
527 };
528 
530 
562  struct rte_mbuf *m_src;
563  struct rte_mbuf *m_dst;
566  union {
571  struct rte_security_session *sec_session;
573  };
574 
576  union {
577  struct {
578  struct {
579  uint32_t offset;
584  uint32_t length;
589  } data;
590  struct {
591  uint8_t *data;
613  } digest;
614  struct {
615  uint8_t *data;
647  } aad;
649  } aead;
650 
651  struct {
652  struct {
653  struct {
654  uint32_t offset;
670  uint32_t length;
686  } data;
687  } cipher;
688 
689  struct {
690  struct {
691  uint32_t offset;
717  uint32_t length;
741  } data;
744  struct {
745  uint8_t *data;
818  } digest;
819  } auth;
820  };
821  };
822 };
823 
824 
830 static inline void
832 {
833  memset(op, 0, sizeof(*op));
834 }
835 
836 
847 static inline struct rte_crypto_sym_xform *
849  void *priv_data, uint8_t nb_xforms)
850 {
851  struct rte_crypto_sym_xform *xform;
852 
853  sym_op->xform = xform = (struct rte_crypto_sym_xform *)priv_data;
854 
855  do {
857  xform = xform->next = --nb_xforms > 0 ? xform + 1 : NULL;
858  } while (xform);
859 
860  return sym_op->xform;
861 }
862 
863 
870 static inline int
872  struct rte_cryptodev_sym_session *sess)
873 {
874  sym_op->session = sess;
875 
876  return 0;
877 }
878 
897 __rte_experimental
898 static inline int
899 rte_crypto_mbuf_to_vec(const struct rte_mbuf *mb, uint32_t ofs, uint32_t len,
900  struct rte_crypto_vec vec[], uint32_t num)
901 {
902  uint32_t i;
903  struct rte_mbuf *nseg;
904  uint32_t left;
905  uint32_t seglen;
906 
907  /* assuming that requested data starts in the first segment */
908  RTE_ASSERT(mb->data_len > ofs);
909 
910  if (mb->nb_segs > num)
911  return -mb->nb_segs;
912 
913  vec[0].base = rte_pktmbuf_mtod_offset(mb, void *, ofs);
914  vec[0].iova = rte_pktmbuf_iova_offset(mb, ofs);
915 
916  /* whole data lies in the first segment */
917  seglen = mb->data_len - ofs;
918  if (len <= seglen) {
919  vec[0].len = len;
920  return 1;
921  }
922 
923  /* data spread across segments */
924  vec[0].len = seglen;
925  left = len - seglen;
926  for (i = 1, nseg = mb->next; nseg != NULL; nseg = nseg->next, i++) {
927 
928  vec[i].base = rte_pktmbuf_mtod(nseg, void *);
929  vec[i].iova = rte_pktmbuf_iova(nseg);
930 
931  seglen = nseg->data_len;
932  if (left <= seglen) {
933  /* whole requested data is completed */
934  vec[i].len = left;
935  left = 0;
936  break;
937  }
938 
939  /* use whole segment */
940  vec[i].len = seglen;
941  left -= seglen;
942  }
943 
944  RTE_ASSERT(left == 0);
945  return i + 1;
946 }
947 
948 
949 #ifdef __cplusplus
950 }
951 #endif
952 
953 #endif /* _RTE_CRYPTO_SYM_H_ */
enum rte_crypto_cipher_operation op
struct rte_mbuf * next
static __rte_experimental int rte_crypto_mbuf_to_vec(const struct rte_mbuf *mb, uint32_t ofs, uint32_t len, struct rte_crypto_vec vec[], uint32_t num)
struct rte_security_session * sec_session
struct rte_crypto_auth_xform auth
uint64_t rte_iova_t
Definition: rte_common.h:394
#define rte_pktmbuf_iova(m)
uint16_t data_len
struct rte_crypto_cipher_xform cipher
static void __rte_crypto_sym_op_reset(struct rte_crypto_sym_op *op)
enum rte_crypto_auth_operation op
struct rte_mbuf * m_src
#define rte_pktmbuf_iova_offset(m, o)
rte_crypto_auth_operation
const char * rte_crypto_cipher_operation_strings[]
uint16_t nb_segs
const char * rte_crypto_aead_operation_strings[]
rte_crypto_cipher_operation
enum rte_crypto_auth_algorithm algo
#define rte_pktmbuf_mtod_offset(m, t, o)
struct rte_crypto_sgl * sgl
struct rte_crypto_cipher_xform::@98 key
const char * rte_crypto_aead_algorithm_strings[]
static struct rte_crypto_sym_xform * __rte_crypto_sym_op_sym_xforms_alloc(struct rte_crypto_sym_op *sym_op, void *priv_data, uint8_t nb_xforms)
rte_crypto_aead_operation
#define rte_pktmbuf_mtod(m, t)
struct rte_mbuf * m_dst
struct rte_crypto_aead_xform aead
static int __rte_crypto_sym_op_attach_sym_session(struct rte_crypto_sym_op *sym_op, struct rte_cryptodev_sym_session *sess)
struct rte_crypto_sym_op::@108::@110::@113 data
struct rte_crypto_auth_xform::@101 iv
struct rte_cryptodev_sym_session * session
struct rte_crypto_auth_xform::@100 key
struct rte_crypto_sym_op::@108::@110::@114 digest
#define RTE_STD_C11
Definition: rte_common.h:40
struct rte_crypto_vec * vec
rte_crypto_auth_algorithm
rte_crypto_sym_xform_type
const char * rte_crypto_auth_algorithm_strings[]
const uint8_t * data
struct rte_crypto_sym_xform * xform
enum rte_crypto_sym_xform_type type
enum rte_crypto_cipher_algorithm algo
struct rte_crypto_cipher_xform::@99 iv
const char * rte_crypto_auth_operation_strings[]
struct rte_crypto_sym_xform * next
rte_iova_t phys_addr
rte_iova_t iova
rte_crypto_aead_algorithm
const char * rte_crypto_cipher_algorithm_strings[]
struct rte_crypto_sym_op::@108::@110::@115 aad
rte_crypto_cipher_algorithm