Skip to content

Commit 1db3dbc

Browse files
committed
Improvement to allow building OPENSSL_EXTRA without KEEP_PEER_CERT. Workaround to avoid large WOLFSSL structure size with compatibility layer enabled (the struct WOLFSSL_X509 is over 5KB). Note: May investigate way to place into heap instead. Fix issues building compatibility layer without MD5.
1 parent 4421f8b commit 1db3dbc

7 files changed

Lines changed: 46 additions & 25 deletions

File tree

.wolfssl_known_macro_extras

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ NO_GETENV
368368
NO_HANDSHAKE_DONE_CB
369369
NO_IMX6_CAAM_AES
370370
NO_IMX6_CAAM_HASH
371+
NO_KEEP_PEER_CERT
371372
NO_OLD_NAMES
372373
NO_OLD_POLY1305
373374
NO_OLD_TIMEVAL_NAME

examples/client/client.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1718,7 +1718,8 @@ static const char* client_usage_msg[][78] = {
17181718

17191719
static void showPeerPEM(WOLFSSL* ssl)
17201720
{
1721-
#if defined(OPENSSL_ALL) && !defined(NO_BIO) && defined(WOLFSSL_CERT_GEN)
1721+
#if defined(OPENSSL_EXTRA) && defined(KEEP_PEER_CERT) && !defined(NO_BIO) && \
1722+
defined(WOLFSSL_CERT_GEN)
17221723
WOLFSSL_X509* peer = wolfSSL_get_peer_certificate(ssl);
17231724
if (peer) {
17241725
WOLFSSL_BIO* bioOut = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
@@ -1742,7 +1743,7 @@ static void showPeerPEM(WOLFSSL* ssl)
17421743
wolfSSL_BIO_free(bioOut);
17431744
}
17441745
wolfSSL_FreeX509(peer);
1745-
#endif /* OPENSSL_ALL && WOLFSSL_CERT_GEN && !NO_BIO */
1746+
#endif
17461747
(void)ssl;
17471748
}
17481749

src/pk.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -360,11 +360,13 @@ static int der_write_to_file_as_pem(const unsigned char* der, int derSz,
360360
* @param [in] passedSz Size of password in bytes.
361361
* @param [out] cipherInfo PEM cipher information lines.
362362
* @param [in] maxDerSz Maximum size of DER buffer.
363+
* @param [in] hashType Hash algorithm
363364
* @return 1 on success.
364365
* @return 0 on error.
365366
*/
366367
int EncryptDerKey(byte *der, int *derSz, const WOLFSSL_EVP_CIPHER* cipher,
367-
unsigned char* passwd, int passwdSz, byte **cipherInfo, int maxDerSz)
368+
unsigned char* passwd, int passwdSz, byte **cipherInfo, int maxDerSz,
369+
int hashType)
368370
{
369371
int ret = 0;
370372
int paddingSz = 0;
@@ -433,7 +435,7 @@ int EncryptDerKey(byte *der, int *derSz, const WOLFSSL_EVP_CIPHER* cipher,
433435

434436
/* Encrypt DER buffer. */
435437
ret = wc_BufferKeyEncrypt(info, der, (word32)*derSz, passwd, passwdSz,
436-
WC_MD5);
438+
hashType);
437439
if (ret != 0) {
438440
WOLFSSL_MSG("encrypt key failed");
439441
}
@@ -504,6 +506,14 @@ static int der_to_enc_pem_alloc(unsigned char* der, int derSz,
504506
byte* tmp = NULL;
505507
byte* cipherInfo = NULL;
506508
int pemSz = 0;
509+
int hashType = WC_HASH_TYPE_NONE;
510+
#if !defined(NO_SHA256)
511+
hashType = WC_SHA256;
512+
#elif !defined(NO_SHA)
513+
hashType = WC_SHA;
514+
#elif !defined(NO_MD5)
515+
hashType = WC_MD5;
516+
#endif
507517

508518
/* Macro doesn't always use it. */
509519
(void)heap;
@@ -536,7 +546,7 @@ static int der_to_enc_pem_alloc(unsigned char* der, int derSz,
536546

537547
/* Encrypt DER inline. */
538548
ret = EncryptDerKey(der, &derSz, cipher, passwd, passwdSz,
539-
&cipherInfo, derSz + blockSz);
549+
&cipherInfo, derSz + blockSz, hashType);
540550
if (ret != 1) {
541551
WOLFSSL_ERROR_MSG("EncryptDerKey failed");
542552
}
@@ -5978,7 +5988,8 @@ int wolfSSL_PEM_write_mem_DSAPrivateKey(WOLFSSL_DSA* dsa,
59785988
unsigned char* passwd, int passwdSz,
59795989
unsigned char **pem, int *pLen)
59805990
{
5981-
#if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
5991+
#if (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)) && \
5992+
!defined(NO_MD5)
59825993
byte *derBuf, *tmp, *cipherInfo = NULL;
59835994
int der_max_len = 0, derSz = 0;
59845995
const int type = DSA_PRIVATEKEY_TYPE;
@@ -6024,8 +6035,8 @@ int wolfSSL_PEM_write_mem_DSAPrivateKey(WOLFSSL_DSA* dsa,
60246035
if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
60256036
int ret;
60266037

6027-
ret = EncryptDerKey(derBuf, &derSz, cipher,
6028-
passwd, passwdSz, &cipherInfo, der_max_len);
6038+
ret = EncryptDerKey(derBuf, &derSz, cipher, passwd, passwdSz,
6039+
&cipherInfo, der_max_len, WC_MD5);
60296040
if (ret != 1) {
60306041
WOLFSSL_MSG("EncryptDerKey failed");
60316042
XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
@@ -6086,7 +6097,7 @@ int wolfSSL_PEM_write_mem_DSAPrivateKey(WOLFSSL_DSA* dsa,
60866097
(void)pem;
60876098
(void)pLen;
60886099
return 0;
6089-
#endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
6100+
#endif /* (WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM) && !NO_MD5 */
60906101
}
60916102

60926103
#ifndef NO_FILESYSTEM

src/ssl.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11447,8 +11447,10 @@ const char *wolfSSL_get0_peername(WOLFSSL *ssl) {
1144711447
return (const char *)ssl->buffers.domainName.buffer;
1144811448
else if (ssl->session && ssl->session->peer)
1144911449
return ssl->session->peer->subjectCN;
11450+
#ifdef KEEP_PEER_CERT
1145011451
else if (ssl->peerCert.subjectCN[0])
1145111452
return ssl->peerCert.subjectCN;
11453+
#endif
1145211454
else {
1145311455
ssl->error = NO_PEER_CERT;
1145411456
return NULL;
@@ -14634,7 +14636,7 @@ WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl)
1463414636
return sk;
1463514637
}
1463614638

14637-
14639+
#ifdef KEEP_PEER_CERT
1463814640
/**
1463914641
* Implemented in a similar way that ngx_ssl_ocsp_validate does it when
1464014642
* SSL_get0_verified_chain is not available.
@@ -14695,6 +14697,7 @@ WOLF_STACK_OF(WOLFSSL_X509) *wolfSSL_get0_verified_chain(const WOLFSSL *ssl)
1469514697
wolfSSL_X509_STORE_CTX_free(storeCtx);
1469614698
return chain;
1469714699
}
14700+
#endif /* KEEP_PEER_CERT */
1469814701
#endif /* SESSION_CERTS && OPENSSL_EXTRA */
1469914702

1470014703
#ifndef NO_CERTS
@@ -18405,9 +18408,8 @@ int wolfSSL_sk_SSL_COMP_num(WOLF_STACK_OF(WOLFSSL_COMP)* sk)
1840518408

1840618409
#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
1840718410

18408-
#ifdef OPENSSL_EXTRA
18409-
18410-
#if defined(HAVE_EX_DATA) && !defined(NO_FILESYSTEM)
18411+
#if defined(OPENSSL_EXTRA) && defined(KEEP_PEER_CERT) && \
18412+
defined(HAVE_EX_DATA) && !defined(NO_FILESYSTEM)
1841118413
int wolfSSL_cmp_peer_cert_to_file(WOLFSSL* ssl, const char *fname)
1841218414
{
1841318415
int ret = WC_NO_ERR_TRACE(WOLFSSL_FATAL_ERROR);
@@ -18478,7 +18480,6 @@ int wolfSSL_cmp_peer_cert_to_file(WOLFSSL* ssl, const char *fname)
1847818480
return ret;
1847918481
}
1848018482
#endif
18481-
#endif /* OPENSSL_EXTRA */
1848218483

1848318484
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
1848418485
const WOLFSSL_ObjectInfo wolfssl_object_info[] = {

tests/api.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10267,9 +10267,11 @@ static void test_wolfSSL_CTX_add_session_on_result(WOLFSSL* ssl)
1026710267
* for all connections. TLS 1.3 only has tickets so if we don't
1026810268
* include the session id in the ticket then the certificates
1026910269
* will not be available on resumption. */
10270+
#ifdef KEEP_PEER_CERT
1027010271
WOLFSSL_X509* peer = wolfSSL_get_peer_certificate(ssl);
1027110272
AssertNotNull(peer);
1027210273
wolfSSL_X509_free(peer);
10274+
#endif
1027310275
AssertNotNull(wolfSSL_SESSION_get_peer_chain(*sess));
1027410276
#ifdef OPENSSL_EXTRA
1027510277
AssertNotNull(SSL_SESSION_get0_peer(*sess));
@@ -10668,9 +10670,11 @@ static int twcase_server_sess_ctx_pre_shutdown(WOLFSSL* ssl)
1066810670
* for all connections. TLS 1.3 only has tickets so if we don't
1066910671
* include the session id in the ticket then the certificates
1067010672
* will not be available on resumption. */
10673+
#ifdef KEEP_PEER_CERT
1067110674
WOLFSSL_X509* peer = NULL;
1067210675
ExpectNotNull(peer = wolfSSL_get_peer_certificate(ssl));
1067310676
wolfSSL_X509_free(peer);
10677+
#endif
1067410678
ExpectNotNull(wolfSSL_SESSION_get_peer_chain(*sess));
1067510679
}
1067610680
#endif
@@ -10697,10 +10701,11 @@ static int twcase_client_sess_ctx_pre_shutdown(WOLFSSL* ssl)
1069710701
wolfSSL_session_reused(ssl))
1069810702
#endif
1069910703
{
10700-
10704+
#ifdef KEEP_PEER_CERT
1070110705
WOLFSSL_X509* peer = wolfSSL_get_peer_certificate(ssl);
1070210706
ExpectNotNull(peer);
1070310707
wolfSSL_X509_free(peer);
10708+
#endif
1070410709
ExpectNotNull(wolfSSL_SESSION_get_peer_chain(*sess));
1070510710
#ifdef OPENSSL_EXTRA
1070610711
ExpectNotNull(wolfSSL_SESSION_get0_peer(*sess));
@@ -30247,16 +30252,16 @@ static int msgSrvCb(SSL_CTX *ctx, SSL *ssl)
3024730252
#endif
3024830253

3024930254
#if defined(OPENSSL_ALL) && defined(SESSION_CERTS) && !defined(NO_BIO)
30255+
#ifdef KEEP_PEER_CERT
3025030256
{
3025130257
WOLFSSL_X509* peer = NULL;
30252-
3025330258
ExpectNotNull(peer= wolfSSL_get_peer_certificate(ssl));
3025430259
ExpectNotNull(bio = BIO_new_fp(stderr, BIO_NOCLOSE));
30255-
3025630260
fprintf(stderr, "Peer Certificate = :\n");
30257-
X509_print(bio,peer);
30261+
X509_print(bio, peer);
3025830262
X509_free(peer);
3025930263
}
30264+
#endif
3026030265

3026130266
ExpectNotNull(sk = SSL_get_peer_cert_chain(ssl));
3026230267
if (sk == NULL) {
@@ -53654,8 +53659,8 @@ static int test_wolfSSL_PEM_write_RSAPrivateKey(void)
5365453659
{
5365553660
EXPECT_DECLS;
5365653661
#if !defined(NO_RSA) && defined(OPENSSL_EXTRA) && defined(WOLFSSL_KEY_GEN) && \
53657-
(defined(WOLFSSL_PEM_TO_DER) || \
53658-
defined(WOLFSSL_DER_TO_PEM)) && !defined(NO_FILESYSTEM)
53662+
(defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)) && \
53663+
!defined(NO_FILESYSTEM)
5365953664
RSA* rsa = NULL;
5366053665
#ifdef USE_CERT_BUFFERS_1024
5366153666
const unsigned char* privDer = client_key_der_1024;
@@ -53685,12 +53690,13 @@ static int test_wolfSSL_PEM_write_RSAPrivateKey(void)
5368553690

5368653691
ExpectIntEQ(wolfSSL_PEM_write_RSAPrivateKey(stderr, rsa, NULL, NULL, 0,
5368753692
NULL, NULL), 1);
53688-
#ifndef NO_AES
53693+
#if !defined(NO_AES) && defined(HAVE_AES_CBC)
5368953694
ExpectIntEQ(wolfSSL_PEM_write_RSAPrivateKey(stderr, rsa, EVP_aes_128_cbc(),
5369053695
NULL, 0, NULL, NULL), 1);
5369153696
ExpectIntEQ(wolfSSL_PEM_write_RSAPrivateKey(stderr, rsa, EVP_aes_128_cbc(),
5369253697
passwd, sizeof(passwd) - 1, NULL, NULL), 1);
5369353698
#endif
53699+
5369453700
RSA_free(rsa);
5369553701
#endif
5369653702
return EXPECT_RESULT();
@@ -53736,7 +53742,7 @@ static int test_wolfSSL_PEM_write_mem_RSAPrivateKey(void)
5373653742
&plen), 1);
5373753743
XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
5373853744
pem = NULL;
53739-
#ifndef NO_AES
53745+
#if !defined(NO_AES) && defined(HAVE_AES_CBC)
5374053746
ExpectIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, EVP_aes_128_cbc(),
5374153747
NULL, 0, &pem, &plen), 1);
5374253748
XFREE(pem, NULL, DYNAMIC_TYPE_KEY);

wolfssl/internal.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7134,8 +7134,9 @@ WOLFSSL_LOCAL WC_RNG* wolfssl_make_global_rng(void);
71347134

71357135
#if !defined(WOLFCRYPT_ONLY) && defined(OPENSSL_EXTRA)
71367136
#if defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_PEM_TO_DER)
7137-
WOLFSSL_LOCAL int EncryptDerKey(byte *der, int *derSz, const WOLFSSL_EVP_CIPHER* cipher,
7138-
unsigned char* passwd, int passwdSz, byte **cipherInfo, int maxDerSz);
7137+
WOLFSSL_LOCAL int EncryptDerKey(byte *der, int *derSz,
7138+
const WOLFSSL_EVP_CIPHER* cipher, unsigned char* passwd, int passwdSz,
7139+
byte **cipherInfo, int maxDerSz, int hashType);
71397140
#endif
71407141
#endif
71417142

wolfssl/wolfcrypt/settings.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3913,7 +3913,7 @@ extern void uITRON4_free(void *p) ;
39133913
/* Parts of the openssl compatibility layer require peer certs */
39143914
#if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \
39153915
defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
3916-
defined(HAVE_LIGHTY)) && !defined(NO_CERTS)
3916+
defined(HAVE_LIGHTY)) && !defined(NO_CERTS) && !defined(NO_KEEP_PEER_CERT)
39173917
#undef KEEP_PEER_CERT
39183918
#define KEEP_PEER_CERT
39193919
#endif

0 commit comments

Comments
 (0)