From f9f1347e8daaadacdeed00f2564db74957c16e2b Mon Sep 17 00:00:00 2001 From: JacobBarthelmeh Date: Fri, 10 Mar 2023 08:34:17 -0800 Subject: [PATCH] third optimization pass with aes-ctr --- wolfcrypt/src/port/caam/caam_driver.c | 106 +++++++++----------------- wolfcrypt/src/port/caam/caam_qnx.c | 50 ++++++++++-- 2 files changed, 80 insertions(+), 76 deletions(-) diff --git a/wolfcrypt/src/port/caam/caam_driver.c b/wolfcrypt/src/port/caam/caam_driver.c index 20b130c63..56516237e 100644 --- a/wolfcrypt/src/port/caam/caam_driver.c +++ b/wolfcrypt/src/port/caam/caam_driver.c @@ -79,6 +79,7 @@ Error caamAddJob(DESCSTRUCT* desc); Error caamDoJob(DESCSTRUCT* desc); + /****************************************************************************** Internal CAAM Job Ring and partition functions ****************************************************************************/ @@ -1124,37 +1125,22 @@ static int caamAesInternal(DESCSTRUCT* desc, } -/* AES operations follow the buffer sequence of KEY -> (IV) -> Input -> Output +/* Scattered memory, does a mapping for each variable. Less performant than + * caamAesCombined. + * AES operations follow the buffer sequence of KEY -> (IV) -> Input -> Output */ int caamAes(DESCSTRUCT* desc, CAAM_BUFFER* buf, unsigned int args[4]) { - Value ofst = 0; - Error err; - int ivSz = 0; void *iv = NULL, *key, *in, *out; - int keySz; - int inSz; - int outSz; + int ivSz = 0, keySz, inSz, outSz; int idx = 0; - int state = CAAM_ALG_UPDATE; - unsigned int keyPhy; - - if (desc->state != CAAM_ENC && desc->state != CAAM_DEC) { - return CAAM_ARGS_E; - } - - keySz = buf[idx].Length; - if (keySz != 16 && keySz != 24 && keySz != 32) { - WOLFSSL_MSG("Bad AES key size found"); - return CAAM_ARGS_E; - } + unsigned int keyPhy = 0, inPhy = 0, outPhy = 0, ivPhy = 0; /* map and copy over key */ - key = (void*)buf[idx].TheAddress; + key = (void*)buf[idx].TheAddress; + keySz = buf[idx].Length; keyPhy = CAAM_ADR_TO_PHYSICAL(key, keySz); - desc->desc[desc->idx++] = (CAAM_KEY | CAAM_CLASS1 | CAAM_NWB) + keySz; - desc->desc[desc->idx++] = keyPhy; idx++; /* get IV if needed by algorithm */ @@ -1163,22 +1149,11 @@ int caamAes(DESCSTRUCT* desc, CAAM_BUFFER* buf, unsigned int args[4]) break; case CAAM_AESCTR: - ofst = 0x00001000; - /* fall through because states are the same only the offset changes */ - case CAAM_AESCBC: { - int maxSz = 16; /* default to CBC/CTR max size */ - - ivSz = buf[idx].Length; - if (ivSz != maxSz) { - WOLFSSL_MSG("Invalid AES-CBC IV size\n"); - return CAAM_ARGS_E; - } - - iv = (void*)buf[idx].TheAddress; - desc->desc[desc->idx++] = (CAAM_LOAD_CTX | CAAM_CLASS1 | ofst) + maxSz; - desc->desc[desc->idx++] = (CAAM_ADDRESS)CAAM_ADR_TO_PHYSICAL(iv, ivSz); + ivSz = buf[idx].Length; + iv = (void*)buf[idx].TheAddress; + ivPhy = CAAM_ADR_TO_PHYSICAL(iv, ivSz); idx++; } break; @@ -1188,48 +1163,31 @@ int caamAes(DESCSTRUCT* desc, CAAM_BUFFER* buf, unsigned int args[4]) return CAAM_ARGS_E; } - /* write operation */ - desc->desc[desc->idx++] = CAAM_OP | CAAM_CLASS1 | desc->type | - state | desc->state; - /* get input */ - inSz = buf[idx].Length; - in = (void*)buf[idx].TheAddress; + inSz = buf[idx].Length; + in = (void*)buf[idx].TheAddress; + inPhy = CAAM_ADR_TO_PHYSICAL(in, inSz); idx++; /* set output */ - outSz = buf[idx].Length; - out = (void*)buf[idx].TheAddress; + outSz = buf[idx].Length; + out = (void*)buf[idx].TheAddress; + outPhy = CAAM_ADR_TO_PHYSICAL(out, outSz); idx++; - /* set input/output in descriptor */ - caamAddFIFOLPhy(desc, keyPhy + keySz, inSz, FIFOL_TYPE_LC1); - caamAddFIFOS(desc, out, outSz); - - /* store updated IV */ - switch (desc->type) { - case CAAM_AESCBC: - case CAAM_AESCTR: - if (ivSz > 0) { - desc->desc[desc->idx++] = CAAM_STORE_CTX | CAAM_CLASS1 | ofst | 16; - desc->desc[desc->idx++] = (CAAM_ADDRESS)CAAM_ADR_TO_PHYSICAL(iv, ivSz); - } - break; - } - - do { - err = caamDoJob(desc); - } while (err == CAAM_WAITING); - - return err; + return caamAesInternal(desc, keyPhy, keySz, ivPhy, ivSz, inPhy, inSz, + outPhy, outSz); } -/* When a single buffer is used [key] [in] [iv] [out] for optimization */ -int caamAesCombined(DESCSTRUCT* desc, CAAM_BUFFER* buf, unsigned int args[4]) +/* When a single buffer is used [key] [in] [iv] [out] for optimization + * phyMem is non 0 when the physical memory location is already known + */ +int caamAesCombined(DESCSTRUCT* desc, CAAM_BUFFER* buf, unsigned int args[4], + unsigned int phyMem) { int idx = 0; - unsigned int keyPhy, inPhy, ivPhy, outPhy; + unsigned int keyPhy; int keySz, inSz, ivSz = 0, outSz; void* pt; @@ -1263,11 +1221,17 @@ int caamAesCombined(DESCSTRUCT* desc, CAAM_BUFFER* buf, unsigned int args[4]) outSz = buf[idx].Length; idx++; - keyPhy = CAAM_ADR_TO_PHYSICAL(pt, keySz + inSz + ivSz + outSz); + if (phyMem != 0) { + keyPhy = phyMem; + } + else { + keyPhy = CAAM_ADR_TO_PHYSICAL(pt, keySz + inSz + ivSz + outSz); + } - return caamAesInternal(desc, keyPhy, keySz, keyPhy + keySz + inSz,ivSz, - keyPhy + keySz, inSz, - keyPhy + keySz + inSz + ivSz, outSz); + return caamAesInternal(desc, keyPhy, keySz, + keyPhy + keySz + inSz,ivSz, /* IV */ + keyPhy + keySz, inSz, /* IN buffer */ + keyPhy + keySz + inSz + ivSz, outSz); /* OUT buffer */ } diff --git a/wolfcrypt/src/port/caam/caam_qnx.c b/wolfcrypt/src/port/caam/caam_qnx.c index fd95bba78..32d773172 100644 --- a/wolfcrypt/src/port/caam/caam_qnx.c +++ b/wolfcrypt/src/port/caam/caam_qnx.c @@ -46,10 +46,22 @@ #include #include #include +#include /* virtual address for accessing CAAM addresses */ uintptr_t virtual_base = 0; +static void* localMemory = NULL; +static unsigned int localPhy = 0; +sem_t localMemSem; + +/* Can be overriden, variable for how large of a local buffer to have. + * This allows for large performance gains when avoiding mapping new memory + * for each operation. */ +#ifndef WOLFSSL_CAAM_QNX_MEMORY + #define WOLFSSL_CAAM_QNX_MEMORY 250000 +#endif + /* keep track of which ID memory belongs to so it can be free'd up */ #define MAX_PART 7 pthread_mutex_t sm_mutex; @@ -739,12 +751,16 @@ static int doAES(resmgr_context_t *ctp, io_devctl_t *msg, unsigned int args[4], { int ret = EOK, i = 0; DESCSTRUCT desc; - CAAM_BUFFER tmp[6] = {0}; + CAAM_BUFFER tmp[6]; iov_t in_iovs[6], out_iovs[2]; int inIdx = 0, outIdx = 0; int algo; unsigned char *key = NULL, *iv = NULL, *in = NULL, *out = NULL; + unsigned char *pt = NULL; int keySz, ivSz = 0, inSz, outSz; + unsigned int phyMem = 0; + + memset(tmp, 0, sizeof(tmp)); /* get key info */ keySz = args[1] & 0xFFFF; /* key size */ @@ -754,7 +770,19 @@ static int doAES(resmgr_context_t *ctp, io_devctl_t *msg, unsigned int args[4], ivSz = 16; } - key = (unsigned char*)CAAM_ADR_MAP(0, keySz + inSz + outSz + ivSz, 0); + if (keySz + inSz + outSz + ivSz < WOLFSSL_CAAM_QNX_MEMORY) { + if (sem_trywait(&localMemSem) == 0) { + key = localMemory; + phyMem = localPhy; + } + } + + /* local pre-mapped memory was not used, try to map some memory now */ + if (key == NULL) { + pt = (unsigned char*)CAAM_ADR_MAP(0, keySz + inSz + outSz + ivSz, 0); + key = pt; + } + if (key == NULL) { ret = ECANCELED; } @@ -828,7 +856,7 @@ static int doAES(resmgr_context_t *ctp, io_devctl_t *msg, unsigned int args[4], tmp[i].TheAddress = (CAAM_ADDRESS)out; caamDescInit(&desc, algo, args, tmp, 6); - if (caamAesCombined(&desc, tmp, args) != Success) { + if (caamAesCombined(&desc, tmp, args, phyMem) != Success) { ret = ECANCELED; } } @@ -848,8 +876,13 @@ static int doAES(resmgr_context_t *ctp, io_devctl_t *msg, unsigned int args[4], } } - if (key != NULL) - CAAM_ADR_UNMAP(key, 0, keySz + inSz + ivSz + outSz, 0); + if (pt != NULL) { + CAAM_ADR_UNMAP(pt, 0, keySz + inSz + outSz + ivSz, 0); + } + else { + /* done using local mapped memory */ + sem_post(&localMemSem); + } return ret; } @@ -1686,6 +1719,9 @@ int main(int argc, char *argv[]) WOLFSSL_MSG("unable to start up caam driver!"); exit(1); } + localMemory = (unsigned char*)CAAM_ADR_MAP(0, WOLFSSL_CAAM_QNX_MEMORY, 0); + localPhy = CAAM_ADR_TO_PHYSICAL(localMemory, WOLFSSL_CAAM_QNX_MEMORY); + sem_init(&localMemSem, 1, 1); dpp = dispatch_create(); if (dpp == NULL) { @@ -1729,7 +1765,11 @@ int main(int argc, char *argv[]) } } + sem_destroy(&localMemSem); pthread_mutex_destroy(&sm_mutex); + if (localMemory != NULL) + CAAM_ADR_UNMAP(localMemory, 0, WOLFSSL_CAAM_QNX_MEMORY, 0); + CleanupCAAM(); return 0; }