Skip to content

Commit f7ca923

Browse files
authored
Merge pull request #6783 from bandi13/more_async_cb
More async cb
2 parents e91b623 + 9ed19cd commit f7ca923

9 files changed

Lines changed: 79 additions & 63 deletions

File tree

configure.ac

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7004,7 +7004,7 @@ AC_ARG_WITH([cavium-v],
70047004
ENABLED_CAVIUM_V=yes
70057005
],
70067006
[
7007-
ENABLED_CAVIUM_=no
7007+
ENABLED_CAVIUM=no
70087008
ENABLED_CAVIUM_V=no
70097009
]
70107010
)
@@ -7804,6 +7804,30 @@ then
78047804
AC_MSG_ERROR([please use --with-libz if enabling mcapi.])
78057805
fi
78067806

7807+
7808+
# cryptodev is old name, replaced with cryptocb
7809+
AC_ARG_ENABLE([cryptodev],
7810+
[AS_HELP_STRING([--enable-cryptodev],[DEPRECATED, use cryptocb instead])],
7811+
[ ENABLED_CRYPTOCB=$enableval ],[ ENABLED_CRYPTOCB=no ])
7812+
7813+
# Support for crypto callbacks
7814+
AC_ARG_ENABLE([cryptocb],
7815+
[AS_HELP_STRING([--enable-cryptocb],[Enable crypto callbacks (default: disabled)])],
7816+
[ ENABLED_CRYPTOCB=$enableval ],
7817+
[ ENABLED_CRYPTOCB=no ]
7818+
)
7819+
7820+
if test "x$ENABLED_PKCS11" = "xyes" || test "x$ENABLED_WOLFTPM" = "xyes" || test "$ENABLED_CAAM" != "no"
7821+
then
7822+
ENABLED_CRYPTOCB=yes
7823+
fi
7824+
if test "$ENABLED_CRYPTOCB" = "yes"
7825+
then
7826+
AM_CFLAGS="$AM_CFLAGS -DWOLF_CRYPTO_CB"
7827+
fi
7828+
7829+
7830+
78077831
# Asynchronous Crypto
78087832
AC_ARG_ENABLE([asynccrypt],
78097833
[AS_HELP_STRING([--enable-asynccrypt],[Enable Asynchronous Crypto (default: disabled)])],
@@ -7826,6 +7850,7 @@ fi
78267850

78277851
if test "$ENABLED_ASYNCCRYPT" = "yes"
78287852
then
7853+
AC_MSG_NOTICE([Enabling asynchronous support])
78297854
if ! test -f ${srcdir}/wolfcrypt/src/async.c || ! test -f ${srcdir}/wolfssl/wolfcrypt/async.h
78307855
then
78317856
AC_MSG_ERROR([--enable-asynccrypt requested, but WOLFSSL_ASYNC_CRYPT source files are missing.])
@@ -7835,24 +7860,22 @@ then
78357860

78367861
# If no async backend (hardware or software) has been explicitly enabled,
78377862
# use the software backend for testing.
7838-
if test "x$ENABLED_CAVIUM" = "xno" && test "x$ENABLED_INTEL_QA" = "xno" &&
7839-
test "x$ENABLED_ASYNCCRYPT_SW" = "xno"
7863+
if test "x$ENABLED_CAVIUM" != "xyes" && test "x$ENABLED_INTEL_QA" != "xyes" && test "x$ENABLED_CRYPTOCB" != "xyes" && test "x$ENABLED_PKCALLBACKS" != "xyes" && test "x$ENABLED_ASYNCCRYPT_SW" != "xyes"
78407864
then
7841-
# Async threading is Linux specific
7865+
AC_MSG_NOTICE([Enabling asynchronous software simulator])
78427866
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ASYNC_CRYPT_SW"
7867+
ENABLED_ASYNCCRYPT_SW=yes
78437868
fi
78447869
fi
78457870

7846-
78477871
# check for async if using Intel QuckAssist or Cavium
78487872
if test "x$ENABLED_INTEL_QA" = "xyes" || test "x$ENABLED_CAVIUM" = "xyes" ; then
78497873
if test "x$ENABLED_ASYNCCRYPT" = "xno" ; then
78507874
AC_MSG_ERROR([Please enable asynchronous support using --enable-asynccrypt])
78517875
fi
78527876
fi
78537877

7854-
7855-
# Asynchronous threading
7878+
# Asynchronous threading (Linux specific)
78567879
AC_ARG_ENABLE([asyncthreads],
78577880
[AS_HELP_STRING([--enable-asyncthreads],[Enable Asynchronous Threading (default: enabled)])],
78587881
[ ENABLED_ASYNCTHREADS=$enableval ],
@@ -7875,28 +7898,6 @@ else
78757898
fi
78767899

78777900

7878-
# cryptodev is old name, replaced with cryptocb
7879-
AC_ARG_ENABLE([cryptodev],
7880-
[AS_HELP_STRING([--enable-cryptodev],[DEPRECATED, use cryptocb instead])],
7881-
[ ENABLED_CRYPTOCB=$enableval ],[ ENABLED_CRYPTOCB=no ])
7882-
7883-
# Support for crypto callbacks
7884-
AC_ARG_ENABLE([cryptocb],
7885-
[AS_HELP_STRING([--enable-cryptocb],[Enable crypto callbacks (default: disabled)])],
7886-
[ ENABLED_CRYPTOCB=$enableval ],
7887-
[ ENABLED_CRYPTOCB=no ]
7888-
)
7889-
7890-
if test "x$ENABLED_PKCS11" = "xyes" || test "x$ENABLED_WOLFTPM" = "xyes" || test "$ENABLED_CAAM" != "no"
7891-
then
7892-
ENABLED_CRYPTOCB=yes
7893-
fi
7894-
if test "$ENABLED_CRYPTOCB" = "yes"
7895-
then
7896-
AM_CFLAGS="$AM_CFLAGS -DWOLF_CRYPTO_CB"
7897-
fi
7898-
7899-
79007901
# Session Export
79017902
AC_ARG_ENABLE([sessionexport],
79027903
[AS_HELP_STRING([--enable-sessionexport],[Enable export and import of sessions (default: disabled)])],
@@ -9515,7 +9516,8 @@ echo " * Stack sizes in tests: $ENABLED_STACKSIZE"
95159516
echo " * Heap stats in tests: $ENABLED_TRACKMEMORY"
95169517
echo " * User Crypto: $ENABLED_USER_CRYPTO"
95179518
echo " * Fast RSA: $ENABLED_FAST_RSA"
9518-
echo " * Async Crypto: $ENABLED_ASYNCCRYPT"
9519+
echo " * Asynchronous Crypto: $ENABLED_ASYNCCRYPT"
9520+
echo " * Asynchronous Crypto (sim): $ENABLED_ASYNCCRYPT_SW"
95199521
echo " * PKCS#8: $ENABLED_PKCS8"
95209522
echo " * PKCS#11: $ENABLED_PKCS11"
95219523
echo " * PKCS#12: $ENABLED_PKCS12"
@@ -9536,6 +9538,7 @@ echo " * Inline Code: $ENABLED_INLINE"
95369538
echo " * Linux AF_ALG: $ENABLED_AFALG"
95379539
echo " * Linux KCAPI: $ENABLED_KCAPI"
95389540
echo " * Linux devcrypto: $ENABLED_DEVCRYPTO"
9541+
echo " * PK callbacks: $ENABLED_PKCALLBACKS"
95399542
echo " * Crypto callbacks: $ENABLED_CRYPTOCB"
95409543
echo " * i.MX CAAM: $ENABLED_CAAM"
95419544
echo " * IoT-Safe: $ENABLED_IOTSAFE"

src/internal.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38733,18 +38733,24 @@ int wolfSSL_AsyncPop(WOLFSSL* ssl, byte* state)
3873338733

3873438734
ret = wolfAsync_EventPop(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL);
3873538735
if (ret != WC_NO_PENDING_E && ret != WC_PENDING_E) {
38736-
3873738736
/* advance key share state if doesn't need called again */
3873838737
if (state && (asyncDev->event.flags & WC_ASYNC_FLAG_CALL_AGAIN) == 0) {
3873938738
(*state)++;
3874038739
}
38741-
38742-
/* clear event */
38740+
/* clear event and async device */
3874338741
XMEMSET(&asyncDev->event, 0, sizeof(WOLF_EVENT));
38744-
38745-
/* clear async dev */
3874638742
ssl->asyncDev = NULL;
3874738743
}
38744+
#if !defined(WOLFSSL_ASYNC_CRYPT_SW) && \
38745+
(defined(WOLF_CRYPTO_CB) || defined(HAVE_PK_CALLBACKS))
38746+
else if (ret == WC_PENDING_E) {
38747+
/* Allow the underlying crypto API to be called again to trigger the
38748+
* crypto or PK callback. The actual callback must be called, since
38749+
* the completion is not detected in the poll like Intel QAT or
38750+
* Nitrox */
38751+
ret = wolfEventQueue_Remove(&ssl->ctx->event_queue, event);
38752+
}
38753+
#endif
3874838754
}
3874938755
else {
3875038756
ret = WC_NO_PENDING_E;

src/tls.c

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7392,7 +7392,7 @@ static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
73927392
word16 curveId = (word16) ECC_CURVE_INVALID;
73937393
ecc_key* eccKey = (ecc_key*)kse->key;
73947394

7395-
/* TODO: [TLS13] The key sizes should come from wolfcrypt. */
7395+
/* TODO: [TLS13] Get key sizes using wc_ecc_get_curve_size_from_id. */
73967396
/* Translate named group to a curve id. */
73977397
switch (kse->group) {
73987398
#if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
@@ -7431,9 +7431,6 @@ static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
74317431
}
74327432

74337433
if (kse->key == NULL) {
7434-
kse->keyLen = keySize;
7435-
kse->pubKeyLen = keySize * 2 + 1;
7436-
74377434
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
74387435
ret = tsip_Tls13GenEccKeyPair(ssl, kse);
74397436
if (ret != CRYPTOCB_UNAVAILABLE) {
@@ -7447,9 +7444,13 @@ static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
74477444
return MEMORY_E;
74487445
}
74497446

7450-
/* Make an ECC key */
7447+
/* Initialize an ECC key struct for the ephemeral key */
74517448
ret = wc_ecc_init_ex((ecc_key*)kse->key, ssl->heap, ssl->devId);
7449+
74527450
if (ret == 0) {
7451+
kse->keyLen = keySize;
7452+
kse->pubKeyLen = keySize * 2 + 1;
7453+
74537454
/* setting eccKey means okay to call wc_ecc_free */
74547455
eccKey = (ecc_key*)kse->key;
74557456

@@ -7461,11 +7462,21 @@ static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
74617462
/* set curve info for EccMakeKey "peer" info */
74627463
ret = wc_ecc_set_curve(eccKey, kse->keyLen, curveId);
74637464
if (ret == 0) {
7464-
/* Generate ephemeral ECC key */
7465-
/* For async this is called once and when event is done, the
7466-
* provided buffers in key be populated.
7467-
* Final processing is x963 key export below. */
7468-
ret = EccMakeKey(ssl, eccKey, eccKey);
7465+
#ifdef WOLFSSL_ASYNC_CRYPT
7466+
/* Detect when private key generation is done */
7467+
if (ssl->error == WC_PENDING_E &&
7468+
eccKey->type == ECC_PRIVATEKEY) {
7469+
ret = 0; /* ECC Key Generation is done */
7470+
}
7471+
else
7472+
#endif
7473+
{
7474+
/* Generate ephemeral ECC key */
7475+
/* For async this is called once and when event is done, the
7476+
* provided buffers in key be populated.
7477+
* Final processing is x963 key export below. */
7478+
ret = EccMakeKey(ssl, eccKey, eccKey);
7479+
}
74697480
}
74707481
#ifdef WOLFSSL_ASYNC_CRYPT
74717482
if (ret == WC_PENDING_E)

wolfcrypt/src/aes.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4156,7 +4156,7 @@ int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
41564156
return IntelQaSymAesCbcEncrypt(&aes->asyncDev, out, in, sz,
41574157
(const byte*)aes->devKey, aes->keylen,
41584158
(byte*)aes->reg, AES_BLOCK_SIZE);
4159-
#else /* WOLFSSL_ASYNC_CRYPT_SW */
4159+
#elif defined(WOLFSSL_ASYNC_CRYPT_SW)
41604160
if (wc_AsyncSwInit(&aes->asyncDev, ASYNC_SW_AES_CBC_ENCRYPT)) {
41614161
WC_ASYNC_SW* sw = &aes->asyncDev.sw;
41624162
sw->aes.aes = aes;
@@ -4321,7 +4321,7 @@ int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
43214321
return IntelQaSymAesCbcDecrypt(&aes->asyncDev, out, in, sz,
43224322
(const byte*)aes->devKey, aes->keylen,
43234323
(byte*)aes->reg, AES_BLOCK_SIZE);
4324-
#else /* WOLFSSL_ASYNC_CRYPT_SW */
4324+
#elif defined(WOLFSSL_ASYNC_CRYPT_SW)
43254325
if (wc_AsyncSwInit(&aes->asyncDev, ASYNC_SW_AES_CBC_DECRYPT)) {
43264326
WC_ASYNC_SW* sw = &aes->asyncDev.sw;
43274327
sw->aes.aes = aes;
@@ -6896,7 +6896,7 @@ int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz,
68966896
return IntelQaSymAesGcmEncrypt(&aes->asyncDev, out, in, sz,
68976897
(const byte*)aes->devKey, aes->keylen, iv, ivSz,
68986898
authTag, authTagSz, authIn, authInSz);
6899-
#else /* WOLFSSL_ASYNC_CRYPT_SW */
6899+
#elif defined(WOLFSSL_ASYNC_CRYPT_SW)
69006900
if (wc_AsyncSwInit(&aes->asyncDev, ASYNC_SW_AES_GCM_ENCRYPT)) {
69016901
WC_ASYNC_SW* sw = &aes->asyncDev.sw;
69026902
sw->aes.aes = aes;
@@ -7456,7 +7456,7 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
74567456
return IntelQaSymAesGcmDecrypt(&aes->asyncDev, out, in, sz,
74577457
(const byte*)aes->devKey, aes->keylen, iv, ivSz,
74587458
authTag, authTagSz, authIn, authInSz);
7459-
#else /* WOLFSSL_ASYNC_CRYPT_SW */
7459+
#elif defined(WOLFSSL_ASYNC_CRYPT_SW)
74607460
if (wc_AsyncSwInit(&aes->asyncDev, ASYNC_SW_AES_GCM_DECRYPT)) {
74617461
WC_ASYNC_SW* sw = &aes->asyncDev.sw;
74627462
sw->aes.aes = aes;

wolfcrypt/src/des3.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1616,7 +1616,7 @@
16161616
#elif defined(HAVE_INTEL_QA)
16171617
return IntelQaSymDes3CbcEncrypt(&des->asyncDev, out, in, sz,
16181618
(const byte*)des->devKey, DES3_KEYLEN, (byte*)des->reg, DES3_IVLEN);
1619-
#else /* WOLFSSL_ASYNC_CRYPT_SW */
1619+
#elif defined(WOLFSSL_ASYNC_CRYPT_SW)
16201620
if (wc_AsyncSwInit(&des->asyncDev, ASYNC_SW_DES3_CBC_ENCRYPT)) {
16211621
WC_ASYNC_SW* sw = &des->asyncDev.sw;
16221622
sw->des.des = des;
@@ -1667,7 +1667,7 @@
16671667
#elif defined(HAVE_INTEL_QA)
16681668
return IntelQaSymDes3CbcDecrypt(&des->asyncDev, out, in, sz,
16691669
(const byte*)des->devKey, DES3_KEYLEN, (byte*)des->reg, DES3_IVLEN);
1670-
#else /* WOLFSSL_ASYNC_CRYPT_SW */
1670+
#elif defined(WOLFSSL_ASYNC_CRYPT_SW)
16711671
if (wc_AsyncSwInit(&des->asyncDev, ASYNC_SW_DES3_CBC_DECRYPT)) {
16721672
WC_ASYNC_SW* sw = &des->asyncDev.sw;
16731673
sw->des.des = des;

wolfcrypt/src/dh.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1433,7 +1433,7 @@ static int wc_DhGenerateKeyPair_Async(DhKey* key, WC_RNG* rng,
14331433
#elif defined(HAVE_CAVIUM)
14341434
/* TODO: Not implemented - use software for now */
14351435

1436-
#else /* WOLFSSL_ASYNC_CRYPT_SW */
1436+
#elif defined(WOLFSSL_ASYNC_CRYPT_SW)
14371437
if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_DH_GEN)) {
14381438
WC_ASYNC_SW* sw = &key->asyncDev.sw;
14391439
sw->dhGen.key = key;
@@ -2207,7 +2207,7 @@ static int wc_DhAgree_Async(DhKey* key, byte* agree, word32* agreeSz,
22072207
#elif defined(HAVE_CAVIUM)
22082208
/* TODO: Not implemented - use software for now */
22092209

2210-
#else /* WOLFSSL_ASYNC_CRYPT_SW */
2210+
#elif defined(WOLFSSL_ASYNC_CRYPT_SW)
22112211
if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_DH_AGREE)) {
22122212
WC_ASYNC_SW* sw = &key->asyncDev.sw;
22132213
sw->dhAgree.key = key;

wolfcrypt/src/ecc.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5006,11 +5006,6 @@ int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point,
50065006
if (private_key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
50075007
err = wc_ecc_shared_secret_gen_async(private_key, point,
50085008
out, outlen);
5009-
if (err == 0) {
5010-
/* exit early */
5011-
RESTORE_VECTOR_REGISTERS();
5012-
return err;
5013-
}
50145009
}
50155010
else
50165011
#endif
@@ -5495,7 +5490,7 @@ static int _ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key,
54955490
/* TODO: Not implemented */
54965491
#elif defined(HAVE_INTEL_QA)
54975492
/* Implemented in ecc_make_pub_ex for the pub calc */
5498-
#else
5493+
#elif defined(WOLFSSL_ASYNC_CRYPT_SW)
54995494
if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_ECC_MAKE)) {
55005495
WC_ASYNC_SW* sw = &key->asyncDev.sw;
55015496
sw->eccMake.rng = rng;

wolfcrypt/src/rsa.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2779,7 +2779,7 @@ static int wc_RsaFunctionAsync(const byte* in, word32 inLen, byte* out,
27792779
}
27802780
#endif /* WOLFSSL_ASYNC_CRYPT_SW */
27812781

2782-
switch(type) {
2782+
switch (type) {
27832783
#ifndef WOLFSSL_RSA_PUBLIC_ONLY
27842784
case RSA_PRIVATE_DECRYPT:
27852785
case RSA_PRIVATE_ENCRYPT:
@@ -2801,7 +2801,7 @@ static int wc_RsaFunctionAsync(const byte* in, word32 inLen, byte* out,
28012801
&key->u.raw,
28022802
out, outLen);
28032803
#endif
2804-
#else /* WOLFSSL_ASYNC_CRYPT_SW */
2804+
#else
28052805
ret = wc_RsaFunctionSync(in, inLen, out, outLen, type, key, rng);
28062806
#endif
28072807
break;
@@ -2819,7 +2819,7 @@ static int wc_RsaFunctionAsync(const byte* in, word32 inLen, byte* out,
28192819
ret = IntelQaRsaPublic(&key->asyncDev, in, inLen,
28202820
&key->e.raw, &key->n.raw,
28212821
out, outLen);
2822-
#else /* WOLFSSL_ASYNC_CRYPT_SW */
2822+
#else
28232823
ret = wc_RsaFunctionSync(in, inLen, out, outLen, type, key, rng);
28242824
#endif
28252825
break;
@@ -4746,7 +4746,7 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
47464746
#elif defined(HAVE_INTEL_QA)
47474747
err = IntelQaRsaKeyGen(&key->asyncDev, key, size, e, rng);
47484748
goto out;
4749-
#else
4749+
#elif defined(WOLFSSL_ASYNC_CRYPT_SW)
47504750
if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_RSA_MAKE)) {
47514751
WC_ASYNC_SW* sw = &key->asyncDev.sw;
47524752
sw->rsaMake.rng = rng;

wolfssl/wolfcrypt/settings.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2473,6 +2473,7 @@ extern void uITRON4_free(void *p) ;
24732473
/* Asynchronous Crypto */
24742474
#ifdef WOLFSSL_ASYNC_CRYPT
24752475
#if !defined(HAVE_CAVIUM) && !defined(HAVE_INTEL_QA) && \
2476+
!defined(WOLF_CRYPTO_CB) && !defined(HAVE_PK_CALLBACKS) && \
24762477
!defined(WOLFSSL_ASYNC_CRYPT_SW)
24772478
#error No async backend defined with WOLFSSL_ASYNC_CRYPT!
24782479
#endif

0 commit comments

Comments
 (0)