Skip to content

Commit e867f0d

Browse files
Merge pull request #5574 from haydenroche5/ecc_nb_tls
Add support for non-blocking ECDHE/ECDSA in TLS/DTLS layer.
2 parents 2eee35e + 14a521c commit e867f0d

4 files changed

Lines changed: 89 additions & 35 deletions

File tree

configure.ac

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6985,6 +6985,13 @@ then
69856985
AC_MSG_ERROR([please use --with-libz if enabling mcapi.])
69866986
fi
69876987

6988+
# Asynchronous Crypto
6989+
AC_ARG_ENABLE([asynccrypt],
6990+
[AS_HELP_STRING([--enable-asynccrypt],[Enable Asynchronous Crypto (default: disabled)])],
6991+
[ ENABLED_ASYNCCRYPT=$enableval ],
6992+
[ ENABLED_ASYNCCRYPT=no ]
6993+
)
6994+
69886995
# Asynchronous crypto using software (i.e. not hardware). Required for
69896996
# non-blocking crypto with TLS/DTLS.
69906997
AC_ARG_ENABLE([asynccrypt-sw],
@@ -6995,15 +7002,9 @@ AC_ARG_ENABLE([asynccrypt-sw],
69957002
if test "$ENABLED_ASYNCCRYPT_SW" = "yes"
69967003
then
69977004
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ASYNC_CRYPT_SW"
7005+
ENABLED_ASYNCCRYPT=yes
69987006
fi
69997007

7000-
# Asynchronous Crypto
7001-
AC_ARG_ENABLE([asynccrypt],
7002-
[AS_HELP_STRING([--enable-asynccrypt],[Enable Asynchronous Crypto (default: disabled)])],
7003-
[ ENABLED_ASYNCCRYPT=$enableval ],
7004-
[ ENABLED_ASYNCCRYPT=no ]
7005-
)
7006-
70077008
if test "$ENABLED_ASYNCCRYPT" = "yes"
70087009
then
70097010
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ASYNC_CRYPT -DHAVE_WOLF_EVENT -DHAVE_WOLF_BIGINT -DWOLFSSL_NO_HASH_RAW"

src/internal.c

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7071,6 +7071,14 @@ void FreeKey(WOLFSSL* ssl, int type, void** pKey)
70717071
#endif /* ! NO_RSA */
70727072
#ifdef HAVE_ECC
70737073
case DYNAMIC_TYPE_ECC:
7074+
#if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
7075+
defined(WC_ASYNC_ENABLE_ECC)
7076+
if (((ecc_key*)*pKey)->nb_ctx != NULL) {
7077+
XFREE(((ecc_key*)*pKey)->nb_ctx, ((ecc_key*)*pKey)->heap,
7078+
DYNAMIC_TYPE_TMP_BUFFER);
7079+
}
7080+
#endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
7081+
WC_ASYNC_ENABLE_ECC */
70747082
wc_ecc_free((ecc_key*)*pKey);
70757083
break;
70767084
#endif /* HAVE_ECC */
@@ -7125,6 +7133,13 @@ int AllocKey(WOLFSSL* ssl, int type, void** pKey)
71257133
{
71267134
int ret = BAD_FUNC_ARG;
71277135
int sz = 0;
7136+
#ifdef HAVE_ECC
7137+
ecc_key* eccKey;
7138+
#endif /* HAVE_ECC */
7139+
#if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
7140+
defined(WC_ASYNC_ENABLE_ECC)
7141+
ecc_nb_ctx_t* nbCtx;
7142+
#endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW && WC_ASYNC_ENABLE_ECC*/
71287143

71297144
if (ssl == NULL || pKey == NULL) {
71307145
return BAD_FUNC_ARG;
@@ -7204,7 +7219,25 @@ int AllocKey(WOLFSSL* ssl, int type, void** pKey)
72047219
#endif /* ! NO_RSA */
72057220
#ifdef HAVE_ECC
72067221
case DYNAMIC_TYPE_ECC:
7207-
ret = wc_ecc_init_ex((ecc_key*)*pKey, ssl->heap, ssl->devId);
7222+
eccKey = (ecc_key*)*pKey;
7223+
ret = wc_ecc_init_ex(eccKey, ssl->heap, ssl->devId);
7224+
if (ret == 0) {
7225+
#if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
7226+
defined(WC_ASYNC_ENABLE_ECC)
7227+
nbCtx = (ecc_nb_ctx_t*)XMALLOC(sizeof(ecc_nb_ctx_t),
7228+
eccKey->heap, DYNAMIC_TYPE_TMP_BUFFER);
7229+
if (nbCtx == NULL) {
7230+
ret = MEMORY_E;
7231+
}
7232+
else {
7233+
ret = wc_ecc_set_nonblock(eccKey, nbCtx);
7234+
if (ret != 0) {
7235+
XFREE(nbCtx, eccKey->heap, DYNAMIC_TYPE_TMP_BUFFER);
7236+
}
7237+
}
7238+
#endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
7239+
WC_ASYNC_ENABLE_ECC */
7240+
}
72087241
break;
72097242
#endif /* HAVE_ECC */
72107243
#ifdef HAVE_ED25519

wolfcrypt/src/asn.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15082,6 +15082,14 @@ void FreeSignatureCtx(SignatureCtx* sigCtx)
1508215082
#endif
1508315083
#ifdef HAVE_ECC
1508415084
case ECDSAk:
15085+
#if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
15086+
defined(WC_ASYNC_ENABLE_ECC)
15087+
if (sigCtx->key.ecc->nb_ctx != NULL) {
15088+
XFREE(sigCtx->key.ecc->nb_ctx, sigCtx->heap,
15089+
DYNAMIC_TYPE_TMP_BUFFER);
15090+
}
15091+
#endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
15092+
WC_ASYNC_ENABLE_ECC */
1508515093
wc_ecc_free(sigCtx->key.ecc);
1508615094
XFREE(sigCtx->key.ecc, sigCtx->heap, DYNAMIC_TYPE_ECC);
1508715095
sigCtx->key.ecc = NULL;
@@ -15570,6 +15578,11 @@ static int ConfirmSignature(SignatureCtx* sigCtx,
1557015578
case ECDSAk:
1557115579
{
1557215580
word32 idx = 0;
15581+
#if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
15582+
defined(WC_ASYNC_ENABLE_ECC)
15583+
ecc_nb_ctx_t* nbCtx;
15584+
#endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
15585+
WC_ASYNC_ENABLE_ECC */
1557315586

1557415587
sigCtx->verify = 0;
1557515588
sigCtx->key.ecc = (ecc_key*)XMALLOC(sizeof(ecc_key),
@@ -15581,6 +15594,21 @@ static int ConfirmSignature(SignatureCtx* sigCtx,
1558115594
sigCtx->devId)) < 0) {
1558215595
goto exit_cs;
1558315596
}
15597+
#if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
15598+
defined(WC_ASYNC_ENABLE_ECC)
15599+
nbCtx = (ecc_nb_ctx_t*)XMALLOC(sizeof(ecc_nb_ctx_t),
15600+
sigCtx->heap, DYNAMIC_TYPE_TMP_BUFFER);
15601+
if (nbCtx == NULL) {
15602+
ERROR_OUT(MEMORY_E, exit_cs);
15603+
}
15604+
else {
15605+
ret = wc_ecc_set_nonblock(sigCtx->key.ecc, nbCtx);
15606+
if (ret != 0) {
15607+
goto exit_cs;
15608+
}
15609+
}
15610+
#endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
15611+
WC_ASYNC_ENABLE_ECC */
1558415612
ret = wc_EccPublicKeyDecode(key, &idx, sigCtx->key.ecc,
1558515613
keySz);
1558615614
if (ret < 0) {

wolfcrypt/src/ecc.c

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6389,12 +6389,25 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
63896389
}
63906390
#endif
63916391

6392+
6393+
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
6394+
defined(WOLFSSL_ASYNC_CRYPT_SW)
6395+
if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
6396+
if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_ECC_SIGN)) {
6397+
WC_ASYNC_SW* sw = &key->asyncDev.sw;
6398+
sw->eccSign.in = in;
6399+
sw->eccSign.inSz = inlen;
6400+
sw->eccSign.rng = rng;
6401+
sw->eccSign.key = key;
6402+
sw->eccSign.r = r;
6403+
sw->eccSign.s = s;
6404+
return WC_PENDING_E;
6405+
}
6406+
}
6407+
#endif
6408+
63926409
#if defined(WOLFSSL_HAVE_SP_ECC)
6393-
if (key->idx != ECC_CUSTOM_IDX
6394-
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
6395-
&& key->asyncDev.marker != WOLFSSL_ASYNC_MARKER_ECC
6396-
#endif
6397-
) {
6410+
if (key->idx != ECC_CUSTOM_IDX) {
63986411
#if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP) \
63996412
|| defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
64006413
defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
@@ -6494,23 +6507,6 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
64946507
(void)inlen;
64956508
#endif
64966509

6497-
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
6498-
defined(WOLFSSL_ASYNC_CRYPT_SW)
6499-
if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
6500-
if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_ECC_SIGN)) {
6501-
WC_ASYNC_SW* sw = &key->asyncDev.sw;
6502-
sw->eccSign.in = in;
6503-
sw->eccSign.inSz = inlen;
6504-
sw->eccSign.rng = rng;
6505-
sw->eccSign.key = key;
6506-
sw->eccSign.r = r;
6507-
sw->eccSign.s = s;
6508-
return WC_PENDING_E;
6509-
}
6510-
}
6511-
#endif
6512-
6513-
65146510
#if !defined(WOLFSSL_SP_MATH)
65156511

65166512
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_CAVIUM_V)
@@ -8010,11 +8006,7 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
80108006
#endif
80118007

80128008
#if defined(WOLFSSL_HAVE_SP_ECC)
8013-
if (key->idx != ECC_CUSTOM_IDX
8014-
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
8015-
&& key->asyncDev.marker != WOLFSSL_ASYNC_MARKER_ECC
8016-
#endif
8017-
) {
8009+
if (key->idx != ECC_CUSTOM_IDX) {
80188010
#if defined(WC_ECC_NONBLOCK) && defined(WC_ECC_NONBLOCK_ONLY)
80198011
/* perform blocking call to non-blocking function */
80208012
ecc_nb_ctx_t nb_ctx;

0 commit comments

Comments
 (0)