Skip to content

Commit 38b52d8

Browse files
committed
nginx 1.28.1
### `wolfssl/internal.h` - **`InternalTicket` struct gains a flexible array member**: A new `peerCert[]` field (with a preceding `peerCertLen[2]`) is added to `InternalTicket`. This allows the peer's DER-encoded certificate to be stored directly inside the session ticket. - **`ExternalTicket` struct becomes variable-length**: The `enc_ticket` field is changed from a fixed-size array to a flexible array member (`byte enc_ticket[]`). The `mac` field is removed from the struct — the MAC is now placed dynamically after the encrypted data in `enc_ticket`. ### `src/internal.c` - The `GetRecordHeader` function now only adds `MAX_COMP_EXTRA` to the maximum allowed record size when `ssl->options.usingCompression` is true, tightening the length validation. The max fragment length extension check is now much stricter. - **Peer certificate is serialized into the ticket**: During ticket creation, the code attempts to find the peer certificate from `ssl->peerCert` or from `ssl->session->chain` (fallback). If found and within `MAX_TICKET_PEER_CERT_SZ`, it's copied into `it->peerCert`. DTLS is explicitly excluded (peer cert length set to 0) to keep ticket size small for MTU constraints. If `HAVE_MAX_FRAGMENT` is defined and max fragment is not `MAX_RECORD_SIZE` for TLS 1.3, the cert is also skipped since `SendTls13NewSessionTicket` doesn't support fragmentation yet. - **Peer certificate restoration from ticket**: On successful ticket decryption, if the ticket contains a peer certificate (`peerCertLen > 0`), it is decoded back into `ssl->peerCert` via `ParseCertRelative`/`CopyDecodedToX509`, and also added to `ssl->session->chain` via `AddSessionCertToChain`. - The `CLEAR_ASN_NO_PEM_HEADER_ERROR` macro was rewritten to loop and remove all consecutive PEM no-start-line errors (not just the last one), wrapped in a `do { ... } while(0)` for safety. - The `SendTicket` function is simplified to use `SendHandshakeMsg` to support fragmenting the larger ticket. --- ### `src/x509.c` - `loadX509orX509REQFromPemBio` now accepts `TRUSTED_CERT_TYPE` in addition to `CERT_TYPE` and `CERTREQ_TYPE`. - **Streaming BIO support**: When `wolfSSL_BIO_get_len()` returns ≤ 0 (e.g., pipes/FIFOs), the function no longer returns an error. Instead, it sets an initial buffer of `MAX_X509_SIZE` and dynamically grows (doubling) up to `MAX_BIO_READ_BUFFER` (`MAX_X509_SIZE * 16`) as data is read byte-by-byte. - **Alternate footer detection**: For `TRUSTED_CERT_TYPE`, the PEM reader also checks for the regular `CERT_TYPE` footer (`-----END CERTIFICATE-----`) in addition to the trusted cert footer (`-----END TRUSTED CERTIFICATE-----`), so it can parse either format. - Removed two lines that set `cert->srcIdx` to `SIGALGO_SEQ` offset. This makes `cert->srcIdx` reflect the end of parsed certificate data. This is used by `loadX509orX509REQFromBuffer` to detect where auxiliary trust data begins in trusted certificates. --- ### `src/ssl_sk.c` - Added a `STACK_TYPE_X509_CRL` case to `wolfssl_sk_dup_data` that calls `wolfSSL_X509_CRL_dup` for deep-copying CRL stack elements. Previously, `STACK_TYPE_X509_CRL` fell through to the unsupported default case. --- ### `wolfssl/openssl/ssl.h` - `sk_X509_dup` now maps to `wolfSSL_shallow_sk_dup` (was `wolfSSL_sk_dup`/deep copy). This matches OpenSSL's behavior where `sk_X509_dup` does a shallow copy. - `sk_SSL_CIPHER_dup` similarly changed to `wolfSSL_shallow_sk_dup`. --- ### `src/ssl_api_cert.c` - When `ssl->ourCert` is `NULL` and the SSL owns its cert, the function now checks if `ssl->ctx->ourCert` points to the same certificate (by comparing DER buffers). If so, it returns the ctx's `X509` pointer directly. This maintains pointer compatibility for applications (like nginx OCSP stapling) that use the `X509*` from `SSL_CTX_use_certificate` as a lookup key. ### `src/bio.c` - When `wolfssl_file_len` returns `WOLFSSL_BAD_FILETYPE` (now returned for pipes/FIFOs), `wolfSSL_BIO_get_len` treats it as length 0 instead of propagating the error. --- ### `tests/test-maxfrag.conf` and `tests/test-maxfrag-dtls.conf` - Removed `DHE-RSA-AES256-GCM-SHA384` test entries because the ClientKeyExchange doesn't fit in the selected max fragment length.
1 parent 47033c4 commit 38b52d8

20 files changed

Lines changed: 670 additions & 284 deletions

File tree

.github/workflows/nginx.yml

Lines changed: 54 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ concurrency:
1212
cancel-in-progress: true
1313
# END OF COMMON SECTION
1414

15+
# clang has better sanitizer support
16+
env:
17+
CC: clang
18+
1519
jobs:
1620
build_wolfssl:
1721
name: Build wolfSSL
@@ -31,7 +35,8 @@ jobs:
3135
uses: wolfSSL/actions-build-autotools-project@v1
3236
with:
3337
path: wolfssl
34-
configure: --enable-nginx ${{ env.wolf_debug_flags }}
38+
configure: >-
39+
--enable-nginx --enable-curve25519 --enable-ed25519 ${{ env.wolf_debug_flags }}
3540
install: true
3641

3742
- name: tar build-dir
@@ -50,6 +55,41 @@ jobs:
5055
matrix:
5156
include:
5257
# in general we want to pass all tests that match *ssl*
58+
- ref: 1.28.1
59+
test-ref: 0fccfcef1278263416043e0bbb3e0116b84026e4
60+
# Following tests pass with sanitizer on
61+
sanitize-ok: >-
62+
h2_ssl_proxy_cache.t h2_ssl.t h2_ssl_variables.t
63+
h2_ssl_verify_client.t mail_imap_ssl.t mail_ssl_session_reuse.t
64+
mail_ssl.t proxy_ssl_certificate_cache.t
65+
proxy_ssl_certificate_empty.t proxy_ssl_certificate.t
66+
proxy_ssl_certificate_vars.t proxy_ssl_name.t ssl_cache_reload.t
67+
ssl_certificate_aux.t ssl_certificate_cache.t
68+
ssl_certificate_chain.t ssl_certificates.t ssl_certificate.t
69+
ssl_client_escaped_cert.t ssl_crl.t ssl_curve.t ssl_ocsp.t
70+
ssl_password_file.t ssl_proxy_upgrade.t ssl_reject_handshake.t
71+
ssl_session_reuse.t ssl_session_ticket_key.t ssl_sni_protocols.t
72+
ssl_sni_reneg.t ssl_sni_sessions.t ssl_sni.t ssl_stapling.t ssl.t
73+
ssl_verify_client.t ssl_verify_client_trusted.t ssl_verify_depth.t
74+
stream_proxy_ssl_certificate_cache.t stream_proxy_ssl_certificate.t
75+
stream_proxy_ssl_certificate_vars.t
76+
stream_proxy_ssl_name_complex.t stream_proxy_ssl_name.t
77+
stream_ssl_alpn.t stream_ssl_certificate_cache.t
78+
stream_ssl_certificate.t stream_ssl_ocsp.t stream_ssl_preread_alpn.t
79+
stream_ssl_preread_protocol.t stream_ssl_preread.t
80+
stream_ssl_reject_handshake.t stream_ssl_session_reuse.t
81+
stream_ssl_sni_protocols.t stream_ssl_stapling.t stream_ssl.t
82+
stream_ssl_variables.t stream_ssl_verify_client.t
83+
stream_upstream_zone_ssl.t upstream_zone_ssl.t
84+
uwsgi_ssl_certificate.t uwsgi_ssl_certificate_vars.t
85+
# Following tests do not pass with sanitizer on (with OpenSSL too)
86+
sanitize-not-ok: >-
87+
grpc_ssl.t h2_proxy_request_buffering_ssl.t h2_proxy_ssl.t
88+
proxy_request_buffering_ssl.t proxy_ssl_conf_command.t
89+
proxy_ssl_keepalive.t proxy_ssl.t proxy_ssl_verify.t ssl_cache.t
90+
stream_proxy_protocol_ssl.t stream_proxy_ssl_conf_command.t
91+
stream_proxy_ssl.t stream_proxy_ssl_verify.t
92+
5393
- ref: 1.25.0
5494
test-ref: 5b2894ea1afd01a26c589ce11f310df118e42592
5595
# Following tests pass with sanitizer on
@@ -120,30 +160,19 @@ jobs:
120160
- name: untar build-dir
121161
run: tar -xf build-dir.tgz
122162

123-
- name: Install dependencies
124-
run: |
125-
sudo cpan -iT Proc::Find
163+
- name: Openssl version
164+
run: openssl version -a
126165

127-
# Locking in the version of SSLeay used with testing
128-
- name: Download and install Net::SSLeay 1.94 manually
129-
run: |
130-
curl -LO https://www.cpan.org/modules/by-module/Net/CHRISN/Net-SSLeay-1.94.tar.gz
131-
tar -xzf Net-SSLeay-1.94.tar.gz
132-
cd Net-SSLeay-1.94
133-
perl Makefile.PL
134-
make
135-
sudo make install
166+
- name: Setup Perl environment
167+
uses: shogo82148/actions-setup-perl@v1
168+
with:
169+
perl-version: '5.38.2'
136170

137171
# SSL version 2.091 changes '' return to undef causing test case to fail.
138172
# Locking in the test version to use as 2.090
139-
- name: Download and install IO::Socket::SSL 2.090 manually
173+
- name: Install dependencies
140174
run: |
141-
curl -LO https://www.cpan.org/modules/by-module/IO/IO-Socket-SSL-2.090.tar.gz
142-
tar -xzf IO-Socket-SSL-2.090.tar.gz
143-
cd IO-Socket-SSL-2.090
144-
perl Makefile.PL
145-
make
146-
sudo make install
175+
cpanm --notest Proc::Find Net::SSLeay@1.94 IO::Socket::SSL@2.090
147176
148177
- name: Checkout wolfssl-nginx
149178
uses: actions/checkout@v4
@@ -211,37 +240,31 @@ jobs:
211240
run: |
212241
echo "nginx_c_flags=-O0" >> $GITHUB_ENV
213242
214-
- name: workaround high-entropy ASLR
215-
# not needed after either an update to llvm or runner is done
216-
run: sudo sysctl vm.mmap_rnd_bits=28
217-
218243
- name: Build nginx with sanitizer
219244
working-directory: nginx
220245
run: |
221246
./auto/configure --with-wolfssl=$GITHUB_WORKSPACE/build-dir --with-http_ssl_module \
222247
--with-stream --with-stream_ssl_module --with-stream_ssl_preread_module \
223248
--with-http_v2_module --with-mail --with-mail_ssl_module \
224-
--with-cc-opt='-fsanitize=address -DNGX_DEBUG_PALLOC=1 -g3 ${{ env.nginx_c_flags }}' \
249+
--with-cc-opt='-fsanitize=address -DNGX_DEBUG_PALLOC=1 -g3 \
250+
${{ env.nginx_c_flags }}' \
225251
--with-ld-opt='-fsanitize=address ${{ env.nginx_c_flags }}'
226252
make -j
227253
228254
- name: Confirm nginx built with wolfSSL
229255
working-directory: nginx
230256
run: ldd objs/nginx | grep wolfssl
231257

232-
- if: ${{ runner.debug }}
233-
name: Run nginx-tests with sanitizer (debug)
258+
- name: Create LSAN suppression file
234259
working-directory: nginx-tests
235260
run: |
236-
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GITHUB_WORKSPACE/build-dir/lib \
237-
TMPDIR=$GITHUB_WORKSPACE TEST_NGINX_VERBOSE=y TEST_NGINX_CATLOG=y \
238-
TEST_NGINX_BINARY=../nginx/objs/nginx prove -v ${{ matrix.sanitize-ok }}
261+
echo "leak:ngx_worker_process_init" > lsan.supp
239262
240263
- if: ${{ !runner.debug }}
241264
name: Run nginx-tests with sanitizer
242265
working-directory: nginx-tests
243266
run: |
244267
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GITHUB_WORKSPACE/build-dir/lib \
268+
LSAN_OPTIONS=suppressions=$GITHUB_WORKSPACE/nginx-tests/lsan.supp \
245269
TMPDIR=$GITHUB_WORKSPACE TEST_NGINX_BINARY=../nginx/objs/nginx \
246270
prove ${{ matrix.sanitize-ok }}
247-

.wolfssl_known_macro_extras

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ ENABLED_BSDKM_REGISTER
220220
ENABLE_SECURE_SOCKETS_LOGS
221221
ESP32
222222
ESP8266
223+
ESPIPE
223224
ESP_ENABLE_WOLFSSH
224225
ESP_IDF_VERSION
225226
ESP_IDF_VERSION_MAJOR
@@ -367,6 +368,7 @@ NO_ASM
367368
NO_ASN_OLD_TYPE_NAMES
368369
NO_CAMELLIA_CBC
369370
NO_CERT
371+
NO_CERT_IN_TICKET
370372
NO_CIPHER_SUITE_ALIASES
371373
NO_CLIENT_CACHE
372374
NO_CLOCK_SPEEDUP

configure.ac

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2743,7 +2743,8 @@ if test "$ENABLED_LIBWEBSOCKETS" = "yes" || test "$ENABLED_OPENVPN" = "yes" || \
27432743
test "$ENABLED_OPENRESTY" = "yes" || test "$ENABLED_RSYSLOG" = "yes" || \
27442744
test "$ENABLED_KRB" = "yes" || test "$ENABLED_CHRONY" = "yes" || \
27452745
test "$ENABLED_FFMPEG" = "yes" || test "$ENABLED_STRONGSWAN" = "yes" || \
2746-
test "$ENABLED_OPENLDAP" = "yes" || test "x$ENABLED_MOSQUITTO" = "xyes" || test "$ENABLED_HITCH" = "yes"
2746+
test "$ENABLED_OPENLDAP" = "yes" || test "x$ENABLED_MOSQUITTO" = "xyes" || \
2747+
test "$ENABLED_HITCH" = "yes" || test "$ENABLED_NGINX" = "yes"
27472748
then
27482749
ENABLED_OPENSSLALL="yes"
27492750
fi

src/bio.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1938,6 +1938,8 @@ int wolfSSL_BIO_get_len(WOLFSSL_BIO *bio)
19381938
len = BAD_FUNC_ARG;
19391939
if (len == 0) {
19401940
len = wolfssl_file_len(file, &memSz);
1941+
if (len == WC_NO_ERR_TRACE(WOLFSSL_BAD_FILETYPE))
1942+
len = 0;
19411943
}
19421944
if (len == 0) {
19431945
len = (int)memSz;

src/crl.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,6 +1369,28 @@ WOLFSSL_X509_CRL* wolfSSL_X509_CRL_dup(const WOLFSSL_X509_CRL* crl)
13691369
return ret;
13701370
}
13711371

1372+
#ifdef OPENSSL_ALL
1373+
int wolfSSL_X509_CRL_up_ref(WOLFSSL_X509_CRL* crl)
1374+
{
1375+
int ret;
1376+
1377+
if (crl == NULL)
1378+
return WOLFSSL_FAILURE;
1379+
1380+
wolfSSL_RefInc(&crl->ref, &ret);
1381+
#ifdef WOLFSSL_REFCNT_ERROR_RETURN
1382+
if (ret != 0) {
1383+
WOLFSSL_MSG("Failed to lock x509 mutex");
1384+
return WOLFSSL_FAILURE;
1385+
}
1386+
#else
1387+
(void)ret;
1388+
#endif
1389+
1390+
return WOLFSSL_SUCCESS;
1391+
}
1392+
#endif
1393+
13721394
/* returns WOLFSSL_SUCCESS on success. Does not take ownership of newcrl */
13731395
int wolfSSL_X509_STORE_add_crl(WOLFSSL_X509_STORE *store, WOLFSSL_X509_CRL *newcrl)
13741396
{

src/dtls.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,8 +403,9 @@ static int TlsTicketIsValid(const WOLFSSL* ssl, WolfSSL_ConstVector exts,
403403
if (!IsAtLeastTLSv1_3(it->pv))
404404
*resume = TRUE;
405405
}
406-
if (it != NULL)
407-
ForceZero(it, sizeof(InternalTicket));
406+
/* `it` points into tempTicket on successful decryption so clearing it will
407+
* also satisfy the WOLFSSL_CHECK_MEM_ZERO check. */
408+
ForceZero(tempTicket, SESSION_TICKET_LEN);
408409
return 0;
409410
}
410411
#endif /* HAVE_SESSION_TICKET */

0 commit comments

Comments
 (0)