1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008 |
- /* quickassist_sync.c
- *
- * Copyright (C) 2006-2023 wolfSSL Inc.
- *
- * This file is part of wolfSSL.
- *
- * wolfSSL is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * wolfSSL is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
- */
- #ifdef HAVE_CONFIG_H
- #include <config.h>
- #endif
- #include <wolfssl/wolfcrypt/types.h>
- #ifdef HAVE_INTEL_QA_SYNC
- #ifdef QAT_DEMO_MAIN
- #define QAT_DEBUG
- #endif
- #include <wolfssl/internal.h>
- #include <wolfssl/error-ssl.h>
- #include <wolfssl/wolfcrypt/error-crypt.h>
- #ifndef NO_AES
- #include <wolfssl/wolfcrypt/aes.h>
- #endif
- #include <wolfssl/wolfcrypt/cryptocb.h>
- #include <wolfssl/wolfcrypt/port/intel/quickassist_sync.h>
- #include "cpa.h"
- #include "cpa_cy_im.h"
- #include "cpa_cy_sym.h"
- #include "cpa_cy_rsa.h"
- #include "cpa_cy_ln.h"
- #include "cpa_cy_ecdh.h"
- #include "cpa_cy_ecdsa.h"
- #include "cpa_cy_dh.h"
- #include "cpa_cy_drbg.h"
- #include "cpa_cy_nrbg.h"
- #include "cpa_cy_prime.h"
- #include "icp_sal_user.h"
- #include "icp_sal_poll.h"
- #ifdef NO_INLINE
- #include <wolfssl/wolfcrypt/misc.h>
- #else
- #define WOLFSSL_MISC_INCLUDED
- #include <wolfcrypt/src/misc.c>
- #endif
- /* User space utils */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <errno.h>
- #if 0
- /* Optional feature for partial QAT hashing support */
- /* This will process updates through hardware instead of caching them */
- #define QAT_HASH_ENABLE_PARTIAL
- #endif
- #ifdef QAT_HASH_ENABLE_PARTIAL
- #define MAX_QAT_HASH_BUFFERS 2
- #endif
- /* Detect QAT driver version */
- #if defined(CPA_CY_API_VERSION_NUM_MAJOR) && CPA_CY_API_VERSION_NUM_MAJOR > 1
- #define QAT_V2
- #endif
- #ifdef QAT_V2
- /* quickassist/utilities/libusdm_drv/qae_mem.h */
- /* Provides user-space API's for accessing NUMA allocated memory through usdm_drv */
- #include "qae_mem.h"
- #include "linux/include/qae_mem_utils.h"
- #endif
- #ifdef QAT_USE_POLLING_THREAD
- #include <pthread.h>
- #endif
- /* Tunable parameters */
- #ifndef QAT_PROCESS_NAME
- #define QAT_PROCESS_NAME "SSL"
- #endif
- #ifndef QAT_LIMIT_DEV_ACCESS
- #define QAT_LIMIT_DEV_ACCESS CPA_FALSE
- #endif
- #ifndef QAT_MAX_DEVICES
- #define QAT_MAX_DEVICES (1) /* maximum number of QAT cards */
- #endif
- #ifndef QAT_RETRY_LIMIT
- #define QAT_RETRY_LIMIT (100)
- #endif
- #ifndef QAT_POLL_RESP_QUOTA
- #define QAT_POLL_RESP_QUOTA (0) /* all pending */
- #endif
- #if !defined(NO_AES) || !defined(NO_DES3)
- #define QAT_ENABLE_CRYPTO
- #endif
- /* Pre-declarations */
- struct IntelQaDev;
- struct wc_CryptoInfo;
- struct WC_BIGINT;
- struct WC_RNG;
- #if defined(QAT_ENABLE_HASH) || defined(QAT_ENABLE_CRYPTO)
- /* symmetric context */
- typedef struct IntelQaSymCtx {
- CpaCySymOpData opData;
- CpaCySymSessionCtx symCtxSrc;
- CpaCySymSessionCtx symCtx;
- word32 symCtxSize;
- /* flags */
- word32 isOpen:1;
- word32 isCopy:1;
- } IntelQaSymCtx;
- #endif
- typedef void (*IntelQaFreeFunc)(struct IntelQaDev*);
- /* QuickAssist device */
- typedef struct IntelQaDev {
- CpaInstanceHandle handle;
- int devId;
- void* heap;
- /* callback return info */
- int ret;
- byte* out;
- union {
- word32* outLenPtr;
- word32 outLen;
- };
- /* operations */
- IntelQaFreeFunc freeFunc;
- union {
- #ifdef QAT_ENABLE_CRYPTO
- struct {
- IntelQaSymCtx ctx;
- CpaBufferList bufferList;
- CpaFlatBuffer flatBuffer;
- byte* authTag;
- word32 authTagSz;
- } cipher;
- #endif
- } op;
- #ifdef QAT_USE_POLLING_THREAD
- pthread_t pollingThread;
- byte pollingCy;
- #endif
- } IntelQaDev;
- /* Interface */
- static int IntelQaHardwareStart(const char*, int);
- static void IntelQaHardwareStop(void);
- static int IntelQaInit(void*);
- static void IntelQaDeInit(int);
- static int IntelQaNumInstances(void);
- static int IntelQaOpen(IntelQaDev*, int);
- static void IntelQaClose(IntelQaDev*);
- static int IntelQaDevCopy(IntelQaDev*, IntelQaDev*);
- static int IntelQaPoll(IntelQaDev*);
- static int IntelQaGetCyInstanceCount(void);
- #ifndef NO_AES
- #ifdef HAVE_AES_CBC
- static int IntelQaSymAesCbcEncrypt(IntelQaDev*, byte*,
- const byte*, word32, const byte*, word32, const byte*, word32);
- #ifdef HAVE_AES_DECRYPT
- static int IntelQaSymAesCbcDecrypt(IntelQaDev*, byte*,
- const byte*, word32, const byte*, word32, const byte*, word32);
- #endif /* HAVE_AES_DECRYPT */
- #endif /* HAVE_AES_CBC */
- #ifdef HAVE_AESGCM
- static int IntelQaSymAesGcmEncrypt(IntelQaDev*, byte*,
- const byte*, word32, const byte*, word32, const byte*, word32,
- byte*, word32, const byte*, word32);
- #ifdef HAVE_AES_DECRYPT
- static int IntelQaSymAesGcmDecrypt(IntelQaDev*, byte*,
- const byte*, word32, const byte*, word32, const byte*, word32,
- const byte*, word32, const byte*, word32);
- #endif /* HAVE_AES_DECRYPT */
- #endif /* HAVE_AESGCM */
- #endif /* !NO_AES */
- #ifndef NO_DES3
- static int IntelQaSymDes3CbcEncrypt(IntelQaDev*, byte*,
- const byte*, word32, const byte*, word32, const byte* iv, word32);
- static int IntelQaSymDes3CbcDecrypt(IntelQaDev* dev, byte*,
- const byte*, word32, const byte*, word32, const byte* iv, word32);
- #endif /*! NO_DES3 */
- #ifdef WOLF_CRYPTO_CB
- static int IntelQaSymSync_CryptoDevCb(int, struct wc_CryptoInfo*,
- void*);
- #endif /* WOLF_CRYPTO_CB */
- #ifdef QAT_DEBUG
- #define QLOG(...) do { printf(__VA_ARGS__); } while (0)
- #else
- #define QLOG(...) WC_DO_NOTHING
- #endif
- #define OS_HOST_TO_NW_32(uData) ByteReverseWord32(uData)
- static CpaInstanceHandle* g_cyInstances = NULL;
- static CpaInstanceInfo2* g_cyInstanceInfo = NULL;
- static Cpa32U* g_cyInstMap = NULL;
- static Cpa16U g_numInstances = 0;
- static Cpa16U g_instCounter = 0;
- static CpaBoolean g_cyServiceStarted = CPA_FALSE;
- #ifdef QAT_USE_POLLING_CHECK
- static CpaBoolean* g_cyPolling = NULL;
- static pthread_mutex_t* g_PollLock;
- #endif
- static volatile int g_initCount = 0;
- static pthread_mutex_t g_Hwlock = PTHREAD_MUTEX_INITIALIZER;
- typedef struct qatCapabilities {
- /* capabilities */
- word32 supPartial:1;
- word32 supSha3:1;
- } qatCapabilities_t;
- static qatCapabilities_t g_qatCapabilities = {0};
- #if defined(QAT_ENABLE_CRYPTO)
- static int IntelQaSymClose(IntelQaDev* dev, int doFree);
- #endif
- extern Cpa32U osalLogLevelSet(Cpa32U level);
- static IntelQaDev qaDev;
- /* -------------------------------------------------------------------------- */
- /* Polling */
- /* -------------------------------------------------------------------------- */
- static WC_INLINE int SyncSleep(word32 ms)
- {
- int ret = 0;
- struct timespec resTime, remTime;
- resTime.tv_sec = ms/1000;
- resTime.tv_nsec = (ms%1000)*1000000;
- do {
- ret = nanosleep(&resTime, &remTime);
- resTime = remTime;
- } while ((ret!=0) && (errno == EINTR));
- if (ret != 0) {
- QLOG("nanoSleep failed with code %d\n", ret);
- return BAD_FUNC_ARG;
- }
- return ret;
- }
- #ifdef QAT_USE_POLLING_THREAD
- static void* IntelQaPollingThread(void* context)
- {
- IntelQaDev* dev = (IntelQaDev*)context;
- QLOG("Polling Thread Start\n");
- while (dev->pollingCy) {
- icp_sal_CyPollInstance(dev->handle, QAT_POLL_RESP_QUOTA);
- SyncSleep(10);
- }
- QLOG("Polling Thread Exit\n");
- pthread_exit(NULL);
- }
- static CpaStatus IntelQaStartPollingThread(IntelQaDev* dev)
- {
- if (dev->pollingCy == 0) {
- dev->pollingCy = 1;
- QLOG("Polling Thread Created\n");
- if (pthread_create(&dev->pollingThread, NULL, IntelQaPollingThread,
- (void*)dev) != 0) {
- QLOG("Failed create polling thread!\n");
- return CPA_STATUS_FAIL;
- }
- }
- return CPA_STATUS_SUCCESS;
- }
- static void IntelQaStopPollingThread(IntelQaDev* dev)
- {
- dev->pollingCy = 0;
- pthread_join(dev->pollingThread, 0);
- }
- #endif /* QAT_USE_POLLING_THREAD */
- /* -------------------------------------------------------------------------- */
- /* Device */
- /* -------------------------------------------------------------------------- */
- void IntelQaHardwareStop(void)
- {
- int i;
- CpaStatus status;
- g_initCount--; /* track de-init count */
- if (g_initCount != 0) {
- return;
- }
- if (g_cyServiceStarted == CPA_TRUE) {
- g_cyServiceStarted = CPA_FALSE;
- for (i=0; i<g_numInstances; i++) {
- status = cpaCyStopInstance(g_cyInstances[i]);
- if (status != CPA_STATUS_SUCCESS) {
- QLOG("IntelQA: Could not stop instance: %d\n"
- "\tInternal error has occur which probably can only be"
- "fixed by a reboot\n", i);
- }
- }
- }
- status = icp_sal_userStop();
- if (status != CPA_STATUS_SUCCESS) {
- QLOG("IntelQA: Could not stop sal for user space (status %d)\n",
- status);
- }
- if (g_cyInstMap) {
- XFREE(g_cyInstMap, NULL, DYNAMIC_TYPE_ASYNC);
- g_cyInstMap = NULL;
- }
- if (g_cyInstanceInfo) {
- XFREE(g_cyInstanceInfo, NULL, DYNAMIC_TYPE_ASYNC);
- g_cyInstanceInfo = NULL;
- }
- #ifdef QAT_USE_POLLING_CHECK
- if (g_cyPolling) {
- XFREE(g_cyPolling, NULL, DYNAMIC_TYPE_ASYNC);
- g_cyPolling = NULL;
- }
- if (g_PollLock) {
- for (i=0; i<g_numInstances; i++) {
- pthread_mutex_destroy(&g_PollLock[i]);
- }
- XFREE(g_PollLock, NULL, DYNAMIC_TYPE_ASYNC);
- g_PollLock = NULL;
- }
- #endif
- if (g_cyInstances) {
- XFREE(g_cyInstances, NULL, DYNAMIC_TYPE_ASYNC);
- g_cyInstances = NULL;
- g_numInstances = 0;
- }
- qaeMemDestroy();
- QLOG("IntelQA: Stop\n");
- }
- int IntelQaHardwareStart(const char* process_name, int limitDevAccess)
- {
- int ret = 0, i;
- CpaStatus status;
- g_initCount++;
- if (g_initCount > 1) {
- return 0;
- }
- status = qaeMemInit();
- if (status != CPA_STATUS_SUCCESS) {
- QLOG("IntelQA: Could not start qae mem for user space (status %d)\n"
- "\tHas the qaeMemDrv.ko module been loaded?\n",
- status);
- return ASYNC_INIT_E;
- }
- status = icp_sal_userStartMultiProcess(process_name,
- limitDevAccess ? CPA_TRUE : CPA_FALSE);
- if (status != CPA_STATUS_SUCCESS) {
- QLOG("IntelQA: Could not start sal for user space! status %d\n",
- status);
- ret = ASYNC_INIT_E; goto error;
- }
- #ifdef QAT_DEBUG
- /* optionally enable debugging */
- //osalLogLevelSet(8);
- #endif
- status = cpaCyGetNumInstances(&g_numInstances);
- if (status != CPA_STATUS_SUCCESS || g_numInstances == 0) {
- QLOG("IntelQA: Failed to get num of instances! status %d\n", status);
- ret = INVALID_DEVID; goto error;
- }
- /* Get handles / info */
- g_cyInstances = (CpaInstanceHandle*)XMALLOC(
- sizeof(CpaInstanceHandle) * g_numInstances, NULL, DYNAMIC_TYPE_ASYNC);
- if (g_cyInstances == NULL) {
- QLOG("IntelQA: Failed to allocate instances\n");
- ret = INVALID_DEVID; goto error;
- }
- #ifdef QAT_USE_POLLING_CHECK
- g_cyPolling = (CpaBoolean*)XMALLOC(sizeof(CpaBoolean) * g_numInstances, NULL,
- DYNAMIC_TYPE_ASYNC);
- if (g_cyPolling == NULL) {
- QLOG("IntelQA: Failed to allocate polling status\n");
- ret = INVALID_DEVID; goto error;
- }
- g_PollLock = (pthread_mutex_t*)XMALLOC(sizeof(pthread_mutex_t) *
- g_numInstances, NULL, DYNAMIC_TYPE_ASYNC);
- if (g_PollLock == NULL) {
- QLOG("IntelQA: Failed to allocate polling locks\n");
- ret = INVALID_DEVID; goto error;
- }
- for (i=0; i<g_numInstances; i++) {
- pthread_mutex_init(&g_PollLock[i], NULL);
- }
- #endif
- g_cyInstanceInfo = (CpaInstanceInfo2*)XMALLOC(
- sizeof(CpaInstanceInfo2) * g_numInstances, NULL, DYNAMIC_TYPE_ASYNC);
- if (g_cyInstanceInfo == NULL) {
- QLOG("IntelQA: Failed to allocate instance info\n");
- ret = INVALID_DEVID; goto error;
- }
- g_cyInstMap = (Cpa32U*)XMALLOC(
- sizeof(Cpa32U) * g_numInstances, NULL, DYNAMIC_TYPE_ASYNC);
- if (g_cyInstMap == NULL) {
- QLOG("IntelQA: Failed to allocate instance map\n");
- ret = INVALID_DEVID; goto error;
- }
- status = cpaCyGetInstances(g_numInstances, g_cyInstances);
- if (status != CPA_STATUS_SUCCESS) {
- QLOG("IntelQA: Failed to get IntelQA instances\n");
- ret = INVALID_DEVID; goto error;
- }
- /* start all instances */
- g_cyServiceStarted = CPA_TRUE;
- for (i=0; i<g_numInstances; i++) {
- Cpa32U coreAffinity = 0;
- CpaCySymCapabilitiesInfo capabilities;
- int j;
- XMEMSET(&capabilities, 0, sizeof(capabilities));
- status = cpaCyInstanceGetInfo2(g_cyInstances[i],
- &g_cyInstanceInfo[i]);
- if (status != CPA_STATUS_SUCCESS) {
- QLOG("IntelQA: Error getting instance info for %d\n", i);
- ret = INVALID_DEVID; goto error;
- }
- /* loop of the instanceInfo coreAffinity bitmask to find the core */
- for (j=0; j<CPA_MAX_CORES; j++) {
- if (CPA_BITMAP_BIT_TEST(g_cyInstanceInfo[i].coreAffinity, j)) {
- coreAffinity = i;
- break;
- }
- }
- g_cyInstMap[i] = coreAffinity;
- /* capabilities */
- status = cpaCySymQueryCapabilities(g_cyInstances[i], &capabilities);
- if (status == CPA_STATUS_SUCCESS) {
- g_qatCapabilities.supPartial = capabilities.partialPacketSupported;
- if (capabilities.partialPacketSupported != CPA_TRUE) {
- QLOG("Warning: QAT does not support partial packets!\n");
- }
- }
- QLOG("Inst %d, Node: %d, Affin: %u, Dev: %u, Accel %u, "
- "EE %u, BDF %02X:%02X:%02X, isPolled %d\n",
- i, g_cyInstanceInfo[i].nodeAffinity, coreAffinity,
- g_cyInstanceInfo[i].physInstId.packageId,
- g_cyInstanceInfo[i].physInstId.acceleratorId,
- g_cyInstanceInfo[i].physInstId.executionEngineId,
- (Cpa8U)((g_cyInstanceInfo[i].physInstId.busAddress) >> 8),
- (Cpa8U)((g_cyInstanceInfo[i].physInstId.busAddress)
- & 0xFF) >> 3,
- (Cpa8U)((g_cyInstanceInfo[i].physInstId.busAddress) & 3),
- g_cyInstanceInfo[i].isPolled);
- status = cpaCySetAddressTranslation(g_cyInstances[i],
- qaeVirtToPhysNUMA);
- if (status != CPA_STATUS_SUCCESS) {
- QLOG("IntelQA: Error setting memory config for inst %d\n", i);
- ret = INVALID_DEVID; goto error;
- }
- status = cpaCyStartInstance(g_cyInstances[i]);
- if (status != CPA_STATUS_SUCCESS) {
- QLOG("IntelQA: Error starting crypto instance %d\n", i);
- ret = INVALID_DEVID; goto error;
- }
- }
- QLOG("IntelQA: Instances %d\n", g_numInstances);
- return ret;
- error:
- IntelQaHardwareStop();
- return ret;
- }
- int IntelQaInit(void* threadId)
- {
- int ret;
- int devId;
- (void)threadId;
- ret = pthread_mutex_lock(&g_Hwlock);
- if (ret != 0) {
- QLOG("IntelQaInit: mutex lock failed! %d\n", ret);
- return BAD_MUTEX_E;
- }
- ret = IntelQaHardwareStart(QAT_PROCESS_NAME, QAT_LIMIT_DEV_ACCESS);
- if (ret != 0) {
- pthread_mutex_unlock(&g_Hwlock);
- return ret;
- }
- if (g_numInstances <= 0) {
- pthread_mutex_unlock(&g_Hwlock);
- return ASYNC_INIT_E;
- }
- /* assign device id */
- devId = (g_instCounter % g_numInstances);
- g_instCounter++;
- pthread_mutex_unlock(&g_Hwlock);
- return devId;
- }
- int IntelQaNumInstances(void)
- {
- return g_numInstances;
- }
- int IntelQaOpen(IntelQaDev* dev, int devId)
- {
- if (dev == NULL) {
- return BAD_FUNC_ARG;
- }
- /* clear device info */
- XMEMSET(dev, 0, sizeof(IntelQaDev));
- if (g_cyInstances == NULL) {
- QLOG("IntelQA not initialized\n");
- return ASYNC_INIT_E;
- }
- dev->devId = devId;
- dev->handle = g_cyInstances[devId];
- #ifdef QAT_USE_POLLING_THREAD
- /* start polling thread */
- IntelQaStartPollingThread(dev);
- #endif
- return 0;
- }
- #if defined(QAT_ENABLE_CRYPTO)
- static IntelQaSymCtx* IntelQaGetSymCtx(IntelQaDev* dev)
- {
- return &dev->op.cipher.ctx;
- }
- #endif
- void IntelQaClose(IntelQaDev* dev)
- {
- if (dev) {
- QLOG("IntelQaClose %p\n", dev);
- /* close any active session */
- IntelQaSymClose(dev, 1);
- #ifdef QAT_USE_POLLING_THREAD
- IntelQaStopPollingThread(dev);
- #endif
- dev->handle = NULL;
- }
- }
- void IntelQaDeInit(int devId)
- {
- (void)devId;
- if (pthread_mutex_lock(&g_Hwlock) == 0) {
- IntelQaHardwareStop();
- pthread_mutex_unlock(&g_Hwlock);
- }
- }
- int IntelQaPoll(IntelQaDev* dev)
- {
- int ret = 0;
- CpaStatus status;
- #ifdef QAT_USE_POLLING_CHECK
- pthread_mutex_t* lock = &g_PollLock[dev->qat.devId];
- if (pthread_mutex_lock(lock) == 0) {
- /* test if any other threads are polling */
- if (g_cyPolling[dev->qat.devId]) {
- pthread_mutex_unlock(lock);
- /* return success even though its busy, caller will treat as WC_PENDING_E */
- return 0;
- }
- g_cyPolling[dev->qat.devId] = 1;
- pthread_mutex_unlock(lock);
- }
- #endif
- status = icp_sal_CyPollInstance(dev->handle, QAT_POLL_RESP_QUOTA);
- if (status != CPA_STATUS_SUCCESS && status != CPA_STATUS_RETRY) {
- QLOG("IntelQa: Poll failure %d\n", status);
- ret = -1;
- }
- {
- if (dev->ret != WC_PENDING_E) {
- /* perform cleanup */
- IntelQaFreeFunc freeFunc = dev->freeFunc;
- QLOG("IntelQaOpFree: Dev %p, FreeFunc %p\n", dev, freeFunc);
- if (freeFunc) {
- dev->freeFunc = NULL;
- freeFunc(dev);
- }
- }
- }
- #ifdef QAT_USE_POLLING_CHECK
- /* indicate we are done polling */
- if (pthread_mutex_lock(lock) == 0) {
- g_cyPolling[dev->qat.devId] = 0;
- pthread_mutex_unlock(lock);
- }
- #endif
- return ret;
- }
- static int IntelQaPollBlockRet(IntelQaDev* dev, int ret_wait)
- {
- int ret;
- do {
- ret = IntelQaPoll(dev);
- if (dev->ret != ret_wait) {
- break;
- }
- } while (1);
- ret = dev->ret;
- return ret;
- }
- int IntelQaGetCyInstanceCount(void)
- {
- return g_numInstances;
- }
- static WC_INLINE int IntelQaHandleCpaStatus(IntelQaDev* dev, CpaStatus status,
- int* ret, byte isAsync, void* callback, int* retryCount)
- {
- int retry = 0;
- if (status == CPA_STATUS_SUCCESS) {
- if (isAsync && callback) {
- *ret = WC_PENDING_E;
- }
- else {
- *ret = IntelQaPollBlockRet(dev, WC_PENDING_E);
- }
- }
- else if (status == CPA_STATUS_RETRY) {
- (*retryCount)++;
- if ((*retryCount % (QAT_RETRY_LIMIT + 1)) == QAT_RETRY_LIMIT) {
- SyncSleep(10);
- }
- retry = 1;
- }
- else {
- *ret = ASYNC_OP_E;
- }
- return retry;
- }
- static WC_INLINE void IntelQaOpInit(IntelQaDev* dev, IntelQaFreeFunc freeFunc)
- {
- dev->ret = WC_PENDING_E;
- dev->freeFunc = freeFunc;
- }
- /* -------------------------------------------------------------------------- */
- /* Symmetric Algos */
- /* -------------------------------------------------------------------------- */
- #if defined(QAT_ENABLE_CRYPTO)
- static int IntelQaSymOpen(IntelQaDev* dev, CpaCySymSessionSetupData* setup,
- CpaCySymCbFunc callback)
- {
- int ret = 0;
- CpaStatus status = CPA_STATUS_SUCCESS;
- Cpa32U sessionCtxSize = 0;
- IntelQaSymCtx* ctx;
- /* arg check */
- if (dev == NULL || setup == NULL) {
- return BAD_FUNC_ARG;
- }
- ctx = IntelQaGetSymCtx(dev);
- /* Determine size of session context to allocate - use max size */
- status = cpaCySymSessionCtxGetSize(dev->handle, setup, &sessionCtxSize);
- if (ctx->symCtxSize > 0 && ctx->symCtxSize > sessionCtxSize) {
- QLOG("Symmetric context size error! Buf %d, Exp %d\n",
- ctx->symCtxSize, sessionCtxSize);
- return ASYNC_OP_E;
- }
- /* make sure session context is allocated */
- if (ctx->symCtx == NULL) {
- /* Allocate session context */
- ctx->symCtx = XMALLOC(sessionCtxSize, dev->heap, DYNAMIC_TYPE_ASYNC_NUMA64);
- if (ctx->symCtx == NULL) {
- return MEMORY_E;
- }
- }
- ctx->symCtxSize = sessionCtxSize;
- if (!ctx->isOpen) {
- ctx->isOpen = 1;
- QLOG("IntelQaSymOpen: InitSession dev %p, symCtx %p\n",
- dev, ctx->symCtx);
- /* open symmetric session */
- status = cpaCySymInitSession(dev->handle, callback, setup, ctx->symCtx);
- if (status != CPA_STATUS_SUCCESS) {
- QLOG("cpaCySymInitSession failed! dev %p, status %d\n",
- dev, status);
- XFREE(ctx->symCtx, dev->heap, DYNAMIC_TYPE_ASYNC_NUMA64);
- ctx->symCtx = NULL;
- return ASYNC_INIT_E;
- }
- }
- if (ctx->symCtxSrc == NULL) {
- ctx->symCtxSrc = ctx->symCtx;
- }
- QLOG("IntelQaSymOpen: dev %p, symCtx %p (src %p), "
- "symCtxSize %d, isCopy %d, isOpen %d\n",
- dev, ctx->symCtx, ctx->symCtxSrc, ctx->symCtxSize,
- ctx->isCopy, ctx->isOpen);
- return ret;
- }
- static int IntelQaSymClose(IntelQaDev* dev, int doFree)
- {
- int ret = 0;
- CpaStatus status = CPA_STATUS_SUCCESS;
- IntelQaSymCtx* ctx;
- if (dev == NULL) {
- return BAD_FUNC_ARG;
- }
- ctx = IntelQaGetSymCtx(dev);
- QLOG("IntelQaSymClose: dev %p, ctx %p, symCtx %p (src %p), "
- "symCtxSize %d, isCopy %d, isOpen %d, doFree %d\n",
- dev, ctx, ctx->symCtx, ctx->symCtxSrc, ctx->symCtxSize,
- ctx->isCopy, ctx->isOpen, doFree);
- if (ctx->symCtx == ctx->symCtxSrc && ctx->symCtx != NULL) {
- if (ctx->isOpen) {
- ctx->isOpen = 0;
- QLOG("IntelQaSymClose: RemoveSession dev %p, symCtx %p\n",
- dev, ctx->symCtx);
- status = cpaCySymRemoveSession(dev->handle, ctx->symCtx);
- if (status == CPA_STATUS_RETRY) {
- QLOG("cpaCySymRemoveSession retry!\n");
- /* treat this as error, since session should not be active */
- ret = ASYNC_OP_E;
- }
- else if (status != CPA_STATUS_SUCCESS) {
- QLOG("cpaCySymRemoveSession failed! status %d\n", status);
- ret = ASYNC_OP_E;
- }
- }
- }
- if (doFree) {
- XFREE(ctx->symCtx, dev->heap, DYNAMIC_TYPE_ASYNC_NUMA64);
- ctx->symCtx = NULL;
- ctx->symCtxSrc = NULL;
- ctx->symCtxSize = 0;
- }
- return ret;
- }
- #endif /* QAT_ENABLE_CRYPTO */
- /* -------------------------------------------------------------------------- */
- /* AES/DES Algo */
- /* -------------------------------------------------------------------------- */
- #ifdef QAT_ENABLE_CRYPTO
- static void IntelQaSymCipherFree(IntelQaDev* dev)
- {
- IntelQaSymCtx* ctx = &dev->op.cipher.ctx;
- CpaCySymOpData* opData = &ctx->opData;
- CpaBufferList* pDstBuffer = &dev->op.cipher.bufferList;
- if (opData) {
- if (opData->pAdditionalAuthData) {
- XFREE(opData->pAdditionalAuthData, dev->heap,
- DYNAMIC_TYPE_ASYNC_NUMA);
- opData->pAdditionalAuthData = NULL;
- }
- if (opData->pIv) {
- XFREE(opData->pIv, dev->heap, DYNAMIC_TYPE_ASYNC_NUMA);
- opData->pIv = NULL;
- }
- XMEMSET(opData, 0, sizeof(CpaCySymOpData));
- }
- if (pDstBuffer) {
- if (pDstBuffer->pBuffers) {
- if (pDstBuffer->pBuffers->pData) {
- XFREE(pDstBuffer->pBuffers->pData, dev->heap,
- DYNAMIC_TYPE_ASYNC_NUMA);
- pDstBuffer->pBuffers->pData = NULL;
- }
- XMEMSET(pDstBuffer->pBuffers, 0, sizeof(CpaFlatBuffer));
- }
- if (pDstBuffer->pPrivateMetaData) {
- XFREE(pDstBuffer->pPrivateMetaData, dev->heap,
- DYNAMIC_TYPE_ASYNC_NUMA);
- pDstBuffer->pPrivateMetaData = NULL;
- }
- XMEMSET(pDstBuffer, 0, sizeof(CpaBufferList));
- }
- /* close and free sym context */
- IntelQaSymClose(dev, 1);
- /* clear temp pointers */
- dev->out = NULL;
- dev->outLen = 0;
- #ifndef NO_AES
- if (dev->op.cipher.authTag != NULL) {
- XMEMSET(dev->op.cipher.authTag, 0, dev->op.cipher.authTagSz);
- XFREE(dev->op.cipher.authTag, dev->heap, DYNAMIC_TYPE_ASYNC_NUMA);
- dev->op.cipher.authTag = NULL;
- }
- dev->op.cipher.authTagSz = 0;
- #endif
- }
- static int IntelQaSymCipher(IntelQaDev* dev, byte* out, const byte* in,
- word32 inOutSz, const byte* key, word32 keySz, const byte* iv, word32 ivSz,
- CpaCySymOp symOperation, CpaCySymCipherAlgorithm cipherAlgorithm,
- CpaCySymCipherDirection cipherDirection,
- /* for auth ciphers (CCM or GCM) */
- CpaCySymHashAlgorithm hashAlgorithm,
- byte* authTag, word32 authTagSz,
- const byte* authIn, word32 authInSz)
- {
- int ret;
- CpaStatus status = CPA_STATUS_SUCCESS;
- CpaCySymOpData* opData = NULL;
- CpaCySymSessionSetupData setup;
- const Cpa32U numBuffers = 1;
- CpaBufferList* bufferList = NULL;
- CpaFlatBuffer* flatBuffer = NULL;
- Cpa8U* ivBuf = NULL;
- Cpa8U* dataBuf = NULL;
- Cpa32U dataLen = inOutSz;
- Cpa8U* metaBuf = NULL;
- Cpa32U metaSize = 0;
- Cpa8U* authInBuf = NULL;
- Cpa32U authInSzAligned = authInSz;
- Cpa8U* authTagBuf = NULL;
- IntelQaSymCtx* ctx;
- CpaBoolean verifyResult = CPA_FALSE;
- QLOG("IntelQaSymCipher: dev %p, out %p, in %p, inOutSz %d, op %d, "
- "algo %d, dir %d, hash %d\n",
- dev, out, in, inOutSz, symOperation, cipherAlgorithm,
- cipherDirection, hashAlgorithm);
- /* check args */
- if (out == NULL || in == NULL || inOutSz == 0 ||
- key == NULL || keySz == 0 || iv == NULL || ivSz == 0) {
- return BAD_FUNC_ARG;
- }
- if (hashAlgorithm != CPA_CY_SYM_HASH_NONE &&
- (authTag == NULL || authTagSz == 0)) {
- return BAD_FUNC_ARG;
- }
- /* get meta size */
- status = cpaCyBufferListGetMetaSize(dev->handle, numBuffers, &metaSize);
- if (status != CPA_STATUS_SUCCESS && metaSize <= 0) {
- ret = BUFFER_E; goto exit;
- }
- /* if authtag provided then it will be appended to end of input */
- if (authTag && authTagSz > 0) {
- dataLen += authTagSz;
- }
- /* allocate buffers */
- ctx = &dev->op.cipher.ctx;
- opData = &ctx->opData;
- bufferList = &dev->op.cipher.bufferList;
- flatBuffer = &dev->op.cipher.flatBuffer;
- metaBuf = XMALLOC(metaSize, dev->heap, DYNAMIC_TYPE_ASYNC_NUMA);
- dataBuf = XMALLOC(dataLen, dev->heap, DYNAMIC_TYPE_ASYNC_NUMA);
- XMEMCPY(dataBuf, in, inOutSz);
- ivBuf = XMALLOC(AES_BLOCK_SIZE, dev->heap, DYNAMIC_TYPE_ASYNC_NUMA);
- XMEMCPY(ivBuf, iv, ivSz);
- authTagBuf = XMALLOC(authTagSz, dev->heap, DYNAMIC_TYPE_ASYNC_NUMA);
- /* check allocations */
- if (ivBuf == NULL || metaBuf == NULL || dataBuf == NULL ||
- authTagBuf == NULL) {
- ret = MEMORY_E; goto exit;
- }
- /* AAD */
- if (authIn && authInSz > 0) {
- /* make sure AAD is block aligned */
- if (authInSzAligned % AES_BLOCK_SIZE) {
- authInSzAligned += AES_BLOCK_SIZE -
- (authInSzAligned % AES_BLOCK_SIZE);
- }
- authInBuf = XMALLOC(authInSzAligned, dev->heap,
- DYNAMIC_TYPE_ASYNC_NUMA);
- XMEMCPY(authInBuf, authIn, authInSz);
- if (authInBuf == NULL) {
- ret = MEMORY_E; goto exit;
- }
- /* clear remainder */
- XMEMSET(authInBuf + authInSz, 0, authInSzAligned - authInSz);
- }
- /* init buffers */
- XMEMSET(&setup, 0, sizeof(CpaCySymSessionSetupData));
- XMEMSET(opData, 0, sizeof(CpaCySymOpData));
- XMEMSET(bufferList, 0, sizeof(CpaBufferList));
- XMEMSET(flatBuffer, 0, sizeof(CpaFlatBuffer));
- XMEMSET(metaBuf, 0, metaSize);
- bufferList->pBuffers = flatBuffer;
- bufferList->numBuffers = numBuffers;
- bufferList->pPrivateMetaData = metaBuf;
- flatBuffer->dataLenInBytes = dataLen;
- flatBuffer->pData = dataBuf;
- /* setup */
- setup.sessionPriority = CPA_CY_PRIORITY_NORMAL;
- setup.symOperation = symOperation;
- setup.cipherSetupData.cipherAlgorithm = cipherAlgorithm;
- setup.cipherSetupData.cipherKeyLenInBytes = keySz;
- setup.cipherSetupData.pCipherKey = (byte*)key;
- setup.cipherSetupData.cipherDirection = cipherDirection;
- /* setup auth ciphers */
- if (hashAlgorithm != CPA_CY_SYM_HASH_NONE) {
- setup.algChainOrder =
- (cipherDirection == CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT) ?
- CPA_CY_SYM_ALG_CHAIN_ORDER_CIPHER_THEN_HASH :
- CPA_CY_SYM_ALG_CHAIN_ORDER_HASH_THEN_CIPHER;
- setup.hashSetupData.hashAlgorithm = hashAlgorithm;
- setup.hashSetupData.hashMode = CPA_CY_SYM_HASH_MODE_AUTH;
- setup.hashSetupData.digestResultLenInBytes = authTagSz;
- setup.hashSetupData.authModeSetupData.aadLenInBytes = authInSz;
- if (cipherDirection == CPA_CY_SYM_CIPHER_DIRECTION_DECRYPT)
- setup.digestIsAppended = CPA_TRUE;
- else
- setup.digestIsAppended = CPA_FALSE;
- }
- /* open session */
- ret = IntelQaSymOpen(dev, &setup, NULL);
- if (ret != 0) {
- goto exit;
- }
- /* operation data */
- opData->sessionCtx = ctx->symCtx;
- opData->packetType = CPA_CY_SYM_PACKET_TYPE_FULL;
- opData->pIv = ivBuf;
- opData->ivLenInBytes = ivSz;
- opData->cryptoStartSrcOffsetInBytes = 0;
- opData->messageLenToCipherInBytes = inOutSz;
- if (authIn && authInSz > 0) {
- opData->pAdditionalAuthData = authInBuf;
- }
- if (cipherDirection == CPA_CY_SYM_CIPHER_DIRECTION_DECRYPT) {
- if (authTag && authTagSz > 0) {
- /* append digest to end of data buffer */
- XMEMCPY(flatBuffer->pData + inOutSz, authTag, authTagSz);
- }
- }
- else {
- if (authTag && authTagSz > 0) {
- XMEMCPY(authTagBuf, authTag, authTagSz);
- }
- }
- /* store info needed for output */
- dev->out = out;
- dev->outLen = inOutSz;
- if (cipherDirection == CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT) {
- dev->op.cipher.authTag = authTagBuf;
- dev->op.cipher.authTagSz = authTagSz;
- opData->pDigestResult = authTagBuf;
- }
- else {
- dev->op.cipher.authTag = NULL;
- dev->op.cipher.authTagSz = 0;
- }
- IntelQaOpInit(dev, IntelQaSymCipherFree);
- /* perform symmetric AES operation async */
- /* use same buffer list for in-place operation */
- status = cpaCySymPerformOp(dev->handle, dev, opData,
- bufferList, bufferList, &verifyResult);
- if (symOperation == CPA_CY_SYM_OP_ALGORITHM_CHAINING &&
- cipherAlgorithm == CPA_CY_SYM_CIPHER_AES_GCM &&
- cipherDirection == CPA_CY_SYM_CIPHER_DIRECTION_DECRYPT &&
- hashAlgorithm == CPA_CY_SYM_HASH_AES_GCM) {
- if (verifyResult == CPA_FALSE) {
- ret = AES_GCM_AUTH_E;
- }
- }
- exit:
- if (ret != 0) {
- QLOG("cpaCySymPerformOp Cipher failed! dev %p, status %d, ret %d\n",
- dev, status, ret);
- }
- /* Capture the inline decrypt into the output. */
- XMEMCPY(out, dataBuf, inOutSz);
- if (cipherDirection == CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT) {
- if (authTag != NULL && authTagSz > 0) {
- XMEMCPY(authTag, authTagBuf, authTagSz);
- }
- }
- /* handle cleanup */
- IntelQaSymCipherFree(dev);
- return ret;
- }
- #ifdef HAVE_AES_CBC
- int IntelQaSymAesCbcEncrypt(IntelQaDev* dev,
- byte* out, const byte* in, word32 sz,
- const byte* key, word32 keySz,
- const byte* iv, word32 ivSz)
- {
- int ret = IntelQaSymCipher(dev, out, in, sz,
- key, keySz, iv, ivSz,
- CPA_CY_SYM_OP_CIPHER, CPA_CY_SYM_CIPHER_AES_CBC,
- CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT,
- CPA_CY_SYM_HASH_NONE, NULL, 0, NULL, 0);
- XMEMCPY((byte*)iv, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE);
- return ret;
- }
- #ifdef HAVE_AES_DECRYPT
- int IntelQaSymAesCbcDecrypt(IntelQaDev* dev,
- byte* out, const byte* in, word32 sz,
- const byte* key, word32 keySz,
- const byte* iv, word32 ivSz)
- {
- byte nextIv[AES_BLOCK_SIZE];
- int ret;
- XMEMCPY(nextIv, in + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE);
- ret = IntelQaSymCipher(dev, out, in, sz,
- key, keySz, iv, ivSz,
- CPA_CY_SYM_OP_CIPHER, CPA_CY_SYM_CIPHER_AES_CBC,
- CPA_CY_SYM_CIPHER_DIRECTION_DECRYPT,
- CPA_CY_SYM_HASH_NONE, NULL, 0, NULL, 0);
- XMEMCPY((byte*)iv, nextIv, AES_BLOCK_SIZE);
- return ret;
- }
- #endif /* HAVE_AES_DECRYPT */
- #endif /* HAVE_AES_CBC */
- #ifdef HAVE_AESGCM
- int IntelQaSymAesGcmEncrypt(IntelQaDev* dev,
- byte* out, const byte* in, word32 sz,
- const byte* key, word32 keySz,
- const byte* iv, word32 ivSz,
- byte* authTag, word32 authTagSz,
- const byte* authIn, word32 authInSz)
- {
- return IntelQaSymCipher(dev, out, in, sz,
- key, keySz, iv, ivSz,
- CPA_CY_SYM_OP_ALGORITHM_CHAINING, CPA_CY_SYM_CIPHER_AES_GCM,
- CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT,
- CPA_CY_SYM_HASH_AES_GCM, authTag, authTagSz, authIn, authInSz);
- }
- #ifdef HAVE_AES_DECRYPT
- int IntelQaSymAesGcmDecrypt(IntelQaDev* dev,
- byte* out, const byte* in, word32 sz,
- const byte* key, word32 keySz,
- const byte* iv, word32 ivSz,
- const byte* authTag, word32 authTagSz,
- const byte* authIn, word32 authInSz)
- {
- return IntelQaSymCipher(dev, out, in, sz,
- key, keySz, iv, ivSz,
- CPA_CY_SYM_OP_ALGORITHM_CHAINING, CPA_CY_SYM_CIPHER_AES_GCM,
- CPA_CY_SYM_CIPHER_DIRECTION_DECRYPT,
- CPA_CY_SYM_HASH_AES_GCM, (byte*)authTag, authTagSz, authIn, authInSz);
- }
- #endif /* HAVE_AES_DECRYPT */
- #endif /* HAVE_AESGCM */
- #ifndef NO_DES3
- int IntelQaSymDes3CbcEncrypt(IntelQaDev* dev,
- byte* out, const byte* in, word32 sz,
- const byte* key, word32 keySz,
- const byte* iv, word32 ivSz)
- {
- return IntelQaSymCipher(dev, out, in, sz,
- key, keySz, iv, ivSz,
- CPA_CY_SYM_OP_CIPHER, CPA_CY_SYM_CIPHER_3DES_CBC,
- CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT,
- CPA_CY_SYM_HASH_NONE, NULL, 0, NULL, 0);
- }
- int IntelQaSymDes3CbcDecrypt(IntelQaDev* dev,
- byte* out, const byte* in, word32 sz,
- const byte* key, word32 keySz,
- const byte* iv, word32 ivSz)
- {
- return IntelQaSymCipher(dev, out, in, sz,
- key, keySz, iv, ivSz,
- CPA_CY_SYM_OP_CIPHER, CPA_CY_SYM_CIPHER_3DES_CBC,
- CPA_CY_SYM_CIPHER_DIRECTION_DECRYPT,
- CPA_CY_SYM_HASH_NONE, NULL, 0, NULL, 0);
- }
- #endif /* !NO_DES3 */
- #endif /* QAT_ENABLE_CRYPTO */
- #ifdef WOLF_CRYPTO_CB
- int IntelQaSymSync_CryptoDevCb(int devId, struct wc_CryptoInfo* info, void* ctx)
- {
- int rc = NOT_COMPILED_IN; /* return this to bypass HW and use SW */
- IntelQaDev* dev;
- if (info == NULL || ctx == NULL)
- return BAD_FUNC_ARG;
- (void)devId;
- dev = (IntelQaDev*)ctx;
- #ifdef QAT_ENABLE_CRYPTO
- if (info->algo_type == WC_ALGO_TYPE_CIPHER) {
- QLOG("CryptoDevCb Cipher: Type %d\n", info->cipher.type);
- #ifndef NO_AES
- if (info->cipher.type == WC_CIPHER_AES_CBC) {
- Aes* aes = info->cipher.aescbc.aes;
- if (aes == NULL)
- return BAD_FUNC_ARG;
- if (info->cipher.enc) {
- rc = IntelQaSymAesCbcEncrypt(dev,
- info->cipher.aescbc.out,
- info->cipher.aescbc.in,
- info->cipher.aescbc.sz,
- (byte*)aes->devKey, aes->keylen,
- (byte*)aes->reg, AES_BLOCK_SIZE);
- }
- else {
- rc = IntelQaSymAesCbcDecrypt(dev,
- info->cipher.aescbc.out,
- info->cipher.aescbc.in,
- info->cipher.aescbc.sz,
- (byte*)aes->devKey, aes->keylen,
- (byte*)aes->reg, AES_BLOCK_SIZE);
- }
- }
- #endif /* !NO_AES */
- #ifdef HAVE_AESGCM
- if (info->cipher.type == WC_CIPHER_AES_GCM) {
- if (info->cipher.enc) {
- Aes* aes = info->cipher.aesgcm_enc.aes;
- if (aes == NULL)
- return BAD_FUNC_ARG;
- rc = IntelQaSymAesGcmEncrypt(dev,
- info->cipher.aesgcm_enc.out,
- info->cipher.aesgcm_enc.in,
- info->cipher.aesgcm_enc.sz,
- (const byte*)aes->devKey, aes->keylen,
- info->cipher.aesgcm_enc.iv,
- info->cipher.aesgcm_enc.ivSz,
- info->cipher.aesgcm_enc.authTag,
- info->cipher.aesgcm_enc.authTagSz,
- info->cipher.aesgcm_enc.authIn,
- info->cipher.aesgcm_enc.authInSz);
- }
- else {
- Aes* aes = info->cipher.aesgcm_dec.aes;
- if (aes == NULL)
- return BAD_FUNC_ARG;
- rc = IntelQaSymAesGcmDecrypt(dev,
- info->cipher.aesgcm_dec.out,
- info->cipher.aesgcm_dec.in,
- info->cipher.aesgcm_dec.sz,
- (const byte*)aes->devKey, aes->keylen,
- info->cipher.aesgcm_dec.iv,
- info->cipher.aesgcm_dec.ivSz,
- info->cipher.aesgcm_dec.authTag,
- info->cipher.aesgcm_dec.authTagSz,
- info->cipher.aesgcm_dec.authIn,
- info->cipher.aesgcm_dec.authInSz);
- }
- }
- #endif /* HAVE_AESGCM */
- #ifndef NO_DES3
- if (info->cipher.type == WC_CIPHER_DES3) {
- Des3* des = info->cipher.des3.des;
- if (des == NULL)
- return BAD_FUNC_ARG;
- if (info->cipher.enc) {
- rc = IntelQaSymDes3CbcEncrypt(dev,
- info->cipher.des3.out,
- info->cipher.des3.in,
- info->cipher.des3.sz,
- (byte*)des->devKey, DES3_KEYLEN,
- (byte*)des->reg, DES_BLOCK_SIZE);
- }
- else {
- rc = IntelQaSymDes3CbcDecrypt(dev,
- info->cipher.des3.out,
- info->cipher.des3.in,
- info->cipher.des3.sz,
- (byte*)des->devKey, DES3_KEYLEN,
- (byte*)des->reg, DES_BLOCK_SIZE);
- }
- }
- #endif /* !NO_DES3 */
- }
- #endif /* QAT_ENABLE_CRYPTO */
- return rc;
- }
- /* -------------------------------------------------------------------------- */
- /* Public API */
- /* -------------------------------------------------------------------------- */
- int wc_CryptoCb_InitIntelQa(void)
- {
- int devId, rc;
- devId = IntelQaInit(NULL);
- if (devId < 0) {
- QLOG("Couldn't init the Intel QA\n");
- devId = INVALID_DEVID;
- }
- else {
- rc = IntelQaOpen(&qaDev, devId);
- if (rc != 0) {
- QLOG("Couldn't open the device\n");
- IntelQaDeInit(devId);
- devId = INVALID_DEVID;
- }
- else {
- rc = wc_CryptoCb_RegisterDevice(devId,
- IntelQaSymSync_CryptoDevCb, &qaDev);
- if (rc != 0) {
- QLOG("Couldn't register the device\n");
- IntelQaClose(&qaDev);
- IntelQaDeInit(devId);
- devId = INVALID_DEVID;
- }
- }
- }
- return devId;
- }
- void wc_CryptoCb_CleanupIntelQa(int* id)
- {
- if (INVALID_DEVID != *id) {
- wc_CryptoCb_UnRegisterDevice(*id);
- IntelQaClose(&qaDev);
- IntelQaDeInit(*id);
- *id = INVALID_DEVID;
- }
- }
- #endif /* WOLF_CRYPTO_CB */
- /* -------------------------------------------------------------------------- */
- /* Memory allocator and deallocator */
- /* -------------------------------------------------------------------------- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- /* use thread local for QAE variables (removing mutex requirement) */
- #ifdef USE_QAE_THREAD_LS
- #include <pthread.h> /* for threadId tracking */
- #define QAE_THREAD_LS THREAD_LS_T
- #else
- #define QAE_THREAD_LS
- #endif
- /* these are used to align memory to a byte boundary */
- #define ALIGNMENT_BASE (16ul)
- #define ALIGNMENT_HW (64ul)
- #define WOLF_MAGIC_NUM 0xA576F6C6641736EBUL /* (0xA)WolfAsyn(0xB) */
- #define WOLF_HEADER_ALIGN ALIGNMENT_BASE
- #define QAE_NOT_NUMA_PAGE 0xFFFF
- typedef struct qaeMemHeader {
- #ifdef WOLFSSL_TRACK_MEMORY
- struct qaeMemHeader* next;
- struct qaeMemHeader* prev;
- #ifdef WOLFSSL_DEBUG_MEMORY
- const char* func;
- unsigned int line;
- #endif
- #endif
- uint64_t magic;
- void* heap;
- #ifdef USE_QAE_THREAD_LS
- pthread_t threadId;
- #endif
- size_t size;
- word16 count;
- word16 isNuma:1;
- word16 reservedBits:15; /* use for future bits */
- word16 type;
- word16 numa_page_offset; /* use QAE_NOT_NUMA_PAGE if not NUMA */
- } ALIGN16 qaeMemHeader;
- #ifdef WOLFSSL_TRACK_MEMORY
- typedef struct qaeMemStats {
- long totalAllocs; /* number of allocations */
- long totalDeallocs; /* number of deallocations */
- long totalBytes; /* total number of bytes allocated */
- long peakBytes; /* concurrent max bytes */
- long currentBytes; /* total current bytes in use */
- } qaeMemStats;
- /* track allocations and report at end */
- typedef struct qaeMemList {
- qaeMemHeader* head;
- qaeMemHeader* tail;
- uint32_t count;
- } qaeMemList;
- #endif /* WOLFSSL_TRACK_MEMORY */
- /* local variables */
- #ifndef USE_QAE_THREAD_LS
- static pthread_mutex_t g_memLock = PTHREAD_MUTEX_INITIALIZER;
- #endif
- #ifdef WOLFSSL_TRACK_MEMORY
- static qaeMemStats g_memStats;
- static qaeMemList g_memList;
- static pthread_mutex_t g_memStatLock = PTHREAD_MUTEX_INITIALIZER;
- #endif
- static WC_INLINE int qaeMemTypeIsNuma(int type)
- {
- int isNuma = 0;
- switch (type) {
- case DYNAMIC_TYPE_ASYNC_NUMA:
- case DYNAMIC_TYPE_ASYNC_NUMA64:
- case DYNAMIC_TYPE_WOLF_BIGINT:
- case DYNAMIC_TYPE_PRIVATE_KEY:
- case DYNAMIC_TYPE_PUBLIC_KEY:
- case DYNAMIC_TYPE_AES_BUFFER:
- case DYNAMIC_TYPE_RSA_BUFFER:
- case DYNAMIC_TYPE_ECC_BUFFER:
- case DYNAMIC_TYPE_SIGNATURE:
- case DYNAMIC_TYPE_DIGEST:
- case DYNAMIC_TYPE_SECRET:
- case DYNAMIC_TYPE_SEED:
- case DYNAMIC_TYPE_SALT:
- {
- isNuma = 1;
- break;
- }
- case DYNAMIC_TYPE_OUT_BUFFER:
- case DYNAMIC_TYPE_IN_BUFFER:
- {
- #if !defined(WC_ASYNC_NO_CRYPT) && !defined(WC_ASYNC_NO_HASH)
- isNuma = 1;
- #else
- isNuma = 0;
- #endif
- break;
- }
- default:
- isNuma = 0;
- break;
- }
- return isNuma;
- }
- static void _qaeMemFree(void *ptr, void* heap, int type
- #ifdef WOLFSSL_DEBUG_MEMORY
- , const char* func, unsigned int line
- #endif
- )
- {
- qaeMemHeader* header = NULL;
- size_t size;
- void* origPtr = ptr;
- if (ptr == NULL)
- return;
- /* adjust for header and align */
- ptr = (byte*)(((size_t)ptr - ((size_t)ptr % WOLF_HEADER_ALIGN)) -
- sizeof(qaeMemHeader));
- header = (qaeMemHeader*)ptr;
- /* check for header magic */
- if (header->magic != WOLF_MAGIC_NUM) {
- printf("Free: Header magic not found! %p\n", ptr);
- return;
- }
- /* cache values for later */
- size = header->size;
- #ifdef WOLFSSL_DEBUG_MEMORY
- #ifdef WOLFSSL_DEBUG_MEMORY_PRINT
- printf("Free: %p (%u) at %s:%u, heap %p, type %d, count %d\n",
- origPtr, (unsigned int)size, func, line, heap, type, header->count);
- #else
- (void)func;
- (void)line;
- #endif
- #endif
- (void)type;
- /* adjust free count */
- header->count--;
- /* check header count */
- if (header->count > 0) {
- /* go ahead and return if still in use */
- return;
- }
- #ifdef WOLFSSL_TRACK_MEMORY
- if (pthread_mutex_lock(&g_memStatLock) == 0) {
- g_memStats.currentBytes -= size;
- g_memStats.totalDeallocs++;
- if (header == g_memList.head && header == g_memList.tail) {
- g_memList.head = NULL;
- g_memList.tail = NULL;
- }
- else if (header == g_memList.head) {
- g_memList.head = header->next;
- g_memList.head->prev = NULL;
- }
- else if (header == g_memList.tail) {
- g_memList.tail = header->prev;
- g_memList.tail->next = NULL;
- }
- else {
- qaeMemHeader* next = header->next;
- qaeMemHeader* prev = header->prev;
- if (next)
- next->prev = prev;
- if (prev)
- prev->next = next;
- }
- g_memList.count--;
- pthread_mutex_unlock(&g_memStatLock);
- }
- #endif
- (void)heap;
- (void)size;
- (void)origPtr;
- #ifdef WOLFSSL_DEBUG_MEMORY
- /* make sure magic is gone */
- header->magic = 0;
- #endif
- /* free type */
- if (header->isNuma && header->numa_page_offset != QAE_NOT_NUMA_PAGE) {
- qaeMemFreeNUMA(&ptr);
- }
- else {
- free(ptr);
- }
- }
- static void* _qaeMemAlloc(size_t size, void* heap, int type
- #ifdef WOLFSSL_DEBUG_MEMORY
- , const char* func, unsigned int line
- #endif
- )
- {
- void* ptr = NULL;
- qaeMemHeader* header = NULL;
- int isNuma;
- int alignment = ALIGNMENT_BASE;
- word16 page_offset = QAE_NOT_NUMA_PAGE;
- /* make sure all allocations are aligned */
- if ((size % WOLF_HEADER_ALIGN) != 0) {
- size += (WOLF_HEADER_ALIGN - (size % WOLF_HEADER_ALIGN));
- }
- isNuma = qaeMemTypeIsNuma(type);
- if (type == DYNAMIC_TYPE_ASYNC_NUMA64)
- alignment = ALIGNMENT_HW;
- /* allocate type */
- if (isNuma) {
- /* Node is typically 0 */
- page_offset = 0;
- ptr = qaeMemAllocNUMA((Cpa32U)(size + sizeof(qaeMemHeader)), 0,
- alignment);
- }
- else {
- isNuma = 0;
- ptr = malloc(size + sizeof(qaeMemHeader));
- }
- /* add header */
- if (ptr) {
- header = (qaeMemHeader*)ptr;
- ptr = (byte*)ptr + sizeof(qaeMemHeader);
- header->magic = WOLF_MAGIC_NUM;
- header->heap = heap;
- header->size = size;
- header->type = type;
- header->count = 1;
- header->isNuma = isNuma;
- header->numa_page_offset = page_offset;
- #ifdef USE_QAE_THREAD_LS
- header->threadId = pthread_self();
- #endif
- #ifdef WOLFSSL_TRACK_MEMORY
- if (pthread_mutex_lock(&g_memStatLock) == 0) {
- g_memStats.totalAllocs++;
- g_memStats.totalBytes += size;
- g_memStats.currentBytes += size;
- if (g_memStats.currentBytes > g_memStats.peakBytes)
- g_memStats.peakBytes = g_memStats.currentBytes;
- #ifdef WOLFSSL_DEBUG_MEMORY
- header->func = func;
- header->line = line;
- #endif
- /* Setup event */
- header->next = NULL;
- if (g_memList.tail == NULL) {
- g_memList.head = header;
- }
- else {
- g_memList.tail->next = header;
- header->prev = g_memList.tail;
- }
- g_memList.tail = header; /* add to the end either way */
- g_memList.count++;
- pthread_mutex_unlock(&g_memStatLock);
- }
- #endif
- }
- #ifdef WOLFSSL_DEBUG_MEMORY
- #ifdef WOLFSSL_DEBUG_MEMORY_PRINT
- printf("Alloc: %p (%u) at %s:%u, heap %p, type %d\n",
- ptr, (unsigned int)size, func, line, heap, type);
- #else
- (void)func;
- (void)line;
- #endif
- #endif
- (void)heap;
- return ptr;
- }
- /* Public Functions */
- void* wc_CryptoCb_IntelQaMalloc(size_t size, void* heap, int type
- #ifdef WOLFSSL_DEBUG_MEMORY
- , const char* func, unsigned int line
- #endif
- )
- {
- void* ptr;
- #ifndef USE_QAE_THREAD_LS
- int ret = pthread_mutex_lock(&g_memLock);
- if (ret != 0) {
- printf("Alloc: Error(%d) on mutex lock\n", ret);
- return NULL;
- }
- #endif
- ptr = _qaeMemAlloc(size, heap, type
- #ifdef WOLFSSL_DEBUG_MEMORY
- , func, line
- #endif
- );
- #ifndef USE_QAE_THREAD_LS
- pthread_mutex_unlock(&g_memLock);
- #endif
- return ptr;
- }
- void wc_CryptoCb_IntelQaFree(void *ptr, void* heap, int type
- #ifdef WOLFSSL_DEBUG_MEMORY
- , const char* func, unsigned int line
- #endif
- )
- {
- #ifndef USE_QAE_THREAD_LS
- int ret = pthread_mutex_lock(&g_memLock);
- if (ret != 0) {
- printf("Free: Error(%d) on mutex lock\n", ret);
- return;
- }
- #endif
- _qaeMemFree(ptr, heap, type
- #ifdef WOLFSSL_DEBUG_MEMORY
- , func, line
- #endif
- );
- #ifndef USE_QAE_THREAD_LS
- pthread_mutex_unlock(&g_memLock);
- #endif
- }
- void* wc_CryptoCb_IntelQaRealloc(void *ptr, size_t size, void* heap, int type
- #ifdef WOLFSSL_DEBUG_MEMORY
- , const char* func, unsigned int line
- #endif
- )
- {
- void* newPtr = NULL;
- void* origPtr = ptr;
- qaeMemHeader* header = NULL;
- byte allocNew = 1;
- int newIsNuma = -1, ptrIsNuma = -1;
- size_t copySize = 0;
- #ifndef USE_QAE_THREAD_LS
- int ret = pthread_mutex_lock(&g_memLock);
- if (ret != 0) {
- printf("Realloc: Error(%d) on mutex lock\n", ret);
- return NULL;
- }
- #endif
- (void)heap;
- if (ptr) {
- /* get header pointer and align */
- header = (qaeMemHeader*)(((size_t)ptr -
- ((size_t)ptr % WOLF_HEADER_ALIGN)) - sizeof(qaeMemHeader));
- if (header->magic == WOLF_MAGIC_NUM) {
- newIsNuma = qaeMemTypeIsNuma(type);
- ptrIsNuma = (header->numa_page_offset != QAE_NOT_NUMA_PAGE) ? 1 : 0;
- /* for non-NUMA, treat as normal REALLOC */
- if (newIsNuma == 0 && ptrIsNuma == 0) {
- allocNew = 1;
- }
- /* confirm input is aligned, otherwise allocate new */
- else if (((size_t)ptr % WOLF_HEADER_ALIGN) != 0) {
- allocNew = 1;
- }
- /* if matching NUMA type and size fits, use existing */
- else if (newIsNuma == ptrIsNuma && header->size >= size) {
- #ifdef USE_QAE_THREAD_LS
- if (header->threadId != pthread_self()) {
- allocNew = 1;
- #if 0
- printf("Realloc %p from different thread! orig %lx this %lx\n",
- origPtr, header->threadId, pthread_self());
- #endif
- }
- else
- #endif
- {
- /* use existing pointer and increment counter */
- header->count++;
- newPtr = origPtr;
- allocNew = 0;
- }
- }
- copySize = header->size;
- }
- else {
- copySize = size;
- }
- }
- if (allocNew) {
- newPtr = _qaeMemAlloc(size, heap, type
- #ifdef WOLFSSL_DEBUG_MEMORY
- , func, line
- #endif
- );
- if (newPtr && ptr) {
- /* only copy min of new and old size to new pointer */
- if (copySize > size)
- copySize = size;
- XMEMCPY(newPtr, ptr, copySize);
- if (newIsNuma == 0 && ptrIsNuma == 0) {
- /* for non-NUMA, treat as normal REALLOC and free old pointer */
- _qaeMemFree(ptr, heap, type
- #ifdef WOLFSSL_DEBUG_MEMORY
- , func, line
- #endif
- );
- }
- }
- }
- #ifndef USE_QAE_THREAD_LS
- pthread_mutex_unlock(&g_memLock);
- #endif
- #ifdef WOLFSSL_DEBUG_MEMORY
- #ifdef WOLFSSL_DEBUG_MEMORY_PRINT
- if (allocNew) {
- printf("Realloc: New %p -> %p (%u) at %s:%u, heap %p, type %d\n",
- origPtr, newPtr, (unsigned int)size, func, line, heap, type);
- }
- else {
- printf("Realloc: Reuse %p (%u) at %s:%u, heap %p, type %d, count %d\n",
- origPtr, (unsigned int)size, func, line, header->heap, header->type, header->count);
- }
- #else
- (void)func;
- (void)line;
- #endif
- #endif
- return newPtr;
- }
- #ifdef WOLFSSL_TRACK_MEMORY
- int InitMemoryTracker(void)
- {
- if (pthread_mutex_lock(&g_memStatLock) == 0) {
- g_memStats.totalAllocs = 0;
- g_memStats.totalDeallocs= 0;
- g_memStats.totalBytes = 0;
- g_memStats.peakBytes = 0;
- g_memStats.currentBytes = 0;
- XMEMSET(&g_memList, 0, sizeof(g_memList));
- pthread_mutex_unlock(&g_memStatLock);
- }
- return 0;
- }
- void ShowMemoryTracker(void)
- {
- if (pthread_mutex_lock(&g_memStatLock) == 0) {
- printf("total Allocs = %9ld\n", g_memStats.totalAllocs);
- printf("total Deallocs = %9ld\n", g_memStats.totalDeallocs);
- printf("total Bytes = %9ld\n", g_memStats.totalBytes);
- printf("peak Bytes = %9ld\n", g_memStats.peakBytes);
- printf("current Bytes = %9ld\n", g_memStats.currentBytes);
- if (g_memList.count > 0) {
- /* print list of allocations */
- qaeMemHeader* header;
- for (header = g_memList.head; header != NULL; header = header->next) {
- printf("Leak: Ptr %p, Size %u, Type %d, Heap %p"
- #ifdef WOLFSSL_DEBUG_MEMORY
- ", Func %s, Line %d"
- #endif
- "\n",
- (byte*)header + sizeof(qaeMemHeader), (unsigned int)header->size,
- header->type, header->heap
- #ifdef WOLFSSL_DEBUG_MEMORY
- , header->func, header->line
- #endif
- );
- }
- }
- pthread_mutex_unlock(&g_memStatLock);
- /* cleanup lock */
- pthread_mutex_destroy(&g_memStatLock);
- }
- }
- #endif /* WOLFSSL_TRACK_MEMORY */
- #ifdef QAT_DEMO_MAIN
- /* AES GCM */
- static const byte aesgcm_k[] = {
- 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
- 0x99, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
- 0x77, 0x88, 0x99, 0x00, 0x11, 0x22, 0x33, 0x44,
- 0x55, 0x66, 0x77, 0x88, 0x99, 0x00, 0x11, 0x22
- };
- static const byte aesgcm_iv[] = {
- 0xca, 0xfe, 0xca, 0xfe, 0xca, 0xfe, 0xca, 0xfe,
- 0xca, 0xfe, 0xca, 0xfe
- };
- static const byte aesgcm_a[] = {
- 0xde, 0xad, 0xde, 0xad, 0xde, 0xad, 0xde, 0xad,
- 0xde, 0xad, 0xde, 0xad, 0xde, 0xad, 0xde, 0xad,
- 0xde, 0xad, 0xde, 0xad
- };
- static const byte aesgcm_p[] = {
- 0x79, 0x84, 0x86, 0x44, 0x68, 0x45, 0x15, 0x61,
- 0x86, 0x54, 0x66, 0x56, 0x54, 0x54, 0x31, 0x54,
- 0x64, 0x64, 0x68, 0x45, 0x15, 0x15, 0x61, 0x61,
- 0x51, 0x51, 0x51, 0x51, 0x51, 0x56, 0x14, 0x11,
- 0x72, 0x13, 0x51, 0x82, 0x84, 0x56, 0x74, 0x53,
- 0x45, 0x34, 0x65, 0x15, 0x46, 0x14, 0x67, 0x55,
- 0x16, 0x14, 0x67, 0x54, 0x65, 0x47, 0x14, 0x67,
- 0x46, 0x74, 0x65, 0x46
- };
- static const byte aesgcm_c[] = {
- 0x59, 0x85, 0x02, 0x97, 0xE0, 0x4D, 0xFC, 0x5C,
- 0x03, 0xCC, 0x83, 0x64, 0xCE, 0x28, 0x0B, 0x95,
- 0x78, 0xEC, 0x93, 0x40, 0xA1, 0x8D, 0x21, 0xC5,
- 0x48, 0x6A, 0x39, 0xBA, 0x4F, 0x4B, 0x8C, 0x95,
- 0x6F, 0x8C, 0xF6, 0x9C, 0xD0, 0xA5, 0x8D, 0x67,
- 0xA1, 0x32, 0x11, 0xE7, 0x2E, 0xF6, 0x63, 0xAF,
- 0xDE, 0xD4, 0x7D, 0xEC, 0x15, 0x01, 0x58, 0xCB,
- 0xE3, 0x7B, 0xC6, 0x94,
- };
- static byte aesgcm_t[] = {
- 0x5D, 0x10, 0x3F, 0xC7, 0x22, 0xC7, 0x21, 0x29
- };
- /* simple example of using AES-GCM encrypt with Intel QA */
- int main(int argc, char** argv)
- {
- #if !defined(NO_AES) && defined(HAVE_AESGCM)
- int ret;
- IntelQaDev dev;
- byte out[256];
- byte tmp[256];
- word32 tmpLen;
- #endif
- #ifdef QAT_DEBUG
- wolfSSL_Debugging_ON();
- #endif
- IntelQaInit(NULL);
- #ifndef NO_AES
- #ifdef HAVE_AESGCM
- /* AES Test */
- IntelQaOpen(&dev, 0);
- dev.event.ret = WC_PENDING_E;
- tmpLen = sizeof(aesgcm_t);
- XMEMSET(out, 0, sizeof(out));
- XMEMSET(tmp, 0, sizeof(tmp));
- ret = IntelQaSymAesGcmEncrypt(&dev, out, aesgcm_p, sizeof(aesgcm_p),
- aesgcm_k, sizeof(aesgcm_k), aesgcm_iv, sizeof(aesgcm_iv),
- tmp, tmpLen, aesgcm_a, sizeof(aesgcm_a));
- printf("AES GCM Encrypt: Ret=%d, Tag Len=%d\n", ret, tmpLen);
- IntelQaClose(&dev);
- #endif /* HAVE_AESGCM */
- #endif /* NO_AES */
- IntelQaDeInit(0);
- return 0;
- }
- #endif
- #endif /* HAVE_INTEL_QA_SYNC */
|