1 /* SPDX-License-Identifier: BSD-3-Clause 2 * 3 * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. 4 * Copyright 2016,2020-2021 NXP 5 * 6 */ 7 8 #ifndef _DPAA2_SEC_PMD_PRIVATE_H_ 9 #define _DPAA2_SEC_PMD_PRIVATE_H_ 10 11 #ifdef RTE_LIB_SECURITY 12 #include <rte_security_driver.h> 13 #endif 14 15 #define CRYPTODEV_NAME_DPAA2_SEC_PMD crypto_dpaa2_sec 16 /**< NXP DPAA2 - SEC PMD device name */ 17 18 #define MAX_QUEUES 64 19 #define MAX_DESC_SIZE 64 20 /** private data structure for each DPAA2_SEC device */ 21 struct dpaa2_sec_dev_private { 22 void *mc_portal; /**< MC Portal for configuring this device */ 23 void *hw; /**< Hardware handle for this device.Used by NADK framework */ 24 struct rte_mempool *fle_pool; /* per device memory pool for FLE */ 25 int32_t hw_id; /**< An unique ID of this device instance */ 26 int32_t vfio_fd; /**< File descriptor received via VFIO */ 27 uint16_t token; /**< Token required by DPxxx objects */ 28 unsigned int max_nb_queue_pairs; 29 /**< Max number of queue pairs supported by device */ 30 }; 31 32 struct dpaa2_sec_qp { 33 struct dpaa2_queue rx_vq; 34 struct dpaa2_queue tx_vq; 35 }; 36 37 enum shr_desc_type { 38 DESC_UPDATE, 39 DESC_FINAL, 40 DESC_INITFINAL, 41 }; 42 43 #define DIR_ENC 1 44 #define DIR_DEC 0 45 46 #define DPAA2_IPv6_DEFAULT_VTC_FLOW 0x60000000 47 48 #define DPAA2_SET_FLC_EWS(flc) (flc->word1_bits23_16 |= 0x1) 49 #define DPAA2_SET_FLC_RSC(flc) (flc->word1_bits31_24 |= 0x1) 50 #define DPAA2_SET_FLC_REUSE_BS(flc) (flc->mode_bits |= 0x8000) 51 #define DPAA2_SET_FLC_REUSE_FF(flc) (flc->mode_bits |= 0x2000) 52 53 /* SEC Flow Context Descriptor */ 54 struct sec_flow_context { 55 /* word 0 */ 56 uint16_t word0_sdid; /* 11-0 SDID */ 57 uint16_t word0_res; /* 31-12 reserved */ 58 59 /* word 1 */ 60 uint8_t word1_sdl; /* 5-0 SDL */ 61 /* 7-6 reserved */ 62 63 uint8_t word1_bits_15_8; /* 11-8 CRID */ 64 /* 14-12 reserved */ 65 /* 15 CRJD */ 66 67 uint8_t word1_bits23_16; /* 16 EWS */ 68 /* 17 DAC */ 69 /* 18,19,20 ? */ 70 /* 23-21 reserved */ 71 72 uint8_t word1_bits31_24; /* 24 RSC */ 73 /* 25 RBMT */ 74 /* 31-26 reserved */ 75 76 /* word 2 RFLC[31-0] */ 77 uint32_t word2_rflc_31_0; 78 79 /* word 3 RFLC[63-32] */ 80 uint32_t word3_rflc_63_32; 81 82 /* word 4 */ 83 uint16_t word4_iicid; /* 15-0 IICID */ 84 uint16_t word4_oicid; /* 31-16 OICID */ 85 86 /* word 5 */ 87 uint32_t word5_ofqid:24; /* 23-0 OFQID */ 88 uint32_t word5_31_24:8; 89 /* 24 OSC */ 90 /* 25 OBMT */ 91 /* 29-26 reserved */ 92 /* 31-30 ICR */ 93 94 /* word 6 */ 95 uint32_t word6_oflc_31_0; 96 97 /* word 7 */ 98 uint32_t word7_oflc_63_32; 99 100 /* Word 8-15 storage profiles */ 101 uint16_t dl; /**< DataLength(correction) */ 102 uint16_t reserved; /**< reserved */ 103 uint16_t dhr; /**< DataHeadRoom(correction) */ 104 uint16_t mode_bits; /**< mode bits */ 105 uint16_t bpv0; /**< buffer pool0 valid */ 106 uint16_t bpid0; /**< Bypass Memory Translation */ 107 uint16_t bpv1; /**< buffer pool1 valid */ 108 uint16_t bpid1; /**< Bypass Memory Translation */ 109 uint64_t word_12_15[2]; /**< word 12-15 are reserved */ 110 }; 111 112 struct sec_flc_desc { 113 struct sec_flow_context flc; 114 uint32_t desc[MAX_DESC_SIZE]; 115 }; 116 117 struct ctxt_priv { 118 struct rte_mempool *fle_pool; /* per device memory pool for FLE */ 119 struct sec_flc_desc flc_desc[0]; 120 }; 121 122 enum dpaa2_sec_op_type { 123 DPAA2_SEC_NONE, /*!< No Cipher operations*/ 124 DPAA2_SEC_CIPHER,/*!< CIPHER operations */ 125 DPAA2_SEC_AUTH, /*!< Authentication Operations */ 126 DPAA2_SEC_AEAD, /*!< AEAD (AES-GCM/CCM) type operations */ 127 DPAA2_SEC_CIPHER_HASH, /*!< Authenticated Encryption with 128 * associated data 129 */ 130 DPAA2_SEC_HASH_CIPHER, /*!< Encryption with Authenticated 131 * associated data 132 */ 133 DPAA2_SEC_IPSEC, /*!< IPSEC protocol operations*/ 134 DPAA2_SEC_PDCP, /*!< PDCP protocol operations*/ 135 DPAA2_SEC_PKC, /*!< Public Key Cryptographic Operations */ 136 DPAA2_SEC_MAX 137 }; 138 139 struct dpaa2_sec_aead_ctxt { 140 uint16_t auth_only_len; /*!< Length of data for Auth only */ 141 uint8_t auth_cipher_text; /**< Authenticate/cipher ordering */ 142 }; 143 144 #ifdef RTE_LIB_SECURITY 145 /* 146 * The structure is to be filled by user for PDCP Protocol 147 */ 148 struct dpaa2_pdcp_ctxt { 149 enum rte_security_pdcp_domain domain; /*!< Data/Control mode*/ 150 int8_t bearer; /*!< PDCP bearer ID */ 151 int8_t pkt_dir;/*!< PDCP Frame Direction 0:UL 1:DL*/ 152 int8_t hfn_ovd;/*!< Overwrite HFN per packet*/ 153 uint8_t sn_size; /*!< Sequence number size, 5/7/12/15/18 */ 154 uint32_t hfn_ovd_offset;/*!< offset from rte_crypto_op at which 155 * per packet hfn is stored 156 */ 157 uint32_t hfn; /*!< Hyper Frame Number */ 158 uint32_t hfn_threshold; /*!< HFN Threashold for key renegotiation */ 159 }; 160 #endif 161 typedef struct dpaa2_sec_session_entry { 162 void *ctxt; 163 uint8_t ctxt_type; 164 uint8_t dir; /*!< Operation Direction */ 165 enum rte_crypto_cipher_algorithm cipher_alg; /*!< Cipher Algorithm*/ 166 enum rte_crypto_auth_algorithm auth_alg; /*!< Authentication Algorithm*/ 167 enum rte_crypto_aead_algorithm aead_alg; /*!< AEAD Algorithm*/ 168 union { 169 struct { 170 uint8_t *data; /**< pointer to key data */ 171 size_t length; /**< key length in bytes */ 172 } aead_key; 173 struct { 174 struct { 175 uint8_t *data; /**< pointer to key data */ 176 size_t length; /**< key length in bytes */ 177 } cipher_key; 178 struct { 179 uint8_t *data; /**< pointer to key data */ 180 size_t length; /**< key length in bytes */ 181 } auth_key; 182 }; 183 }; 184 union { 185 struct { 186 struct { 187 uint16_t length; /**< IV length in bytes */ 188 uint16_t offset; /**< IV offset in bytes */ 189 } iv; 190 uint16_t digest_length; 191 uint8_t status; 192 union { 193 struct dpaa2_sec_aead_ctxt aead_ctxt; 194 } ext_params; 195 }; 196 #ifdef RTE_LIB_SECURITY 197 struct dpaa2_pdcp_ctxt pdcp; 198 #endif 199 }; 200 } dpaa2_sec_session; 201 202 static const struct rte_cryptodev_capabilities dpaa2_sec_capabilities[] = { 203 /* Symmetric capabilities */ 204 { /* NULL (AUTH) */ 205 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 206 {.sym = { 207 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 208 {.auth = { 209 .algo = RTE_CRYPTO_AUTH_NULL, 210 .block_size = 1, 211 .key_size = { 212 .min = 0, 213 .max = 0, 214 .increment = 0 215 }, 216 .digest_size = { 217 .min = 0, 218 .max = 0, 219 .increment = 0 220 }, 221 .iv_size = { 0 } 222 }, }, 223 }, }, 224 }, 225 { /* MD5 */ 226 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 227 {.sym = { 228 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 229 {.auth = { 230 .algo = RTE_CRYPTO_AUTH_MD5, 231 .block_size = 64, 232 .key_size = { 233 .min = 0, 234 .max = 0, 235 .increment = 0 236 }, 237 .digest_size = { 238 .min = 16, 239 .max = 16, 240 .increment = 0 241 }, 242 .iv_size = { 0 } 243 }, } 244 }, } 245 }, 246 { /* MD5 HMAC */ 247 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 248 {.sym = { 249 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 250 {.auth = { 251 .algo = RTE_CRYPTO_AUTH_MD5_HMAC, 252 .block_size = 64, 253 .key_size = { 254 .min = 1, 255 .max = 64, 256 .increment = 1 257 }, 258 .digest_size = { 259 .min = 1, 260 .max = 16, 261 .increment = 1 262 }, 263 .iv_size = { 0 } 264 }, } 265 }, } 266 }, 267 { /* SHA1 */ 268 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 269 {.sym = { 270 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 271 {.auth = { 272 .algo = RTE_CRYPTO_AUTH_SHA1, 273 .block_size = 64, 274 .key_size = { 275 .min = 0, 276 .max = 0, 277 .increment = 0 278 }, 279 .digest_size = { 280 .min = 20, 281 .max = 20, 282 .increment = 0 283 }, 284 .iv_size = { 0 } 285 }, } 286 }, } 287 }, 288 { /* SHA1 HMAC */ 289 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 290 {.sym = { 291 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 292 {.auth = { 293 .algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 294 .block_size = 64, 295 .key_size = { 296 .min = 1, 297 .max = 64, 298 .increment = 1 299 }, 300 .digest_size = { 301 .min = 1, 302 .max = 20, 303 .increment = 1 304 }, 305 .iv_size = { 0 } 306 }, } 307 }, } 308 }, 309 { /* SHA224 */ 310 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 311 {.sym = { 312 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 313 {.auth = { 314 .algo = RTE_CRYPTO_AUTH_SHA224, 315 .block_size = 64, 316 .key_size = { 317 .min = 0, 318 .max = 0, 319 .increment = 0 320 }, 321 .digest_size = { 322 .min = 28, 323 .max = 28, 324 .increment = 0 325 }, 326 .iv_size = { 0 } 327 }, } 328 }, } 329 }, 330 { /* SHA224 HMAC */ 331 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 332 {.sym = { 333 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 334 {.auth = { 335 .algo = RTE_CRYPTO_AUTH_SHA224_HMAC, 336 .block_size = 64, 337 .key_size = { 338 .min = 1, 339 .max = 64, 340 .increment = 1 341 }, 342 .digest_size = { 343 .min = 1, 344 .max = 28, 345 .increment = 1 346 }, 347 .iv_size = { 0 } 348 }, } 349 }, } 350 }, 351 { /* SHA256 */ 352 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 353 {.sym = { 354 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 355 {.auth = { 356 .algo = RTE_CRYPTO_AUTH_SHA256, 357 .block_size = 64, 358 .key_size = { 359 .min = 0, 360 .max = 0, 361 .increment = 0 362 }, 363 .digest_size = { 364 .min = 32, 365 .max = 32, 366 .increment = 0 367 }, 368 .iv_size = { 0 } 369 }, } 370 }, } 371 }, 372 { /* SHA256 HMAC */ 373 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 374 {.sym = { 375 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 376 {.auth = { 377 .algo = RTE_CRYPTO_AUTH_SHA256_HMAC, 378 .block_size = 64, 379 .key_size = { 380 .min = 1, 381 .max = 64, 382 .increment = 1 383 }, 384 .digest_size = { 385 .min = 1, 386 .max = 32, 387 .increment = 1 388 }, 389 .iv_size = { 0 } 390 }, } 391 }, } 392 }, 393 { /* SHA384 */ 394 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 395 {.sym = { 396 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 397 {.auth = { 398 .algo = RTE_CRYPTO_AUTH_SHA384, 399 .block_size = 64, 400 .key_size = { 401 .min = 0, 402 .max = 0, 403 .increment = 0 404 }, 405 .digest_size = { 406 .min = 48, 407 .max = 48, 408 .increment = 0 409 }, 410 .iv_size = { 0 } 411 }, } 412 }, } 413 }, 414 { /* SHA384 HMAC */ 415 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 416 {.sym = { 417 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 418 {.auth = { 419 .algo = RTE_CRYPTO_AUTH_SHA384_HMAC, 420 .block_size = 128, 421 .key_size = { 422 .min = 1, 423 .max = 128, 424 .increment = 1 425 }, 426 .digest_size = { 427 .min = 1, 428 .max = 48, 429 .increment = 1 430 }, 431 .iv_size = { 0 } 432 }, } 433 }, } 434 }, 435 { /* SHA512 */ 436 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 437 {.sym = { 438 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 439 {.auth = { 440 .algo = RTE_CRYPTO_AUTH_SHA512, 441 .block_size = 128, 442 .key_size = { 443 .min = 0, 444 .max = 0, 445 .increment = 0 446 }, 447 .digest_size = { 448 .min = 64, 449 .max = 64, 450 .increment = 0 451 }, 452 .iv_size = { 0 } 453 }, } 454 }, } 455 }, 456 { /* SHA512 HMAC */ 457 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 458 {.sym = { 459 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 460 {.auth = { 461 .algo = RTE_CRYPTO_AUTH_SHA512_HMAC, 462 .block_size = 128, 463 .key_size = { 464 .min = 1, 465 .max = 128, 466 .increment = 1 467 }, 468 .digest_size = { 469 .min = 1, 470 .max = 64, 471 .increment = 1 472 }, 473 .iv_size = { 0 } 474 }, } 475 }, } 476 }, 477 { /* AES GCM */ 478 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 479 {.sym = { 480 .xform_type = RTE_CRYPTO_SYM_XFORM_AEAD, 481 {.aead = { 482 .algo = RTE_CRYPTO_AEAD_AES_GCM, 483 .block_size = 16, 484 .key_size = { 485 .min = 16, 486 .max = 32, 487 .increment = 8 488 }, 489 .digest_size = { 490 .min = 8, 491 .max = 16, 492 .increment = 4 493 }, 494 .aad_size = { 495 .min = 0, 496 .max = 240, 497 .increment = 1 498 }, 499 .iv_size = { 500 .min = 12, 501 .max = 12, 502 .increment = 0 503 }, 504 }, } 505 }, } 506 }, 507 { /* AES XCBC HMAC */ 508 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 509 {.sym = { 510 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 511 {.auth = { 512 .algo = RTE_CRYPTO_AUTH_AES_XCBC_MAC, 513 .block_size = 16, 514 .key_size = { 515 .min = 1, 516 .max = 16, 517 .increment = 1 518 }, 519 .digest_size = { 520 .min = 12, 521 .max = 16, 522 .increment = 4 523 }, 524 .aad_size = { 0 }, 525 .iv_size = { 0 } 526 }, } 527 }, } 528 }, 529 { /* AES CMAC */ 530 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 531 {.sym = { 532 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 533 {.auth = { 534 .algo = RTE_CRYPTO_AUTH_AES_CMAC, 535 .block_size = 16, 536 .key_size = { 537 .min = 1, 538 .max = 16, 539 .increment = 1 540 }, 541 .digest_size = { 542 .min = 4, 543 .max = 16, 544 .increment = 4 545 }, 546 .aad_size = { 0 } 547 }, } 548 }, } 549 }, 550 { /* NULL (CIPHER) */ 551 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 552 {.sym = { 553 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 554 {.cipher = { 555 .algo = RTE_CRYPTO_CIPHER_NULL, 556 .block_size = 1, 557 .key_size = { 558 .min = 0, 559 .max = 0, 560 .increment = 0 561 }, 562 .iv_size = { 563 .min = 0, 564 .max = 0, 565 .increment = 0 566 } 567 }, }, 568 }, } 569 }, 570 { /* AES CBC */ 571 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 572 {.sym = { 573 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 574 {.cipher = { 575 .algo = RTE_CRYPTO_CIPHER_AES_CBC, 576 .block_size = 16, 577 .key_size = { 578 .min = 16, 579 .max = 32, 580 .increment = 8 581 }, 582 .iv_size = { 583 .min = 16, 584 .max = 16, 585 .increment = 0 586 } 587 }, } 588 }, } 589 }, 590 { /* AES CTR */ 591 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 592 {.sym = { 593 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 594 {.cipher = { 595 .algo = RTE_CRYPTO_CIPHER_AES_CTR, 596 .block_size = 16, 597 .key_size = { 598 .min = 16, 599 .max = 32, 600 .increment = 8 601 }, 602 .iv_size = { 603 .min = 16, 604 .max = 16, 605 .increment = 0 606 }, 607 }, } 608 }, } 609 }, 610 { /* DES CBC */ 611 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 612 {.sym = { 613 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 614 {.cipher = { 615 .algo = RTE_CRYPTO_CIPHER_DES_CBC, 616 .block_size = 8, 617 .key_size = { 618 .min = 8, 619 .max = 8, 620 .increment = 0 621 }, 622 .iv_size = { 623 .min = 8, 624 .max = 8, 625 .increment = 0 626 } 627 }, } 628 }, } 629 }, 630 { /* 3DES CBC */ 631 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 632 {.sym = { 633 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 634 {.cipher = { 635 .algo = RTE_CRYPTO_CIPHER_3DES_CBC, 636 .block_size = 8, 637 .key_size = { 638 .min = 16, 639 .max = 24, 640 .increment = 8 641 }, 642 .iv_size = { 643 .min = 8, 644 .max = 8, 645 .increment = 0 646 } 647 }, } 648 }, } 649 }, 650 { /* SNOW 3G (UIA2) */ 651 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 652 {.sym = { 653 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 654 {.auth = { 655 .algo = RTE_CRYPTO_AUTH_SNOW3G_UIA2, 656 .block_size = 16, 657 .key_size = { 658 .min = 16, 659 .max = 16, 660 .increment = 0 661 }, 662 .digest_size = { 663 .min = 4, 664 .max = 4, 665 .increment = 0 666 }, 667 .iv_size = { 668 .min = 16, 669 .max = 16, 670 .increment = 0 671 } 672 }, } 673 }, } 674 }, 675 { /* SNOW 3G (UEA2) */ 676 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 677 {.sym = { 678 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 679 {.cipher = { 680 .algo = RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 681 .block_size = 16, 682 .key_size = { 683 .min = 16, 684 .max = 16, 685 .increment = 0 686 }, 687 .iv_size = { 688 .min = 16, 689 .max = 16, 690 .increment = 0 691 } 692 }, } 693 }, } 694 }, 695 { /* ZUC (EEA3) */ 696 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 697 {.sym = { 698 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 699 {.cipher = { 700 .algo = RTE_CRYPTO_CIPHER_ZUC_EEA3, 701 .block_size = 16, 702 .key_size = { 703 .min = 16, 704 .max = 16, 705 .increment = 0 706 }, 707 .iv_size = { 708 .min = 16, 709 .max = 16, 710 .increment = 0 711 } 712 }, } 713 }, } 714 }, 715 { /* ZUC (EIA3) */ 716 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 717 {.sym = { 718 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 719 {.auth = { 720 .algo = RTE_CRYPTO_AUTH_ZUC_EIA3, 721 .block_size = 16, 722 .key_size = { 723 .min = 16, 724 .max = 16, 725 .increment = 0 726 }, 727 .digest_size = { 728 .min = 4, 729 .max = 4, 730 .increment = 0 731 }, 732 .iv_size = { 733 .min = 16, 734 .max = 16, 735 .increment = 0 736 } 737 }, } 738 }, } 739 }, 740 RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() 741 }; 742 743 #ifdef RTE_LIB_SECURITY 744 745 static const struct rte_cryptodev_capabilities dpaa2_pdcp_capabilities[] = { 746 { /* SNOW 3G (UIA2) */ 747 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 748 {.sym = { 749 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 750 {.auth = { 751 .algo = RTE_CRYPTO_AUTH_SNOW3G_UIA2, 752 .block_size = 16, 753 .key_size = { 754 .min = 16, 755 .max = 16, 756 .increment = 0 757 }, 758 .digest_size = { 759 .min = 4, 760 .max = 4, 761 .increment = 0 762 }, 763 .iv_size = { 764 .min = 16, 765 .max = 16, 766 .increment = 0 767 } 768 }, } 769 }, } 770 }, 771 { /* SNOW 3G (UEA2) */ 772 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 773 {.sym = { 774 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 775 {.cipher = { 776 .algo = RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 777 .block_size = 16, 778 .key_size = { 779 .min = 16, 780 .max = 16, 781 .increment = 0 782 }, 783 .iv_size = { 784 .min = 16, 785 .max = 16, 786 .increment = 0 787 } 788 }, } 789 }, } 790 }, 791 { /* AES CTR */ 792 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 793 {.sym = { 794 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 795 {.cipher = { 796 .algo = RTE_CRYPTO_CIPHER_AES_CTR, 797 .block_size = 16, 798 .key_size = { 799 .min = 16, 800 .max = 32, 801 .increment = 8 802 }, 803 .iv_size = { 804 .min = 16, 805 .max = 16, 806 .increment = 0 807 } 808 }, } 809 }, } 810 }, 811 { /* NULL (AUTH) */ 812 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 813 {.sym = { 814 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 815 {.auth = { 816 .algo = RTE_CRYPTO_AUTH_NULL, 817 .block_size = 1, 818 .key_size = { 819 .min = 0, 820 .max = 0, 821 .increment = 0 822 }, 823 .digest_size = { 824 .min = 0, 825 .max = 0, 826 .increment = 0 827 }, 828 .iv_size = { 0 } 829 }, }, 830 }, }, 831 }, 832 { /* NULL (CIPHER) */ 833 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 834 {.sym = { 835 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 836 {.cipher = { 837 .algo = RTE_CRYPTO_CIPHER_NULL, 838 .block_size = 1, 839 .key_size = { 840 .min = 0, 841 .max = 0, 842 .increment = 0 843 }, 844 .iv_size = { 845 .min = 0, 846 .max = 0, 847 .increment = 0 848 } 849 }, }, 850 }, } 851 }, 852 { /* ZUC (EEA3) */ 853 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 854 {.sym = { 855 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 856 {.cipher = { 857 .algo = RTE_CRYPTO_CIPHER_ZUC_EEA3, 858 .block_size = 16, 859 .key_size = { 860 .min = 16, 861 .max = 16, 862 .increment = 0 863 }, 864 .iv_size = { 865 .min = 16, 866 .max = 16, 867 .increment = 0 868 } 869 }, } 870 }, } 871 }, 872 { /* ZUC (EIA3) */ 873 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 874 {.sym = { 875 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 876 {.auth = { 877 .algo = RTE_CRYPTO_AUTH_ZUC_EIA3, 878 .block_size = 16, 879 .key_size = { 880 .min = 16, 881 .max = 16, 882 .increment = 0 883 }, 884 .digest_size = { 885 .min = 4, 886 .max = 4, 887 .increment = 0 888 }, 889 .iv_size = { 890 .min = 16, 891 .max = 16, 892 .increment = 0 893 } 894 }, } 895 }, } 896 }, 897 898 RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() 899 }; 900 901 static const struct rte_security_capability dpaa2_sec_security_cap[] = { 902 { /* IPsec Lookaside Protocol offload ESP Transport Egress */ 903 .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, 904 .protocol = RTE_SECURITY_PROTOCOL_IPSEC, 905 .ipsec = { 906 .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP, 907 .mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL, 908 .direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS, 909 .options = { 0 }, 910 .replay_win_sz_max = 128 911 }, 912 .crypto_capabilities = dpaa2_sec_capabilities 913 }, 914 { /* IPsec Lookaside Protocol offload ESP Tunnel Ingress */ 915 .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, 916 .protocol = RTE_SECURITY_PROTOCOL_IPSEC, 917 .ipsec = { 918 .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP, 919 .mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL, 920 .direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS, 921 .options = { 0 }, 922 .replay_win_sz_max = 128 923 }, 924 .crypto_capabilities = dpaa2_sec_capabilities 925 }, 926 { /* PDCP Lookaside Protocol offload Data */ 927 .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, 928 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 929 .pdcp = { 930 .domain = RTE_SECURITY_PDCP_MODE_DATA, 931 .capa_flags = 0 932 }, 933 .crypto_capabilities = dpaa2_pdcp_capabilities 934 }, 935 { /* PDCP Lookaside Protocol offload Control */ 936 .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, 937 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 938 .pdcp = { 939 .domain = RTE_SECURITY_PDCP_MODE_CONTROL, 940 .capa_flags = 0 941 }, 942 .crypto_capabilities = dpaa2_pdcp_capabilities 943 }, 944 { 945 .action = RTE_SECURITY_ACTION_TYPE_NONE 946 } 947 }; 948 #endif 949 /** 950 * Checksum 951 * 952 * @param buffer calculate chksum for buffer 953 * @param len buffer length 954 * 955 * @return checksum value in host cpu order 956 */ 957 static inline uint16_t 958 calc_chksum(void *buffer, int len) 959 { 960 uint16_t *buf = (uint16_t *)buffer; 961 uint32_t sum = 0; 962 uint16_t result; 963 964 for (sum = 0; len > 1; len -= 2) 965 sum += *buf++; 966 967 if (len == 1) 968 sum += *(unsigned char *)buf; 969 970 sum = (sum >> 16) + (sum & 0xFFFF); 971 sum += (sum >> 16); 972 result = ~sum; 973 974 return result; 975 } 976 977 #endif /* _DPAA2_SEC_PMD_PRIVATE_H_ */ 978