From b63f43a2af5c7d2a9bd83a42cd15248454a53c01 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Tue, 29 Dec 2020 22:42:31 +0100 Subject: [PATCH 01/78] Nginx 1.19.6 - Implement X509_pubkey_digest - Initialize entire WOLFSSL_X509_NAME struct to zero - Set raw and rawLen when copying WOLFSSL_X509_NAME --- src/internal.c | 8 +------- src/ssl.c | 34 ++++++++++++++++++++++++++++++++++ wolfssl/openssl/ssl.h | 2 ++ wolfssl/ssl.h | 2 ++ 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/internal.c b/src/internal.c index e48085de1f..2d8ad56875 100644 --- a/src/internal.c +++ b/src/internal.c @@ -3393,15 +3393,9 @@ void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag, void* heap) (void)heap; if (name != NULL) { + XMEMSET(name, 0, sizeof(WOLFSSL_X509_NAME)); name->name = name->staticName; - name->dynamicName = 0; - name->sz = 0; name->heap = heap; -#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - XMEMSET(name->entry, 0, sizeof(name->entry)); - name->x509 = NULL; - name->entrySz = 0; -#endif /* OPENSSL_EXTRA */ } } diff --git a/src/ssl.c b/src/ssl.c index 14a160dc22..ef1f645da8 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -10402,6 +10402,29 @@ int wolfSSL_X509_digest(const WOLFSSL_X509* x509, const WOLFSSL_EVP_MD* digest, } #endif +int wolfSSL_X509_pubkey_digest(const WOLFSSL_X509 *x509, + const WOLFSSL_EVP_MD *digest, unsigned char* buf, unsigned int* len) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_X509_pubkey_digest"); + + if (x509 == NULL || digest == NULL) { + WOLFSSL_MSG("Null argument found"); + return WOLFSSL_FAILURE; + } + + if (x509->pubKey.buffer == NULL || x509->pubKey.length == 0) { + WOLFSSL_MSG("No DER public key stored in X509"); + return WOLFSSL_FAILURE; + } + + ret = wolfSSL_EVP_Digest(x509->pubKey.buffer, x509->pubKey.length, buf, + len, digest, NULL); + WOLFSSL_LEAVE("wolfSSL_X509_pubkey_digest", ret); + return ret; +} + int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey) { WOLFSSL_ENTER("wolfSSL_use_PrivateKey"); @@ -52896,6 +52919,17 @@ int wolfSSL_X509_NAME_copy(WOLFSSL_X509_NAME* from, WOLFSSL_X509_NAME* to) return BAD_FUNC_ARG; } +#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) + if (from->rawLen > 0) { + if (from->rawLen > ASN_NAME_MAX) { + WOLFSSL_MSG("Bad raw size"); + return BAD_FUNC_ARG; + } + XMEMCPY(to->raw, from->raw, from->rawLen); + to->rawLen = from->rawLen; + } +#endif + if (from->dynamicName) { to->name = (char*)XMALLOC(from->sz, to->heap, DYNAMIC_TYPE_SUBJECT_CN); if (to->name == NULL) diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index 52718b7a97..05296b5824 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -409,6 +409,7 @@ typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; #define X509_free wolfSSL_X509_free #define X509_load_certificate_file wolfSSL_X509_load_certificate_file #define X509_digest wolfSSL_X509_digest +#define X509_pubkey_digest wolfSSL_X509_pubkey_digest #define X509_get_ext_count wolfSSL_X509_get_ext_count #define X509_get_ext_d2i wolfSSL_X509_get_ext_d2i #define X509V3_EXT_i2d wolfSSL_X509V3_EXT_i2d @@ -1126,6 +1127,7 @@ wolfSSL_X509_STORE_set_verify_cb((WOLFSSL_X509_STORE *)(s), (WOLFSSL_X509_STORE_ #define SSL3_AD_BAD_CERTIFICATE bad_certificate #define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE +#define SSL_AD_UNRECOGNIZED_NAME unrecognized_name #define ASN1_STRFLGS_ESC_MSB 4 diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index f315b04366..5c412cab5c 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -3477,6 +3477,8 @@ WOLFSSL_API void wolfSSL_X509V3_set_ctx(WOLFSSL_X509V3_CTX* ctx, WOLFSSL_API void wolfSSL_X509V3_set_ctx_nodb(WOLFSSL_X509V3_CTX* ctx); WOLFSSL_API int wolfSSL_X509_digest(const WOLFSSL_X509* x509, const WOLFSSL_EVP_MD* digest, unsigned char* buf, unsigned int* len); +WOLFSSL_API int wolfSSL_X509_pubkey_digest(const WOLFSSL_X509 *x509, + const WOLFSSL_EVP_MD *digest, unsigned char* buf, unsigned int* len); WOLFSSL_API int wolfSSL_use_certificate(WOLFSSL* ssl, WOLFSSL_X509* x509); WOLFSSL_API int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey); WOLFSSL_API int wolfSSL_use_PrivateKey_ASN1(int pri, WOLFSSL* ssl, From 9a1e54cfd50baf486302c1d87fab40f8b1780e11 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Tue, 19 Jan 2021 16:25:00 +0100 Subject: [PATCH 02/78] Nginx 1.19.6 Fixes --- configure.ac | 2 +- src/internal.c | 12 +++++++++--- src/ocsp.c | 4 +++- src/ssl.c | 36 +++++++++++++----------------------- tests/api.c | 4 ++-- wolfssl/internal.h | 2 +- wolfssl/openssl/ssl.h | 3 +++ wolfssl/ssl.h | 2 +- 8 files changed, 33 insertions(+), 32 deletions(-) diff --git a/configure.ac b/configure.ac index dd8a6ac74f..052569e585 100644 --- a/configure.ac +++ b/configure.ac @@ -2530,7 +2530,7 @@ AC_ARG_ENABLE([anon], [ ENABLED_ANON=no ] ) -if test "x$ENABLED_WPAS" = "xyes" +if test "x$ENABLED_WPAS" = "xyes" || test "$ENABLED_NGINX" = "yes" then ENABLED_ANON=yes fi diff --git a/src/internal.c b/src/internal.c index 2d8ad56875..1b8eec9b95 100644 --- a/src/internal.c +++ b/src/internal.c @@ -31113,16 +31113,22 @@ static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ], #ifdef HAVE_SNI int SNI_Callback(WOLFSSL* ssl) { + int ad = 0; + int sniRet = 0; /* Stunnel supports a custom sni callback to switch an SSL's ctx * when SNI is received. Call it now if exists */ if(ssl && ssl->ctx && ssl->ctx->sniRecvCb) { WOLFSSL_MSG("Calling custom sni callback"); - if(ssl->ctx->sniRecvCb(ssl, NULL, ssl->ctx->sniRecvCbArg) - == alert_fatal) { + sniRet = ssl->ctx->sniRecvCb(ssl, &ad, ssl->ctx->sniRecvCbArg); + if (sniRet == alert_fatal) { WOLFSSL_MSG("Error in custom sni callback. Fatal alert"); - SendAlert(ssl, alert_fatal, unrecognized_name); + SendAlert(ssl, alert_fatal, ad); return FATAL_ERROR; } + else if (sniRet == alert_warning) { + WOLFSSL_MSG("Error in custom sni callback. Warning alert"); + SendAlert(ssl, alert_warning, ad); + } } return 0; } diff --git a/src/ocsp.c b/src/ocsp.c index 4862cf9392..216ed23bc2 100644 --- a/src/ocsp.c +++ b/src/ocsp.c @@ -598,7 +598,9 @@ WOLFSSL_OCSP_CERTID* wolfSSL_OCSP_cert_to_id( (void)dgst; cm = wolfSSL_CertManagerNew(); - if (cm == NULL) + if (cm == NULL + || subject == NULL || subject->derCert == NULL + || issuer == NULL || issuer->derCert == NULL) return NULL; ret = AllocDer(&derCert, issuer->derCert->length, diff --git a/src/ssl.c b/src/ssl.c index ef1f645da8..ebccbeb7ed 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -18260,37 +18260,22 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, #endif /* KEEP_PEER_CERT */ -#if defined(SESSION_CERTS) -/* Return stack of peer certs. - * If Qt or OPENSSL_ALL is defined then return ssl->peerCertChain. - * All other cases return &ssl->session.chain - * ssl->peerCertChain is type WOLFSSL_STACK* - * ssl->session.chain is type WOLFSSL_X509_CHAIN +#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) +/* Return stack of peer certs. * Caller does not need to free return. The stack is Free'd when WOLFSSL* ssl is. */ WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL* ssl) { - WOLFSSL_STACK* sk; WOLFSSL_ENTER("wolfSSL_get_peer_cert_chain"); if (ssl == NULL) return NULL; - #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) - if (ssl->peerCertChain == NULL) - wolfSSL_set_peer_cert_chain((WOLFSSL*) ssl); - sk = ssl->peerCertChain; - #else - sk = (WOLF_STACK_OF(WOLFSSL_X509)* )&ssl->session.chain; - #endif - - if (sk == NULL) { - WOLFSSL_MSG("Error: Null Peer Cert Chain"); - } - return sk; + if (ssl->peerCertChain == NULL) + wolfSSL_set_peer_cert_chain((WOLFSSL*) ssl); + return ssl->peerCertChain; } -#if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) /* Builds up and creates a stack of peer certificates for ssl->peerCertChain based off of the ssl session chain. Returns stack of WOLFSSL_X509 certs or NULL on failure */ @@ -18335,8 +18320,7 @@ WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl) ssl->peerCertChain = sk; return sk; } -#endif /* OPENSSL_ALL || WOLFSSL_QT */ -#endif /* SESSION_CERTS */ +#endif /* SESSION_CERTS && OPENSSL_EXTRA */ #ifndef NO_CERTS #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \ @@ -29759,6 +29743,8 @@ WOLFSSL_STACK* wolfSSL_sk_dup(WOLFSSL_STACK* sk) switch (sk->type) { case STACK_TYPE_X509: + if (!sk->data.x509) + break; cur->data.x509 = wolfSSL_X509_dup(sk->data.x509); if (!cur->data.x509) { WOLFSSL_MSG("wolfSSL_X509_dup error"); @@ -29769,6 +29755,8 @@ WOLFSSL_STACK* wolfSSL_sk_dup(WOLFSSL_STACK* sk) wolfSSL_CIPHER_copy(&sk->data.cipher, &cur->data.cipher); break; case STACK_TYPE_GEN_NAME: + if (!sk->data.gn) + break; cur->data.gn = wolfSSL_GENERAL_NAME_dup(sk->data.gn); if (!cur->data.gn) { WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error"); @@ -29776,6 +29764,8 @@ WOLFSSL_STACK* wolfSSL_sk_dup(WOLFSSL_STACK* sk) } break; case STACK_TYPE_OBJ: + if (!sk->data.obj) + break; cur->data.obj = wolfSSL_ASN1_OBJECT_dup(sk->data.obj); if (!cur->data.obj) { WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup error"); @@ -48010,7 +48000,7 @@ WOLF_STACK_OF(WOLFSSL_STRING) *wolfSSL_X509_get1_ocsp(WOLFSSL_X509 *x) WOLFSSL_STACK* list = NULL; char* url; - if (x->authInfoSz == 0) + if (x == NULL || x->authInfoSz == 0) return NULL; list = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK) + x->authInfoSz + 1, diff --git a/tests/api.c b/tests/api.c index 6b3af3092f..cde3746e4b 100644 --- a/tests/api.c +++ b/tests/api.c @@ -28547,7 +28547,7 @@ static int msgCb(SSL_CTX *ctx, SSL *ssl) { (void) ctx; (void) ssl; - #ifdef WOLFSSL_QT + #ifdef OPENSSL_EXTRA STACK_OF(X509)* sk; X509* x509; int i, num; @@ -28559,7 +28559,7 @@ static int msgCb(SSL_CTX *ctx, SSL *ssl) AssertIntEQ(((WOLFSSL_X509_CHAIN *)SSL_get_peer_cert_chain(ssl))->count, 1); #endif - #ifdef WOLFSSL_QT + #ifdef OPENSSL_EXTRA bio = BIO_new(BIO_s_file()); BIO_set_fp(bio, stdout, BIO_NOCLOSE); sk = SSL_get_peer_cert_chain(ssl); diff --git a/wolfssl/internal.h b/wolfssl/internal.h index d4f68a8159..2cbc325a0f 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -4369,7 +4369,7 @@ struct WOLFSSL { #ifdef OPENSSL_ALL long verifyCallbackResult; #endif -#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) +#if defined(OPENSSL_EXTRA) WOLFSSL_STACK* supportedCiphers; /* Used in wolfSSL_get_ciphers_compat */ WOLFSSL_STACK* peerCertChain; /* Used in wolfSSL_get_peer_cert_chain */ #endif diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index 05296b5824..ae5869ea49 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -1128,6 +1128,8 @@ wolfSSL_X509_STORE_set_verify_cb((WOLFSSL_X509_STORE *)(s), (WOLFSSL_X509_STORE_ #define SSL3_AD_BAD_CERTIFICATE bad_certificate #define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE #define SSL_AD_UNRECOGNIZED_NAME unrecognized_name +#define SSL_AD_NO_RENEGOTIATION no_renegotiation +#define SSL_AD_INTERNAL_ERROR 80 #define ASN1_STRFLGS_ESC_MSB 4 @@ -1168,6 +1170,7 @@ wolfSSL_X509_STORE_set_verify_cb((WOLFSSL_X509_STORE *)(s), (WOLFSSL_X509_STORE_ #define SSL3_AL_FATAL 2 #define SSL_TLSEXT_ERR_OK 0 #define SSL_TLSEXT_ERR_ALERT_FATAL alert_fatal +#define SSL_TLSEXT_ERR_ALERT_WARNING alert_warning #define SSL_TLSEXT_ERR_NOACK alert_warning #define TLSEXT_NAMETYPE_host_name WOLFSSL_SNI_HOST_NAME diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 5c412cab5c..9a54969182 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -2114,8 +2114,8 @@ WOLFSSL_API int wolfSSL_CTX_set_default_verify_paths(WOLFSSL_CTX*); WOLFSSL_API int wolfSSL_CTX_set_session_id_context(WOLFSSL_CTX*, const unsigned char*, unsigned int); WOLFSSL_ABI WOLFSSL_API WOLFSSL_X509* wolfSSL_get_peer_certificate(WOLFSSL*); +#ifdef OPENSSL_EXTRA WOLFSSL_API WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL*); -#if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) WOLFSSL_API WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl); #endif From 26df83307477cfcc36991973d0dffc87f014dbae Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Mon, 11 Jan 2021 16:06:43 +0100 Subject: [PATCH 03/78] Compat layer session tickets - OpenSSL uses an internal mechanism by default for session tickets. This is now implemented for OPENSSL_EXTRA in wolfSSL. - Add testing of wolfSSL_CTX_set_tlsext_ticket_key_cb --- examples/echoserver/echoserver.c | 6 +++ examples/server/server.c | 6 +++ src/internal.c | 91 +++++++++++++++++++++++++++++++- src/ssl.c | 37 ++++++++----- tests/api.c | 4 ++ wolfssl/internal.h | 1 + wolfssl/ssl.h | 7 +++ wolfssl/test.h | 74 ++++++++++++++++++++++---- 8 files changed, 201 insertions(+), 25 deletions(-) diff --git a/examples/echoserver/echoserver.c b/examples/echoserver/echoserver.c index 1ef3007f84..d864f8cb2e 100644 --- a/examples/echoserver/echoserver.c +++ b/examples/echoserver/echoserver.c @@ -169,8 +169,14 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args) ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || defined(HAVE_AESGCM)) if (TicketInit() != 0) err_sys("unable to setup Session Ticket Key context"); +#ifdef OPENSSL_EXTRA + /* In OpenSSL compat case, the compat layer handles the session + * tickets internally by default */ +#elif ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || \ + defined(HAVE_AESGCM)) wolfSSL_CTX_set_TicketEncCb(ctx, myTicketEncCb); #endif +#endif #ifndef NO_FILESYSTEM if (doPSK == 0) { diff --git a/examples/server/server.c b/examples/server/server.c index 05b6f2f548..2260fa46c3 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -1804,8 +1804,14 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || defined(HAVE_AESGCM)) if (TicketInit() != 0) err_sys_ex(catastrophic, "unable to setup Session Ticket Key context"); +#ifdef OPENSSL_EXTRA + /* In OpenSSL compat case, the compat layer handles the session + * tickets internally by default */ +#elif ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || \ + defined(HAVE_AESGCM)) wolfSSL_CTX_set_TicketEncCb(ctx, myTicketEncCb); #endif +#endif #if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_STATIC_EPHEMERAL) /* used for testing only to set a static/fixed ephemeral key diff --git a/src/internal.c b/src/internal.c index 1b8eec9b95..02bbfd6b6d 100644 --- a/src/internal.c +++ b/src/internal.c @@ -1673,6 +1673,78 @@ int InitSSL_Side(WOLFSSL* ssl, word16 side) } #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */ +#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \ + defined(OPENSSL_EXTRA) +static int ctxInitTicket(WOLFSSL_CTX* ctx) +{ + WC_RNG rng; + int ret = 0; + + ret = wc_InitRng(&rng); + if (ret != 0) + return ret; + + ret = wc_RNG_GenerateBlock(&rng, + ctx->ticketCompatName, sizeof(ctx->ticketCompatName)); + if (ret == 0) + ret = wc_RNG_GenerateBlock(&rng, + ctx->ticketCompatKey, sizeof(ctx->ticketCompatKey)); + if (ret == 0) + ret = wc_RNG_GenerateBlock(&rng, + ctx->ticketCompatHmacKey, sizeof(ctx->ticketCompatHmacKey)); + if (ret == 0) + ret = wc_RNG_GenerateBlock(&rng, + ctx->ticketCompatIV, sizeof(ctx->ticketCompatIV)); + + wc_FreeRng(&rng); + return ret; +} + +static WC_INLINE int myTicketEncCbCompat(WOLFSSL* ssl, + byte name[WOLFSSL_TICKET_NAME_SZ], + byte iv[WOLFSSL_TICKET_IV_SZ], + WOLFSSL_EVP_CIPHER_CTX *ectx, + WOLFSSL_HMAC_CTX *hctx, int enc) { + WOLFSSL_ENTER("myTicketEncCbCompat"); + + if (ssl == NULL || name == NULL || iv == NULL || ectx == NULL + || hctx == NULL) + return TICKET_KEY_CB_RET_FAILURE; + + if (enc) { + XMEMCPY(name, ssl->ctx->ticketCompatName, sizeof(ssl->ctx->ticketCompatName)); + XMEMCPY(iv, ssl->ctx->ticketCompatIV, sizeof(ssl->ctx->ticketCompatIV)); + } + else if (XMEMCMP(name, ssl->ctx->ticketCompatName, + sizeof(ssl->ctx->ticketCompatName)) != 0 || + XMEMCMP(iv, ssl->ctx->ticketCompatIV, + sizeof(ssl->ctx->ticketCompatIV)) != 0) { + WOLFSSL_MSG("myTicketEncCbCompat: name or iv mismatch"); + return TICKET_KEY_CB_RET_NOT_FOUND; + } + if (wolfSSL_HMAC_Init(hctx, ssl->ctx->ticketCompatHmacKey, + WOLFSSL_TICKET_NAME_SZ, wolfSSL_EVP_sha256()) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("wolfSSL_HMAC_Init error"); + return TICKET_KEY_CB_RET_FAILURE; + } + if (enc) { + if (wolfSSL_EVP_EncryptInit(ectx, wolfSSL_EVP_aes_256_cbc(), + ssl->ctx->ticketCompatKey, iv) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("wolfSSL_EVP_EncryptInit error"); + return TICKET_KEY_CB_RET_FAILURE; + } + } + else { + if (wolfSSL_EVP_DecryptInit(ectx, wolfSSL_EVP_aes_256_cbc(), + ssl->ctx->ticketCompatKey, iv) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("wolfSSL_EVP_DecryptInit error"); + return TICKET_KEY_CB_RET_FAILURE; + } + } + return TICKET_KEY_CB_RET_OK; +} +#endif /* HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER && OPENSSL_EXTRA */ + /* Initialize SSL context, return 0 on success */ int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap) { @@ -1825,10 +1897,21 @@ int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap) ctx->ticketEncCtx = (void*)&ctx->ticketKeyCtx; #endif ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT; +#ifdef OPENSSL_EXTRA + if (ret == 0) + ret = ctxInitTicket(ctx); + /* No need for compat ticket init flag since below callback setter is + * only called when the above parameter generation has succeeded */ + if (ret == 0 && + wolfSSL_CTX_set_tlsext_ticket_key_cb(ctx, myTicketEncCbCompat) + != WOLFSSL_SUCCESS) + ret = SESSION_SECRET_CB_E; +#endif #endif #ifdef HAVE_WOLF_EVENT - ret = wolfEventQueue_Init(&ctx->event_queue); + if (ret == 0) + ret = wolfEventQueue_Init(&ctx->event_queue); #endif /* HAVE_WOLF_EVENT */ #ifdef WOLFSSL_EARLY_DATA @@ -1970,6 +2053,12 @@ void SSL_CtxResourceFree(WOLFSSL_CTX* ctx) } } #endif /* WOLFSSL_STATIC_MEMORY */ +#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \ + defined(OPENSSL_EXTRA) + ForceZero(ctx->ticketCompatKey, sizeof(ctx->ticketCompatKey)); + ForceZero(ctx->ticketCompatHmacKey, sizeof(ctx->ticketCompatHmacKey)); + ForceZero(ctx->ticketCompatIV, sizeof(ctx->ticketCompatIV)); +#endif } diff --git a/src/ssl.c b/src/ssl.c index ebccbeb7ed..97a0964586 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -15704,6 +15704,14 @@ int wolfSSL_set_compression(WOLFSSL* ssl) ctx->mask = wolf_set_options(ctx->mask, opt); +#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) + if (ctx->mask & SSL_OP_NO_TICKET) { + ctx->ticketEncCb = NULL; + ctx->ticketCompatCb = NULL; + WOLFSSL_MSG("\tSSL_OP_NO_TICKET"); + } +#endif + return ctx->mask; } @@ -47561,16 +47569,7 @@ int wolfSSL_i2a_ASN1_INTEGER(BIO *bp, const WOLFSSL_ASN1_INTEGER *a) #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) -/* Expected return values from implementations of OpenSSL ticket key callback. - */ -#define TICKET_KEY_CB_RET_FAILURE -1 -#define TICKET_KEY_CB_RET_NOT_FOUND 0 -#define TICKET_KEY_CB_RET_OK 1 -#define TICKET_KEY_CB_RET_RENEW 2 -/* The ticket key callback as used in OpenSSL is stored here. */ -static int (*ticketKeyCb)(WOLFSSL *ssl, unsigned char *name, unsigned char *iv, - WOLFSSL_EVP_CIPHER_CTX *ectx, WOLFSSL_HMAC_CTX *hctx, int enc) = NULL; /* Implementation of session ticket encryption/decryption using OpenSSL * callback to initialize the cipher and HMAC. @@ -47605,14 +47604,24 @@ static int wolfSSL_TicketKeyCb(WOLFSSL* ssl, (void)ctx; - if (ticketKeyCb == NULL) + WOLFSSL_ENTER("wolfSSL_TicketKeyCb"); + + if (ssl == NULL || ssl->ctx == NULL || ssl->ctx->ticketCompatCb == NULL) { + WOLFSSL_MSG("Bad parameter"); return WOLFSSL_TICKET_RET_FATAL; + } wolfSSL_EVP_CIPHER_CTX_init(&evpCtx); - /* Initialize the cipher and HMAC. */ - res = ticketKeyCb(ssl, keyName, iv, &evpCtx, &hmacCtx, enc); - if (res != TICKET_KEY_CB_RET_OK && res != TICKET_KEY_CB_RET_RENEW) + if (wolfSSL_HMAC_CTX_Init(&hmacCtx) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init error"); return WOLFSSL_TICKET_RET_FATAL; + } + /* Initialize the cipher and HMAC. */ + res = ssl->ctx->ticketCompatCb(ssl, keyName, iv, &evpCtx, &hmacCtx, enc); + if (res != TICKET_KEY_CB_RET_OK && res != TICKET_KEY_CB_RET_RENEW) { + WOLFSSL_MSG("Ticket callback error"); + return WOLFSSL_TICKET_RET_FATAL; + } if (enc) { @@ -47676,7 +47685,7 @@ int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *ctx, int (*cb)( WOLFSSL_EVP_CIPHER_CTX *ectx, WOLFSSL_HMAC_CTX *hctx, int enc)) { /* Store callback in a global. */ - ticketKeyCb = cb; + ctx->ticketCompatCb = cb; /* Set the ticket encryption callback to be a wrapper around OpenSSL * callback. */ diff --git a/tests/api.c b/tests/api.c index cde3746e4b..7224d3af42 100644 --- a/tests/api.c +++ b/tests/api.c @@ -2649,8 +2649,12 @@ static THREAD_RETURN WOLFSSL_THREAD test_server_nofail(void* args) #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \ ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || defined(HAVE_AESGCM)) TicketInit(); +#ifdef OPENSSL_EXTRA + wolfSSL_CTX_set_tlsext_ticket_key_cb(ctx, myTicketEncCbOpenSSL); +#else wolfSSL_CTX_set_TicketEncCb(ctx, myTicketEncCb); #endif +#endif #if defined(USE_WINDOWS_API) port = ((func_args*)args)->signal->port; diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 2cbc325a0f..9b02f70ba6 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -2931,6 +2931,7 @@ struct WOLFSSL_CTX { TicketEncCbCtx ticketKeyCtx; #endif #endif + #endif #ifdef HAVE_SUPPORTED_CURVES byte userCurves; /* indicates user called wolfSSL_CTX_UseSupportedCurve */ #endif diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 9a54969182..6b70857687 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -3252,6 +3252,13 @@ enum TicketEncRet { WOLFSSL_API int wolfSSL_CTX_NoTicketTLSv12(WOLFSSL_CTX* ctx); WOLFSSL_API int wolfSSL_NoTicketTLSv12(WOLFSSL* ssl); +/* Expected return values from implementations of OpenSSL ticket key callback. + */ +#define TICKET_KEY_CB_RET_FAILURE -1 +#define TICKET_KEY_CB_RET_NOT_FOUND 0 +#define TICKET_KEY_CB_RET_OK 1 +#define TICKET_KEY_CB_RET_RENEW 2 + typedef int (*SessionTicketEncCb)(WOLFSSL*, unsigned char key_name[WOLFSSL_TICKET_NAME_SZ], unsigned char iv[WOLFSSL_TICKET_IV_SZ], diff --git a/wolfssl/test.h b/wolfssl/test.h index 5da853e609..6e0df1ceb2 100644 --- a/wolfssl/test.h +++ b/wolfssl/test.h @@ -3930,10 +3930,71 @@ static WC_INLINE const char* mymktemp(char *tempfn, int len, int num) } - #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \ ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || \ defined(HAVE_AESGCM)) + static THREAD_LS_T WC_RNG myKey_rng; + + static WC_INLINE void TicketCleanup(void) + { + wc_FreeRng(&myKey_rng); + } + +#ifdef OPENSSL_EXTRA + + typedef struct key_ctx { + byte name[WOLFSSL_TICKET_NAME_SZ]; /* server name */ + byte key[AES_256_KEY_SIZE]; /* cipher key */ + byte hmacKey[WOLFSSL_TICKET_NAME_SZ]; /* hmac key */ + byte iv[WOLFSSL_TICKET_IV_SZ]; /* cipher iv */ + } key_ctx; + + static THREAD_LS_T key_ctx myKey_ctx; + + static WC_INLINE int TicketInit(void) + { + int ret = wc_InitRng(&myKey_rng); + if (ret != 0) return ret; + + ret = wc_RNG_GenerateBlock(&myKey_rng, myKey_ctx.name, sizeof(myKey_ctx.name)); + if (ret != 0) return ret; + + ret = wc_RNG_GenerateBlock(&myKey_rng, myKey_ctx.key, sizeof(myKey_ctx.key)); + if (ret != 0) return ret; + + ret = wc_RNG_GenerateBlock(&myKey_rng, myKey_ctx.hmacKey, sizeof(myKey_ctx.hmacKey)); + if (ret != 0) return ret; + + ret = wc_RNG_GenerateBlock(&myKey_rng, myKey_ctx.iv,sizeof(myKey_ctx.iv)); + if (ret != 0) return ret; + + return 0; + } + + static WC_INLINE int myTicketEncCbOpenSSL(WOLFSSL* ssl, + byte name[WOLFSSL_TICKET_NAME_SZ], + byte iv[WOLFSSL_TICKET_IV_SZ], + WOLFSSL_EVP_CIPHER_CTX *ectx, + WOLFSSL_HMAC_CTX *hctx, int enc) { + (void)ssl; + if (enc) { + XMEMCPY(name, myKey_ctx.name, sizeof(myKey_ctx.name)); + XMEMCPY(iv, myKey_ctx.iv, sizeof(myKey_ctx.iv)); + } + else if (XMEMCMP(name, myKey_ctx.name, sizeof(myKey_ctx.name)) != 0 || + XMEMCMP(iv, myKey_ctx.iv, sizeof(myKey_ctx.iv)) != 0) { + return 0; + } + HMAC_Init_ex(hctx, myKey_ctx.hmacKey, WOLFSSL_TICKET_NAME_SZ, EVP_sha256(), NULL); + if (enc) + EVP_EncryptInit_ex(ectx, EVP_aes_256_cbc(), NULL, myKey_ctx.key, iv); + else + EVP_DecryptInit_ex(ectx, EVP_aes_256_cbc(), NULL, myKey_ctx.key, iv); + return 1; + } + +#elif ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || \ + defined(HAVE_AESGCM)) #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) #include @@ -3950,7 +4011,6 @@ static WC_INLINE const char* mymktemp(char *tempfn, int len, int num) } key_ctx; static THREAD_LS_T key_ctx myKey_ctx; - static THREAD_LS_T WC_RNG myKey_rng; static WC_INLINE int TicketInit(void) { @@ -3966,11 +4026,6 @@ static WC_INLINE const char* mymktemp(char *tempfn, int len, int num) return 0; } - static WC_INLINE void TicketCleanup(void) - { - wc_FreeRng(&myKey_rng); - } - static WC_INLINE int myTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ], byte iv[WOLFSSL_TICKET_IV_SZ], @@ -4068,9 +4123,8 @@ static WC_INLINE const char* mymktemp(char *tempfn, int len, int num) return WOLFSSL_TICKET_RET_OK; } - -#endif /* HAVE_SESSION_TICKET && ((HAVE_CHACHA && HAVE_POLY1305) || HAVE_AESGCM) */ - +#endif /* OPENSSL_EXTRA elif ((HAVE_CHACHA && HAVE_POLY1305) || HAVE_AESGCM) */ +#endif /* HAVE_SESSION_TICKET */ static WC_INLINE word16 GetRandomPort(void) { From b90862fa3feea2d51b0b187aa7f5b167a1995ce8 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 13 Jan 2021 11:50:33 +0100 Subject: [PATCH 04/78] Free OcspEntry.status only when the struct owns the pointer --- src/ocsp.c | 14 ++++++++++++-- wolfssl/wolfcrypt/asn.h | 2 ++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/ocsp.c b/src/ocsp.c index 216ed23bc2..c9dbaea181 100644 --- a/src/ocsp.c +++ b/src/ocsp.c @@ -75,7 +75,7 @@ static void FreeOcspEntry(OcspEntry* entry, void* heap) { CertStatus *status, *next; - if (entry == NULL) + if (entry == NULL || !entry->ownStatus) return; WOLFSSL_ENTER("FreeOcspEntry"); @@ -799,6 +799,7 @@ OcspResponse* wolfSSL_d2i_OCSP_RESPONSE(OcspResponse** response, XMEMSET(resp->single, 0, sizeof(OcspEntry)); resp->single->status = (CertStatus*)XMALLOC(sizeof(CertStatus), NULL, DYNAMIC_TYPE_OCSP_STATUS); + resp->single->ownStatus = 1; if (resp->single->status == NULL) { XFREE(resp->source, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(resp, NULL, DYNAMIC_TYPE_OCSP_REQUEST); @@ -878,6 +879,7 @@ WOLFSSL_OCSP_BASICRESP* wolfSSL_OCSP_response_get1_basic(OcspResponse* response) else { XMEMCPY(bs->single, response->single, sizeof(OcspEntry)); XMEMCPY(bs->source, response->source, response->maxIdx); + bs->single->ownStatus = 0; } return bs; } @@ -914,11 +916,19 @@ int wolfSSL_i2d_OCSP_REQUEST(OcspRequest* request, unsigned char** data) WOLFSSL_OCSP_ONEREQ* wolfSSL_OCSP_request_add0_id(OcspRequest *req, WOLFSSL_OCSP_CERTID *cid) { - if (req == NULL || cid == NULL) + if (req == NULL || cid == NULL || cid->status == NULL) return NULL; XMEMCPY(req->issuerHash, cid->issuerHash, KEYID_SIZE); XMEMCPY(req->issuerKeyHash, cid->issuerKeyHash, KEYID_SIZE); + if (cid->status->serialSz > req->serialSz) { + if (req->serial != NULL) + XFREE(req->serial, req->heap, DYNAMIC_TYPE_OCSP); + req->serial = (byte*)XMALLOC(cid->status->serialSz, + req->heap, DYNAMIC_TYPE_OCSP_REQUEST); + if (req->serial == NULL) + return NULL; + } XMEMCPY(req->serial, cid->status->serial, cid->status->serialSz); req->serialSz = cid->status->serialSz; diff --git a/wolfssl/wolfcrypt/asn.h b/wolfssl/wolfcrypt/asn.h index e412c1d065..2ea5761c1f 100644 --- a/wolfssl/wolfcrypt/asn.h +++ b/wolfssl/wolfcrypt/asn.h @@ -1390,6 +1390,8 @@ struct OcspEntry byte* rawCertId; /* raw bytes of the CertID */ int rawCertIdSize; /* num bytes in raw CertID */ /* option bits - using 32-bit for alignment */ + word32 ownStatus:1; /* do we need to free the status + * response list */ word32 isDynamic:1; /* was dynamically allocated */ }; From e80158a96e4561c63569e8a1c6169bff5486445f Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 13 Jan 2021 11:52:32 +0100 Subject: [PATCH 05/78] Set full chain with known CA's in wolfSSL_set_peer_cert_chain --- src/ssl.c | 156 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 104 insertions(+), 52 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 97a0964586..47ac67db43 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -18284,8 +18284,41 @@ WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL* ssl) return ssl->peerCertChain; } +static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm, + WOLFSSL_X509 *x); +/** + * Recursively push the issuer CA chain onto the stack + * @param cm The cert manager that is queried for the issuer + * @param x This cert's issuer will be queried in cm + * @param sk The issuer is pushed onto this stack + * @return WOLFSSL_SUCCESS on success + * WOLFSSL_FAILURE on no issuer found + * WOLFSSL_FATAL_ERROR on a fatal error + */ +static int pushCAx509Chain(WOLFSSL_CERT_MANAGER* cm, + WOLFSSL_X509 *x, WOLFSSL_STACK* sk) +{ + WOLFSSL_X509* issuer = NULL; + if (x509GetIssuerFromCM(&issuer, cm, x) + == WOLFSSL_SUCCESS) { + if (pushCAx509Chain(cm, issuer, sk) == WOLFSSL_FATAL_ERROR) { + wolfSSL_X509_free(issuer); + return WOLFSSL_FATAL_ERROR; + } + + if (wolfSSL_sk_X509_push(sk, issuer) != WOLFSSL_SUCCESS) { + wolfSSL_X509_free(issuer); + return WOLFSSL_FATAL_ERROR; + } + return WOLFSSL_SUCCESS; + } + else + return WOLFSSL_FAILURE; +} + /* Builds up and creates a stack of peer certificates for ssl->peerCertChain - based off of the ssl session chain. Returns stack of WOLFSSL_X509 certs or + based off of the ssl session chain. Attempts to place CA certificates + at the bottom of the stack. Returns stack of WOLFSSL_X509 certs or NULL on failure */ WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl) { @@ -18301,10 +18334,6 @@ WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl) sk = wolfSSL_sk_X509_new(); i = ssl->session.chain.count-1; for (; i >= 0; i--) { - /* For servers, the peer certificate chain does not include the peer - certificate, so do not add it to the stack */ - if (ssl->options.side == WOLFSSL_SERVER_END && i == 0) - continue; x509 = wolfSSL_X509_new(); if (x509 == NULL) { WOLFSSL_MSG("Error Creating X509"); @@ -18312,6 +18341,14 @@ WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl) } ret = DecodeToX509(x509, ssl->session.chain.certs[i].buffer, ssl->session.chain.certs[i].length); + if (ret == 0 && i == ssl->session.chain.count-1) { + /* On the last element in the chain try to add the CA chain + * first if we have one for this cert */ + if (pushCAx509Chain(ssl->ctx->cm, x509, sk) + == WOLFSSL_FATAL_ERROR) { + ret = WOLFSSL_FATAL_ERROR; + } + } if (ret != 0 || wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) { WOLFSSL_MSG("Error decoding cert"); @@ -47921,10 +47958,18 @@ int wolfSSL_CTX_set_tlsext_status_cb(WOLFSSL_CTX* ctx, return WOLFSSL_SUCCESS; } -int wolfSSL_X509_STORE_CTX_get1_issuer(WOLFSSL_X509 **issuer, - WOLFSSL_X509_STORE_CTX *ctx, WOLFSSL_X509 *x) +/** + * Find the issuing cert of the input cert. On a self-signed cert this + * function will return an error. + * @param issuer The issuer x509 struct is returned here + * @param cm The cert manager that is queried for the issuer + * @param x This cert's issuer will be queried in cm + * @return WOLFSSL_SUCCESS on success + * WOLFSSL_FAILURE on error + */ +static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm, + WOLFSSL_X509 *x) { - WOLFSSL_STACK* node; Signer* ca = NULL; #ifdef WOLFSSL_SMALL_STACK DecodedCert* cert = NULL; @@ -47932,6 +47977,56 @@ int wolfSSL_X509_STORE_CTX_get1_issuer(WOLFSSL_X509 **issuer, DecodedCert cert[1]; #endif +#ifdef WOLFSSL_SMALL_STACK + cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT); + if (cert == NULL) + return WOLFSSL_FAILURE; +#endif + + /* Use existing CA retrieval APIs that use DecodedCert. */ + InitDecodedCert(cert, x->derCert->buffer, x->derCert->length, NULL); + if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0 + && !cert->selfSigned) { + #ifndef NO_SKID + if (cert->extAuthKeyIdSet) + ca = GetCA(cm, cert->extAuthKeyId); + if (ca == NULL) + ca = GetCAByName(cm, cert->issuerHash); + #else /* NO_SKID */ + ca = GetCA(cm, cert->issuerHash); + #endif /* NO SKID */ + } + FreeDecodedCert(cert); +#ifdef WOLFSSL_SMALL_STACK + XFREE(cert, NULL, DYNAMIC_TYPE_DCERT); +#endif + + if (ca == NULL) + return WOLFSSL_FAILURE; + +#ifdef WOLFSSL_SIGNER_DER_CERT + /* populate issuer with Signer DER */ + if (wolfSSL_X509_d2i(issuer, ca->derCert->buffer, + ca->derCert->length) == NULL) + return WOLFSSL_FAILURE; +#else + /* Create an empty certificate as CA doesn't have a certificate. */ + *issuer = (WOLFSSL_X509 *)XMALLOC(sizeof(WOLFSSL_X509), 0, + DYNAMIC_TYPE_OPENSSL); + if (*issuer == NULL) + return WOLFSSL_FAILURE; + + InitX509((*issuer), 1, NULL); +#endif + + return WOLFSSL_SUCCESS; +} + +int wolfSSL_X509_STORE_CTX_get1_issuer(WOLFSSL_X509 **issuer, + WOLFSSL_X509_STORE_CTX *ctx, WOLFSSL_X509 *x) +{ + WOLFSSL_STACK* node; + if (issuer == NULL || ctx == NULL || x == NULL) return WOLFSSL_FATAL_ERROR; @@ -47944,52 +48039,9 @@ int wolfSSL_X509_STORE_CTX_get1_issuer(WOLFSSL_X509 **issuer, } } - -#ifdef WOLFSSL_SMALL_STACK - cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT); - if (cert == NULL) - return WOLFSSL_FAILURE; -#endif - - /* Use existing CA retrieval APIs that use DecodedCert. */ - InitDecodedCert(cert, x->derCert->buffer, x->derCert->length, NULL); - if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0) { - #ifndef NO_SKID - if (cert->extAuthKeyIdSet) - ca = GetCA(ctx->store->cm, cert->extAuthKeyId); - if (ca == NULL) - ca = GetCAByName(ctx->store->cm, cert->issuerHash); - #else /* NO_SKID */ - ca = GetCA(ctx->store->cm, cert->issuerHash); - #endif /* NO SKID */ - } - FreeDecodedCert(cert); -#ifdef WOLFSSL_SMALL_STACK - XFREE(cert, NULL, DYNAMIC_TYPE_DCERT); -#endif - - if (ca == NULL) - return WOLFSSL_FAILURE; - -#ifdef WOLFSSL_SIGNER_DER_CERT - /* populate issuer with Signer DER */ - *issuer = wolfSSL_X509_d2i(issuer, ca->derCert->buffer, - ca->derCert->length); - if (*issuer == NULL) - return WOLFSSL_FAILURE; -#else - /* Create an empty certificate as CA doesn't have a certificate. */ - *issuer = (WOLFSSL_X509 *)XMALLOC(sizeof(WOLFSSL_X509), 0, - DYNAMIC_TYPE_OPENSSL); - if (*issuer == NULL) - return WOLFSSL_FAILURE; - - InitX509((*issuer), 1, NULL); -#endif - /* Result is ignored when passed to wolfSSL_OCSP_cert_to_id(). */ - return WOLFSSL_SUCCESS; + return x509GetIssuerFromCM(issuer, ctx->store->cm, x); } void wolfSSL_X509_email_free(WOLF_STACK_OF(WOLFSSL_STRING) *sk) From 0ae1a8b8c50e80ca70d53c4c72d1a6f4a68fece0 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 14 Jan 2021 15:01:40 +0100 Subject: [PATCH 06/78] Jenkins fixes - Change pushCAx509Chain to an iterative implementation - Fix variable names shadowing global names --- src/ocsp.c | 2 + src/ssl.c | 42 +++++++++----- tests/api.c | 156 ++++++++++++++++++++++++++-------------------------- 3 files changed, 107 insertions(+), 93 deletions(-) diff --git a/src/ocsp.c b/src/ocsp.c index c9dbaea181..07eefb7317 100644 --- a/src/ocsp.c +++ b/src/ocsp.c @@ -371,6 +371,7 @@ WOLFSSL_LOCAL int CheckOcspResponse(WOLFSSL_OCSP *ocsp, byte *response, int resp XMEMCPY(status, newSingle->status, sizeof(CertStatus)); status->next = entry->status; entry->status = status; + entry->ownStatus = 1; entry->totalStatus++; } } @@ -630,6 +631,7 @@ WOLFSSL_OCSP_CERTID* wolfSSL_OCSP_cert_to_id( XMEMSET(certStatus, 0, sizeof(CertStatus)); certId->status = certStatus; + certId->ownStatus = 1; InitDecodedCert(&cert, subject->derCert->buffer, subject->derCert->length, NULL); diff --git a/src/ssl.c b/src/ssl.c index 47ac67db43..38d0861007 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -10400,7 +10400,6 @@ int wolfSSL_X509_digest(const WOLFSSL_X509* x509, const WOLFSSL_EVP_MD* digest, WOLFSSL_LEAVE("wolfSSL_X509_digest", ret); return ret; } -#endif int wolfSSL_X509_pubkey_digest(const WOLFSSL_X509 *x509, const WOLFSSL_EVP_MD *digest, unsigned char* buf, unsigned int* len) @@ -10424,6 +10423,7 @@ int wolfSSL_X509_pubkey_digest(const WOLFSSL_X509 *x509, WOLFSSL_LEAVE("wolfSSL_X509_pubkey_digest", ret); return ret; } +#endif int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey) { @@ -15704,7 +15704,8 @@ int wolfSSL_set_compression(WOLFSSL* ssl) ctx->mask = wolf_set_options(ctx->mask, opt); -#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) +#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \ + defined(OPENSSL_EXTRA) if (ctx->mask & SSL_OP_NO_TICKET) { ctx->ticketEncCb = NULL; ctx->ticketCompatCb = NULL; @@ -18298,22 +18299,33 @@ static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm, static int pushCAx509Chain(WOLFSSL_CERT_MANAGER* cm, WOLFSSL_X509 *x, WOLFSSL_STACK* sk) { - WOLFSSL_X509* issuer = NULL; - if (x509GetIssuerFromCM(&issuer, cm, x) - == WOLFSSL_SUCCESS) { - if (pushCAx509Chain(cm, issuer, sk) == WOLFSSL_FATAL_ERROR) { - wolfSSL_X509_free(issuer); - return WOLFSSL_FATAL_ERROR; - } + WOLFSSL_X509* issuer[MAX_CHAIN_DEPTH]; + int i; + int push = 1; + int ret = WOLFSSL_SUCCESS; - if (wolfSSL_sk_X509_push(sk, issuer) != WOLFSSL_SUCCESS) { - wolfSSL_X509_free(issuer); - return WOLFSSL_FATAL_ERROR; - } - return WOLFSSL_SUCCESS; + for (i = 0; i < MAX_CHAIN_DEPTH; i++) { + if (x509GetIssuerFromCM(&issuer[i], cm, x) + != WOLFSSL_SUCCESS) + break; + x = issuer[i]; } - else + if (i == 0) /* No further chain found */ return WOLFSSL_FAILURE; + i--; + for (; i >= 0; i--) { + if (push) { + if (wolfSSL_sk_X509_push(sk, issuer[i]) != WOLFSSL_SUCCESS) { + wolfSSL_X509_free(issuer[i]); + ret = WOLFSSL_FATAL_ERROR; + push = 0; /* Free the rest of the unpushed certs */ + } + } + else { + wolfSSL_X509_free(issuer[i]); + } + } + return ret; } /* Builds up and creates a stack of peer certificates for ssl->peerCertChain diff --git a/tests/api.c b/tests/api.c index 7224d3af42..6c10128dc8 100644 --- a/tests/api.c +++ b/tests/api.c @@ -4271,7 +4271,7 @@ static void test_wolfSSL_UseSNI_connection(void) static void test_wolfSSL_SNI_GetFromBuffer(void) { - byte buffer[] = { /* www.paypal.com */ + byte buff[] = { /* www.paypal.com */ 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x60, 0x03, 0x03, 0x5c, 0xc4, 0xb3, 0x8c, 0x87, 0xef, 0xa4, 0x09, 0xe0, 0x02, 0xab, 0x86, 0xca, 0x76, 0xf0, 0x9e, 0x01, 0x65, 0xf6, 0xa6, 0x06, 0x13, 0x1d, 0x0f, 0xa5, @@ -4283,7 +4283,7 @@ static void test_wolfSSL_SNI_GetFromBuffer(void) 0x0d, 0x00, 0x06, 0x00, 0x04, 0x04, 0x01, 0x02, 0x01 }; - byte buffer2[] = { /* api.textmate.org */ + byte buff2[] = { /* api.textmate.org */ 0x16, 0x03, 0x01, 0x00, 0xc6, 0x01, 0x00, 0x00, 0xc2, 0x03, 0x03, 0x52, 0x8b, 0x7b, 0xca, 0x69, 0xec, 0x97, 0xd5, 0x08, 0x03, 0x50, 0xfe, 0x3b, 0x99, 0xc3, 0x20, 0xce, 0xa5, 0xf6, 0x99, 0xa5, 0x71, 0xf9, 0x57, 0x7f, @@ -4303,7 +4303,7 @@ static void test_wolfSSL_SNI_GetFromBuffer(void) 0x0a, 0x05, 0x01, 0x04, 0x01, 0x02, 0x01, 0x04, 0x03, 0x02, 0x03 }; - byte buffer3[] = { /* no sni extension */ + byte buff3[] = { /* no sni extension */ 0x16, 0x03, 0x03, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x49, 0x03, 0x03, 0xea, 0xa1, 0x9f, 0x60, 0xdd, 0x52, 0x12, 0x13, 0xbd, 0x84, 0x34, 0xd5, 0x1c, 0x38, 0x25, 0xa8, 0x97, 0xd2, 0xd5, 0xc6, 0x45, 0xaf, 0x1b, 0x08, 0xe4, @@ -4313,7 +4313,7 @@ static void test_wolfSSL_SNI_GetFromBuffer(void) 0x00, 0x0d, 0x00, 0x06, 0x00, 0x04, 0x04, 0x01, 0x02, 0x01 }; - byte buffer4[] = { /* last extension has zero size */ + byte buff4[] = { /* last extension has zero size */ 0x16, 0x03, 0x01, 0x00, 0xba, 0x01, 0x00, 0x00, 0xb6, 0x03, 0x03, 0x83, 0xa3, 0xe6, 0xdc, 0x16, 0xa1, 0x43, 0xe9, 0x45, 0x15, 0xbd, 0x64, 0xa9, 0xb6, 0x07, 0xb4, 0x50, 0xc6, 0xdd, 0xff, 0xc2, @@ -4333,7 +4333,7 @@ static void test_wolfSSL_SNI_GetFromBuffer(void) 0x12, 0x00, 0x00 }; - byte buffer5[] = { /* SSL v2.0 client hello */ + byte buff5[] = { /* SSL v2.0 client hello */ 0x00, 0x2b, 0x01, 0x03, 0x01, 0x00, 0x09, 0x00, 0x00, /* dummy bytes bellow, just to pass size check */ 0xb6, 0x03, 0x03, 0x83, 0xa3, 0xe6, 0xdc, 0x16, 0xa1, 0x43, 0xe9, 0x45, @@ -4344,58 +4344,58 @@ static void test_wolfSSL_SNI_GetFromBuffer(void) byte result[32] = {0}; word32 length = 32; - AssertIntEQ(0, wolfSSL_SNI_GetFromBuffer(buffer4, sizeof(buffer4), + AssertIntEQ(0, wolfSSL_SNI_GetFromBuffer(buff4, sizeof(buff4), 0, result, &length)); - AssertIntEQ(0, wolfSSL_SNI_GetFromBuffer(buffer3, sizeof(buffer3), + AssertIntEQ(0, wolfSSL_SNI_GetFromBuffer(buff3, sizeof(buff3), 0, result, &length)); - AssertIntEQ(0, wolfSSL_SNI_GetFromBuffer(buffer2, sizeof(buffer2), + AssertIntEQ(0, wolfSSL_SNI_GetFromBuffer(buff2, sizeof(buff2), 1, result, &length)); - AssertIntEQ(BUFFER_ERROR, wolfSSL_SNI_GetFromBuffer(buffer, sizeof(buffer), + AssertIntEQ(BUFFER_ERROR, wolfSSL_SNI_GetFromBuffer(buff, sizeof(buff), 0, result, &length)); - buffer[0] = 0x16; + buff[0] = 0x16; - AssertIntEQ(BUFFER_ERROR, wolfSSL_SNI_GetFromBuffer(buffer, sizeof(buffer), + AssertIntEQ(BUFFER_ERROR, wolfSSL_SNI_GetFromBuffer(buff, sizeof(buff), 0, result, &length)); - buffer[1] = 0x03; + buff[1] = 0x03; - AssertIntEQ(SNI_UNSUPPORTED, wolfSSL_SNI_GetFromBuffer(buffer, - sizeof(buffer), 0, result, &length)); - buffer[2] = 0x03; + AssertIntEQ(SNI_UNSUPPORTED, wolfSSL_SNI_GetFromBuffer(buff, + sizeof(buff), 0, result, &length)); + buff[2] = 0x03; - AssertIntEQ(INCOMPLETE_DATA, wolfSSL_SNI_GetFromBuffer(buffer, - sizeof(buffer), 0, result, &length)); - buffer[4] = 0x64; + AssertIntEQ(INCOMPLETE_DATA, wolfSSL_SNI_GetFromBuffer(buff, + sizeof(buff), 0, result, &length)); + buff[4] = 0x64; - AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_SNI_GetFromBuffer(buffer, sizeof(buffer), + AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_SNI_GetFromBuffer(buff, sizeof(buff), 0, result, &length)); result[length] = 0; AssertStrEQ("www.paypal.com", (const char*) result); length = 32; - AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_SNI_GetFromBuffer(buffer2, sizeof(buffer2), + AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_SNI_GetFromBuffer(buff2, sizeof(buff2), 0, result, &length)); result[length] = 0; AssertStrEQ("api.textmate.org", (const char*) result); /* SSL v2.0 tests */ - AssertIntEQ(SNI_UNSUPPORTED, wolfSSL_SNI_GetFromBuffer(buffer5, - sizeof(buffer5), 0, result, &length)); + AssertIntEQ(SNI_UNSUPPORTED, wolfSSL_SNI_GetFromBuffer(buff5, + sizeof(buff5), 0, result, &length)); - buffer5[2] = 0x02; - AssertIntEQ(BUFFER_ERROR, wolfSSL_SNI_GetFromBuffer(buffer5, - sizeof(buffer5), 0, result, &length)); + buff5[2] = 0x02; + AssertIntEQ(BUFFER_ERROR, wolfSSL_SNI_GetFromBuffer(buff5, + sizeof(buff5), 0, result, &length)); - buffer5[2] = 0x01; buffer5[6] = 0x08; - AssertIntEQ(BUFFER_ERROR, wolfSSL_SNI_GetFromBuffer(buffer5, - sizeof(buffer5), 0, result, &length)); + buff5[2] = 0x01; buff5[6] = 0x08; + AssertIntEQ(BUFFER_ERROR, wolfSSL_SNI_GetFromBuffer(buff5, + sizeof(buff5), 0, result, &length)); - buffer5[6] = 0x09; buffer5[8] = 0x01; - AssertIntEQ(BUFFER_ERROR, wolfSSL_SNI_GetFromBuffer(buffer5, - sizeof(buffer5), 0, result, &length)); + buff5[6] = 0x09; buff5[8] = 0x01; + AssertIntEQ(BUFFER_ERROR, wolfSSL_SNI_GetFromBuffer(buff5, + sizeof(buff5), 0, result, &length)); } #endif /* HAVE_SNI */ @@ -5296,7 +5296,7 @@ static void test_wolfSSL_no_password_cb(void) #if !defined(NO_FILESYSTEM) && !defined(NO_ASN) && defined(HAVE_PKCS8) \ && defined(HAVE_ECC) && defined(WOLFSSL_ENCRYPTED_KEYS) WOLFSSL_CTX* ctx; - byte buffer[FOURK_BUF]; + byte buff[FOURK_BUF]; const char eccPkcs8PrivKeyDerFile[] = "./certs/ecc-privkeyPkcs8.der"; const char eccPkcs8PrivKeyPemFile[] = "./certs/ecc-privkeyPkcs8.pem"; XFILE f; @@ -5312,17 +5312,17 @@ static void test_wolfSSL_no_password_cb(void) wolfSSL_CTX_set_default_passwd_cb(ctx, FailTestCallBack); AssertTrue((f = XFOPEN(eccPkcs8PrivKeyDerFile, "rb")) != XBADFILE); - bytes = (int)XFREAD(buffer, 1, sizeof(buffer), f); + bytes = (int)XFREAD(buff, 1, sizeof(buff), f); XFCLOSE(f); - AssertIntLE(bytes, sizeof(buffer)); - AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buffer, bytes, + AssertIntLE(bytes, sizeof(buff)); + AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS); AssertTrue((f = XFOPEN(eccPkcs8PrivKeyPemFile, "rb")) != XBADFILE); - bytes = (int)XFREAD(buffer, 1, sizeof(buffer), f); + bytes = (int)XFREAD(buff, 1, sizeof(buff), f); XFCLOSE(f); - AssertIntLE(bytes, sizeof(buffer)); - AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buffer, bytes, + AssertIntLE(bytes, sizeof(buff)); + AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); wolfSSL_CTX_free(ctx); @@ -5365,7 +5365,7 @@ static int PKCS8TestCallBack(char* passwd, int sz, int rw, void* userdata) static void test_wolfSSL_PKCS8(void) { #if !defined(NO_FILESYSTEM) && !defined(NO_ASN) && defined(HAVE_PKCS8) - byte buffer[FOURK_BUF]; + byte buff[FOURK_BUF]; byte der[FOURK_BUF]; #ifndef NO_RSA const char serverKeyPkcs8PemFile[] = "./certs/server-keyPkcs8.pem"; @@ -5420,36 +5420,36 @@ static void test_wolfSSL_PKCS8(void) /* test loading PEM PKCS8 encrypted file */ f = XFOPEN(serverKeyPkcs8EncPemFile, "rb"); AssertTrue((f != XBADFILE)); - bytes = (int)XFREAD(buffer, 1, sizeof(buffer), f); + bytes = (int)XFREAD(buff, 1, sizeof(buff), f); XFCLOSE(f); - AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buffer, bytes, + AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); /* this next case should fail because of password callback return code */ flag = 0; /* used by password callback as return code */ - AssertIntNE(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buffer, bytes, + AssertIntNE(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); /* decrypt PKCS8 PEM to key in DER format with not using WOLFSSL_CTX */ - AssertIntGT(wc_KeyPemToDer(buffer, bytes, der, (word32)sizeof(der), + AssertIntGT(wc_KeyPemToDer(buff, bytes, der, (word32)sizeof(der), "yassl123"), 0); /* test that error value is returned with a bad password */ - AssertIntLT(wc_KeyPemToDer(buffer, bytes, der, (word32)sizeof(der), + AssertIntLT(wc_KeyPemToDer(buff, bytes, der, (word32)sizeof(der), "bad"), 0); /* test loading PEM PKCS8 encrypted file */ f = XFOPEN(serverKeyPkcs8EncDerFile, "rb"); AssertTrue((f != XBADFILE)); - bytes = (int)XFREAD(buffer, 1, sizeof(buffer), f); + bytes = (int)XFREAD(buff, 1, sizeof(buff), f); XFCLOSE(f); flag = 1; /* used by password callback as return code */ - AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buffer, bytes, + AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS); /* this next case should fail because of password callback return code */ flag = 0; /* used by password callback as return code */ - AssertIntNE(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buffer, bytes, + AssertIntNE(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS); #endif /* !NO_RSA && !NO_SHA */ @@ -5457,37 +5457,37 @@ static void test_wolfSSL_PKCS8(void) /* test loading PEM PKCS8 encrypted ECC Key file */ f = XFOPEN(eccPkcs8EncPrivKeyPemFile, "rb"); AssertTrue((f != XBADFILE)); - bytes = (int)XFREAD(buffer, 1, sizeof(buffer), f); + bytes = (int)XFREAD(buff, 1, sizeof(buff), f); XFCLOSE(f); flag = 1; /* used by password callback as return code */ - AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buffer, bytes, + AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); /* this next case should fail because of password callback return code */ flag = 0; /* used by password callback as return code */ - AssertIntNE(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buffer, bytes, + AssertIntNE(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); /* decrypt PKCS8 PEM to key in DER format with not using WOLFSSL_CTX */ - AssertIntGT(wc_KeyPemToDer(buffer, bytes, der, (word32)sizeof(der), + AssertIntGT(wc_KeyPemToDer(buff, bytes, der, (word32)sizeof(der), "yassl123"), 0); /* test that error value is returned with a bad password */ - AssertIntLT(wc_KeyPemToDer(buffer, bytes, der, (word32)sizeof(der), + AssertIntLT(wc_KeyPemToDer(buff, bytes, der, (word32)sizeof(der), "bad"), 0); /* test loading DER PKCS8 encrypted ECC Key file */ f = XFOPEN(eccPkcs8EncPrivKeyDerFile, "rb"); AssertTrue((f != XBADFILE)); - bytes = (int)XFREAD(buffer, 1, sizeof(buffer), f); + bytes = (int)XFREAD(buff, 1, sizeof(buff), f); XFCLOSE(f); flag = 1; /* used by password callback as return code */ - AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buffer, bytes, + AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS); /* this next case should fail because of password callback return code */ flag = 0; /* used by password callback as return code */ - AssertIntNE(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buffer, bytes, + AssertIntNE(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS); /* leave flag as "okay" */ @@ -5500,32 +5500,32 @@ static void test_wolfSSL_PKCS8(void) /* test loading ASN.1 (DER) PKCS8 private key file (not encrypted) */ f = XFOPEN(serverKeyPkcs8DerFile, "rb"); AssertTrue((f != XBADFILE)); - bytes = (int)XFREAD(buffer, 1, sizeof(buffer), f); + bytes = (int)XFREAD(buff, 1, sizeof(buff), f); XFCLOSE(f); - AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buffer, bytes, + AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS); /* test loading PEM PKCS8 private key file (not encrypted) */ f = XFOPEN(serverKeyPkcs8PemFile, "rb"); AssertTrue((f != XBADFILE)); - bytes = (int)XFREAD(buffer, 1, sizeof(buffer), f); + bytes = (int)XFREAD(buff, 1, sizeof(buff), f); XFCLOSE(f); - AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buffer, bytes, + AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); #endif /* !NO_RSA */ /* Test PKCS8 PEM ECC key no crypt */ f = XFOPEN(eccPkcs8PrivKeyPemFile, "rb"); AssertTrue((f != XBADFILE)); - bytes = (int)XFREAD(buffer, 1, sizeof(buffer), f); + bytes = (int)XFREAD(buff, 1, sizeof(buff), f); XFCLOSE(f); #ifdef HAVE_ECC /* Test PKCS8 PEM ECC key no crypt */ - AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buffer, bytes, + AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); /* decrypt PKCS8 PEM to key in DER format */ - AssertIntGT((bytes = wc_KeyPemToDer(buffer, bytes, der, + AssertIntGT((bytes = wc_KeyPemToDer(buff, bytes, der, (word32)sizeof(der), NULL)), 0); ret = wc_ecc_init(&key); if (ret == 0) { @@ -5537,15 +5537,15 @@ static void test_wolfSSL_PKCS8(void) /* Test PKCS8 DER ECC key no crypt */ f = XFOPEN(eccPkcs8PrivKeyDerFile, "rb"); AssertTrue((f != XBADFILE)); - bytes = (int)XFREAD(buffer, 1, sizeof(buffer), f); + bytes = (int)XFREAD(buff, 1, sizeof(buff), f); XFCLOSE(f); /* Test using a PKCS8 ECC PEM */ - AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buffer, bytes, + AssertIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS); #else /* if HAVE_ECC is not defined then BEGIN EC PRIVATE KEY is not found */ - AssertIntEQ((bytes = wc_KeyPemToDer(buffer, bytes, der, + AssertIntEQ((bytes = wc_KeyPemToDer(buff, bytes, der, (word32)sizeof(der), NULL)), ASN_NO_PEM_HEADER); #endif /* HAVE_ECC */ @@ -5706,7 +5706,7 @@ static void test_wolfSSL_X509_verify(void) #if !defined(NO_CERTS) && !defined(NO_RSA) && !defined(NO_FILESYSTEM) \ && defined(OPENSSL_EXTRA) WOLFSSL_X509* ca; - WOLFSSL_X509* server; + WOLFSSL_X509* serv; WOLFSSL_EVP_PKEY* pkey; unsigned char buf[2048]; const unsigned char* pt = NULL; @@ -5730,7 +5730,7 @@ static void test_wolfSSL_X509_verify(void) AssertIntEQ(wolfSSL_X509_get_pubkey_type(ca), RSAk); - AssertNotNull(server = + AssertNotNull(serv = wolfSSL_X509_load_certificate_file(svrCertFile, WOLFSSL_FILETYPE_PEM)); /* success case */ @@ -5739,23 +5739,23 @@ static void test_wolfSSL_X509_verify(void) AssertIntEQ(i2d_PUBKEY(pkey, NULL), bufSz); - AssertIntEQ(wolfSSL_X509_verify(server, pkey), WOLFSSL_SUCCESS); + AssertIntEQ(wolfSSL_X509_verify(serv, pkey), WOLFSSL_SUCCESS); wolfSSL_EVP_PKEY_free(pkey); /* fail case */ bufSz = 2048; - AssertIntEQ(wolfSSL_X509_get_pubkey_buffer(server, buf, &bufSz), + AssertIntEQ(wolfSSL_X509_get_pubkey_buffer(serv, buf, &bufSz), WOLFSSL_SUCCESS); pt = buf; AssertNotNull(pkey = wolfSSL_d2i_PUBKEY(NULL, &pt, bufSz)); - AssertIntEQ(wolfSSL_X509_verify(server, pkey), WOLFSSL_FAILURE); + AssertIntEQ(wolfSSL_X509_verify(serv, pkey), WOLFSSL_FAILURE); AssertIntEQ(wolfSSL_X509_verify(NULL, pkey), WOLFSSL_FATAL_ERROR); - AssertIntEQ(wolfSSL_X509_verify(server, NULL), WOLFSSL_FATAL_ERROR); + AssertIntEQ(wolfSSL_X509_verify(serv, NULL), WOLFSSL_FATAL_ERROR); wolfSSL_EVP_PKEY_free(pkey); wolfSSL_FreeX509(ca); - wolfSSL_FreeX509(server); + wolfSSL_FreeX509(serv); printf(resultFmt, passed); #endif @@ -26849,7 +26849,7 @@ static void test_wolfSSL_tmp_dh(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && \ !defined(NO_DSA) && !defined(NO_RSA) && !defined(NO_DH) && !defined(NO_BIO) - byte buffer[6000]; + byte buff[6000]; char file[] = "./certs/dsaparams.pem"; XFILE f; int bytes; @@ -26875,10 +26875,10 @@ static void test_wolfSSL_tmp_dh(void) f = XFOPEN(file, "rb"); AssertTrue((f != XBADFILE)); - bytes = (int)XFREAD(buffer, 1, sizeof(buffer), f); + bytes = (int)XFREAD(buff, 1, sizeof(buff), f); XFCLOSE(f); - bio = BIO_new_mem_buf((void*)buffer, bytes); + bio = BIO_new_mem_buf((void*)buff, bytes); AssertNotNull(bio); dsa = wolfSSL_PEM_read_bio_DSAparams(bio, NULL, NULL, NULL); @@ -28551,7 +28551,7 @@ static int msgCb(SSL_CTX *ctx, SSL *ssl) { (void) ctx; (void) ssl; - #ifdef OPENSSL_EXTRA + #ifdef OPENSSL_ALL STACK_OF(X509)* sk; X509* x509; int i, num; @@ -28560,10 +28560,10 @@ static int msgCb(SSL_CTX *ctx, SSL *ssl) printf("\n===== msgcb called ====\n"); #if defined(SESSION_CERTS) && defined(TEST_PEER_CERT_CHAIN) AssertTrue(SSL_get_peer_cert_chain(ssl) != NULL); - AssertIntEQ(((WOLFSSL_X509_CHAIN *)SSL_get_peer_cert_chain(ssl))->count, 1); + AssertIntEQ(((WOLFSSL_X509_CHAIN *)SSL_get_peer_cert_chain(ssl))->count, 2); #endif - #ifdef OPENSSL_EXTRA + #ifdef OPENSSL_ALL bio = BIO_new(BIO_s_file()); BIO_set_fp(bio, stdout, BIO_NOCLOSE); sk = SSL_get_peer_cert_chain(ssl); From 9265c3f71fcf5f7239f816b2459700e4bf6fe6f6 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 20 Jan 2021 13:38:53 +0100 Subject: [PATCH 07/78] Use native API for ticket callback --- src/internal.c | 135 ++++++++++++++++++++++++++++++--------------- src/ssl.c | 39 ++++++++----- wolfssl/internal.h | 4 ++ wolfssl/ssl.h | 13 +---- 4 files changed, 122 insertions(+), 69 deletions(-) diff --git a/src/internal.c b/src/internal.c index 02bbfd6b6d..366b442c71 100644 --- a/src/internal.c +++ b/src/internal.c @@ -1677,8 +1677,10 @@ int InitSSL_Side(WOLFSSL* ssl, word16 side) defined(OPENSSL_EXTRA) static int ctxInitTicket(WOLFSSL_CTX* ctx) { - WC_RNG rng; int ret = 0; +#if (defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) \ + || (!defined(NO_AES) && defined(HAVE_AESGCM) && defined(HAVE_AESGCM)) + WC_RNG rng; ret = wc_InitRng(&rng); if (ret != 0) @@ -1689,59 +1691,102 @@ static int ctxInitTicket(WOLFSSL_CTX* ctx) if (ret == 0) ret = wc_RNG_GenerateBlock(&rng, ctx->ticketCompatKey, sizeof(ctx->ticketCompatKey)); - if (ret == 0) - ret = wc_RNG_GenerateBlock(&rng, - ctx->ticketCompatHmacKey, sizeof(ctx->ticketCompatHmacKey)); - if (ret == 0) - ret = wc_RNG_GenerateBlock(&rng, - ctx->ticketCompatIV, sizeof(ctx->ticketCompatIV)); wc_FreeRng(&rng); +#else + (void)ctx; +#endif return ret; } static WC_INLINE int myTicketEncCbCompat(WOLFSSL* ssl, - byte name[WOLFSSL_TICKET_NAME_SZ], - byte iv[WOLFSSL_TICKET_IV_SZ], - WOLFSSL_EVP_CIPHER_CTX *ectx, - WOLFSSL_HMAC_CTX *hctx, int enc) { + byte key_name[WOLFSSL_TICKET_NAME_SZ], + byte iv[WOLFSSL_TICKET_IV_SZ], + byte mac[WOLFSSL_TICKET_MAC_SZ], + int enc, byte* ticket, int inLen, int* outLen, + void* userCtx) { + int ret; + word16 sLen = XHTONS(inLen); + byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + 2]; + byte* tmp = aad; + WOLFSSL_ENTER("myTicketEncCbCompat"); - if (ssl == NULL || name == NULL || iv == NULL || ectx == NULL - || hctx == NULL) - return TICKET_KEY_CB_RET_FAILURE; + if (ssl == NULL || key_name == NULL || iv == NULL || mac == NULL + || ticket == NULL || outLen == NULL) + return WOLFSSL_TICKET_RET_FATAL; + + (void)userCtx; if (enc) { - XMEMCPY(name, ssl->ctx->ticketCompatName, sizeof(ssl->ctx->ticketCompatName)); - XMEMCPY(iv, ssl->ctx->ticketCompatIV, sizeof(ssl->ctx->ticketCompatIV)); - } - else if (XMEMCMP(name, ssl->ctx->ticketCompatName, - sizeof(ssl->ctx->ticketCompatName)) != 0 || - XMEMCMP(iv, ssl->ctx->ticketCompatIV, - sizeof(ssl->ctx->ticketCompatIV)) != 0) { - WOLFSSL_MSG("myTicketEncCbCompat: name or iv mismatch"); - return TICKET_KEY_CB_RET_NOT_FOUND; - } - if (wolfSSL_HMAC_Init(hctx, ssl->ctx->ticketCompatHmacKey, - WOLFSSL_TICKET_NAME_SZ, wolfSSL_EVP_sha256()) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("wolfSSL_HMAC_Init error"); - return TICKET_KEY_CB_RET_FAILURE; - } - if (enc) { - if (wolfSSL_EVP_EncryptInit(ectx, wolfSSL_EVP_aes_256_cbc(), - ssl->ctx->ticketCompatKey, iv) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("wolfSSL_EVP_EncryptInit error"); - return TICKET_KEY_CB_RET_FAILURE; - } + XMEMCPY(key_name, ssl->ctx->ticketCompatName, WOLFSSL_TICKET_NAME_SZ); + ret = wc_RNG_GenerateBlock(ssl->rng, iv, WOLFSSL_TICKET_IV_SZ); + if (ret != 0) return WOLFSSL_TICKET_RET_REJECT; } else { - if (wolfSSL_EVP_DecryptInit(ectx, wolfSSL_EVP_aes_256_cbc(), - ssl->ctx->ticketCompatKey, iv) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("wolfSSL_EVP_DecryptInit error"); - return TICKET_KEY_CB_RET_FAILURE; + /* see if we know this key */ + if (XMEMCMP(key_name, ssl->ctx->ticketCompatName, + WOLFSSL_TICKET_NAME_SZ) != 0){ + WOLFSSL_MSG("client presented unknown ticket key name"); + return WOLFSSL_TICKET_RET_FATAL; } } - return TICKET_KEY_CB_RET_OK; + + /* build aad from key name, iv, and length */ + XMEMCPY(tmp, key_name, WOLFSSL_TICKET_NAME_SZ); + tmp += WOLFSSL_TICKET_NAME_SZ; + XMEMCPY(tmp, iv, WOLFSSL_TICKET_IV_SZ); + tmp += WOLFSSL_TICKET_IV_SZ; + XMEMCPY(tmp, &sLen, 2); + + /* encrypt */ + if (enc) { +#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) + ret = wc_ChaCha20Poly1305_Encrypt(ssl->ctx->ticketCompatKey, iv, + aad, sizeof(aad), ticket, inLen, ticket, mac); +#elif !defined(NO_AES) && defined(HAVE_AESGCM) && defined(WOLFSSL_AES_256) + Aes aes; + ret = wc_AesInit(&aes, ssl->heap, INVALID_DEVID); + if (ret == 0) { + ret = wc_AesGcmSetKey(&aes, ssl->ctx->ticketCompatKey, AES_256_KEY_SIZE); + if (ret == 0) + ret = wc_AesGcmEncrypt(&aes, ticket, ticket, inLen, iv, + WOLFSSL_TICKET_IV_SZ, mac, AES_BLOCK_SIZE, + aad, sizeof(aad)); + wc_AesFree(&aes); + } +#else + WOLFSSL_MSG("Neither chacha20-poly1305 or aes-gcm available for " + "session ticket generation"); + return WOLFSSL_TICKET_RET_FATAL; +#endif + } + /* decrypt */ + else { +#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) + ret = wc_ChaCha20Poly1305_Decrypt(ssl->ctx->ticketCompatKey, iv, + aad, sizeof(aad), ticket, inLen, mac, ticket); +#elif !defined(NO_AES) && defined(HAVE_AESGCM) && defined(WOLFSSL_AES_256) + Aes aes; + ret = wc_AesInit(&aes, ssl->heap, INVALID_DEVID); + if (ret == 0) { + ret = wc_AesGcmSetKey(&aes, ssl->ctx->ticketCompatKey, AES_256_KEY_SIZE); + if (ret == 0) + ret = wc_AesGcmDecrypt(&aes, ticket, ticket, inLen, iv, + WOLFSSL_TICKET_IV_SZ, mac, AES_BLOCK_SIZE, + aad, sizeof(aad)); + wc_AesFree(&aes); + } +#else + WOLFSSL_MSG("Neither chacha20-poly1305 or aes-gcm available for " + "session ticket decryption"); + return WOLFSSL_TICKET_RET_FATAL; +#endif + } + if (ret != 0) return WOLFSSL_TICKET_RET_REJECT; + *outLen = inLen; /* no padding in this mode */ + + return WOLFSSL_TICKET_RET_OK; } #endif /* HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER && OPENSSL_EXTRA */ @@ -1900,14 +1945,17 @@ int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap) #ifdef OPENSSL_EXTRA if (ret == 0) ret = ctxInitTicket(ctx); +#if (defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) \ + || (!defined(NO_AES) && defined(HAVE_AESGCM) && defined(HAVE_AESGCM)) /* No need for compat ticket init flag since below callback setter is * only called when the above parameter generation has succeeded */ if (ret == 0 && - wolfSSL_CTX_set_tlsext_ticket_key_cb(ctx, myTicketEncCbCompat) + wolfSSL_CTX_set_TicketEncCb(ctx, myTicketEncCbCompat) != WOLFSSL_SUCCESS) ret = SESSION_SECRET_CB_E; #endif #endif +#endif #ifdef HAVE_WOLF_EVENT if (ret == 0) @@ -2054,10 +2102,9 @@ void SSL_CtxResourceFree(WOLFSSL_CTX* ctx) } #endif /* WOLFSSL_STATIC_MEMORY */ #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \ - defined(OPENSSL_EXTRA) + defined(OPENSSL_EXTRA) && ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) \ + || (!defined(NO_AES) && defined(HAVE_AESGCM) && defined(HAVE_AESGCM))) ForceZero(ctx->ticketCompatKey, sizeof(ctx->ticketCompatKey)); - ForceZero(ctx->ticketCompatHmacKey, sizeof(ctx->ticketCompatHmacKey)); - ForceZero(ctx->ticketCompatIV, sizeof(ctx->ticketCompatIV)); #endif } diff --git a/src/ssl.c b/src/ssl.c index 38d0861007..93b1f81eb9 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -15708,7 +15708,13 @@ int wolfSSL_set_compression(WOLFSSL* ssl) defined(OPENSSL_EXTRA) if (ctx->mask & SSL_OP_NO_TICKET) { ctx->ticketEncCb = NULL; - ctx->ticketCompatCb = NULL; + ctx->ticketEncCtx = NULL; + XMEMSET(ctx->ticketCompatName, 0, WOLFSSL_TICKET_NAME_SZ); +#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \ + defined(OPENSSL_EXTRA) && ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) \ + || (!defined(NO_AES) && defined(HAVE_AESGCM) && defined(HAVE_AESGCM))) + ForceZero(ctx->ticketCompatKey, sizeof(ctx->ticketCompatKey)); +#endif WOLFSSL_MSG("\tSSL_OP_NO_TICKET"); } #endif @@ -47618,7 +47624,12 @@ int wolfSSL_i2a_ASN1_INTEGER(BIO *bp, const WOLFSSL_ASN1_INTEGER *a) #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) - +/* Expected return values from implementations of OpenSSL ticket key callback. + */ +#define TICKET_KEY_CB_RET_FAILURE -1 +#define TICKET_KEY_CB_RET_NOT_FOUND 0 +#define TICKET_KEY_CB_RET_OK 1 +#define TICKET_KEY_CB_RET_RENEW 2 /* Implementation of session ticket encryption/decryption using OpenSSL * callback to initialize the cipher and HMAC. @@ -47637,11 +47648,11 @@ int wolfSSL_i2a_ASN1_INTEGER(BIO *bp, const WOLFSSL_ASN1_INTEGER *a) * WOLFSSL_TICKET_RET_FATAL on error. */ static int wolfSSL_TicketKeyCb(WOLFSSL* ssl, - unsigned char keyName[WOLFSSL_TICKET_NAME_SZ], - unsigned char iv[WOLFSSL_TICKET_IV_SZ], - unsigned char mac[WOLFSSL_TICKET_MAC_SZ], - int enc, unsigned char* encTicket, - int encTicketLen, int* encLen, void* ctx) + unsigned char keyName[WOLFSSL_TICKET_NAME_SZ], + unsigned char iv[WOLFSSL_TICKET_IV_SZ], + unsigned char mac[WOLFSSL_TICKET_MAC_SZ], + int enc, unsigned char* encTicket, + int encTicketLen, int* encLen, void* ctx) { byte digest[WC_MAX_DIGEST_SIZE]; WOLFSSL_EVP_CIPHER_CTX evpCtx; @@ -47655,18 +47666,19 @@ static int wolfSSL_TicketKeyCb(WOLFSSL* ssl, WOLFSSL_ENTER("wolfSSL_TicketKeyCb"); - if (ssl == NULL || ssl->ctx == NULL || ssl->ctx->ticketCompatCb == NULL) { + if (ssl == NULL || ssl->ctx == NULL || ssl->ctx->ticketEncCtx == NULL) { WOLFSSL_MSG("Bad parameter"); return WOLFSSL_TICKET_RET_FATAL; } + /* Initialize the cipher and HMAC. */ wolfSSL_EVP_CIPHER_CTX_init(&evpCtx); if (wolfSSL_HMAC_CTX_Init(&hmacCtx) != WOLFSSL_SUCCESS) { WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init error"); return WOLFSSL_TICKET_RET_FATAL; } - /* Initialize the cipher and HMAC. */ - res = ssl->ctx->ticketCompatCb(ssl, keyName, iv, &evpCtx, &hmacCtx, enc); + res = ((ticketCompatCb)ssl->ctx->ticketEncCtx)(ssl, keyName, + iv, &evpCtx, &hmacCtx, enc); if (res != TICKET_KEY_CB_RET_OK && res != TICKET_KEY_CB_RET_RENEW) { WOLFSSL_MSG("Ticket callback error"); return WOLFSSL_TICKET_RET_FATAL; @@ -47729,16 +47741,13 @@ end: * cb The OpenSSL session ticket callback. * returns WOLFSSL_SUCCESS to indicate success. */ -int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *ctx, int (*cb)( - WOLFSSL *ssl, unsigned char *name, unsigned char *iv, - WOLFSSL_EVP_CIPHER_CTX *ectx, WOLFSSL_HMAC_CTX *hctx, int enc)) +int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *ctx, ticketCompatCb cb) { - /* Store callback in a global. */ - ctx->ticketCompatCb = cb; /* Set the ticket encryption callback to be a wrapper around OpenSSL * callback. */ ctx->ticketEncCb = wolfSSL_TicketKeyCb; + ctx->ticketEncCtx = cb; return WOLFSSL_SUCCESS; } diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 9b02f70ba6..a2e6f2f96d 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -59,6 +59,9 @@ #ifdef HAVE_POLY1305 #include #endif +#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && defined(OPENSSL_EXTRA) + #include +#endif #ifdef HAVE_CAMELLIA #include #endif @@ -2932,6 +2935,7 @@ struct WOLFSSL_CTX { #endif #endif #endif + #endif #ifdef HAVE_SUPPORTED_CURVES byte userCurves; /* indicates user called wolfSSL_CTX_UseSupportedCurve */ #endif diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 6b70857687..9f6be4e20a 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -3252,13 +3252,6 @@ enum TicketEncRet { WOLFSSL_API int wolfSSL_CTX_NoTicketTLSv12(WOLFSSL_CTX* ctx); WOLFSSL_API int wolfSSL_NoTicketTLSv12(WOLFSSL* ssl); -/* Expected return values from implementations of OpenSSL ticket key callback. - */ -#define TICKET_KEY_CB_RET_FAILURE -1 -#define TICKET_KEY_CB_RET_NOT_FOUND 0 -#define TICKET_KEY_CB_RET_OK 1 -#define TICKET_KEY_CB_RET_RENEW 2 - typedef int (*SessionTicketEncCb)(WOLFSSL*, unsigned char key_name[WOLFSSL_TICKET_NAME_SZ], unsigned char iv[WOLFSSL_TICKET_IV_SZ], @@ -3993,9 +3986,9 @@ WOLFSSL_API int wolfSSL_i2a_ASN1_INTEGER(WOLFSSL_BIO *bp, const WOLFSSL_ASN1_INTEGER *a); #ifdef HAVE_SESSION_TICKET -WOLFSSL_API int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *, int (*)( - WOLFSSL *ssl, unsigned char *name, unsigned char *iv, - WOLFSSL_EVP_CIPHER_CTX *ectx, WOLFSSL_HMAC_CTX *hctx, int enc)); +typedef int (*ticketCompatCb)(WOLFSSL *ssl, unsigned char *name, unsigned char *iv, + WOLFSSL_EVP_CIPHER_CTX *ectx, WOLFSSL_HMAC_CTX *hctx, int enc); +WOLFSSL_API int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *, ticketCompatCb); #endif #if defined(HAVE_OCSP) || defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \ From 89fd0b375befd9b28c7b6a4065353fd30e36f405 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 20 Jan 2021 12:34:15 +0100 Subject: [PATCH 08/78] Correctly read anon cipher run-time options --- src/internal.c | 22 ++++++++++++++-------- src/ssl.c | 22 ++++++++++++++-------- src/tls13.c | 6 ++++-- wolfssl/internal.h | 4 +--- 4 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/internal.c b/src/internal.c index 366b442c71..178452af13 100644 --- a/src/internal.c +++ b/src/internal.c @@ -2427,7 +2427,7 @@ void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int haveRSAsig, void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA, word16 havePSK, word16 haveDH, word16 haveNTRU, word16 haveECDSAsig, word16 haveECC, - word16 haveStaticECC, int side) + word16 haveStaticECC, word16 haveAnon, int side) { word16 idx = 0; int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR; @@ -2449,6 +2449,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA, (void)side; (void)haveRSA; /* some builds won't read */ (void)haveRSAsig; /* non ecc builds won't read */ + (void)haveAnon; /* anon ciphers optional */ if (suites == NULL) { WOLFSSL_MSG("InitSuites pointer error"); @@ -2668,14 +2669,14 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA, #endif #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA - if (tls1_2 && haveDH) { + if (tls1_2 && haveDH && haveAnon) { suites->suites[idx++] = CIPHER_BYTE; suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA; } #endif #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384 - if (tls1_2 && haveDH) { + if (tls1_2 && haveDH && haveAnon) { suites->suites[idx++] = CIPHER_BYTE; suites->suites[idx++] = TLS_DH_anon_WITH_AES_256_GCM_SHA384; } @@ -5339,13 +5340,15 @@ int InitSSL_Suites(WOLFSSL* ssl) InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, ssl->options.haveDH, ssl->options.haveNTRU, ssl->options.haveECDSAsig, ssl->options.haveECC, - ssl->options.haveStaticECC, ssl->options.side); + ssl->options.haveStaticECC, ssl->options.haveAnon, + ssl->options.side); } else { InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, TRUE, ssl->options.haveNTRU, ssl->options.haveECDSAsig, ssl->options.haveECC, - ssl->options.haveStaticECC, ssl->options.side); + ssl->options.haveStaticECC, ssl->options.haveAnon, + ssl->options.side); } #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT) @@ -27656,7 +27659,8 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, ssl->options.haveDH, ssl->options.haveNTRU, ssl->options.haveECDSAsig, ssl->options.haveECC, - ssl->options.haveStaticECC, ssl->options.side); + ssl->options.haveStaticECC, ssl->options.haveAnon, + ssl->options.side); } /* suite size */ @@ -27986,7 +27990,8 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, ssl->options.haveDH, ssl->options.haveNTRU, ssl->options.haveECDSAsig, ssl->options.haveECC, - ssl->options.haveStaticECC, ssl->options.side); + ssl->options.haveStaticECC, ssl->options.haveAnon, + ssl->options.side); } #ifdef OPENSSL_EXTRA @@ -28048,7 +28053,8 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, ssl->options.haveDH, ssl->options.haveNTRU, ssl->options.haveECDSAsig, ssl->options.haveECC, - ssl->options.haveStaticECC, ssl->options.side); + ssl->options.haveStaticECC, ssl->options.haveAnon, + ssl->options.side); } } #endif diff --git a/src/ssl.c b/src/ssl.c index 93b1f81eb9..f8a86bcd5d 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -1792,7 +1792,8 @@ int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz, InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, ssl->options.haveDH, ssl->options.haveNTRU, ssl->options.haveECDSAsig, ssl->options.haveECC, - ssl->options.haveStaticECC, ssl->options.side); + ssl->options.haveStaticECC, ssl->options.haveAnon, + ssl->options.side); } WOLFSSL_LEAVE("wolfSSL_SetTmpDH", 0); @@ -4252,7 +4253,8 @@ int wolfSSL_SetVersion(WOLFSSL* ssl, int version) InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, ssl->options.haveDH, ssl->options.haveNTRU, ssl->options.haveECDSAsig, ssl->options.haveECC, - ssl->options.haveStaticECC, ssl->options.side); + ssl->options.haveStaticECC, ssl->options.haveAnon, + ssl->options.side); return WOLFSSL_SUCCESS; } @@ -5931,7 +5933,8 @@ int ProcessBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff, InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, ssl->options.haveDH, ssl->options.haveNTRU, ssl->options.haveECDSAsig, ssl->options.haveECC, - ssl->options.haveStaticECC, ssl->options.side); + ssl->options.haveStaticECC, ssl->options.haveAnon, + ssl->options.side); } return WOLFSSL_SUCCESS; @@ -14482,7 +14485,8 @@ int wolfSSL_set_compression(WOLFSSL* ssl) InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE, ssl->options.haveDH, ssl->options.haveNTRU, ssl->options.haveECDSAsig, ssl->options.haveECC, - ssl->options.haveStaticECC, ssl->options.side); + ssl->options.haveStaticECC, ssl->options.haveAnon, + ssl->options.side); } void wolfSSL_CTX_set_psk_server_callback(WOLFSSL_CTX* ctx, @@ -14516,7 +14520,8 @@ int wolfSSL_set_compression(WOLFSSL* ssl) InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE, ssl->options.haveDH, ssl->options.haveNTRU, ssl->options.haveECDSAsig, ssl->options.haveECC, - ssl->options.haveStaticECC, ssl->options.side); + ssl->options.haveStaticECC, ssl->options.haveAnon, + ssl->options.side); } const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl) @@ -27593,9 +27598,10 @@ long wolfSSL_set_options(WOLFSSL* ssl, long op) if (ssl->suites != NULL && ssl->options.side != WOLFSSL_NEITHER_END) InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, - ssl->options.haveDH, ssl->options.haveNTRU, - ssl->options.haveECDSAsig, ssl->options.haveECC, - ssl->options.haveStaticECC, ssl->options.side); + ssl->options.haveDH, ssl->options.haveNTRU, + ssl->options.haveECDSAsig, ssl->options.haveECC, + ssl->options.haveStaticECC, ssl->options.haveAnon, + ssl->options.side); return ssl->options.mask; } diff --git a/src/tls13.c b/src/tls13.c index b2fd50f2fb..f7a9e2c47f 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -8197,7 +8197,8 @@ void wolfSSL_set_psk_client_tls13_callback(WOLFSSL* ssl, InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE, ssl->options.haveDH, ssl->options.haveNTRU, ssl->options.haveECDSAsig, ssl->options.haveECC, - ssl->options.haveStaticECC, ssl->options.side); + ssl->options.haveStaticECC, ssl->options.haveAnon, + ssl->options.side); } @@ -8234,7 +8235,8 @@ void wolfSSL_set_psk_server_tls13_callback(WOLFSSL* ssl, InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE, ssl->options.haveDH, ssl->options.haveNTRU, ssl->options.haveECDSAsig, ssl->options.haveECC, - ssl->options.haveStaticECC, ssl->options.side); + ssl->options.haveStaticECC, ssl->options.haveAnon, + ssl->options.side); } #endif diff --git a/wolfssl/internal.h b/wolfssl/internal.h index a2e6f2f96d..5269bbd00a 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -1873,7 +1873,7 @@ WOLFSSL_LOCAL void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int haveRSAsig, int haveAnon, int tls1_2, int keySz); WOLFSSL_LOCAL void InitSuites(Suites*, ProtocolVersion, int, word16, word16, - word16, word16, word16, word16, word16, int); + word16, word16, word16, word16, word16, word16, int); WOLFSSL_LOCAL int MatchSuite(WOLFSSL* ssl, Suites* peerSuites); WOLFSSL_LOCAL int SetCipherList(WOLFSSL_CTX*, Suites*, const char* list); @@ -3539,9 +3539,7 @@ typedef struct Options { #ifdef HAVE_POLY1305 word16 oldPoly:1; /* set when to use old rfc way of poly*/ #endif -#ifdef HAVE_ANON word16 haveAnon:1; /* User wants to allow Anon suites */ -#endif #ifdef HAVE_SESSION_TICKET word16 createTicket:1; /* Server to create new Ticket */ word16 useTicket:1; /* Use Ticket not session cache */ From 7ce3860e19d9ffffcdbcfdb3947192a1b63564f3 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Wed, 17 Feb 2021 09:24:22 +1000 Subject: [PATCH 09/78] MP small: mp_add_d doesn't support adding a digit greater than MP_DIGIT_MAX --- wolfcrypt/src/integer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wolfcrypt/src/integer.c b/wolfcrypt/src/integer.c index 81987f96d0..40eaf5ceef 100644 --- a/wolfcrypt/src/integer.c +++ b/wolfcrypt/src/integer.c @@ -4302,6 +4302,8 @@ int mp_add_d (mp_int* a, mp_digit b, mp_int* c) int res, ix, oldused; mp_digit *tmpa, *tmpc, mu; + if (b > MP_DIGIT_MAX) return MP_VAL; + /* grow c as required */ if (c->alloc < a->used + 1) { if ((res = mp_grow(c, a->used + 1)) != MP_OKAY) { From 400a1d6927a0110b23affaca4c69a8c1580d67d1 Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Mon, 15 Feb 2021 12:17:10 +0100 Subject: [PATCH 10/78] Compile wolfSSL_ASN1_TIME_set_string() independently of NO_WOLFSSL_STUB --- src/ssl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ssl.c b/src/ssl.c index 609f1c1cac..e6600bab4a 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -29585,6 +29585,7 @@ WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_set(WOLFSSL_ASN1_TIME *s, time_t t) (void)t; return s; } +#endif /* !NO_WOLFSSL_STUB */ int wolfSSL_ASN1_TIME_set_string(WOLFSSL_ASN1_TIME *s, const char *str) { @@ -29607,7 +29608,6 @@ int wolfSSL_ASN1_TIME_set_string(WOLFSSL_ASN1_TIME *s, const char *str) } return WOLFSSL_SUCCESS; } -#endif /* !NO_WOLFSSL_STUB */ #ifndef NO_BIO From 2002ae9dca894db1bef95504b0ac248d42479be8 Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Mon, 15 Feb 2021 12:20:48 +0100 Subject: [PATCH 11/78] tests/api.c: Fix build with NO_WOLFSSL_STUB defined --- tests/api.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/api.c b/tests/api.c index 6a2283663e..092e3854c8 100644 --- a/tests/api.c +++ b/tests/api.c @@ -34430,7 +34430,7 @@ static void test_wolfSSL_EVP_PKEY_keygen_init(void) } static void test_wolfSSL_EVP_PKEY_missing_parameters(void) { -#if defined(OPENSSL_ALL) +#if defined(OPENSSL_ALL) && !defined(NO_WOLFSSL_STUB) WOLFSSL_EVP_PKEY* pkey; printf(testingFmt, "wolfSSL_EVP_PKEY_missing_parameters"); @@ -34715,7 +34715,7 @@ static void test_wolfSSL_EVP_aes_192_gcm(void) } static void test_wolfSSL_EVP_ripemd160(void) { -#if defined(OPENSSL_ALL) +#if defined(OPENSSL_ALL) && !defined(NO_WOLFSSL_STUB) printf(testingFmt, "wolfSSL_EVP_ripemd160"); From c7b1dc8f941355af75f89a29406af359bba2c7db Mon Sep 17 00:00:00 2001 From: Tesfa Mael Date: Fri, 19 Feb 2021 16:39:45 -0800 Subject: [PATCH 12/78] Fix Cryptocell ECC tests --- IDE/CRYPTOCELL/user_settings.h | 1 + wolfcrypt/src/ecc.c | 36 ++++++++++++++++++---------------- wolfcrypt/test/test.c | 11 +++++++---- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/IDE/CRYPTOCELL/user_settings.h b/IDE/CRYPTOCELL/user_settings.h index bbc3bab28a..2d85c910cd 100644 --- a/IDE/CRYPTOCELL/user_settings.h +++ b/IDE/CRYPTOCELL/user_settings.h @@ -41,6 +41,7 @@ extern "C" { #endif #if defined(WOLFSSL_CRYPTOCELL) + /* see SASI_AES_KEY_MAX_SIZE_IN_BYTES in the nRF5 SDK */ #define AES_MAX_KEY_SIZE 128 #endif /* WOLFSSL_CRYPTOCELL*/ diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index f073f0c3a2..b7b56e5d60 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -4542,7 +4542,7 @@ int wc_ecc_make_key_ex2(WC_RNG* rng, int keysize, ecc_key* key, int curve_id, } #elif defined(WOLFSSL_CRYPTOCELL) - pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(curve_id)); + pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(key->dp->id)); raw_size = (word32)(key->dp->size)*2 + 1; /* generate first key pair */ @@ -7950,7 +7950,23 @@ int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key, #ifdef WOLFSSL_SILABS_SE_ACCEL err = silabs_ecc_import(key, keysize); #endif +#ifdef WOLFSSL_CRYPTOCELL + const CRYS_ECPKI_Domain_t* pDomain; + CRYS_ECPKI_BUILD_TempData_t tempBuff; + pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(key->dp->id)); + + /* create public key from external key buffer */ + err = CRYS_ECPKI_BuildPublKeyFullCheck(pDomain, + (byte*)in-1, /* re-adjust */ + inLen+1, /* original input */ + &key->ctx.pubKey, + &tempBuff); + + if (err != SA_SILIB_RET_OK){ + WOLFSSL_MSG("CRYS_ECPKI_BuildPublKeyFullCheck failed"); + } +#endif #ifdef WOLFSSL_VALIDATE_ECC_IMPORT if (err == MP_OKAY) err = wc_ecc_check_key(key); @@ -8110,21 +8126,7 @@ int wc_ecc_import_private_key_ex(const byte* priv, word32 privSz, return ret; #ifdef WOLFSSL_CRYPTOCELL - pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(curve_id)); - - if (pub != NULL && pub[0] != '\0') { - /* create public key from external key buffer */ - ret = CRYS_ECPKI_BuildPublKeyFullCheck(pDomain, - (byte*)pub, - pubSz, - &key->ctx.pubKey, - &tempBuff); - - if (ret != SA_SILIB_RET_OK){ - WOLFSSL_MSG("CRYS_ECPKI_BuildPublKeyFullCheck failed"); - return ret; - } - } + pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(key->dp->id)); /* import private key */ if (priv != NULL && priv[0] != '\0') { @@ -8396,7 +8398,7 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx, } if (err == MP_OKAY) { - pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(curve_id)); + pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(key->dp->id)); /* create public key from external key buffer */ err = CRYS_ECPKI_BuildPublKeyFullCheck(pDomain, diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 1d1bc566b6..d10a34697d 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -7700,7 +7700,8 @@ static int aes_key_size_test(void) if (ret != 0 || keySize != sizeof(key16)) ERROR_OUT(-5310, out); #endif - +#if !defined(WOLFSSL_CRYPTOCELL) +/* Cryptocell only supports AES-128 key size */ ret = wc_AesSetKey(aes, key24, sizeof(key24), iv, AES_ENCRYPTION); #ifdef WOLFSSL_AES_192 if (ret != 0) @@ -7726,7 +7727,7 @@ static int aes_key_size_test(void) if (ret != 0 || keySize != sizeof(key32)) ERROR_OUT(-5314, out); #endif - +#endif /* !WOLFSSL_CRYPTOCELL */ out: #ifdef WOLFSSL_SMALL_STACK @@ -21367,7 +21368,9 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, #ifdef HAVE_ECC_SIGN /* ECC w/out Shamir has issue with all 0 digest */ /* WC_BIGINT doesn't have 0 len well on hardware */ -#if defined(ECC_SHAMIR) && !defined(WOLFSSL_ASYNC_CRYPT) + /* Cryptocell has issues with all 0 digest */ +#if defined(ECC_SHAMIR) && !defined(WOLFSSL_ASYNC_CRYPT) && \ + !defined(WOLFSSL_CRYPTOCELL) /* test DSA sign hash with zeros */ for (i = 0; i < (int)ECC_DIGEST_SIZE; i++) { digest[i] = 0; @@ -21404,7 +21407,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, TEST_SLEEP(); } #endif /* HAVE_ECC_VERIFY */ -#endif /* ECC_SHAMIR && !WOLFSSL_ASYNC_CRYPT */ +#endif /* ECC_SHAMIR && !WOLFSSL_ASYNC_CRYPT && !WOLFSSL_CRYPTOCELL */ /* test DSA sign hash with sequence (0,1,2,3,4,...) */ for (i = 0; i < (int)ECC_DIGEST_SIZE; i++) { From 1b319804ad5aa4bb36d7cf6da21bcfd6407b82a2 Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Fri, 19 Feb 2021 19:56:07 +0100 Subject: [PATCH 13/78] configure: When enabling --enable-sp-asm, accept host_cpu amd64 as alternative to x86_64 Allows to use --enable-sp-asm on ElectroBSD amd64. Previouly configure failed with: configure: error: ASM not available for CPU. Supported CPUs: x86_64, aarch64, arm --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index dd8a6ac74f..8120c3f983 100644 --- a/configure.ac +++ b/configure.ac @@ -5242,7 +5242,7 @@ if test "$ENABLED_SP_ASM" = "yes"; then fi fi ;; - *x86_64*) + *x86_64*|*amd64*) AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_X86_64_ASM" AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_X86_64_ASM" ENABLED_SP_X86_64_ASM=yes From 9e4dcfb66ce20f1271c02a56ee74fe050040019c Mon Sep 17 00:00:00 2001 From: TakayukiMatsuo Date: Tue, 23 Feb 2021 11:12:12 +0900 Subject: [PATCH 14/78] Add wolfSSL_BIO_tell --- src/bio.c | 19 +++++++++++++++++++ tests/api.c | 6 ++++++ wolfssl/openssl/bio.h | 1 + wolfssl/ssl.h | 1 + 4 files changed, 27 insertions(+) diff --git a/src/bio.c b/src/bio.c index d80b7c0960..74535614e2 100644 --- a/src/bio.c +++ b/src/bio.c @@ -1439,6 +1439,25 @@ int wolfSSL_BIO_seek(WOLFSSL_BIO *bio, int ofs) return 0; } +int wolfSSL_BIO_tell(WOLFSSL_BIO* bio) +{ + WOLFSSL_ENTER("wolfSSL_BIO_tell"); + int pos; + + if (bio == NULL) { + return -1; + } + + if (bio->type != WOLFSSL_BIO_FILE) { + return 0; + } + + pos =(int) XFTELL((XFILE)bio->ptr); + if(pos < 0) + return -1; + else + return pos; +} #endif /* NO_FILESYSTEM */ diff --git a/tests/api.c b/tests/api.c index 6a2283663e..08c4ddf01c 100644 --- a/tests/api.c +++ b/tests/api.c @@ -29222,12 +29222,18 @@ static void test_wolfSSL_BIO(void) WOLFSSL_SUCCESS); AssertIntEQ(BIO_read(f_bio1, cert, sizeof(cert)), sizeof(cert)); + AssertIntEQ(BIO_tell(f_bio1),sizeof(cert)); AssertIntEQ(BIO_write(f_bio2, msg, sizeof(msg)), sizeof(msg)); + AssertIntEQ(BIO_tell(f_bio2),sizeof(msg)); AssertIntEQ(BIO_write(f_bio2, cert, sizeof(cert)), sizeof(cert)); + AssertIntEQ(BIO_tell(f_bio2),sizeof(cert) + sizeof(msg)); AssertIntEQ((int)BIO_get_fp(f_bio2, &f2), WOLFSSL_SUCCESS); AssertIntEQ(BIO_reset(f_bio2), 0); + AssertIntEQ(BIO_tell(NULL),-1); + AssertIntEQ(BIO_tell(f_bio2),0); AssertIntEQ(BIO_seek(f_bio2, 4), 0); + AssertIntEQ(BIO_tell(f_bio2),4); BIO_free(f_bio1); BIO_free(f_bio2); diff --git a/wolfssl/openssl/bio.h b/wolfssl/openssl/bio.h index c5786b73a4..edafd2152b 100644 --- a/wolfssl/openssl/bio.h +++ b/wolfssl/openssl/bio.h @@ -68,6 +68,7 @@ #define BIO_set_fp wolfSSL_BIO_set_fp #define BIO_get_fp wolfSSL_BIO_get_fp #define BIO_seek wolfSSL_BIO_seek +#define BIO_tell wolfSSL_BIO_tell #define BIO_write_filename wolfSSL_BIO_write_filename #define BIO_set_mem_eof_return wolfSSL_BIO_set_mem_eof_return diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 0c81c9b771..d1b70c0cd5 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1336,6 +1336,7 @@ WOLFSSL_API int wolfSSL_BIO_nwrite(WOLFSSL_BIO *bio, char **buf, int num); WOLFSSL_API int wolfSSL_BIO_reset(WOLFSSL_BIO *bio); WOLFSSL_API int wolfSSL_BIO_seek(WOLFSSL_BIO *bio, int ofs); +WOLFSSL_API int wolfSSL_BIO_tell(WOLFSSL_BIO* bio); WOLFSSL_API int wolfSSL_BIO_write_filename(WOLFSSL_BIO *bio, char *name); WOLFSSL_API long wolfSSL_BIO_set_mem_eof_return(WOLFSSL_BIO *bio, int v); WOLFSSL_API long wolfSSL_BIO_get_mem_ptr(WOLFSSL_BIO *bio, WOLFSSL_BUF_MEM **m); From d074e7443f8d3da8d66b061665ab1ef84f65185f Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 10 Feb 2021 11:49:49 +0100 Subject: [PATCH 15/78] Remove default ticket cb as this will be added in another PR --- examples/echoserver/echoserver.c | 6 -- examples/server/server.c | 6 -- src/internal.c | 135 ------------------------------- src/ssl.c | 6 -- tests/api.c | 82 ++++++++++++++++++- wolfssl/internal.h | 2 - wolfssl/test.h | 74 +++-------------- 7 files changed, 88 insertions(+), 223 deletions(-) diff --git a/examples/echoserver/echoserver.c b/examples/echoserver/echoserver.c index d864f8cb2e..1ef3007f84 100644 --- a/examples/echoserver/echoserver.c +++ b/examples/echoserver/echoserver.c @@ -169,14 +169,8 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args) ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || defined(HAVE_AESGCM)) if (TicketInit() != 0) err_sys("unable to setup Session Ticket Key context"); -#ifdef OPENSSL_EXTRA - /* In OpenSSL compat case, the compat layer handles the session - * tickets internally by default */ -#elif ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || \ - defined(HAVE_AESGCM)) wolfSSL_CTX_set_TicketEncCb(ctx, myTicketEncCb); #endif -#endif #ifndef NO_FILESYSTEM if (doPSK == 0) { diff --git a/examples/server/server.c b/examples/server/server.c index 2260fa46c3..05b6f2f548 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -1804,14 +1804,8 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || defined(HAVE_AESGCM)) if (TicketInit() != 0) err_sys_ex(catastrophic, "unable to setup Session Ticket Key context"); -#ifdef OPENSSL_EXTRA - /* In OpenSSL compat case, the compat layer handles the session - * tickets internally by default */ -#elif ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || \ - defined(HAVE_AESGCM)) wolfSSL_CTX_set_TicketEncCb(ctx, myTicketEncCb); #endif -#endif #if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_STATIC_EPHEMERAL) /* used for testing only to set a static/fixed ephemeral key diff --git a/src/internal.c b/src/internal.c index 178452af13..70199b2b38 100644 --- a/src/internal.c +++ b/src/internal.c @@ -1673,123 +1673,6 @@ int InitSSL_Side(WOLFSSL* ssl, word16 side) } #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */ -#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \ - defined(OPENSSL_EXTRA) -static int ctxInitTicket(WOLFSSL_CTX* ctx) -{ - int ret = 0; -#if (defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) \ - || (!defined(NO_AES) && defined(HAVE_AESGCM) && defined(HAVE_AESGCM)) - WC_RNG rng; - - ret = wc_InitRng(&rng); - if (ret != 0) - return ret; - - ret = wc_RNG_GenerateBlock(&rng, - ctx->ticketCompatName, sizeof(ctx->ticketCompatName)); - if (ret == 0) - ret = wc_RNG_GenerateBlock(&rng, - ctx->ticketCompatKey, sizeof(ctx->ticketCompatKey)); - - wc_FreeRng(&rng); -#else - (void)ctx; -#endif - return ret; -} - -static WC_INLINE int myTicketEncCbCompat(WOLFSSL* ssl, - byte key_name[WOLFSSL_TICKET_NAME_SZ], - byte iv[WOLFSSL_TICKET_IV_SZ], - byte mac[WOLFSSL_TICKET_MAC_SZ], - int enc, byte* ticket, int inLen, int* outLen, - void* userCtx) { - int ret; - word16 sLen = XHTONS(inLen); - byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + 2]; - byte* tmp = aad; - - WOLFSSL_ENTER("myTicketEncCbCompat"); - - if (ssl == NULL || key_name == NULL || iv == NULL || mac == NULL - || ticket == NULL || outLen == NULL) - return WOLFSSL_TICKET_RET_FATAL; - - (void)userCtx; - - if (enc) { - XMEMCPY(key_name, ssl->ctx->ticketCompatName, WOLFSSL_TICKET_NAME_SZ); - ret = wc_RNG_GenerateBlock(ssl->rng, iv, WOLFSSL_TICKET_IV_SZ); - if (ret != 0) return WOLFSSL_TICKET_RET_REJECT; - } - else { - /* see if we know this key */ - if (XMEMCMP(key_name, ssl->ctx->ticketCompatName, - WOLFSSL_TICKET_NAME_SZ) != 0){ - WOLFSSL_MSG("client presented unknown ticket key name"); - return WOLFSSL_TICKET_RET_FATAL; - } - } - - /* build aad from key name, iv, and length */ - XMEMCPY(tmp, key_name, WOLFSSL_TICKET_NAME_SZ); - tmp += WOLFSSL_TICKET_NAME_SZ; - XMEMCPY(tmp, iv, WOLFSSL_TICKET_IV_SZ); - tmp += WOLFSSL_TICKET_IV_SZ; - XMEMCPY(tmp, &sLen, 2); - - /* encrypt */ - if (enc) { -#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) - ret = wc_ChaCha20Poly1305_Encrypt(ssl->ctx->ticketCompatKey, iv, - aad, sizeof(aad), ticket, inLen, ticket, mac); -#elif !defined(NO_AES) && defined(HAVE_AESGCM) && defined(WOLFSSL_AES_256) - Aes aes; - ret = wc_AesInit(&aes, ssl->heap, INVALID_DEVID); - if (ret == 0) { - ret = wc_AesGcmSetKey(&aes, ssl->ctx->ticketCompatKey, AES_256_KEY_SIZE); - if (ret == 0) - ret = wc_AesGcmEncrypt(&aes, ticket, ticket, inLen, iv, - WOLFSSL_TICKET_IV_SZ, mac, AES_BLOCK_SIZE, - aad, sizeof(aad)); - wc_AesFree(&aes); - } -#else - WOLFSSL_MSG("Neither chacha20-poly1305 or aes-gcm available for " - "session ticket generation"); - return WOLFSSL_TICKET_RET_FATAL; -#endif - } - /* decrypt */ - else { -#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) - ret = wc_ChaCha20Poly1305_Decrypt(ssl->ctx->ticketCompatKey, iv, - aad, sizeof(aad), ticket, inLen, mac, ticket); -#elif !defined(NO_AES) && defined(HAVE_AESGCM) && defined(WOLFSSL_AES_256) - Aes aes; - ret = wc_AesInit(&aes, ssl->heap, INVALID_DEVID); - if (ret == 0) { - ret = wc_AesGcmSetKey(&aes, ssl->ctx->ticketCompatKey, AES_256_KEY_SIZE); - if (ret == 0) - ret = wc_AesGcmDecrypt(&aes, ticket, ticket, inLen, iv, - WOLFSSL_TICKET_IV_SZ, mac, AES_BLOCK_SIZE, - aad, sizeof(aad)); - wc_AesFree(&aes); - } -#else - WOLFSSL_MSG("Neither chacha20-poly1305 or aes-gcm available for " - "session ticket decryption"); - return WOLFSSL_TICKET_RET_FATAL; -#endif - } - if (ret != 0) return WOLFSSL_TICKET_RET_REJECT; - *outLen = inLen; /* no padding in this mode */ - - return WOLFSSL_TICKET_RET_OK; -} -#endif /* HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER && OPENSSL_EXTRA */ - /* Initialize SSL context, return 0 on success */ int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap) { @@ -1942,19 +1825,6 @@ int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap) ctx->ticketEncCtx = (void*)&ctx->ticketKeyCtx; #endif ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT; -#ifdef OPENSSL_EXTRA - if (ret == 0) - ret = ctxInitTicket(ctx); -#if (defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) \ - || (!defined(NO_AES) && defined(HAVE_AESGCM) && defined(HAVE_AESGCM)) - /* No need for compat ticket init flag since below callback setter is - * only called when the above parameter generation has succeeded */ - if (ret == 0 && - wolfSSL_CTX_set_TicketEncCb(ctx, myTicketEncCbCompat) - != WOLFSSL_SUCCESS) - ret = SESSION_SECRET_CB_E; -#endif -#endif #endif #ifdef HAVE_WOLF_EVENT @@ -2101,11 +1971,6 @@ void SSL_CtxResourceFree(WOLFSSL_CTX* ctx) } } #endif /* WOLFSSL_STATIC_MEMORY */ -#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \ - defined(OPENSSL_EXTRA) && ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) \ - || (!defined(NO_AES) && defined(HAVE_AESGCM) && defined(HAVE_AESGCM))) - ForceZero(ctx->ticketCompatKey, sizeof(ctx->ticketCompatKey)); -#endif } diff --git a/src/ssl.c b/src/ssl.c index f8a86bcd5d..dcd950fc83 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -15714,12 +15714,6 @@ int wolfSSL_set_compression(WOLFSSL* ssl) if (ctx->mask & SSL_OP_NO_TICKET) { ctx->ticketEncCb = NULL; ctx->ticketEncCtx = NULL; - XMEMSET(ctx->ticketCompatName, 0, WOLFSSL_TICKET_NAME_SZ); -#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \ - defined(OPENSSL_EXTRA) && ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) \ - || (!defined(NO_AES) && defined(HAVE_AESGCM) && defined(HAVE_AESGCM))) - ForceZero(ctx->ticketCompatKey, sizeof(ctx->ticketCompatKey)); -#endif WOLFSSL_MSG("\tSSL_OP_NO_TICKET"); } #endif diff --git a/tests/api.c b/tests/api.c index 6c10128dc8..d3ed6e13bb 100644 --- a/tests/api.c +++ b/tests/api.c @@ -2605,6 +2605,75 @@ static int nonblocking_accept_read(void* args, WOLFSSL* ssl, SOCKET_T* sockfd) } #endif /* WOLFSSL_SESSION_EXPORT */ + +#if defined(HAVE_SESSION_TICKET) && \ + ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || defined(HAVE_AESGCM)) && \ + defined(OPENSSL_EXTRA) + + typedef struct openssl_key_ctx { + byte name[WOLFSSL_TICKET_NAME_SZ]; /* server name */ + byte key[AES_256_KEY_SIZE]; /* cipher key */ + byte hmacKey[WOLFSSL_TICKET_NAME_SZ]; /* hmac key */ + byte iv[WOLFSSL_TICKET_IV_SZ]; /* cipher iv */ + } openssl_key_ctx; + + static THREAD_LS_T openssl_key_ctx myOpenSSLKey_ctx; + static THREAD_LS_T WC_RNG myOpenSSLKey_rng; + + static WC_INLINE int OpenSSLTicketInit(void) + { + int ret = wc_InitRng(&myOpenSSLKey_rng); + if (ret != 0) return ret; + + ret = wc_RNG_GenerateBlock(&myOpenSSLKey_rng, myOpenSSLKey_ctx.name, + sizeof(myOpenSSLKey_ctx.name)); + if (ret != 0) return ret; + + ret = wc_RNG_GenerateBlock(&myOpenSSLKey_rng, myOpenSSLKey_ctx.key, + sizeof(myOpenSSLKey_ctx.key)); + if (ret != 0) return ret; + + ret = wc_RNG_GenerateBlock(&myOpenSSLKey_rng, myOpenSSLKey_ctx.hmacKey, + sizeof(myOpenSSLKey_ctx.hmacKey)); + if (ret != 0) return ret; + + ret = wc_RNG_GenerateBlock(&myOpenSSLKey_rng, myOpenSSLKey_ctx.iv, + sizeof(myOpenSSLKey_ctx.iv)); + if (ret != 0) return ret; + + return 0; + } + + static WC_INLINE int myTicketEncCbOpenSSL(WOLFSSL* ssl, + byte name[WOLFSSL_TICKET_NAME_SZ], + byte iv[WOLFSSL_TICKET_IV_SZ], + WOLFSSL_EVP_CIPHER_CTX *ectx, + WOLFSSL_HMAC_CTX *hctx, int enc) { + (void)ssl; + if (enc) { + XMEMCPY(name, myOpenSSLKey_ctx.name, sizeof(myOpenSSLKey_ctx.name)); + XMEMCPY(iv, myOpenSSLKey_ctx.iv, sizeof(myOpenSSLKey_ctx.iv)); + } + else if (XMEMCMP(name, myOpenSSLKey_ctx.name, + sizeof(myOpenSSLKey_ctx.name)) != 0 || + XMEMCMP(iv, myOpenSSLKey_ctx.iv, + sizeof(myOpenSSLKey_ctx.iv)) != 0) { + return 0; + } + HMAC_Init_ex(hctx, myOpenSSLKey_ctx.hmacKey, WOLFSSL_TICKET_NAME_SZ, EVP_sha256(), NULL); + if (enc) + EVP_EncryptInit_ex(ectx, EVP_aes_256_cbc(), NULL, myOpenSSLKey_ctx.key, iv); + else + EVP_DecryptInit_ex(ectx, EVP_aes_256_cbc(), NULL, myOpenSSLKey_ctx.key, iv); + return 1; + } + + static WC_INLINE void OpenSSLTicketCleanup(void) + { + wc_FreeRng(&myOpenSSLKey_rng); + } +#endif + static THREAD_RETURN WOLFSSL_THREAD test_server_nofail(void* args) { SOCKET_T sockfd = 0; @@ -2646,12 +2715,13 @@ static THREAD_RETURN WOLFSSL_THREAD test_server_nofail(void* args) ctx = wolfSSL_CTX_new(method); } -#if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \ +#if defined(HAVE_SESSION_TICKET) && \ ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || defined(HAVE_AESGCM)) - TicketInit(); #ifdef OPENSSL_EXTRA + OpenSSLTicketInit(); wolfSSL_CTX_set_tlsext_ticket_key_cb(ctx, myTicketEncCbOpenSSL); -#else +#elif defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) + TicketInit(); wolfSSL_CTX_set_TicketEncCb(ctx, myTicketEncCb); #endif #endif @@ -2837,10 +2907,14 @@ done: wc_ecc_fp_free(); /* free per thread cache */ #endif -#if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \ +#if defined(HAVE_SESSION_TICKET) && \ ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || defined(HAVE_AESGCM)) +#ifdef OPENSSL_EXTRA + OpenSSLTicketCleanup(); +#elif defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) TicketCleanup(); #endif +#endif #ifndef WOLFSSL_TIRTOS return 0; diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 5269bbd00a..aebfb3a697 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -2935,11 +2935,9 @@ struct WOLFSSL_CTX { #endif #endif #endif - #endif #ifdef HAVE_SUPPORTED_CURVES byte userCurves; /* indicates user called wolfSSL_CTX_UseSupportedCurve */ #endif -#endif #ifdef ATOMIC_USER CallbackMacEncrypt MacEncryptCb; /* Atomic User Mac/Encrypt Cb */ CallbackDecryptVerify DecryptVerifyCb; /* Atomic User Decrypt/Verify Cb */ diff --git a/wolfssl/test.h b/wolfssl/test.h index 6e0df1ceb2..5da853e609 100644 --- a/wolfssl/test.h +++ b/wolfssl/test.h @@ -3930,71 +3930,10 @@ static WC_INLINE const char* mymktemp(char *tempfn, int len, int num) } + #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \ ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || \ defined(HAVE_AESGCM)) - static THREAD_LS_T WC_RNG myKey_rng; - - static WC_INLINE void TicketCleanup(void) - { - wc_FreeRng(&myKey_rng); - } - -#ifdef OPENSSL_EXTRA - - typedef struct key_ctx { - byte name[WOLFSSL_TICKET_NAME_SZ]; /* server name */ - byte key[AES_256_KEY_SIZE]; /* cipher key */ - byte hmacKey[WOLFSSL_TICKET_NAME_SZ]; /* hmac key */ - byte iv[WOLFSSL_TICKET_IV_SZ]; /* cipher iv */ - } key_ctx; - - static THREAD_LS_T key_ctx myKey_ctx; - - static WC_INLINE int TicketInit(void) - { - int ret = wc_InitRng(&myKey_rng); - if (ret != 0) return ret; - - ret = wc_RNG_GenerateBlock(&myKey_rng, myKey_ctx.name, sizeof(myKey_ctx.name)); - if (ret != 0) return ret; - - ret = wc_RNG_GenerateBlock(&myKey_rng, myKey_ctx.key, sizeof(myKey_ctx.key)); - if (ret != 0) return ret; - - ret = wc_RNG_GenerateBlock(&myKey_rng, myKey_ctx.hmacKey, sizeof(myKey_ctx.hmacKey)); - if (ret != 0) return ret; - - ret = wc_RNG_GenerateBlock(&myKey_rng, myKey_ctx.iv,sizeof(myKey_ctx.iv)); - if (ret != 0) return ret; - - return 0; - } - - static WC_INLINE int myTicketEncCbOpenSSL(WOLFSSL* ssl, - byte name[WOLFSSL_TICKET_NAME_SZ], - byte iv[WOLFSSL_TICKET_IV_SZ], - WOLFSSL_EVP_CIPHER_CTX *ectx, - WOLFSSL_HMAC_CTX *hctx, int enc) { - (void)ssl; - if (enc) { - XMEMCPY(name, myKey_ctx.name, sizeof(myKey_ctx.name)); - XMEMCPY(iv, myKey_ctx.iv, sizeof(myKey_ctx.iv)); - } - else if (XMEMCMP(name, myKey_ctx.name, sizeof(myKey_ctx.name)) != 0 || - XMEMCMP(iv, myKey_ctx.iv, sizeof(myKey_ctx.iv)) != 0) { - return 0; - } - HMAC_Init_ex(hctx, myKey_ctx.hmacKey, WOLFSSL_TICKET_NAME_SZ, EVP_sha256(), NULL); - if (enc) - EVP_EncryptInit_ex(ectx, EVP_aes_256_cbc(), NULL, myKey_ctx.key, iv); - else - EVP_DecryptInit_ex(ectx, EVP_aes_256_cbc(), NULL, myKey_ctx.key, iv); - return 1; - } - -#elif ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || \ - defined(HAVE_AESGCM)) #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) #include @@ -4011,6 +3950,7 @@ static WC_INLINE const char* mymktemp(char *tempfn, int len, int num) } key_ctx; static THREAD_LS_T key_ctx myKey_ctx; + static THREAD_LS_T WC_RNG myKey_rng; static WC_INLINE int TicketInit(void) { @@ -4026,6 +3966,11 @@ static WC_INLINE const char* mymktemp(char *tempfn, int len, int num) return 0; } + static WC_INLINE void TicketCleanup(void) + { + wc_FreeRng(&myKey_rng); + } + static WC_INLINE int myTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ], byte iv[WOLFSSL_TICKET_IV_SZ], @@ -4123,8 +4068,9 @@ static WC_INLINE const char* mymktemp(char *tempfn, int len, int num) return WOLFSSL_TICKET_RET_OK; } -#endif /* OPENSSL_EXTRA elif ((HAVE_CHACHA && HAVE_POLY1305) || HAVE_AESGCM) */ -#endif /* HAVE_SESSION_TICKET */ + +#endif /* HAVE_SESSION_TICKET && ((HAVE_CHACHA && HAVE_POLY1305) || HAVE_AESGCM) */ + static WC_INLINE word16 GetRandomPort(void) { From 362d2a2d6837b22feac393223c151508de6362d7 Mon Sep 17 00:00:00 2001 From: TakayukiMatsuo Date: Wed, 24 Feb 2021 01:07:45 +0900 Subject: [PATCH 16/78] Moved int pos declaration at the top the func --- src/bio.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/bio.c b/src/bio.c index 74535614e2..d3bf6e4fe1 100644 --- a/src/bio.c +++ b/src/bio.c @@ -1441,9 +1441,10 @@ int wolfSSL_BIO_seek(WOLFSSL_BIO *bio, int ofs) } int wolfSSL_BIO_tell(WOLFSSL_BIO* bio) { - WOLFSSL_ENTER("wolfSSL_BIO_tell"); int pos; + WOLFSSL_ENTER("wolfSSL_BIO_tell"); + if (bio == NULL) { return -1; } @@ -1452,8 +1453,8 @@ int wolfSSL_BIO_tell(WOLFSSL_BIO* bio) return 0; } - pos =(int) XFTELL((XFILE)bio->ptr); - if(pos < 0) + pos = (int)XFTELL((XFILE)bio->ptr); + if (pos < 0) return -1; else return pos; From 6cc137dce0fd926ca8201394b7e52627157aabb8 Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 23 Feb 2021 10:22:59 -0800 Subject: [PATCH 17/78] Fix misplaced endif and brace. --- wolfcrypt/test/test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index e920d0646a..861778f103 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -6249,8 +6249,8 @@ WOLFSSL_TEST_SUBROUTINE int des_test(void) sizeof(key), WC_HASH_TYPE_NONE); if (ret == 0) return -5009; - } #endif /* !NO_PWDBASED */ + } #endif return 0; From d3c8720b5625d21d29ef6c8d6439f89517d595f0 Mon Sep 17 00:00:00 2001 From: Tesfa Mael Date: Tue, 23 Feb 2021 11:54:02 -0800 Subject: [PATCH 18/78] Use Unix line endings --- wolfssl/wolfcrypt/port/ti/ti-ccm.h | 92 +++++++++++++++--------------- wolfssl/wolfcrypt/srp.h | 2 +- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/wolfssl/wolfcrypt/port/ti/ti-ccm.h b/wolfssl/wolfcrypt/port/ti/ti-ccm.h index f5d71fca11..f704d7705d 100644 --- a/wolfssl/wolfcrypt/port/ti/ti-ccm.h +++ b/wolfssl/wolfcrypt/port/ti/ti-ccm.h @@ -1,47 +1,47 @@ -/* port/ti/ti_ccm.c - * - * Copyright (C) 2006-2020 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 - */ +/* port/ti/ti_ccm.c + * + * Copyright (C) 2006-2020 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 + */ + + +#ifndef WOLF_CRYPT_TI_CCM_H +#define WOLF_CRYPT_TI_CCM_H + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#if defined(WOLFSSL_TI_CRYPT) || defined(WOLFSSL_TI_HASH) + +int wolfSSL_TI_CCMInit(void) ; + +#ifndef SINGLE_THREADED +void wolfSSL_TI_lockCCM(void) ; +void wolfSSL_TI_unlockCCM(void) ; +#else +#define wolfSSL_TI_lockCCM() +#define wolfSSL_TI_unlockCCM() +#endif + +#endif + +#endif - -#ifndef WOLF_CRYPT_TI_CCM_H -#define WOLF_CRYPT_TI_CCM_H - -#ifdef HAVE_CONFIG_H - #include -#endif - -#include - -#if defined(WOLFSSL_TI_CRYPT) || defined(WOLFSSL_TI_HASH) - -int wolfSSL_TI_CCMInit(void) ; - -#ifndef SINGLE_THREADED -void wolfSSL_TI_lockCCM(void) ; -void wolfSSL_TI_unlockCCM(void) ; -#else -#define wolfSSL_TI_lockCCM() -#define wolfSSL_TI_unlockCCM() -#endif - -#endif - -#endif - diff --git a/wolfssl/wolfcrypt/srp.h b/wolfssl/wolfcrypt/srp.h index 94f198dfb3..bb6aa203ad 100644 --- a/wolfssl/wolfcrypt/srp.h +++ b/wolfssl/wolfcrypt/srp.h @@ -246,7 +246,7 @@ WOLFSSL_API int wc_SrpSetPrivate(Srp* srp, const byte* priv, word32 size); * * The public ephemeral value is known as: * A at the client side. A = g ^ a % N - * B at the server side. B = (k * v + (g ˆ b % N)) % N + * B at the server side. B = (k * v + (g ^ b % N)) % N * This function MUST be called after wc_SrpSetPassword or wc_SrpSetVerifier. * * @param[in,out] srp the Srp structure. From 9bfbc999d98a8974b9278db84b3a68e61dcf732f Mon Sep 17 00:00:00 2001 From: Tesfa Mael Date: Tue, 23 Feb 2021 13:21:50 -0800 Subject: [PATCH 19/78] Move variable declarations to the top --- wolfcrypt/src/ecc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index b7b56e5d60..cbfb707b5b 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -7770,7 +7770,10 @@ int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key, #endif int keysize = 0; byte pointType; - +#ifdef WOLFSSL_CRYPTOCELL + const CRYS_ECPKI_Domain_t* pDomain; + CRYS_ECPKI_BUILD_TempData_t tempBuff; +#endif if (in == NULL || key == NULL) return BAD_FUNC_ARG; @@ -7951,9 +7954,6 @@ int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key, err = silabs_ecc_import(key, keysize); #endif #ifdef WOLFSSL_CRYPTOCELL - const CRYS_ECPKI_Domain_t* pDomain; - CRYS_ECPKI_BUILD_TempData_t tempBuff; - pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(key->dp->id)); /* create public key from external key buffer */ From 47872224d85b3eda9913195968e66b05308eec18 Mon Sep 17 00:00:00 2001 From: Elms Date: Tue, 23 Feb 2021 14:17:35 -0800 Subject: [PATCH 20/78] configure: fix for FIPS out-of-tree builds Check for fips files relative to source directory. --- configure.ac | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index a45af9c2ce..c439ae6e12 100644 --- a/configure.ac +++ b/configure.ac @@ -188,15 +188,15 @@ AS_CASE([$ENABLED_FIPS], ]) case "$FIPS_VERSION" in -none) if test -s wolfcrypt/src/fips.c || test -s ctaocrypt/src/fips.c; then +none) if test -s $srcdir/wolfcrypt/src/fips.c || test -s $srcdir/ctaocrypt/src/fips.c; then AC_MSG_ERROR([FIPS source tree is incompatible with non-FIPS build (requires --enable-fips)]) fi ;; -v1) if ! test -s ctaocrypt/src/fips.c; then +v1) if ! test -s $srcdir/ctaocrypt/src/fips.c; then AC_MSG_ERROR([non-FIPS-v1 source tree is incompatible with --enable-fips=$enableval]) fi ;; -*) if ! test -s wolfcrypt/src/fips.c; then +*) if ! test -s $srcdir/wolfcrypt/src/fips.c; then AC_MSG_ERROR([non-FIPS source tree is incompatible with --enable-fips=$enableval]) fi ;; From 9dadd02fb9435cccd170765bbd91fb74e0cbc71d Mon Sep 17 00:00:00 2001 From: Daniel Pouzzner Date: Tue, 23 Feb 2021 17:05:44 -0600 Subject: [PATCH 21/78] configure.ac move --enable-distro handling to top (preceding --enable-reproducible-build handling), and turn on reproducible-build by default when enable-distro; fix spelling error in reproducible-build help text. --- configure.ac | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/configure.ac b/configure.ac index a45af9c2ce..68d51eda63 100644 --- a/configure.ac +++ b/configure.ac @@ -14,13 +14,29 @@ AC_CONFIG_AUX_DIR([build-aux]) # want the default "-g -O2" that AC_PROG_CC sets automatically. : ${CFLAGS=""} -# For reproducible builds, gate out from the build anything that might +# Distro build feature subset (Debian, Ubuntu, etc.) +AC_ARG_ENABLE([distro], + [AS_HELP_STRING([--enable-distro],[Enable wolfSSL distro build (default: disabled)])], + [ ENABLED_DISTRO=$enableval ], + [ ENABLED_DISTRO=no ] + ) +if test "$ENABLED_DISTRO" = "yes" +then + enable_shared=yes + enable_static=yes + enable_all=yes + REPRODUCIBLE_BUILD_DEFAULT=yes +else + REPRODUCIBLE_BUILD_DEFAULT=no +fi + +# For reproducible build, gate out from the build anything that might # introduce semantically frivolous jitter, maximizing chance of # identical object files. AC_ARG_ENABLE([reproducible-build], - [AS_HELP_STRING([--enable-reproducible-builds],[Enable maximally reproducible build (default: disabled)])], + [AS_HELP_STRING([--enable-reproducible-build],[Enable maximally reproducible build (default: disabled)])], [ ENABLED_REPRODUCIBLE_BUILD=$enableval ], - [ ENABLED_REPRODUCIBLE_BUILD=no ] + [ ENABLED_REPRODUCIBLE_BUILD=$REPRODUCIBLE_BUILD_DEFAULT ] ) # Test ar for the "U" or "D" options. Should be checked before the libtool macros. @@ -203,20 +219,6 @@ v1) if ! test -s ctaocrypt/src/fips.c; then esac -# Distro build feature subset (Debian, Ubuntu, etc.) -AC_ARG_ENABLE([distro], - [AS_HELP_STRING([--enable-distro],[Enable wolfSSL distro build (default: disabled)])], - [ ENABLED_DISTRO=$enableval ], - [ ENABLED_DISTRO=no ] - ) -if test "$ENABLED_DISTRO" = "yes" -then - enable_shared=yes - enable_static=yes - enable_all=yes -fi - - # Linux Kernel Module AC_ARG_ENABLE([linuxkm], [AS_HELP_STRING([--enable-linuxkm],[Enable Linux Kernel Module (default: disabled)])], From ae28550667f2896f56923b4906e2e4e49372047f Mon Sep 17 00:00:00 2001 From: Felix Lechner Date: Tue, 23 Feb 2021 19:36:15 -0800 Subject: [PATCH 22/78] Enable Base64 as part of --enable-all. Part of an effort to standardize build options across distributions. When building with all options, this includes Base64, a feature that was requested in the past. This commit passed Debian's Salsa CI pipeline [1] as part of a larger commit streamlining the build options for distributions. [2] A related pull request by douzzer activated reproducible builds for distributions by default. [3] Thanks to David Garske for his generous contributions to this commit! [1] https://salsa.debian.org/lechner/wolfssl/-/pipelines/233601 [2] https://salsa.debian.org/lechner/wolfssl/-/blob/debian/master/debian/patches/standardize-distro-options.patch [3] https://github.com/wolfSSL/wolfssl/commit/e30b3d35549ed4ec07cd63bfffc9ae80bf2a3b16 --- configure.ac | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index 68d51eda63..68412a2f7b 100644 --- a/configure.ac +++ b/configure.ac @@ -385,6 +385,7 @@ then test "$enable_enckeys" = "" && enable_enckeys=yes test "$enable_hashflags" = "" && enable_hashflags=yes test "$enable_defaultdhparams" = "" && enable_defaultdhparams=yes + test "$enable_base64encode" = "" && enable_base64encode=yes test "$enable_arc4" = "" && enable_arc4=yes test "$enable_des3" = "" && enable_des3=yes test "$enable_nullcipher" = "" && enable_nullcipher=yes From 1d16af4f329278661f7a2cf7481cf2d551625abe Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Wed, 24 Feb 2021 09:08:15 -0600 Subject: [PATCH 23/78] Warnings and error fixes --- src/tls13.c | 4 ++-- wolfcrypt/src/aes.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tls13.c b/src/tls13.c index f8621977f5..f2cbf9fd0a 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -8132,7 +8132,7 @@ int wolfSSL_CTX_set_groups(WOLFSSL_CTX* ctx, int* groups, int count) for (i = 0; i < count; i++) { /* Call to wolfSSL_CTX_UseSupportedCurve also checks if input groups * are valid */ - if ((ret = wolfSSL_CTX_UseSupportedCurve(ctx, groups[i])) + if ((ret = wolfSSL_CTX_UseSupportedCurve(ctx, (word16)groups[i])) != WOLFSSL_SUCCESS) { TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap); return ret; @@ -8167,7 +8167,7 @@ int wolfSSL_set_groups(WOLFSSL* ssl, int* groups, int count) for (i = 0; i < count; i++) { /* Call to wolfSSL_UseSupportedCurve also checks if input groups * are valid */ - if ((ret = wolfSSL_UseSupportedCurve(ssl, groups[i])) + if ((ret = wolfSSL_UseSupportedCurve(ssl, (word16)groups[i])) != WOLFSSL_SUCCESS) { TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap); return ret; diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index dcc1187af7..b08a5c69fa 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -4798,7 +4798,7 @@ static void AES_GCM_encrypt(const unsigned char *in, unsigned char *out, const unsigned char* addt, const unsigned char* ivec, unsigned char *tag, word32 nbytes, word32 abytes, word32 ibytes, - wrd32 tbytes, const unsigned char* key, int nr) + word32 tbytes, const unsigned char* key, int nr) { int i, j ,k; __m128i ctr1; From 36ba2e134b8c5bfc7408ae5252de6c493adc3005 Mon Sep 17 00:00:00 2001 From: Elms Date: Tue, 23 Feb 2021 15:33:52 -0800 Subject: [PATCH 24/78] configure: FIPS error and compatability cleanup Use autotools macros for case and if. Simplify validation logic. --- configure.ac | 50 ++++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/configure.ac b/configure.ac index c439ae6e12..f7c3129065 100644 --- a/configure.ac +++ b/configure.ac @@ -165,43 +165,45 @@ AC_ARG_ENABLE([fips], [ENABLED_FIPS="no"]) AS_CASE([$ENABLED_FIPS], - ["ready"],[ + [ready],[ ENABLED_FIPS="yes" FIPS_VERSION="v2" FIPS_READY="yes" ], - ["v2"],[ - # FIPS v2 - ENABLED_FIPS="yes" - FIPS_VERSION="v2" + [no],[ + FIPS_VERSION="none" + ENABLED_FIPS="no" ], - ["rand"],[ - # FIPS Rand + [rand|v1|v2],[ + FIPS_VERSION="$ENABLED_FIPS" ENABLED_FIPS="yes" - FIPS_VERSION="rand" ], - ["no"],[FIPS_VERSION="none"], + [yes], [ # FIPS v1 ENABLED_FIPS="yes" FIPS_VERSION="v1" + ], + [ + AC_MSG_ERROR([Invalid value for --enable-fips \"$ENABLED_FIPS\" (allowed: ready, rand, v1, v2)]) ]) -case "$FIPS_VERSION" in -none) if test -s $srcdir/wolfcrypt/src/fips.c || test -s $srcdir/ctaocrypt/src/fips.c; then - AC_MSG_ERROR([FIPS source tree is incompatible with non-FIPS build (requires --enable-fips)]) - fi - ;; -v1) if ! test -s $srcdir/ctaocrypt/src/fips.c; then - AC_MSG_ERROR([non-FIPS-v1 source tree is incompatible with --enable-fips=$enableval]) - fi - ;; -*) if ! test -s $srcdir/wolfcrypt/src/fips.c; then - AC_MSG_ERROR([non-FIPS source tree is incompatible with --enable-fips=$enableval]) - fi - ;; -esac - +AS_CASE([$FIPS_VERSION], + [none], + [ + AS_IF([ test -s $srcdir/wolfcrypt/src/fips.c -o -s $srcdir/ctaocrypt/src/fips.c ], + [AC_MSG_ERROR([FIPS source tree is incompatible with non-FIPS build (requires --enable-fips)])]) + ], + [v1], + [ + AS_IF([ ! test -s $srcdir/ctaocrypt/src/fips.c], + [AC_MSG_ERROR([non-FIPS-v1 source tree is incompatible with --enable-fips=$enableval])]) + ], + [ + AS_IF([ ! test -s $srcdir/wolfcrypt/src/fips.c], + [AC_MSG_ERROR([non-FIPS source tree is incompatible with --enable-fips=$enableval])]) + ] +) # Distro build feature subset (Debian, Ubuntu, etc.) AC_ARG_ENABLE([distro], From bf63b414656012009d776901ab7a2a0884323d12 Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 22 Feb 2021 14:37:04 -0800 Subject: [PATCH 25/78] Fixes for building without hash. If all hash algorithms are disabled `wc_HashAlg` could report empty union. ZD 11585. --- wolfcrypt/test/test.c | 5 ++++- wolfssl/wolfcrypt/hash.h | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 41cf264def..136ab86bf2 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -849,10 +849,12 @@ initDefaultName(); test_pass("SHAKE256 test passed!\n"); #endif +#ifndef NO_HASH_WRAPPER if ( (ret = hash_test()) != 0) return err_sys("Hash test failed!\n", ret); else test_pass("Hash test passed!\n"); +#endif #ifdef WOLFSSL_RIPEMD if ( (ret = ripemd_test()) != 0) @@ -3384,7 +3386,7 @@ exit: } #endif - +#ifndef NO_HASH_WRAPPER WOLFSSL_TEST_SUBROUTINE int hash_test(void) { wc_HashAlg hash; @@ -3689,6 +3691,7 @@ WOLFSSL_TEST_SUBROUTINE int hash_test(void) return 0; } +#endif /* !NO_HASH_WRAPPER */ #if !defined(NO_HMAC) && !defined(NO_MD5) WOLFSSL_TEST_SUBROUTINE int hmac_md5_test(void) diff --git a/wolfssl/wolfcrypt/hash.h b/wolfssl/wolfcrypt/hash.h index 73222cab9b..44b505da4a 100644 --- a/wolfssl/wolfcrypt/hash.h +++ b/wolfssl/wolfcrypt/hash.h @@ -88,7 +88,7 @@ enum wc_HashFlags { #endif }; - +#ifndef NO_HASH_WRAPPER typedef union { #ifndef NO_MD5 wc_Md5 md5; @@ -112,6 +112,7 @@ typedef union { wc_Sha3 sha3; #endif } wc_HashAlg; +#endif /* !NO_HASH_WRAPPER */ /* Find largest possible digest size Note if this gets up to the size of 80 or over check smallstack build */ @@ -151,6 +152,8 @@ WOLFSSL_API enum wc_HashType wc_OidGetHash(int oid); WOLFSSL_API enum wc_HashType wc_HashTypeConvert(int hashType); +#ifndef NO_HASH_WRAPPER + WOLFSSL_API int wc_HashGetDigestSize(enum wc_HashType hash_type); WOLFSSL_API int wc_HashGetBlockSize(enum wc_HashType hash_type); WOLFSSL_API int wc_Hash(enum wc_HashType hash_type, @@ -215,6 +218,8 @@ WOLFSSL_API int wc_Shake256Hash(const byte*, word32, byte*, word32); #endif #endif /* WOLFSSL_SHA3 */ +#endif /* !NO_HASH_WRAPPER */ + enum max_prf { #ifdef HAVE_FFDHE_8192 MAX_PRF_HALF = 516, /* Maximum half secret len */ From 9ebdc8d61c136e732b8a2f7131a4df9f40e586c3 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 24 Feb 2021 13:21:54 -0800 Subject: [PATCH 26/78] Additional fixes for building without RNG. Fix for possible use of `key->dp == NULL` in `wc_ecc_export_ex`. --- wolfcrypt/benchmark/benchmark.c | 1 + wolfcrypt/src/asn.c | 10 +- wolfcrypt/src/ecc.c | 2 +- wolfcrypt/test/test.c | 170 ++++++++++++++++++++++---------- wolfssl/wolfcrypt/settings.h | 6 +- 5 files changed, 132 insertions(+), 57 deletions(-) diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index b480f5d946..b9e919deeb 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -5611,6 +5611,7 @@ exit: (void)times; (void)desc; (void)start; + (void)name; } diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index e4fe97ed11..8a055589c9 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -7121,8 +7121,6 @@ static int HashForSignature(const byte* buf, word32 bufSz, word32 sigOID, { int ret = 0; - (void)verify; - switch (sigOID) { #if defined(WOLFSSL_MD2) case CTC_MD2wRSA: @@ -7210,6 +7208,14 @@ static int HashForSignature(const byte* buf, word32 bufSz, word32 sigOID, WOLFSSL_MSG("Hash for Signature has unsupported type"); } + (void)buf; + (void)bufSz; + (void)sigOID; + (void)digest; + (void)digestSz; + (void)typeH; + (void)verify; + return ret; } #endif /* !NO_ASN_CRYPT */ diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index f073f0c3a2..7f90365b2d 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -7988,7 +7988,7 @@ int wc_ecc_export_ex(ecc_key* key, byte* qx, word32* qxLen, return BAD_FUNC_ARG; } - if (wc_ecc_is_valid_idx(key->idx) == 0) { + if (wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL) { return ECC_BAD_ARG_E; } keySz = key->dp->size; diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 136ab86bf2..aa801d2ad9 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -290,7 +290,7 @@ _Pragma("GCC diagnostic ignored \"-Wunused-function\""); #include #endif -#if defined(NO_FILESYSTEM) +#if defined(NO_FILESYSTEM) || defined(WC_NO_RNG) #if !defined(USE_CERT_BUFFERS_1024) && !defined(USE_CERT_BUFFERS_2048) && \ !defined(USE_CERT_BUFFERS_3072) && !defined(USE_CERT_BUFFERS_4096) #define USE_CERT_BUFFERS_2048 @@ -422,7 +422,8 @@ WOLFSSL_TEST_SUBROUTINE int scrypt_test(void); WOLFSSL_TEST_SUBROUTINE int ecc_encrypt_test(void); #endif #if defined(USE_CERT_BUFFERS_256) && !defined(WOLFSSL_ATECC508A) && \ - !defined(WOLFSSL_ATECC608A) && !defined(NO_ECC256) + !defined(WOLFSSL_ATECC608A) && !defined(NO_ECC256) && \ + defined(HAVE_ECC_VERIFY) && defined(HAVE_ECC_SIGN) /* skip for ATECC508/608A, cannot import private key buffers */ WOLFSSL_TEST_SUBROUTINE int ecc_test_buffers(void); #endif @@ -1179,7 +1180,8 @@ initDefaultName(); test_pass("ECC Enc test passed!\n"); #endif #if defined(USE_CERT_BUFFERS_256) && !defined(WOLFSSL_ATECC508A) && \ - !defined(WOLFSSL_ATECC608A) && !defined(NO_ECC256) + !defined(WOLFSSL_ATECC608A) && !defined(NO_ECC256) && \ + defined(HAVE_ECC_VERIFY) && defined(HAVE_ECC_SIGN) /* skip for ATECC508/608A, cannot import private key buffers */ if ( (ret = ecc_test_buffers()) != 0) return err_sys("ECC buffer test failed!\n", ret); @@ -11826,12 +11828,11 @@ byte GetEntropy(ENTROPY_CMD cmd, byte* out) static const char* certEccRsaPemFile = CERT_WRITE_TEMP_DIR "certeccrsa.pem"; static const char* certEccRsaDerFile = CERT_WRITE_TEMP_DIR "certeccrsa.der"; #endif - #if defined(HAVE_ECC_KEY_EXPORT) + #if defined(HAVE_ECC_KEY_EXPORT) && !defined(WC_NO_RNG) static const char* eccCaKeyPemFile = CERT_WRITE_TEMP_DIR "ecc-key.pem"; static const char* eccPubKeyDerFile = CERT_WRITE_TEMP_DIR "ecc-public-key.der"; static const char* eccCaKeyTempFile = CERT_WRITE_TEMP_DIR "ecc-key.der"; - - #ifdef HAVE_PKCS8 + #if defined(HAVE_PKCS8) && !defined(WC_NO_RNG) static const char* eccPkcs8KeyDerFile = CERT_WRITE_TEMP_DIR "ecc-key-pkcs8.der"; #endif #endif /* HAVE_ECC_KEY_EXPORT */ @@ -14561,15 +14562,15 @@ WOLFSSL_TEST_SUBROUTINE int rsa_test(void) || defined(WOLFSSL_PUBLIC_MP) word32 idx = 0; #endif -#if (!defined(WOLFSSL_RSA_VERIFY_ONLY) || defined(WOLFSSL_PUBLIC_MP)) && \ - !defined(WC_NO_RSA_OAEP) && !defined(WC_NO_RNG) - const char inStr[] = TEST_STRING; +#if !defined(WC_NO_RNG) && !defined(WC_NO_RSA_OAEP) && \ + ((!defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \ + defined(WOLFSSL_PUBLIC_MP)) const word32 inLen = (word32)TEST_STRING_SZ; const word32 outSz = RSA_TEST_BYTES; const word32 plainSz = RSA_TEST_BYTES; #endif -#if (!defined(WOLFSSL_RSA_PUBLIC_ONLY) && \ - !defined(WOLFSSL_RSA_VERIFY_ONLY)) || defined(WOLFSSL_PUBLIC_MP) +#if (!defined(WOLFSSL_RSA_PUBLIC_ONLY) && !defined(WOLFSSL_RSA_VERIFY_ONLY) && \ + !defined(WC_NO_RNG)) || defined(WOLFSSL_PUBLIC_MP) byte* res; #endif #ifndef NO_SIG_WRAPPER @@ -14589,8 +14590,9 @@ WOLFSSL_TEST_SUBROUTINE int rsa_test(void) #endif #endif -#if (!defined(WOLFSSL_RSA_VERIFY_ONLY) || defined(WOLFSSL_PUBLIC_MP)) && \ - !defined(WC_NO_RSA_OAEP) && !defined(WC_NO_RNG) +#if !defined(WC_NO_RNG) && !defined(WC_NO_RSA_OAEP) && \ + ((!defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \ + defined(WOLFSSL_PUBLIC_MP)) DECLARE_VAR(in, byte, TEST_STRING_SZ, HEAP_HINT); DECLARE_VAR(out, byte, RSA_TEST_BYTES, HEAP_HINT); DECLARE_VAR(plain, byte, RSA_TEST_BYTES, HEAP_HINT); @@ -14736,7 +14738,8 @@ WOLFSSL_TEST_SUBROUTINE int rsa_test(void) goto exit_rsa; #endif -#if !defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) +#if !defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) && \ + !defined(WC_NO_RNG) do { #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN); @@ -14855,8 +14858,9 @@ WOLFSSL_TEST_SUBROUTINE int rsa_test(void) } #endif -#if (!defined(WOLFSSL_RSA_PUBLIC_ONLY) && \ - !defined(WOLFSSL_RSA_VERIFY_ONLY)) || defined(WOLFSSL_PUBLIC_MP) +#if !defined(WC_NO_RNG) && !defined(WC_NO_RSA_OAEP) && \ + ((!defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \ + defined(WOLFSSL_PUBLIC_MP)) idx = (word32)ret; XMEMSET(plain, 0, plainSz); do { @@ -16059,6 +16063,7 @@ static int dh_test_check_pubvalue(void) #define FFDHE_KEY_SIZE (2048/8) #endif +#ifndef WC_NO_RNG static int dh_ffdhe_test(WC_RNG *rng, const DhParams* params) { int ret; @@ -16217,7 +16222,7 @@ done: return ret; } - +#endif /* !WC_NO_RNG */ #endif /* HAVE_FFDHE */ WOLFSSL_TEST_SUBROUTINE int dh_test(void) @@ -16225,7 +16230,9 @@ WOLFSSL_TEST_SUBROUTINE int dh_test(void) int ret; word32 bytes; word32 idx = 0, privSz, pubSz, privSz2, pubSz2; +#ifndef WC_NO_RNG WC_RNG rng; +#endif int keyInit = 0; #define DH_TEST_TMP_SIZE 1024 @@ -16234,28 +16241,35 @@ WOLFSSL_TEST_SUBROUTINE int dh_test(void) #else #define DH_TEST_BUF_SIZE 512 #endif +#ifndef WC_NO_RNG word32 agreeSz = DH_TEST_BUF_SIZE; word32 agreeSz2 = DH_TEST_BUF_SIZE; +#endif #ifdef WOLFSSL_SMALL_STACK - DhKey *key = (DhKey *)XMALLOC(sizeof *key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - DhKey *key2 = (DhKey *)XMALLOC(sizeof *key2, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - byte *tmp = (byte *)XMALLOC(DH_TEST_TMP_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + DhKey *key = (DhKey *)XMALLOC(sizeof *key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + DhKey *key2 = (DhKey *)XMALLOC(sizeof *key2, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + byte *tmp = (byte *)XMALLOC(DH_TEST_TMP_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#else + DhKey key[1]; + DhKey key2[1]; + byte tmp[DH_TEST_TMP_SIZE]; +#endif + +#ifndef WC_NO_RNG +#ifdef WOLFSSL_SMALL_STACK + byte *priv = (byte *)XMALLOC(DH_TEST_BUF_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); byte *pub = (byte *)XMALLOC(DH_TEST_BUF_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); byte *priv2 = (byte *)XMALLOC(DH_TEST_BUF_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); byte *pub2 = (byte *)XMALLOC(DH_TEST_BUF_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); byte *agree = (byte *)XMALLOC(DH_TEST_BUF_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); byte *agree2 = (byte *)XMALLOC(DH_TEST_BUF_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - - if ((tmp == NULL) || (priv == NULL) || (pub == NULL) || - (priv2 == NULL) || (pub2 == NULL) || (agree == NULL) || - (agree2 == NULL)) + if (priv == NULL || pub == NULL || priv2 == NULL || pub2 == NULL || + agree == NULL || agree2 == NULL) { ERROR_OUT(-8100, done); + } #else - DhKey key[1]; - DhKey key2[1]; - byte tmp[DH_TEST_TMP_SIZE]; byte priv[DH_TEST_BUF_SIZE]; byte pub[DH_TEST_BUF_SIZE]; byte priv2[DH_TEST_BUF_SIZE]; @@ -16263,6 +16277,13 @@ WOLFSSL_TEST_SUBROUTINE int dh_test(void) byte agree[DH_TEST_BUF_SIZE]; byte agree2[DH_TEST_BUF_SIZE]; #endif +#endif /* !WC_NO_RNG */ + +#ifdef WOLFSSL_SMALL_STACK + if (key == NULL || key2 == NULL || tmp == NULL) { + ERROR_OUT(-8100, done); + } +#endif #ifdef USE_CERT_BUFFERS_1024 XMEMCPY(tmp, dh_key_der_1024, (size_t)sizeof_dh_key_der_1024); @@ -16301,7 +16322,10 @@ WOLFSSL_TEST_SUBROUTINE int dh_test(void) privSz = DH_TEST_BUF_SIZE; privSz2 = DH_TEST_BUF_SIZE; +#ifndef WC_NO_RNG XMEMSET(&rng, 0, sizeof(rng)); +#endif + /* Use API for coverage. */ ret = wc_InitDhKey(key); if (ret != 0) { @@ -16342,6 +16366,7 @@ WOLFSSL_TEST_SUBROUTINE int dh_test(void) } #endif +#ifndef WC_NO_RNG #ifndef HAVE_FIPS ret = wc_InitRng_ex(&rng, HEAP_HINT, devId); #else @@ -16386,6 +16411,7 @@ WOLFSSL_TEST_SUBROUTINE int dh_test(void) if (agreeSz != agreeSz2 || XMEMCMP(agree, agree2, agreeSz)) { ERROR_OUT(-8115, done); } +#endif /* !WC_NO_RNG */ #if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) if (wc_DhCheckPrivKey(NULL, NULL, 0) != BAD_FUNC_ARG) @@ -16447,6 +16473,7 @@ WOLFSSL_TEST_SUBROUTINE int dh_test(void) } #endif /* WOLFSSL_DH_EXTRA */ +#ifndef WC_NO_RNG ret = dh_generate_test(&rng); if (ret != 0) ERROR_OUT(-8126, done); @@ -16454,6 +16481,7 @@ WOLFSSL_TEST_SUBROUTINE int dh_test(void) ret = dh_fips_generate_test(&rng); if (ret != 0) ERROR_OUT(-8127, done); +#endif /* !WC_NO_RNG */ #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) ret = dh_test_check_pubvalue(); @@ -16461,6 +16489,7 @@ WOLFSSL_TEST_SUBROUTINE int dh_test(void) ERROR_OUT(-8128, done); #endif +#ifndef WC_NO_RNG /* Specialized code for key gen when using FFDHE-2048 and FFDHE-3072. */ #ifdef HAVE_FFDHE_2048 ret = dh_ffdhe_test(&rng, wc_Dh_ffdhe2048_Get()); @@ -16472,12 +16501,13 @@ WOLFSSL_TEST_SUBROUTINE int dh_test(void) if (ret != 0) ERROR_OUT(-8130, done); #endif +#endif /* !WC_NO_RNG */ wc_FreeDhKey(key); keyInit = 0; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \ - !defined(WOLFSSL_OLD_PRIME_CHECK) + !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(WC_NO_RNG) /* Test Check Key */ ret = wc_DhSetCheckKey(key, dh_p, sizeof(dh_p), dh_g, sizeof(dh_g), NULL, 0, 0, &rng); @@ -16488,7 +16518,9 @@ WOLFSSL_TEST_SUBROUTINE int dh_test(void) done: +#ifndef WC_NO_RNG wc_FreeRng(&rng); +#endif #ifdef WOLFSSL_SMALL_STACK if (key) { @@ -20649,7 +20681,7 @@ static int ecc_test_make_pub(WC_RNG* rng) byte *tmp = (byte *)XMALLOC(ECC_BUFSIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); #else ecc_key key[1]; -#if defined(HAVE_ECC_DHE) && defined(HAVE_ECC_KEY_EXPORT) +#if defined(HAVE_ECC_DHE) && defined(HAVE_ECC_KEY_EXPORT) && !defined(WC_NO_RNG) ecc_key pub[1]; #endif byte exportBuf[ECC_BUFSIZE]; @@ -20777,7 +20809,8 @@ static int ecc_test_make_pub(WC_RNG* rng) } #endif -#ifdef HAVE_ECC_SIGN +#if defined(HAVE_ECC_SIGN) && (!defined(ECC_TIMING_RESISTANT) || \ + (defined(ECC_TIMING_RESISTANT) && !defined(WC_NO_RNG))) tmpSz = ECC_BUFSIZE; ret = 0; do { @@ -20822,7 +20855,7 @@ static int ecc_test_make_pub(WC_RNG* rng) #endif /* HAVE_ECC_SIGN */ -#if defined(HAVE_ECC_DHE) && defined(HAVE_ECC_KEY_EXPORT) +#if defined(HAVE_ECC_DHE) && defined(HAVE_ECC_KEY_EXPORT) && !defined(WC_NO_RNG) /* now test private only key with creating a shared secret */ x = ECC_BUFSIZE; ret = wc_ecc_export_private_only(key, exportBuf, &x); @@ -20878,7 +20911,7 @@ static int ecc_test_make_pub(WC_RNG* rng) ERROR_OUT(-9870, done); } TEST_SLEEP(); -#endif /* HAVE_ECC_DHE && HAVE_ECC_KEY_EXPORT */ +#endif /* HAVE_ECC_DHE && HAVE_ECC_KEY_EXPORT && !WC_NO_RNG */ ret = 0; @@ -20906,7 +20939,7 @@ done: return ret; } -#if defined(HAVE_ECC_KEY_EXPORT) && !defined(NO_ASN_CRYPT) +#if defined(HAVE_ECC_KEY_EXPORT) && !defined(NO_ASN_CRYPT) && !defined(WC_NO_RNG) static int ecc_test_key_decode(WC_RNG* rng, int keySize) { int ret; @@ -20987,7 +21020,7 @@ static int ecc_test_key_decode(WC_RNG* rng, int keySize) #endif /* HAVE_ECC_KEY_EXPORT && !NO_ASN_CRYPT */ #endif /* HAVE_ECC_KEY_IMPORT */ -#if defined(HAVE_ECC_KEY_EXPORT) && !defined(NO_ASN_CRYPT) +#if defined(HAVE_ECC_KEY_EXPORT) && !defined(NO_ASN_CRYPT) && !defined(WC_NO_RNG) static int ecc_test_key_gen(WC_RNG* rng, int keySize) { int ret = 0; @@ -21088,7 +21121,7 @@ done: static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, int curve_id, const ecc_set_type* dp) { -#if (defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)) && \ +#if (defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)) && !defined(WC_NO_RNG) && \ !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) DECLARE_VAR(sharedA, byte, ECC_SHARED_SIZE, HEAP_HINT); DECLARE_VAR(sharedB, byte, ECC_SHARED_SIZE, HEAP_HINT); @@ -21098,7 +21131,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, DECLARE_VAR(exportBuf, byte, ECC_KEY_EXPORT_BUF_SIZE, HEAP_HINT); #endif word32 x = 0; -#if (defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)) && \ +#if (defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)) && !defined(WC_NO_RNG) && \ !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) word32 y; #endif @@ -21112,18 +21145,20 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, #endif /* HAVE_ECC_SIGN */ int ret; #ifdef WOLFSSL_SMALL_STACK - ecc_key *userA = (ecc_key *)XMALLOC(sizeof *userA, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER), - *userB = (ecc_key *)XMALLOC(sizeof *userB, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER), - *pubKey = (ecc_key *)XMALLOC(sizeof *pubKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + ecc_key *userA = (ecc_key *)XMALLOC(sizeof *userA, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + ecc_key *userB = (ecc_key *)XMALLOC(sizeof *userB, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + ecc_key *pubKey = (ecc_key *)XMALLOC(sizeof *pubKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); #else - ecc_key userA[1], - userB[1], - pubKey[1]; + ecc_key userA[1]; + ecc_key userB[1]; + ecc_key pubKey[1]; #endif +#ifndef WC_NO_RNG int curveSize; +#endif #ifdef DECLARE_VAR_IS_HEAP_ALLOC -#if (defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)) && \ +#if (defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)) && !defined(WC_NO_RNG) && \ !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) if (sharedA == NULL || sharedB == NULL) ERROR_OUT(-9900, done); @@ -21176,6 +21211,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, } #endif +#ifndef WC_NO_RNG ret = wc_ecc_make_key_ex(rng, keySize, userA, curve_id); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &userA->asyncDev, WC_ASYNC_FLAG_NONE); @@ -21293,7 +21329,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, wc_ecc_set_flags(userA, 0); wc_ecc_set_flags(userB, 0); #endif /* HAVE_ECC_CDH */ -#endif /* WOLFSSL_ATECC508A */ +#endif /* !WOLFSSL_ATECC508A && WOLFSSL_ATECC608A */ #ifdef HAVE_ECC_KEY_EXPORT x = ECC_KEY_EXPORT_BUF_SIZE; @@ -21370,11 +21406,14 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, TEST_SLEEP(); #endif /* HAVE_ECC_DHE */ #endif /* HAVE_COMP_KEY */ -#endif /* WOLFSSL_ATECC508A */ + +#endif /* !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A */ +#endif /* !WC_NO_RNG */ #endif /* HAVE_ECC_KEY_IMPORT */ #endif /* HAVE_ECC_KEY_EXPORT */ +#if !defined(ECC_TIMING_RESISTANT) || (defined(ECC_TIMING_RESISTANT) && !defined(WC_NO_RNG)) #ifdef HAVE_ECC_SIGN /* ECC w/out Shamir has issue with all 0 digest */ /* WC_BIGINT doesn't have 0 len well on hardware */ @@ -21454,13 +21493,16 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, } #endif /* HAVE_ECC_VERIFY */ #endif /* HAVE_ECC_SIGN */ +#endif /* !ECC_TIMING_RESISTANT || (ECC_TIMING_RESISTANT && !WC_NO_RNG) */ -#if defined(HAVE_ECC_KEY_EXPORT) && !defined(WOLFSSL_ATECC508) && \ - !defined(WOLFSSL_ATECC608A) +#if defined(HAVE_ECC_KEY_EXPORT) && !defined(WC_NO_RNG) && \ + !defined(WOLFSSL_ATECC508) && !defined(WOLFSSL_ATECC608A) x = ECC_KEY_EXPORT_BUF_SIZE; ret = wc_ecc_export_private_only(userA, exportBuf, &x); if (ret != 0) ERROR_OUT(-9942, done); +#else + (void)exportBuf; #endif /* HAVE_ECC_KEY_EXPORT */ done: @@ -21496,6 +21538,10 @@ done: FREE_VAR(digest, HEAP_HINT); #endif + (void)keySize; + (void)curve_id; + (void)rng; + return ret; } @@ -21529,7 +21575,7 @@ static int ecc_test_curve(WC_RNG* rng, int keySize) #endif #if defined(HAVE_ECC_KEY_IMPORT) && defined(HAVE_ECC_KEY_EXPORT) && \ - !defined(NO_ASN_CRYPT) + !defined(NO_ASN_CRYPT) && !defined(WC_NO_RNG) ret = ecc_test_key_decode(rng, keySize); if (ret < 0) { if (ret == ECC_CURVE_OID_E) { @@ -21542,7 +21588,7 @@ static int ecc_test_curve(WC_RNG* rng, int keySize) } #endif -#if defined(HAVE_ECC_KEY_EXPORT) && !defined(NO_ASN_CRYPT) +#if defined(HAVE_ECC_KEY_EXPORT) && !defined(NO_ASN_CRYPT) && !defined(WC_NO_RNG) ret = ecc_test_key_gen(rng, keySize); if (ret < 0) { if (ret == ECC_CURVE_OID_E) { @@ -22056,7 +22102,7 @@ done: } #endif -#ifdef HAVE_ECC_DHE +#if defined(HAVE_ECC_DHE) && !defined(WC_NO_RNG) static int ecc_ssh_test(ecc_key* key, WC_RNG* rng) { int ret; @@ -22102,7 +22148,7 @@ static int ecc_ssh_test(ecc_key* key, WC_RNG* rng) TEST_SLEEP(); return 0; } -#endif /* HAVE_ECC_DHE */ +#endif /* HAVE_ECC_DHE && !WC_NO_RNG */ #endif static int ecc_def_curve_test(WC_RNG *rng) @@ -22113,6 +22159,7 @@ static int ecc_def_curve_test(WC_RNG *rng) #else ecc_key key[1]; #endif + word32 idx = 0; #ifdef WOLFSSL_SMALL_STACK if (key == NULL) @@ -22133,9 +22180,16 @@ static int ecc_def_curve_test(WC_RNG *rng) goto done; } +#ifndef WC_NO_RNG ret = wc_ecc_make_key(rng, ECC_KEYGEN_SIZE, key); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &key->asyncDev, WC_ASYNC_FLAG_NONE); +#endif +#else + /* use test ECC key */ + ret = wc_EccPrivateKeyDecode(ecc_key_der_256, &idx, key, + (word32)sizeof_ecc_key_der_256); + (void)rng; #endif if (ret != 0) { ret = -10092; @@ -22161,7 +22215,7 @@ static int ecc_def_curve_test(WC_RNG *rng) if (ret < 0) goto done; #endif -#ifdef HAVE_ECC_DHE +#if defined(HAVE_ECC_DHE) && !defined(WC_NO_RNG) ret = ecc_ssh_test(key, rng); if (ret < 0) goto done; @@ -22732,16 +22786,26 @@ static int ecc_test_allocator(WC_RNG* rng) { int ret = 0; ecc_key* key; +#ifdef WC_NO_RNG + word32 idx = 0; +#endif key = wc_ecc_key_new(HEAP_HINT); if (key == NULL) { ERROR_OUT(-10150, exit); } +#ifndef WC_NO_RNG ret = wc_ecc_make_key(rng, ECC_KEYGEN_SIZE, key); if (ret != 0) { ERROR_OUT(-10151, exit); } +#else + /* use test ECC key */ + ret = wc_EccPrivateKeyDecode(ecc_key_der_256, &idx, key, + (word32)sizeof_ecc_key_der_256); + (void)rng; +#endif exit: wc_ecc_key_free(key); @@ -23602,6 +23666,7 @@ WOLFSSL_TEST_SUBROUTINE int ecc_test_buffers(void) if (ret != 0) ERROR_OUT(-10423, done); +#ifndef WC_NO_RNG #ifndef HAVE_FIPS ret = wc_InitRng_ex(&rng, HEAP_HINT, devId); #else @@ -23618,6 +23683,7 @@ WOLFSSL_TEST_SUBROUTINE int ecc_test_buffers(void) ERROR_OUT(-10425, done); } #endif +#endif /* !WC_NO_RNG */ #if defined(HAVE_ECC_ENCRYPT) && defined(HAVE_HKDF) { diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 6d180137e5..c025ac9cef 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -1796,7 +1796,9 @@ extern void uITRON4_free(void *p) ; /* ECC Configs */ #ifdef HAVE_ECC /* By default enable Sign, Verify, DHE, Key Import and Key Export unless explicitly disabled */ - #ifndef NO_ECC_SIGN + #if !defined(NO_ECC_SIGN) && \ + (!defined(ECC_TIMING_RESISTANT) || \ + (defined(ECC_TIMING_RESISTANT) && !defined(WC_NO_RNG))) #undef HAVE_ECC_SIGN #define HAVE_ECC_SIGN #endif @@ -1808,7 +1810,7 @@ extern void uITRON4_free(void *p) ; #undef HAVE_ECC_CHECK_KEY #define HAVE_ECC_CHECK_KEY #endif - #ifndef NO_ECC_DHE + #if !defined(NO_ECC_DHE) && !defined(WC_NO_RNG) #undef HAVE_ECC_DHE #define HAVE_ECC_DHE #endif From 8988f1d5a278a68fae55b1d7aee39996249d668c Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Thu, 18 Feb 2021 16:29:38 -0600 Subject: [PATCH 27/78] Squelch interfering def of SHA_CTX --- wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h b/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h index 5262498218..f025deda60 100644 --- a/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h +++ b/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h @@ -89,11 +89,13 @@ uint64_t wc_esp32elapsedTime(); /* RAW hash function APIs are not implemented with esp32 hardware acceleration*/ #define WOLFSSL_NO_HASH_RAW +#define SHA_CTX ETS_SHAContext #if ESP_IDF_VERSION_MAJOR >= 4 #include "esp32/rom/sha.h" #else #include "rom/sha.h" #endif +#undef SHA_CTX typedef enum { ESP32_SHA_INIT = 0, From 074090049be03a2e621ff7235c8ae35968fbf968 Mon Sep 17 00:00:00 2001 From: Hayden Roche Date: Thu, 18 Feb 2021 14:49:40 -0600 Subject: [PATCH 28/78] Add CMake support for CURVE25519, ED25519, CURVE448, and ED448. --- CMakeLists.txt | 99 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 95 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ce88a0dca..bbaa8e0872 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -441,15 +441,106 @@ endif() # TODO: - ECC custom curves # - Compressed key -# - CURVE25519 -# - ED25519 -# - CURVE448 -# - ED448 # - FP ECC, fixed point cache ECC # - ECC encrypt # - PSK # - Single PSK identity +# CURVE25519 +set(WOLFSSL_CURVE25519_SMALL "no") +set(WOLFSSL_CURVE25519_HELP_STRING "Enable Curve25519 (default: disabled)") +set(WOLFSSL_CURVE25519 "no" CACHE STRING ${WOLFSSL_CURVE25519_HELP_STRING}) +set_property(CACHE WOLFSSL_CURVE25519 PROPERTY STRINGS "yes" "no" "small" "no128bit") + +if(WOLFSSL_OPENSSH) + override_cache(WOLFSSL_CURVE25519 "yes") +endif() + +if(WOLFSSL_CURVE25519) + if("${WOLFSSL_CURVE25519}" STREQUAL "small" OR WOLFSSL_LOW_RESOURCE) + list(APPEND WOLFSSL_DEFINITIONS "-DCURVE25519_SMALL") + set(WOLFSSL_CURVE25519_SMALL "yes") + endif() + + if("${WOLFSSL_CURVE25519}" STREQUAL "no128bit" OR WOLFSSL_32BIT) + list(APPEND WOLFSSL_DEFINITIONS "-DNO_CURVED25519_128BIT") + endif() + + list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_CURVE25519") + set(WOLFSSL_FEMATH "yes") +endif() + +# ED25519 +set(WOLFSSL_ED25519_SMALL "no") +set(WOLFSSL_ED25519_HELP_STRING "Enable ED25519 (default: disabled)") +set(WOLFSSL_ED25519 "no" CACHE STRING ${WOLFSSL_ED25519_HELP_STRING}) +set_property(CACHE WOLFSSL_ED25519 PROPERTY STRINGS "yes" "no" "small") + +if(WOLFSSL_OPENSSH) + override_cache(WOLFSSL_ED25519 "yes") +endif() + +if(WOLFSSL_ED25519 AND NOT WOLFSSL_32BIT) + if("${WOLFSSL_ED25519}" STREQUAL "small" OR WOLFSSL_LOW_RESOURCE) + list(APPEND WOLFSSL_DEFINITIONS "-DED25519_SMALL") + set(WOLFSSL_ED25519_SMALL "yes") + set(WOLFSSL_CURVE25519_SMALL "yes") + endif() + + if(NOT WOLFSSL_SHA512) + message(FATAL_ERROR "cannot enable ed25519 without enabling sha512.") + endif() + + set(WOLFSSL_FEMATH "yes") + set(WOLFSSL_GEMATH "yes") + list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_ED25519") +endif() + +# CURVE448 +set(WOLFSSL_CURVE448_SMALL "no") +set(WOLFSSL_CURVE448_HELP_STRING "Enable Curve448 (default: disabled)") +set(WOLFSSL_CURVE448 "no" CACHE STRING ${WOLFSSL_CURVE448_HELP_STRING}) +set_property(CACHE WOLFSSL_CURVE448 PROPERTY STRINGS "yes" "no" "small") + +if(WOLFSSL_CURVE448) + if("${WOLFSSL_CURVE448}" STREQUAL "small" OR WOLFSSL_LOW_RESOURCE) + list(APPEND WOLFSSL_DEFINITIONS "-DCURVE448_SMALL") + set(WOLFSSL_CURVE448_SMALL "yes") + endif() + + if("${WOLFSSL_CURVE448}" STREQUAL "no128bit" OR WOLFSSL_32BIT) + list(APPEND WOLFSSL_DEFINITIONS "-DNO_CURVED448_128BIT") + endif() + + list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_CURVE448") + set(WOLFSSL_FE448 "yes") +endif() + +# ED448 +set(WOLFSSL_ED448_SMALL "no") +set(WOLFSSL_ED448_HELP_STRING "Enable ED448 (default: disabled)") +set(WOLFSSL_ED448 "no" CACHE STRING ${WOLFSSL_ED448_HELP_STRING}) +set_property(CACHE WOLFSSL_ED448 PROPERTY STRINGS "yes" "no" "small") + +if(WOLFSSL_ED448 AND NOT WOLFSSL_32BIT) + if("${WOLFSSL_ED448}" STREQUAL "small" OR WOLFSSL_LOW_RESOURCE) + list(APPEND WOLFSSL_DEFINITIONS "-DED448_SMALL") + set(WOLFSSL_ED448_SMALL "yes") + set(WOLFSSL_CURVE448_SMALL "yes") + endif() + + if(NOT WOLFSSL_SHA512) + message(FATAL_ERROR "cannot enable ed448 without enabling sha512.") + endif() + + set(WOLFSSL_FE448 "yes") + set(WOLFSSL_GE448 "yes") + list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_ED448") + + # EdDSA448 requires SHAKE256 which requires SHA-3 + override_cache(WOLFSSL_SHAKE256 "yes") +endif() + # Error strings set(WOLFSSL_ERROR_STRINGS_HELP_STRING "Enable error strings table (default: enabled)") option(WOLFSSL_ERROR_STRINGS ${WOLFSSL_ERROR_STRINGS_HELP_STRING} "yes") From 49a0f70c24e548de1168ff4e67962955d9779403 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 24 Feb 2021 14:19:13 -0800 Subject: [PATCH 29/78] Fix errors from last commit. --- wolfcrypt/test/test.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index aa801d2ad9..97883beab6 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -14565,6 +14565,7 @@ WOLFSSL_TEST_SUBROUTINE int rsa_test(void) #if !defined(WC_NO_RNG) && !defined(WC_NO_RSA_OAEP) && \ ((!defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \ defined(WOLFSSL_PUBLIC_MP)) + const char inStr[] = TEST_STRING; const word32 inLen = (word32)TEST_STRING_SZ; const word32 outSz = RSA_TEST_BYTES; const word32 plainSz = RSA_TEST_BYTES; @@ -22159,7 +22160,9 @@ static int ecc_def_curve_test(WC_RNG *rng) #else ecc_key key[1]; #endif +#ifdef WC_NO_RNG word32 idx = 0; +#endif #ifdef WOLFSSL_SMALL_STACK if (key == NULL) From 101b35e766fcfcbf2aebac2fc0fac3b4edf4d7de Mon Sep 17 00:00:00 2001 From: Elms Date: Wed, 24 Feb 2021 13:57:27 -0800 Subject: [PATCH 30/78] cmake: mirror configure logic for SHA3, SHAKE256, SHA224 --- CMakeLists.txt | 58 ++++++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bbaa8e0872..0452ce048e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -331,6 +331,36 @@ endif() # - RIPEMD # - BLAKE2 + +# SHA224 +set(SHA224_DEFAULT "no") +if(("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") OR + ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")) + if(NOT WOLFSSL_AFALG AND NOT WOLFSSL_DEVCRYPTO AND + (NOT WOLFSSL_FIPS OR ("${FIPS_VERSION}" STREQUAL "v2"))) + set(SHA224_DEFAULT "yes") + endif() +endif() +set(WOLFSSL_SHA224_HELP_STRING "Enable wolfSSL SHA-224 support (default: enabled on x86_64/aarch64)") +option(WOLFSSL_SHA224 ${WOLFSSL_SHA224_HELP_STRING} ${SHA224_DEFAULT}) + +# SHA3 +set(SHA3_DEFAULT "no") +if(("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") OR + ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")) + if(NOT WOLFSSL_FIPS OR ("${FIPS_VERSION}" STREQUAL "v2")) + set(SHA3_DEFAULT "yes") + endif() +endif() +set(WOLFSSL_SHA3_HELP_STRING "Enable wolfSSL SHA-3 support (default: enabled on x86_64/aarch64)") +set(WOLFSSL_SHA3 ${SHA3_DEFAULT} CACHE STRING ${WOLFSSL_SHA3_HELP_STRING}) +set_property(CACHE WOLFSSL_SHA3 PROPERTY STRINGS "yes" "no" "small") + +# SHAKE256 +set(WOLFSSL_SHAKE256_HELP_STRING "Enable wolfSSL SHAKE256 support (default: enabled on x86_64/aarch64)") +set(WOLFSSL_SHAKE256 "no" CACHE STRING ${WOLFSSL_SHAKE256_HELP_STRING}) +set_property(CACHE WOLFSSL_SHAKE256 PROPERTY STRINGS "yes" "no" "small") + # SHA512 set(WOLFSSL_SHA512_HELP_STRING "Enable wolfSSL SHA-512 support (default: enabled)") option(WOLFSSL_SHA512 ${WOLFSSL_SHA512_HELP_STRING} "yes") @@ -859,35 +889,11 @@ endif() # - Selftest # SHA224 -set(SHA224_DEFAULT "no") -if(("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") OR - ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")) - if(NOT WOLFSSL_AFALG AND NOT WOLFSSL_DEVCRYPTO AND - (NOT WOLFSSL_FIPS OR ("${FIPS_VERSION}" STREQUAL "v2"))) - set(SHA224_DEFAULT "yes") - endif() -endif() - -set(WOLFSSL_SHA224_HELP_STRING "Enable wolfSSL SHA-224 support (default: enabled on x86_64/aarch64)") -option(WOLFSSL_SHA224 ${WOLFSSL_SHA224_HELP_STRING} ${SHA224_DEFAULT}) - if(WOLFSSL_SHA224) list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_SHA224") endif() # SHA3 -set(SHA3_DEFAULT "no") -if(("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") OR - ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")) - if(NOT WOLFSSL_FIPS OR ("${FIPS_VERSION}" STREQUAL "v2")) - set(SHA3_DEFAULT "yes") - endif() -endif() - -set(WOLFSSL_SHA3_HELP_STRING "Enable wolfSSL SHA-3 support (default: enabled on x86_64/aarch64)") -set(WOLFSSL_SHA3 ${SHA3_DEFAULT} CACHE STRING ${WOLFSSL_SHA3_HELP_STRING}) -set_property(CACHE WOLFSSL_SHA3 PROPERTY STRINGS "yes" "no" "small") - if("${WOLFSSL_SHA3}" STREQUAL "small") list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_SHA3_SMALL") override_cache(WOLFSSL_SHA3 "yes") @@ -898,10 +904,6 @@ if(WOLFSSL_SHA3 AND NOT WOLFSSL_32BIT) endif() # SHAKE256 -set(WOLFSSL_SHAKE256_HELP_STRING "Enable wolfSSL SHAKE256 support (default: enabled on x86_64/aarch64)") -set(WOLFSSL_SHAKE256 "no" CACHE STRING ${WOLFSSL_SHAKE256_HELP_STRING}) -set_property(CACHE WOLFSSL_SHAKE256 PROPERTY STRINGS "yes" "no" "small") - if(NOT WOLFSSL_SHAKE256) override_cache(WOLFSSL_SHAKE256 ${WOLFSSL_SHA3}) endif() From 9be1e74dc3ea3d5614bb15d04921775ba7ffe167 Mon Sep 17 00:00:00 2001 From: Daniel Pouzzner Date: Wed, 24 Feb 2021 17:04:33 -0600 Subject: [PATCH 31/78] configure.ac: move the autotools boilerplate/initializations back to the top, before --enable-distro and --enable-reproducible-build handling. --- configure.ac | 100 ++++++++++++++++++++++++++------------------------- 1 file changed, 51 insertions(+), 49 deletions(-) diff --git a/configure.ac b/configure.ac index 90229e4224..69604576dc 100644 --- a/configure.ac +++ b/configure.ac @@ -14,6 +14,57 @@ AC_CONFIG_AUX_DIR([build-aux]) # want the default "-g -O2" that AC_PROG_CC sets automatically. : ${CFLAGS=""} +# Capture user C_EXTRA_FLAGS from configure line. +# Use of C_EXTRA_FLAGS is deprecated because CFLAGS was fixed but someone +# might still be using it. +CFLAGS="$CFLAGS $C_EXTRA_FLAGS $C_FLAGS" + +AC_PROG_CC +AM_PROG_CC_C_O +AC_CANONICAL_HOST +AC_CONFIG_MACRO_DIR([m4]) + +AM_INIT_AUTOMAKE([1.11 -Wall -Werror -Wno-portability foreign tar-ustar subdir-objects no-define color-tests]) +m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) + +AC_ARG_PROGRAM + +AC_CONFIG_HEADERS([config.h:config.in]) + +LT_PREREQ([2.2]) +LT_INIT([disable-static win32-dll]) + +#shared library versioning +WOLFSSL_LIBRARY_VERSION=28:1:4 +# | | | +# +------+ | +---+ +# | | | +# current:revision:age +# | | | +# | | +- increment if interfaces have been added +# | | set to zero if interfaces have been removed +# | | or changed +# | +- increment if source code has changed +# | set to zero if current is incremented +# +- increment if interfaces have been added, removed or changed +AC_SUBST([WOLFSSL_LIBRARY_VERSION]) + +gl_VISIBILITY +AS_IF([ test -n "$CFLAG_VISIBILITY" ], [ + AM_CFLAGS="$AM_CPPFLAGS $CFLAG_VISIBILITY" + ]) + + +# Moved these size of and type checks before the library checks. +# The library checks add the library to subsequent test compiles +# and in some rare cases, the networking check causes these sizeof +# checks to fail. +AC_CHECK_SIZEOF([long long]) +AC_CHECK_SIZEOF([long]) +AC_CHECK_SIZEOF([time_t]) +AC_CHECK_TYPES([__uint128_t]) + + # Distro build feature subset (Debian, Ubuntu, etc.) AC_ARG_ENABLE([distro], [AS_HELP_STRING([--enable-distro],[Enable wolfSSL distro build (default: disabled)])], @@ -55,55 +106,6 @@ else AS_CASE([$xxx_ranlib_flags],[*'Use actual symbol map timestamp'*],[: ${RANLIB="ranlib -U"}]) fi -AC_PROG_CC -AM_PROG_CC_C_O -AC_CANONICAL_HOST -AC_CONFIG_MACRO_DIR([m4]) - -AM_INIT_AUTOMAKE([1.11 -Wall -Werror -Wno-portability foreign tar-ustar subdir-objects no-define color-tests]) -m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) - -AC_ARG_PROGRAM - -AC_CONFIG_HEADERS([config.h:config.in]) - -LT_PREREQ([2.2]) -LT_INIT([disable-static win32-dll]) - -#shared library versioning -WOLFSSL_LIBRARY_VERSION=28:1:4 -# | | | -# +------+ | +---+ -# | | | -# current:revision:age -# | | | -# | | +- increment if interfaces have been added -# | | set to zero if interfaces have been removed -# | | or changed -# | +- increment if source code has changed -# | set to zero if current is incremented -# +- increment if interfaces have been added, removed or changed -AC_SUBST([WOLFSSL_LIBRARY_VERSION]) - -# Capture user C_EXTRA_FLAGS from configure line. -# Use of C_EXTRA_FLAGS is deprecated because CFLAGS was fixed but someone -# might still be using it. -CFLAGS="$CFLAGS $C_EXTRA_FLAGS $C_FLAGS" - -gl_VISIBILITY -AS_IF([ test -n "$CFLAG_VISIBILITY" ], [ - AM_CFLAGS="$AM_CPPFLAGS $CFLAG_VISIBILITY" - ]) - - -# Moved these size of and type checks before the library checks. -# The library checks add the library to subsequent test compiles -# and in some rare cases, the networking check causes these sizeof -# checks to fail. -AC_CHECK_SIZEOF([long long]) -AC_CHECK_SIZEOF([long]) -AC_CHECK_SIZEOF([time_t]) -AC_CHECK_TYPES([__uint128_t]) AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h netdb.h netinet/in.h stddef.h time.h sys/ioctl.h sys/socket.h sys/time.h errno.h]) AC_CHECK_LIB([network],[socket]) From 3a3c0be43f85ebc6da95ebbcc86634ef6195ce73 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 24 Feb 2021 15:05:27 -0800 Subject: [PATCH 32/78] Fixes for build warnings for CryptoCell with ECC and RSA. --- IDE/CRYPTOCELL/user_settings.h | 3 +++ wolfcrypt/src/ecc.c | 18 +++++++++--------- wolfcrypt/src/signature.c | 23 +++++++++++++++-------- wolfcrypt/test/test.c | 9 +++++++-- 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/IDE/CRYPTOCELL/user_settings.h b/IDE/CRYPTOCELL/user_settings.h index 2d85c910cd..78087f11be 100644 --- a/IDE/CRYPTOCELL/user_settings.h +++ b/IDE/CRYPTOCELL/user_settings.h @@ -138,6 +138,9 @@ extern "C" { #if 1 #define HAVE_ECC + #include + /* strings.h required for strncasecmp */ + /* Manually define enabled curves */ #undef ECC_USER_CURVES #define ECC_USER_CURVES diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index cbfb707b5b..b6c21dce6e 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -1178,7 +1178,8 @@ static int wc_ecc_export_x963_compressed(ecc_key*, byte* out, word32* outLen); #if (defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || !defined(WOLFSSL_SP_MATH)) && \ - !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) + !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(WOLFSSL_CRYPTOCELL) static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a, mp_int* prime, mp_int* order); #endif @@ -3824,7 +3825,7 @@ int wc_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out, err = CRYS_ECDH_SVDP_DH(&public_key->ctx.pubKey, &private_key->ctx.privKey, out, - outlen, + (uint32_t*)outlen, &tempBuff); if (err != SA_SILIB_RET_OK){ @@ -4563,7 +4564,7 @@ int wc_ecc_make_key_ex2(WC_RNG* rng, int keysize, ecc_key* key, int curve_id, err = CRYS_ECPKI_ExportPublKey(&key->ctx.pubKey, CRYS_EC_PointUncompressed, &ucompressed_key[0], - &raw_size); + (uint32_t*)&raw_size); if (err == SA_SILIB_RET_OK && key->pubkey.x && key->pubkey.y) { err = mp_read_unsigned_bin(key->pubkey.x, @@ -4577,7 +4578,7 @@ int wc_ecc_make_key_ex2(WC_RNG* rng, int keysize, ecc_key* key, int curve_id, if (err == MP_OKAY) { err = CRYS_ECPKI_ExportPrivKey(&key->ctx.privKey, ucompressed_key, - &raw_size); + (uint32_t*)&raw_size); } if (err == SA_SILIB_RET_OK) { @@ -4993,7 +4994,7 @@ static int wc_ecc_sign_hash_hw(const byte* in, word32 inlen, (byte*)in, msgLenInBytes, out, - &raw_sig_size); + (uint32_t*)&raw_sig_size); if (err != SA_SILIB_RET_OK){ WOLFSSL_MSG("CRYS_ECDSA_Sign failed"); @@ -7656,7 +7657,8 @@ int wc_ecc_check_key(ecc_key* key) #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \ defined(WOLFSSL_CRYPTOCELL) || defined(WOLFSSL_SILABS_SE_ACCEL) - err = 0; /* consider key check success on ATECC508/608A */ + err = 0; /* consider key check success on ATECC508/608A and CryptoCell */ + (void)err; #else #ifdef USE_ECC_B_PARAM @@ -7751,9 +7753,8 @@ int wc_ecc_check_key(ecc_key* key) #endif FREE_CURVE_SPECS(); - - return err; #endif /* WOLFSSL_ATECC508A */ + return err; #else return WC_KEY_SIZE_E; #endif /* !WOLFSSL_SP_MATH */ @@ -8095,7 +8096,6 @@ int wc_ecc_import_private_key_ex(const byte* priv, word32 privSz, int ret; #ifdef WOLFSSL_CRYPTOCELL const CRYS_ECPKI_Domain_t* pDomain; - CRYS_ECPKI_BUILD_TempData_t tempBuff; #endif if (key == NULL || priv == NULL) return BAD_FUNC_ARG; diff --git a/wolfcrypt/src/signature.c b/wolfcrypt/src/signature.c index 6e623a130a..50c8839064 100644 --- a/wolfcrypt/src/signature.c +++ b/wolfcrypt/src/signature.c @@ -48,6 +48,13 @@ /* Signature wrapper disabled check */ #ifndef NO_SIG_WRAPPER +#ifdef WOLFSSL_CRYPTOCELL +extern int cc310_RsaSSL_Verify(const byte* in, word32 inLen, byte* sig, + RsaKey* key, CRYS_RSA_HASH_OpMode_t mode); +extern int cc310_RsaSSL_Sign(const byte* in, word32 inLen, byte* out, + word32 outLen, RsaKey* key, CRYS_RSA_HASH_OpMode_t mode); +#endif + #if !defined(NO_RSA) && !defined(NO_ASN) static int wc_SignatureDerEncode(enum wc_HashType hash_type, byte* hash_data, word32 hash_len, word32* hash_enc_len) @@ -178,12 +185,12 @@ int wc_SignatureVerifyHash( #ifndef NO_RSA #ifdef WOLFSSL_CRYPTOCELL if (sig_type == WC_SIGNATURE_TYPE_RSA_W_ENC) { - ret = cc310_RsaSSL_Verify(hash_data, hash_len, (byte*)sig, key, - cc310_hashModeRSA(hash_type, 0)); + ret = cc310_RsaSSL_Verify(hash_data, hash_len, (byte*)sig, + (RsaKey*)key, cc310_hashModeRSA(hash_type, 0)); } else { - ret = cc310_RsaSSL_Verify(hash_data, hash_len, (byte*)sig, key, - cc310_hashModeRSA(hash_type, 1)); + ret = cc310_RsaSSL_Verify(hash_data, hash_len, (byte*)sig, + (RsaKey*)key, cc310_hashModeRSA(hash_type, 1)); } #else @@ -400,12 +407,12 @@ int wc_SignatureGenerateHash_ex( /* use expected signature size (incoming sig_len could be larger buffer */ *sig_len = wc_SignatureGetSize(sig_type, key, key_len); if (sig_type == WC_SIGNATURE_TYPE_RSA_W_ENC) { - ret = cc310_RsaSSL_Sign(hash_data, hash_len, sig, *sig_len, key, - cc310_hashModeRSA(hash_type, 0)); + ret = cc310_RsaSSL_Sign(hash_data, hash_len, sig, *sig_len, + (RsaKey*)key, cc310_hashModeRSA(hash_type, 0)); } else { - ret = cc310_RsaSSL_Sign(hash_data, hash_len, sig, *sig_len, key, - cc310_hashModeRSA(hash_type, 1)); + ret = cc310_RsaSSL_Sign(hash_data, hash_len, sig, *sig_len, + (RsaKey*)key, cc310_hashModeRSA(hash_type, 1)); } #else /* Create signature using provided RSA key */ diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index d10a34697d..4c02fc0060 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -7621,9 +7621,11 @@ static int aes_key_size_test(void) #endif byte key16[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 }; +#ifndef WOLFSSL_CRYPTOCELL byte key24[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 }; +#endif byte key32[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, @@ -7700,7 +7702,7 @@ static int aes_key_size_test(void) if (ret != 0 || keySize != sizeof(key16)) ERROR_OUT(-5310, out); #endif -#if !defined(WOLFSSL_CRYPTOCELL) +#ifndef WOLFSSL_CRYPTOCELL /* Cryptocell only supports AES-128 key size */ ret = wc_AesSetKey(aes, key24, sizeof(key24), iv, AES_ENCRYPTION); #ifdef WOLFSSL_AES_192 @@ -14435,7 +14437,9 @@ static int rsa_keygen_test(WC_RNG* rng) #endif int ret; byte* der = NULL; +#ifndef WOLFSSL_CRYPTOCELL word32 idx = 0; +#endif int derSz = 0; #if !defined(WOLFSSL_SP_MATH) && !defined(HAVE_FIPS) int keySz = 1024; @@ -14495,8 +14499,9 @@ static int rsa_keygen_test(WC_RNG* rng) if (ret != 0) { ERROR_OUT(-7875, exit_rsa); } + +#ifndef WOLFSSL_CRYPTOCELL idx = 0; -#if !defined(WOLFSSL_CRYPTOCELL) /* The private key part of the key gen pairs from cryptocell can't be exported */ ret = wc_RsaPrivateKeyDecode(der, &idx, genKey, derSz); if (ret != 0) { From 5cc8979309622c5112982d4eb179ab46b37ffea7 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 24 Feb 2021 15:09:51 -0800 Subject: [PATCH 33/78] Review feedback for unused `pubSz2. --- wolfcrypt/test/test.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 97883beab6..a33feb5553 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -16553,6 +16553,8 @@ done: wc_FreeDhKey(key2); #endif + (void)pubSz2; + return ret; #undef DH_TEST_BUF_SIZE #undef DH_TEST_TMP_SIZE From 982ba6c1e00d67e16fadcf15017ee1e5bf946eb4 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Thu, 25 Feb 2021 09:29:21 +1000 Subject: [PATCH 34/78] Math: GCD(0,0) is undefined and LCM(0,*) is undefined. All integers divide 0 so there is no greatest common divisor. 0 is not in the set of numbers for LCM. --- wolfcrypt/src/integer.c | 9 +++++++++ wolfcrypt/src/sp_int.c | 5 +++++ wolfcrypt/src/tfm.c | 11 +++++++++++ 3 files changed, 25 insertions(+) diff --git a/wolfcrypt/src/integer.c b/wolfcrypt/src/integer.c index 81987f96d0..3da2bea024 100644 --- a/wolfcrypt/src/integer.c +++ b/wolfcrypt/src/integer.c @@ -5039,6 +5039,11 @@ int mp_lcm (mp_int * a, mp_int * b, mp_int * c) int res; mp_int t1, t2; + /* LCM of 0 and any number is undefined as 0 is not in the set of values + * being used. */ + if (mp_iszero (a) == MP_YES || mp_iszero (b) == MP_YES) { + return MP_VAL; + } if ((res = mp_init_multi (&t1, &t2, NULL, NULL, NULL, NULL)) != MP_OKAY) { return res; @@ -5083,6 +5088,10 @@ int mp_gcd (mp_int * a, mp_int * b, mp_int * c) /* either zero than gcd is the largest */ if (mp_iszero (a) == MP_YES) { + /* GCD of 0 and 0 is undefined as all integers divide 0. */ + if (mp_iszero (b) == MP_YES) { + return MP_VAL; + } return mp_abs (b, c); } if (mp_iszero (b) == MP_YES) { diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c index 934037b971..f56302becf 100644 --- a/wolfcrypt/src/sp_int.c +++ b/wolfcrypt/src/sp_int.c @@ -13250,6 +13250,7 @@ int sp_gcd(sp_int* a, sp_int* b, sp_int* r) err = MP_VAL; } else if (sp_iszero(a)) { + /* GCD of 0 and 0 is undefined as all integers divide 0. */ if (sp_iszero(b)) { err = MP_VAL; } @@ -13360,6 +13361,10 @@ int sp_lcm(sp_int* a, sp_int* b, sp_int* r) if ((a == NULL) || (b == NULL) || (r == NULL)) { err = MP_VAL; } + + /* LCM of 0 and any number is undefined as 0 is not in the set of values + * being used. + */ if ((err == MP_OKAY) && (mp_iszero(a) || mp_iszero(b))) { err = MP_VAL; } diff --git a/wolfcrypt/src/tfm.c b/wolfcrypt/src/tfm.c index 8dab88207b..505fc556f8 100644 --- a/wolfcrypt/src/tfm.c +++ b/wolfcrypt/src/tfm.c @@ -5210,6 +5210,12 @@ int fp_lcm(fp_int *a, fp_int *b, fp_int *c) fp_int *t; #endif + /* LCM of 0 and any number is undefined as 0 is not in the set of values + * being used. */ + if (fp_iszero(a) == FP_YES || fp_iszero(b) == FP_YES) { + return FP_VAL; + } + #ifdef WOLFSSL_SMALL_STACK t = (fp_int*)XMALLOC(sizeof(fp_int) * 2, NULL, DYNAMIC_TYPE_BIGINT); if (t == NULL) { @@ -5249,6 +5255,11 @@ int fp_gcd(fp_int *a, fp_int *b, fp_int *c) fp_int *u, *v, *r; #endif + /* GCD of 0 and 0 is undefined as all integers divide 0. */ + if (fp_iszero(a) == FP_YES && fp_iszero(b) == FP_YES) { + return FP_VAL; + } + /* either zero than gcd is the largest */ if (fp_iszero (a) == FP_YES && fp_iszero (b) == FP_NO) { fp_abs (b, c); From d805a5c6818846040573bef78c66233fb56104a9 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Thu, 25 Feb 2021 10:01:27 +1000 Subject: [PATCH 35/78] SP int: get keygen working with SP math again ./configure --enable-sp --enable-sp-math --enable-keygen --- configure.ac | 13 ++++++++----- wolfcrypt/src/sp_int.c | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index 90229e4224..33caccf6f5 100644 --- a/configure.ac +++ b/configure.ac @@ -6530,13 +6530,16 @@ echo " * Fast RSA: $ENABLED_FAST_RSA" echo " * Single Precision: $ENABLED_SP" if test "$ENABLED_SP_MATH_ALL" != "no" then - echo " * SP math implementation: all" -elif test "$ENABLED_SP_MATH" != "no" -then - echo " * SP math implementation: restricted" + ENABLED_SP_MATH_DESC="all" else - echo " * SP math implementation: no" + if test "$ENABLED_SP_MATH" != "no" + then + ENABLED_SP_MATH_DESC="restricted" + else + ENABLED_SP_MATH_DESC="no" + fi fi +echo " * SP math implementation: $ENABLED_SP_MATH_DESC" echo " * Async Crypto: $ENABLED_ASYNCCRYPT" echo " * PKCS#11: $ENABLED_PKCS11" echo " * PKCS#12: $ENABLED_PKCS12" diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c index 934037b971..a4de243f49 100644 --- a/wolfcrypt/src/sp_int.c +++ b/wolfcrypt/src/sp_int.c @@ -13230,7 +13230,7 @@ int sp_prime_is_prime_ex(sp_int* a, int t, int* result, WC_RNG* rng) } #endif /* WOLFSSL_SP_MATH_ALL || WOLFSSL_HAVE_SP_DH */ -#if defined(WOLFSSL_SP_MATH_ALL) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) +#if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) /* Calculates the Greatest Common Denominator (GCD) of a and b into r. * From 7bc12bb536b19aaa8437db270e9ba5f34b024268 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Thu, 25 Feb 2021 11:10:46 +1000 Subject: [PATCH 36/78] Windows Project: Include the X448 and Ed448 files --- wolfssl.vcxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wolfssl.vcxproj b/wolfssl.vcxproj index d890f8cc9f..25c22b449d 100644 --- a/wolfssl.vcxproj +++ b/wolfssl.vcxproj @@ -295,14 +295,18 @@ + + + + From d271092aefa5405bc6ec8a774db4cced46344561 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Thu, 25 Feb 2021 11:45:12 +1000 Subject: [PATCH 37/78] ASN: move wolfSSL_i2d_X509_NAME to ssl.c Move WOLFSSL_X509_NAME APIs out of asn.[ch]. --- src/ssl.c | 170 +++++++++++++++++++ wolfcrypt/src/asn.c | 361 +++++++++++----------------------------- wolfssl/wolfcrypt/asn.h | 10 ++ 3 files changed, 278 insertions(+), 263 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 5ef8c4f214..9d6b953a4e 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -40803,7 +40803,177 @@ cleanup: return wolfSSL_X509_sign(x509, ctx->pctx->pkey, wolfSSL_EVP_MD_CTX_md(ctx)); } #endif /* OPENSSL_EXTRA */ + +/* Guarded by either + * A) WOLFSSL_WPAS_SMALL is on or + * B) (OPENSSL_EXTRA or OPENSSL_EXTRA_X509_SMALL) + WOLFSSL_CERT_GEN + + * (WOLFSSL_CERT_REQ or WOLFSSL_CERT_EXT or OPENSSL_EXTRA) has been + * defined + */ +#if defined(WOLFSSL_WPAS_SMALL) || \ + (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \ + defined(WOLFSSL_CERT_GEN) && \ + (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT) || \ + defined(OPENSSL_EXTRA)) +/* Converts from NID_* value to wolfSSL value if needed */ +static int ConvertNIDToWolfSSL(int nid) +{ + switch (nid) { + case NID_commonName : return ASN_COMMON_NAME; + case NID_surname : return ASN_SUR_NAME; + case NID_countryName: return ASN_COUNTRY_NAME; + case NID_localityName: return ASN_LOCALITY_NAME; + case NID_stateOrProvinceName: return ASN_STATE_NAME; + case NID_organizationName: return ASN_ORG_NAME; + case NID_organizationalUnitName: return ASN_ORGUNIT_NAME; + case NID_emailAddress: return ASN_EMAIL_NAME; + case NID_serialNumber: return ASN_SERIAL_NUMBER; + case NID_businessCategory: return ASN_BUS_CAT; + case NID_domainComponent: return ASN_DOMAIN_COMPONENT; + default: + WOLFSSL_MSG("Attribute NID not found"); + return -1; + } +} + +/* Converts the x509 name structure into DER format. + * + * out pointer to either a pre setup buffer or a pointer to null for + * creating a dynamic buffer. In the case that a pre-existing buffer is + * used out will be incremented the size of the DER buffer on success. + * + * returns the size of the buffer on success, or negative value with failure + */ +int wolfSSL_i2d_X509_NAME(WOLFSSL_X509_NAME* name, unsigned char** out) +{ + int totalBytes = 0, i, idx; + byte temp[MAX_SEQ_SZ]; + byte *output, *local = NULL; +#ifdef WOLFSSL_SMALL_STACK + EncodedName* names = NULL; +#else + EncodedName names[MAX_NAME_ENTRIES]; +#endif + + if (out == NULL || name == NULL) + return BAD_FUNC_ARG; + +#ifdef WOLFSSL_SMALL_STACK + names = (EncodedName*)XMALLOC(sizeof(EncodedName) * MAX_NAME_ENTRIES, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (names == NULL) + return MEMORY_E; +#endif + + XMEMSET(names, 0, sizeof(EncodedName) * MAX_NAME_ENTRIES); + + for (i = 0; i < MAX_NAME_ENTRIES; i++) { + WOLFSSL_X509_NAME_ENTRY* entry; + int ret; + + entry = wolfSSL_X509_NAME_get_entry(name, i); + if (entry != NULL && entry->set == 1) { + const char* nameStr; + int type; + WOLFSSL_ASN1_STRING* data; + + data = wolfSSL_X509_NAME_ENTRY_get_data(entry); + if (data == NULL) { + #ifdef WOLFSSL_SMALL_STACK + XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + WOLFSSL_MSG("Error getting entry data"); + return WOLFSSL_FATAL_ERROR; + } + + nameStr = (const char*)wolfSSL_ASN1_STRING_data(data); + type = wolfSSL_ASN1_STRING_type(data); + + switch (type) { + case MBSTRING_UTF8: + type = CTC_UTF8; + break; + case V_ASN1_PRINTABLESTRING: + type = CTC_PRINTABLE; + break; + default: + WOLFSSL_MSG("Unknown encoding type conversion UTF8 by default"); + type = CTC_UTF8; + } + ret = wc_EncodeName(&names[i], nameStr, type, + ConvertNIDToWolfSSL(entry->nid)); + if (ret < 0) { + #ifdef WOLFSSL_SMALL_STACK + XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + WOLFSSL_MSG("EncodeName failed"); + return WOLFSSL_FATAL_ERROR; + } + totalBytes += ret; + } + } + + /* header */ + idx = SetSequence(totalBytes, temp); + if (totalBytes + idx > ASN_NAME_MAX) { +#ifdef WOLFSSL_SMALL_STACK + XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + WOLFSSL_MSG("Total Bytes is greater than ASN_NAME_MAX"); + return BUFFER_E; + } + + /* check if using buffer passed in */ + if (*out == NULL) { + *out = local = (unsigned char*)XMALLOC(totalBytes + idx, NULL, + DYNAMIC_TYPE_OPENSSL); + if (*out == NULL) { + return MEMORY_E; + } + } + output = *out; + /* header */ + idx = SetSequence(totalBytes, temp); + if (totalBytes + idx > ASN_NAME_MAX) { +#ifdef WOLFSSL_SMALL_STACK + XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + WOLFSSL_MSG("Total Bytes is greater than ASN_NAME_MAX"); + return BUFFER_E; + } + + /* check if using buffer passed in */ + if (*out == NULL) { + *out = local = (unsigned char*)XMALLOC(totalBytes + idx, NULL, + DYNAMIC_TYPE_OPENSSL); + if (*out == NULL) { + return MEMORY_E; + } + } + output = *out; + + idx = SetSequence(totalBytes, output); + totalBytes += idx; + for (i = 0; i < MAX_NAME_ENTRIES; i++) { + if (names[i].used) { + XMEMCPY(output + idx, names[i].encoded, names[i].totalLen); + idx += names[i].totalLen; + } + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + /* used existing buffer passed in, so increment pointer */ + if (local == NULL) { + *out += totalBytes; + } + return totalBytes; +} +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ #endif /* WOLFSSL_CERT_GEN */ + #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) WOLFSSL_X509_NAME *wolfSSL_d2i_X509_NAME(WOLFSSL_X509_NAME **name, diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index e4fe97ed11..9b7908890d 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -12413,16 +12413,6 @@ static int CopyValidity(byte* output, Cert* cert) #endif -/* ASN Encoded Name field */ -typedef struct EncodedName { - int nameLen; /* actual string value length */ - int totalLen; /* total encoded length */ - int type; /* type of name */ - int used; /* are we actually using this one */ - byte encoded[CTC_NAME_SIZE * 2]; /* encoding */ -} EncodedName; - - /* Get Which Name from index */ const char* GetOneCertName(CertName* name, int idx) { @@ -13004,281 +12994,126 @@ int FlattenAltNames(byte* output, word32 outputSz, const DNS_entry* names) * * returns length on success */ -static int wc_EncodeName(EncodedName* name, const char* nameStr, char nameType, - byte type) +int wc_EncodeName(EncodedName* name, const char* nameStr, char nameType, + byte type) { word32 idx = 0; + /* bottom up */ + byte firstLen[1 + MAX_LENGTH_SZ]; + byte secondLen[MAX_LENGTH_SZ]; + byte sequence[MAX_SEQ_SZ]; + byte set[MAX_SET_SZ]; - if (nameStr) { - /* bottom up */ - byte firstLen[1 + MAX_LENGTH_SZ]; - byte secondLen[MAX_LENGTH_SZ]; - byte sequence[MAX_SEQ_SZ]; - byte set[MAX_SET_SZ]; + int strLen; + int thisLen; + int firstSz, secondSz, seqSz, setSz; - int strLen = (int)XSTRLEN(nameStr); - int thisLen = strLen; - int firstSz, secondSz, seqSz, setSz; - - if (strLen == 0) { /* no user data for this item */ - name->used = 0; - return 0; - } - - /* Restrict country code size */ - if (ASN_COUNTRY_NAME == type && strLen != CTC_COUNTRY_SIZE) { - WOLFSSL_MSG("Country code size error"); - return ASN_COUNTRY_SIZE_E; - } - - secondSz = SetLength(strLen, secondLen); - thisLen += secondSz; - switch (type) { - case ASN_EMAIL_NAME: /* email */ - thisLen += EMAIL_JOINT_LEN; - firstSz = EMAIL_JOINT_LEN; - break; - - case ASN_DOMAIN_COMPONENT: - thisLen += PILOT_JOINT_LEN; - firstSz = PILOT_JOINT_LEN; - break; - - default: - thisLen++; /* str type */ - thisLen += JOINT_LEN; - firstSz = JOINT_LEN + 1; - } - thisLen++; /* id type */ - firstSz = SetObjectId(firstSz, firstLen); - thisLen += firstSz; - - seqSz = SetSequence(thisLen, sequence); - thisLen += seqSz; - setSz = SetSet(thisLen, set); - thisLen += setSz; - - if (thisLen > (int)sizeof(name->encoded)) { - return BUFFER_E; - } - - /* store it */ - idx = 0; - /* set */ - XMEMCPY(name->encoded, set, setSz); - idx += setSz; - /* seq */ - XMEMCPY(name->encoded + idx, sequence, seqSz); - idx += seqSz; - /* asn object id */ - XMEMCPY(name->encoded + idx, firstLen, firstSz); - idx += firstSz; - switch (type) { - case ASN_EMAIL_NAME: - { - const byte EMAIL_OID[] = { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x09, 0x01, 0x16 }; - /* email joint id */ - XMEMCPY(name->encoded + idx, EMAIL_OID, sizeof(EMAIL_OID)); - idx += (int)sizeof(EMAIL_OID); - } - break; - - case ASN_DOMAIN_COMPONENT: - { - const byte PILOT_OID[] = { 0x09, 0x92, 0x26, 0x89, - 0x93, 0xF2, 0x2C, 0x64, 0x01 - }; - - XMEMCPY(name->encoded + idx, PILOT_OID, - sizeof(PILOT_OID)); - idx += (int)sizeof(PILOT_OID); - /* id type */ - name->encoded[idx++] = type; - /* str type */ - name->encoded[idx++] = nameType; - } - break; - - default: - name->encoded[idx++] = 0x55; - name->encoded[idx++] = 0x04; - /* id type */ - name->encoded[idx++] = type; - /* str type */ - name->encoded[idx++] = nameType; - } - /* second length */ - XMEMCPY(name->encoded + idx, secondLen, secondSz); - idx += secondSz; - /* str value */ - XMEMCPY(name->encoded + idx, nameStr, strLen); - idx += strLen; - - name->type = type; - name->totalLen = idx; - name->used = 1; - } - else + if (nameStr == NULL) { name->used = 0; + return 0; + } + thisLen = strLen = (int)XSTRLEN(nameStr); + if (strLen == 0) { /* no user data for this item */ + name->used = 0; + return 0; + } - return idx; -} + /* Restrict country code size */ + if (ASN_COUNTRY_NAME == type && strLen != CTC_COUNTRY_SIZE) { + WOLFSSL_MSG("Country code size error"); + return ASN_COUNTRY_SIZE_E; + } + secondSz = SetLength(strLen, secondLen); + thisLen += secondSz; + switch (type) { + case ASN_EMAIL_NAME: /* email */ + thisLen += EMAIL_JOINT_LEN; + firstSz = EMAIL_JOINT_LEN; + break; + case ASN_DOMAIN_COMPONENT: + thisLen += PILOT_JOINT_LEN; + firstSz = PILOT_JOINT_LEN; + break; - -/* Guarded by either - * A) WOLFSSL_WPAS_SMALL is on or - * B) (OPENSSL_EXTRA or OPENSSL_EXTRA_X509_SMALL) + WOLFSSL_CERT_GEN + - * (WOLFSSL_CERT_REQ or WOLFSSL_CERT_EXT or OPENSSL_EXTRA) has been - * defined - */ -#if defined(WOLFSSL_WPAS_SMALL) || \ - (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \ - defined(WOLFSSL_CERT_GEN) && \ - (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT) || \ - defined(OPENSSL_EXTRA)) -/* Converts from NID_* value to wolfSSL value if needed */ -static int ConvertNIDToWolfSSL(int nid) -{ - switch (nid) { - case NID_commonName : return ASN_COMMON_NAME; - case NID_surname : return ASN_SUR_NAME; - case NID_countryName: return ASN_COUNTRY_NAME; - case NID_localityName: return ASN_LOCALITY_NAME; - case NID_stateOrProvinceName: return ASN_STATE_NAME; - case NID_organizationName: return ASN_ORG_NAME; - case NID_organizationalUnitName: return ASN_ORGUNIT_NAME; - case NID_emailAddress: return ASN_EMAIL_NAME; - case NID_serialNumber: return ASN_SERIAL_NUMBER; - case NID_businessCategory: return ASN_BUS_CAT; - case NID_domainComponent: return ASN_DOMAIN_COMPONENT; default: - WOLFSSL_MSG("Attribute NID not found"); - return -1; + thisLen++; /* str type */ + thisLen += JOINT_LEN; + firstSz = JOINT_LEN + 1; } -} + thisLen++; /* id type */ + firstSz = SetObjectId(firstSz, firstLen); + thisLen += firstSz; + seqSz = SetSequence(thisLen, sequence); + thisLen += seqSz; + setSz = SetSet(thisLen, set); + thisLen += setSz; -/* Converts the x509 name structure into DER format. - * - * out pointer to either a pre setup buffer or a pointer to null for - * creating a dynamic buffer. In the case that a pre-existing buffer is - * used out will be incremented the size of the DER buffer on success. - * - * returns the size of the buffer on success, or negative value with failure - */ -int wolfSSL_i2d_X509_NAME(WOLFSSL_X509_NAME* name, unsigned char** out) -{ - int totalBytes = 0, i, idx; - byte temp[MAX_SEQ_SZ]; - byte *output, *local = NULL; -#ifdef WOLFSSL_SMALL_STACK - EncodedName* names = NULL; -#else - EncodedName names[MAX_NAME_ENTRIES]; -#endif - - if (out == NULL || name == NULL) - return BAD_FUNC_ARG; - -#ifdef WOLFSSL_SMALL_STACK - names = (EncodedName*)XMALLOC(sizeof(EncodedName) * MAX_NAME_ENTRIES, NULL, - DYNAMIC_TYPE_TMP_BUFFER); - if (names == NULL) - return MEMORY_E; -#endif - - XMEMSET(names, 0, sizeof(EncodedName) * MAX_NAME_ENTRIES); - - for (i = 0; i < MAX_NAME_ENTRIES; i++) { - WOLFSSL_X509_NAME_ENTRY* entry; - int ret; - - entry = wolfSSL_X509_NAME_get_entry(name, i); - if (entry != NULL && entry->set == 1) { - const char* nameStr; - int type; - WOLFSSL_ASN1_STRING* data; - - data = wolfSSL_X509_NAME_ENTRY_get_data(entry); - if (data == NULL) { - #ifdef WOLFSSL_SMALL_STACK - XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER); - #endif - WOLFSSL_MSG("Error getting entry data"); - return WOLFSSL_FATAL_ERROR; - } - - nameStr = (const char*)wolfSSL_ASN1_STRING_data(data); - type = wolfSSL_ASN1_STRING_type(data); - - switch (type) { - case MBSTRING_UTF8: - type = CTC_UTF8; - break; - case V_ASN1_PRINTABLESTRING: - type = CTC_PRINTABLE; - break; - default: - WOLFSSL_MSG("Unknown encoding type conversion UTF8 by default"); - type = CTC_UTF8; - } - ret = wc_EncodeName(&names[i], nameStr, type, - ConvertNIDToWolfSSL(entry->nid)); - if (ret < 0) { - #ifdef WOLFSSL_SMALL_STACK - XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER); - #endif - WOLFSSL_MSG("EncodeName failed"); - return WOLFSSL_FATAL_ERROR; - } - totalBytes += ret; - } - } - - /* header */ - idx = SetSequence(totalBytes, temp); - if (totalBytes + idx > ASN_NAME_MAX) { -#ifdef WOLFSSL_SMALL_STACK - XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER); -#endif - WOLFSSL_MSG("Total Bytes is greater than ASN_NAME_MAX"); + if (thisLen > (int)sizeof(name->encoded)) { return BUFFER_E; } - /* check if using buffer passed in */ - if (*out == NULL) { - *out = local = (unsigned char*)XMALLOC(totalBytes + idx, NULL, - DYNAMIC_TYPE_OPENSSL); - if (*out == NULL) { - return MEMORY_E; + /* store it */ + idx = 0; + /* set */ + XMEMCPY(name->encoded, set, setSz); + idx += setSz; + /* seq */ + XMEMCPY(name->encoded + idx, sequence, seqSz); + idx += seqSz; + /* asn object id */ + XMEMCPY(name->encoded + idx, firstLen, firstSz); + idx += firstSz; + switch (type) { + case ASN_EMAIL_NAME: + { + const byte EMAIL_OID[] = { + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16 + }; + /* email joint id */ + XMEMCPY(name->encoded + idx, EMAIL_OID, sizeof(EMAIL_OID)); + idx += (int)sizeof(EMAIL_OID); + break; } - } - output = *out; - idx = SetSequence(totalBytes, output); - totalBytes += idx; - for (i = 0; i < MAX_NAME_ENTRIES; i++) { - if (names[i].used) { - XMEMCPY(output + idx, names[i].encoded, names[i].totalLen); - idx += names[i].totalLen; + case ASN_DOMAIN_COMPONENT: + { + const byte PILOT_OID[] = { + 0x09, 0x92, 0x26, 0x89, 0x93, 0xF2, 0x2C, 0x64, 0x01 + }; + + XMEMCPY(name->encoded + idx, PILOT_OID, sizeof(PILOT_OID)); + idx += (int)sizeof(PILOT_OID); + /* id type */ + name->encoded[idx++] = type; + /* str type */ + name->encoded[idx++] = nameType; + break; } - } -#ifdef WOLFSSL_SMALL_STACK - XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER); -#endif - - /* used existing buffer passed in, so increment pointer */ - if (local == NULL) { - *out += totalBytes; + default: + name->encoded[idx++] = 0x55; + name->encoded[idx++] = 0x04; + /* id type */ + name->encoded[idx++] = type; + /* str type */ + name->encoded[idx++] = nameType; } - return totalBytes; + /* second length */ + XMEMCPY(name->encoded + idx, secondLen, secondSz); + idx += secondSz; + /* str value */ + XMEMCPY(name->encoded + idx, nameStr, strLen); + idx += strLen; + + name->type = type; + name->totalLen = idx; + name->used = 1; + + return idx; } -#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ - /* encode CertName into output, return total bytes written */ int SetName(byte* output, word32 outputSz, CertName* name) diff --git a/wolfssl/wolfcrypt/asn.h b/wolfssl/wolfcrypt/asn.h index 2ea5761c1f..5080841119 100644 --- a/wolfssl/wolfcrypt/asn.h +++ b/wolfssl/wolfcrypt/asn.h @@ -977,6 +977,14 @@ struct DecodedCert { #endif }; +/* ASN Encoded Name field */ +typedef struct EncodedName { + int nameLen; /* actual string value length */ + int totalLen; /* total encoded length */ + int type; /* type of name */ + int used; /* are we actually using this one */ + byte encoded[CTC_NAME_SIZE * 2]; /* encoding */ +} EncodedName; #ifdef NO_SHA #define SIGNER_DIGEST_SIZE WC_SHA256_DIGEST_SIZE @@ -1163,6 +1171,8 @@ WOLFSSL_LOCAL int DateGreaterThan(const struct tm* a, const struct tm* b); WOLFSSL_LOCAL int wc_ValidateDate(const byte* date, byte format, int dateType); WOLFSSL_LOCAL int wc_OBJ_sn2nid(const char *sn); +WOLFSSL_LOCAL int wc_EncodeName(EncodedName* name, const char* nameStr, + char nameType, byte type); /* ASN.1 helper functions */ #ifdef WOLFSSL_CERT_GEN WOLFSSL_ASN_API int SetName(byte* output, word32 outputSz, CertName* name); From acff0e8781653671a516617fde9656f2588fd29b Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 25 Feb 2021 08:54:30 -0800 Subject: [PATCH 38/78] Fix for InTime RTOS v5. The `arc4random_buf` wasn't added until v6, so opting to use `arc4random`. ZD 11760. --- wolfcrypt/src/random.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/wolfcrypt/src/random.c b/wolfcrypt/src/random.c index 15127b0848..230abb83cd 100644 --- a/wolfcrypt/src/random.c +++ b/wolfcrypt/src/random.c @@ -2236,19 +2236,24 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) #elif defined(INTIME_RTOS) int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) { - int ret = 0; - - (void)os; + uint32_t rand; + word32 len = sizeof(rand); if (output == NULL) { return BUFFER_E; } - /* Note: Investigate better solution */ - /* no return to check */ - arc4random_buf(output, sz); + while (sz > 0) { + if (sz < len) + len = sz; + rand = arc4random(); /* returns 32-bits of random */ + XMEMCPY(output, &rand, len); + output += len; + sz -= len; + } + (void)os; - return ret; + return 0; } #elif defined(WOLFSSL_WICED) From afbe3607d739d69552540b1874a0813309266bac Mon Sep 17 00:00:00 2001 From: Elms Date: Thu, 25 Feb 2021 11:01:16 -0800 Subject: [PATCH 39/78] ssl: fix g++ compile warning with explicit cast cast OpenSSL callback to `void*` for storage as context to be used by static callback --- src/ssl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ssl.c b/src/ssl.c index 5ef8c4f214..002b1d8b94 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -47771,7 +47771,7 @@ int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *ctx, ticketCompatCb cb) * callback. */ ctx->ticketEncCb = wolfSSL_TicketKeyCb; - ctx->ticketEncCtx = cb; + ctx->ticketEncCtx = (void*)cb; return WOLFSSL_SUCCESS; } From bc585e85b6f500abbd06dba4813ad148a5771b95 Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 25 Feb 2021 11:23:21 -0800 Subject: [PATCH 40/78] Dismiss unused warnings for rsa_test. --- wolfcrypt/test/test.c | 57 +++++++++++++++---------------------------- 1 file changed, 20 insertions(+), 37 deletions(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index a33feb5553..3f8d44f76c 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -14558,22 +14558,12 @@ WOLFSSL_TEST_SUBROUTINE int rsa_test(void) RsaKey caKey[1]; #endif #endif -#if !defined(NO_ASN) || !defined(WOLFSSL_RSA_PUBLIC_ONLY) \ - || defined(WOLFSSL_PUBLIC_MP) word32 idx = 0; -#endif -#if !defined(WC_NO_RNG) && !defined(WC_NO_RSA_OAEP) && \ - ((!defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \ - defined(WOLFSSL_PUBLIC_MP)) const char inStr[] = TEST_STRING; const word32 inLen = (word32)TEST_STRING_SZ; const word32 outSz = RSA_TEST_BYTES; const word32 plainSz = RSA_TEST_BYTES; -#endif -#if (!defined(WOLFSSL_RSA_PUBLIC_ONLY) && !defined(WOLFSSL_RSA_VERIFY_ONLY) && \ - !defined(WC_NO_RNG)) || defined(WOLFSSL_PUBLIC_MP) byte* res; -#endif #ifndef NO_SIG_WRAPPER int modLen; #endif @@ -14591,9 +14581,6 @@ WOLFSSL_TEST_SUBROUTINE int rsa_test(void) #endif #endif -#if !defined(WC_NO_RNG) && !defined(WC_NO_RSA_OAEP) && \ - ((!defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \ - defined(WOLFSSL_PUBLIC_MP)) DECLARE_VAR(in, byte, TEST_STRING_SZ, HEAP_HINT); DECLARE_VAR(out, byte, RSA_TEST_BYTES, HEAP_HINT); DECLARE_VAR(plain, byte, RSA_TEST_BYTES, HEAP_HINT); @@ -14604,7 +14591,6 @@ WOLFSSL_TEST_SUBROUTINE int rsa_test(void) #endif XMEMCPY(in, inStr, inLen); -#endif #ifdef WOLFSSL_SMALL_STACK if (key == NULL) @@ -14816,9 +14802,6 @@ WOLFSSL_TEST_SUBROUTINE int rsa_test(void) TEST_SLEEP(); #elif defined(WOLFSSL_PUBLIC_MP) - (void)outSz; - (void)inLen; - (void)res; { static byte signature_2048[] = { 0x07, 0x6f, 0xc9, 0x85, 0x73, 0x9e, 0x21, 0x79, @@ -15272,8 +15255,6 @@ WOLFSSL_TEST_SUBROUTINE int rsa_test(void) } FreeDecodedCert(cert); -#else - (void)bytes; #endif #ifdef WOLFSSL_CERT_EXT @@ -15636,50 +15617,52 @@ WOLFSSL_TEST_SUBROUTINE int rsa_test(void) exit_rsa: #ifdef WOLFSSL_SMALL_STACK - if (key != NULL) { wc_FreeRsaKey(key); XFREE(key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); } -#if defined(WOLFSSL_CERT_EXT) || defined(WOLFSSL_CERT_GEN) + #if defined(WOLFSSL_CERT_EXT) || defined(WOLFSSL_CERT_GEN) if (keypub != NULL) { wc_FreeRsaKey(keypub); XFREE(keypub, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); } -#endif -#if defined(HAVE_NTRU) + #endif + #if defined(HAVE_NTRU) if (caKey != NULL) { wc_FreeRsaKey(caKey); XFREE(caKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); } -#endif -#ifdef WOLFSSL_TEST_CERT + #endif + #ifdef WOLFSSL_TEST_CERT if (cert != NULL) XFREE(cert, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); -#endif - + #endif #else - wc_FreeRsaKey(key); -#if defined(WOLFSSL_CERT_EXT) || defined(WOLFSSL_CERT_GEN) + #if defined(WOLFSSL_CERT_EXT) || defined(WOLFSSL_CERT_GEN) wc_FreeRsaKey(keypub); -#endif -#if defined(HAVE_NTRU) + #endif + #if defined(HAVE_NTRU) wc_FreeRsaKey(caKey); -#endif - -#endif + #endif +#endif /* WOLFSSL_SMALL_STACK */ XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); XFREE(tmp, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); wc_FreeRng(&rng); -#if (!defined(WOLFSSL_RSA_VERIFY_ONLY) || defined(WOLFSSL_PUBLIC_MP)) && \ - !defined(WC_NO_RSA_OAEP) && !defined(WC_NO_RNG) FREE_VAR(in, HEAP_HINT); FREE_VAR(out, HEAP_HINT); FREE_VAR(plain, HEAP_HINT); -#endif + + (void)res; + (void)bytes; + (void)in; + (void)out; + (void)plain; + (void)inLen; + (void)outSz; + (void)plainSz; /* ret can be greater then 0 with certgen but all negative values should * be returned and treated as an error */ From 10181b7bbf427b80b9b1294ed64ad42d692e1347 Mon Sep 17 00:00:00 2001 From: Hayden Roche Date: Fri, 19 Feb 2021 14:26:46 -0600 Subject: [PATCH 41/78] Add support for OpenSSL compatibility function SSL_CTX_get_min_proto_version. This is needed by socat-1.7.4.1. --- src/ssl.c | 56 ++++++++++++++++++++++++++++++++++++ tests/api.c | 67 +++++++++++++++++++++++++++++++++++++++++++ wolfssl/openssl/ssl.h | 1 + wolfssl/ssl.h | 1 + 4 files changed, 125 insertions(+) diff --git a/src/ssl.c b/src/ssl.c index 5ef8c4f214..1900358e12 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -16663,6 +16663,62 @@ int wolfSSL_CTX_set_max_proto_version(WOLFSSL_CTX* ctx, int ver) return sanityCheckProtoVersion(ctx); } +static int GetMinProtoVersion(int minDowngrade) +{ + int ret; + + switch (minDowngrade) { +#ifndef NO_OLD_TLS + #ifdef WOLFSSL_ALLOW_SSLV3 + case SSLv3_MINOR: + ret = SSL3_VERSION; + break; + #endif + #ifdef WOLFSSL_ALLOW_TLSV10 + case TLSv1_MINOR: + ret = TLS1_VERSION; + break; + #endif + case TLSv1_1_MINOR: + ret = TLS1_1_VERSION; + break; +#endif +#ifndef WOLFSSL_NO_TLS12 + case TLSv1_2_MINOR: + ret = TLS1_2_VERSION; + break; +#endif +#ifdef WOLFSSL_TLS13 + case TLSv1_3_MINOR: + ret = TLS1_3_VERSION; + break; +#endif + default: + ret = 0; + break; + } + + return ret; +} + +WOLFSSL_API int wolfSSL_CTX_get_min_proto_version(WOLFSSL_CTX* ctx) +{ + int ret = 0; + + WOLFSSL_ENTER("wolfSSL_CTX_get_min_proto_version"); + + if (ctx != NULL) { + ret = GetMinProtoVersion(ctx->minDowngrade); + } + if (ret == 0) { + ret = GetMinProtoVersion(WOLFSSL_MIN_DOWNGRADE); + } + + WOLFSSL_LEAVE("wolfSSL_CTX_get_min_proto_version", ret); + + return ret; +} + #endif /* OPENSSL_EXTRA */ #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) diff --git a/tests/api.c b/tests/api.c index 85436a5ff5..64906642cd 100644 --- a/tests/api.c +++ b/tests/api.c @@ -40412,6 +40412,71 @@ static void test_export_keying_material(void) } #endif /* HAVE_KEYING_MATERIAL */ +static void test_wolfSSL_CTX_get_min_proto_version(void) +{ +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) + WOLFSSL_CTX *ctx; + + printf(testingFmt, "wolfSSL_CTX_get_min_proto_version()"); + + #ifndef NO_OLD_TLS + #ifdef WOLFSSL_ALLOW_SSLV3 + #ifdef NO_WOLFSSL_SERVER + AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + #else + AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + #endif + AssertIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, SSL3_VERSION), WOLFSSL_SUCCESS); + AssertIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), SSL3_VERSION); + wolfSSL_CTX_free(ctx); + #endif + #ifdef WOLFSSL_ALLOW_TLSV10 + #ifdef NO_WOLFSSL_SERVER + AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_client_method())); + #else + AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_server_method())); + #endif + AssertIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, TLS1_VERSION), WOLFSSL_SUCCESS); + AssertIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_VERSION); + wolfSSL_CTX_free(ctx); + #endif + + #ifdef NO_WOLFSSL_SERVER + AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_1_client_method())); + #else + AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_1_server_method())); + #endif + AssertIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, TLS1_1_VERSION), WOLFSSL_SUCCESS); + AssertIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_1_VERSION); + wolfSSL_CTX_free(ctx); + #endif + + #ifndef WOLFSSL_NO_TLS12 + #ifdef NO_WOLFSSL_SERVER + AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method())); + #else + AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_2_server_method())); + #endif + AssertIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION), WOLFSSL_SUCCESS); + AssertIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_2_VERSION); + wolfSSL_CTX_free(ctx); + #endif + + #ifdef WOLFSSL_TLS13 + #ifdef NO_WOLFSSL_SERVER + AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method())); + #else + AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method())); + #endif + AssertIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, TLS1_3_VERSION), WOLFSSL_SUCCESS); + AssertIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_3_VERSION); + wolfSSL_CTX_free(ctx); + #endif + + printf(resultFmt, passed); +#endif /* defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) */ +} + /*----------------------------------------------------------------------------* | Main *----------------------------------------------------------------------------*/ @@ -40830,6 +40895,8 @@ void ApiTest(void) test_export_keying_material(); #endif /* HAVE_KEYING_MATERIAL */ + test_wolfSSL_CTX_get_min_proto_version(); + /*wolfcrypt */ printf("\n-----------------wolfcrypt unit tests------------------\n"); AssertFalse(test_wolfCrypt_Init()); diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index 623930bdaf..8b7604ea32 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -1071,6 +1071,7 @@ wolfSSL_X509_STORE_set_verify_cb((WOLFSSL_X509_STORE *)(s), (WOLFSSL_X509_STORE_ #define SSL_CTX_set_min_proto_version wolfSSL_CTX_set_min_proto_version #define SSL_CTX_set_max_proto_version wolfSSL_CTX_set_max_proto_version +#define SSL_CTX_get_min_proto_version wolfSSL_CTX_get_min_proto_version #define SSL_get_tlsext_status_exts wolfSSL_get_tlsext_status_exts diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 9d32bb2226..c3372b3f04 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -3555,6 +3555,7 @@ WOLFSSL_API int wolfSSL_get_server_tmp_key(const WOLFSSL*, WOLFSSL_EVP_PKEY**); WOLFSSL_API int wolfSSL_CTX_set_min_proto_version(WOLFSSL_CTX*, int); WOLFSSL_API int wolfSSL_CTX_set_max_proto_version(WOLFSSL_CTX*, int); +WOLFSSL_API int wolfSSL_CTX_get_min_proto_version(WOLFSSL_CTX*); WOLFSSL_API int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey); WOLFSSL_API WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 **x, pem_password_cb *cb, void *u); From cd9f400cf33d17af84472733f9f4f83c7da098f5 Mon Sep 17 00:00:00 2001 From: Hayden Roche Date: Thu, 25 Feb 2021 14:56:31 -0600 Subject: [PATCH 42/78] Clean up CMake option strings. This commit makes all the binary CMake options (i.e. yes/no) conform to one string convention: "yes/no." Previously, we had a mixture of yes/no and ON/OFF. --- CMakeLists.txt | 125 ++++++++++++++++++++---------------------- cmake/functions.cmake | 19 +++++++ 2 files changed, 77 insertions(+), 67 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0452ce048e..82bd11d9e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -182,7 +182,7 @@ find_package(Threads) # Support for disabling all ASM set(WOLFSSL_ASM_HELP_STRING "Enables option for assembly (default: enabled)") -option(WOLFSSL_ASM ${WOLFSSL_ASM_HELP_STRING} "yes") +add_option("WOLFSSL_ASM" ${WOLFSSL_ASM_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_ASM) list(APPEND WOLFSSL_DEFINITIONS @@ -192,7 +192,7 @@ endif() # Single threaded set(WOLFSSL_SINGLE_THREADED_HELP_STRING "Enable wolfSSL single threaded (default: disabled)") -option(WOLFSSL_SINGLE_THREADED ${WOLFSSL_SINGLE_THREADED_HELP_STRING} "no") +add_option("WOLFSSL_SINGLE_THREADED" ${WOLFSSL_SINGLE_THREADED_HELP_STRING} "no" "yes;no") # TODO: Logic here isn't complete, yet (see AX_PTHREAD) if(NOT WOLFSSL_SINGLE_THREADED) @@ -209,7 +209,7 @@ endif() # TLS v1.3 set(WOLFSSL_TLS13_HELP_STRING "Enable wolfSSL TLS v1.3 (default: enabled)") -option(WOLFSSL_TLS13 ${WOLFSSL_TLS13_HELP_STRING} "yes") +add_option("WOLFSSL_TLS13" ${WOLFSSL_TLS13_HELP_STRING} "yes" "yes;no") if("${FIPS_VERSION}" STREQUAL "v1") override_cache(WOLFSSL_TLS13 "no") @@ -220,7 +220,7 @@ endif() # RNG set(WOLFSSL_RNG_HELP_STRING "Enable compiling and using RNG (default: enabled)") -option(WOLFSSL_RNG ${WOLFSSL_RNG_HELP_STRING} "yes") +add_option("WOLFSSL_RNG" ${WOLFSSL_RNG_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_RNG) list(APPEND WOLFSSL_DEFINITIONS "-DWC_NO_RNG") @@ -247,7 +247,7 @@ endif() # Harden, enable Timing Resistance and Blinding by default set(WOLFSSL_HARDEN_HELP_STRING "Enable Hardened build, Enables Timing Resistance and Blinding (default: enabled)") -option(WOLFSSL_HARDEN ${WOLFSSL_HARDEN_HELP_STRING} "yes") +add_option("WOLFSSL_HARDEN" ${WOLFSSL_HARDEN_HELP_STRING} "yes" "yes;no") if(WOLFSSL_HARDEN) list(APPEND WOLFSSL_DEFINITIONS "-DTFM_TIMING_RESISTANT" "-DECC_TIMING_RESISTANT") @@ -279,7 +279,7 @@ set(WOLFSSL_SLOW_MATH "yes") # AES-CBC set(WOLFSSL_AESCBC_HELP_STRING "Enable wolfSSL AES-CBC support (default: enabled)") -option(WOLFSSL_AESCBC ${WOLFSSL_AESCBC_HELP_STRING} "yes") +add_option("WOLFSSL_AESCBC" ${WOLFSSL_AESCBC_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_AESCBC) list(APPEND WOLFSSL_DEFINITIONS "-DNO_AES_CBC") @@ -287,8 +287,7 @@ endif() # AES-GCM set(WOLFSSL_AESGCM_HELP_STRING "Enable wolfSSL AES-GCM support (default: enabled)") -set(WOLFSSL_AESGCM "yes" CACHE STRING ${WOLFSSL_AESGCM_HELP_STRING}) -set_property(CACHE WOLFSSL_AESGCM PROPERTY STRINGS "yes" "no" "table" "small" "word32") +add_option("WOLFSSL_AESGCM" ${WOLFSSL_AESGCM_HELP_STRING} "yes" "yes;no;table;small;word32") # leanpsk and leantls don't need gcm if(WOLFSSL_LEAN_PSK OR (WOLFSSL_LEAN_TLS AND NOT WOLFSSL_TLS13)) @@ -342,7 +341,7 @@ if(("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") OR endif() endif() set(WOLFSSL_SHA224_HELP_STRING "Enable wolfSSL SHA-224 support (default: enabled on x86_64/aarch64)") -option(WOLFSSL_SHA224 ${WOLFSSL_SHA224_HELP_STRING} ${SHA224_DEFAULT}) +add_option("WOLFSSL_SHA224" ${WOLFSSL_SHA224_HELP_STRING} ${SHA224_DEFAULT} "yes;no") # SHA3 set(SHA3_DEFAULT "no") @@ -353,17 +352,15 @@ if(("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") OR endif() endif() set(WOLFSSL_SHA3_HELP_STRING "Enable wolfSSL SHA-3 support (default: enabled on x86_64/aarch64)") -set(WOLFSSL_SHA3 ${SHA3_DEFAULT} CACHE STRING ${WOLFSSL_SHA3_HELP_STRING}) -set_property(CACHE WOLFSSL_SHA3 PROPERTY STRINGS "yes" "no" "small") +add_option("WOLFSSL_SHA3" ${WOLFSSL_SHA3_HELP_STRING} ${SHA3_DEFAULT} "yes;no;small") # SHAKE256 set(WOLFSSL_SHAKE256_HELP_STRING "Enable wolfSSL SHAKE256 support (default: enabled on x86_64/aarch64)") -set(WOLFSSL_SHAKE256 "no" CACHE STRING ${WOLFSSL_SHAKE256_HELP_STRING}) -set_property(CACHE WOLFSSL_SHAKE256 PROPERTY STRINGS "yes" "no" "small") +add_option("WOLFSSL_SHAKE256" ${WOLFSSL_SHAKE256_HELP_STRING} "no" "yes;no;small") # SHA512 set(WOLFSSL_SHA512_HELP_STRING "Enable wolfSSL SHA-512 support (default: enabled)") -option(WOLFSSL_SHA512 ${WOLFSSL_SHA512_HELP_STRING} "yes") +add_option("WOLFSSL_SHA512" ${WOLFSSL_SHA512_HELP_STRING} "yes" "yes;no") # options that don't require sha512 if(WOLFSSL_LEAN_PSK OR @@ -386,7 +383,7 @@ endif() # SHA384 set(WOLFSSL_SHA384_HELP_STRING "Enable wolfSSL SHA-384 support (default: enabled)") -option(WOLFSSL_SHA384 ${WOLFSSL_SHA384_HELP_STRING} "yes") +add_option("WOLFSSL_SHA384" ${WOLFSSL_SHA384_HELP_STRING} "yes" "yes;no") # options that don't require sha384 if(WOLFSSL_LEAN_PSK OR @@ -417,7 +414,7 @@ endif() # HKDF set(WOLFSSL_HKDF_HELP_STRING "Enable HKDF (HMAC-KDF) support (default: disabled)") -option(WOLFSSL_HKDF ${WOLFSSL_HKDF_HELP_STRING} "no") +add_option("WOLFSSL_HKDF" ${WOLFSSL_HKDF_HELP_STRING} "no" "yes;no") if(WOLFSSL_TLS13) override_cache(WOLFSSL_HKDF "yes") @@ -431,7 +428,7 @@ endif() # DSA set(WOLFSSL_DSA_HELP_STRING "Enable DSA (default: disabled)") -option(WOLFSSL_DSA ${WOLFSSL_DSA_HELP_STRING} "no") +add_option("WOLFSSL_DSA" ${WOLFSSL_DSA_HELP_STRING} "no" "yes;no") if(NOT WOLFSSL_DSA AND NOT WOLFSSL_OPENSSH) list(APPEND WOLFSSL_DEFINITIONS "-DNO_DSA") @@ -439,12 +436,11 @@ endif() # ECC Shamir set(WOLFSSL_ECCSHAMIR_HELP_STRING "Enable ECC Shamir (default: enabled)") -option(WOLFSSL_ECCSHAMIR ${WOLFSSL_ECCSHAMIR_HELP_STRING} "yes") +add_option("WOLFSSL_ECCSHAMIR" ${WOLFSSL_ECCSHAMIR_HELP_STRING} "yes" "yes;no") # ECC set(WOLFSSL_ECC_HELP_STRING "Enable ECC (default: enabled)") -set(WOLFSSL_ECC "yes" CACHE STRING ${WOLFSSL_ECC_HELP_STRING}) -set_property(CACHE WOLFSSL_ECC PROPERTY STRINGS "yes" "no" "nonblock") +add_option("WOLFSSL_ECC" ${WOLFSSL_ECC_HELP_STRING} "yes" "yes;no;nonblock") # lean psk doesn't need ecc if(WOLFSSL_LEAN_PSK) @@ -479,8 +475,7 @@ endif() # CURVE25519 set(WOLFSSL_CURVE25519_SMALL "no") set(WOLFSSL_CURVE25519_HELP_STRING "Enable Curve25519 (default: disabled)") -set(WOLFSSL_CURVE25519 "no" CACHE STRING ${WOLFSSL_CURVE25519_HELP_STRING}) -set_property(CACHE WOLFSSL_CURVE25519 PROPERTY STRINGS "yes" "no" "small" "no128bit") +add_option("WOLFSSL_CURVE25519" ${WOLFSSL_CURVE25519_HELP_STRING} "no" "yes;no;small;no128bit") if(WOLFSSL_OPENSSH) override_cache(WOLFSSL_CURVE25519 "yes") @@ -503,8 +498,7 @@ endif() # ED25519 set(WOLFSSL_ED25519_SMALL "no") set(WOLFSSL_ED25519_HELP_STRING "Enable ED25519 (default: disabled)") -set(WOLFSSL_ED25519 "no" CACHE STRING ${WOLFSSL_ED25519_HELP_STRING}) -set_property(CACHE WOLFSSL_ED25519 PROPERTY STRINGS "yes" "no" "small") +add_option("WOLFSSL_ED25519" ${WOLFSSL_ED25519_HELP_STRING} "no" "yes;no") if(WOLFSSL_OPENSSH) override_cache(WOLFSSL_ED25519 "yes") @@ -529,8 +523,7 @@ endif() # CURVE448 set(WOLFSSL_CURVE448_SMALL "no") set(WOLFSSL_CURVE448_HELP_STRING "Enable Curve448 (default: disabled)") -set(WOLFSSL_CURVE448 "no" CACHE STRING ${WOLFSSL_CURVE448_HELP_STRING}) -set_property(CACHE WOLFSSL_CURVE448 PROPERTY STRINGS "yes" "no" "small") +add_option("WOLFSSL_CURVE448" ${WOLFSSL_CURVE448_HELP_STRING} "no" "yes;no;small") if(WOLFSSL_CURVE448) if("${WOLFSSL_CURVE448}" STREQUAL "small" OR WOLFSSL_LOW_RESOURCE) @@ -549,8 +542,7 @@ endif() # ED448 set(WOLFSSL_ED448_SMALL "no") set(WOLFSSL_ED448_HELP_STRING "Enable ED448 (default: disabled)") -set(WOLFSSL_ED448 "no" CACHE STRING ${WOLFSSL_ED448_HELP_STRING}) -set_property(CACHE WOLFSSL_ED448 PROPERTY STRINGS "yes" "no" "small") +add_option("WOLFSSL_ED448" ${WOLFSSL_ED448_HELP_STRING} "no" "yes;no;small") if(WOLFSSL_ED448 AND NOT WOLFSSL_32BIT) if("${WOLFSSL_ED448}" STREQUAL "small" OR WOLFSSL_LOW_RESOURCE) @@ -573,7 +565,7 @@ endif() # Error strings set(WOLFSSL_ERROR_STRINGS_HELP_STRING "Enable error strings table (default: enabled)") -option(WOLFSSL_ERROR_STRINGS ${WOLFSSL_ERROR_STRINGS_HELP_STRING} "yes") +add_option("WOLFSSL_ERROR_STRINGS" ${WOLFSSL_ERROR_STRINGS_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_ERROR_STRINGS) list(APPEND WOLFSSL_DEFINITIONS "-DNO_ERROR_STRINGS") @@ -587,7 +579,7 @@ endif() # Error queue set(WOLFSSL_ERROR_QUEUE_HELP_STRING "Enables adding nodes to error queue when compiled with OPENSSL_EXTRA (default: enabled)") -option(WOLFSSL_ERROR_QUEUE ${WOLFSSL_DISABLE_ERROR_QUEUE_HELP_STRING} "yes") +add_option("WOLFSSL_ERROR_QUEUE" ${WOLFSSL_ERROR_QUEUE_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_ERROR_QUEUE) list(APPEND WOLFSSL_DEFINITIONS "-DNO_ERROR_QUEUE") @@ -595,7 +587,7 @@ endif() # Old TLS set(WOLFSSL_OLD_TLS_HELP_STRING "Enable old TLS versions < 1.2 (default: enabled)") -option(WOLFSSL_OLD_TLS ${WOLFSSL_OLD_TLS_HELP_STRING} "yes") +add_option("WOLFSSL_OLD_TLS" ${WOLFSSL_OLD_TLS_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_OLD_TLS) list(APPEND WOLFSSL_DEFINITIONS "-DNO_OLD_TLS") @@ -609,7 +601,7 @@ endif() # TLSv1.2 set(WOLFSSL_TLSV12_HELP_STRING "Enable TLS versions 1.2 (default: enabled)") -option(WOLFSSL_TLSV12 ${WOLFSSL_TLSV12_HELP_STRING} "yes") +add_option("WOLFSSL_TLSV12" ${WOLFSSL_TLSV12_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_TLSV12) list(APPEND WOLFSSL_DEFINITIONS @@ -624,7 +616,7 @@ endif() # Memory set(WOLFSSL_MEMORY_HELP_STRING "Enable memory callbacks (default: enabled)") -option(WOLFSSL_MEMORY ${WOLFSSL_MEMORY_HELP_STRING} "yes") +add_option("WOLFSSL_MEMORY" ${WOLFSSL_MEMORY_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_MEMORY) list(APPEND WOLFSSL_DEFINITIONS "-DNO_WOLFSSL_MEMORY") @@ -642,7 +634,7 @@ endif() # RSA set(WOLFSSL_RSA_HELP_STRING "Enable RSA (default: enabled)") -option(WOLFSSL_RSA ${WOLFSSL_RSA_HELP_STRING} "yes") +add_option("WOLFSSL_RSA" ${WOLFSSL_RSA_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_RSA) list(APPEND WOLFSSL_DEFINITIONS "-DNO_RSA") @@ -655,7 +647,7 @@ endif() # OAEP set(WOLFSSL_OAEP_HELP_STRING "Enable RSA OAEP (default: enabled)") -option(WOLFSSL_OAEP ${WOLFSSL_OAEP_HELP_STRING} "yes") +add_option("WOLFSSL_OAEP" ${WOLFSSL_OAEP_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_OAEP) list(APPEND WOLFSSL_DEFINITIONS "-DWC_NO_RSA_OAEP") @@ -666,7 +658,7 @@ endif() # RSA-PSS set(WOLFSSL_RSA_PSS_HELP_STRING "Enable RSA-PSS (default: disabled)") -option(WOLFSSL_RSA_PSS ${WOLFSSL_RSA_PSS_HELP_STRING} "no") +add_option("WOLFSSL_RSA_PSS" ${WOLFSSL_RSA_PSS_HELP_STRING} "no" "yes;no") if(NOT WOLFSSL_RSA) override_cache(WOLFSSL_RSA_PSS "no") @@ -681,7 +673,7 @@ endif() # DH set(WOLFSSL_DH_HELP_STRING "Enable DH (default: enabled)") -option(WOLFSSL_DH ${WOLFSSL_DH_HELP_STRING} "yes") +add_option("WOLFSSL_DH" ${WOLFSSL_DH_HELP_STRING} "yes" "yes;no") if(WOLFSSL_OPENSSH) override_cache(WOLFSSL_DH "yes") @@ -702,7 +694,7 @@ endif() # turn off asn, which means no certs, no rsa, no dsa, no ecc, # and no big int (unless dh is on) set(WOLFSSL_ASN_HELP_STRING "Enable ASN (default: enabled)") -option(WOLFSSL_ASN ${WOLFSSL_ASN_HELP_STRING} "yes") +add_option("WOLFSSL_ASN" ${WOLFSSL_ASN_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_ASN) list(APPEND WOLFSSL_DEFINITIONS "-DNO_ASN" "-DNO_CERTS") @@ -747,7 +739,7 @@ endif() # AES set(WOLFSSL_AES_HELP_STRING "Enable AES (default: enabled)") -option(WOLFSSL_AES ${WOLFSSL_AES_HELP_STRING} "yes") +add_option("WOLFSSL_AES" ${WOLFSSL_AES_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_AES) list(APPEND WOLFSSL_DEFINITIONS "-DNO_AES") @@ -776,7 +768,7 @@ endif() # Coding set(WOLFSSL_CODING_HELP_STRING "Enable coding base 16/64 (default: enabled)") -option(WOLFSSL_CODING ${WOLFSSL_CODING_HELP_STRING} "yes") +add_option("WOLFSSL_CODING" ${WOLFSSL_CODING_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_CODING) list(APPEND WOLFSSL_DEFINITIONS "-DNO_CODING") @@ -795,7 +787,7 @@ if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") endif() set(WOLFSSL_BASE64_ENCODE_HELP_STRING "Enable Base64 encoding (default: enabled on x86_64)") -option(WOLFSSL_BASE64_ENCODE ${WOLFSSL_BASE64_ENCODE_HELP_STRING} ${BASE64_ENCODE_DEFAULT}) +add_option("WOLFSSL_BASE64_ENCODE" ${WOLFSSL_BASE64_ENCODE_HELP_STRING} ${BASE64_ENCODE_DEFAULT} "yes;no") if(WOLFSSL_BASE64_ENCODE) list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_BASE64_ENCODE") @@ -805,7 +797,7 @@ endif() # DES3 set(WOLFSSL_DES3_HELP_STRING "Enable DES3 (default: disabled)") -option(WOLFSSL_DES3 ${WOLFSSL_DES3_HELP_STRING} "no") +add_option("WOLFSSL_DES3" ${WOLFSSL_DES3_HELP_STRING} "no" "yes;no") if(WOLFSSL_OPENSSH OR WOLFSSL_QT OR @@ -818,7 +810,7 @@ endif() # ARC4 set(WOLFSSL_ARC4_HELP_STRING "Enable ARC4 (default: disabled)") -option(WOLFSSL_ARC4 ${WOLFSSL_ARC4_HELP_STRING} "no") +add_option("WOLFSSL_ARC4" ${WOLFSSL_ARC4_HELP_STRING} "no" "yes;no") if(WOLFSSL_OPENSSH OR WOLFSSL_WPAS) override_cache(WOLFSSL_ARC4 "yes") @@ -836,7 +828,7 @@ endif() # MD5 set(WOLFSSL_MD5_HELP_STRING "Enable MD5 (default: enabled)") -option(WOLFSSL_MD5 ${WOLFSSL_MD5_HELP_STRING} "yes") +add_option("WOLFSSL_MD5" ${WOLFSSL_MD5_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_MD5) list(APPEND WOLFSSL_DEFINITIONS "-DNO_MD5" "-DNO_OLD_TLS") @@ -850,7 +842,7 @@ endif() # SHA set(WOLFSSL_SHA_HELP_STRING "Enable SHA (default: enabled)") -option(WOLFSSL_SHA ${WOLFSSL_SHA_HELP_STRING} "yes") +add_option("WOLFSSL_SHA" ${WOLFSSL_SHA_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_SHA) list(APPEND WOLFSSL_DEFINITIONS "-DNO_SHA" "-DNO_OLD_TLS") @@ -869,7 +861,7 @@ endif() # HC128 set(WOLFSSL_HC128_HELP_STRING "Enable HC-128 (default: disabled)") -option(WOLFSSL_HC128 ${WOLFSSL_HC128_HELP_STRING} "no") +add_option("WOLFSSL_HC128" ${WOLFSSL_HC128_HELP_STRING} "no" "yes;no") if(NOT WOLFSSL_HC128) list(APPEND WOLFSSL_DEFINITIONS "-DNO_HC128") @@ -925,7 +917,7 @@ if(WOLFSSL_FIPS) endif() set(WOLFSSL_POLY1305_HELP_STRING "Enable wolfSSL POLY1305 support (default: enabled)") -option(WOLFSSL_POLY1305 ${WOLFSSL_POLY1305_HELP_STRING} ${POLY1305_DEFAULT}) +add_option("WOLFSSL_POLY1305" ${WOLFSSL_POLY1305_HELP_STRING} ${POLY1305_DEFAULT} "yes;no") # leanpsk and leantls don't need poly1305 if(WOLFSSL_LEAN_PSK OR WOLFSSL_LEAN_TLS) @@ -945,8 +937,7 @@ if(WOLFSSL_FIPS) endif() set(WOLFSSL_CHACHA_HELP_STRING "Enable CHACHA (default: enabled). Use `=noasm` to disable ASM AVX/AVX2 speedups") -set(WOLFSSL_CHACHA ${CHACHA_DEFAULT} CACHE STRING ${WOLFSSL_CHACHA_HELP_STRING}) -set_property(CACHE WOLFSSL_CHACHA PROPERTY STRINGS "yes" "no" "noasm") +add_option("WOLFSSL_CHACHA" ${WOLFSSL_CHACHA_HELP_STRING} ${CHACHA_DEFAULT} "yes;no;noasm") # leanpsk and leantls don't need chacha if(WOLFSSL_LEAN_PSK OR WOLFSSL_LEAN_TLS) @@ -965,7 +956,7 @@ endif() # Hash DRBG set(WOLFSSL_HASH_DRBG_HELP_STRING "Enable Hash DRBG support (default: enabled)") -option(WOLFSSL_HASH_DRBG ${WOLFSSL_HASH_DRBG_HELP_STRING} "yes") +add_option("WOLFSSL_HASH_DRBG" ${WOLFSSL_HASH_DRBG_HELP_STRING} "yes" "yes;no") if(WOLFSSL_HASH_DRBG) list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_HASHDRBG") @@ -987,7 +978,7 @@ else() endif() set(WOLFSSL_FILESYSTEM_HELP_STRING "Enable Filesystem support (default: enabled)") -option(WOLFSSL_FILESYSTEM ${WOLFSSL_FILESYSTEM_HELP_STRING} ${FILESYSTEM_DEFAULT}) +add_option("WOLFSSL_FILESYSTEM" ${WOLFSSL_FILESYSTEM_HELP_STRING} ${FILESYSTEM_DEFAULT} "yes;no") if(NOT WOLFSSL_FILESYSTEM) list(APPEND WOLFSSL_DEFINITIONS "-DNO_FILESYSTEM") @@ -1000,7 +991,7 @@ endif() # Inline function support set(WOLFSSL_INLINE_HELP_STRING "Enable inline functions (default: enabled)") -option(WOLFSSL_INLINE ${WOLFSSL_INLINE_HELP_STRING} "yes") +add_option("WOLFSSL_INLINE" ${WOLFSSL_INLINE_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_INLINE) list(APPEND WOLFSSL_DEFINITIONS "-DNO_INLINE") @@ -1026,7 +1017,7 @@ endif() # Supported elliptic curves extensions set(WOLFSSL_SUPPORTED_CURVES_HELP_STRING "Enable Supported Elliptic Curves (default: enabled)") -option(WOLFSSL_SUPPORTED_CURVES ${WOLFSSL_SUPPORTED_CURVES_HELP_STRING} "yes") +add_option("WOLFSSL_SUPPORTED_CURVES" ${WOLFSSL_SUPPORTED_CURVES_HELP_STRING} "yes" "yes;no") if(WOLFSSL_SUPPORTED_CURVES) if(NOT WOLFSSL_ECC AND NOT WOLFSSL_CURVE25519 AND NOT WOLFSSL_CURVE448) @@ -1065,7 +1056,7 @@ endif() # Extended master secret extension set(WOLFSSL_EXTENDED_MASTER_HELP_STRING "Enable Extended Master Secret (default: enabled)") -option(WOLFSSL_EXTENDED_MASTER ${WOLFSSL_EXTENDED_MASTER_HELP_STRING} "yes") +add_option("WOLFSSL_EXTENDED_MASTER" ${WOLFSSL_EXTENDED_MASTER_HELP_STRING} "yes" "yes;no") if(WOLFSSL_EXTENDED_MASTER) list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_EXTENDED_MASTER") @@ -1091,7 +1082,7 @@ endif() # Encrypt-then-mac set(WOLFSSL_ENC_THEN_MAC_HELP_STRING "Enable Encryptr-Then-Mac extension (default: enabled)") -option(WOLFSSL_ENC_THEN_MAC ${WOLFSSL_ENC_THEN_MAC_HELP_STRING} "yes") +add_option("WOLFSSL_ENC_THEN_MAC" ${WOLFSSL_ENC_THEN_MAC_HELP_STRING} "yes" "yes;no") if(WOLFSSL_APACHE_HTTPD) override_cache(WOLFSSL_ENC_THEN_MAC "no") @@ -1108,7 +1099,7 @@ endif() # stunnel Support # TODO: rest of stunnel support set(WOLFSSL_STUNNEL_HELP_STRING "Enable stunnel (default: disabled)") -option(WOLFSSL_STUNNEL ${WOLFSSL_STUNNEL_HELP_STRING} "no") +add_option("WOLFSSL_STUNNEL" ${WOLFSSL_STUNNEL_HELP_STRING} "no" "yes;no") if(NOT WOLFSSL_PSK AND NOT WOLFSSL_LEAN_PSK AND @@ -1122,7 +1113,7 @@ endif() # MD4 set(WOLFSSL_MD4_HELP_STRING "Enable MD4 (default: disabled)") -option(WOLFSSL_MD4 ${WOLFSSL_MD4_HELP_STRING} "no") +add_option("WOLFSSL_MD4" ${WOLFSSL_MD4_HELP_STRING} "no" "yes;no") if(NOT WOLFSSL_MD4) # turn on MD4 if using stunnel @@ -1138,7 +1129,7 @@ endif() # PWDBASED has to come after certservice since we want it on w/o explicit on # PWDBASED set(WOLFSSL_PWDBASED_HELP_STRING "Enable PWDBASED (default: disabled)") -option(WOLFSSL_PWDBASED ${WOLFSSL_PWDBASED_HELP_STRING} "no") +add_option("WOLFSSL_PWDBASED" ${WOLFSSL_PWDBASED_HELP_STRING} "no" "yes;no") if(NOT WOLFSSL_PWDBASED) if(WOLFSSL_OPENSSLEXTRA OR @@ -1172,7 +1163,7 @@ if(WOLFSSL_SP_MATH) endif() set(WOLFSSL_FAST_MATH_HELP_STRING "Enable fast math ops (default: enabled on x86_64/aarch64)") -option(WOLFSSL_FAST_MATH ${WOLFSSL_FAST_MATH_HELP_STRING} ${FASTMATH_DEFAULT}) +add_option("WOLFSSL_FAST_MATH" ${WOLFSSL_FAST_MATH_HELP_STRING} ${FASTMATH_DEFAULT} "yes;no") if(WOLFSSL_FAST_MATH) # turn off fastmath if leanpsk on or asn off (w/o DH and ECC) @@ -1206,7 +1197,7 @@ else() endif() set(WOLFSSL_EXAMPLES_HELP_STRING "Enable examples (default: enabled)") -option(WOLFSSL_EXAMPLES ${WOLFSSL_EXAMPLES_HELP_STRING} ${EXAMPLES_DEFAULT}) +add_option("WOLFSSL_EXAMPLES" ${WOLFSSL_EXAMPLES_HELP_STRING} ${EXAMPLES_DEFAULT} "yes;no") if(NOT WOLFSSL_FILESYSTEM OR NOT WOLFSSL_INLINE OR @@ -1222,7 +1213,7 @@ else() endif() set(WOLFSSL_CRYPT_TESTS_HELP_STRING "Enable Crypt Bench/Test (default: enabled)") -option(WOLFSSL_CRYPT_TESTS ${WOLFSSL_CRYPT_TESTS_HELP_STRING} ${CRYPT_TESTS_DEFAULT}) +add_option("WOLFSSL_CRYPT_TESTS" ${WOLFSSL_CRYPT_TESTS_HELP_STRING} ${CRYPT_TESTS_DEFAULT} "yes;no") # TODO: - LIBZ # - PKCS#11 @@ -1239,7 +1230,7 @@ option(WOLFSSL_CRYPT_TESTS ${WOLFSSL_CRYPT_TESTS_HELP_STRING} ${CRYPT_TESTS_DEFA # Asynchronous threading set(WOLFSSL_ASYNC_THREADS_HELP_STRING "Enable Asynchronous Threading (default: enabled)") -option(WOLFSSL_ASYNC_THREADS ${WOLFSSL_ASYNC_THREADS_HELP_STRING} "yes") +add_option("WOLFSSL_ASYNC_THREADS" ${WOLFSSL_ASYNC_THREADS_HELP_STRING} "yes" "yes;no") if(WOLFSSL_ASYNC_CRYPT AND WOLFSSL_ASYNC_THREADS) if(CMAKE_USE_PTHREADS_INIT) @@ -1264,7 +1255,7 @@ endif() # - AES key wrap set(WOLFSSL_OLD_NAMES_HELP_STRING "Keep backwards compat with old names (default: enabled)") -option(WOLFSSL_OLD_NAMES ${WOLFSSL_OLD_NAMES_HELP_STRING} "yes") +add_option("WOLFSSL_OLD_NAMES" ${WOLFSSL_OLD_NAMES_HELP_STRING} "yes" "yes;no") if(NOT WOLFSSL_OLD_NAMES AND NOT WOLFSSL_OPENSSL_COEXIST) list(APPEND WOLFSSL_DEFINITIONS @@ -1279,7 +1270,7 @@ endif() # Support for enabling setting default DH parameters set(WOLFSSL_DH_DEFAULT_PARAMS_HELP_STRING "Enables option for default dh parameters (default: disabled)") -option(WOLFSSL_DH_DEFAULT_PARAMS ${WOLFSSL_DH_DEFAULT_PARAMS_HELP_STRING} "no") +add_option("WOLFSSL_DH_DEFAULT_PARAMS" ${WOLFSSL_DH_DEFAULT_PARAMS_HELP_STRING} "no" "yes;no") if(WOLFSSL_DH_DEFAULT_PARAMS OR NOT WOLFSSL_QT) override_cache(WOLFSSL_DH_DEFAULT_PARAMS "yes") @@ -1297,10 +1288,10 @@ else() endif() set(WOLFSSL_USER_SETTINGS_HELP_STRING "Use your own user_settings.h and do not add Makefile CFLAGS (default: disabled)") -option(WOLFSSL_USER_SETTINGS ${WOLFSSL_USER_SETTINGS_HELP_STRING} "no") +add_option("WOLFSSL_USER_SETTINGS" ${WOLFSSL_USER_SETTINGS_HELP_STRING} "no" "yes;no") set(WOLFSSL_OPTFLAGS_HELP_STRING "Enable default optimization CFLAGS for the compiler (default: enabled)") -option(WOLFSSL_OPTFLAGS ${WOLFSSL_OPTFLAGS_HELP_STRING} "yes") +add_option("WOLFSSL_OPTFLAGS" ${WOLFSSL_OPTFLAGS_HELP_STRING} "yes" "yes;no") # Generates the BUILD_* flags. These control what source files are included in # the library. A series of AM_CONDITIONALs handle this in configure.ac. @@ -1320,7 +1311,7 @@ endif() add_definitions(${WOLFSSL_DEFINITIONS}) set(WOLFSSL_CONFIG_H_HELP_STRING "Enable generation of config.h and define HAVE_CONFIG_H (default: enabled)") -option(WOLFSSL_CONFIG_H ${WOLFSSL_CONFIG_H_HELP_STRING} "yes") +add_option("WOLFSSL_CONFIG_H" ${WOLFSSL_CONFIG_H_HELP_STRING} "yes" "yes;no") if(WOLFSSL_CONFIG_H) add_definitions("-DHAVE_CONFIG_H") diff --git a/cmake/functions.cmake b/cmake/functions.cmake index abb0e5a2b2..1869c50c10 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -1,3 +1,22 @@ +function(add_option NAME HELP_STRING DEFAULT VALUES) + list(FIND VALUES ${DEFAULT} IDX) + if (${IDX} EQUAL -1) + message(FATAL_ERROR "Failed to add option ${NAME}. Default value " + "${DEFAULT} is not in list of possible values: ${VALUES}.") + endif() + + if(DEFINED ${NAME}) + list(FIND VALUES ${${NAME}} IDX) + if (${IDX} EQUAL -1) + message(FATAL_ERROR "Failed to set option ${NAME}. Value " + "${${NAME}} is not in list of possible values: ${VALUES}.") + endif() + endif() + + set(${NAME} ${DEFAULT} CACHE STRING ${HELP_STRING}) + set_property(CACHE ${NAME} PROPERTY STRINGS ${VALUES}) +endfunction() + function(override_cache VAR VAL) get_property(VAR_TYPE CACHE ${VAR} PROPERTY TYPE) set(${VAR} ${VAL} CACHE ${VAR_TYPE} ${${VAR}_HELP_STRING} FORCE) From 265b456cacda38a8653112a50c03de65f54c7d8a Mon Sep 17 00:00:00 2001 From: Hayden Roche Date: Wed, 24 Feb 2021 12:02:09 -0600 Subject: [PATCH 43/78] Improve wolfSSL_CertManagerGetCerts. - Use wolfSSL_d2i_X509. wolfSSL_CertManagerGetCerts duplicated a lot of work that wolfSSL_d2i_X509 can do for us. - This function gets the caLock from the CertManager and then calls ParseCert. Ultimately, ParseCert calls GetCA, which attempts to acquire the same caLock. Deadlock ensues. The solution is to get the caLock, make a copy of all the certs, and release the lock. Then, we use the copy of the certs to build up the stack of X509 objects. What happens if one of the certs is removed from the CertManager between our copying and calling wolfSSL_d2i_X509? Nothing of consequence for this use case. ParseCertRelative won't set the DecodedCert's ca field, but we don't need that to be set here. --- src/ssl.c | 134 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 69 insertions(+), 65 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index aa324b07e8..fd587dd099 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -3792,97 +3792,101 @@ int wolfSSL_CertManager_up_ref(WOLFSSL_CERT_MANAGER* cm) WOLFSSL_STACK* wolfSSL_CertManagerGetCerts(WOLFSSL_CERT_MANAGER* cm) { WOLFSSL_STACK* sk = NULL; + int numCerts = 0; + DerBuffer** certBuffers = NULL; + const byte* derBuffer = NULL; Signer* signers = NULL; word32 row = 0; - DecodedCert* dCert = NULL; WOLFSSL_X509* x509 = NULL; - int found = 0; + int i = 0; + int ret = 0; if (cm == NULL) return NULL; sk = wolfSSL_sk_X509_new(); + if (sk == NULL) + goto error; - if (sk == NULL) { - return NULL; - } - - if (wc_LockMutex(&cm->caLock) != 0) { - goto error_init; - } + if (wc_LockMutex(&cm->caLock) != 0) + goto error; + /* Iterate once to get the number of certs, for memory allocation + purposes. */ for (row = 0; row < CA_TABLE_SIZE; row++) { signers = cm->caTable[row]; while (signers && signers->derCert && signers->derCert->buffer) { - - dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap, - DYNAMIC_TYPE_DCERT); - if (dCert == NULL) { - goto error; - } - - XMEMSET(dCert, 0, sizeof(DecodedCert)); - - InitDecodedCert(dCert, signers->derCert->buffer, - signers->derCert->length, cm->heap); - - /* Parse Certificate */ - if (ParseCert(dCert, CERT_TYPE, NO_VERIFY, cm)) { - goto error; - } - - x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), cm->heap, - DYNAMIC_TYPE_X509); - - if (x509 == NULL) { - goto error; - } - - InitX509(x509, 1, NULL); - - if (CopyDecodedToX509(x509, dCert) == 0) { - - if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("Unable to load x509 into stack"); - FreeX509(x509); - XFREE(x509, cm->heap, DYNAMIC_TYPE_X509); - goto error; - } - } - else { - goto error; - } - - found = 1; - + ++numCerts; signers = signers->next; - - FreeDecodedCert(dCert); - XFREE(dCert, cm->heap, DYNAMIC_TYPE_DCERT); - dCert = NULL; } } + + if (numCerts == 0) { + wc_UnLockMutex(&cm->caLock); + goto error; + } + + certBuffers = (DerBuffer**)XMALLOC(sizeof(DerBuffer*) * numCerts, cm->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (certBuffers == NULL) { + wc_UnLockMutex(&cm->caLock); + goto error; + } + XMEMSET(certBuffers, 0, sizeof(DerBuffer*) * numCerts); + + /* Copy the certs locally so that we can release the caLock. If the lock is + held when wolfSSL_d2i_X509 is called, GetCA will also try to get the + lock, leading to deadlock. */ + for (row = 0; row < CA_TABLE_SIZE; row++) { + signers = cm->caTable[row]; + while (signers && signers->derCert && signers->derCert->buffer) { + ret = AllocDer(&certBuffers[i], signers->derCert->length, CA_TYPE, + cm->heap); + if (ret < 0) { + wc_UnLockMutex(&cm->caLock); + goto error; + } + + XMEMCPY(certBuffers[i]->buffer, signers->derCert->buffer, + signers->derCert->length); + certBuffers[i]->length = signers->derCert->length; + + ++i; + signers = signers->next; + } + } + wc_UnLockMutex(&cm->caLock); - if (!found) { - goto error_init; + for (i = 0; i < numCerts; ++i) { + derBuffer = certBuffers[i]->buffer; + wolfSSL_d2i_X509(&x509, &derBuffer, certBuffers[i]->length); + if (x509 == NULL) + goto error; + + if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) + goto error; } + for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) { + FreeDer(&certBuffers[i]); + } + + XFREE(certBuffers, cm->heap, DYNAMIC_TYPE_TMP_BUFFER); + return sk; error: - wc_UnLockMutex(&cm->caLock); - -error_init: - - if (dCert) { - FreeDecodedCert(dCert); - XFREE(dCert, cm->heap, DYNAMIC_TYPE_DCERT); - } - if (sk) wolfSSL_sk_X509_free(sk); + for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) { + FreeDer(&certBuffers[i]); + } + + if (certBuffers) + XFREE(certBuffers, cm->heap, DYNAMIC_TYPE_TMP_BUFFER); + return NULL; } #endif /* WOLFSSL_SIGNER_DER_CERT */ From 8c1a93d9e186fcd73c0cc2bf78ab31e72690b6e6 Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 1 Mar 2021 09:23:19 -0800 Subject: [PATCH 44/78] Using "rand()" to seed our PRNG as its available on all INTIME RTOS versions. --- wolfcrypt/src/random.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wolfcrypt/src/random.c b/wolfcrypt/src/random.c index 230abb83cd..cc1e33dee9 100644 --- a/wolfcrypt/src/random.c +++ b/wolfcrypt/src/random.c @@ -2236,8 +2236,8 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) #elif defined(INTIME_RTOS) int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) { - uint32_t rand; - word32 len = sizeof(rand); + uint32_t randval; + word32 len = sizeof(randval); if (output == NULL) { return BUFFER_E; @@ -2246,8 +2246,8 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) while (sz > 0) { if (sz < len) len = sz; - rand = arc4random(); /* returns 32-bits of random */ - XMEMCPY(output, &rand, len); + randval = rand(); /* returns 32-bits of random */ + XMEMCPY(output, &randval, len); output += len; sz -= len; } From 14faf16955d36011984cd8ceadc66bb6172935ca Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 1 Mar 2021 10:14:28 -0800 Subject: [PATCH 45/78] Dismiss unused warnings for dh_test. --- wolfcrypt/test/test.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 3f8d44f76c..9f78b5b1f1 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -16242,7 +16242,6 @@ WOLFSSL_TEST_SUBROUTINE int dh_test(void) #ifndef WC_NO_RNG #ifdef WOLFSSL_SMALL_STACK - byte *priv = (byte *)XMALLOC(DH_TEST_BUF_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); byte *pub = (byte *)XMALLOC(DH_TEST_BUF_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); byte *priv2 = (byte *)XMALLOC(DH_TEST_BUF_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -16536,6 +16535,9 @@ done: wc_FreeDhKey(key2); #endif + (void)privSz; + (void)pubSz; + (void)pubSz2; (void)pubSz2; return ret; From 84d5d37f61e9d3234ca4c32aac4a0b7e011d4dba Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Tue, 2 Mar 2021 08:34:23 +1000 Subject: [PATCH 46/78] SP int: define errors for backward compatability --- wolfssl/wolfcrypt/sp_int.h | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/wolfssl/wolfcrypt/sp_int.h b/wolfssl/wolfcrypt/sp_int.h index 562603e81d..163dcdad0d 100644 --- a/wolfssl/wolfcrypt/sp_int.h +++ b/wolfssl/wolfcrypt/sp_int.h @@ -655,9 +655,9 @@ typedef struct sp_ecc_ctx { #endif /** Radix is base 10 or decimal. */ -#define MP_RADIX_DEC 10 +#define MP_RADIX_DEC 10 /** Radix is base 16 or hexadecimal. */ -#define MP_RADIX_HEX 16 +#define MP_RADIX_HEX 16 /** Result of comparison is that the first number is greater than second. */ #define MP_GT 1 @@ -666,16 +666,21 @@ typedef struct sp_ecc_ctx { /** Result of comparison is that the first number is less than second. */ #define MP_LT -1 +/* ERROR VALUES */ /** Error value on success. */ -#define MP_OKAY 0 +#define MP_OKAY 0 /** Error value when dynamic memory allocation fails. */ -#define MP_MEM -2 +#define MP_MEM -2 /** Error value when value passed is not able to be used. */ -#define MP_VAL -3 +#define MP_VAL -3 /** Error value when non-blocking operation is returning after partial * completion. */ -#define FP_WOULDBLOCK -4 +#define FP_WOULDBLOCK -4 +/* Unused error. Defined for backward compatability. */ +#define MP_NOT_INF -5 +/* Unused error. Defined for backward compatability. */ +#define MP_RANGE MP_NOT_INF /* Number of bits in each word/digit. */ #define DIGIT_BIT SP_WORD_SIZE From 9d4d36f7fee4845888ca898afbbb998aabc8b6ce Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 1 Mar 2021 16:02:51 -0800 Subject: [PATCH 47/78] Fix hasty copy/paste with `privSz2`. --- wolfcrypt/test/test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 9f78b5b1f1..5b96623001 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -16538,7 +16538,7 @@ done: (void)privSz; (void)pubSz; (void)pubSz2; - (void)pubSz2; + (void)privSz2; return ret; #undef DH_TEST_BUF_SIZE From 9fe7be5ac4569c8af15f370bb2621f9eaefc346d Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 1 Mar 2021 17:17:40 -0800 Subject: [PATCH 48/78] Improve the key ecc_set NULL checking for possible use of `key->dp == NULL` cases. This is cases where the key has not been properly iniailized or loaded prior to calling from a public API. --- wolfcrypt/src/ecc.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index f073f0c3a2..4db120b0d0 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -3799,8 +3799,8 @@ int wc_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out, } /* Verify domain params supplied */ - if (wc_ecc_is_valid_idx(private_key->idx) == 0 || - wc_ecc_is_valid_idx(public_key->idx) == 0) { + if (wc_ecc_is_valid_idx(private_key->idx) == 0 || private_key->dp == NULL || + wc_ecc_is_valid_idx(public_key->idx) == 0 || public_key->dp == NULL) { return ECC_BAD_ARG_E; } @@ -4101,7 +4101,7 @@ int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point, } /* Verify domain params supplied */ - if (wc_ecc_is_valid_idx(private_key->idx) == 0) { + if (wc_ecc_is_valid_idx(private_key->idx) == 0 || private_key->dp == NULL) { WOLFSSL_MSG("wc_ecc_is_valid_idx failed"); return ECC_BAD_ARG_E; } @@ -4168,7 +4168,7 @@ int wc_ecc_point_is_on_curve(ecc_point *p, int curve_idx) return BAD_FUNC_ARG; /* is the IDX valid ? */ - if (wc_ecc_is_valid_idx(curve_idx) != 1) { + if (wc_ecc_is_valid_idx(curve_idx) == 0) { return ECC_BAD_ARG_E; } @@ -5248,7 +5248,7 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng, } /* is the IDX valid ? */ - if (wc_ecc_is_valid_idx(key->idx) != 1) { + if (wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL) { return ECC_BAD_ARG_E; } @@ -6409,7 +6409,7 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash, *res = 0; /* is the IDX valid ? */ - if (wc_ecc_is_valid_idx(key->idx) != 1) { + if (wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL) { return ECC_BAD_ARG_E; } @@ -7209,9 +7209,7 @@ int wc_ecc_export_x963(ecc_key* key, byte* out, word32* outLen) if (key->type == ECC_PRIVATEKEY_ONLY) return ECC_PRIVATEONLY_E; - if (key->type == 0 || - wc_ecc_is_valid_idx(key->idx) == 0 || - key->dp == NULL) { + if (key->type == 0 || wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL){ return ECC_BAD_ARG_E; } @@ -7988,7 +7986,7 @@ int wc_ecc_export_ex(ecc_key* key, byte* qx, word32* qxLen, return BAD_FUNC_ARG; } - if (wc_ecc_is_valid_idx(key->idx) == 0) { + if (wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL) { return ECC_BAD_ARG_E; } keySz = key->dp->size; @@ -8552,7 +8550,7 @@ int wc_ecc_import_raw(ecc_key* key, const char* qx, const char* qy, /* key size in octets */ int wc_ecc_size(ecc_key* key) { - if (key == NULL) + if (key == NULL || key->dp == NULL) return 0; return key->dp->size; @@ -11356,9 +11354,7 @@ static int wc_ecc_export_x963_compressed(ecc_key* key, byte* out, word32* outLen if (key->type == ECC_PRIVATEKEY_ONLY) return ECC_PRIVATEONLY_E; - if (key->type == 0 || - wc_ecc_is_valid_idx(key->idx) == 0 || - key->dp == NULL) { + if (key->type == 0 || wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL){ return ECC_BAD_ARG_E; } From 4ff886dbdaf959f397b1f7ded827d3c4dd3572c5 Mon Sep 17 00:00:00 2001 From: Elms Date: Mon, 1 Mar 2021 08:55:25 -0800 Subject: [PATCH 49/78] test: fix compile with session-ticket without AES-GCM EVP compat layer doesn't support poly chacha so test shouldn't be included to try and test it. --- tests/api.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/api.c b/tests/api.c index 85436a5ff5..687bc763ab 100644 --- a/tests/api.c +++ b/tests/api.c @@ -2625,14 +2625,14 @@ static int nonblocking_accept_read(void* args, WOLFSSL* ssl, SOCKET_T* sockfd) } #endif /* WOLFSSL_SESSION_EXPORT */ - +/* TODO: Expand and enable this when EVP_chacha20_poly1305 is supported */ #if defined(HAVE_SESSION_TICKET) && \ - ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || defined(HAVE_AESGCM)) && \ + defined(HAVE_AESGCM) && \ defined(OPENSSL_EXTRA) typedef struct openssl_key_ctx { byte name[WOLFSSL_TICKET_NAME_SZ]; /* server name */ - byte key[AES_256_KEY_SIZE]; /* cipher key */ + byte key[WOLFSSL_TICKET_KEY_SZ]; /* cipher key */ byte hmacKey[WOLFSSL_TICKET_NAME_SZ]; /* hmac key */ byte iv[WOLFSSL_TICKET_IV_SZ]; /* cipher iv */ } openssl_key_ctx; @@ -2737,7 +2737,7 @@ static THREAD_RETURN WOLFSSL_THREAD test_server_nofail(void* args) #if defined(HAVE_SESSION_TICKET) && \ ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || defined(HAVE_AESGCM)) -#ifdef OPENSSL_EXTRA +#if defined(OPENSSL_EXTRA) && defined(HAVE_AESGCM) OpenSSLTicketInit(); wolfSSL_CTX_set_tlsext_ticket_key_cb(ctx, myTicketEncCbOpenSSL); #elif defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) @@ -2929,7 +2929,7 @@ done: #if defined(HAVE_SESSION_TICKET) && \ ((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || defined(HAVE_AESGCM)) -#ifdef OPENSSL_EXTRA +#if defined(OPENSSL_EXTRA) && defined(HAVE_AESGCM) OpenSSLTicketCleanup(); #elif defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) TicketCleanup(); From 3752347f1489d9e8208a38d073e443a0b5ef4391 Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 2 Mar 2021 15:04:01 -0800 Subject: [PATCH 50/78] Improve the random logic for the INTIME RTOS RNG. --- wolfcrypt/src/random.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/src/random.c b/wolfcrypt/src/random.c index cc1e33dee9..bd637173f4 100644 --- a/wolfcrypt/src/random.c +++ b/wolfcrypt/src/random.c @@ -2237,16 +2237,27 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) { uint32_t randval; - word32 len = sizeof(randval); + word32 len; if (output == NULL) { return BUFFER_E; } + #ifdef INTIMEVER + /* If INTIMEVER exists then it is INTIME RTOS v6 or later */ + #define INTIME_RAND_FUNC arc4random + len = 4; + #else + /* v5 and older */ + #define INTIME_RAND_FUNC rand + srand(time(0)); + len = 2; /* don't use all 31 returned bits */ + #endif + while (sz > 0) { if (sz < len) len = sz; - randval = rand(); /* returns 32-bits of random */ + randval = INTIME_RAND_FUNC(); XMEMCPY(output, &randval, len); output += len; sz -= len; From 6725a4f5d2a42c97ec82607ddb78ee821d774673 Mon Sep 17 00:00:00 2001 From: Guido Vranken Date: Wed, 3 Mar 2021 20:03:10 +0100 Subject: [PATCH 51/78] Return error code from sp_cond_swap_ct ZD 11824 --- wolfcrypt/src/sp_int.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c index b0d1bc5678..cbd24ee197 100644 --- a/wolfcrypt/src/sp_int.c +++ b/wolfcrypt/src/sp_int.c @@ -2481,7 +2481,7 @@ int sp_cond_swap_ct(sp_int * a, sp_int * b, int c, int m) } FREE_SP_INT(t, NULL); - return MP_OKAY; + return err; } #endif /* HAVE_ECC && ECC_TIMING_RESISTANT && !WC_NO_CACHE_RESISTANT */ From 2be80acdd39e3198ca01f613cd9ad59c0fd127bd Mon Sep 17 00:00:00 2001 From: Chris Conlon Date: Wed, 3 Mar 2021 16:19:58 -0700 Subject: [PATCH 52/78] fix PKCS7 dynamic content save/restore in PKCS7_VerifySignedData for multiPart bundles with certs --- wolfcrypt/src/pkcs7.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/wolfcrypt/src/pkcs7.c b/wolfcrypt/src/pkcs7.c index 439d272b51..2e93f4b580 100644 --- a/wolfcrypt/src/pkcs7.c +++ b/wolfcrypt/src/pkcs7.c @@ -4917,16 +4917,27 @@ static int PKCS7_VerifySignedData(PKCS7* pkcs7, const byte* hashBuf, der = pkcs7->der; pkcs7->der = NULL; #endif - contentDynamic = pkcs7->contentDynamic; version = pkcs7->version; - if (ret == 0) { byte isDynamic = pkcs7->isDynamic; #ifndef NO_PKCS7_STREAM PKCS7State* stream = pkcs7->stream; pkcs7->stream = NULL; #endif + + /* Save dynamic content before freeing PKCS7 struct */ + if (pkcs7->contentDynamic != NULL) { + contentDynamic = (byte*)XMALLOC(contentSz, + pkcs7->heap, DYNAMIC_TYPE_PKCS7); + if (contentDynamic == NULL) { + ret = MEMORY_E; + break; + } + XMEMCPY(contentDynamic, pkcs7->contentDynamic, + contentSz); + } + /* Free pkcs7 resources but not the structure itself */ pkcs7->isDynamic = 0; wc_PKCS7_Free(pkcs7); @@ -4934,11 +4945,18 @@ static int PKCS7_VerifySignedData(PKCS7* pkcs7, const byte* hashBuf, /* This will reset PKCS7 structure and then set the * certificate */ ret = wc_PKCS7_InitWithCert(pkcs7, cert, certSz); + + /* Restore pkcs7->contentDynamic from above, will be + * freed by application with wc_PKCS7_Free() */ + if (contentDynamic != NULL) { + pkcs7->contentDynamic = contentDynamic; + contentDynamic = NULL; + } + #ifndef NO_PKCS7_STREAM pkcs7->stream = stream; #endif } - pkcs7->contentDynamic = contentDynamic; pkcs7->version = version; #ifdef ASN_BER_TO_DER pkcs7->der = der; From 871933e3e8e3ccef3ee18540035da30f23868ed8 Mon Sep 17 00:00:00 2001 From: TakayukiMatsuo Date: Thu, 4 Mar 2021 15:41:03 +0900 Subject: [PATCH 53/78] Add s comment to wolfSSL_BIO_tell --- src/bio.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/bio.c b/src/bio.c index d3bf6e4fe1..17541ea2d6 100644 --- a/src/bio.c +++ b/src/bio.c @@ -1439,6 +1439,11 @@ int wolfSSL_BIO_seek(WOLFSSL_BIO *bio, int ofs) return 0; } +/* wolfSSL_BIO_tell is provided as compatible API with + * BIO_tell which returns the current file position of a file related BIO. + * Returns the current file position on success and -1 for failure. + * Returns 0 for a BIOs except file related BIO. + */ int wolfSSL_BIO_tell(WOLFSSL_BIO* bio) { int pos; From 791a5b4244860e381eaa2d50047ebbcc0527f26d Mon Sep 17 00:00:00 2001 From: Daniele Lacamera Date: Thu, 4 Mar 2021 08:33:20 +0100 Subject: [PATCH 54/78] iMXRT1060 support: Fixed duplicate definition of wc_InitSha & wc_ShaCopy --- wolfcrypt/src/sha.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index 63f4ed402c..543a0ab4aa 100644 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -776,10 +776,13 @@ int wc_ShaFinal(wc_Sha* sha, byte* hash) #endif /* USE_SHA_SOFTWARE_IMPL */ + +#if !defined(WOLFSSL_IMXRT_DCP) int wc_InitSha(wc_Sha* sha) { return wc_InitSha_ex(sha, NULL, INVALID_DEVID); } +#endif /* !defined(WOLFSSL_IMXRT_DCP) */ void wc_ShaFree(wc_Sha* sha) { @@ -808,7 +811,8 @@ void wc_ShaFree(wc_Sha* sha) #endif /* !WOLFSSL_TI_HASH */ #endif /* HAVE_FIPS */ -#ifndef WOLFSSL_TI_HASH +#if !defined(WOLFSSL_TI_HASH) && !defined(WOLFSSL_IMXRT_DCP) + #if !defined(WOLFSSL_RENESAS_TSIP_CRYPT) || \ defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) int wc_ShaGetHash(wc_Sha* sha, byte* hash) @@ -873,7 +877,7 @@ int wc_ShaCopy(wc_Sha* src, wc_Sha* dst) return ret; } #endif /* defined(WOLFSSL_RENESAS_TSIP_CRYPT) ... */ -#endif /* !WOLFSSL_TI_HASH */ +#endif /* !WOLFSSL_TI_HASH && !WOLFSSL_IMXRT_DCP */ #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB) From 7610e4989cde66649aa40150d2bdab274a9f25eb Mon Sep 17 00:00:00 2001 From: Daniele Lacamera Date: Thu, 4 Mar 2021 08:34:15 +0100 Subject: [PATCH 55/78] iMX-RT1060 support: Fixed missing definition of wc_Sha256Free --- wolfcrypt/src/sha256.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index 50b8cf60f8..de785e0c5f 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -130,8 +130,6 @@ where 0 <= L < 2^64. #elif defined(WOLFSSL_CRYPTOCELL) /* wc_port.c includes wolfcrypt/src/port/arm/cryptoCellHash.c */ -#elif defined(WOLFSSL_IMXRT_DCP) - #elif defined(WOLFSSL_PSOC6_CRYPTO) From 16f39b4e77bdf9ddb6e12ceb64d00ab93e2acb9b Mon Sep 17 00:00:00 2001 From: Tesfa Mael Date: Thu, 25 Feb 2021 16:42:18 -0800 Subject: [PATCH 56/78] Fix _sp_add_d err --- wolfcrypt/src/sp_int.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c index cbd24ee197..1a92214423 100644 --- a/wolfcrypt/src/sp_int.c +++ b/wolfcrypt/src/sp_int.c @@ -2996,7 +2996,7 @@ int sp_cmp_d(sp_int* a, sp_int_digit d) #endif #if defined(WOLFSSL_SP_INT_NEGATIVE) || !defined(NO_PWDBASED) || \ - defined(WOLFSSL_KEY_GEN) || !defined(NO_DH) || defined(HAVE_ECC) || \ + defined(WOLFSSL_KEY_GEN) || !defined(NO_DH) || \ (!defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) /* Add a one digit number to the multi-precision number. * From 19fa75c6a8dd45532ef565beb06f716d2d0e5001 Mon Sep 17 00:00:00 2001 From: Tesfa Mael Date: Fri, 26 Feb 2021 15:44:11 -0800 Subject: [PATCH 57/78] static memory no longer requires fast math --- wolfssl/wolfcrypt/settings.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 6d180137e5..cb3650bc1f 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -2094,8 +2094,9 @@ extern void uITRON4_free(void *p) ; #if defined(HAVE_IO_POOL) || defined(XMALLOC_USER) || defined(NO_WOLFSSL_MEMORY) #error static memory cannot be used with HAVE_IO_POOL, XMALLOC_USER or NO_WOLFSSL_MEMORY #endif - #if !defined(USE_FAST_MATH) && !defined(NO_BIG_INT) - #error static memory requires fast math please define USE_FAST_MATH + #if !defined(WOLFSSL_SP_NO_MALLOC) && \ + !defined(USE_FAST_MATH) && !defined(NO_BIG_INT) + #error The static memory option is only supported for fast math or SP with no malloc #endif #ifdef WOLFSSL_SMALL_STACK #error static memory does not support small stack please undefine From 2e223fb1014a5709c1b1446ac2b27b12b7c6bdda Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Tue, 5 Jan 2021 17:02:43 +0900 Subject: [PATCH 58/78] implemeted wolfSSL_CTX_get0/set1_param, and corresponding to sub-methods --- src/internal.c | 12 ++++ src/ssl.c | 110 ++++++++++++++++++++++++++++- tests/api.c | 157 +++++++++++++++++++++++++++++++++++++----- wolfssl/internal.h | 1 + wolfssl/openssl/ssl.h | 9 +++ wolfssl/ssl.h | 12 ++++ 6 files changed, 283 insertions(+), 18 deletions(-) diff --git a/src/internal.c b/src/internal.c index 79ec90351f..7baad8c51b 100644 --- a/src/internal.c +++ b/src/internal.c @@ -1800,6 +1800,15 @@ int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap) #ifdef OPENSSL_EXTRA /* setup WOLFSSL_X509_STORE */ ctx->x509_store.cm = ctx->cm; + + /* WOLFSSL_X509_VERIFY_PARAM */ + if ((ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC( + sizeof(WOLFSSL_X509_VERIFY_PARAM), + ctx->heap, DYNAMIC_TYPE_OPENSSL)) == NULL) { + WOLFSSL_MSG("ctx->param memory error"); + return MEMORY_E; + } + XMEMSET(ctx->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM)); #endif #endif @@ -1948,6 +1957,9 @@ void SSL_CtxResourceFree(WOLFSSL_CTX* ctx) XFREE((void *)ctx->alpn_cli_protos, NULL, DYNAMIC_TYPE_OPENSSL); ctx->alpn_cli_protos = NULL; } + if (ctx->param) { + XFREE(ctx->param, ctx->heap, DYNAMIC_TYPE_OPENSSL); + } #endif #ifdef WOLFSSL_STATIC_EPHEMERAL #ifndef NO_DH diff --git a/src/ssl.c b/src/ssl.c index c483d36b3e..1b9d6835cc 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -26195,6 +26195,68 @@ int wolfSSL_X509_VERIFY_PARAM_clear_flags(WOLFSSL_X509_VERIFY_PARAM *param, } +/* +* WOLFSSL_VPARAM_DEFAULT any values in "src" is copied +* if "src" value is new for "to". +* WOLFSSL_VPARAM_OVERWRITE all values of "form" are copied to "to" +* WOLFSSL_VPARAM_RESET_FLAGS the flag values are copied, not Ored +* WOLFSSL_VPARAM_LOCKED don't copy any values +* WOLFSSL_VPARAM_ONCE the current inherit_flags is zerroed +*/ +static int woflSSL_X509_VERIFY_PARAM_inherit(WOLFSSL_X509_VERIFY_PARAM *to, + const WOLFSSL_X509_VERIFY_PARAM *from) +{ + int ret = WOLFSSL_FAILURE; + int isOverWrite = 0; + int isDefault = 0; + unsigned int flags; + + /* sanity check */ + if (!to || !from) { + /* be compatible to openssl return value */ + return WOLFSSL_SUCCESS; + } + flags = to->inherit_flags | from->inherit_flags; + + if (flags & WOLFSSL_VPARAM_LOCKED) { + return WOLFSSL_SUCCESS; + } + + if (flags & WOLFSSL_VPARAM_ONCE) { + to->inherit_flags = 0; + } + + isOverWrite = (flags & WOLFSSL_VPARAM_OVERWRITE); + isDefault = (flags & WOLFSSL_VPARAM_DEFAULT); + + /* copy check_time if check time is not set */ + if ((to->flags & WOLFSSL_USE_CHECK_TIME) == 0 || isOverWrite) { + to->check_time = from->check_time; + to->flags &= ~WOLFSSL_USE_CHECK_TIME; + } + /* host name */ + if (isOverWrite || + (from->hostName[0] != 0 && (to->hostName[0] == 0 || isDefault))) { + if (!(ret = wolfSSL_X509_VERIFY_PARAM_set1_host(to, from->hostName, + XSTRLEN(from->hostName)))) + return ret; + to->hostFlags = from->hostFlags; + } + /* ip ascii */ + if (isOverWrite || + (from->ipasc[0] != 0 && (to->ipasc[0] == 0 || isDefault))) { + + if (!(ret = wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(to, from->ipasc))) + return ret; + } + + if (flags & WOLFSSL_VPARAM_RESET_FLAGS) + to->flags = 0; + + to->flags |= from->flags; + + return ret; +} /****************************************************************************** * wolfSSL_X509_VERIFY_PARAM_set1_host - sets the DNS hostname to name * hostnames is cleared if name is NULL or empty. @@ -26236,12 +26298,32 @@ int wolfSSL_X509_VERIFY_PARAM_set1_host(WOLFSSL_X509_VERIFY_PARAM* pParam, return WOLFSSL_SUCCESS; } /****************************************************************************** -* wolfSSL_get0_param - return a pointer to the SSL verification parameters +* wolfSSL_CTX_set1_param - set a pointer to the SSL verification parameters +* +* RETURNS: +* WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE +*/ +int wolfSSL_CTX_set1_param(WOLFSSL_CTX* ctx, WOLFSSL_X509_VERIFY_PARAM *vpm) +{ + return wolfSSL_X509_VERIFY_PARAM_set1(ctx->param, vpm); +} + +/****************************************************************************** +* wolfSSL_CTX/_get0_param - return a pointer to the SSL verification parameters * * RETURNS: * returns pointer to the SSL verification parameters on success, * otherwise returns NULL */ +WOLFSSL_X509_VERIFY_PARAM* wolfSSL_CTX_get0_param(WOLFSSL_CTX* ctx) +{ + if (ctx == NULL) { + return NULL; + } + + return ctx->param; +} + WOLFSSL_X509_VERIFY_PARAM* wolfSSL_get0_param(WOLFSSL* ssl) { if (ssl == NULL) { @@ -26250,6 +26332,32 @@ WOLFSSL_X509_VERIFY_PARAM* wolfSSL_get0_param(WOLFSSL* ssl) return ssl->param; } +/* Set VERIFY PARAM from "from" pointer to "to" pointer */ +int wolfSSL_X509_VERIFY_PARAM_set1(WOLFSSL_X509_VERIFY_PARAM *to, + const WOLFSSL_X509_VERIFY_PARAM *from) +{ + int ret = WOLFSSL_FAILURE; + unsigned int _inherit_flags; + + if (!to) { + return ret; + } + /* keeps the inherit flags for save */ + _inherit_flags = to->inherit_flags; + + /* Ored DEFAULT inherit flag proerty to copy "from" contents to "to" + * contends + */ + to->inherit_flags |= WOLFSSL_VPARAM_DEFAULT; + + ret = woflSSL_X509_VERIFY_PARAM_inherit(to, from); + + /* restore inherit flag */ + to->inherit_flags = _inherit_flags; + + return ret; +} + /* Set the host flag in the X509_VERIFY_PARAM structure */ void wolfSSL_X509_VERIFY_PARAM_set_hostflags(WOLFSSL_X509_VERIFY_PARAM* param, unsigned int flags) diff --git a/tests/api.c b/tests/api.c index 63e329fb09..7595237282 100644 --- a/tests/api.c +++ b/tests/api.c @@ -28045,6 +28045,50 @@ static void test_wolfSSL_X509_STORE_CTX_set_time(void) #endif /* OPENSSL_EXTRA */ } +static void test_wolfSSL_CTX_get0_set1_param(void) +{ +#if defined(OPENSSL_EXTRA) + int ret; + SSL_CTX* ctx; + WOLFSSL_X509_VERIFY_PARAM* pParam; + WOLFSSL_X509_VERIFY_PARAM* pvpm; + char testIPv4[] = "127.0.0.1"; + char testhostName[] = "foo.hoge.com"; + + printf(testingFmt, "wolfSSL_CTX_get0_set1_param()"); + + #ifndef NO_WOLFSSL_SERVER + AssertNotNull(ctx = SSL_CTX_new(wolfSSLv23_server_method())); + #else + AssertNotNull(ctx = SSL_CTX_new(wolfSSLv23_client_method())); + #endif + + AssertNotNull(pParam = SSL_CTX_get0_param(ctx)); + + pvpm = (WOLFSSL_X509_VERIFY_PARAM *)XMALLOC( + sizeof(WOLFSSL_X509_VERIFY_PARAM), NULL, DYNAMIC_TYPE_OPENSSL); + AssertNotNull(pvpm); + + wolfSSL_X509_VERIFY_PARAM_set1_host(pvpm, testhostName, + XSTRLEN(testhostName)); + wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(pvpm, testIPv4); + wolfSSL_X509_VERIFY_PARAM_set_hostflags(pvpm, 0x01); + + ret = SSL_CTX_set1_param(ctx, pvpm); + AssertIntEQ(1, ret); + AssertIntEQ(0, XSTRNCMP(pParam->hostName, testhostName, + XSTRLEN(testhostName))); + AssertIntEQ(0x01, pParam->hostFlags); + AssertIntEQ(0, XSTRNCMP(pParam->ipasc, testIPv4, WOLFSSL_MAX_IPSTR)); + + SSL_CTX_free(ctx); + + XFREE(pvpm, NULL, DYNAMIC_TYPE_OPENSSL); + + printf(resultFmt, passed); +#endif /* OPENSSL_EXTRA && !defined(NO_RSA)*/ +} + static void test_wolfSSL_get0_param(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) @@ -29903,50 +29947,128 @@ static void test_wolfSSL_X509_ALGOR_get0(void) static void test_wolfSSL_X509_VERIFY_PARAM(void) { #if defined(OPENSSL_EXTRA) - WOLFSSL_X509_VERIFY_PARAM *param; + WOLFSSL_X509_VERIFY_PARAM *paramTo; + WOLFSSL_X509_VERIFY_PARAM *paramFrom; int ret; char testIPv4[] = "127.0.0.1"; char testIPv6[] = "0001:0000:0000:0000:0000:0000:0000:0000/32"; - + char testhostName1[] = "foo.hoge.com"; + char testhostName2[] = "foobar.hoge.com"; + printf(testingFmt, "wolfSSL_X509()"); - param = wolfSSL_X509_VERIFY_PARAM_new(); - AssertNotNull(param); + paramTo = wolfSSL_X509_VERIFY_PARAM_new(); + AssertNotNull(paramTo); + XMEMSET(paramTo, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM )); - XMEMSET(param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM )); + paramFrom = wolfSSL_X509_VERIFY_PARAM_new(); + AssertNotNull(paramFrom); + XMEMSET(paramFrom, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM )); + ret = wolfSSL_X509_VERIFY_PARAM_set1_host(paramFrom, testhostName1, + XSTRLEN(testhostName1)); + AssertIntEQ(1, ret); + AssertIntEQ(0, XSTRNCMP(paramFrom->hostName, testhostName1, + XSTRLEN(testhostName1))); + wolfSSL_X509_VERIFY_PARAM_set_hostflags(NULL, 0x00); - wolfSSL_X509_VERIFY_PARAM_set_hostflags(param, 0x01); - AssertIntEQ(0x01, param->hostFlags); + wolfSSL_X509_VERIFY_PARAM_set_hostflags(paramFrom, 0x01); + AssertIntEQ(0x01, paramFrom->hostFlags); ret = wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(NULL, testIPv4); AssertIntEQ(0, ret); - ret = wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(param, testIPv4); + ret = wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(paramFrom, testIPv4); AssertIntEQ(1, ret); - AssertIntEQ(0, XSTRNCMP(param->ipasc, testIPv4, WOLFSSL_MAX_IPSTR)); + AssertIntEQ(0, XSTRNCMP(paramFrom->ipasc, testIPv4, WOLFSSL_MAX_IPSTR)); - ret = wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(param, NULL); + ret = wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(paramFrom, NULL); AssertIntEQ(1, ret); - ret = wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(param, testIPv6); + ret = wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(paramFrom, testIPv6); AssertIntEQ(1, ret); - AssertIntEQ(0, XSTRNCMP(param->ipasc, testIPv6, WOLFSSL_MAX_IPSTR)); + AssertIntEQ(0, XSTRNCMP(paramFrom->ipasc, testIPv6, WOLFSSL_MAX_IPSTR)); - ret = wolfSSL_X509_VERIFY_PARAM_set_flags(param, WOLFSSL_CRL_CHECKALL); + /* null pointer */ + ret = wolfSSL_X509_VERIFY_PARAM_set1(NULL, paramFrom); + AssertIntEQ(WOLFSSL_FAILURE, ret); + /* in the case of "from" null, returns success */ + ret = wolfSSL_X509_VERIFY_PARAM_set1(paramTo, NULL); + AssertIntEQ(WOLFSSL_SUCCESS, ret); + + ret = wolfSSL_X509_VERIFY_PARAM_set1(NULL, NULL); + AssertIntEQ(WOLFSSL_FAILURE, ret); + + /* inherit flags test : VPARAM_DEFAULT */ + ret = wolfSSL_X509_VERIFY_PARAM_set1(paramTo, paramFrom); + AssertIntEQ(1, ret); + AssertIntEQ(0, XSTRNCMP(paramTo->hostName, testhostName1, + XSTRLEN(testhostName1))); + AssertIntEQ(0x01, paramTo->hostFlags); + AssertIntEQ(0, XSTRNCMP(paramTo->ipasc, testIPv6, WOLFSSL_MAX_IPSTR)); + + /* inherit flags test : VPARAM OVERWRITE */ + wolfSSL_X509_VERIFY_PARAM_set1_host(paramTo, testhostName2, + XSTRLEN(testhostName2)); + wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(paramTo, testIPv4); + wolfSSL_X509_VERIFY_PARAM_set_hostflags(paramTo, 0x00); + + paramTo->inherit_flags = WOLFSSL_VPARAM_OVERWRITE; + + ret = wolfSSL_X509_VERIFY_PARAM_set1(paramTo, paramFrom); + AssertIntEQ(1, ret); + AssertIntEQ(0, XSTRNCMP(paramTo->hostName, testhostName1, + XSTRLEN(testhostName1))); + AssertIntEQ(0x01, paramTo->hostFlags); + AssertIntEQ(0, XSTRNCMP(paramTo->ipasc, testIPv6, WOLFSSL_MAX_IPSTR)); + + /* inherit flags test : VPARAM_RESET_FLAGS */ + wolfSSL_X509_VERIFY_PARAM_set1_host(paramTo, testhostName2, + XSTRLEN(testhostName2)); + wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(paramTo, testIPv4); + wolfSSL_X509_VERIFY_PARAM_set_hostflags(paramTo, 0x10); + + paramTo->inherit_flags = WOLFSSL_VPARAM_RESET_FLAGS; + + ret = wolfSSL_X509_VERIFY_PARAM_set1(paramTo, paramFrom); + AssertIntEQ(1, ret); + AssertIntEQ(0, XSTRNCMP(paramTo->hostName, testhostName1, + XSTRLEN(testhostName1))); + AssertIntEQ(0x01, paramTo->hostFlags); + AssertIntEQ(0, XSTRNCMP(paramTo->ipasc, testIPv6, WOLFSSL_MAX_IPSTR)); + + /* inherit flags test : VPARAM_LOCKED */ + wolfSSL_X509_VERIFY_PARAM_set1_host(paramTo, testhostName2, + XSTRLEN(testhostName2)); + wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(paramTo, testIPv4); + wolfSSL_X509_VERIFY_PARAM_set_hostflags(paramTo, 0x00); + + paramTo->inherit_flags = WOLFSSL_VPARAM_LOCKED; + + ret = wolfSSL_X509_VERIFY_PARAM_set1(paramTo, paramFrom); + AssertIntEQ(1, ret); + AssertIntEQ(0, XSTRNCMP(paramTo->hostName, testhostName2, + XSTRLEN(testhostName2))); + AssertIntEQ(0x00, paramTo->hostFlags); + AssertIntEQ(0, XSTRNCMP(paramTo->ipasc, testIPv4, WOLFSSL_MAX_IPSTR)); + + /* inherit flags test : VPARAM_ONCE, not testable yet */ + + ret = wolfSSL_X509_VERIFY_PARAM_set_flags(paramTo, WOLFSSL_CRL_CHECKALL); AssertIntEQ(1, ret); - ret = wolfSSL_X509_VERIFY_PARAM_get_flags(param); + ret = wolfSSL_X509_VERIFY_PARAM_get_flags(paramTo); AssertIntEQ(WOLFSSL_CRL_CHECKALL, ret); - ret = wolfSSL_X509_VERIFY_PARAM_clear_flags(param, WOLFSSL_CRL_CHECKALL); + ret = wolfSSL_X509_VERIFY_PARAM_clear_flags(paramTo, WOLFSSL_CRL_CHECKALL); AssertIntEQ(1, ret); - ret = wolfSSL_X509_VERIFY_PARAM_get_flags(param); + ret = wolfSSL_X509_VERIFY_PARAM_get_flags(paramTo); AssertIntEQ(0, ret); - wolfSSL_X509_VERIFY_PARAM_free(param); + wolfSSL_X509_VERIFY_PARAM_free(paramTo); + wolfSSL_X509_VERIFY_PARAM_free(paramFrom); printf(resultFmt, passed); @@ -40637,6 +40759,7 @@ void ApiTest(void) test_wolfSSL_X509_STORE(); test_wolfSSL_X509_STORE_load_locations(); test_wolfSSL_BN(); + test_wolfSSL_CTX_get0_set1_param(); #ifndef NO_BIO test_wolfSSL_PEM_read_bio(); test_wolfSSL_BIO(); diff --git a/wolfssl/internal.h b/wolfssl/internal.h index aebfb3a697..8a124dd011 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -2837,6 +2837,7 @@ struct WOLFSSL_CTX { byte sessionCtxSz; byte cbioFlag; /* WOLFSSL_CBIO_RECV/SEND: CBIORecv/Send is set */ CallbackInfoState* CBIS; /* used to get info about SSL state */ + WOLFSSL_X509_VERIFY_PARAM* param; /* verification parameters*/ #endif CallbackIORecv CBIORecv; CallbackIOSend CBIOSend; diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index 8b7604ea32..1fd838bce5 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -558,6 +558,12 @@ typedef WOLFSSL_X509_NAME_ENTRY X509_NAME_ENTRY; #define X509_V_FLAG_NO_CHECK_TIME WOLFSSL_NO_CHECK_TIME #define X509_CHECK_FLAG_NO_WILDCARDS WOLFSSL_NO_WILDCARDS +#define X509_VP_FLAG_DEFAULT WOLFSSL_VPARAM_DEFAULT +#define X509_VP_FLAG_OVERWRITE WOLFSSL_VPARAM_OVERWRITE +#define X509_VP_FLAG_RESET_FLAGS WOLFSSL_VPARAM_RESET_FLAGS +#define X509_VP_FLAG_LOCKED WOLFSSL_VPARAM_LOCKED +#define X509_VP_FLAG_ONCE WOLFSSL_VPARAM_ONCE + #define X509_STORE_CTX_get_current_cert wolfSSL_X509_STORE_CTX_get_current_cert #define X509_STORE_CTX_set_verify_cb wolfSSL_X509_STORE_CTX_set_verify_cb #define X509_STORE_CTX_new wolfSSL_X509_STORE_CTX_new @@ -605,6 +611,7 @@ wolfSSL_X509_STORE_set_verify_cb((WOLFSSL_X509_STORE *)(s), (WOLFSSL_X509_STORE_ #define X509_VERIFY_PARAM_set_hostflags wolfSSL_X509_VERIFY_PARAM_set_hostflags #define X509_VERIFY_PARAM_set1_host wolfSSL_X509_VERIFY_PARAM_set1_host #define X509_VERIFY_PARAM_set1_ip_asc wolfSSL_X509_VERIFY_PARAM_set1_ip_asc +#define X509_VERIFY_PARAM_set1 wolfSSL_X509_VERIFY_PARAM_set1 #define X509_STORE_load_locations wolfSSL_X509_STORE_load_locations #define X509_LOOKUP_add_dir wolfSSL_X509_LOOKUP_add_dir @@ -1312,6 +1319,8 @@ wolfSSL_X509_STORE_set_verify_cb((WOLFSSL_X509_STORE *)(s), (WOLFSSL_X509_STORE_ #define SSL_CTX_set_srp_strength wolfSSL_CTX_set_srp_strength #define SSL_get_SSL_CTX wolfSSL_get_SSL_CTX #define SSL_get0_param wolfSSL_get0_param +#define SSL_CTX_get0_param wolfSSL_CTX_get0_param +#define SSL_CTX_set1_param wolfSSL_CTX_set1_param #define SSL_get_srp_username wolfSSL_get_srp_username #define ERR_NUM_ERRORS 16 diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index c3372b3f04..69103607eb 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -563,8 +563,16 @@ struct WOLFSSL_X509_STORE { #define WOLFSSL_USE_CHECK_TIME 0x2 #define WOLFSSL_NO_CHECK_TIME 0x200000 #define WOLFSSL_HOST_NAME_MAX 256 + +#define WOLFSSL_VPARAM_DEFAULT 0x1 +#define WOLFSSL_VPARAM_OVERWRITE 0x2 +#define WOLFSSL_VPARAM_RESET_FLAGS 0x4 +#define WOLFSSL_VPARAM_LOCKED 0x8 +#define WOLFSSL_VPARAM_ONCE 0x10 + struct WOLFSSL_X509_VERIFY_PARAM { time_t check_time; + unsigned int inherit_flags; unsigned long flags; char hostName[WOLFSSL_HOST_NAME_MAX]; unsigned int hostFlags; @@ -877,7 +885,9 @@ WOLFSSL_API int wolfSSL_CTX_up_ref(WOLFSSL_CTX*); #endif WOLFSSL_ABI WOLFSSL_API WOLFSSL* wolfSSL_new(WOLFSSL_CTX*); WOLFSSL_API WOLFSSL_CTX* wolfSSL_get_SSL_CTX(WOLFSSL* ssl); +WOLFSSL_API WOLFSSL_X509_VERIFY_PARAM* wolfSSL_CTX_get0_param(WOLFSSL_CTX* ctx); WOLFSSL_API WOLFSSL_X509_VERIFY_PARAM* wolfSSL_get0_param(WOLFSSL* ssl); +WOLFSSL_API int wolfSSL_CTX_set1_param(WOLFSSL_CTX* ctx, WOLFSSL_X509_VERIFY_PARAM *vpm); WOLFSSL_API int wolfSSL_is_server(WOLFSSL*); WOLFSSL_API WOLFSSL* wolfSSL_write_dup(WOLFSSL*); WOLFSSL_ABI WOLFSSL_API int wolfSSL_set_fd (WOLFSSL*, int); @@ -1544,6 +1554,8 @@ WOLFSSL_API int wolfSSL_X509_VERIFY_PARAM_set1_host(WOLFSSL_X509_VERIFY_PARAM* p unsigned int nameSz); WOLFSSL_API int wolfSSL_X509_VERIFY_PARAM_set1_ip_asc( WOLFSSL_X509_VERIFY_PARAM *param, const char *ipasc); +WOLFSSL_API int wolfSSL_X509_VERIFY_PARAM_set1(WOLFSSL_X509_VERIFY_PARAM* to, + const WOLFSSL_X509_VERIFY_PARAM* from); #endif WOLFSSL_API WOLFSSL_X509_REVOKED* wolfSSL_X509_CRL_get_REVOKED(WOLFSSL_X509_CRL*); WOLFSSL_API WOLFSSL_X509_REVOKED* wolfSSL_sk_X509_REVOKED_value( From 544ed3289356e4fc6ef8711f70f937f0ae155f66 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Thu, 14 Jan 2021 17:52:12 +0900 Subject: [PATCH 59/78] implemented X509_load_crl_file --- src/ssl.c | 84 +++++++++++++++++++++++++++++++++++++++++++ tests/api.c | 33 +++++++++++++++++ wolfssl/openssl/ssl.h | 1 + wolfssl/ssl.h | 4 +++ 4 files changed, 122 insertions(+) diff --git a/src/ssl.c b/src/ssl.c index 1b9d6835cc..d2533eed89 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -25980,12 +25980,96 @@ WOLFSSL_X509 *wolfSSL_d2i_X509_fp(XFILE fp, WOLFSSL_X509 **x509) #ifdef HAVE_CRL + +#ifndef NO_BIO +WOLFSSL_API WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_bio(WOLFSSL_BIO *bp, + WOLFSSL_X509_CRL **x) +{ + int derSz; + byte* der = NULL; + WOLFSSL_X509_CRL* crl = NULL; + + if ((derSz = wolfSSL_BIO_get_len(bp)) > 0) { + der = (byte*)XMALLOC(derSz, 0, DYNAMIC_TYPE_DER); + if (der != NULL) { + if (wolfSSL_BIO_read(bp, der, derSz) == derSz) { + crl = wolfSSL_d2i_X509_CRL(x, der, derSz); + } + } + } + + if (der != NULL) { + XFREE(der, 0, DYNAMIC_TYPE_DER); + } + + return crl; +} +#endif + #ifndef NO_FILESYSTEM WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_fp(XFILE fp, WOLFSSL_X509_CRL **crl) { WOLFSSL_ENTER("wolfSSL_d2i_X509_CRL_fp"); return (WOLFSSL_X509_CRL *)wolfSSL_d2i_X509_fp_ex(fp, (void **)crl, CRL_TYPE); } + +WOLFSSL_API int wolfSSL_X509_load_crl_file(WOLFSSL_X509_LOOKUP *ctx, + const char *file, int type) +{ + int ret = WOLFSSL_FAILURE; + int count = 0; + WOLFSSL_BIO *bio = NULL; + WOLFSSL_X509_CRL *crl =NULL; + + WOLFSSL_ENTER("wolfSSL_X509_load_crl_file"); + + bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file()); + + if ((bio == NULL) || (wolfSSL_BIO_read_filename(bio, file) <= 0)) { + return ret; + } + + if (type == WOLFSSL_FILETYPE_PEM) { + do { + crl = wolfSSL_PEM_read_bio_X509_CRL(bio, NULL, NULL, NULL); + if (crl == NULL) { + if (count <= 0) { + WOLFSSL_MSG("Load crl failed"); + } + break; + } + + ret = wolfSSL_X509_STORE_add_crl(ctx->store, crl); + if (ret == WOLFSSL_FAILURE) { + WOLFSSL_MSG("Adding crl failed"); + break; + } + count++; + wolfSSL_X509_CRL_free(crl); + crl = NULL; + } while(crl == NULL); + + ret = count; + } else if (type == WOLFSSL_FILETYPE_ASN1) { + crl = wolfSSL_d2i_X509_CRL_bio(bio, NULL); + if (crl == NULL) { + WOLFSSL_MSG("Load crl failed"); + } else { + ret = wolfSSL_X509_STORE_add_crl(ctx->store, crl); + if (ret == WOLFSSL_FAILURE) { + WOLFSSL_MSG("Adding crl failed"); + } + } + } else { + WOLFSSL_MSG("Invaid file type"); + } + + wolfSSL_X509_CRL_free(crl); + wolfSSL_BIO_free(bio); + + WOLFSSL_LEAVE("wolfSSL_X509_load_crl_file", ret); + return ret; +} #endif /* !NO_FILESYSTEM */ diff --git a/tests/api.c b/tests/api.c index 7595237282..f64ff3dd51 100644 --- a/tests/api.c +++ b/tests/api.c @@ -38789,6 +38789,38 @@ static void test_wolfSSL_X509_CRL(void) return; } +static void test_wolfSSL_X509_load_crl_file(void) +{ +#if defined(OPENSSL_EXTRA) && defined(HAVE_CRL) && !defined(NO_FILESYSTEM) + int i; + char pem[][100] = { + "./certs/crl/crl.pem", + "./certs/crl/crl2.pem", + "./certs/crl/caEccCrl.pem", + "./certs/crl/eccCliCRL.pem", + "./certs/crl/eccSrvCRL.pem", + "" + }; + WOLFSSL_X509_STORE* store; + WOLFSSL_X509_LOOKUP* lookup; + + printf(testingFmt, "wolfSSL_X509_laod_crl_file"); + + AssertNotNull(store = wolfSSL_X509_STORE_new()); + AssertNotNull(lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file())); + + for (i = 0; pem[i][0] != '\0'; i++) + { + AssertIntEQ(wolfSSL_X509_load_crl_file(lookup, pem[i], WOLFSSL_FILETYPE_PEM), 1); + } + + wolfSSL_X509_STORE_free(store); + + printf(resultFmt, passed); + +#endif +} + static void test_wolfSSL_d2i_X509_REQ(void) { #if defined(WOLFSSL_CERT_REQ) && (defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)) @@ -40758,6 +40790,7 @@ void ApiTest(void) test_wolfSSL_X509_STORE_CTX_get0_store(); test_wolfSSL_X509_STORE(); test_wolfSSL_X509_STORE_load_locations(); + test_wolfSSL_X509_load_crl_file(); test_wolfSSL_BN(); test_wolfSSL_CTX_get0_set1_param(); #ifndef NO_BIO diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index 1fd838bce5..db49401070 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -629,6 +629,7 @@ wolfSSL_X509_STORE_set_verify_cb((WOLFSSL_X509_STORE *)(s), (WOLFSSL_X509_STORE_ #define X509_CRL_get_nextUpdate wolfSSL_X509_CRL_get_nextUpdate #define X509_CRL_verify wolfSSL_X509_CRL_verify #define X509_CRL_get_REVOKED wolfSSL_X509_CRL_get_REVOKED +#define X509_load_crl_file wolfSSL_X509_load_crl_file #define X509_get_X509_PUBKEY wolfSSL_X509_get_X509_PUBKEY #define X509_REQ_get_X509_PUBKEY wolfSSL_X509_get_X509_PUBKEY diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 69103607eb..61adac2132 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1556,6 +1556,8 @@ WOLFSSL_API int wolfSSL_X509_VERIFY_PARAM_set1_ip_asc( WOLFSSL_X509_VERIFY_PARAM *param, const char *ipasc); WOLFSSL_API int wolfSSL_X509_VERIFY_PARAM_set1(WOLFSSL_X509_VERIFY_PARAM* to, const WOLFSSL_X509_VERIFY_PARAM* from); +WOLFSSL_API int wolfSSL_X509_load_crl_file(WOLFSSL_X509_LOOKUP *ctx, + const char *file, int type); #endif WOLFSSL_API WOLFSSL_X509_REVOKED* wolfSSL_X509_CRL_get_REVOKED(WOLFSSL_X509_CRL*); WOLFSSL_API WOLFSSL_X509_REVOKED* wolfSSL_sk_X509_REVOKED_value( @@ -2266,6 +2268,8 @@ WOLFSSL_API WOLFSSL_X509* WOLFSSL_API int wolfSSL_i2d_X509(WOLFSSL_X509* x509, unsigned char** out); WOLFSSL_API WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL(WOLFSSL_X509_CRL **crl, const unsigned char *in, int len); +WOLFSSL_API WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_bio(WOLFSSL_BIO *bp, + WOLFSSL_X509_CRL **crl); #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) WOLFSSL_API WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_fp(XFILE file, WOLFSSL_X509_CRL **crl); #endif From 44a20c8ce6c8bacf882ba1b74ed881d0778a2ef8 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Fri, 15 Jan 2021 15:54:52 +0900 Subject: [PATCH 60/78] add more unit test case for load_crl_file --- certs/crl/crl.der | Bin 0 -> 520 bytes certs/crl/crl2.der | Bin 0 -> 520 bytes certs/crl/gencrls.sh | 5 +++++ certs/crl/include.am | 4 +++- src/ssl.c | 2 ++ tests/api.c | 50 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 certs/crl/crl.der create mode 100644 certs/crl/crl2.der diff --git a/certs/crl/crl.der b/certs/crl/crl.der new file mode 100644 index 0000000000000000000000000000000000000000..f8726dd52d15659ed8bdafeff3cdd9d4b8cf05ba GIT binary patch literal 520 zcmXqLVq!69e9OehXu!+HsnzDu_MMlJk(-slpmB;Jw*e;`b0`a&FjHu-p@0D&h{M6d z?wg-il9-nW6Jh6Jcgn9y%}vZR6g1!mso~<`2u>_7$mflJj#72r)4-p($FxXTW2?#l{>eE5gFe#K?r^Q|2Z{Mh1gr zE!n$YsPDc0_SX~MPYm8#l9FQbmkb{`d0JWIukp?P8I-cH%5Oqz<5k_=pHA=gRX=q9 zMp<3G!}+fg?^iLbN*R6H^sr$(F^^6bCmJ6PY3^eWBdgO0LntQ*@h1zSY&NV1+dbWYdGfZ4c z`|<+kRY^M+l%7bl5SU@5_SszYhe3_P#_XArg2%QkH%VMD@1)h5|C8tM6!w^P>2bym z-U<0GB`Svh(`Wb!?Eb3F^+PCn{qj5B!OLA+XHGm6e0;5T&xALZzIvntR7tWjE&Q_7$mflJj#72r)4-p($FxXTW2?#l{>eE5gFe#K?r^Q|2Z{Mh1gr zE!n$YsPDc0_SX~MPYm8#l9FQbmkb{`d0JWIukp?P8I-cH%5Oqz<5k_=pHA=gRX=q9 zMp<3G!}+fg?^iLbN*R6H^sr$(F^^6bCmJ6PY3^eWBdgO0LntQ*@h1zSY&NV1+dbWYdGfZ4c z`|<+kRY^M+l%7bl5SU@5_SszYhe3_P#_XArg2%QkH%VMD@1)h5|C8tM6!w^P>2bym z-U<0GB`Svh(`Wb!?Eb3F^+PCn{qj5B!OLA+XHGm6e0;5T&xALZzIvntR7tWjE&Qstore, crl); if (ret == WOLFSSL_FAILURE) { WOLFSSL_MSG("Adding crl failed"); + } else { + ret = 1;/* handled a file */ } } } else { diff --git a/tests/api.c b/tests/api.c index f64ff3dd51..3ef4d884c4 100644 --- a/tests/api.c +++ b/tests/api.c @@ -38801,6 +38801,11 @@ static void test_wolfSSL_X509_load_crl_file(void) "./certs/crl/eccSrvCRL.pem", "" }; + char der[][100] = { + "./certs/crl/crl.der", + "./certs/crl/crl2.der", + "" + }; WOLFSSL_X509_STORE* store; WOLFSSL_X509_LOOKUP* lookup; @@ -38809,12 +38814,57 @@ static void test_wolfSSL_X509_load_crl_file(void) AssertNotNull(store = wolfSSL_X509_STORE_new()); AssertNotNull(lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file())); + AssertIntEQ(wolfSSL_X509_LOOKUP_load_file(lookup, "certs/ca-cert.pem", + X509_FILETYPE_PEM), 1); + AssertIntEQ(wolfSSL_X509_LOOKUP_load_file(lookup, "certs/server-revoked-cert.pem", + X509_FILETYPE_PEM), 1); + if (store) { + AssertIntEQ(wolfSSL_CertManagerVerify(store->cm, svrCertFile, + WOLFSSL_FILETYPE_PEM), 1); + /* since store hasn't yet known the revoked cert*/ + AssertIntEQ(wolfSSL_CertManagerVerify(store->cm, "certs/server-revoked-cert.pem", + WOLFSSL_FILETYPE_PEM), 1); + } + for (i = 0; pem[i][0] != '\0'; i++) { AssertIntEQ(wolfSSL_X509_load_crl_file(lookup, pem[i], WOLFSSL_FILETYPE_PEM), 1); } + if (store) { + /* since store knows crl list */ + AssertIntEQ(wolfSSL_CertManagerVerify(store->cm, "certs/server-revoked-cert.pem", + WOLFSSL_FILETYPE_PEM ), CRL_CERT_REVOKED); + } + /* once feeing store */ wolfSSL_X509_STORE_free(store); + store = NULL; + + AssertNotNull(store = wolfSSL_X509_STORE_new()); + AssertNotNull(lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file())); + + AssertIntEQ(wolfSSL_X509_LOOKUP_load_file(lookup, "certs/ca-cert.pem", + X509_FILETYPE_PEM), 1); + AssertIntEQ(wolfSSL_X509_LOOKUP_load_file(lookup, "certs/server-revoked-cert.pem", + X509_FILETYPE_PEM), 1); + if (store) { + AssertIntEQ(wolfSSL_CertManagerVerify(store->cm, svrCertFile, + WOLFSSL_FILETYPE_PEM), 1); + /* since store hasn't yet known the revoked cert*/ + AssertIntEQ(wolfSSL_CertManagerVerify(store->cm, "certs/server-revoked-cert.pem", + WOLFSSL_FILETYPE_PEM), 1); + } + + for (i = 0; der[i][0] != '\0'; i++) + { + AssertIntEQ(wolfSSL_X509_load_crl_file(lookup, der[i], WOLFSSL_FILETYPE_ASN1), 1); + } + + if (store) { + /* since store knows crl list */ + AssertIntEQ(wolfSSL_CertManagerVerify(store->cm, "certs/server-revoked-cert.pem", + WOLFSSL_FILETYPE_PEM ), CRL_CERT_REVOKED); + } printf(resultFmt, passed); From e39477c531cf9fe84fb3de767a969801e6782aaf Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Thu, 21 Jan 2021 15:32:32 +0900 Subject: [PATCH 61/78] initial implement SSL_get_early_data_status --- examples/client/client.c | 26 ++++++++++++++++++++++++++ examples/server/server.c | 29 +++++++++++++++++++++++++++++ scripts/tls13.test | 2 +- src/internal.c | 3 +++ src/tls.c | 7 +++++++ src/tls13.c | 31 ++++++++++++++++++++++++++++++- wolfssl/error-ssl.h | 3 ++- wolfssl/internal.h | 1 + wolfssl/openssl/ssl.h | 5 +++++ wolfssl/ssl.h | 6 ++++++ 10 files changed, 110 insertions(+), 3 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index 79aece83e6..06b4fc4498 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -329,6 +329,29 @@ static void SetKeyShare(WOLFSSL* ssl, int onlyKeyShare, int useX25519, #endif #ifdef WOLFSSL_EARLY_DATA +static void EarlyDataStatus(WOLFSSL* ssl) +{ + int earlyData_status; + + earlyData_status = wolfSSL_get_early_data_status(ssl); + if (earlyData_status < 0) return; + + printf("Early Data was "); + + switch(earlyData_status) { + case WOLFSSL_EARLY_DATA_NOT_SENT: + printf("not setn.\n"); + break; + case WOLFSSL_EARLY_DATA_REJECTED: + printf("rejected.\n"); + break; + case WOLFSSL_EARLY_DATA_ACCEPTED: + printf("accepted\n"); + break; + default: + printf("unknown...\n"); + } +} static void EarlyData(WOLFSSL_CTX* ctx, WOLFSSL* ssl, const char* msg, int msgSz, char* buffer) { @@ -466,6 +489,9 @@ static int ClientBenchmarkConnections(WOLFSSL_CTX* ctx, char* host, word16 port, do { err = 0; /* reset error */ ret = wolfSSL_connect(ssl); +#ifdef WOLFSSL_EARLY_DATA + EarlyDataStatus(ssl); +#endif if (ret != WOLFSSL_SUCCESS) { err = wolfSSL_get_error(ssl, 0); #ifdef WOLFSSL_ASYNC_CRYPT diff --git a/examples/server/server.c b/examples/server/server.c index 05b6f2f548..ad63565b04 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -844,6 +844,32 @@ static const char* server_usage_msg[][56] = { #endif }; +#ifdef WOLFSSL_EARLY_DATA +static void EarlyDataStatus(WOLFSSL* ssl) +{ + int earlyData_status; + + earlyData_status = wolfSSL_get_early_data_status(ssl); + if (earlyData_status < 0) return; + + printf("Early Data was "); + + switch(earlyData_status) { + case WOLFSSL_EARLY_DATA_NOT_SENT: + printf("not sent.\n"); + break; + case WOLFSSL_EARLY_DATA_REJECTED: + printf("rejected.\n"); + break; + case WOLFSSL_EARLY_DATA_ACCEPTED: + printf("accepted.\n"); + break; + default: + printf("unknown...\n"); + } +} +#endif + static void Usage(void) { int msgId = 0; @@ -2501,6 +2527,9 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) do { err = 0; /* reset error */ ret = SSL_accept(ssl); +#ifdef WOLFSSL_EARLY_DATA + EarlyDataStatus(ssl); +#endif if (ret != WOLFSSL_SUCCESS) { err = SSL_get_error(ssl, 0); #ifdef WOLFSSL_ASYNC_CRYPT diff --git a/scripts/tls13.test b/scripts/tls13.test index 7f4c927d39..e7a2b3618d 100755 --- a/scripts/tls13.test +++ b/scripts/tls13.test @@ -257,7 +257,7 @@ if [ "$early_data" = "yes" ]; then grep 'Session Ticket' $client_out_file session_ticket=$? early_data_cnt=`grep 'Early Data' $server_out_file | wc -l` - if [ $session_ticket -eq 0 -a $early_data_cnt -ne 2 ]; then + if [ $session_ticket -eq 0 -a $early_data_cnt -ne 4 ]; then RESULT=1 fi if [ $RESULT -ne 0 ]; then diff --git a/src/internal.c b/src/internal.c index 7baad8c51b..eeebe5302d 100644 --- a/src/internal.c +++ b/src/internal.c @@ -18927,6 +18927,9 @@ const char* wolfSSL_ERR_reason_error_string(unsigned long e) case NO_CERT_ERROR: return "TLS1.3 No Certificate Set Error"; + case TOO_MUCH_EARLY_DATA: + return "Too much early data"; + default : return "unknown error number"; } diff --git a/src/tls.c b/src/tls.c index 0df44fc9b0..38ebfbf025 100644 --- a/src/tls.c +++ b/src/tls.c @@ -9110,6 +9110,9 @@ static int TLSX_EarlyData_Parse(WOLFSSL* ssl, byte* input, word16 length, if (ssl->earlyData == expecting_early_data) return TLSX_EarlyData_Use(ssl, 0); ssl->earlyData = early_data_ext; + /* client wants to send early data. set this to rejected here. */ + /* Later, it is set to accepted if the server accepts the data. */ + ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED; return 0; } if (msgType == encrypted_extensions) { @@ -9122,6 +9125,10 @@ static int TLSX_EarlyData_Parse(WOLFSSL* ssl, byte* input, word16 length, if (ssl->options.pskIdIndex != 1) return PSK_KEY_ERROR; + if (ssl->options.side == WOLFSSL_CLIENT_END) + /* server could accept early data. */ + ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED; + return TLSX_EarlyData_Use(ssl, 1); } if (msgType == session_ticket) { diff --git a/src/tls13.c b/src/tls13.c index 83e78a7ab5..718630e5f4 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -6497,6 +6497,7 @@ static int DoTls13EndOfEarlyData(WOLFSSL* ssl, const byte* input, } ssl->earlyData = done_early_data; + ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED; /* Always encrypted. */ *inOutIdx += ssl->keys.padSz; @@ -8656,11 +8657,24 @@ int wolfSSL_write_early_data(WOLFSSL* ssl, const void* data, int sz, int* outSz) ret = wolfSSL_connect_TLSv13(ssl); if (ret != WOLFSSL_SUCCESS) return WOLFSSL_FATAL_ERROR; + /* on client side, status is set to rejected */ + /* until sever accepts early data */ + ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED; } if (ssl->options.handShakeState == CLIENT_HELLO_COMPLETE) { +#ifdef OPENSSL_EXTRA + /* when processed early data exceeds max size */ + if (ssl->earlyDataSz + sz > ssl->session.maxEarlyDataSz) { + ssl->error = TOO_MUCH_EARLY_DATA; + return WOLFSSL_FATAL_ERROR; + } +#endif ret = SendData(ssl, data, sz); - if (ret > 0) + if (ret > 0) { *outSz = ret; + /* store amount of processed early data from client */ + ssl->earlyDataSz += ret; + } } #else return SIDE_ERROR; @@ -8724,6 +8738,21 @@ int wolfSSL_read_early_data(WOLFSSL* ssl, void* data, int sz, int* outSz) ret = WOLFSSL_FATAL_ERROR; return ret; } + +/* Returns early data status + * + * ssl The SSL/TLS object. + * returns WOLFSSL_EARLY_DATA_ACCEPTED if the data was accepted + * WOLFSSL_EARLY_DATA_REJECTED if the data was rejected + * WOLFSSL_EARLY_DATA_NOT_SENT if no early data was sent + */ +int wolfSSL_get_early_data_status(const WOLFSSL* ssl) +{ + if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version)) + return BAD_FUNC_ARG; + + return ssl->earlyDataStatus; +} #endif #ifdef HAVE_SECRET_CALLBACK diff --git a/wolfssl/error-ssl.h b/wolfssl/error-ssl.h index 88c47b9c65..68ace30531 100644 --- a/wolfssl/error-ssl.h +++ b/wolfssl/error-ssl.h @@ -170,7 +170,8 @@ enum wolfSSL_ErrorCodes { DTLS_SIZE_ERROR = -439, /* Trying to send too much data */ NO_CERT_ERROR = -440, /* TLS1.3 - no cert set error */ APP_DATA_READY = -441, /* DTLS1.2 application data ready for read */ - + TOO_MUCH_EARLY_DATA = -442, /* Too much Early data */ + /* add strings to wolfSSL_ERR_reason_error_string in internal.c !!!!! */ /* begin negotiation parameter errors */ diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 8a124dd011..96ba70dcff 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -4367,6 +4367,7 @@ struct WOLFSSL { #ifdef WOLFSSL_EARLY_DATA EarlyDataState earlyData; word32 earlyDataSz; + word32 earlyDataStatus; #endif #ifdef OPENSSL_ALL long verifyCallbackResult; diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index db49401070..2668fd891e 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -1333,6 +1333,11 @@ wolfSSL_X509_STORE_set_verify_cb((WOLFSSL_X509_STORE *)(s), (WOLFSSL_X509_STORE_ #define SSL_get_rbio wolfSSL_SSL_get_rbio #define SSL_get_wbio wolfSSL_SSL_get_wbio #define SSL_do_handshake wolfSSL_SSL_do_handshake + +#if defined(WOLFSSL_EARLY_DATA) +#define SSL_get_early_data_status wolfSSL_get_early_data_status +#endif + #endif /* OPENSSL_EXTRA */ /* cipher suites for compatibility */ diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 61adac2132..f36f38be87 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -947,6 +947,11 @@ WOLFSSL_API int wolfSSL_connect_TLSv13(WOLFSSL*); WOLFSSL_API int wolfSSL_accept_TLSv13(WOLFSSL*); #ifdef WOLFSSL_EARLY_DATA + +#define WOLFSSL_EARLY_DATA_NOT_SENT 0 +#define WOLFSSL_EARLY_DATA_REJECTED 1 +#define WOLFSSL_EARLY_DATA_ACCEPTED 2 + WOLFSSL_API int wolfSSL_CTX_set_max_early_data(WOLFSSL_CTX* ctx, unsigned int sz); WOLFSSL_API int wolfSSL_set_max_early_data(WOLFSSL* ssl, unsigned int sz); @@ -954,6 +959,7 @@ WOLFSSL_API int wolfSSL_write_early_data(WOLFSSL* ssl, const void* data, int sz, int* outSz); WOLFSSL_API int wolfSSL_read_early_data(WOLFSSL* ssl, void* data, int sz, int* outSz); +WOLFSSL_API int wolfSSL_get_early_data_status(const WOLFSSL* ssl); #endif /* WOLFSSL_EARLY_DATA */ #endif /* WOLFSSL_TLS13 */ WOLFSSL_ABI WOLFSSL_API void wolfSSL_CTX_free(WOLFSSL_CTX*); From 141d07e21b80f6bbe630b08b1dd4bfed60cb387b Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Fri, 22 Jan 2021 15:14:31 +0900 Subject: [PATCH 62/78] addressed pre-review comments --- examples/client/client.c | 2 +- src/tls.c | 18 ++++++++++++------ src/tls13.c | 7 +++---- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index 06b4fc4498..86882c4763 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -340,7 +340,7 @@ static void EarlyDataStatus(WOLFSSL* ssl) switch(earlyData_status) { case WOLFSSL_EARLY_DATA_NOT_SENT: - printf("not setn.\n"); + printf("not sent.\n"); break; case WOLFSSL_EARLY_DATA_REJECTED: printf("rejected.\n"); diff --git a/src/tls.c b/src/tls.c index 38ebfbf025..33e0fbaf6b 100644 --- a/src/tls.c +++ b/src/tls.c @@ -9107,12 +9107,17 @@ static int TLSX_EarlyData_Parse(WOLFSSL* ssl, byte* input, word16 length, if (length != 0) return BUFFER_E; - if (ssl->earlyData == expecting_early_data) + if (ssl->earlyData == expecting_early_data) { + + if (ssl->options.maxEarlyDataSz != 0) + ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED; + else + ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED; + return TLSX_EarlyData_Use(ssl, 0); + } ssl->earlyData = early_data_ext; - /* client wants to send early data. set this to rejected here. */ - /* Later, it is set to accepted if the server accepts the data. */ - ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED; + return 0; } if (msgType == encrypted_extensions) { @@ -9125,9 +9130,10 @@ static int TLSX_EarlyData_Parse(WOLFSSL* ssl, byte* input, word16 length, if (ssl->options.pskIdIndex != 1) return PSK_KEY_ERROR; - if (ssl->options.side == WOLFSSL_CLIENT_END) - /* server could accept early data. */ + if (ssl->options.side == WOLFSSL_CLIENT_END) { + /* the extension from server comes in */ ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED; + } return TLSX_EarlyData_Use(ssl, 1); } diff --git a/src/tls13.c b/src/tls13.c index 718630e5f4..0422fe2704 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -6497,7 +6497,6 @@ static int DoTls13EndOfEarlyData(WOLFSSL* ssl, const byte* input, } ssl->earlyData = done_early_data; - ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED; /* Always encrypted. */ *inOutIdx += ssl->keys.padSz; @@ -8657,13 +8656,13 @@ int wolfSSL_write_early_data(WOLFSSL* ssl, const void* data, int sz, int* outSz) ret = wolfSSL_connect_TLSv13(ssl); if (ret != WOLFSSL_SUCCESS) return WOLFSSL_FATAL_ERROR; - /* on client side, status is set to rejected */ - /* until sever accepts early data */ + /* on client side, status is set to rejected */ + /* until sever accepts the early data extension. */ ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED; } if (ssl->options.handShakeState == CLIENT_HELLO_COMPLETE) { #ifdef OPENSSL_EXTRA - /* when processed early data exceeds max size */ + /* when processed early data exceeds max size */ if (ssl->earlyDataSz + sz > ssl->session.maxEarlyDataSz) { ssl->error = TOO_MUCH_EARLY_DATA; return WOLFSSL_FATAL_ERROR; From cb3fa8ff9e57627c1dd3af706536968fd430f9e4 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Sat, 23 Jan 2021 08:56:17 +0900 Subject: [PATCH 63/78] SHA224 implementation --- src/ssl.c | 47 ++++++++++++++++++++++++++++++++++++++ tests/api.c | 24 +++++++++++++++++++ wolfssl/openssl/sha.h | 5 ++++ wolfssl/ssl.h | 1 + wolfssl/wolfcrypt/sha256.h | 5 +++- 5 files changed, 81 insertions(+), 1 deletion(-) diff --git a/src/ssl.c b/src/ssl.c index bff47af33f..25bdd76f61 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -42931,6 +42931,53 @@ err: } #endif /* ! NO_SHA */ +#ifdef WOLFSSL_SHA224 + /* One shot SHA224 hash of message. + * + * d message to hash + * n size of d buffer + * md buffer to hold digest. Should be WC_SHA224_DIGEST_SIZE. + * + * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used. + * When the static buffer is used this function is not thread safe. + * + * Returns a pointer to the message digest on success and NULL on failure. + */ + unsigned char *wolfSSL_SHA224(const unsigned char *d, size_t n, + unsigned char *md) + { + static byte dig[WC_SHA224_DIGEST_SIZE]; + byte* ret = md; + wc_Sha256 sha; + + WOLFSSL_ENTER("wolfSSL_SHA224"); + + if (wc_InitSha224_ex(&sha, NULL, 0) != 0) { + WOLFSSL_MSG("SHA224 Init failed"); + return NULL; + } + + if (wc_Sha224Update(&sha, (const byte*)d, (word32)n) != 0) { + WOLFSSL_MSG("SHA224 Update failed"); + return NULL; + } + + if (md == NULL) { + WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA224 IS NOT " + "THREAD SAFE WHEN md == NULL"); + ret = dig; + } + if (wc_Sha224Final(&sha, ret) != 0) { + WOLFSSL_MSG("SHA224 Final failed"); + wc_Sha224Free(&sha); + return NULL; + } + wc_Sha224Free(&sha); + + return ret; + } +#endif + #ifndef NO_SHA256 /* One shot SHA256 hash of message. * diff --git a/tests/api.c b/tests/api.c index 3ef4d884c4..79b1c77815 100644 --- a/tests/api.c +++ b/tests/api.c @@ -33003,6 +33003,29 @@ static void test_wolfSSL_AES_ecb_encrypt(void) #endif } +static void test_wolfSSL_SHA224(void) +{ +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA224) && \ + defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) + unsigned char input[] = + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; + unsigned char output[] = + "\x75\x38\x8b\x16\x51\x27\x76\xcc\x5d\xba\x5d\xa1\xfd\x89\x01" + "\x50\xb0\xc6\x45\x5c\xb4\xf5\x8b\x19\x52\x52\x25\x25"; + size_t inLen; + byte hash[WC_SHA224_DIGEST_SIZE]; + + printf(testingFmt, "wolfSSL_SHA224)"); + inLen = XSTRLEN((char*)input); + + XMEMSET(hash, 0, WC_SHA224_DIGEST_SIZE); + AssertNotNull(SHA224(input, inLen, hash)); + AssertIntEQ(XMEMCMP(hash, output, WC_SHA224_DIGEST_SIZE), 0); + + printf(resultFmt, passed); +#endif +} + static void test_wolfSSL_SHA256(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) && \ @@ -40913,6 +40936,7 @@ void ApiTest(void) test_wolfSSL_PEM_write_DHparams(); test_wolfSSL_AES_ecb_encrypt(); test_wolfSSL_SHA256(); + test_wolfSSL_SHA224(); test_wolfSSL_X509_get_serialNumber(); test_wolfSSL_X509_CRL(); test_wolfSSL_d2i_X509_REQ(); diff --git a/wolfssl/openssl/sha.h b/wolfssl/openssl/sha.h index e3a814717e..277a70e2c9 100644 --- a/wolfssl/openssl/sha.h +++ b/wolfssl/openssl/sha.h @@ -99,6 +99,11 @@ typedef WOLFSSL_SHA224_CTX SHA224_CTX; #define SHA224_Init wolfSSL_SHA224_Init #define SHA224_Update wolfSSL_SHA224_Update #define SHA224_Final wolfSSL_SHA224_Final +#if defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) + /* SHA224 is only available in non-fips mode because of SHA224 enum in FIPS + * build. */ + #define SHA224 wolfSSL_SHA224 +#endif #endif /* WOLFSSL_SHA224 */ diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index f36f38be87..d2bdfcf096 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -3639,6 +3639,7 @@ WOLFSSL_API void* wolfSSL_get_app_data( const WOLFSSL *ssl); WOLFSSL_API int wolfSSL_set_app_data(WOLFSSL *ssl, void *arg); WOLFSSL_API WOLFSSL_ASN1_OBJECT * wolfSSL_X509_NAME_ENTRY_get_object(WOLFSSL_X509_NAME_ENTRY *ne); WOLFSSL_API unsigned char *wolfSSL_SHA1(const unsigned char *d, size_t n, unsigned char *md); +WOLFSSL_API unsigned char *wolfSSL_SHA224(const unsigned char *d, size_t n, unsigned char *md); WOLFSSL_API unsigned char *wolfSSL_SHA256(const unsigned char *d, size_t n, unsigned char *md); WOLFSSL_API unsigned char *wolfSSL_SHA384(const unsigned char *d, size_t n, unsigned char *md); WOLFSSL_API unsigned char *wolfSSL_SHA512(const unsigned char *d, size_t n, unsigned char *md); diff --git a/wolfssl/wolfcrypt/sha256.h b/wolfssl/wolfcrypt/sha256.h index 9538fed7b9..2fb267cb00 100644 --- a/wolfssl/wolfcrypt/sha256.h +++ b/wolfssl/wolfcrypt/sha256.h @@ -216,9 +216,12 @@ WOLFSSL_API void wc_Sha256SizeSet(wc_Sha256*, word32); #if !defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)) +#if !defined(NO_OLD_SHA_NAMES) + #define SHA224 WC_SHA224 +#endif + #ifndef NO_OLD_WC_NAMES #define Sha224 wc_Sha224 - #define SHA224 WC_SHA224 #define SHA224_BLOCK_SIZE WC_SHA224_BLOCK_SIZE #define SHA224_DIGEST_SIZE WC_SHA224_DIGEST_SIZE #define SHA224_PAD_SIZE WC_SHA224_PAD_SIZE From 95cf3675e956cbb9818645d37054db7a411d22fc Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Thu, 28 Jan 2021 12:02:35 +0900 Subject: [PATCH 64/78] implemented SHA256_Transform WIP SHA512_Transform --- src/ssl.c | 38 ++++++++++++++++++++++++++++++-- tests/api.c | 44 ++++++++++++++++++++++++++++++++++++++ wolfcrypt/src/sha256.c | 6 ++++++ wolfssl/openssl/sha.h | 13 +++++++---- wolfssl/wolfcrypt/sha256.h | 4 +++- 5 files changed, 98 insertions(+), 7 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 25bdd76f61..d10cd8545d 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -17007,8 +17007,29 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return 0; } + + #if defined(OPENSSL_EXTRA) + int wolfSSL_SHA256_Transform(WOLFSSL_SHA256_CTX* sha256, + const unsigned char* data) + { + int ret; + + WOLFSSL_ENTER("SHA256_Transform"); + #if defined(LITTLE_ENDIAN_ORDER) + { + ByteReverseWords((word32*)data, (word32*)data, WC_SHA256_BLOCK_SIZE); + } + #endif + ret = wc_Sha256Transform((wc_Sha256*)sha256, data); - + /* return 1 on success, 0 otherwise */ + if (ret == 0) + return 1; + + return ret; + } + #endif + #ifdef WOLFSSL_SHA384 int wolfSSL_SHA384_Init(WOLFSSL_SHA384_CTX* sha) @@ -17111,7 +17132,20 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return 0; } - + #if defined(OPENSSL_EXTRA) + int wolfSSL_SHA512_Transform(WOLFSSL_SHA512_CTX* sha, + const unsigned char* data) + { + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("SHA512_Transform"); + (void)sha; + (void)data; + + return ret; + } + #endif + #endif /* WOLFSSL_SHA512 */ #ifdef WOLFSSL_SHA3 diff --git a/tests/api.c b/tests/api.c index 79b1c77815..893d82fb0f 100644 --- a/tests/api.c +++ b/tests/api.c @@ -33026,6 +33026,49 @@ static void test_wolfSSL_SHA224(void) #endif } + +static void test_wolfSSL_SHA256_Transform(void) +{ +#if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) && \ + defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) + byte input1[] = ""; + byte input2[] = "abc"; + byte local[WC_SHA256_BLOCK_SIZE]; + word32 sLen = 0; + unsigned char output1[] = + "\xbe\x98\x56\xda\x69\xb4\xb9\x17\x99\x57\x33\x62\xca\xbe\x9f\x77" + "\x91\xd4\xe5\x8c\x43\x62\xd2\xc0\xea\xf9\xfe\xba\xd8\xa9\x37\x18"; + unsigned char output2[] = + "\x67\xd4\x4e\x1d\x67\x61\x7c\x67\x26\x76\x10\x44\xb8\xff\x10\x78" + "\x39\x9a\xc8\x40\x8c\x60\x16\x73\x05\xd6\x61\xa6\x35\x8c\xf2\x91"; + + WOLFSSL_SHA256_CTX sha256; + + printf(testingFmt, "wolfSSL_SHA256_Transform()"); + + XMEMSET(&sha256, 0, sizeof(sha256)); + XMEMSET(&local, 0, sizeof(local)); + + /* Init SHA256 CTX */ + AssertIntEQ(wolfSSL_SHA256_Init(&sha256), 1); + /* Do Transform*/ + sLen = XSTRLEN((char*)input1); + XMEMCPY(local, input1, sLen); + AssertIntEQ(wolfSSL_SHA256_Transform(&sha256, (const byte*)&local[0]), 1); + AssertIntEQ(XMEMCMP(&((wc_Sha256*)&sha256)->digest[0], output1, WC_SHA256_DIGEST_SIZE), 0); + + /* Init SHA256 CTX */ + AssertIntEQ(wolfSSL_SHA256_Init(&sha256), 1); + sLen = XSTRLEN((char*)input2); + XMEMSET(local, 0, WC_SHA256_BLOCK_SIZE); + XMEMCPY(local, input2, sLen); + AssertIntEQ(wolfSSL_SHA256_Transform(&sha256, (const byte*)&local[0]), 1); + AssertIntEQ(XMEMCMP(&((wc_Sha256*)&sha256)->digest[0], output2, WC_SHA256_DIGEST_SIZE), 0); + + printf(resultFmt, passed); +#endif +} + static void test_wolfSSL_SHA256(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) && \ @@ -40936,6 +40979,7 @@ void ApiTest(void) test_wolfSSL_PEM_write_DHparams(); test_wolfSSL_AES_ecb_encrypt(); test_wolfSSL_SHA256(); + test_wolfSSL_SHA256_Transform(); test_wolfSSL_SHA224(); test_wolfSSL_X509_get_serialNumber(); test_wolfSSL_X509_CRL(); diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index 50b8cf60f8..eb26ad6d6c 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -1295,6 +1295,12 @@ static int InitSha256(wc_Sha256* sha256) return InitSha256(sha256); /* reset state */ } + #if defined(OPENSSL_EXTRA) + int wc_Sha256Transform(wc_Sha256* sha, const unsigned char* data) + { + return (Transform_Sha256(sha, data)); + } + #endif #endif /* XTRANSFORM */ #ifdef WOLFSSL_SHA224 diff --git a/wolfssl/openssl/sha.h b/wolfssl/openssl/sha.h index 277a70e2c9..e4ff4af6c6 100644 --- a/wolfssl/openssl/sha.h +++ b/wolfssl/openssl/sha.h @@ -118,9 +118,10 @@ typedef struct WOLFSSL_SHA256_CTX { WOLFSSL_API int wolfSSL_SHA256_Init(WOLFSSL_SHA256_CTX*); WOLFSSL_API int wolfSSL_SHA256_Update(WOLFSSL_SHA256_CTX*, const void*, - unsigned long); + unsigned long); WOLFSSL_API int wolfSSL_SHA256_Final(unsigned char*, WOLFSSL_SHA256_CTX*); - +WOLFSSL_API int wolfSSL_SHA256_Transform(WOLFSSL_SHA256_CTX*, + const unsigned char *data); enum { SHA256_DIGEST_LENGTH = 32 }; @@ -131,6 +132,8 @@ typedef WOLFSSL_SHA256_CTX SHA256_CTX; #define SHA256_Init wolfSSL_SHA256_Init #define SHA256_Update wolfSSL_SHA256_Update #define SHA256_Final wolfSSL_SHA256_Final +#define SHA256_Transform wolfSSL_SHA256_Transform + #if defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) /* SHA256 is only available in non-fips mode because of SHA256 enum in FIPS * build. */ @@ -176,9 +179,10 @@ typedef struct WOLFSSL_SHA512_CTX { WOLFSSL_API int wolfSSL_SHA512_Init(WOLFSSL_SHA512_CTX*); WOLFSSL_API int wolfSSL_SHA512_Update(WOLFSSL_SHA512_CTX*, const void*, - unsigned long); + unsigned long); WOLFSSL_API int wolfSSL_SHA512_Final(unsigned char*, WOLFSSL_SHA512_CTX*); - +WOLFSSL_API int wolfSSL_SHA512_Transform(WOLFSSL_SHA512_CTX*, + const unsigned char*); enum { SHA512_DIGEST_LENGTH = 64 }; @@ -189,6 +193,7 @@ typedef WOLFSSL_SHA512_CTX SHA512_CTX; #define SHA512_Init wolfSSL_SHA512_Init #define SHA512_Update wolfSSL_SHA512_Update #define SHA512_Final wolfSSL_SHA512_Final +#define SHA512_Transform wolfSSL_SHA512_Transform #if defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) /* SHA512 is only available in non-fips mode because of SHA512 enum in FIPS * build. */ diff --git a/wolfssl/wolfcrypt/sha256.h b/wolfssl/wolfcrypt/sha256.h index 2fb267cb00..93c794f31e 100644 --- a/wolfssl/wolfcrypt/sha256.h +++ b/wolfssl/wolfcrypt/sha256.h @@ -198,7 +198,9 @@ WOLFSSL_API int wc_Sha256Update(wc_Sha256*, const byte*, word32); WOLFSSL_API int wc_Sha256FinalRaw(wc_Sha256*, byte*); WOLFSSL_API int wc_Sha256Final(wc_Sha256*, byte*); WOLFSSL_API void wc_Sha256Free(wc_Sha256*); - +#if defined(OPENSSL_EXTRA) +WOLFSSL_API int wc_Sha256Transform(wc_Sha256*, const byte*); +#endif WOLFSSL_API int wc_Sha256GetHash(wc_Sha256*, byte*); WOLFSSL_API int wc_Sha256Copy(wc_Sha256* src, wc_Sha256* dst); From 502e1458f95872760d44c43d92185a42a1e84df0 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Thu, 28 Jan 2021 14:34:09 +0900 Subject: [PATCH 65/78] Implemented SHA one shot Implemented SHA_Transform --- src/ssl.c | 39 ++++++++++++++++++++++++++++++++ tests/api.c | 50 +++++++++++++++++++++++++++++++++++++++++ wolfcrypt/src/sha.c | 7 ++++++ wolfssl/openssl/sha.h | 21 ++++++++++++----- wolfssl/ssl.h | 1 + wolfssl/wolfcrypt/sha.h | 3 +++ 6 files changed, 116 insertions(+), 5 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index d10cd8545d..bf58cfd90e 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -16884,7 +16884,28 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return 0; } + #if defined(OPENSSL_EXTRA) + int wolfSSL_SHA_Transform(WOLFSSL_SHA_CTX* sha, + const unsigned char* data) + { + int ret; + + WOLFSSL_ENTER("SHA_Transform"); + #if defined(LITTLE_ENDIAN_ORDER) + { + ByteReverseWords((word32*)data, (word32*)data, WC_SHA_BLOCK_SIZE); + } + #endif + ret = wc_ShaTransform((wc_Sha*)sha, data); + /* return 1 on success, 0 otherwise */ + if (ret == 0) + return 1; + + return ret; + } + #endif + int wolfSSL_SHA1_Init(WOLFSSL_SHA_CTX* sha) { WOLFSSL_ENTER("SHA1_Init"); @@ -16905,6 +16926,14 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, WOLFSSL_ENTER("SHA1_Final"); return SHA_Final(input, sha); } + #if defined(OPENSSL_EXTRA) + int wolfSSL_SHA1_Transform(WOLFSSL_SHA_CTX* sha, + const unsigned char* data) + { + WOLFSSL_ENTER("SHA1_Transform"); + return (wolfSSL_SHA_Transform(sha, data)); + } + #endif #endif /* !NO_SHA */ #ifdef WOLFSSL_SHA224 @@ -42919,6 +42948,16 @@ err: defined(WOLFSSL_HAPROXY) #ifndef NO_SHA + /* One shot SHA hash of message. + * + * Wrap SHA1 one shot + */ + unsigned char *wolfSSL_SHA(const unsigned char *d, size_t n, + unsigned char *md) + { + return wolfSSL_SHA1(d, n, md); + } + /* One shot SHA1 hash of message. * * d message to hash diff --git a/tests/api.c b/tests/api.c index 893d82fb0f..2c638fe07b 100644 --- a/tests/api.c +++ b/tests/api.c @@ -32794,6 +32794,11 @@ static void test_wolfSSL_SHA(void) XMEMSET(out, 0, WC_SHA_DIGEST_SIZE); AssertNotNull(SHA1(in, XSTRLEN((char*)in), out)); AssertIntEQ(XMEMCMP(out, expected, WC_SHA_DIGEST_SIZE), 0); + + /* SHA interface test */ + XMEMSET(out, 0, WC_SHA_DIGEST_SIZE); + AssertNotNull(SHA(in, XSTRLEN((char*)in), out)); + AssertIntEQ(XMEMCMP(out, expected, WC_SHA_DIGEST_SIZE), 0); } #endif @@ -33025,7 +33030,51 @@ static void test_wolfSSL_SHA224(void) printf(resultFmt, passed); #endif } +static void test_wolfSSL_SHA_Transform(void) +{ +#if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) && \ + defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) + byte input1[] = ""; + byte input2[] = "abc"; + byte local[WC_SHA_BLOCK_SIZE]; + word32 sLen = 0; + word32 i; + unsigned char output1[] = + "\xe5\x04\xb4\x92\xed\x8c\x58\x56\x4e\xcd\x1a\x6c\x68\x3f\x05\xbf" + "\x93\x3a\xf7\x09"; + unsigned char output2[] = + "\x8b\x74\xb2\x97\xca\xbc\x5b\x4f\xea\xe6\xc0\x5b\xa0\xb4\x40\x2d" + "\xb8\x08\x6e\x7c"; + WOLFSSL_SHA_CTX sha; + + printf(testingFmt, "wolfSSL_SHA_Transform()"); + + XMEMSET(&sha, 0, sizeof(sha)); + XMEMSET(&local, 0, sizeof(local)); + + /* Init SHA CTX */ + AssertIntEQ(wolfSSL_SHA_Init(&sha), 1); + /* Do Transform*/ + sLen = XSTRLEN((char*)input1); + XMEMCPY(local, input1, sLen); + AssertIntEQ(wolfSSL_SHA_Transform(&sha, (const byte*)&local[0]), 1); + for(i = 0; i< 5; i++) { + printf("sha->diges[%d] = 0x%08x\n", i, ((wc_Sha*)&sha)->digest[i]); + } + AssertIntEQ(XMEMCMP(&((wc_Sha*)&sha)->digest[0], output1, WC_SHA_DIGEST_SIZE), 0); + + /* Init SHA256 CTX */ + AssertIntEQ(wolfSSL_SHA_Init(&sha), 1); + sLen = XSTRLEN((char*)input2); + XMEMSET(local, 0, WC_SHA_BLOCK_SIZE); + XMEMCPY(local, input2, sLen); + AssertIntEQ(wolfSSL_SHA_Transform(&sha, (const byte*)&local[0]), 1); + AssertIntEQ(XMEMCMP(&((wc_Sha*)&sha)->digest[0], output2, WC_SHA_DIGEST_SIZE), 0); + + printf(resultFmt, passed); +#endif +} static void test_wolfSSL_SHA256_Transform(void) { @@ -40978,6 +41027,7 @@ void ApiTest(void) test_wolfSSL_DH_1536_prime(); test_wolfSSL_PEM_write_DHparams(); test_wolfSSL_AES_ecb_encrypt(); + test_wolfSSL_SHA_Transform(); test_wolfSSL_SHA256(); test_wolfSSL_SHA256_Transform(); test_wolfSSL_SHA224(); diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index 63f4ed402c..35c1589c6c 100644 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -773,6 +773,13 @@ int wc_ShaFinal(wc_Sha* sha, byte* hash) return ret; } +#if defined(OPENSSL_EXTRA) +int wc_ShaTransform(wc_Sha* sha, const unsigned char* data) +{ + return (Transform(sha, data)); +} +#endif + #endif /* USE_SHA_SOFTWARE_IMPL */ diff --git a/wolfssl/openssl/sha.h b/wolfssl/openssl/sha.h index e4ff4af6c6..9db9a098e9 100644 --- a/wolfssl/openssl/sha.h +++ b/wolfssl/openssl/sha.h @@ -52,12 +52,14 @@ typedef struct WOLFSSL_SHA_CTX { WOLFSSL_API int wolfSSL_SHA_Init(WOLFSSL_SHA_CTX*); WOLFSSL_API int wolfSSL_SHA_Update(WOLFSSL_SHA_CTX*, const void*, unsigned long); WOLFSSL_API int wolfSSL_SHA_Final(unsigned char*, WOLFSSL_SHA_CTX*); - +WOLFSSL_API int wolfSSL_SHA_Transform(WOLFSSL_SHA_CTX*, + const unsigned char *data); /* SHA1 points to above, shouldn't use SHA0 ever */ WOLFSSL_API int wolfSSL_SHA1_Init(WOLFSSL_SHA_CTX*); WOLFSSL_API int wolfSSL_SHA1_Update(WOLFSSL_SHA_CTX*, const void*, unsigned long); WOLFSSL_API int wolfSSL_SHA1_Final(unsigned char*, WOLFSSL_SHA_CTX*); - +WOLFSSL_API int wolfSSL_SHA1_Transform(WOLFSSL_SHA_CTX*, + const unsigned char *data); enum { SHA_DIGEST_LENGTH = 20 }; @@ -68,6 +70,13 @@ typedef WOLFSSL_SHA_CTX SHA_CTX; #define SHA_Init wolfSSL_SHA_Init #define SHA_Update wolfSSL_SHA_Update #define SHA_Final wolfSSL_SHA_Final +#if defined(NO_OLD_SHA_NAMES) && !defined(HAVE_SELFTEST) && \ + (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2)) + /* SHA is only available in non-fips mode or fips version > 2 mode + * because of SHA enum in FIPS build. */ + #define SHA wolfSSL_SHA +#endif #define SHA1_Init wolfSSL_SHA1_Init #define SHA1_Update wolfSSL_SHA1_Update @@ -99,9 +108,11 @@ typedef WOLFSSL_SHA224_CTX SHA224_CTX; #define SHA224_Init wolfSSL_SHA224_Init #define SHA224_Update wolfSSL_SHA224_Update #define SHA224_Final wolfSSL_SHA224_Final -#if defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) - /* SHA224 is only available in non-fips mode because of SHA224 enum in FIPS - * build. */ +#if defined(NO_OLD_SHA_NAMES) && !defined(HAVE_SELFTEST) && \ + (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2)) + /* SHA224 is only available in non-fips mode or fips version > 2 mode + * because of SHA224 enum in FIPS build. */ #define SHA224 wolfSSL_SHA224 #endif diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index d2bdfcf096..a9f7f67389 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -3638,6 +3638,7 @@ WOLFSSL_API void wolfSSL_set_verify_depth(WOLFSSL *ssl,int depth); WOLFSSL_API void* wolfSSL_get_app_data( const WOLFSSL *ssl); WOLFSSL_API int wolfSSL_set_app_data(WOLFSSL *ssl, void *arg); WOLFSSL_API WOLFSSL_ASN1_OBJECT * wolfSSL_X509_NAME_ENTRY_get_object(WOLFSSL_X509_NAME_ENTRY *ne); +WOLFSSL_API unsigned char *wolfSSL_SHA(const unsigned char *d, size_t n, unsigned char *md); WOLFSSL_API unsigned char *wolfSSL_SHA1(const unsigned char *d, size_t n, unsigned char *md); WOLFSSL_API unsigned char *wolfSSL_SHA224(const unsigned char *d, size_t n, unsigned char *md); WOLFSSL_API unsigned char *wolfSSL_SHA256(const unsigned char *d, size_t n, unsigned char *md); diff --git a/wolfssl/wolfcrypt/sha.h b/wolfssl/wolfcrypt/sha.h index 6203d648d6..f074f28c46 100644 --- a/wolfssl/wolfcrypt/sha.h +++ b/wolfssl/wolfcrypt/sha.h @@ -169,6 +169,9 @@ WOLFSSL_API void wc_ShaFree(wc_Sha*); WOLFSSL_API int wc_ShaGetHash(wc_Sha*, byte*); WOLFSSL_API int wc_ShaCopy(wc_Sha*, wc_Sha*); +#if defined(OPENSSL_EXTRA) +WOLFSSL_API int wc_ShaTransform(wc_Sha*, const byte*); +#endif #ifdef WOLFSSL_PIC32MZ_HASH WOLFSSL_API void wc_ShaSizeSet(wc_Sha* sha, word32 len); From 525d28f38f6131ed01de36f09c99aeecc9f82231 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Wed, 3 Feb 2021 14:00:03 +0900 Subject: [PATCH 66/78] Implemented MD5_Transform --- src/ssl.c | 20 ++++++++++++++++++++ wolfcrypt/src/md5.c | 7 ++++++- wolfssl/openssl/md5.h | 3 ++- wolfssl/wolfcrypt/md5.h | 8 +++++++- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index bf58cfd90e..08a1ab6821 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -16832,6 +16832,26 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return 0; } + + int wolfSSL_MD5_Transform(WOLFSSL_MD5_CTX* md5, const unsigned char* data) + { + int ret; + + WOLFSSL_ENTER("MD5_Transform"); + #if defined(LITTLE_ENDIAN_ORDER) + { + ByteReverseWords((word32*)data, (word32*)data, WC_MD5_BLOCK_SIZE); + } + #endif + + ret = wc_Md5Transform((wc_Md5*)md5, data); + + /* return 1 on success, 0 otherwise */ + if (ret == 0) + return 1; + + return ret; + } #endif /* !NO_MD5 */ diff --git a/wolfcrypt/src/md5.c b/wolfcrypt/src/md5.c index 7bc2489e87..d4c92ad0bf 100644 --- a/wolfcrypt/src/md5.c +++ b/wolfcrypt/src/md5.c @@ -550,7 +550,12 @@ int wc_Md5Copy(wc_Md5* src, wc_Md5* dst) return ret; } - +#ifdef OPENSSL_EXTRA +int wc_Md5Transform(wc_Md5* md5, const byte* data) +{ + return Transform(md5, data); +} +#endif #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB) int wc_Md5SetFlags(wc_Md5* md5, word32 flags) { diff --git a/wolfssl/openssl/md5.h b/wolfssl/openssl/md5.h index 49ac1e32f7..08cbd527e7 100644 --- a/wolfssl/openssl/md5.h +++ b/wolfssl/openssl/md5.h @@ -52,13 +52,14 @@ typedef struct WOLFSSL_MD5_CTX { WOLFSSL_API int wolfSSL_MD5_Init(WOLFSSL_MD5_CTX*); WOLFSSL_API int wolfSSL_MD5_Update(WOLFSSL_MD5_CTX*, const void*, unsigned long); WOLFSSL_API int wolfSSL_MD5_Final(unsigned char*, WOLFSSL_MD5_CTX*); - +WOLFSSL_API int wolfSSL_MD5_Transform(WOLFSSL_MD5_CTX*, const unsigned char*); typedef WOLFSSL_MD5_CTX MD5_CTX; #define MD5_Init wolfSSL_MD5_Init #define MD5_Update wolfSSL_MD5_Update #define MD5_Final wolfSSL_MD5_Final +#define MD5_Transform wolfSSL_MD5_Transform #ifdef OPENSSL_EXTRA_BSD #define MD5Init wolfSSL_MD5_Init diff --git a/wolfssl/wolfcrypt/md5.h b/wolfssl/wolfcrypt/md5.h index e2ee13c32a..30f46078dd 100644 --- a/wolfssl/wolfcrypt/md5.h +++ b/wolfssl/wolfcrypt/md5.h @@ -42,9 +42,12 @@ extern "C" { #endif +#if !defined(NO_OLD_MD5_NAMES) + #define MD5 WC_MD5 +#endif + #ifndef NO_OLD_WC_NAMES #define Md5 wc_Md5 - #define MD5 WC_MD5 #define MD5_BLOCK_SIZE WC_MD5_BLOCK_SIZE #define MD5_DIGEST_SIZE WC_MD5_DIGEST_SIZE #define WC_MD5_PAD_SIZE WC_MD5_PAD_SIZE @@ -109,6 +112,9 @@ WOLFSSL_API int wc_InitMd5_ex(wc_Md5*, void*, int); WOLFSSL_API int wc_Md5Update(wc_Md5*, const byte*, word32); WOLFSSL_API int wc_Md5Final(wc_Md5*, byte*); WOLFSSL_API void wc_Md5Free(wc_Md5*); +#ifdef OPENSSL_EXTRA +WOLFSSL_API int wc_Md5Transform(wc_Md5*, const byte*); +#endif WOLFSSL_API int wc_Md5GetHash(wc_Md5*, byte*); WOLFSSL_API int wc_Md5Copy(wc_Md5*, wc_Md5*); From 82fb498ed5be2f885406d1b571d7712c2d78cdd8 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Thu, 4 Feb 2021 10:22:02 +0900 Subject: [PATCH 67/78] Implemented MD5 unit tests --- src/ssl.c | 2 +- tests/api.c | 109 +++++++++++++++++++++++++++++++---- wolfssl/wolfcrypt/settings.h | 1 + 3 files changed, 100 insertions(+), 12 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 08a1ab6821..35816ec622 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -16838,7 +16838,7 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, int ret; WOLFSSL_ENTER("MD5_Transform"); - #if defined(LITTLE_ENDIAN_ORDER) + #if defined(BIG_ENDIAN_ORDER) { ByteReverseWords((word32*)data, (word32*)data, WC_MD5_BLOCK_SIZE); } diff --git a/tests/api.c b/tests/api.c index 2c638fe07b..6388b0c860 100644 --- a/tests/api.c +++ b/tests/api.c @@ -33008,10 +33008,96 @@ static void test_wolfSSL_AES_ecb_encrypt(void) #endif } +static void test_wolfSSL_MD5(void) +{ +#if defined(OPENSSL_EXTRA) && !defined(NO_MD5) + byte input1[] = ""; + byte input2[] = "message digest"; + byte hash[WC_MD5_DIGEST_SIZE]; + unsigned char output1[] = + "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8\x42\x7e"; + unsigned char output2[] = + "\xf9\x6b\x69\x7d\x7c\xb7\x93\x8d\x52\x5a\x2f\x31\xaa\xf1\x61\xd0"; + WOLFSSL_MD5_CTX md5; + + printf(testingFmt, "wolfSSL_MD5()"); + + XMEMSET(&md5, 0, sizeof(md5)); + + /* Init MD5 CTX */ + AssertIntEQ(wolfSSL_MD5_Init(&md5), 1); + AssertIntEQ(wolfSSL_MD5_Update(&md5, input1, + XSTRLEN((const char*)&input1)), 1); + AssertIntEQ(wolfSSL_MD5_Final(hash, &md5), 1); + AssertIntEQ(XMEMCMP(&hash, output1, WC_MD5_DIGEST_SIZE), 0); + + /* Init MD5 CTX */ + AssertIntEQ(wolfSSL_MD5_Init(&md5), 1); + AssertIntEQ(wolfSSL_MD5_Update(&md5, input2, + XSTRLEN((const char*)input2)), 1); + AssertIntEQ(wolfSSL_MD5_Final(hash, &md5), 1); + AssertIntEQ(XMEMCMP(&hash, output2, WC_MD5_DIGEST_SIZE), 0); +#if defined(OPENSSL_EXTRA) && !defined(HAVE_SELFTEST) && \ + (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2)) + AssertIntEQ(MD5(input1, XSTRLEN((const char*)&input1), (byte*)&hash), 0); + AssertIntEQ(XMEMCMP(&hash, output1, WC_MD5_DIGEST_SIZE), 0); + + AssertIntEQ(MD5(input2, XSTRLEN((const char*)&input2), (byte*)&hash), 0); + AssertIntEQ(XMEMCMP(&hash, output2, WC_MD5_DIGEST_SIZE), 0); +#endif + + printf(resultFmt, passed); +#endif +} + +static void test_wolfSSL_MD5_Transform(void) +{ +#if defined(OPENSSL_EXTRA) && !defined(NO_MD5) + byte input1[] = ""; + byte input2[] = "abc"; + byte local[WC_MD5_BLOCK_SIZE]; + word32 sLen = 0; + unsigned char output1[] = + "\xac\x1d\x1f\x03\xd0\x8e\xa5\x6e\xb7\x67\xab\x1f\x91\x77\x31\x74"; + unsigned char output2[] = + "\x8d\x79\xd3\xef\x90\x25\x17\x67\xc7\x79\x13\xa4\xbc\x7b\xa7\xe3"; + + WOLFSSL_MD5_CTX md5; + + printf(testingFmt, "wolfSSL_MD5_Transform()"); + + XMEMSET(&md5, 0, sizeof(md5)); + XMEMSET(&local, 0, sizeof(local)); + + /* Init MD5 CTX */ + AssertIntEQ(wolfSSL_MD5_Init(&md5), 1); + /* Do Transform*/ + sLen = XSTRLEN((char*)input1); + XMEMCPY(local, input1, sLen); + AssertIntEQ(wolfSSL_MD5_Transform(&md5, (const byte*)&local[0]), 1); + + AssertIntEQ(XMEMCMP(&((wc_Md5*)&md5)->digest[0], output1, + WC_MD5_DIGEST_SIZE), 0); + + /* Init MD5 CTX */ + AssertIntEQ(wolfSSL_MD5_Init(&md5), 1); + sLen = XSTRLEN((char*)input2); + XMEMSET(local, 0, WC_MD5_BLOCK_SIZE); + XMEMCPY(local, input2, sLen); + AssertIntEQ(wolfSSL_MD5_Transform(&md5, (const byte*)&local[0]), 1); + AssertIntEQ(XMEMCMP(&((wc_Md5*)&md5)->digest[0], output2, + WC_MD5_DIGEST_SIZE), 0); + + printf(resultFmt, passed); +#endif +} + static void test_wolfSSL_SHA224(void) { #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA224) && \ - defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) + !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2)) unsigned char input[] = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; unsigned char output[] = @@ -33032,13 +33118,11 @@ static void test_wolfSSL_SHA224(void) } static void test_wolfSSL_SHA_Transform(void) { -#if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) && \ - defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) +#if defined(OPENSSL_EXTRA) && !defined(NO_SHA) byte input1[] = ""; byte input2[] = "abc"; byte local[WC_SHA_BLOCK_SIZE]; word32 sLen = 0; - word32 i; unsigned char output1[] = "\xe5\x04\xb4\x92\xed\x8c\x58\x56\x4e\xcd\x1a\x6c\x68\x3f\x05\xbf" "\x93\x3a\xf7\x09"; @@ -33059,10 +33143,8 @@ static void test_wolfSSL_SHA_Transform(void) sLen = XSTRLEN((char*)input1); XMEMCPY(local, input1, sLen); AssertIntEQ(wolfSSL_SHA_Transform(&sha, (const byte*)&local[0]), 1); - for(i = 0; i< 5; i++) { - printf("sha->diges[%d] = 0x%08x\n", i, ((wc_Sha*)&sha)->digest[i]); - } - AssertIntEQ(XMEMCMP(&((wc_Sha*)&sha)->digest[0], output1, WC_SHA_DIGEST_SIZE), 0); + AssertIntEQ(XMEMCMP(&((wc_Sha*)&sha)->digest[0], output1, + WC_SHA_DIGEST_SIZE), 0); /* Init SHA256 CTX */ AssertIntEQ(wolfSSL_SHA_Init(&sha), 1); @@ -33070,7 +33152,8 @@ static void test_wolfSSL_SHA_Transform(void) XMEMSET(local, 0, WC_SHA_BLOCK_SIZE); XMEMCPY(local, input2, sLen); AssertIntEQ(wolfSSL_SHA_Transform(&sha, (const byte*)&local[0]), 1); - AssertIntEQ(XMEMCMP(&((wc_Sha*)&sha)->digest[0], output2, WC_SHA_DIGEST_SIZE), 0); + AssertIntEQ(XMEMCMP(&((wc_Sha*)&sha)->digest[0], output2, + WC_SHA_DIGEST_SIZE), 0); printf(resultFmt, passed); #endif @@ -33104,7 +33187,8 @@ static void test_wolfSSL_SHA256_Transform(void) sLen = XSTRLEN((char*)input1); XMEMCPY(local, input1, sLen); AssertIntEQ(wolfSSL_SHA256_Transform(&sha256, (const byte*)&local[0]), 1); - AssertIntEQ(XMEMCMP(&((wc_Sha256*)&sha256)->digest[0], output1, WC_SHA256_DIGEST_SIZE), 0); + AssertIntEQ(XMEMCMP(&((wc_Sha256*)&sha256)->digest[0], output1, + WC_SHA256_DIGEST_SIZE), 0); /* Init SHA256 CTX */ AssertIntEQ(wolfSSL_SHA256_Init(&sha256), 1); @@ -33112,7 +33196,8 @@ static void test_wolfSSL_SHA256_Transform(void) XMEMSET(local, 0, WC_SHA256_BLOCK_SIZE); XMEMCPY(local, input2, sLen); AssertIntEQ(wolfSSL_SHA256_Transform(&sha256, (const byte*)&local[0]), 1); - AssertIntEQ(XMEMCMP(&((wc_Sha256*)&sha256)->digest[0], output2, WC_SHA256_DIGEST_SIZE), 0); + AssertIntEQ(XMEMCMP(&((wc_Sha256*)&sha256)->digest[0], output2, + WC_SHA256_DIGEST_SIZE), 0); printf(resultFmt, passed); #endif @@ -41027,6 +41112,8 @@ void ApiTest(void) test_wolfSSL_DH_1536_prime(); test_wolfSSL_PEM_write_DHparams(); test_wolfSSL_AES_ecb_encrypt(); + test_wolfSSL_MD5(); + test_wolfSSL_MD5_Transform(); test_wolfSSL_SHA_Transform(); test_wolfSSL_SHA256(); test_wolfSSL_SHA256_Transform(); diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index c025ac9cef..102665c578 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -2275,6 +2275,7 @@ extern void uITRON4_free(void *p) ; /* added to have compatibility with SHA256() */ #if !defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) #define NO_OLD_SHA_NAMES + #define NO_OLD_MD5_NAMES #endif #endif From 5fb9aa3f9b4254e007dabcf8c9c5f7e623b6da1e Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Fri, 5 Feb 2021 17:38:58 +0900 Subject: [PATCH 68/78] implemented SHA512_Transform and unit test --- src/ssl.c | 18 +++++++++---- tests/api.c | 52 ++++++++++++++++++++++++++++++++++++-- wolfcrypt/src/sha512.c | 25 ++++++++++++++++++ wolfssl/wolfcrypt/sha512.h | 3 +++ 4 files changed, 91 insertions(+), 7 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 35816ec622..d7b1592f40 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -17181,19 +17181,27 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return 0; } - #if defined(OPENSSL_EXTRA) - int wolfSSL_SHA512_Transform(WOLFSSL_SHA512_CTX* sha, + + int wolfSSL_SHA512_Transform(WOLFSSL_SHA512_CTX* sha512, const unsigned char* data) { int ret = WOLFSSL_SUCCESS; WOLFSSL_ENTER("SHA512_Transform"); - (void)sha; - (void)data; + #if defined(LITTLE_ENDIAN_ORDER) + { + ByteReverseWords64((word64*)data, (word64*)data, + WC_SHA512_BLOCK_SIZE); + } + #endif + ret = wc_Sha512Transform((wc_Sha512*)sha512, data); + + /* return 1 on success, 0 otherwise */ + if (ret == 0) + return 1; return ret; } - #endif #endif /* WOLFSSL_SHA512 */ diff --git a/tests/api.c b/tests/api.c index 6388b0c860..402d026c8f 100644 --- a/tests/api.c +++ b/tests/api.c @@ -33161,8 +33161,7 @@ static void test_wolfSSL_SHA_Transform(void) static void test_wolfSSL_SHA256_Transform(void) { -#if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) && \ - defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) +#if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) byte input1[] = ""; byte input2[] = "abc"; byte local[WC_SHA256_BLOCK_SIZE]; @@ -33227,6 +33226,54 @@ static void test_wolfSSL_SHA256(void) #endif } +static void test_wolfSSL_SHA512_Transform(void) +{ +#if defined(OPENSSL_EXTRA) && !defined(NO_SHA512) + byte input1[] = ""; + byte input2[] = "abc"; + byte local[WC_SHA512_BLOCK_SIZE]; + word32 sLen = 0; + unsigned char output1[] = + "\xe8\xcb\x4a\x77\xd5\x81\x78\xcf\x70\x80\xc7\xfb\xe0\x62\x33\x53" + "\xda\x0e\x46\x87\x9d\x63\x67\x02\xb0\x31\x59\xe8\x40\xcb\x86\x30" + "\xa3\x23\xa0\x88\x52\xc9\x7d\x71\xe0\xb5\xe0\x4c\xc1\xb2\xba\x96" + "\x0b\x3e\xe3\xea\x04\xfe\xc4\x6f\xee\x8b\x66\xbd\x0c\xd8\xf4\x91"; + unsigned char output2[] = + "\x0d\xcc\xa0\xeb\x4e\x93\x10\x11\x21\xc8\x04\xfb\x9c\x43\x33\xfd" + "\x41\x31\xab\xca\x3d\x26\xb4\xa9\xab\xd7\x67\xe1\xaf\xaa\xc6\xe2" + "\x83\x4e\xba\x2c\x54\x2e\x8f\x31\x98\x38\x2b\x8f\x9d\xec\x88\xbe" + "\x4d\x5e\x8b\x53\x9d\x4e\xd2\x14\xf0\x96\x20\xaf\x69\x6c\x68\xde"; + + WOLFSSL_SHA512_CTX sha512; + + printf(testingFmt, "wolfSSL_SHA512_Transform()"); + + XMEMSET(&sha512, 0, sizeof(sha512)); + XMEMSET(&local, 0, sizeof(local)); + + /* Init SHA512 CTX */ + AssertIntEQ(wolfSSL_SHA512_Init(&sha512), 1); + + /* Do Transform*/ + sLen = XSTRLEN((char*)input1); + XMEMCPY(local, input1, sLen); + AssertIntEQ(wolfSSL_SHA512_Transform(&sha512, (const byte*)&local[0]), 1); + AssertIntEQ(XMEMCMP(&((wc_Sha512*)&sha512)->digest[0], output1, + WC_SHA512_DIGEST_SIZE), 0); + + /* Init SHA512 CTX */ + AssertIntEQ(wolfSSL_SHA512_Init(&sha512), 1); + sLen = XSTRLEN((char*)input2); + XMEMSET(local, 0, WC_SHA512_BLOCK_SIZE); + XMEMCPY(local, input2, sLen); + AssertIntEQ(wolfSSL_SHA512_Transform(&sha512, (const byte*)&local[0]), 1); + AssertIntEQ(XMEMCMP(&((wc_Sha512*)&sha512)->digest[0], output2, + WC_SHA512_DIGEST_SIZE), 0); + (void)input1; + printf(resultFmt, passed); +#endif +} + static void test_wolfSSL_X509_get_serialNumber(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_RSA) @@ -41118,6 +41165,7 @@ void ApiTest(void) test_wolfSSL_SHA256(); test_wolfSSL_SHA256_Transform(); test_wolfSSL_SHA224(); + test_wolfSSL_SHA512_Transform(); test_wolfSSL_X509_get_serialNumber(); test_wolfSSL_X509_CRL(); test_wolfSSL_d2i_X509_REQ(); diff --git a/wolfcrypt/src/sha512.c b/wolfcrypt/src/sha512.c index ef09e54048..45a70e03ae 100644 --- a/wolfcrypt/src/sha512.c +++ b/wolfcrypt/src/sha512.c @@ -916,7 +916,32 @@ void wc_Sha512Free(wc_Sha512* sha512) wolfAsync_DevCtxFree(&sha512->asyncDev, WOLFSSL_ASYNC_MARKER_SHA512); #endif /* WOLFSSL_ASYNC_CRYPT */ } +#if defined(OPENSSL_EXTRA) +int wc_Sha512Transform(wc_Sha512* sha, const unsigned char* data) +{ + int ret ; + /* back up buffer */ + #if defined(WOLFSSL_SMALL_STACK) + word64* buffer; + buffer = (word64*) XMALLOC(sizeof(word64) * 16, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (buffer == NULL) + return MEMORY_E; + #else + word64 buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64)]; + #endif + + XMEMCPY(buffer, sha->buffer, WC_SHA512_BLOCK_SIZE); + XMEMCPY(sha->buffer, data, WC_SHA512_BLOCK_SIZE); + + ret = Transform_Sha512(sha); + XMEMCPY(sha->buffer, buffer, WC_SHA512_BLOCK_SIZE); + #if defined(WOLFSSL_SMALL_STACK) + XFREE(buffer, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + return ret; +} +#endif #endif /* WOLFSSL_SHA512 */ /* -------------------------------------------------------------------------- */ diff --git a/wolfssl/wolfcrypt/sha512.h b/wolfssl/wolfcrypt/sha512.h index f3e79a263e..6b6ad84e9a 100644 --- a/wolfssl/wolfcrypt/sha512.h +++ b/wolfssl/wolfcrypt/sha512.h @@ -180,6 +180,9 @@ WOLFSSL_API int wc_Sha512Copy(wc_Sha512* src, wc_Sha512* dst); WOLFSSL_API int wc_Sha512GetFlags(wc_Sha512* sha512, word32* flags); #endif +#if defined(OPENSSL_EXTRA) +WOLFSSL_API int wc_Sha512Transform(wc_Sha512* sha, const unsigned char* data); +#endif #endif /* WOLFSSL_SHA512 */ #if defined(WOLFSSL_SHA384) From cd26444e0185e19bfbc7c2f0f058ac728889fd73 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Thu, 18 Feb 2021 09:56:37 +0900 Subject: [PATCH 69/78] addressed jenkins failure part1 --- configure.ac | 2 +- src/ssl.c | 2 +- tests/api.c | 49 ++++++++++++++++++------------------ wolfssl/wolfcrypt/md5.h | 2 +- wolfssl/wolfcrypt/settings.h | 4 ++- 5 files changed, 30 insertions(+), 29 deletions(-) diff --git a/configure.ac b/configure.ac index 507fe147d5..08414bb7d5 100644 --- a/configure.ac +++ b/configure.ac @@ -5625,7 +5625,7 @@ AC_ARG_ENABLE([oldnames], if test "x$ENABLED_OLDNAMES" = "xno" && test "x$ENABLED_OPENSSLCOEXIST" = "xno" then AM_CFLAGS="$AM_CFLAGS -DNO_OLD_RNGNAME -DNO_OLD_WC_NAMES -DNO_OLD_SSL_NAMES" - AM_CFLAGS="$AM_CFLAGS -DNO_OLD_SHA_NAMES" + AM_CFLAGS="$AM_CFLAGS -DNO_OLD_SHA_NAMES -DNO_OLD_MD5_NAME" fi diff --git a/src/ssl.c b/src/ssl.c index d7b1592f40..e77ac2756e 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -26415,7 +26415,7 @@ static int woflSSL_X509_VERIFY_PARAM_inherit(WOLFSSL_X509_VERIFY_PARAM *to, if (isOverWrite || (from->hostName[0] != 0 && (to->hostName[0] == 0 || isDefault))) { if (!(ret = wolfSSL_X509_VERIFY_PARAM_set1_host(to, from->hostName, - XSTRLEN(from->hostName)))) + (int)XSTRLEN(from->hostName)))) return ret; to->hostFlags = from->hostFlags; } diff --git a/tests/api.c b/tests/api.c index 402d026c8f..8934a3ebfa 100644 --- a/tests/api.c +++ b/tests/api.c @@ -28070,14 +28070,14 @@ static void test_wolfSSL_CTX_get0_set1_param(void) AssertNotNull(pvpm); wolfSSL_X509_VERIFY_PARAM_set1_host(pvpm, testhostName, - XSTRLEN(testhostName)); + (int)XSTRLEN(testhostName)); wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(pvpm, testIPv4); wolfSSL_X509_VERIFY_PARAM_set_hostflags(pvpm, 0x01); ret = SSL_CTX_set1_param(ctx, pvpm); AssertIntEQ(1, ret); AssertIntEQ(0, XSTRNCMP(pParam->hostName, testhostName, - XSTRLEN(testhostName))); + (int)XSTRLEN(testhostName))); AssertIntEQ(0x01, pParam->hostFlags); AssertIntEQ(0, XSTRNCMP(pParam->ipasc, testIPv4, WOLFSSL_MAX_IPSTR)); @@ -29966,10 +29966,10 @@ static void test_wolfSSL_X509_VERIFY_PARAM(void) XMEMSET(paramFrom, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM )); ret = wolfSSL_X509_VERIFY_PARAM_set1_host(paramFrom, testhostName1, - XSTRLEN(testhostName1)); + (int)XSTRLEN(testhostName1)); AssertIntEQ(1, ret); AssertIntEQ(0, XSTRNCMP(paramFrom->hostName, testhostName1, - XSTRLEN(testhostName1))); + (int)XSTRLEN(testhostName1))); wolfSSL_X509_VERIFY_PARAM_set_hostflags(NULL, 0x00); @@ -30004,13 +30004,13 @@ static void test_wolfSSL_X509_VERIFY_PARAM(void) ret = wolfSSL_X509_VERIFY_PARAM_set1(paramTo, paramFrom); AssertIntEQ(1, ret); AssertIntEQ(0, XSTRNCMP(paramTo->hostName, testhostName1, - XSTRLEN(testhostName1))); + (int)XSTRLEN(testhostName1))); AssertIntEQ(0x01, paramTo->hostFlags); AssertIntEQ(0, XSTRNCMP(paramTo->ipasc, testIPv6, WOLFSSL_MAX_IPSTR)); /* inherit flags test : VPARAM OVERWRITE */ wolfSSL_X509_VERIFY_PARAM_set1_host(paramTo, testhostName2, - XSTRLEN(testhostName2)); + (int)XSTRLEN(testhostName2)); wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(paramTo, testIPv4); wolfSSL_X509_VERIFY_PARAM_set_hostflags(paramTo, 0x00); @@ -30019,13 +30019,13 @@ static void test_wolfSSL_X509_VERIFY_PARAM(void) ret = wolfSSL_X509_VERIFY_PARAM_set1(paramTo, paramFrom); AssertIntEQ(1, ret); AssertIntEQ(0, XSTRNCMP(paramTo->hostName, testhostName1, - XSTRLEN(testhostName1))); + (int)XSTRLEN(testhostName1))); AssertIntEQ(0x01, paramTo->hostFlags); AssertIntEQ(0, XSTRNCMP(paramTo->ipasc, testIPv6, WOLFSSL_MAX_IPSTR)); /* inherit flags test : VPARAM_RESET_FLAGS */ wolfSSL_X509_VERIFY_PARAM_set1_host(paramTo, testhostName2, - XSTRLEN(testhostName2)); + (int)XSTRLEN(testhostName2)); wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(paramTo, testIPv4); wolfSSL_X509_VERIFY_PARAM_set_hostflags(paramTo, 0x10); @@ -30034,13 +30034,13 @@ static void test_wolfSSL_X509_VERIFY_PARAM(void) ret = wolfSSL_X509_VERIFY_PARAM_set1(paramTo, paramFrom); AssertIntEQ(1, ret); AssertIntEQ(0, XSTRNCMP(paramTo->hostName, testhostName1, - XSTRLEN(testhostName1))); + (int)XSTRLEN(testhostName1))); AssertIntEQ(0x01, paramTo->hostFlags); AssertIntEQ(0, XSTRNCMP(paramTo->ipasc, testIPv6, WOLFSSL_MAX_IPSTR)); /* inherit flags test : VPARAM_LOCKED */ wolfSSL_X509_VERIFY_PARAM_set1_host(paramTo, testhostName2, - XSTRLEN(testhostName2)); + (int)XSTRLEN(testhostName2)); wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(paramTo, testIPv4); wolfSSL_X509_VERIFY_PARAM_set_hostflags(paramTo, 0x00); @@ -30049,7 +30049,7 @@ static void test_wolfSSL_X509_VERIFY_PARAM(void) ret = wolfSSL_X509_VERIFY_PARAM_set1(paramTo, paramFrom); AssertIntEQ(1, ret); AssertIntEQ(0, XSTRNCMP(paramTo->hostName, testhostName2, - XSTRLEN(testhostName2))); + (int)XSTRLEN(testhostName2))); AssertIntEQ(0x00, paramTo->hostFlags); AssertIntEQ(0, XSTRNCMP(paramTo->ipasc, testIPv4, WOLFSSL_MAX_IPSTR)); @@ -33034,16 +33034,15 @@ static void test_wolfSSL_MD5(void) /* Init MD5 CTX */ AssertIntEQ(wolfSSL_MD5_Init(&md5), 1); AssertIntEQ(wolfSSL_MD5_Update(&md5, input2, - XSTRLEN((const char*)input2)), 1); + (int)XSTRLEN((const char*)input2)), 1); AssertIntEQ(wolfSSL_MD5_Final(hash, &md5), 1); AssertIntEQ(XMEMCMP(&hash, output2, WC_MD5_DIGEST_SIZE), 0); -#if defined(OPENSSL_EXTRA) && !defined(HAVE_SELFTEST) && \ - (!defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2)) - AssertIntEQ(MD5(input1, XSTRLEN((const char*)&input1), (byte*)&hash), 0); +#if !defined(NO_OLD_NAMES) && \ + (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))) + AssertIntEQ(MD5(input1, (int)XSTRLEN((const char*)&input1), (byte*)&hash), 0); AssertIntEQ(XMEMCMP(&hash, output1, WC_MD5_DIGEST_SIZE), 0); - AssertIntEQ(MD5(input2, XSTRLEN((const char*)&input2), (byte*)&hash), 0); + AssertIntEQ(MD5(input2, (int)XSTRLEN((const char*)&input2), (byte*)&hash), 0); AssertIntEQ(XMEMCMP(&hash, output2, WC_MD5_DIGEST_SIZE), 0); #endif @@ -33073,7 +33072,7 @@ static void test_wolfSSL_MD5_Transform(void) /* Init MD5 CTX */ AssertIntEQ(wolfSSL_MD5_Init(&md5), 1); /* Do Transform*/ - sLen = XSTRLEN((char*)input1); + sLen = (word32)XSTRLEN((char*)input1); XMEMCPY(local, input1, sLen); AssertIntEQ(wolfSSL_MD5_Transform(&md5, (const byte*)&local[0]), 1); @@ -33082,7 +33081,7 @@ static void test_wolfSSL_MD5_Transform(void) /* Init MD5 CTX */ AssertIntEQ(wolfSSL_MD5_Init(&md5), 1); - sLen = XSTRLEN((char*)input2); + sLen = (word32)XSTRLEN((char*)input2); XMEMSET(local, 0, WC_MD5_BLOCK_SIZE); XMEMCPY(local, input2, sLen); AssertIntEQ(wolfSSL_MD5_Transform(&md5, (const byte*)&local[0]), 1); @@ -33140,7 +33139,7 @@ static void test_wolfSSL_SHA_Transform(void) /* Init SHA CTX */ AssertIntEQ(wolfSSL_SHA_Init(&sha), 1); /* Do Transform*/ - sLen = XSTRLEN((char*)input1); + sLen = (word32)XSTRLEN((char*)input1); XMEMCPY(local, input1, sLen); AssertIntEQ(wolfSSL_SHA_Transform(&sha, (const byte*)&local[0]), 1); AssertIntEQ(XMEMCMP(&((wc_Sha*)&sha)->digest[0], output1, @@ -33148,7 +33147,7 @@ static void test_wolfSSL_SHA_Transform(void) /* Init SHA256 CTX */ AssertIntEQ(wolfSSL_SHA_Init(&sha), 1); - sLen = XSTRLEN((char*)input2); + sLen = (word32)XSTRLEN((char*)input2); XMEMSET(local, 0, WC_SHA_BLOCK_SIZE); XMEMCPY(local, input2, sLen); AssertIntEQ(wolfSSL_SHA_Transform(&sha, (const byte*)&local[0]), 1); @@ -33183,7 +33182,7 @@ static void test_wolfSSL_SHA256_Transform(void) /* Init SHA256 CTX */ AssertIntEQ(wolfSSL_SHA256_Init(&sha256), 1); /* Do Transform*/ - sLen = XSTRLEN((char*)input1); + sLen = (word32)XSTRLEN((char*)input1); XMEMCPY(local, input1, sLen); AssertIntEQ(wolfSSL_SHA256_Transform(&sha256, (const byte*)&local[0]), 1); AssertIntEQ(XMEMCMP(&((wc_Sha256*)&sha256)->digest[0], output1, @@ -33191,7 +33190,7 @@ static void test_wolfSSL_SHA256_Transform(void) /* Init SHA256 CTX */ AssertIntEQ(wolfSSL_SHA256_Init(&sha256), 1); - sLen = XSTRLEN((char*)input2); + sLen = (word32)XSTRLEN((char*)input2); XMEMSET(local, 0, WC_SHA256_BLOCK_SIZE); XMEMCPY(local, input2, sLen); AssertIntEQ(wolfSSL_SHA256_Transform(&sha256, (const byte*)&local[0]), 1); @@ -33255,7 +33254,7 @@ static void test_wolfSSL_SHA512_Transform(void) AssertIntEQ(wolfSSL_SHA512_Init(&sha512), 1); /* Do Transform*/ - sLen = XSTRLEN((char*)input1); + sLen = (word32)XSTRLEN((char*)input1); XMEMCPY(local, input1, sLen); AssertIntEQ(wolfSSL_SHA512_Transform(&sha512, (const byte*)&local[0]), 1); AssertIntEQ(XMEMCMP(&((wc_Sha512*)&sha512)->digest[0], output1, @@ -33263,7 +33262,7 @@ static void test_wolfSSL_SHA512_Transform(void) /* Init SHA512 CTX */ AssertIntEQ(wolfSSL_SHA512_Init(&sha512), 1); - sLen = XSTRLEN((char*)input2); + sLen = (word32)XSTRLEN((char*)input2); XMEMSET(local, 0, WC_SHA512_BLOCK_SIZE); XMEMCPY(local, input2, sLen); AssertIntEQ(wolfSSL_SHA512_Transform(&sha512, (const byte*)&local[0]), 1); diff --git a/wolfssl/wolfcrypt/md5.h b/wolfssl/wolfcrypt/md5.h index 30f46078dd..290c5ec919 100644 --- a/wolfssl/wolfcrypt/md5.h +++ b/wolfssl/wolfcrypt/md5.h @@ -42,7 +42,7 @@ extern "C" { #endif -#if !defined(NO_OLD_MD5_NAMES) +#if !defined(NO_OLD_MD5_NAME) #define MD5 WC_MD5 #endif diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 102665c578..f01fcdd569 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -2275,7 +2275,9 @@ extern void uITRON4_free(void *p) ; /* added to have compatibility with SHA256() */ #if !defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) #define NO_OLD_SHA_NAMES - #define NO_OLD_MD5_NAMES + #endif + #if !defined(NO_OLD_MD5_NAME) && !defined(HAVE_FIPS) + #define NO_OLD_MD5_NAME #endif #endif From 5ddd2710d7e9b3fa6045671bc7d999a110ac039a Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Thu, 18 Feb 2021 11:27:57 +0900 Subject: [PATCH 70/78] addressed jenkins failure part2 --- tests/api.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/api.c b/tests/api.c index 8934a3ebfa..5ec6f003f5 100644 --- a/tests/api.c +++ b/tests/api.c @@ -28068,6 +28068,7 @@ static void test_wolfSSL_CTX_get0_set1_param(void) pvpm = (WOLFSSL_X509_VERIFY_PARAM *)XMALLOC( sizeof(WOLFSSL_X509_VERIFY_PARAM), NULL, DYNAMIC_TYPE_OPENSSL); AssertNotNull(pvpm); + XMEMSET(pvpm, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM)); wolfSSL_X509_VERIFY_PARAM_set1_host(pvpm, testhostName, (int)XSTRLEN(testhostName)); From 9bae05525ca16b62699045660cdfb13aa239c5e0 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Thu, 18 Feb 2021 12:07:01 +0900 Subject: [PATCH 71/78] addressed review comments --- examples/client/client.c | 23 ----------------------- examples/server/server.c | 26 -------------------------- src/ssl.c | 10 ---------- wolfssl/internal.h | 2 +- wolfssl/openssl/sha.h | 2 +- wolfssl/ssl.h | 1 - wolfssl/test.h | 26 ++++++++++++++++++++++++++ 7 files changed, 28 insertions(+), 62 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index 86882c4763..729aacdee0 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -329,29 +329,6 @@ static void SetKeyShare(WOLFSSL* ssl, int onlyKeyShare, int useX25519, #endif #ifdef WOLFSSL_EARLY_DATA -static void EarlyDataStatus(WOLFSSL* ssl) -{ - int earlyData_status; - - earlyData_status = wolfSSL_get_early_data_status(ssl); - if (earlyData_status < 0) return; - - printf("Early Data was "); - - switch(earlyData_status) { - case WOLFSSL_EARLY_DATA_NOT_SENT: - printf("not sent.\n"); - break; - case WOLFSSL_EARLY_DATA_REJECTED: - printf("rejected.\n"); - break; - case WOLFSSL_EARLY_DATA_ACCEPTED: - printf("accepted\n"); - break; - default: - printf("unknown...\n"); - } -} static void EarlyData(WOLFSSL_CTX* ctx, WOLFSSL* ssl, const char* msg, int msgSz, char* buffer) { diff --git a/examples/server/server.c b/examples/server/server.c index ad63565b04..00e17e80ee 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -844,32 +844,6 @@ static const char* server_usage_msg[][56] = { #endif }; -#ifdef WOLFSSL_EARLY_DATA -static void EarlyDataStatus(WOLFSSL* ssl) -{ - int earlyData_status; - - earlyData_status = wolfSSL_get_early_data_status(ssl); - if (earlyData_status < 0) return; - - printf("Early Data was "); - - switch(earlyData_status) { - case WOLFSSL_EARLY_DATA_NOT_SENT: - printf("not sent.\n"); - break; - case WOLFSSL_EARLY_DATA_REJECTED: - printf("rejected.\n"); - break; - case WOLFSSL_EARLY_DATA_ACCEPTED: - printf("accepted.\n"); - break; - default: - printf("unknown...\n"); - } -} -#endif - static void Usage(void) { int msgId = 0; diff --git a/src/ssl.c b/src/ssl.c index e77ac2756e..0b99b5fa4e 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -42976,16 +42976,6 @@ err: defined(WOLFSSL_HAPROXY) #ifndef NO_SHA - /* One shot SHA hash of message. - * - * Wrap SHA1 one shot - */ - unsigned char *wolfSSL_SHA(const unsigned char *d, size_t n, - unsigned char *md) - { - return wolfSSL_SHA1(d, n, md); - } - /* One shot SHA1 hash of message. * * d message to hash diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 96ba70dcff..7c34915463 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -4367,7 +4367,7 @@ struct WOLFSSL { #ifdef WOLFSSL_EARLY_DATA EarlyDataState earlyData; word32 earlyDataSz; - word32 earlyDataStatus; + byte earlyDataStatus; #endif #ifdef OPENSSL_ALL long verifyCallbackResult; diff --git a/wolfssl/openssl/sha.h b/wolfssl/openssl/sha.h index 9db9a098e9..c8ee6d4c64 100644 --- a/wolfssl/openssl/sha.h +++ b/wolfssl/openssl/sha.h @@ -75,7 +75,7 @@ typedef WOLFSSL_SHA_CTX SHA_CTX; (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2)) /* SHA is only available in non-fips mode or fips version > 2 mode * because of SHA enum in FIPS build. */ - #define SHA wolfSSL_SHA + #define SHA wolfSSL_SHA1 #endif #define SHA1_Init wolfSSL_SHA1_Init diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index a9f7f67389..d2bdfcf096 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -3638,7 +3638,6 @@ WOLFSSL_API void wolfSSL_set_verify_depth(WOLFSSL *ssl,int depth); WOLFSSL_API void* wolfSSL_get_app_data( const WOLFSSL *ssl); WOLFSSL_API int wolfSSL_set_app_data(WOLFSSL *ssl, void *arg); WOLFSSL_API WOLFSSL_ASN1_OBJECT * wolfSSL_X509_NAME_ENTRY_get_object(WOLFSSL_X509_NAME_ENTRY *ne); -WOLFSSL_API unsigned char *wolfSSL_SHA(const unsigned char *d, size_t n, unsigned char *md); WOLFSSL_API unsigned char *wolfSSL_SHA1(const unsigned char *d, size_t n, unsigned char *md); WOLFSSL_API unsigned char *wolfSSL_SHA224(const unsigned char *d, size_t n, unsigned char *md); WOLFSSL_API unsigned char *wolfSSL_SHA256(const unsigned char *d, size_t n, unsigned char *md); diff --git a/wolfssl/test.h b/wolfssl/test.h index 5da853e609..50a5c96a25 100644 --- a/wolfssl/test.h +++ b/wolfssl/test.h @@ -4088,4 +4088,30 @@ static WC_INLINE word16 GetRandomPort(void) return port; } +#ifdef WOLFSSL_EARLY_DATA +static WC_INLINE void EarlyDataStatus(WOLFSSL* ssl) +{ + int earlyData_status; + + earlyData_status = wolfSSL_get_early_data_status(ssl); + if (earlyData_status < 0) return; + + printf("Early Data was "); + + switch(earlyData_status) { + case WOLFSSL_EARLY_DATA_NOT_SENT: + printf("not sent.\n"); + break; + case WOLFSSL_EARLY_DATA_REJECTED: + printf("rejected.\n"); + break; + case WOLFSSL_EARLY_DATA_ACCEPTED: + printf("accepted\n"); + break; + default: + printf("unknown...\n"); + } +} +#endif /* WOLFSSL_EARLY_DATA */ + #endif /* wolfSSL_TEST_H */ From 302c6dfe1165b43374578b5ebecbdca826d6d83f Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Thu, 18 Feb 2021 16:33:58 +0900 Subject: [PATCH 72/78] addressed jenkins failure part3 --- scripts/tls13.test | 4 ++-- src/internal.c | 2 +- src/ssl.c | 7 +------ tests/api.c | 2 +- wolfcrypt/src/sha512.c | 21 ++++++++++++++++++--- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/scripts/tls13.test b/scripts/tls13.test index e7a2b3618d..70f0072655 100755 --- a/scripts/tls13.test +++ b/scripts/tls13.test @@ -280,11 +280,11 @@ if [ "$early_data" = "yes" -a "$psk" = "yes" ]; then RESULT=$? remove_ready_file early_data_cnt=`grep 'Early Data' $server_out_file | wc -l` - if [ $early_data_cnt -ne 2 -a $early_data_cnt -ne 4 ]; then + if [ $early_data_cnt -ne 3 -a $early_data_cnt -ne 4 ]; then RESULT=1 fi if [ $RESULT -ne 0 ]; then - echo -e "\n\nIssue with TLS v1.3 Early Data - session ticket" + echo -e "\n\nIssue with TLS v1.3 Early Data - PSK" do_cleanup exit 1 fi diff --git a/src/internal.c b/src/internal.c index eeebe5302d..20df4f998c 100644 --- a/src/internal.c +++ b/src/internal.c @@ -1804,7 +1804,7 @@ int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap) /* WOLFSSL_X509_VERIFY_PARAM */ if ((ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC( sizeof(WOLFSSL_X509_VERIFY_PARAM), - ctx->heap, DYNAMIC_TYPE_OPENSSL)) == NULL) { + heap, DYNAMIC_TYPE_OPENSSL)) == NULL) { WOLFSSL_MSG("ctx->param memory error"); return MEMORY_E; } diff --git a/src/ssl.c b/src/ssl.c index 0b99b5fa4e..14f1123119 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -17188,12 +17188,7 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, int ret = WOLFSSL_SUCCESS; WOLFSSL_ENTER("SHA512_Transform"); - #if defined(LITTLE_ENDIAN_ORDER) - { - ByteReverseWords64((word64*)data, (word64*)data, - WC_SHA512_BLOCK_SIZE); - } - #endif + ret = wc_Sha512Transform((wc_Sha512*)sha512, data); /* return 1 on success, 0 otherwise */ diff --git a/tests/api.c b/tests/api.c index 5ec6f003f5..07b6f08794 100644 --- a/tests/api.c +++ b/tests/api.c @@ -33228,7 +33228,7 @@ static void test_wolfSSL_SHA256(void) static void test_wolfSSL_SHA512_Transform(void) { -#if defined(OPENSSL_EXTRA) && !defined(NO_SHA512) +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA512) byte input1[] = ""; byte input2[] = "abc"; byte local[WC_SHA512_BLOCK_SIZE]; diff --git a/wolfcrypt/src/sha512.c b/wolfcrypt/src/sha512.c index 45a70e03ae..0353cfc645 100644 --- a/wolfcrypt/src/sha512.c +++ b/wolfcrypt/src/sha512.c @@ -923,16 +923,31 @@ int wc_Sha512Transform(wc_Sha512* sha, const unsigned char* data) /* back up buffer */ #if defined(WOLFSSL_SMALL_STACK) word64* buffer; - buffer = (word64*) XMALLOC(sizeof(word64) * 16, NULL, DYNAMIC_TYPE_TMP_BUFFER); + buffer = (word64*) XMALLOC(sizeof(word64) * 16, NULL, + DYNAMIC_TYPE_TMP_BUFFER); if (buffer == NULL) return MEMORY_E; #else word64 buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64)]; #endif - + +#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + Sha512_SetTransform(); +#endif + +#if defined(LITTLE_ENDIAN_ORDER) +#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) +#endif + { + ByteReverseWords64((word64*)data, (word64*)data, + WC_SHA512_BLOCK_SIZE); + } +#endif + XMEMCPY(buffer, sha->buffer, WC_SHA512_BLOCK_SIZE); XMEMCPY(sha->buffer, data, WC_SHA512_BLOCK_SIZE); - + ret = Transform_Sha512(sha); XMEMCPY(sha->buffer, buffer, WC_SHA512_BLOCK_SIZE); From 2246ea33cc481e3ad46d8a0b326127f05fd37387 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Fri, 19 Feb 2021 17:21:46 +0900 Subject: [PATCH 73/78] addressed sanitize failure --- tests/api.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/api.c b/tests/api.c index 07b6f08794..51fb3fac5a 100644 --- a/tests/api.c +++ b/tests/api.c @@ -39113,8 +39113,10 @@ static void test_wolfSSL_X509_load_crl_file(void) WOLFSSL_FILETYPE_PEM ), CRL_CERT_REVOKED); } - printf(resultFmt, passed); + wolfSSL_X509_STORE_free(store); + store = NULL; + printf(resultFmt, passed); #endif } From 464f82a575f216bda72ba4e96dd9802b1877a6ef Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Fri, 19 Feb 2021 17:37:12 +0900 Subject: [PATCH 74/78] addressed jenkins failure part4 --- src/ssl.c | 16 ++++++++++++++-- tests/api.c | 11 ++++++++++- wolfssl/wolfcrypt/settings.h | 6 ++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 14f1123119..41fe9bad84 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -16904,7 +16904,9 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return 0; } - #if defined(OPENSSL_EXTRA) + #if defined(OPENSSL_EXTRA) + #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) int wolfSSL_SHA_Transform(WOLFSSL_SHA_CTX* sha, const unsigned char* data) { @@ -16925,6 +16927,7 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return ret; } #endif + #endif int wolfSSL_SHA1_Init(WOLFSSL_SHA_CTX* sha) { @@ -16947,6 +16950,8 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return SHA_Final(input, sha); } #if defined(OPENSSL_EXTRA) + #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) int wolfSSL_SHA1_Transform(WOLFSSL_SHA_CTX* sha, const unsigned char* data) { @@ -16954,6 +16959,7 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return (wolfSSL_SHA_Transform(sha, data)); } #endif + #endif #endif /* !NO_SHA */ #ifdef WOLFSSL_SHA224 @@ -17058,6 +17064,8 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, } #if defined(OPENSSL_EXTRA) + #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) int wolfSSL_SHA256_Transform(WOLFSSL_SHA256_CTX* sha256, const unsigned char* data) { @@ -17078,6 +17086,7 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return ret; } #endif + #endif #ifdef WOLFSSL_SHA384 @@ -17182,6 +17191,8 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return 0; } + #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) int wolfSSL_SHA512_Transform(WOLFSSL_SHA512_CTX* sha512, const unsigned char* data) { @@ -17197,7 +17208,8 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return ret; } - + #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) */ #endif /* WOLFSSL_SHA512 */ #ifdef WOLFSSL_SHA3 diff --git a/tests/api.c b/tests/api.c index 51fb3fac5a..93f8f589bb 100644 --- a/tests/api.c +++ b/tests/api.c @@ -32785,7 +32785,7 @@ static void test_wolfSSL_SHA(void) #if defined(OPENSSL_EXTRA) && !defined(HAVE_SELFTEST) printf(testingFmt, "wolfSSL_SHA()"); - #if !defined(NO_SHA) + #if !defined(NO_SHA) && defined(NO_OLD_SHA_NAMES) { const unsigned char in[] = "abc"; unsigned char expected[] = "\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E" @@ -33119,6 +33119,8 @@ static void test_wolfSSL_SHA224(void) static void test_wolfSSL_SHA_Transform(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_SHA) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) byte input1[] = ""; byte input2[] = "abc"; byte local[WC_SHA_BLOCK_SIZE]; @@ -33157,11 +33159,14 @@ static void test_wolfSSL_SHA_Transform(void) printf(resultFmt, passed); #endif +#endif } static void test_wolfSSL_SHA256_Transform(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) byte input1[] = ""; byte input2[] = "abc"; byte local[WC_SHA256_BLOCK_SIZE]; @@ -33200,6 +33205,7 @@ static void test_wolfSSL_SHA256_Transform(void) printf(resultFmt, passed); #endif +#endif } static void test_wolfSSL_SHA256(void) @@ -33229,6 +33235,8 @@ static void test_wolfSSL_SHA256(void) static void test_wolfSSL_SHA512_Transform(void) { #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA512) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) byte input1[] = ""; byte input2[] = "abc"; byte local[WC_SHA512_BLOCK_SIZE]; @@ -33272,6 +33280,7 @@ static void test_wolfSSL_SHA512_Transform(void) (void)input1; printf(resultFmt, passed); #endif +#endif } static void test_wolfSSL_X509_get_serialNumber(void) diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index f01fcdd569..a3a527a979 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -2273,10 +2273,12 @@ extern void uITRON4_free(void *p) ; #if defined(NO_OLD_WC_NAMES) || defined(OPENSSL_EXTRA) /* added to have compatibility with SHA256() */ - #if !defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) + #if !defined(NO_OLD_SHA_NAMES) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) #define NO_OLD_SHA_NAMES #endif - #if !defined(NO_OLD_MD5_NAME) && !defined(HAVE_FIPS) + #if !defined(NO_OLD_MD5_NAME) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) #define NO_OLD_MD5_NAME #endif #endif From 896245cae74d13765e83560207ca38db38f53883 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Sat, 20 Feb 2021 12:54:59 +0900 Subject: [PATCH 75/78] addressed jenkins cavp test failure --- src/ssl.c | 16 ++++++++-------- src/tls13.c | 3 ++- tests/api.c | 12 ++++++------ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 41fe9bad84..d6dd64f7a7 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -16905,8 +16905,8 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, } #if defined(OPENSSL_EXTRA) - #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2)) + #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) int wolfSSL_SHA_Transform(WOLFSSL_SHA_CTX* sha, const unsigned char* data) { @@ -16950,8 +16950,8 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return SHA_Final(input, sha); } #if defined(OPENSSL_EXTRA) - #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2)) + #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) int wolfSSL_SHA1_Transform(WOLFSSL_SHA_CTX* sha, const unsigned char* data) { @@ -17064,8 +17064,8 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, } #if defined(OPENSSL_EXTRA) - #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2)) + #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) int wolfSSL_SHA256_Transform(WOLFSSL_SHA256_CTX* sha256, const unsigned char* data) { @@ -17191,8 +17191,8 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return 0; } - #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2)) + #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) int wolfSSL_SHA512_Transform(WOLFSSL_SHA512_CTX* sha512, const unsigned char* data) { diff --git a/src/tls13.c b/src/tls13.c index 0422fe2704..16b449f913 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -8663,7 +8663,8 @@ int wolfSSL_write_early_data(WOLFSSL* ssl, const void* data, int sz, int* outSz) if (ssl->options.handShakeState == CLIENT_HELLO_COMPLETE) { #ifdef OPENSSL_EXTRA /* when processed early data exceeds max size */ - if (ssl->earlyDataSz + sz > ssl->session.maxEarlyDataSz) { + if (ssl->session.maxEarlyDataSz > 0 && + (ssl->earlyDataSz + sz > ssl->session.maxEarlyDataSz)) { ssl->error = TOO_MUCH_EARLY_DATA; return WOLFSSL_FATAL_ERROR; } diff --git a/tests/api.c b/tests/api.c index 93f8f589bb..2579fe06c0 100644 --- a/tests/api.c +++ b/tests/api.c @@ -33119,8 +33119,8 @@ static void test_wolfSSL_SHA224(void) static void test_wolfSSL_SHA_Transform(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_SHA) -#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2)) +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) byte input1[] = ""; byte input2[] = "abc"; byte local[WC_SHA_BLOCK_SIZE]; @@ -33165,8 +33165,8 @@ static void test_wolfSSL_SHA_Transform(void) static void test_wolfSSL_SHA256_Transform(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) -#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2)) +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) byte input1[] = ""; byte input2[] = "abc"; byte local[WC_SHA256_BLOCK_SIZE]; @@ -33235,8 +33235,8 @@ static void test_wolfSSL_SHA256(void) static void test_wolfSSL_SHA512_Transform(void) { #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA512) -#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2)) +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) byte input1[] = ""; byte input2[] = "abc"; byte local[WC_SHA512_BLOCK_SIZE]; From 046b279ae2be163d8362b75a567f6c075de4bd9b Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Thu, 4 Mar 2021 10:04:42 +1000 Subject: [PATCH 76/78] MP: fixes for negative sp_int.c: - sp_addmod_ct(), sp_submod_ct(), sp_gcd() and sp_lcm() only support positive numbers: updated comments. - sp_mod(0, neg): fix to not add 0 and neg. - sp_div(): set sign on rem when a is greater than d but same bit length and fix sign setting on result when absolute values equal or close. - Modular exponentation functions: compare absolute values when determining whether base needs to be reduced. - Fix calculation of hex string when negative: add -ve nibble before checking for need of extra 0. - Fix size allocation in sp_mod when WOLFSSL_SP_INT_NEGATIVE defined tfm.c: - fp_mod(0, neg): fix to not add 0 and neg. - fp_isone(): fixed to check for negative - fp_add_d(): fix small stack version to support negative numbers integer.c: - mp_isone(): fixed to check for negative --- wolfcrypt/src/sp_int.c | 45 +++++++++++++++++++++++-------------- wolfcrypt/src/tfm.c | 44 ++++++++++++++++-------------------- wolfssl/wolfcrypt/integer.h | 3 ++- wolfssl/wolfcrypt/tfm.h | 15 ++++++++----- 4 files changed, 58 insertions(+), 49 deletions(-) diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c index cbd24ee197..0822861a86 100644 --- a/wolfcrypt/src/sp_int.c +++ b/wolfcrypt/src/sp_int.c @@ -4142,7 +4142,7 @@ static int sp_cmp_mag_ct(sp_int* a, sp_int* b, int len) #if defined(WOLFSSL_SP_MATH_ALL) && defined(HAVE_ECC) /* Add two value and reduce: r = (a + b) % m * - * r = a + b (mod m) - constant time (|a| < m and |b| < m and positive) + * r = a + b (mod m) - constant time (a < m and b < m, a, b and m are positive) * * Assumes a, b, m and r are not NULL. * @@ -4193,7 +4193,7 @@ int sp_addmod_ct(sp_int* a, sp_int* b, sp_int* m, sp_int* r) /* Sub b from a and reduce: r = (a - b) % m * Result is always positive. * - * r = a - b (mod m) - constant time (a < n and b < m and positive) + * r = a - b (mod m) - constant time (a < m and b < m, a, b and m are positive) * * Assumes a, b, m and r are not NULL. * @@ -4482,7 +4482,7 @@ int sp_div(sp_int* a, sp_int* d, sp_int* r, sp_int* rem) if (r != NULL) { sp_set(r, 1); #ifdef WOLFSSL_SP_INT_NEGATIVE - r->sign = aSign; + r->sign = (aSign == dSign) ? MP_ZPOS : MP_NEG; #endif /* WOLFSSL_SP_INT_NEGATIVE */ } done = 1; @@ -4491,11 +4491,14 @@ int sp_div(sp_int* a, sp_int* d, sp_int* r, sp_int* rem) /* a is greater than d but same bit length */ if (rem != NULL) { _sp_sub_off(a, d, rem, 0); + #ifdef WOLFSSL_SP_INT_NEGATIVE + rem->sign = aSign; + #endif } if (r != NULL) { sp_set(r, 1); #ifdef WOLFSSL_SP_INT_NEGATIVE - r->sign = aSign; + r->sign = (aSign == dSign) ? MP_ZPOS : MP_NEG; #endif /* WOLFSSL_SP_INT_NEGATIVE */ } done = 1; @@ -4681,7 +4684,7 @@ int sp_mod(sp_int* a, sp_int* m, sp_int* r) { int err = MP_OKAY; #ifdef WOLFSSL_SP_INT_NEGATIVE - DECL_SP_INT(t, (m == NULL) ? 1 : m->used); + DECL_SP_INT(t, (a == NULL) ? 1 : a->used + 1); #endif /* WOLFSSL_SP_INT_NEGATIVE */ if ((a == NULL) || (m == NULL) || (r == NULL)) { @@ -4695,11 +4698,11 @@ int sp_mod(sp_int* a, sp_int* m, sp_int* r) #else ALLOC_SP_INT(t, m->used, err, NULL); if (err == MP_OKAY) { - sp_init_size(t, m->used); + sp_init_size(t, a->used + 1); err = sp_div(a, m, NULL, t); } if (err == MP_OKAY) { - if (t->sign != m->sign) { + if ((!sp_iszero(t)) && (t->sign != m->sign)) { err = sp_add(t, m, r); } else { @@ -8013,7 +8016,7 @@ static int _sp_exptmod_ex(sp_int* b, sp_int* e, int bits, sp_int* m, sp_int* r) #endif /* Ensure base is less than exponent. */ - if (_sp_cmp(b, m) != MP_LT) { + if (_sp_cmp_abs(b, m) != MP_LT) { err = sp_mod(b, m, t[0]); if ((err == MP_OKAY) && sp_iszero(t[0])) { sp_set(r, 0); @@ -8113,7 +8116,7 @@ static int _sp_exptmod_mont_ex(sp_int* b, sp_int* e, int bits, sp_int* m, sp_init_size(t[3], m->used * 2 + 1); /* Ensure base is less than exponent. */ - if (_sp_cmp(b, m) != MP_LT) { + if (_sp_cmp_abs(b, m) != MP_LT) { err = sp_mod(b, m, t[0]); if ((err == MP_OKAY) && sp_iszero(t[0])) { sp_set(r, 0); @@ -8248,7 +8251,7 @@ static int _sp_exptmod_mont_ex(sp_int* b, sp_int* e, int bits, sp_int* m, sp_init_size(tr, m->used * 2 + 1); /* Ensure base is less than exponent. */ - if (_sp_cmp(b, m) != MP_LT) { + if (_sp_cmp_abs(b, m) != MP_LT) { err = sp_mod(b, m, t[1]); if ((err == MP_OKAY) && sp_iszero(t[1])) { sp_set(r, 0); @@ -8767,7 +8770,7 @@ static int _sp_exptmod_nct(sp_int* b, sp_int* e, sp_int* m, sp_int* r) sp_init_size(bm, m->used * 2 + 1); /* Ensure base is less than exponent. */ - if (_sp_cmp(b, m) != MP_LT) { + if (_sp_cmp_abs(b, m) != MP_LT) { err = sp_mod(b, m, bm); if ((err == MP_OKAY) && sp_iszero(bm)) { sp_set(r, 0); @@ -8980,7 +8983,7 @@ static int _sp_exptmod_nct(sp_int* b, sp_int* e, sp_int* m, sp_int* r) sp_init_size(t[1], m->used * 2 + 1); /* Ensure base is less than exponent. */ - if (_sp_cmp(b, m) != MP_LT) { + if (_sp_cmp_abs(b, m) != MP_LT) { err = sp_mod(b, m, t[0]); if ((err == MP_OKAY) && sp_iszero(t[0])) { sp_set(r, 0); @@ -12491,6 +12494,7 @@ int sp_tohex(sp_int* a, char* str) i = a->used - 1; #ifndef WC_DISABLE_RADIX_ZERO_PAD + /* Find highest non-zero byte in most-significant word. */ for (j = SP_WORD_SIZE - 8; j >= 0; j -= 8) { if (((a->dp[i] >> j) & 0xff) != 0) { break; @@ -12500,8 +12504,10 @@ int sp_tohex(sp_int* a, char* str) --i; } } + /* Start with high nibble of byte. */ j += 4; #else + /* Find highest non-zero nibble in most-significant word. */ for (j = SP_WORD_SIZE - 4; j >= 0; j -= 4) { if (((a->dp[i] >> j) & 0xf) != 0) { break; @@ -12512,6 +12518,7 @@ int sp_tohex(sp_int* a, char* str) } } #endif /* WC_DISABLE_RADIX_ZERO_PAD */ + /* Most-significant word. */ for (; j >= 0; j -= 4) { *(str++) = sp_hex_char[(a->dp[i] >> j) & 0xf]; } @@ -12660,16 +12667,16 @@ int sp_radix_size(sp_int* a, int radix, int* size) } else { int nibbles = (sp_count_bits(a) + 3) / 4; - #ifdef WOLFSSL_SP_INT_NEGATIVE - if (a->sign == MP_NEG) { - nibbles++; - } - #endif /* WOLFSSL_SP_INT_NEGATIVE */ #ifndef WC_DISABLE_RADIX_ZERO_PAD if (nibbles & 1) { nibbles++; } #endif /* WC_DISABLE_RADIX_ZERO_PAD */ + #ifdef WOLFSSL_SP_INT_NEGATIVE + if (a->sign == MP_NEG) { + nibbles++; + } + #endif /* WOLFSSL_SP_INT_NEGATIVE */ /* One more for \0 */ *size = nibbles + 1; } @@ -13233,6 +13240,8 @@ int sp_prime_is_prime_ex(sp_int* a, int t, int* result, WC_RNG* rng) #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) /* Calculates the Greatest Common Denominator (GCD) of a and b into r. + * + * a and b are positive integers. * * @param [in] a SP integer of first operand. * @param [in] b SP integer of second operand. @@ -13342,6 +13351,8 @@ int sp_gcd(sp_int* a, sp_int* b, sp_int* r) #if defined(WOLFSSL_SP_MATH_ALL) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) /* Calculates the Lowest Common Multiple (LCM) of a and b and stores in r. + * + * a and b are positive integers. * * @param [in] a SP integer of first operand. * @param [in] b SP integer of second operand. diff --git a/wolfcrypt/src/tfm.c b/wolfcrypt/src/tfm.c index 505fc556f8..4352567ccb 100644 --- a/wolfcrypt/src/tfm.c +++ b/wolfcrypt/src/tfm.c @@ -990,7 +990,7 @@ int fp_mod(fp_int *a, fp_int *b, fp_int *c) fp_init(t); err = fp_div(a, b, NULL, t); if (err == FP_OKAY) { - if (t->sign != b->sign) { + if (!fp_iszero(t) && (t->sign != b->sign)) { err = fp_add(t, b, c); } else { fp_copy(t, c); @@ -5328,32 +5328,26 @@ int fp_gcd(fp_int *a, fp_int *b, fp_int *c) int fp_add_d(fp_int *a, fp_digit b, fp_int *c) { #ifndef WOLFSSL_SMALL_STACK - fp_int tmp; - int err; - fp_init(&tmp); - fp_set(&tmp, b); - err = fp_add(a, &tmp, c); - return err; + fp_int tmp[1]; #else - int i; - fp_word t = b; - int err = FP_OKAY; - - fp_copy(a, c); - for (i = 0; t != 0 && i < FP_SIZE && i < c->used; i++) { - t += c->dp[i]; - c->dp[i] = (fp_digit)t; - t >>= DIGIT_BIT; - } - if (i == c->used && i < FP_SIZE && t != 0) { - c->dp[i] = t; - c->used++; - } - if (i == FP_SIZE && t != 0) { - err = FP_VAL; - } - return err; + fp_int* tmp; #endif + int err; + +#ifdef WOLFSSL_SMALL_STACK + tmp = (fp_int*)XMALLOC(sizeof(fp_int), NULL, DYNAMIC_TYPE_BIGINT); + if (tmp == NULL) + return FP_MEM; +#endif + + fp_init(tmp); + fp_set(tmp, b); + err = fp_add(a, tmp, c); + +#ifdef WOLFSSL_SMALL_STACK + XFREE(tmp, NULL, DYNAMIC_TYPE_BIGINT); +#endif + return err; } /* external compatibility */ diff --git a/wolfssl/wolfcrypt/integer.h b/wolfssl/wolfcrypt/integer.h index 8f3665b60e..59a366bb1b 100644 --- a/wolfssl/wolfcrypt/integer.h +++ b/wolfssl/wolfcrypt/integer.h @@ -227,7 +227,8 @@ typedef int ltm_prime_callback(unsigned char *dst, int len, void *dat); /* ---> Basic Manipulations <--- */ #define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO) #define mp_isone(a) \ - (((((a)->used == 1)) && ((a)->dp[0] == 1u)) ? MP_YES : MP_NO) + (((((a)->used == 1)) && ((a)->dp[0] == 1u) && ((a)->sign == MP_ZPOS)) \ + ? MP_YES : MP_NO) #define mp_iseven(a) \ (((a)->used > 0 && (((a)->dp[0] & 1u) == 0u)) ? MP_YES : MP_NO) #define mp_isodd(a) \ diff --git a/wolfssl/wolfcrypt/tfm.h b/wolfssl/wolfcrypt/tfm.h index 5546b57bf3..3f4c43276b 100644 --- a/wolfssl/wolfcrypt/tfm.h +++ b/wolfssl/wolfcrypt/tfm.h @@ -422,13 +422,16 @@ MP_API void fp_free(fp_int* a); /* zero/one/even/odd/neg/word ? */ #define fp_iszero(a) (((a)->used == 0) ? FP_YES : FP_NO) #define fp_isone(a) \ - ((((a)->used == 1) && ((a)->dp[0] == 1)) ? FP_YES : FP_NO) -#define fp_iseven(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 0)) ? FP_YES : FP_NO) -#define fp_isodd(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? FP_YES : FP_NO) -#define fp_isneg(a) (((a)->sign != 0) ? FP_YES : FP_NO) -#define fp_isword(a, w) \ - ((((a)->used == 1) && ((a)->dp[0] == w)) || ((w == 0) && ((a)->used == 0)) \ + ((((a)->used == 1) && ((a)->dp[0] == 1) && ((a)->sign == FP_ZPOS)) \ ? FP_YES : FP_NO) +#define fp_iseven(a) \ + (((a)->used > 0 && (((a)->dp[0] & 1) == 0)) ? FP_YES : FP_NO) +#define fp_isodd(a) \ + (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? FP_YES : FP_NO) +#define fp_isneg(a) (((a)->sign != FP_ZPOS) ? FP_YES : FP_NO) +#define fp_isword(a, w) \ + (((((a)->used == 1) && ((a)->dp[0] == w)) || \ + ((w == 0) && ((a)->used == 0))) ? FP_YES : FP_NO) /* set to a small digit */ void fp_set(fp_int *a, fp_digit b); From 298ebd6024cee33ce6ce5f91a9c1596cdf405a62 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Fri, 5 Mar 2021 10:02:07 +1000 Subject: [PATCH 77/78] MP small: read radix set result to 0 on all errors --- wolfcrypt/src/integer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wolfcrypt/src/integer.c b/wolfcrypt/src/integer.c index a4fc5f6ca3..b2eafb4cce 100644 --- a/wolfcrypt/src/integer.c +++ b/wolfcrypt/src/integer.c @@ -5229,9 +5229,11 @@ int mp_read_radix (mp_int * a, const char *str, int radix) */ if (y < radix) { if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) { + mp_zero(a); return res; } if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) { + mp_zero(a); return res; } } else { From 3b768bcb5ee5e737a8f66adee6f6737f012ce2c1 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Sat, 6 Mar 2021 10:18:31 +0900 Subject: [PATCH 78/78] addressed review comments --- src/ssl.c | 64 +++++++++++++++++++++++++++++++----------- tests/api.c | 34 +++++++++++++++++++++- wolfcrypt/src/md5.c | 8 ++++++ wolfcrypt/src/sha.c | 8 ++++++ wolfcrypt/src/sha256.c | 7 +++++ wolfcrypt/src/sha512.c | 13 ++++++++- 6 files changed, 115 insertions(+), 19 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index d6dd64f7a7..7ca1323363 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -2272,7 +2272,7 @@ int wolfSSL_UseMaxFragment(WOLFSSL* ssl, byte mfl) #ifdef WOLFSSL_ALLOW_MAX_FRAGMENT_ADJUST /* The following is a non-standard way to reconfigure the max packet size - post-handshake for wolfSSL_write/woflSSL_read */ + post-handshake for wolfSSL_write/wolfSSL_read */ if (ssl->options.handShakeState == HANDSHAKE_DONE) { switch (mfl) { case WOLFSSL_MFL_2_8 : ssl->max_fragment = 256; break; @@ -16832,25 +16832,30 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return 0; } - + /* Apply MD5 transformation to the data */ int wolfSSL_MD5_Transform(WOLFSSL_MD5_CTX* md5, const unsigned char* data) { int ret; WOLFSSL_ENTER("MD5_Transform"); + + /* sanity check */ + if (md5 == NULL || data == NULL) { + return 0; + } #if defined(BIG_ENDIAN_ORDER) { ByteReverseWords((word32*)data, (word32*)data, WC_MD5_BLOCK_SIZE); } #endif - + ret = wc_Md5Transform((wc_Md5*)md5, data); /* return 1 on success, 0 otherwise */ if (ret == 0) return 1; - - return ret; + else + return 0; } #endif /* !NO_MD5 */ @@ -16907,12 +16912,17 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, #if defined(OPENSSL_EXTRA) #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) + /* Apply SHA1 transformation to the data */ int wolfSSL_SHA_Transform(WOLFSSL_SHA_CTX* sha, const unsigned char* data) { int ret; WOLFSSL_ENTER("SHA_Transform"); + /* sanity check */ + if (sha == NULL || data == NULL) { + return 0; + } #if defined(LITTLE_ENDIAN_ORDER) { ByteReverseWords((word32*)data, (word32*)data, WC_SHA_BLOCK_SIZE); @@ -16923,8 +16933,8 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, /* return 1 on success, 0 otherwise */ if (ret == 0) return 1; - - return ret; + else + return 0; } #endif #endif @@ -16952,6 +16962,7 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, #if defined(OPENSSL_EXTRA) #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) + /* Apply SHA1 transformation to the data */ int wolfSSL_SHA1_Transform(WOLFSSL_SHA_CTX* sha, const unsigned char* data) { @@ -17066,12 +17077,17 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, #if defined(OPENSSL_EXTRA) #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) + /* Apply SHA256 transformation to the data */ int wolfSSL_SHA256_Transform(WOLFSSL_SHA256_CTX* sha256, const unsigned char* data) { int ret; WOLFSSL_ENTER("SHA256_Transform"); + /* sanity check */ + if (sha256 == NULL || data == NULL) { + return 0; + } #if defined(LITTLE_ENDIAN_ORDER) { ByteReverseWords((word32*)data, (word32*)data, WC_SHA256_BLOCK_SIZE); @@ -17082,8 +17098,8 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, /* return 1 on success, 0 otherwise */ if (ret == 0) return 1; - - return ret; + else + return 0; } #endif #endif @@ -17193,20 +17209,25 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) + /* Apply SHA512 transformation to the data */ int wolfSSL_SHA512_Transform(WOLFSSL_SHA512_CTX* sha512, const unsigned char* data) { int ret = WOLFSSL_SUCCESS; WOLFSSL_ENTER("SHA512_Transform"); + /* sanity check */ + if (sha512 == NULL || data == NULL) { + return 0; + } ret = wc_Sha512Transform((wc_Sha512*)sha512, data); /* return 1 on success, 0 otherwise */ if (ret == 0) return 1; - - return ret; + else + return 0; } #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ (HAVE_FIPS_VERSION > 2)) */ @@ -21690,7 +21711,7 @@ WOLFSSL_SESSION* wolfSSL_SESSION_new(void) } /* add one to session reference count - * return WOFLSSL_SUCCESS on success and WOLFSSL_FAILURE on error */ + * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error */ int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session) { if (session == NULL) @@ -26087,6 +26108,9 @@ WOLFSSL_API WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_bio(WOLFSSL_BIO *bp, byte* der = NULL; WOLFSSL_X509_CRL* crl = NULL; + if (bp == NULL) + return NULL; + if ((derSz = wolfSSL_BIO_get_len(bp)) > 0) { der = (byte*)XMALLOC(derSz, 0, DYNAMIC_TYPE_DER); if (der != NULL) { @@ -26111,6 +26135,11 @@ WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_fp(XFILE fp, WOLFSSL_X509_CRL **crl) return (WOLFSSL_X509_CRL *)wolfSSL_d2i_X509_fp_ex(fp, (void **)crl, CRL_TYPE); } +/* Read CRL file, and add it to store and corresponding cert manager */ +/* @param ctx a pointer of X509_LOOKUP back to the X509_STORE */ +/* @param file a file to read */ +/* @param type WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1 */ +/* @return WOLFSSL_SUCCESS(1) on successful, othewise WOLFSSL_FAILURE(0)*/ WOLFSSL_API int wolfSSL_X509_load_crl_file(WOLFSSL_X509_LOOKUP *ctx, const char *file, int type) { @@ -26161,7 +26190,7 @@ WOLFSSL_API int wolfSSL_X509_load_crl_file(WOLFSSL_X509_LOOKUP *ctx, } } } else { - WOLFSSL_MSG("Invaid file type"); + WOLFSSL_MSG("Invalid file type"); } wolfSSL_X509_CRL_free(crl); @@ -26379,7 +26408,8 @@ int wolfSSL_X509_VERIFY_PARAM_clear_flags(WOLFSSL_X509_VERIFY_PARAM *param, } -/* +/* inherits properties of param "to" to param "from" +* * WOLFSSL_VPARAM_DEFAULT any values in "src" is copied * if "src" value is new for "to". * WOLFSSL_VPARAM_OVERWRITE all values of "form" are copied to "to" @@ -26387,7 +26417,7 @@ int wolfSSL_X509_VERIFY_PARAM_clear_flags(WOLFSSL_X509_VERIFY_PARAM *param, * WOLFSSL_VPARAM_LOCKED don't copy any values * WOLFSSL_VPARAM_ONCE the current inherit_flags is zerroed */ -static int woflSSL_X509_VERIFY_PARAM_inherit(WOLFSSL_X509_VERIFY_PARAM *to, +static int wolfSSL_X509_VERIFY_PARAM_inherit(WOLFSSL_X509_VERIFY_PARAM *to, const WOLFSSL_X509_VERIFY_PARAM *from) { int ret = WOLFSSL_FAILURE; @@ -26530,11 +26560,11 @@ int wolfSSL_X509_VERIFY_PARAM_set1(WOLFSSL_X509_VERIFY_PARAM *to, _inherit_flags = to->inherit_flags; /* Ored DEFAULT inherit flag proerty to copy "from" contents to "to" - * contends + * contents */ to->inherit_flags |= WOLFSSL_VPARAM_DEFAULT; - ret = woflSSL_X509_VERIFY_PARAM_inherit(to, from); + ret = wolfSSL_X509_VERIFY_PARAM_inherit(to, from); /* restore inherit flag */ to->inherit_flags = _inherit_flags; diff --git a/tests/api.c b/tests/api.c index 2579fe06c0..1aaa4911ec 100644 --- a/tests/api.c +++ b/tests/api.c @@ -33070,6 +33070,14 @@ static void test_wolfSSL_MD5_Transform(void) XMEMSET(&md5, 0, sizeof(md5)); XMEMSET(&local, 0, sizeof(local)); + /* sanity check */ + AssertIntEQ(wolfSSL_MD5_Transform(NULL, NULL), 0); + AssertIntEQ(wolfSSL_MD5_Transform(NULL, (const byte*)&input1), 0); + AssertIntEQ(wolfSSL_MD5_Transform(&md5, NULL), 0); + AssertIntEQ(wc_Md5Transform(NULL, NULL), BAD_FUNC_ARG); + AssertIntEQ(wc_Md5Transform(NULL, (const byte*)&input1), BAD_FUNC_ARG); + AssertIntEQ(wc_Md5Transform((wc_Md5*)&md5, NULL), BAD_FUNC_ARG); + /* Init MD5 CTX */ AssertIntEQ(wolfSSL_MD5_Init(&md5), 1); /* Do Transform*/ @@ -33106,7 +33114,7 @@ static void test_wolfSSL_SHA224(void) size_t inLen; byte hash[WC_SHA224_DIGEST_SIZE]; - printf(testingFmt, "wolfSSL_SHA224)"); + printf(testingFmt, "wolfSSL_SHA224()"); inLen = XSTRLEN((char*)input); XMEMSET(hash, 0, WC_SHA224_DIGEST_SIZE); @@ -33139,6 +33147,14 @@ static void test_wolfSSL_SHA_Transform(void) XMEMSET(&sha, 0, sizeof(sha)); XMEMSET(&local, 0, sizeof(local)); + /* sanity check */ + AssertIntEQ(wolfSSL_SHA_Transform(NULL, NULL), 0); + AssertIntEQ(wolfSSL_SHA_Transform(NULL, (const byte*)&input1), 0); + AssertIntEQ(wolfSSL_SHA_Transform(&sha, NULL), 0); + AssertIntEQ(wc_ShaTransform(NULL, NULL), BAD_FUNC_ARG); + AssertIntEQ(wc_ShaTransform(NULL, (const byte*)&input1), BAD_FUNC_ARG); + AssertIntEQ(wc_ShaTransform((wc_Sha*)&sha, NULL), BAD_FUNC_ARG); + /* Init SHA CTX */ AssertIntEQ(wolfSSL_SHA_Init(&sha), 1); /* Do Transform*/ @@ -33185,6 +33201,14 @@ static void test_wolfSSL_SHA256_Transform(void) XMEMSET(&sha256, 0, sizeof(sha256)); XMEMSET(&local, 0, sizeof(local)); + /* sanity check */ + AssertIntEQ(wolfSSL_SHA256_Transform(NULL, NULL), 0); + AssertIntEQ(wolfSSL_SHA256_Transform(NULL, (const byte*)&input1), 0); + AssertIntEQ(wolfSSL_SHA256_Transform(&sha256, NULL), 0); + AssertIntEQ(wc_Sha256Transform(NULL, NULL), BAD_FUNC_ARG); + AssertIntEQ(wc_Sha256Transform(NULL, (const byte*)&input1), BAD_FUNC_ARG); + AssertIntEQ(wc_Sha256Transform((wc_Sha256*)&sha256, NULL), BAD_FUNC_ARG); + /* Init SHA256 CTX */ AssertIntEQ(wolfSSL_SHA256_Init(&sha256), 1); /* Do Transform*/ @@ -33259,6 +33283,14 @@ static void test_wolfSSL_SHA512_Transform(void) XMEMSET(&sha512, 0, sizeof(sha512)); XMEMSET(&local, 0, sizeof(local)); + /* sanity check */ + AssertIntEQ(wolfSSL_SHA512_Transform(NULL, NULL), 0); + AssertIntEQ(wolfSSL_SHA512_Transform(NULL, (const byte*)&input1), 0); + AssertIntEQ(wolfSSL_SHA512_Transform(&sha512, NULL), 0); + AssertIntEQ(wc_Sha512Transform(NULL, NULL), BAD_FUNC_ARG); + AssertIntEQ(wc_Sha512Transform(NULL, (const byte*)&input1), BAD_FUNC_ARG); + AssertIntEQ(wc_Sha512Transform((wc_Sha512*)&sha512, NULL), BAD_FUNC_ARG); + /* Init SHA512 CTX */ AssertIntEQ(wolfSSL_SHA512_Init(&sha512), 1); diff --git a/wolfcrypt/src/md5.c b/wolfcrypt/src/md5.c index d4c92ad0bf..e4ffc2f09a 100644 --- a/wolfcrypt/src/md5.c +++ b/wolfcrypt/src/md5.c @@ -551,8 +551,16 @@ int wc_Md5Copy(wc_Md5* src, wc_Md5* dst) return ret; } #ifdef OPENSSL_EXTRA +/* Apply MD5 transformation to the data */ +/* @param md5 a pointer to wc_MD5 structure */ +/* @param data data to be applied MD5 transformation */ +/* @return 0 on successful, otherwise non-zero on failure */ int wc_Md5Transform(wc_Md5* md5, const byte* data) { + /* sanity check */ + if (md5 == NULL || data == NULL) { + return BAD_FUNC_ARG; + } return Transform(md5, data); } #endif diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index 35c1589c6c..0d16521cd1 100644 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -774,8 +774,16 @@ int wc_ShaFinal(wc_Sha* sha, byte* hash) } #if defined(OPENSSL_EXTRA) +/* Apply SHA1 transformation to the data */ +/* @param sha a pointer to wc_Sha structure */ +/* @param data data to be applied SHA1 transformation */ +/* @return 0 on successful, otherwise non-zero on failure */ int wc_ShaTransform(wc_Sha* sha, const unsigned char* data) { + /* sanity check */ + if (sha == NULL || data == NULL) { + return BAD_FUNC_ARG; + } return (Transform(sha, data)); } #endif diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index eb26ad6d6c..249bc5d6d0 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -1296,8 +1296,15 @@ static int InitSha256(wc_Sha256* sha256) } #if defined(OPENSSL_EXTRA) +/* Apply SHA256 transformation to the data */ +/* @param sha a pointer to wc_Sha256 structure */ +/* @param data data to be applied SHA256 transformation */ +/* @return 0 on successful, otherwise non-zero on failure */ int wc_Sha256Transform(wc_Sha256* sha, const unsigned char* data) { + if (sha == NULL || data == NULL) { + return BAD_FUNC_ARG; + } return (Transform_Sha256(sha, data)); } #endif diff --git a/wolfcrypt/src/sha512.c b/wolfcrypt/src/sha512.c index 0353cfc645..bc576da214 100644 --- a/wolfcrypt/src/sha512.c +++ b/wolfcrypt/src/sha512.c @@ -917,6 +917,10 @@ void wc_Sha512Free(wc_Sha512* sha512) #endif /* WOLFSSL_ASYNC_CRYPT */ } #if defined(OPENSSL_EXTRA) +/* Apply SHA512 transformation to the data */ +/* @param sha a pointer to wc_Sha512 structure */ +/* @param data data to be applied SHA512 transformation */ +/* @return 0 on successful, otherwise non-zero on failure */ int wc_Sha512Transform(wc_Sha512* sha, const unsigned char* data) { int ret ; @@ -930,7 +934,14 @@ int wc_Sha512Transform(wc_Sha512* sha, const unsigned char* data) #else word64 buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64)]; #endif - + + /* sanity check */ + if (sha == NULL || data == NULL) { + #if defined(WOLFSSL_SMALL_STACK) + XFREE(buffer, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + return BAD_FUNC_ARG; + } #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) Sha512_SetTransform(); #endif