1 /* SPDX-License-Identifier: BSD-3-Clause */ 2 /* Copyright(c) 2007-2022 Intel Corporation */ 3 /* $FreeBSD$ */ 4 #ifndef QAT_UTILS_H 5 #define QAT_UTILS_H 6 7 8 #include <sys/param.h> 9 #include <sys/ctype.h> 10 #include <sys/endian.h> 11 #include <sys/lock.h> 12 #include <sys/mutex.h> 13 #include <sys/systm.h> 14 #include <sys/types.h> 15 #include <sys/sema.h> 16 #include <sys/time.h> 17 #include <sys/malloc.h> 18 #include <sys/kernel.h> 19 #include <sys/sysctl.h> 20 #include <sys/limits.h> 21 #include <sys/unistd.h> 22 #include <sys/libkern.h> 23 #ifdef __x86_64__ 24 #include <asm/atomic64.h> 25 #else 26 #include <asm/atomic.h> 27 #endif 28 #include <vm/vm.h> 29 #include <vm/pmap.h> 30 31 #include <sys/md5.h> 32 #include <crypto/sha1.h> 33 #include <crypto/sha2/sha256.h> 34 #include <crypto/sha2/sha224.h> 35 #include <crypto/sha2/sha384.h> 36 #include <crypto/sha2/sha512.h> 37 #include <crypto/rijndael/rijndael-api-fst.h> 38 39 #include <opencrypto/cryptodev.h> 40 41 #include "cpa.h" 42 43 #define QAT_UTILS_LOG(...) printf("QAT: "__VA_ARGS__) 44 45 #define QAT_UTILS_WAIT_FOREVER (-1) 46 #define QAT_UTILS_WAIT_NONE 0 47 48 #define QAT_UTILS_HOST_TO_NW_16(uData) QAT_UTILS_OS_HOST_TO_NW_16(uData) 49 #define QAT_UTILS_HOST_TO_NW_32(uData) QAT_UTILS_OS_HOST_TO_NW_32(uData) 50 #define QAT_UTILS_HOST_TO_NW_64(uData) QAT_UTILS_OS_HOST_TO_NW_64(uData) 51 52 #define QAT_UTILS_NW_TO_HOST_16(uData) QAT_UTILS_OS_NW_TO_HOST_16(uData) 53 #define QAT_UTILS_NW_TO_HOST_32(uData) QAT_UTILS_OS_NW_TO_HOST_32(uData) 54 #define QAT_UTILS_NW_TO_HOST_64(uData) QAT_UTILS_OS_NW_TO_HOST_64(uData) 55 56 #define QAT_UTILS_UDIV64_32(dividend, divisor) \ 57 QAT_UTILS_OS_UDIV64_32(dividend, divisor) 58 59 #define QAT_UTILS_UMOD64_32(dividend, divisor) \ 60 QAT_UTILS_OS_UMOD64_32(dividend, divisor) 61 62 #define ICP_CHECK_FOR_NULL_PARAM(param) \ 63 do { \ 64 if (NULL == param) { \ 65 QAT_UTILS_LOG("%s(): invalid param: %s\n", \ 66 __FUNCTION__, \ 67 #param); \ 68 return CPA_STATUS_INVALID_PARAM; \ 69 } \ 70 } while (0) 71 72 #define ICP_CHECK_FOR_NULL_PARAM_VOID(param) \ 73 do { \ 74 if (NULL == param) { \ 75 QAT_UTILS_LOG("%s(): invalid param: %s\n", \ 76 __FUNCTION__, \ 77 #param); \ 78 return; \ 79 } \ 80 } while (0) 81 82 /*Macro for adding an element to the tail of a doubly linked list*/ 83 /*The currentptr tracks the tail, and the headptr tracks the head.*/ 84 #define ICP_ADD_ELEMENT_TO_END_OF_LIST(elementtoadd, currentptr, headptr) \ 85 do { \ 86 if (NULL == currentptr) { \ 87 currentptr = elementtoadd; \ 88 elementtoadd->pNext = NULL; \ 89 elementtoadd->pPrev = NULL; \ 90 headptr = currentptr; \ 91 } else { \ 92 elementtoadd->pPrev = currentptr; \ 93 currentptr->pNext = elementtoadd; \ 94 elementtoadd->pNext = NULL; \ 95 currentptr = elementtoadd; \ 96 } \ 97 } while (0) 98 99 /*currentptr is not used in this case since we don't track the tail. */ 100 #define ICP_ADD_ELEMENT_TO_HEAD_OF_LIST(elementtoadd, currentptr, headptr) \ 101 do { \ 102 if (NULL == headptr) { \ 103 elementtoadd->pNext = NULL; \ 104 elementtoadd->pPrev = NULL; \ 105 headptr = elementtoadd; \ 106 } else { \ 107 elementtoadd->pPrev = NULL; \ 108 elementtoadd->pNext = headptr; \ 109 headptr->pPrev = elementtoadd; \ 110 headptr = elementtoadd; \ 111 } \ 112 } while (0) 113 114 #define ICP_REMOVE_ELEMENT_FROM_LIST(elementtoremove, currentptr, headptr) \ 115 do { \ 116 /*If the previous pointer is not NULL*/ \ 117 if (NULL != elementtoremove->pPrev) { \ 118 elementtoremove->pPrev->pNext = \ 119 elementtoremove->pNext; \ 120 if (elementtoremove->pNext) { \ 121 elementtoremove->pNext->pPrev = \ 122 elementtoremove->pPrev; \ 123 } else { \ 124 /* Move the tail pointer backwards */ \ 125 currentptr = elementtoremove->pPrev; \ 126 } \ 127 } else if (NULL != elementtoremove->pNext) { \ 128 /*Remove the head pointer.*/ \ 129 elementtoremove->pNext->pPrev = NULL; \ 130 /*Hence move the head forward.*/ \ 131 headptr = elementtoremove->pNext; \ 132 } else { \ 133 /*Remove the final entry in the list. */ \ 134 currentptr = NULL; \ 135 headptr = NULL; \ 136 } \ 137 } while (0) 138 139 MALLOC_DECLARE(M_QAT); 140 141 #ifdef __x86_64__ 142 typedef atomic64_t QatUtilsAtomic; 143 #else 144 typedef atomic_t QatUtilsAtomic; 145 #endif 146 147 #define QAT_UTILS_OS_NW_TO_HOST_16(uData) be16toh(uData) 148 #define QAT_UTILS_OS_NW_TO_HOST_32(uData) be32toh(uData) 149 #define QAT_UTILS_OS_NW_TO_HOST_64(uData) be64toh(uData) 150 151 #define QAT_UTILS_OS_HOST_TO_NW_16(uData) htobe16(uData) 152 #define QAT_UTILS_OS_HOST_TO_NW_32(uData) htobe32(uData) 153 #define QAT_UTILS_OS_HOST_TO_NW_64(uData) htobe64(uData) 154 155 /** 156 * @ingroup QatUtils 157 * 158 * @brief Atomically read the value of atomic variable 159 * 160 * @param pAtomicVar IN - atomic variable 161 * 162 * Atomically reads the value of pAtomicVar to the outValue 163 * 164 * @li Reentrant: yes 165 * @li IRQ safe: yes 166 * 167 * @return pAtomicVar value 168 */ 169 int64_t qatUtilsAtomicGet(QatUtilsAtomic *pAtomicVar); 170 171 /** 172 * @ingroup QatUtils 173 * 174 * @brief Atomically set the value of atomic variable 175 * 176 * @param inValue IN - atomic variable to be set equal to inValue 177 * 178 * @param pAtomicVar OUT - atomic variable 179 * 180 * Atomically sets the value of pAtomicVar to the value given 181 * 182 * @li Reentrant: yes 183 * @li IRQ safe: yes 184 * 185 * @return none 186 */ 187 void qatUtilsAtomicSet(int64_t inValue, QatUtilsAtomic *pAtomicVar); 188 189 /** 190 * @ingroup QatUtils 191 * 192 * @brief add the value to atomic variable 193 * 194 * @param inValue (in) - value to be added to the atomic variable 195 * 196 * @param pAtomicVar (in & out) - atomic variable 197 * 198 * Atomically adds the value of inValue to the pAtomicVar 199 * 200 * @li Reentrant: yes 201 * @li IRQ safe: yes 202 * 203 * @return pAtomicVar value after the addition 204 */ 205 int64_t qatUtilsAtomicAdd(int64_t inValue, QatUtilsAtomic *pAtomicVar); 206 207 /** 208 * @ingroup QatUtils 209 * 210 * @brief subtract the value from atomic variable 211 * 212 * @param inValue IN - atomic variable value to be subtracted by value 213 * 214 * @param pAtomicVar IN/OUT - atomic variable 215 * 216 * Atomically subtracts the value of pAtomicVar by inValue 217 * 218 * @li Reentrant: yes 219 * @li IRQ safe: yes 220 * 221 * @return pAtomicVar value after the subtraction 222 */ 223 int64_t qatUtilsAtomicSub(int64_t inValue, QatUtilsAtomic *pAtomicVar); 224 225 /** 226 * @ingroup QatUtils 227 * 228 * @brief increment value of atomic variable by 1 229 * 230 * @param pAtomicVar IN/OUT - atomic variable 231 * 232 * Atomically increments the value of pAtomicVar by 1. 233 * 234 * @li Reentrant: yes 235 * @li IRQ safe: yes 236 * 237 * @return pAtomicVar value after the increment 238 */ 239 int64_t qatUtilsAtomicInc(QatUtilsAtomic *pAtomicVar); 240 241 /** 242 * @ingroup QatUtils 243 * 244 * @brief decrement value of atomic variable by 1 245 * 246 * @param pAtomicVar IN/OUT - atomic variable 247 * 248 * Atomically decrements the value of pAtomicVar by 1. 249 * 250 * @li Reentrant: yes 251 * @li IRQ safe: yes 252 * 253 * @return pAtomic value after the decrement 254 */ 255 int64_t qatUtilsAtomicDec(QatUtilsAtomic *pAtomicVar); 256 257 /** 258 * @ingroup QatUtils 259 * 260 * @brief NUMA aware memory allocation; available on Linux OS only. 261 * 262 * @param size - memory size to allocate, in bytes 263 * @param node - node 264 * @param alignment - memory boundary alignment (alignment can not be 0) 265 * 266 * Allocates a memory zone of a given size on the specified node 267 * The returned memory is guaraunteed to be physically contiguous if the 268 * given size is less than 128KB and belonging to the node specified 269 * 270 * @li Reentrant: yes 271 * @li IRQ safe: no 272 * 273 * @return Pointer to the allocated zone or NULL if the allocation failed 274 */ 275 void *qatUtilsMemAllocContiguousNUMA(uint32_t size, 276 uint32_t node, 277 uint32_t alignment); 278 279 /** 280 * @ingroup QatUtils 281 * 282 * @brief Frees memory allocated by qatUtilsMemAllocContigousNUMA. 283 * 284 * @param ptr - pointer to the memory zone 285 * @param size - size of the pointer previously allocated 286 * 287 * Frees a previously allocated memory zone 288 * 289 * @li Reentrant: yes 290 * @li IRQ safe: no 291 * 292 * @return - none 293 */ 294 void qatUtilsMemFreeNUMA(void *ptr); 295 296 /** 297 * @ingroup QatUtils 298 * 299 * @brief virtual to physical address translation 300 * 301 * @param virtAddr - virtual address 302 * 303 * Converts a virtual address into its equivalent MMU-mapped physical address 304 * 305 * @li Reentrant: yes 306 * @li IRQ safe: yes 307 * 308 * @return Corresponding physical address 309 */ 310 #define QAT_UTILS_MMU_VIRT_TO_PHYS(virtAddr) \ 311 ((uint64_t)((virtAddr) ? vtophys(virtAddr) : 0)) 312 313 /** 314 * @ingroup QatUtils 315 * 316 * @brief Initializes the SpinLock object 317 * 318 * @param pLock - Spinlock handle 319 * 320 * Initializes the SpinLock object. 321 * 322 * @li Reentrant: yes 323 * @li IRQ safe: yes 324 * 325 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 326 */ 327 CpaStatus qatUtilsLockInit(struct mtx *pLock); 328 329 /** 330 * @ingroup QatUtils 331 * 332 * @brief Acquires a spin lock 333 * 334 * @param pLock - Spinlock handle 335 * 336 * This routine acquires a spin lock so the 337 * caller can synchronize access to shared data in a 338 * multiprocessor-safe way by raising IRQL. 339 * 340 * @li Reentrant: yes 341 * @li IRQ safe: yes 342 * 343 * @return - Returns CPA_STATUS_SUCCESS if the spinlock is acquired. Returns 344 * CPA_STATUS_FAIL 345 * if 346 * spinlock handle is NULL. If spinlock is already acquired by any 347 * other thread of execution then it tries in busy loop/spins till it 348 * gets spinlock. 349 */ 350 CpaStatus qatUtilsLock(struct mtx *pLock); 351 352 /** 353 * @ingroup QatUtils 354 * 355 * @brief Releases the spin lock 356 * 357 * @param pLock - Spinlock handle 358 * 359 * This routine releases the spin lock which the thread had acquired 360 * 361 * @li Reentrant: yes 362 * @li IRQ safe: yes 363 * 364 * @return - return CPA_STATUS_SUCCESS if the spinlock is released. Returns 365 * CPA_STATUS_FAIL 366 * if 367 * spinlockhandle passed is NULL. 368 */ 369 CpaStatus qatUtilsUnlock(struct mtx *pLock); 370 371 /** 372 * @ingroup QatUtils 373 * 374 * @brief Destroy the spin lock object 375 * 376 * @param pLock - Spinlock handle 377 * 378 * @li Reentrant: yes 379 * @li IRQ safe: yes 380 * 381 * @return - returns CPA_STATUS_SUCCESS if plock is destroyed. 382 * returns CPA_STATUS_FAIL if plock is NULL. 383 */ 384 CpaStatus qatUtilsLockDestroy(struct mtx *pLock); 385 386 /** 387 * @ingroup QatUtils 388 * 389 * @brief Initializes a semaphore 390 * 391 * @param pSid - semaphore handle 392 * @param start_value - initial semaphore value 393 * 394 * Initializes a semaphore object 395 * Note: Semaphore initialization qatUtilsSemaphoreInit API must be called 396 * first before using any QAT Utils Semaphore APIs 397 * 398 * @li Reentrant: yes 399 * @li IRQ safe: no 400 * 401 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 402 */ 403 CpaStatus qatUtilsSemaphoreInit(struct sema **pSid, uint32_t start_value); 404 405 /** 406 * @ingroup QatUtils 407 * 408 * @brief Destroys a semaphore object 409 * 410 * @param pSid - semaphore handle 411 * 412 * Destroys a semaphore object; the caller should ensure that no thread is 413 * blocked on this semaphore. If call made when thread blocked on semaphore the 414 * behaviour is unpredictable 415 * 416 * @li Reentrant: yes 417 ] * @li IRQ safe: no 418 * 419 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 420 */ 421 CpaStatus qatUtilsSemaphoreDestroy(struct sema **pSid); 422 423 /** 424 * @ingroup QatUtils 425 * 426 * @brief Waits on (decrements) a semaphore 427 * 428 * @param pSid - semaphore handle 429 * @param timeout - timeout, in ms; QAT_UTILS_WAIT_FOREVER (-1) if the thread 430 * is to block indefinitely or QAT_UTILS_WAIT_NONE (0) if the thread is to 431 * return immediately even if the call fails 432 * 433 * Decrements a semaphore, blocking if the semaphore is 434 * unavailable (value is 0). 435 * 436 * @li Reentrant: yes 437 * @li IRQ safe: no 438 * 439 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 440 */ 441 CpaStatus qatUtilsSemaphoreWait(struct sema **pSid, int32_t timeout); 442 443 /** 444 * @ingroup QatUtils 445 * 446 * @brief Non-blocking wait on semaphore 447 * 448 * @param semaphore - semaphore handle 449 * 450 * Decrements a semaphore, not blocking the calling thread if the semaphore 451 * is unavailable 452 * 453 * @li Reentrant: yes 454 * @li IRQ safe: no 455 * 456 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 457 */ 458 CpaStatus qatUtilsSemaphoreTryWait(struct sema **semaphore); 459 460 /** 461 * @ingroup QatUtils 462 * 463 * @brief Posts to (increments) a semaphore 464 * 465 * @param pSid - semaphore handle 466 * 467 * Increments a semaphore object 468 * 469 * @li Reentrant: yes 470 * @li IRQ safe: no 471 * 472 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 473 */ 474 CpaStatus qatUtilsSemaphorePost(struct sema **pSid); 475 476 /** 477 * @ingroup QatUtils 478 * 479 * @brief initializes a pMutex 480 * 481 * @param pMutex - pMutex handle 482 * 483 * Initializes a pMutex object 484 * @note Mutex initialization qatUtilsMutexInit API must be called 485 * first before using any QAT Utils Mutex APIs 486 * 487 * @li Reentrant: yes 488 * @li IRQ safe: no 489 * 490 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 491 */ 492 CpaStatus qatUtilsMutexInit(struct mtx **pMutex); 493 494 /** 495 * @ingroup QatUtils 496 * 497 * @brief locks a pMutex 498 * 499 * @param pMutex - pMutex handle 500 * @param timeout - timeout in ms; QAT_UTILS_WAIT_FOREVER (-1) to wait forever 501 * or QAT_UTILS_WAIT_NONE to return immediately 502 * 503 * Locks a pMutex object 504 * 505 * @li Reentrant: yes 506 * @li IRQ safe: no 507 * 508 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 509 */ 510 CpaStatus qatUtilsMutexLock(struct mtx **pMutex, int32_t timeout); 511 512 /** 513 * @ingroup QatUtils 514 * 515 * @brief Unlocks a pMutex 516 * 517 * @param pMutex - pMutex handle 518 * 519 * Unlocks a pMutex object 520 * 521 * @li Reentrant: yes 522 * @li IRQ safe: no 523 * 524 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 525 */ 526 CpaStatus qatUtilsMutexUnlock(struct mtx **pMutex); 527 528 /** 529 * @ingroup QatUtils 530 * 531 * @brief Destroys a pMutex object 532 * 533 * @param pMutex - pMutex handle 534 * 535 * Destroys a pMutex object; the caller should ensure that no thread is 536 * blocked on this pMutex. If call made when thread blocked on pMutex the 537 * behaviour is unpredictable 538 * 539 * @li Reentrant: yes 540 * @li IRQ safe: no 541 * 542 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 543 */ 544 CpaStatus qatUtilsMutexDestroy(struct mtx **pMutex); 545 546 /** 547 * @ingroup QatUtils 548 * 549 * @brief Non-blocking attempt to lock a pMutex 550 * 551 * @param pMutex - pMutex handle 552 * 553 * Attempts to lock a pMutex object, returning immediately with 554 * CPA_STATUS_SUCCESS if 555 * the lock was successful or CPA_STATUS_FAIL if the lock failed 556 * 557 * @li Reentrant: yes 558 * @li IRQ safe: no 559 * 560 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 561 */ 562 CpaStatus qatUtilsMutexTryLock(struct mtx **pMutex); 563 564 /** 565 * @ingroup QatUtils 566 * 567 * @brief Yielding sleep for a number of milliseconds 568 * 569 * @param milliseconds - number of milliseconds to sleep 570 * 571 * The calling thread will sleep for the specified number of milliseconds. 572 * This sleep is yielding, hence other tasks will be scheduled by the 573 * operating system during the sleep period. Calling this function with an 574 * argument of 0 will place the thread at the end of the current scheduling 575 * loop. 576 * 577 * @li Reentrant: yes 578 * @li IRQ safe: no 579 * 580 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 581 */ 582 CpaStatus qatUtilsSleep(uint32_t milliseconds); 583 584 /** 585 * @ingroup QatUtils 586 * 587 * @brief Yields execution of current thread 588 * 589 * Yields the execution of the current thread 590 * 591 * @li Reentrant: yes 592 * @li IRQ safe: no 593 * 594 * @return - none 595 */ 596 void qatUtilsYield(void); 597 598 /** 599 * @ingroup QatUtils 600 * 601 * @brief Calculate MD5 transform operation 602 * 603 * @param in - pointer to data to be processed. 604 * The buffer needs to be at least md5 block size long as defined in 605 * rfc1321 (64 bytes) 606 * out - output pointer for state data after single md5 transform 607 * operation. 608 * The buffer needs to be at least md5 state size long as defined in 609 * rfc1321 (16 bytes) 610 * 611 * @li Reentrant: yes 612 * @li IRQ safe: yes 613 * 614 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 615 * 616 */ 617 CpaStatus qatUtilsHashMD5(uint8_t *in, uint8_t *out); 618 619 /** 620 * @ingroup QatUtils 621 * 622 * @brief Calculate MD5 transform operation 623 * 624 * @param in - pointer to data to be processed. 625 * The buffer needs to be at least md5 block size long as defined in 626 * rfc1321 (64 bytes) 627 * out - output pointer for state data after single md5 transform 628 * operation. 629 * The buffer needs to be at least md5 state size long as defined in 630 * rfc1321 (16 bytes) 631 * len - Length on the input to be processed. 632 * 633 * @li Reentrant: yes 634 * @li IRQ safe: yes 635 * 636 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 637 * 638 */ 639 CpaStatus qatUtilsHashMD5Full(uint8_t *in, uint8_t *out, uint32_t len); 640 641 /** 642 * @ingroup QatUtils 643 * 644 * @brief Calculate SHA1 transform operation 645 * 646 * @param in - pointer to data to be processed. 647 * The buffer needs to be at least sha1 block size long as defined in 648 * rfc3174 (64 bytes) 649 * out - output pointer for state data after single sha1 transform 650 * operation. 651 * The buffer needs to be at least sha1 state size long as defined in 652 * rfc3174 (20 bytes) 653 * 654 * @li Reentrant: yes 655 * @li IRQ safe: yes 656 * 657 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 658 * 659 */ 660 CpaStatus qatUtilsHashSHA1(uint8_t *in, uint8_t *out); 661 662 /** 663 * @ingroup QatUtils 664 * 665 * @brief Calculate SHA1 transform operation 666 * 667 * @param in - pointer to data to be processed. 668 * The buffer needs to be at least sha1 block size long as defined in 669 * rfc3174 (64 bytes) 670 * out - output pointer for state data after single sha1 transform 671 * operation. 672 * The buffer needs to be at least sha1 state size long as defined in 673 * rfc3174 (20 bytes) 674 * len - Length on the input to be processed. 675 * 676 * @li Reentrant: yes 677 * @li IRQ safe: yes 678 * 679 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 680 * 681 */ 682 CpaStatus qatUtilsHashSHA1Full(uint8_t *in, uint8_t *out, uint32_t len); 683 684 /** 685 * @ingroup QatUtils 686 * 687 * @brief Calculate SHA224 transform operation 688 * 689 * @param in - pointer to data to be processed. 690 * The buffer needs to be at least sha224 block size long as defined in 691 * rfc3874 and rfc4868 (64 bytes) 692 * out - output pointer for state data after single sha224 transform 693 * operation. 694 * The buffer needs to be at least sha224 state size long as defined in 695 * rfc3874 and rfc4868 (32 bytes) 696 * @li Reentrant: yes 697 * @li IRQ safe: yes 698 * 699 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 700 * 701 */ 702 CpaStatus qatUtilsHashSHA224(uint8_t *in, uint8_t *out); 703 704 /** 705 * @ingroup QatUtils 706 * 707 * @brief Calculate SHA256 transform operation 708 * 709 * 710 * @param in - pointer to data to be processed. 711 * The buffer needs to be at least sha256 block size long as defined in 712 * rfc4868 (64 bytes) 713 * out - output pointer for state data after single sha256 transform 714 * operation. 715 * The buffer needs to be at least sha256 state size long as defined in 716 * rfc4868 (32 bytes) 717 * @li Reentrant: yes 718 * @li IRQ safe: yes 719 * 720 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 721 * 722 */ 723 CpaStatus qatUtilsHashSHA256(uint8_t *in, uint8_t *out); 724 725 /** 726 * @ingroup QatUtils 727 * 728 * @brief Calculate SHA256 transform operation 729 * 730 * 731 * @param in - pointer to data to be processed. 732 * The buffer needs to be at least sha256 block size long as defined in 733 * rfc4868 (64 bytes) 734 * out - output pointer for state data after single sha256 transform 735 * operation. 736 * The buffer needs to be at least sha256 state size long as defined in 737 * rfc4868 (32 bytes) 738 * len - Length on the input to be processed. 739 * @li Reentrant: yes 740 * @li IRQ safe: yes 741 * 742 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 743 * 744 */ 745 CpaStatus qatUtilsHashSHA256Full(uint8_t *in, uint8_t *out, uint32_t len); 746 747 /** 748 * @ingroup QatUtils 749 * 750 * @brief Calculate SHA384 transform operation 751 * 752 * @param in - pointer to data to be processed. 753 * The buffer needs to be at least sha384 block size long as defined in 754 * rfc4868 (128 bytes) 755 * out - output pointer for state data after single sha384 transform 756 * operation. 757 * The buffer needs to be at least sha384 state size long as defined in 758 * rfc4868 (64 bytes) 759 * @li Reentrant: yes 760 * @li IRQ safe: yes 761 * 762 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 763 * 764 */ 765 CpaStatus qatUtilsHashSHA384(uint8_t *in, uint8_t *out); 766 767 /** 768 * @ingroup QatUtils 769 * 770 * @brief Calculate SHA384 transform operation 771 * 772 * @param in - pointer to data to be processed. 773 * The buffer needs to be at least sha384 block size long as defined in 774 * rfc4868 (128 bytes) 775 * out - output pointer for state data after single sha384 transform 776 * operation. 777 * The buffer needs to be at least sha384 state size long as defined in 778 * rfc4868 (64 bytes) 779 * len - Length on the input to be processed. 780 * @li Reentrant: yes 781 * @li IRQ safe: yes 782 * 783 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 784 * 785 */ 786 CpaStatus qatUtilsHashSHA384Full(uint8_t *in, uint8_t *out, uint32_t len); 787 788 /** 789 * @ingroup QatUtils 790 * 791 * @brief Calculate SHA512 transform operation 792 * 793 * @param in - pointer to data to be processed. 794 * The buffer needs to be at least sha512 block size long as defined in 795 * rfc4868 (128 bytes) 796 * out - output pointer for state data after single sha512 transform 797 * operation. 798 * The buffer needs to be at least sha512 state size long as defined in 799 * rfc4868 (64 bytes) 800 * @li Reentrant: yes 801 * @li IRQ safe: yes 802 * 803 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 804 * 805 */ 806 CpaStatus qatUtilsHashSHA512(uint8_t *in, uint8_t *out); 807 808 /** 809 * @ingroup QatUtils 810 * 811 * @brief Calculate SHA512 transform operation 812 * 813 * @param in - pointer to data to be processed. 814 * The buffer needs to be at least sha512 block size long as defined in 815 * rfc4868 (128 bytes) 816 * out - output pointer for state data after single sha512 transform 817 * operation. 818 * The buffer needs to be at least sha512 state size long as defined in 819 * rfc4868 (64 bytes) 820 * len - Length on the input to be processed. 821 * @li Reentrant: yes 822 * @li IRQ safe: yes 823 * 824 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 825 * 826 */ 827 CpaStatus qatUtilsHashSHA512Full(uint8_t *in, uint8_t *out, uint32_t len); 828 829 /** 830 * @ingroup QatUtils 831 * 832 * @brief Single block AES encrypt 833 * 834 * @param key - pointer to symetric key. 835 * keyLenInBytes - key length 836 * in - pointer to data to encrypt 837 * out - pointer to output buffer for encrypted text 838 * The in and out buffers need to be at least AES block size long 839 * as defined in rfc3686 (16 bytes) 840 * 841 * @li Reentrant: yes 842 * @li IRQ safe: yes 843 * 844 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 845 * 846 */ 847 CpaStatus qatUtilsAESEncrypt(uint8_t *key, 848 uint32_t keyLenInBytes, 849 uint8_t *in, 850 uint8_t *out); 851 852 /** 853 * @ingroup QatUtils 854 * 855 * @brief Converts AES forward key to reverse key 856 * 857 * @param key - pointer to symetric key. 858 * keyLenInBytes - key length 859 * out - pointer to output buffer for reversed key 860 * The in and out buffers need to be at least AES block size long 861 * as defined in rfc3686 (16 bytes) 862 * 863 * @li Reentrant: yes 864 * @li IRQ safe: yes 865 * 866 * @return - CPA_STATUS_SUCCESS/CPA_STATUS_FAIL 867 * 868 */ 869 CpaStatus qatUtilsAESKeyExpansionForward(uint8_t *key, 870 uint32_t keyLenInBytes, 871 uint32_t *out); 872 #endif 873