Added "--enable-asynccrypt" option for enabling asynchronous crypto. This includes a refactor of SendServerKeyExchange and DoClientKeyExchange to support WC_PENDING_E on key generation, signing and verification. Currently uses async simulator (WOLFSSL_ASYNC_CRYPT_TEST) if cavium not enabled. All of the examples have been updated to support WC_PENDING_E on accept and connect. A generic WOLF_EVENT infrastructure has been added to support other types of future events and is enabled using "HAVE_WOLF_EVENT". Refactor the ASN OID type (ex: hashType/sigType) to use a more unique name. The real "async.c" and "async.h" files are in a private repo.

This commit is contained in:
David Garske
2016-03-04 10:05:22 -08:00
parent 10e74f7200
commit e1787fe160
22 changed files with 2870 additions and 2681 deletions

2
.gitignore vendored
View File

@@ -39,6 +39,8 @@ cyassl.sublime*
fips.c fips.c
fips_test.c fips_test.c
fips fips
src/async.c
wolfssl/async.h
ctaocrypt/benchmark/benchmark ctaocrypt/benchmark/benchmark
ctaocrypt/test/testctaocrypt ctaocrypt/test/testctaocrypt
wolfcrypt/benchmark/benchmark wolfcrypt/benchmark/benchmark

View File

@@ -18,6 +18,10 @@ if test -d .git; then
# touch fips files for non fips distribution # touch fips files for non fips distribution
touch ./ctaocrypt/src/fips.c touch ./ctaocrypt/src/fips.c
touch ./ctaocrypt/src/fips_test.c touch ./ctaocrypt/src/fips_test.c
# touch async crypt files
touch ./src/async.c
touch ./wolfssl/async.h
else else
WARNINGS="all" WARNINGS="all"
fi fi

View File

@@ -2505,6 +2505,27 @@ fi
AM_CONDITIONAL([BUILD_MCAPI], [test "x$ENABLED_MCAPI" = "xyes"]) AM_CONDITIONAL([BUILD_MCAPI], [test "x$ENABLED_MCAPI" = "xyes"])
# Asynchronous Crypto
AC_ARG_ENABLE([asynccrypt],
[ --enable-asynccrypt Enable Asynchronous Crypto (default: disabled)],
[ ENABLED_ASYNCCRYPT=$enableval ],
[ ENABLED_ASYNCCRYPT=no ]
)
if test "$ENABLED_ASYNCCRYPT" = "yes"
then
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ASYNC_CRYPT"
# if Cavium not enabled the use async simulator for testing
if test "x$ENABLED_CAVIUM" = "xno"
then
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ASYNC_CRYPT_TEST"
fi
fi
AM_CONDITIONAL([BUILD_ASYNCCRYPT], [test "x$ENABLED_ASYNCCRYPT" = "xyes"])
# check if PSK was enabled for conditionally running psk.test script # check if PSK was enabled for conditionally running psk.test script
AM_CONDITIONAL([BUILD_PSK], [test "x$ENABLED_PSK" = "xyes"]) AM_CONDITIONAL([BUILD_PSK], [test "x$ENABLED_PSK" = "xyes"])
@@ -2836,5 +2857,6 @@ echo " * LIBZ: $ENABLED_LIBZ"
echo " * Examples: $ENABLED_EXAMPLES" echo " * Examples: $ENABLED_EXAMPLES"
echo " * User Crypto: $ENABLED_USER_CRYPTO" echo " * User Crypto: $ENABLED_USER_CRYPTO"
echo " * Fast RSA: $ENABLED_FAST_RSA" echo " * Fast RSA: $ENABLED_FAST_RSA"
echo " * Async Crypto: $ENABLED_ASYNCCRYPT"
echo "" echo ""
echo "---" echo "---"

View File

@@ -68,7 +68,7 @@
#endif #endif
static void NonBlockingSSL_Connect(WOLFSSL* ssl) static void NonBlockingSSL_Connect(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
{ {
#ifndef WOLFSSL_CALLBACKS #ifndef WOLFSSL_CALLBACKS
int ret = wolfSSL_connect(ssl); int ret = wolfSSL_connect(ssl);
@@ -79,14 +79,23 @@ static void NonBlockingSSL_Connect(WOLFSSL* ssl)
SOCKET_T sockfd = (SOCKET_T)wolfSSL_get_fd(ssl); SOCKET_T sockfd = (SOCKET_T)wolfSSL_get_fd(ssl);
int select_ret; int select_ret;
(void)ctx;
while (ret != SSL_SUCCESS && (error == SSL_ERROR_WANT_READ || while (ret != SSL_SUCCESS && (error == SSL_ERROR_WANT_READ ||
error == SSL_ERROR_WANT_WRITE)) { error == SSL_ERROR_WANT_WRITE ||
error == WC_PENDING_E)) {
int currTimeout = 1; int currTimeout = 1;
if (error == SSL_ERROR_WANT_READ) if (error == SSL_ERROR_WANT_READ)
printf("... client would read block\n"); printf("... client would read block\n");
else else if (error == SSL_ERROR_WANT_WRITE)
printf("... client would write block\n"); printf("... client would write block\n");
#ifdef WOLFSSL_ASYNC_CRYPT
else if (error == WC_PENDING_E) {
ret = AsyncCryptPoll(ctx, ssl);
if (ret < 0) { break; } else if (ret == 0) { continue; }
}
#endif
#ifdef WOLFSSL_DTLS #ifdef WOLFSSL_DTLS
currTimeout = wolfSSL_dtls_get_current_timeout(ssl); currTimeout = wolfSSL_dtls_get_current_timeout(ssl);
@@ -436,6 +445,7 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
int disableCRL = 0; int disableCRL = 0;
int externalTest = 0; int externalTest = 0;
int ret; int ret;
int err = 0;
int scr = 0; /* allow secure renegotiation */ int scr = 0; /* allow secure renegotiation */
int forceScr = 0; /* force client initiaed scr */ int forceScr = 0; /* force client initiaed scr */
int trackMemory = 0; int trackMemory = 0;
@@ -1170,27 +1180,40 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
if (nonBlocking) { if (nonBlocking) {
wolfSSL_set_using_nonblock(ssl, 1); wolfSSL_set_using_nonblock(ssl, 1);
tcp_set_nonblocking(&sockfd); tcp_set_nonblocking(&sockfd);
NonBlockingSSL_Connect(ssl); NonBlockingSSL_Connect(ctx, ssl);
} }
else if (wolfSSL_connect(ssl) != SSL_SUCCESS) { else {
/* see note at top of README */ do {
int err = wolfSSL_get_error(ssl, 0); #ifdef WOLFSSL_ASYNC_CRYPT
if (err == WC_PENDING_E) {
ret = AsyncCryptPoll(ctx, ssl);
if (ret < 0) { break; } else if (ret == 0) { continue; }
}
#endif
err = 0; /* Reset error */
ret = wolfSSL_connect(ssl);
if (ret != SSL_SUCCESS) {
err = wolfSSL_get_error(ssl, 0);
}
} while (ret != SSL_SUCCESS && err == WC_PENDING_E);
if (ret != SSL_SUCCESS) {
char buffer[WOLFSSL_MAX_ERROR_SZ]; char buffer[WOLFSSL_MAX_ERROR_SZ];
printf("err = %d, %s\n", err, printf("err = %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer));
wolfSSL_ERR_error_string(err, buffer)); err_sys("wolfSSL_connect failed");
err_sys("SSL_connect failed"); /* see note at top of README */
/* if you're getting an error here */ /* if you're getting an error here */
} }
}
#else #else
timeout.tv_sec = 2; timeout.tv_sec = 2;
timeout.tv_usec = 0; timeout.tv_usec = 0;
NonBlockingSSL_Connect(ssl); /* will keep retrying on timeout */ NonBlockingSSL_Connect(ctx, ssl); /* will keep retrying on timeout */
#endif #endif
showPeer(ssl); showPeer(ssl);
#ifdef HAVE_ALPN #ifdef HAVE_ALPN
if (alpnList != NULL) { if (alpnList != NULL) {
int err;
char *protocol_name = NULL; char *protocol_name = NULL;
word16 protocol_nameSz = 0; word16 protocol_nameSz = 0;
@@ -1315,14 +1338,14 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
if (nonBlocking) { if (nonBlocking) {
wolfSSL_set_using_nonblock(sslResume, 1); wolfSSL_set_using_nonblock(sslResume, 1);
tcp_set_nonblocking(&sockfd); tcp_set_nonblocking(&sockfd);
NonBlockingSSL_Connect(sslResume); NonBlockingSSL_Connect(ctx, sslResume);
} }
else if (wolfSSL_connect(sslResume) != SSL_SUCCESS) else if (wolfSSL_connect(sslResume) != SSL_SUCCESS)
err_sys("SSL resume failed"); err_sys("SSL resume failed");
#else #else
timeout.tv_sec = 2; timeout.tv_sec = 2;
timeout.tv_usec = 0; timeout.tv_usec = 0;
NonBlockingSSL_Connect(ssl); /* will keep retrying on timeout */ NonBlockingSSL_Connect(ctx, ssl); /* will keep retrying on timeout */
#endif #endif
showPeer(sslResume); showPeer(sslResume);
@@ -1333,7 +1356,6 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
#ifdef HAVE_ALPN #ifdef HAVE_ALPN
if (alpnList != NULL) { if (alpnList != NULL) {
int err;
char *protocol_name = NULL; char *protocol_name = NULL;
word16 protocol_nameSz = 0; word16 protocol_nameSz = 0;

View File

@@ -68,6 +68,7 @@ void echoclient_test(void* args)
SSL_CTX* ctx = 0; SSL_CTX* ctx = 0;
SSL* ssl = 0; SSL* ssl = 0;
int ret = 0, err = 0;
int doDTLS = 0; int doDTLS = 0;
int doPSK = 0; int doPSK = 0;
int sendSz; int sendSz;
@@ -173,7 +174,25 @@ void echoclient_test(void* args)
Sleep(100); Sleep(100);
#endif #endif
if (SSL_connect(ssl) != SSL_SUCCESS) err_sys("SSL_connect failed"); do {
#ifdef WOLFSSL_ASYNC_CRYPT
if (err == WC_PENDING_E) {
ret = AsyncCryptPoll(ctx, ssl);
if (ret < 0) { break; } else if (ret == 0) { continue; }
}
#endif
err = 0; /* Reset error */
ret = SSL_connect(ssl);
if (ret != SSL_SUCCESS) {
err = SSL_get_error(ssl, 0);
}
} while (ret != SSL_SUCCESS && err == WC_PENDING_E);
if (ret != SSL_SUCCESS) {
char buffer[CYASSL_MAX_ERROR_SZ];
printf("err = %d, %s\n", err, ERR_error_string(err, buffer));
err_sys("SSL_connect failed");
}
while (fgets(msg, sizeof(msg), fin) != 0) { while (fgets(msg, sizeof(msg), fin) != 0) {

View File

@@ -77,6 +77,7 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args)
CYASSL_METHOD* method = 0; CYASSL_METHOD* method = 0;
CYASSL_CTX* ctx = 0; CYASSL_CTX* ctx = 0;
int ret = 0;
int doDTLS = 0; int doDTLS = 0;
int doPSK = 0; int doPSK = 0;
int outCreated = 0; int outCreated = 0;
@@ -228,6 +229,7 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args)
int clientfd; int clientfd;
int firstRead = 1; int firstRead = 1;
int gotFirstG = 0; int gotFirstG = 0;
int err = 0;
SOCKADDR_IN_T client; SOCKADDR_IN_T client;
socklen_t client_len = sizeof(client); socklen_t client_len = sizeof(client);
#ifndef CYASSL_DTLS #ifndef CYASSL_DTLS
@@ -260,7 +262,25 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args)
#elif !defined(NO_DH) #elif !defined(NO_DH)
SetDH(ssl); /* will repick suites with DHE, higher than PSK */ SetDH(ssl); /* will repick suites with DHE, higher than PSK */
#endif #endif
if (CyaSSL_accept(ssl) != SSL_SUCCESS) {
do {
#ifdef WOLFSSL_ASYNC_CRYPT
if (err == WC_PENDING_E) {
ret = AsyncCryptPoll(ctx, ssl);
if (ret < 0) { break; } else if (ret == 0) { continue; }
}
#endif
err = 0; /* Reset error */
ret = CyaSSL_accept(ssl);
if (ret != SSL_SUCCESS) {
err = CyaSSL_get_error(ssl, 0);
}
} while (ret != SSL_SUCCESS && err == WC_PENDING_E);
if (ret != SSL_SUCCESS) {
err = CyaSSL_get_error(ssl, 0);
char buffer[CYASSL_MAX_ERROR_SZ];
printf("error = %d, %s\n", err, CyaSSL_ERR_error_string(err, buffer));
printf("SSL_accept failed\n"); printf("SSL_accept failed\n");
CyaSSL_free(ssl); CyaSSL_free(ssl);
CloseSocket(clientfd); CloseSocket(clientfd);

View File

@@ -71,7 +71,7 @@
static void NonBlockingSSL_Accept(SSL* ssl) static int NonBlockingSSL_Accept(SSL* ssl)
{ {
#ifndef CYASSL_CALLBACKS #ifndef CYASSL_CALLBACKS
int ret = SSL_accept(ssl); int ret = SSL_accept(ssl);
@@ -120,8 +120,8 @@ static void NonBlockingSSL_Accept(SSL* ssl)
error = SSL_FATAL_ERROR; error = SSL_FATAL_ERROR;
} }
} }
if (ret != SSL_SUCCESS)
err_sys("SSL_accept failed"); return ret;
} }
/* Echo number of bytes specified by -e arg */ /* Echo number of bytes specified by -e arg */
@@ -279,6 +279,7 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args)
int doListen = 1; int doListen = 1;
int crlFlags = 0; int crlFlags = 0;
int ret; int ret;
int err = 0;
char* serverReadyFile = NULL; char* serverReadyFile = NULL;
char* alpnList = NULL; char* alpnList = NULL;
unsigned char alpn_opt = 0; unsigned char alpn_opt = 0;
@@ -836,21 +837,44 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args)
if (nonBlocking) { if (nonBlocking) {
CyaSSL_set_using_nonblock(ssl, 1); CyaSSL_set_using_nonblock(ssl, 1);
tcp_set_nonblocking(&clientfd); tcp_set_nonblocking(&clientfd);
NonBlockingSSL_Accept(ssl); }
} else if (SSL_accept(ssl) != SSL_SUCCESS) { #endif
int err = SSL_get_error(ssl, 0);
do {
#ifdef WOLFSSL_ASYNC_CRYPT
if (err == WC_PENDING_E) {
ret = AsyncCryptPoll(ctx, ssl);
if (ret < 0) { break; } else if (ret == 0) { continue; }
}
#endif
err = 0; /* Reset error */
#ifndef CYASSL_CALLBACKS
if (nonBlocking) {
ret = NonBlockingSSL_Accept(ssl);
}
else {
ret = SSL_accept(ssl);
}
#else
ret = NonBlockingSSL_Accept(ssl);
#endif
if (ret != SSL_SUCCESS) {
err = SSL_get_error(ssl, 0);
}
} while (ret != SSL_SUCCESS && err == WC_PENDING_E);
if (ret != SSL_SUCCESS) {
err = SSL_get_error(ssl, 0);
char buffer[CYASSL_MAX_ERROR_SZ]; char buffer[CYASSL_MAX_ERROR_SZ];
printf("error = %d, %s\n", err, ERR_error_string(err, buffer)); printf("error = %d, %s\n", err, ERR_error_string(err, buffer));
err_sys("SSL_accept failed"); err_sys("SSL_accept failed");
} }
#else
NonBlockingSSL_Accept(ssl);
#endif
showPeer(ssl); showPeer(ssl);
#ifdef HAVE_ALPN #ifdef HAVE_ALPN
if (alpnList != NULL) { if (alpnList != NULL) {
int err;
char *protocol_name = NULL, *list = NULL; char *protocol_name = NULL, *list = NULL;
word16 protocol_nameSz = 0, listSz = 0; word16 protocol_nameSz = 0, listSz = 0;

View File

@@ -250,4 +250,8 @@ if BUILD_SNIFFER
src_libwolfssl_la_SOURCES += src/sniffer.c src_libwolfssl_la_SOURCES += src/sniffer.c
endif endif
if BUILD_ASYNCCRYPT
src_libwolfssl_la_SOURCES += src/async.c
endif
endif # !BUILD_CRYPTONLY endif # !BUILD_CRYPTONLY

3379
src/internal.c Normal file → Executable file

File diff suppressed because it is too large Load Diff

115
src/ssl.c
View File

@@ -17826,4 +17826,119 @@ void* wolfSSL_get_jobject(WOLFSSL* ssl)
#endif /* WOLFSSL_JNI */ #endif /* WOLFSSL_JNI */
#ifdef HAVE_WOLF_EVENT
int wolfssl_CTX_poll_peek(WOLFSSL_CTX* ctx, int* eventCount)
{
WOLF_EVENT* event;
int count = 0;
if (ctx == NULL) {
return BAD_FUNC_ARG;
}
#ifndef SINGLE_THREADED
if (LockMutex(&ctx->event_queue.lock) != 0) {
return BAD_MUTEX_E;
}
#endif
/* Itterate event queue */
for (event = ctx->event_queue.head; event != NULL; event = event->next) {
count++;
}
#ifndef SINGLE_THREADED
UnLockMutex(&ctx->event_queue.lock);
#endif
if (eventCount) {
*eventCount = count;
}
return 0;
}
int wolfSSL_CTX_poll(WOLFSSL_CTX* ctx, WOLF_EVENT* events, int maxEvents,
unsigned char flags, int* eventCount)
{
WOLF_EVENT* event, *event_prev = NULL;
int count = 0, ret = SSL_ERROR_NONE;
if (ctx == NULL || events == NULL || maxEvents <= 0) {
return BAD_FUNC_ARG;
}
#ifndef SINGLE_THREADED
if (LockMutex(&ctx->event_queue.lock) != 0) {
return BAD_MUTEX_E;
}
#endif
/* Itterate event queue */
for (event = ctx->event_queue.head; event != NULL; event = event->next)
{
byte removeEvent = 0;
#ifdef WOLFSSL_ASYNC_CRYPT
if (event->type >= WOLF_EVENT_TYPE_ASYNC_FIRST &&
event->type <= WOLF_EVENT_TYPE_ASYNC_LAST)
{
ret = wolfSSL_async_poll(event, flags);
}
#endif /* WOLFSSL_ASYNC_CRYPT */
/* If event is done add to returned event data */
if (event->done) {
/* Check to make sure we have room for event */
if (count >= maxEvents) {
break; /* Exit for */
}
/* Copy event data to provided buffer */
XMEMCPY(&events[count], event, sizeof(WOLF_EVENT));
count++;
removeEvent = 1;
}
if (removeEvent) {
/* Remove from queue list */
if (event_prev == NULL) {
ctx->event_queue.head = event->next;
if (ctx->event_queue.head == NULL) {
ctx->event_queue.tail = NULL;
}
}
else {
event_prev->next = event->next;
}
}
else {
/* Leave in queue, save prev pointer */
event_prev = event;
}
/* Check for error */
if (ret < 0) {
break; /* Exit for */
}
}
#ifndef SINGLE_THREADED
UnLockMutex(&ctx->event_queue.lock);
#endif
/* Return number of poperly populated events */
if (eventCount) {
*eventCount = count;
}
/* Make sure success returns 0 */
if (ret > 0) {
ret = 0;
}
return ret;
}
#endif /* HAVE_WOLF_EVENT */
#endif /* WOLFCRYPT_ONLY */ #endif /* WOLFCRYPT_ONLY */

View File

@@ -788,7 +788,7 @@ static const byte* OidFromId(word32 id, word32 type, word32* oidSz)
switch (type) { switch (type) {
case hashType: case oidHashType:
switch (id) { switch (id) {
case MD2h: case MD2h:
oid = hashMd2hOid; oid = hashMd2hOid;
@@ -817,7 +817,7 @@ static const byte* OidFromId(word32 id, word32 type, word32* oidSz)
} }
break; break;
case sigType: case oidSigType:
switch (id) { switch (id) {
#ifndef NO_DSA #ifndef NO_DSA
case CTC_SHAwDSA: case CTC_SHAwDSA:
@@ -874,7 +874,7 @@ static const byte* OidFromId(word32 id, word32 type, word32* oidSz)
} }
break; break;
case keyType: case oidKeyType:
switch (id) { switch (id) {
#ifndef NO_DSA #ifndef NO_DSA
case DSAk: case DSAk:
@@ -906,7 +906,7 @@ static const byte* OidFromId(word32 id, word32 type, word32* oidSz)
break; break;
#ifdef HAVE_ECC #ifdef HAVE_ECC
case curveType: case oidCurveType:
switch (id) { switch (id) {
#if defined(HAVE_ALL_CURVES) || !defined(NO_ECC256) #if defined(HAVE_ALL_CURVES) || !defined(NO_ECC256)
case ECC_256R1: case ECC_256R1:
@@ -950,7 +950,7 @@ static const byte* OidFromId(word32 id, word32 type, word32* oidSz)
break; break;
#endif /* HAVE_ECC */ #endif /* HAVE_ECC */
case blkType: case oidBlkType:
switch (id) { switch (id) {
case DESb: case DESb:
oid = blkDesCbcOid; oid = blkDesCbcOid;
@@ -964,7 +964,7 @@ static const byte* OidFromId(word32 id, word32 type, word32* oidSz)
break; break;
#ifdef HAVE_OCSP #ifdef HAVE_OCSP
case ocspType: case oidOcspType:
switch (id) { switch (id) {
case OCSP_BASIC_OID: case OCSP_BASIC_OID:
oid = ocspBasicOid; oid = ocspBasicOid;
@@ -978,7 +978,7 @@ static const byte* OidFromId(word32 id, word32 type, word32* oidSz)
break; break;
#endif /* HAVE_OCSP */ #endif /* HAVE_OCSP */
case certExtType: case oidCertExtType:
switch (id) { switch (id) {
case BASIC_CA_OID: case BASIC_CA_OID:
oid = extBasicCaOid; oid = extBasicCaOid;
@@ -1027,7 +1027,7 @@ static const byte* OidFromId(word32 id, word32 type, word32* oidSz)
} }
break; break;
case certAuthInfoType: case oidCertAuthInfoType:
switch (id) { switch (id) {
case AIA_OCSP_OID: case AIA_OCSP_OID:
oid = extAuthInfoOcspOid; oid = extAuthInfoOcspOid;
@@ -1040,7 +1040,7 @@ static const byte* OidFromId(word32 id, word32 type, word32* oidSz)
} }
break; break;
case certPolicyType: case oidCertPolicyType:
switch (id) { switch (id) {
case CP_ANY_OID: case CP_ANY_OID:
oid = extCertPolicyAnyOid; oid = extCertPolicyAnyOid;
@@ -1049,7 +1049,7 @@ static const byte* OidFromId(word32 id, word32 type, word32* oidSz)
} }
break; break;
case certAltNameType: case oidCertAltNameType:
switch (id) { switch (id) {
case HW_NAME_OID: case HW_NAME_OID:
oid = extAltNamesHwNameOid; oid = extAltNamesHwNameOid;
@@ -1058,7 +1058,7 @@ static const byte* OidFromId(word32 id, word32 type, word32* oidSz)
} }
break; break;
case certKeyUseType: case oidCertKeyUseType:
switch (id) { switch (id) {
case EKU_ANY_OID: case EKU_ANY_OID:
oid = extExtKeyUsageAnyOid; oid = extExtKeyUsageAnyOid;
@@ -1078,7 +1078,7 @@ static const byte* OidFromId(word32 id, word32 type, word32* oidSz)
break; break;
} }
case kdfType: case oidKdfType:
switch (id) { switch (id) {
case PBKDF2_OID: case PBKDF2_OID:
oid = pbkdf2Oid; oid = pbkdf2Oid;
@@ -1087,7 +1087,7 @@ static const byte* OidFromId(word32 id, word32 type, word32* oidSz)
} }
break; break;
case ignoreType: case oidIgnoreType:
default: default:
break; break;
} }
@@ -1138,7 +1138,7 @@ WOLFSSL_LOCAL int GetObjectId(const byte* input, word32* inOutIdx, word32* oid,
const byte* checkOid = NULL; const byte* checkOid = NULL;
word32 checkOidSz; word32 checkOidSz;
if (oidType != ignoreType) { if (oidType != oidIgnoreType) {
checkOid = OidFromId(*oid, oidType, &checkOidSz); checkOid = OidFromId(*oid, oidType, &checkOidSz);
if (checkOid != NULL && if (checkOid != NULL &&
@@ -1317,7 +1317,7 @@ int ToTraditional(byte* input, word32 sz)
if (GetMyVersion(input, &inOutIdx, &version) < 0) if (GetMyVersion(input, &inOutIdx, &version) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
if (GetAlgoId(input, &inOutIdx, &oid, sigType, sz) < 0) if (GetAlgoId(input, &inOutIdx, &oid, oidSigType, sz) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
if (input[inOutIdx] == ASN_OBJECT_ID) { if (input[inOutIdx] == ASN_OBJECT_ID) {
@@ -1594,7 +1594,7 @@ int ToTraditionalEnc(byte* input, word32 sz,const char* password,int passwordSz)
if (GetSequence(input, &inOutIdx, &length, sz) < 0) if (GetSequence(input, &inOutIdx, &length, sz) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
if (GetAlgoId(input, &inOutIdx, &oid, sigType, sz) < 0) if (GetAlgoId(input, &inOutIdx, &oid, oidSigType, sz) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
first = input[inOutIdx - 2]; /* PKCS version always 2nd to last byte */ first = input[inOutIdx - 2]; /* PKCS version always 2nd to last byte */
@@ -1608,7 +1608,7 @@ int ToTraditionalEnc(byte* input, word32 sz,const char* password,int passwordSz)
if (GetSequence(input, &inOutIdx, &length, sz) < 0) if (GetSequence(input, &inOutIdx, &length, sz) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
if (GetAlgoId(input, &inOutIdx, &oid, kdfType, sz) < 0) if (GetAlgoId(input, &inOutIdx, &oid, oidKdfType, sz) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
if (oid != PBKDF2_OID) if (oid != PBKDF2_OID)
@@ -1654,7 +1654,7 @@ int ToTraditionalEnc(byte* input, word32 sz,const char* password,int passwordSz)
if (version == PKCS5v2) { if (version == PKCS5v2) {
/* get encryption algo */ /* get encryption algo */
/* JOHN: New type. Need a little more research. */ /* JOHN: New type. Need a little more research. */
if (GetAlgoId(input, &inOutIdx, &oid, blkType, sz) < 0) { if (GetAlgoId(input, &inOutIdx, &oid, oidBlkType, sz) < 0) {
#ifdef WOLFSSL_SMALL_STACK #ifdef WOLFSSL_SMALL_STACK
XFREE(salt, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(salt, NULL, DYNAMIC_TYPE_TMP_BUFFER);
XFREE(cbcIv, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(cbcIv, NULL, DYNAMIC_TYPE_TMP_BUFFER);
@@ -2352,7 +2352,7 @@ static int GetKey(DecodedCert* cert)
return ASN_PARSE_E; return ASN_PARSE_E;
if (GetAlgoId(cert->source, &cert->srcIdx, if (GetAlgoId(cert->source, &cert->srcIdx,
&cert->keyOID, keyType, cert->maxIdx) < 0) &cert->keyOID, oidKeyType, cert->maxIdx) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
switch (cert->keyOID) { switch (cert->keyOID) {
@@ -2443,7 +2443,7 @@ static int GetKey(DecodedCert* cert)
byte b; byte b;
if (GetObjectId(cert->source, &cert->srcIdx, if (GetObjectId(cert->source, &cert->srcIdx,
&cert->pkCurveOID, curveType, cert->maxIdx) < 0) &cert->pkCurveOID, oidCurveType, cert->maxIdx) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
if (CheckCurve(cert->pkCurveOID) < 0) if (CheckCurve(cert->pkCurveOID) < 0)
@@ -3146,7 +3146,7 @@ int DecodeToKey(DecodedCert* cert, int verify)
WOLFSSL_MSG("Got Cert Header"); WOLFSSL_MSG("Got Cert Header");
if ( (ret = GetAlgoId(cert->source, &cert->srcIdx, &cert->signatureOID, if ( (ret = GetAlgoId(cert->source, &cert->srcIdx, &cert->signatureOID,
sigType, cert->maxIdx)) < 0) oidSigType, cert->maxIdx)) < 0)
return ret; return ret;
WOLFSSL_MSG("Got Algo ID"); WOLFSSL_MSG("Got Algo ID");
@@ -3377,8 +3377,8 @@ WOLFSSL_LOCAL word32 SetAlgoID(int algoOID, byte* output, int type, int curveSz)
byte ID_Length[MAX_LENGTH_SZ]; byte ID_Length[MAX_LENGTH_SZ];
byte seqArray[MAX_SEQ_SZ + 1]; /* add object_id to end */ byte seqArray[MAX_SEQ_SZ + 1]; /* add object_id to end */
tagSz = (type == hashType || type == sigType || tagSz = (type == oidHashType || type == oidSigType ||
(type == keyType && algoOID == RSAk)) ? 2 : 0; (type == oidKeyType && algoOID == RSAk)) ? 2 : 0;
algoName = OidFromId(algoOID, type, &algoSz); algoName = OidFromId(algoOID, type, &algoSz);
@@ -3414,7 +3414,7 @@ word32 wc_EncodeSignature(byte* out, const byte* digest, word32 digSz,
word32 encDigSz, algoSz, seqSz; word32 encDigSz, algoSz, seqSz;
encDigSz = SetDigest(digest, digSz, digArray); encDigSz = SetDigest(digest, digSz, digArray);
algoSz = SetAlgoID(hashOID, algoArray, hashType, 0); algoSz = SetAlgoID(hashOID, algoArray, oidHashType, 0);
seqSz = SetSequence(encDigSz + algoSz, seqArray); seqSz = SetSequence(encDigSz + algoSz, seqArray);
XMEMCPY(out, seqArray, seqSz); XMEMCPY(out, seqArray, seqSz);
@@ -3986,7 +3986,7 @@ static int DecodeAltNames(byte* input, int sz, DecodedCert* cert)
/* Consume the rest of this sequence. */ /* Consume the rest of this sequence. */
length -= (strLen + idx - lenStartIdx); length -= (strLen + idx - lenStartIdx);
if (GetObjectId(input, &idx, &oid, certAltNameType, sz) < 0) { if (GetObjectId(input, &idx, &oid, oidCertAltNameType, sz) < 0) {
WOLFSSL_MSG("\tbad OID"); WOLFSSL_MSG("\tbad OID");
return ASN_PARSE_E; return ASN_PARSE_E;
} }
@@ -4237,7 +4237,7 @@ static int DecodeAuthInfo(byte* input, int sz, DecodedCert* cert)
return ASN_PARSE_E; return ASN_PARSE_E;
oid = 0; oid = 0;
if (GetObjectId(input, &idx, &oid, certAuthInfoType, sz) < 0) if (GetObjectId(input, &idx, &oid, oidCertAuthInfoType, sz) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
/* Only supporting URIs right now. */ /* Only supporting URIs right now. */
@@ -4383,7 +4383,7 @@ static int DecodeExtKeyUsage(byte* input, int sz, DecodedCert* cert)
#endif #endif
while (idx < (word32)sz) { while (idx < (word32)sz) {
if (GetObjectId(input, &idx, &oid, certKeyUseType, sz) < 0) if (GetObjectId(input, &idx, &oid, oidCertKeyUseType, sz) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
switch (oid) { switch (oid) {
@@ -4718,7 +4718,7 @@ static int DecodeCertExtensions(DecodedCert* cert)
} }
oid = 0; oid = 0;
if (GetObjectId(input, &idx, &oid, certExtType, sz) < 0) { if (GetObjectId(input, &idx, &oid, oidCertExtType, sz) < 0) {
WOLFSSL_MSG("\tfail: OBJECT ID"); WOLFSSL_MSG("\tfail: OBJECT ID");
return ASN_PARSE_E; return ASN_PARSE_E;
} }
@@ -4970,7 +4970,7 @@ int ParseCertRelative(DecodedCert* cert, int type, int verify, void* cm)
} }
if ((ret = GetAlgoId(cert->source, &cert->srcIdx, &confirmOID, if ((ret = GetAlgoId(cert->source, &cert->srcIdx, &confirmOID,
sigType, cert->maxIdx)) < 0) oidSigType, cert->maxIdx)) < 0)
return ret; return ret;
if ((ret = GetSignature(cert)) < 0) if ((ret = GetSignature(cert)) < 0)
@@ -5522,7 +5522,7 @@ static int SetRsaPublicKey(byte* output, RsaKey* key,
#else #else
byte algo[MAX_ALGO_SZ]; byte algo[MAX_ALGO_SZ];
#endif #endif
algoSz = SetAlgoID(RSAk, algo, keyType, 0); algoSz = SetAlgoID(RSAk, algo, oidKeyType, 0);
lenSz = SetLength(seqSz + nSz + eSz + 1, len); lenSz = SetLength(seqSz + nSz + eSz + 1, len);
len[lenSz++] = 0; /* trailing 0 */ len[lenSz++] = 0; /* trailing 0 */
@@ -5938,7 +5938,7 @@ static int SetEccPublicKey(byte* output, ecc_key* key, int with_header)
return MEMORY_E; return MEMORY_E;
} }
#endif #endif
algoSz = SetAlgoID(ECDSAk, algo, keyType, curveSz); algoSz = SetAlgoID(ECDSAk, algo, oidKeyType, curveSz);
lenSz = SetLength(pubSz + 1, len); lenSz = SetLength(pubSz + 1, len);
len[lenSz++] = 0; /* trailing 0 */ len[lenSz++] = 0; /* trailing 0 */
@@ -6787,7 +6787,7 @@ static int EncodeCert(Cert* cert, DerCert* der, RsaKey* rsaKey, ecc_key* eccKey,
der->serialSz = SetSerial(cert->serial, der->serial); der->serialSz = SetSerial(cert->serial, der->serial);
/* signature algo */ /* signature algo */
der->sigAlgoSz = SetAlgoID(cert->sigType, der->sigAlgo, sigType, 0); der->sigAlgoSz = SetAlgoID(cert->sigType, der->sigAlgo, oidSigType, 0);
if (der->sigAlgoSz == 0) if (der->sigAlgoSz == 0)
return ALGO_ID_E; return ALGO_ID_E;
@@ -7179,7 +7179,7 @@ static int AddSignature(byte* buffer, int bodySz, const byte* sig, int sigSz,
int idx = bodySz, seqSz; int idx = bodySz, seqSz;
/* algo */ /* algo */
idx += SetAlgoID(sigAlgoType, buffer + idx, sigType, 0); idx += SetAlgoID(sigAlgoType, buffer + idx, oidSigType, 0);
/* bit string */ /* bit string */
buffer[idx++] = ASN_BIT_STRING; buffer[idx++] = ASN_BIT_STRING;
/* length */ /* length */
@@ -7986,7 +7986,7 @@ static int SetAltNamesFromCert(Cert* cert, const byte* der, int derSz)
decoded->srcIdx = startIdx; decoded->srcIdx = startIdx;
if (GetAlgoId(decoded->source, &decoded->srcIdx, &oid, if (GetAlgoId(decoded->source, &decoded->srcIdx, &oid,
certExtType, decoded->maxIdx) < 0) { oidCertExtType, decoded->maxIdx) < 0) {
ret = ASN_PARSE_E; ret = ASN_PARSE_E;
break; break;
} }
@@ -8745,7 +8745,7 @@ static int DecodeSingleResponse(byte* source,
if (GetSequence(source, &idx, &length, size) < 0) if (GetSequence(source, &idx, &length, size) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
/* Skip the hash algorithm */ /* Skip the hash algorithm */
if (GetAlgoId(source, &idx, &oid, ignoreType, size) < 0) if (GetAlgoId(source, &idx, &oid, oidIgnoreType, size) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
/* Save reference to the hash of CN */ /* Save reference to the hash of CN */
if (source[idx++] != ASN_OCTET_STRING) if (source[idx++] != ASN_OCTET_STRING)
@@ -8867,7 +8867,7 @@ static int DecodeOcspRespExtensions(byte* source,
} }
oid = 0; oid = 0;
if (GetObjectId(source, &idx, &oid, ocspType, sz) < 0) { if (GetObjectId(source, &idx, &oid, oidOcspType, sz) < 0) {
WOLFSSL_MSG("\tfail: OBJECT ID"); WOLFSSL_MSG("\tfail: OBJECT ID");
return ASN_PARSE_E; return ASN_PARSE_E;
} }
@@ -9020,7 +9020,7 @@ static int DecodeBasicOcspResponse(byte* source, word32* ioIndex,
return ASN_PARSE_E; return ASN_PARSE_E;
/* Get the signature algorithm */ /* Get the signature algorithm */
if (GetAlgoId(source, &idx, &resp->sigOID, sigType, size) < 0) if (GetAlgoId(source, &idx, &resp->sigOID, oidSigType, size) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
/* Obtain pointer to the start of the signature, and save the size */ /* Obtain pointer to the start of the signature, and save the size */
@@ -9126,7 +9126,7 @@ int OcspResponseDecode(OcspResponse* resp, void* cm)
return ASN_PARSE_E; return ASN_PARSE_E;
/* Check ObjectID for the resposeBytes */ /* Check ObjectID for the resposeBytes */
if (GetObjectId(source, &idx, &oid, ocspType, size) < 0) if (GetObjectId(source, &idx, &oid, oidOcspType, size) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
if (oid != OCSP_BASIC_OID) if (oid != OCSP_BASIC_OID)
return ASN_PARSE_E; return ASN_PARSE_E;
@@ -9212,9 +9212,9 @@ int EncodeOcspRequest(OcspRequest* req, byte* output, word32 size)
WOLFSSL_ENTER("EncodeOcspRequest"); WOLFSSL_ENTER("EncodeOcspRequest");
#ifdef NO_SHA #ifdef NO_SHA
algoSz = SetAlgoID(SHA256h, algoArray, hashType, 0); algoSz = SetAlgoID(SHA256h, algoArray, oidHashType, 0);
#else #else
algoSz = SetAlgoID(SHAh, algoArray, hashType, 0); algoSz = SetAlgoID(SHAh, algoArray, oidHashType, 0);
#endif #endif
issuerSz = SetDigest(req->issuerHash, KEYID_SIZE, issuerArray); issuerSz = SetDigest(req->issuerHash, KEYID_SIZE, issuerArray);
@@ -9604,7 +9604,7 @@ int ParseCRL(DecodedCRL* dcrl, const byte* buff, word32 sz, void* cm)
return ASN_PARSE_E; return ASN_PARSE_E;
} }
if (GetAlgoId(buff, &idx, &oid, ignoreType, sz) < 0) if (GetAlgoId(buff, &idx, &oid, oidIgnoreType, sz) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
if (GetNameHash(buff, &idx, dcrl->issuerHash, sz) < 0) if (GetNameHash(buff, &idx, dcrl->issuerHash, sz) < 0)
@@ -9648,7 +9648,7 @@ int ParseCRL(DecodedCRL* dcrl, const byte* buff, word32 sz, void* cm)
if (idx != dcrl->sigIndex) if (idx != dcrl->sigIndex)
idx = dcrl->sigIndex; /* skip extensions */ idx = dcrl->sigIndex; /* skip extensions */
if (GetAlgoId(buff, &idx, &dcrl->signatureOID, sigType, sz) < 0) if (GetAlgoId(buff, &idx, &dcrl->signatureOID, oidSigType, sz) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
if (GetCRL_Signature(buff, &idx, dcrl, sz) < 0) if (GetCRL_Signature(buff, &idx, dcrl, sz) < 0)

View File

@@ -373,6 +373,9 @@ const char* wc_GetErrorString(int error)
case HASH_TYPE_E: case HASH_TYPE_E:
return "Hash type not enabled/available"; return "Hash type not enabled/available";
case WC_PENDING_E:
return "wolfCrypt Operation Pending (would block / eagain) error";
default: default:
return "unknown error number"; return "unknown error number";

View File

@@ -44,6 +44,7 @@ int wc_HashGetOID(enum wc_HashType hash_type)
oid = MD2h; oid = MD2h;
#endif #endif
break; break;
case WC_HASH_TYPE_MD5_SHA:
case WC_HASH_TYPE_MD5: case WC_HASH_TYPE_MD5:
#ifndef NO_MD5 #ifndef NO_MD5
oid = MD5h; oid = MD5h;
@@ -110,6 +111,11 @@ int wc_HashGetDigestSize(enum wc_HashType hash_type)
case WC_HASH_TYPE_SHA512: case WC_HASH_TYPE_SHA512:
#ifdef WOLFSSL_SHA512 #ifdef WOLFSSL_SHA512
dig_size = SHA512_DIGEST_SIZE; dig_size = SHA512_DIGEST_SIZE;
#endif
break;
case WC_HASH_TYPE_MD5_SHA:
#if !defined(NO_MD5) && !defined(NO_SHA)
dig_size = MD5_DIGEST_SIZE + SHA_DIGEST_SIZE;
#endif #endif
break; break;
@@ -168,6 +174,14 @@ int wc_Hash(enum wc_HashType hash_type, const byte* data,
case WC_HASH_TYPE_SHA512: case WC_HASH_TYPE_SHA512:
#ifdef WOLFSSL_SHA512 #ifdef WOLFSSL_SHA512
ret = wc_Sha512Hash(data, data_len, hash); ret = wc_Sha512Hash(data, data_len, hash);
#endif
break;
case WC_HASH_TYPE_MD5_SHA:
#if !defined(NO_MD5) && !defined(NO_SHA)
ret = wc_Md5Hash(data, data_len, hash);
if (ret == 0) {
ret = wc_ShaHash(data, data_len, &hash[MD5_DIGEST_SIZE]);
}
#endif #endif
break; break;

View File

@@ -130,7 +130,7 @@ int wc_GetContentType(const byte* input, word32* inOutIdx, word32* oid,
word32 maxIdx) word32 maxIdx)
{ {
WOLFSSL_ENTER("wc_GetContentType"); WOLFSSL_ENTER("wc_GetContentType");
if (GetObjectId(input, inOutIdx, oid, ignoreType, maxIdx) < 0) if (GetObjectId(input, inOutIdx, oid, oidIgnoreType, maxIdx) < 0)
return ASN_PARSE_E; return ASN_PARSE_E;
return 0; return 0;
@@ -396,10 +396,10 @@ int wc_PKCS7_EncodeSignedData(PKCS7* pkcs7, byte* output, word32 outputSz)
esd->signerVersionSz = SetMyVersion(1, esd->signerVersion, 0); esd->signerVersionSz = SetMyVersion(1, esd->signerVersion, 0);
signerInfoSz += esd->signerVersionSz; signerInfoSz += esd->signerVersionSz;
esd->signerDigAlgoIdSz = SetAlgoID(pkcs7->hashOID, esd->signerDigAlgoId, esd->signerDigAlgoIdSz = SetAlgoID(pkcs7->hashOID, esd->signerDigAlgoId,
hashType, 0); oidHashType, 0);
signerInfoSz += esd->signerDigAlgoIdSz; signerInfoSz += esd->signerDigAlgoIdSz;
esd->digEncAlgoIdSz = SetAlgoID(pkcs7->encryptOID, esd->digEncAlgoId, esd->digEncAlgoIdSz = SetAlgoID(pkcs7->encryptOID, esd->digEncAlgoId,
keyType, 0); oidKeyType, 0);
signerInfoSz += esd->digEncAlgoIdSz; signerInfoSz += esd->digEncAlgoIdSz;
if (pkcs7->signedAttribsSz != 0) { if (pkcs7->signedAttribsSz != 0) {
@@ -576,7 +576,7 @@ int wc_PKCS7_EncodeSignedData(PKCS7* pkcs7, byte* output, word32 outputSz)
esd->certsSet); esd->certsSet);
esd->singleDigAlgoIdSz = SetAlgoID(pkcs7->hashOID, esd->singleDigAlgoId, esd->singleDigAlgoIdSz = SetAlgoID(pkcs7->hashOID, esd->singleDigAlgoId,
hashType, 0); oidHashType, 0);
esd->digAlgoIdSetSz = SetSet(esd->singleDigAlgoIdSz, esd->digAlgoIdSet); esd->digAlgoIdSetSz = SetSet(esd->singleDigAlgoIdSz, esd->digAlgoIdSet);
@@ -1033,7 +1033,7 @@ WOLFSSL_LOCAL int wc_CreateRecipientInfo(const byte* cert, word32 certSz,
return ALGO_ID_E; return ALGO_ID_E;
} }
keyEncAlgSz = SetAlgoID(keyEncAlgo, keyAlgArray, keyType, 0); keyEncAlgSz = SetAlgoID(keyEncAlgo, keyAlgArray, oidKeyType, 0);
if (keyEncAlgSz == 0) { if (keyEncAlgSz == 0) {
FreeDecodedCert(decoded); FreeDecodedCert(decoded);
#ifdef WOLFSSL_SMALL_STACK #ifdef WOLFSSL_SMALL_STACK
@@ -1319,7 +1319,7 @@ int wc_PKCS7_EncodeEnvelopedData(PKCS7* pkcs7, byte* output, word32 outputSz)
/* build up our ContentEncryptionAlgorithmIdentifier sequence, /* build up our ContentEncryptionAlgorithmIdentifier sequence,
* adding (ivOctetStringSz + DES_BLOCK_SIZE) for IV OCTET STRING */ * adding (ivOctetStringSz + DES_BLOCK_SIZE) for IV OCTET STRING */
contentEncAlgoSz = SetAlgoID(pkcs7->encryptOID, contentEncAlgo, contentEncAlgoSz = SetAlgoID(pkcs7->encryptOID, contentEncAlgo,
blkType, ivOctetStringSz + DES_BLOCK_SIZE); oidBlkType, ivOctetStringSz + DES_BLOCK_SIZE);
if (contentEncAlgoSz == 0) { if (contentEncAlgoSz == 0) {
XFREE(encryptedContent, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(encryptedContent, NULL, DYNAMIC_TYPE_TMP_BUFFER);
@@ -1592,7 +1592,7 @@ WOLFSSL_API int wc_PKCS7_DecodeEnvelopedData(PKCS7* pkcs7, byte* pkiMsg,
XFREE(serialNum, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(serialNum, NULL, DYNAMIC_TYPE_TMP_BUFFER);
#endif #endif
if (GetAlgoId(pkiMsg, &idx, &encOID, keyType, pkiMsgSz) < 0) { if (GetAlgoId(pkiMsg, &idx, &encOID, oidKeyType, pkiMsgSz) < 0) {
#ifdef WOLFSSL_SMALL_STACK #ifdef WOLFSSL_SMALL_STACK
XFREE(encryptedKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(encryptedKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
#endif #endif
@@ -1653,7 +1653,7 @@ WOLFSSL_API int wc_PKCS7_DecodeEnvelopedData(PKCS7* pkcs7, byte* pkiMsg,
return ASN_PARSE_E; return ASN_PARSE_E;
} }
if (GetAlgoId(pkiMsg, &idx, &encOID, blkType, pkiMsgSz) < 0) { if (GetAlgoId(pkiMsg, &idx, &encOID, oidBlkType, pkiMsgSz) < 0) {
#ifdef WOLFSSL_SMALL_STACK #ifdef WOLFSSL_SMALL_STACK
XFREE(encryptedKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(encryptedKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
#endif #endif

View File

@@ -141,6 +141,7 @@ enum wolfSSL_ErrorCodes {
UNKNOWN_ALPN_PROTOCOL_NAME_E = -405, /* Unrecognized protocol name Error*/ UNKNOWN_ALPN_PROTOCOL_NAME_E = -405, /* Unrecognized protocol name Error*/
BAD_CERTIFICATE_STATUS_ERROR = -406, /* Bad certificate status message */ BAD_CERTIFICATE_STATUS_ERROR = -406, /* Bad certificate status message */
OCSP_INVALID_STATUS = -407, /* Invalid OCSP Status */ OCSP_INVALID_STATUS = -407, /* Invalid OCSP Status */
ASYNC_NOT_PENDING = -408, /* Async operation not pending */
/* add strings to wolfSSL_ERR_reason_error_string in internal.c !!!!! */ /* add strings to wolfSSL_ERR_reason_error_string in internal.c !!!!! */

View File

@@ -153,6 +153,10 @@
#include "zlib.h" #include "zlib.h"
#endif #endif
#ifdef WOLFSSL_ASYNC_CRYPT
#include <wolfssl/async.h>
#endif
#ifdef _MSC_VER #ifdef _MSC_VER
/* 4996 warning to use MS extensions e.g., strcpy_s instead of strncpy */ /* 4996 warning to use MS extensions e.g., strcpy_s instead of strncpy */
#pragma warning(disable: 4996) #pragma warning(disable: 4996)
@@ -1818,6 +1822,22 @@ WOLFSSL_LOCAL int TLSX_ValidateQSHScheme(TLSX** extensions, word16 name);
#endif /* HAVE_QSH */ #endif /* HAVE_QSH */
#ifdef HAVE_WOLF_EVENT
typedef struct {
WOLF_EVENT* head; /* head of queue */
WOLF_EVENT* tail; /* tail of queue */
#ifndef SINGLE_THREADED
wolfSSL_Mutex lock; /* queue lock */
#endif
} WOLF_EVENT_QUEUE;
WOLFSSL_LOCAL int wolfSSL_EventInit(WOLFSSL* ssl, WOLF_EVENT_TYPE type);
WOLFSSL_LOCAL int wolfSSL_CTX_EventPush(WOLFSSL_CTX* ctx, WOLF_EVENT* event);
#endif /* HAVE_WOLF_EVENT */
/* wolfSSL context type */ /* wolfSSL context type */
struct WOLFSSL_CTX { struct WOLFSSL_CTX {
WOLFSSL_METHOD* method; WOLFSSL_METHOD* method;
@@ -1924,6 +1944,9 @@ struct WOLFSSL_CTX {
CallbackRsaDec RsaDecCb; /* User Rsa Private Decrypt handler */ CallbackRsaDec RsaDecCb; /* User Rsa Private Decrypt handler */
#endif /* NO_RSA */ #endif /* NO_RSA */
#endif /* HAVE_PK_CALLBACKS */ #endif /* HAVE_PK_CALLBACKS */
#ifdef HAVE_WOLF_EVENT
WOLF_EVENT_QUEUE event_queue;
#endif /* HAVE_WOLF_EVENT */
}; };
@@ -2188,12 +2211,22 @@ enum AcceptState {
ACCEPT_THIRD_REPLY_DONE ACCEPT_THIRD_REPLY_DONE
}; };
/* sub-states for send/do key share (key exchange) */
enum KeyShareState {
KEYSHARE_BEGIN = 0,
KEYSHARE_BUILD,
KEYSHARE_VERIFY,
KEYSHARE_FINALIZE,
KEYSHARE_END
};
/* buffers for struct WOLFSSL */
typedef struct Buffers { typedef struct Buffers {
bufferStatic inputBuffer; bufferStatic inputBuffer;
bufferStatic outputBuffer; bufferStatic outputBuffer;
buffer domainName; /* for client check */ buffer domainName; /* for client check */
buffer clearOutputBuffer; buffer clearOutputBuffer;
buffer sig; /* signature data */
int prevSent; /* previous plain text bytes sent int prevSent; /* previous plain text bytes sent
when got WANT_WRITE */ when got WANT_WRITE */
int plainSz; /* plain text bytes in buffer to send int plainSz; /* plain text bytes in buffer to send
@@ -2301,6 +2334,8 @@ typedef struct Options {
byte minDowngrade; /* minimum downgrade version */ byte minDowngrade; /* minimum downgrade version */
byte connectState; /* nonblocking resume */ byte connectState; /* nonblocking resume */
byte acceptState; /* nonblocking resume */ byte acceptState; /* nonblocking resume */
byte keyShareState; /* sub-state for key share (key exchange).
See enum KeyShareState. */
#ifndef NO_DH #ifndef NO_DH
word16 minDhKeySz; /* minimum DH key size */ word16 minDhKeySz; /* minimum DH key size */
word16 dhKeySz; /* actual DH key size */ word16 dhKeySz; /* actual DH key size */
@@ -2535,6 +2570,12 @@ struct WOLFSSL {
HandShakeDoneCb hsDoneCb; /* notify user handshake done */ HandShakeDoneCb hsDoneCb; /* notify user handshake done */
void* hsDoneCtx; /* user handshake cb context */ void* hsDoneCtx; /* user handshake cb context */
#endif #endif
#ifdef WOLFSSL_ASYNC_CRYPT
AsyncCrypt async;
#endif
void* sigKey; /* RsaKey or ecc_key allocated from heap */
word32 sigType; /* Type of sigKey */
word32 sigLen; /* Actual signature length */
WOLFSSL_CIPHER cipher; WOLFSSL_CIPHER cipher;
hmacfp hmac; hmacfp hmac;
Ciphers encrypt; Ciphers encrypt;
@@ -2683,6 +2724,12 @@ struct WOLFSSL {
#ifdef WOLFSSL_JNI #ifdef WOLFSSL_JNI
void* jObjectRef; /* reference to WolfSSLSession in JNI wrapper */ void* jObjectRef; /* reference to WolfSSLSession in JNI wrapper */
#endif /* WOLFSSL_JNI */ #endif /* WOLFSSL_JNI */
#ifdef HAVE_WOLF_EVENT
WOLF_EVENT event;
#endif /* HAVE_WOLF_EVENT */
#ifdef WOLFSSL_ASYNC_CRYPT_TEST
AsyncCryptTests asyncCryptTest;
#endif /* WOLFSSL_ASYNC_CRYPT_TEST */
}; };
@@ -2834,10 +2881,29 @@ WOLFSSL_LOCAL void ShrinkOutputBuffer(WOLFSSL* ssl);
WOLFSSL_LOCAL int VerifyClientSuite(WOLFSSL* ssl); WOLFSSL_LOCAL int VerifyClientSuite(WOLFSSL* ssl);
#ifndef NO_CERTS #ifndef NO_CERTS
#ifndef NO_RSA #ifndef NO_RSA
WOLFSSL_LOCAL int VerifyRsaSign(const byte* sig, word32 sigSz, WOLFSSL_LOCAL int VerifyRsaSign(WOLFSSL* ssl,
const byte* sig, word32 sigSz,
const byte* plain, word32 plainSz, const byte* plain, word32 plainSz,
RsaKey* key); RsaKey* key);
#endif WOLFSSL_LOCAL int RsaSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
word32* outSz, RsaKey* key, const byte* keyBuf, word32 keySz, void* ctx);
WOLFSSL_LOCAL int RsaVerify(WOLFSSL* ssl, byte* in, word32 inSz,
byte** out, RsaKey* key, const byte* keyBuf, word32 keySz, void* ctx);
WOLFSSL_LOCAL int RsaDec(WOLFSSL* ssl, byte* in, word32 inSz, byte** out,
word32* outSz, RsaKey* key, const byte* keyBuf, word32 keySz, void* ctx);
#endif /* !NO_RSA */
#ifdef HAVE_ECC
WOLFSSL_LOCAL int EccSign(WOLFSSL* ssl, const byte* in, word32 inSz,
byte* out, word32* outSz, ecc_key* key, byte* keyBuf, word32 keySz,
void* ctx);
WOLFSSL_LOCAL int EccVerify(WOLFSSL* ssl, const byte* in, word32 inSz,
byte* out, word32 outSz, ecc_key* key, byte* keyBuf, word32 keySz,
void* ctx);
WOLFSSL_LOCAL int EccSharedSecret(WOLFSSL* ssl, ecc_key* priv_key,
ecc_key* pub_key, byte* out, word32* outSz);
#endif /* HAVE_ECC */
#ifdef WOLFSSL_TRUST_PEER_CERT #ifdef WOLFSSL_TRUST_PEER_CERT
/* options for searching hash table for a matching trusted peer cert */ /* options for searching hash table for a matching trusted peer cert */
@@ -2849,11 +2915,12 @@ WOLFSSL_LOCAL int VerifyClientSuite(WOLFSSL* ssl);
WOLFSSL_LOCAL int MatchTrustedPeer(TrustedPeerCert* tp, WOLFSSL_LOCAL int MatchTrustedPeer(TrustedPeerCert* tp,
DecodedCert* cert); DecodedCert* cert);
#endif #endif
WOLFSSL_LOCAL Signer* GetCA(void* cm, byte* hash); WOLFSSL_LOCAL Signer* GetCA(void* cm, byte* hash);
#ifndef NO_SKID #ifndef NO_SKID
WOLFSSL_LOCAL Signer* GetCAByName(void* cm, byte* hash); WOLFSSL_LOCAL Signer* GetCAByName(void* cm, byte* hash);
#endif #endif
#endif #endif /* !NO_CERTS */
WOLFSSL_LOCAL int BuildTlsFinished(WOLFSSL* ssl, Hashes* hashes, WOLFSSL_LOCAL int BuildTlsFinished(WOLFSSL* ssl, Hashes* hashes,
const byte* sender); const byte* sender);
WOLFSSL_LOCAL void FreeArrays(WOLFSSL* ssl, int keep); WOLFSSL_LOCAL void FreeArrays(WOLFSSL* ssl, int keep);
@@ -2928,6 +2995,25 @@ enum encrypt_side {
WOLFSSL_LOCAL int SetKeysSide(WOLFSSL*, enum encrypt_side); WOLFSSL_LOCAL int SetKeysSide(WOLFSSL*, enum encrypt_side);
#ifndef NO_DH
WOLFSSL_LOCAL int DhGenKeyPair(WOLFSSL* ssl,
byte* p, word32 pSz,
byte* g, word32 gSz,
byte* priv, word32* privSz,
byte* pub, word32* pubSz);
WOLFSSL_LOCAL int DhAgree(WOLFSSL* ssl,
byte* p, word32 pSz,
byte* g, word32 gSz,
byte* priv, word32* privSz,
byte* pub, word32* pubSz,
const byte* otherPub, word32 otherPubSz,
byte* agree, word32* agreeSz);
#endif
#ifdef HAVE_ECC
WOLFSSL_LOCAL int EccMakeTempKey(WOLFSSL* ssl);
#endif
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
#endif #endif

View File

@@ -1780,6 +1780,39 @@ WOLFSSL_API int wolfSSL_set_jobject(WOLFSSL* ssl, void* objPtr);
WOLFSSL_API void* wolfSSL_get_jobject(WOLFSSL* ssl); WOLFSSL_API void* wolfSSL_get_jobject(WOLFSSL* ssl);
#endif /* WOLFSSL_JNI */ #endif /* WOLFSSL_JNI */
#ifdef HAVE_WOLF_EVENT
typedef enum WOLF_EVENT_TYPE {
WOLF_EVENT_TYPE_NONE,
#ifdef WOLFSSL_ASYNC_CRYPT
WOLF_EVENT_TYPE_ASYNC_ACCEPT,
WOLF_EVENT_TYPE_ASYNC_CONNECT,
WOLF_EVENT_TYPE_ASYNC_READ,
WOLF_EVENT_TYPE_ASYNC_WRITE,
WOLF_EVENT_TYPE_ASYNC_FIRST = WOLF_EVENT_TYPE_ASYNC_ACCEPT,
WOLF_EVENT_TYPE_ASYNC_LAST = WOLF_EVENT_TYPE_ASYNC_WRITE,
#endif
} WOLF_EVENT_TYPE;
typedef struct WOLF_EVENT WOLF_EVENT;
struct WOLF_EVENT {
WOLF_EVENT* next; /* To support event linked list */
WOLFSSL* ssl; /* Reference back to SSL object */
int ret; /* Async return code */
WOLF_EVENT_TYPE type;
unsigned short pending:1;
unsigned short done:1;
/* Future event flags can go here */
};
enum WOLF_POLL_FLAGS {
WOLF_POLL_FLAG_CHECK_HW = 0x01,
};
WOLFSSL_API int wolfssl_CTX_poll_peek(WOLFSSL_CTX* ctx, int* eventCount);
WOLFSSL_API int wolfSSL_CTX_poll(WOLFSSL_CTX* ctx, WOLF_EVENT* events, int maxEvents,
unsigned char flags, int* eventCount);
#endif /* HAVE_WOLF_EVENT */
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
#endif #endif

View File

@@ -1907,4 +1907,24 @@ static INLINE const char* mymktemp(char *tempfn, int len, int num)
#endif /* HAVE_SESSION_TICKET && CHACHA20 && POLY1305 */ #endif /* HAVE_SESSION_TICKET && CHACHA20 && POLY1305 */
#ifdef WOLFSSL_ASYNC_CRYPT
static INLINE int AsyncCryptPoll(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
{
int ret, eventCount = 0;
WOLF_EVENT events[1];
printf("Connect/Accept got WC_PENDING_E\n");
ret = wolfSSL_CTX_poll(ctx, events, sizeof(events)/sizeof(WOLF_EVENT), WOLF_POLL_FLAG_CHECK_HW, &eventCount);
if (ret == 0 && eventCount > 0) {
/* Check the SSL context in the event matches ours */
if (events[0].ssl == ssl) {
ret = 1; /* Success */
}
}
return ret;
}
#endif
#endif /* wolfSSL_TEST_H */ #endif /* wolfSSL_TEST_H */

View File

@@ -199,19 +199,19 @@ enum Misc_ASN {
enum Oid_Types { enum Oid_Types {
hashType = 0, oidHashType = 0,
sigType = 1, oidSigType = 1,
keyType = 2, oidKeyType = 2,
curveType = 3, oidCurveType = 3,
blkType = 4, oidBlkType = 4,
ocspType = 5, oidOcspType = 5,
certExtType = 6, oidCertExtType = 6,
certAuthInfoType = 7, oidCertAuthInfoType = 7,
certPolicyType = 8, oidCertPolicyType = 8,
certAltNameType = 9, oidCertAltNameType = 9,
certKeyUseType = 10, oidCertKeyUseType = 10,
kdfType = 11, oidKdfType = 11,
ignoreType oidIgnoreType
}; };

View File

@@ -166,6 +166,7 @@ enum {
BAD_COND_E = -230, /* Bad condition variable operation */ BAD_COND_E = -230, /* Bad condition variable operation */
SIG_TYPE_E = -231, /* Signature Type not enabled/available */ SIG_TYPE_E = -231, /* Signature Type not enabled/available */
HASH_TYPE_E = -232, /* Hash Type not enabled/available */ HASH_TYPE_E = -232, /* Hash Type not enabled/available */
WC_PENDING_E = -233, /* wolfCrypt operation pending (would block) */
MIN_CODE_E = -300 /* errors -101 - -299 */ MIN_CODE_E = -300 /* errors -101 - -299 */

View File

@@ -38,6 +38,7 @@ enum wc_HashType {
WC_HASH_TYPE_SHA256 = 5, WC_HASH_TYPE_SHA256 = 5,
WC_HASH_TYPE_SHA384 = 6, WC_HASH_TYPE_SHA384 = 6,
WC_HASH_TYPE_SHA512 = 7, WC_HASH_TYPE_SHA512 = 7,
WC_HASH_TYPE_MD5_SHA = 8,
}; };
/* Find largest possible digest size /* Find largest possible digest size

View File

@@ -135,6 +135,9 @@
/* Uncomment next line if building for ARDUINO */ /* Uncomment next line if building for ARDUINO */
/* #define WOLFSSL_ARDUINO */ /* #define WOLFSSL_ARDUINO */
/* Uncomment next line to enable asynchronous crypto WC_PENDING_E */
/* #define WOLFSSL_ASYNC_CRYPT */
#include <wolfssl/wolfcrypt/visibility.h> #include <wolfssl/wolfcrypt/visibility.h>
#ifdef WOLFSSL_USER_SETTINGS #ifdef WOLFSSL_USER_SETTINGS
@@ -1147,6 +1150,18 @@ static char *fgets(char *buff, int sz, FILE *fp)
#undef NO_DH #undef NO_DH
#endif #endif
/* Asynchronous Crypto */
#ifdef WOLFSSL_ASYNC_CRYPT
/* Make sure wolf events are enabled */
#undef HAVE_WOLF_EVENT
#define HAVE_WOLF_EVENT
#else
#ifdef WOLFSSL_ASYNC_CRYPT_TEST
#error Must have WOLFSSL_ASYNC_CRYPT enabled with WOLFSSL_ASYNC_CRYPT_TEST
#endif
#endif /* WOLFSSL_ASYNC_CRYPT */
/* Place any other flags or defines here */ /* Place any other flags or defines here */