diff options
author | Jeremy Harris <jgh146exb@wizmail.org> | 2021-07-18 00:15:01 +0100 |
---|---|---|
committer | Jeremy Harris <jgh146exb@wizmail.org> | 2021-07-18 13:23:11 +0100 |
commit | c4b4086235b1d5e21fcf1ad72a1b05813e15dcbd (patch) | |
tree | b2e3301128b2e35510dfc1b563d9b41581d40439 /test | |
parent | f7ea5ba1049ba2a53b8cb0bf98893bff6c6bc77f (diff) |
TLS: ALPN options
Diffstat (limited to 'test')
-rw-r--r-- | test/confs/1115 | 73 | ||||
l--------- | test/confs/2038 | 1 | ||||
l--------- | test/confs/2138 | 1 | ||||
-rw-r--r-- | test/log/1115 | 45 | ||||
-rw-r--r-- | test/log/2038 | 26 | ||||
-rw-r--r-- | test/log/2138 | 25 | ||||
-rwxr-xr-x | test/runtest | 2 | ||||
-rw-r--r-- | test/scripts/1100-Basic-TLS/1115 | 50 | ||||
-rw-r--r-- | test/scripts/2000-GnuTLS/2038 | 36 | ||||
-rw-r--r-- | test/scripts/2100-OpenSSL/2138 | 35 | ||||
-rw-r--r-- | test/stdout/0572 | 1 |
11 files changed, 295 insertions, 0 deletions
diff --git a/test/confs/1115 b/test/confs/1115 new file mode 100644 index 000000000..c1d571821 --- /dev/null +++ b/test/confs/1115 @@ -0,0 +1,73 @@ +# Exim test configuration 1115 +# ALPN + +SERVER = +CONTROL = + +.include DIR/aux-var/tls_conf_prefix + +primary_hostname = myhost.test.ex + +# ----- Main settings ----- + +domainlist local_domains = test.ex : *.test.ex + +acl_smtp_rcpt = accept + +tls_advertise_hosts = * +tls_certificate = DIR/aux-fixed/cert1 + +.ifdef STRICT +tls_alpn = STRICT +.endif +.ifdef REQUIRE +hosts_require_alpn = * +.endif + + +# ------ ACL ------ + +begin acl + +# ----- Routers ----- + +begin routers + +client: + driver = accept + condition = ${if eq {SERVER}{server} {no}{yes}} + transport = send_to_server + +server: + driver = redirect + data = :blackhole: + + +# ----- Transports ----- + +begin transports + +send_to_server: + driver = smtp + allow_localhost + hosts = HOSTIPV4 + port = PORT_D + tls_verify_certificates = DIR/aux-fixed/cert1 + tls_verify_cert_hostnames = : + + hosts_require_tls = * + hosts_try_fastopen = : + tls_alpn = CONTROL +.ifdef REQUIRE + hosts_require_alpn = * +.endif + +# ----- Retry ----- + + +begin retry + +* * F,5d,10s + + +# End diff --git a/test/confs/2038 b/test/confs/2038 new file mode 120000 index 000000000..03a524df8 --- /dev/null +++ b/test/confs/2038 @@ -0,0 +1 @@ +1115
\ No newline at end of file diff --git a/test/confs/2138 b/test/confs/2138 new file mode 120000 index 000000000..03a524df8 --- /dev/null +++ b/test/confs/2138 @@ -0,0 +1 @@ +1115
\ No newline at end of file diff --git a/test/log/1115 b/test/log/1115 new file mode 100644 index 000000000..af3f1df34 --- /dev/null +++ b/test/log/1115 @@ -0,0 +1,45 @@ +1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmaX-0005vi-00 => a@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=yes C="250 OK id=10HmaY-0005vi-00" +1999-03-02 09:44:33 10HmaX-0005vi-00 Completed +1999-03-02 09:44:33 10HmaZ-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmaZ-0005vi-00 == b@test.ex R=client T=send_to_server defer (-37) H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4]: TLS session: (SSL_connect): error: <<detail omitted>> +1999-03-02 09:44:33 10HmaZ-0005vi-00 removed by CALLER +1999-03-02 09:44:33 10HmaZ-0005vi-00 Completed +1999-03-02 09:44:33 10HmbA-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmbA-0005vi-00 == c@test.ex R=client T=send_to_server defer (-37) H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4]: TLS session: (SSL_connect): error: <<detail omitted>> +1999-03-02 09:44:33 10HmbA-0005vi-00 removed by CALLER +1999-03-02 09:44:33 10HmbA-0005vi-00 Completed +1999-03-02 09:44:33 10HmbB-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmbB-0005vi-00 => d@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=yes C="250 OK id=10HmbC-0005vi-00" +1999-03-02 09:44:33 10HmbB-0005vi-00 Completed +1999-03-02 09:44:33 10HmbD-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmbD-0005vi-00 => e@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=yes C="250 OK id=10HmbE-0005vi-00" +1999-03-02 09:44:33 10HmbD-0005vi-00 Completed +1999-03-02 09:44:33 10HmbF-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmbF-0005vi-00 => f@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=yes C="250 OK id=10HmbG-0005vi-00" +1999-03-02 09:44:33 10HmbF-0005vi-00 Completed +1999-03-02 09:44:33 10HmbH-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmbH-0005vi-00 => g@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=yes C="250 OK id=10HmbI-0005vi-00" +1999-03-02 09:44:33 10HmbH-0005vi-00 Completed + +******** SERVER ******** +1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port PORT_D +1999-03-02 09:44:33 10HmaY-0005vi-00 <= CALLER@myhost.test.ex H=the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] P=esmtps X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=no S=sss id=E10HmaX-0005vi-00@myhost.test.ex +1999-03-02 09:44:33 10HmaY-0005vi-00 => :blackhole: <a@test.ex> R=server +1999-03-02 09:44:33 10HmaY-0005vi-00 Completed +1999-03-02 09:44:33 TLS error on connection from the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] (SSL_accept): error: <<detail omitted>> +1999-03-02 09:44:33 TLS error on connection from the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] (SSL_accept): error: <<detail omitted>> +1999-03-02 09:44:33 10HmbC-0005vi-00 <= CALLER@myhost.test.ex H=the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] P=esmtps X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=no S=sss id=E10HmbB-0005vi-00@myhost.test.ex +1999-03-02 09:44:33 10HmbC-0005vi-00 => :blackhole: <d@test.ex> R=server +1999-03-02 09:44:33 10HmbC-0005vi-00 Completed +1999-03-02 09:44:33 10HmbE-0005vi-00 <= CALLER@myhost.test.ex H=the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] P=esmtps X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=no S=sss id=E10HmbD-0005vi-00@myhost.test.ex +1999-03-02 09:44:33 10HmbE-0005vi-00 => :blackhole: <e@test.ex> R=server +1999-03-02 09:44:33 10HmbE-0005vi-00 Completed +1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port PORT_D +1999-03-02 09:44:33 10HmbG-0005vi-00 <= CALLER@myhost.test.ex H=the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] P=esmtps X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=no S=sss id=E10HmbF-0005vi-00@myhost.test.ex +1999-03-02 09:44:33 10HmbG-0005vi-00 => :blackhole: <f@test.ex> R=server +1999-03-02 09:44:33 10HmbG-0005vi-00 Completed +1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port PORT_D +1999-03-02 09:44:33 10HmbI-0005vi-00 <= CALLER@myhost.test.ex H=the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] P=esmtps X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=no S=sss id=E10HmbH-0005vi-00@myhost.test.ex +1999-03-02 09:44:33 10HmbI-0005vi-00 => :blackhole: <g@test.ex> R=server +1999-03-02 09:44:33 10HmbI-0005vi-00 Completed diff --git a/test/log/2038 b/test/log/2038 new file mode 100644 index 000000000..a93f4d3ed --- /dev/null +++ b/test/log/2038 @@ -0,0 +1,26 @@ +1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmaX-0005vi-00 => client_require@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=yes C="250 OK id=10HmaY-0005vi-00" +1999-03-02 09:44:33 10HmaX-0005vi-00 Completed +1999-03-02 09:44:33 10HmaZ-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmaZ-0005vi-00 == client_require_fail@test.ex R=client T=send_to_server defer (-37) H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4]: TLS session: (handshake): ALPN required but not negotiated +1999-03-02 09:44:33 10HmaZ-0005vi-00 removed by CALLER +1999-03-02 09:44:33 10HmaZ-0005vi-00 Completed +1999-03-02 09:44:33 10HmbA-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmbA-0005vi-00 => server_require_good@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=yes C="250 OK id=10HmbB-0005vi-00" +1999-03-02 09:44:33 10HmbA-0005vi-00 Completed +1999-03-02 09:44:33 10HmbC-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmbC-0005vi-00 H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] TLS error on connection (recv): A TLS fatal alert has been received: No supported application protocol could be negotiated +1999-03-02 09:44:33 10HmbC-0005vi-00 == server_require_bad@test.ex R=client T=send_to_server defer (-37) H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4]: TLS session: error on first read + +******** SERVER ******** +1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port PORT_D +1999-03-02 09:44:33 10HmaY-0005vi-00 <= CALLER@myhost.test.ex H=the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] P=esmtps X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=no S=sss id=E10HmaX-0005vi-00@myhost.test.ex +1999-03-02 09:44:33 10HmaY-0005vi-00 => :blackhole: <client_require@test.ex> R=server +1999-03-02 09:44:33 10HmaY-0005vi-00 Completed +1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port PORT_D +1999-03-02 09:44:33 TLS error on connection from the.local.host.name [ip4.ip4.ip4.ip4] (recv): A TLS fatal alert has been received: No supported application protocol could be negotiated +1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port PORT_D +1999-03-02 09:44:33 10HmbB-0005vi-00 <= CALLER@myhost.test.ex H=the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] P=esmtps X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=no S=sss id=E10HmbA-0005vi-00@myhost.test.ex +1999-03-02 09:44:33 10HmbB-0005vi-00 => :blackhole: <server_require_good@test.ex> R=server +1999-03-02 09:44:33 10HmbB-0005vi-00 Completed +1999-03-02 09:44:33 TLS error on connection from the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] (handshake): ALPN required but not negotiated diff --git a/test/log/2138 b/test/log/2138 new file mode 100644 index 000000000..bbc80a45a --- /dev/null +++ b/test/log/2138 @@ -0,0 +1,25 @@ +1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmaX-0005vi-00 => client_require@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=yes C="250 OK id=10HmaY-0005vi-00" +1999-03-02 09:44:33 10HmaX-0005vi-00 Completed +1999-03-02 09:44:33 10HmaZ-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmaZ-0005vi-00 == client_require_fail@test.ex R=client T=send_to_server defer (-37) H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4]: TLS session: (handshake): ALPN required but not negotiated +1999-03-02 09:44:33 10HmaZ-0005vi-00 removed by CALLER +1999-03-02 09:44:33 10HmaZ-0005vi-00 Completed +1999-03-02 09:44:33 10HmbA-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmbA-0005vi-00 => server_require_good@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=yes C="250 OK id=10HmbB-0005vi-00" +1999-03-02 09:44:33 10HmbA-0005vi-00 Completed +1999-03-02 09:44:33 10HmbC-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss +1999-03-02 09:44:33 10HmbC-0005vi-00 H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4]: Remote host closed connection in response to EHLO myhost.test.ex +1999-03-02 09:44:33 10HmbC-0005vi-00 == server_require_bad@test.ex R=client T=send_to_server defer (-18) H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4]: Remote host closed connection in response to EHLO myhost.test.ex + +******** SERVER ******** +1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port PORT_D +1999-03-02 09:44:33 10HmaY-0005vi-00 <= CALLER@myhost.test.ex H=the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] P=esmtps X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=no S=sss id=E10HmaX-0005vi-00@myhost.test.ex +1999-03-02 09:44:33 10HmaY-0005vi-00 => :blackhole: <client_require@test.ex> R=server +1999-03-02 09:44:33 10HmaY-0005vi-00 Completed +1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port PORT_D +1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port PORT_D +1999-03-02 09:44:33 10HmbB-0005vi-00 <= CALLER@myhost.test.ex H=the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] P=esmtps X=TLS1.x:ke-RSA-AES256-SHAnnn:xxx CV=no S=sss id=E10HmbA-0005vi-00@myhost.test.ex +1999-03-02 09:44:33 10HmbB-0005vi-00 => :blackhole: <server_require_good@test.ex> R=server +1999-03-02 09:44:33 10HmbB-0005vi-00 Completed +1999-03-02 09:44:33 TLS error on connection from the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] (handshake): ALPN required but not negotiated diff --git a/test/runtest b/test/runtest index 670672a70..6f142c540 100755 --- a/test/runtest +++ b/test/runtest @@ -1507,6 +1507,8 @@ RESET_AFTER_EXTRA_LINE_READ: s/session: \K\((SSL_connect|gnutls_handshake)\): timed out/(tls lib connect fn): timed out/; s/TLS error on connection from .*\K\((SSL_accept|gnutls_handshake)\): timed out/(tls lib accept fn): timed out/; s/TLS error on connection from .*\K(SSL_accept: TCP connection closed by peer|\(gnutls_handshake\): The TLS connection was non-properly terminated.)/(tls lib accept fn): TCP connection closed by peer/; + s/TLS session: \K\(gnutls_handshake\): No supported application protocol could be negotiated/(SSL_connect): error: <<detail omitted>>/; + s/\(gnutls_handshake\): No common application protocol could be negotiated./(SSL_accept): error: <<detail omitted>>/; } # ======== mail ======== diff --git a/test/scripts/1100-Basic-TLS/1115 b/test/scripts/1100-Basic-TLS/1115 new file mode 100644 index 000000000..d74caca52 --- /dev/null +++ b/test/scripts/1100-Basic-TLS/1115 @@ -0,0 +1,50 @@ +# TLS: ALPN +gnutls +exim -DSERVER=server -bd -oX PORT_D +**** +# +# Basic: is good ALPN set on tpt acceptable to server +exim -DCONTROL=smtp -odf a@test.ex +Test message. +**** +# +# Bad ALPN rejected +exim -DCONTROL=http -odf b@test.ex +**** +exim -Mrm $msg1 +**** +sudo rm -f DIR/spool/db/retry +# +# Multiple ALPN rejected +exim -DCONTROL=smtp:smtp -odf c@test.ex +**** +exim -Mrm $msg1 +**** +sudo rm -f DIR/spool/db/retry +# +# Empty client option is ok +exim -DCONTROL="" -odf d@test.ex +**** +# Content-free client option is ok +exim -DCONTROL=" " -odf e@test.ex +**** +killdaemon +# +# Server can be told to ignore (bad) ALPN from client +exim -DSERVER=server -DSTRICT="" -bd -oX PORT_D +**** +exim -DCONTROL=http -odf f@test.ex +**** +killdaemon +# +# Server can be told custom names list +exim -DSERVER=server -DSTRICT='${if eq {$sender_host_address}{HOSTIPV4} {smtp:weird} {smtp}}' -bd -oX PORT_D +**** +exim -DCONTROL=weird -odf g@test.ex +**** +killdaemon +# +# +no_msglog_check +no_stdout_check +millisleep 500 diff --git a/test/scripts/2000-GnuTLS/2038 b/test/scripts/2000-GnuTLS/2038 new file mode 100644 index 000000000..227af8475 --- /dev/null +++ b/test/scripts/2000-GnuTLS/2038 @@ -0,0 +1,36 @@ +# TLS: ALPN: mandatory +# Separated from the OpenSSL equivalent as we deliberately send a Fatal Alert, and that gets logged by the receiver +# OpenSSL does not provides the facility. +gnutls +exim -DSERVER=server -bd -oX PORT_D +**** +# Client requires ALPN (success) +exim -DCONTROL=smtp -DREQUIRE=y -odf client_require@test.ex +**** +killdaemon +# +# Server can be told to ignore (bad) ALPN from client +exim -DSERVER=server -DSTRICT="" -bd -oX PORT_D +**** +# Client requires ALPN (fail) +exim -DCONTROL=http -DREQUIRE=y -odf client_require_fail@test.ex +**** +exim -Mrm $msg1 +**** +sudo rm -f DIR/spool/db/retry +killdaemon +# +# +# Server can be told ALPN mandatory +exim -DSERVER=server -DREQUIRE=y -bd -oX PORT_D +**** +# Client supplies ALPN, good +exim -DCONTROL=smtp -odf server_require_good@test.ex +**** +# Client does not supply ALPN, fails +exim -odf server_require_bad@test.ex +**** +killdaemon +# +no_msglog_check +no_stdout_check diff --git a/test/scripts/2100-OpenSSL/2138 b/test/scripts/2100-OpenSSL/2138 new file mode 100644 index 000000000..7dadb3051 --- /dev/null +++ b/test/scripts/2100-OpenSSL/2138 @@ -0,0 +1,35 @@ +# TLS: ALPN: mandatory +# +# Plain server +exim -DSERVER=server -bd -oX PORT_D +**** +# Client requires ALPN (success) +exim -DCONTROL=smtp -DREQUIRE=y -odf client_require@test.ex +**** +killdaemon +# +# Server can be told to ignore (bad) ALPN from client +exim -DSERVER=server -DSTRICT="" -bd -oX PORT_D +**** +# Client requires ALPN (fail) +exim -DCONTROL=http -DREQUIRE=y -odf client_require_fail@test.ex +**** +exim -Mrm $msg1 +**** +sudo rm -f DIR/spool/db/retry +killdaemon +# +# +# Server can be told ALPN mandatory +exim -DSERVER=server -DREQUIRE=y -bd -oX PORT_D +**** +# Client supplies ALPN, good +exim -DCONTROL=smtp -odf server_require_good@test.ex +**** +# Client does not supply ALPN, fails +exim -odf server_require_bad@test.ex +**** +killdaemon +# +no_msglog_check +no_stdout_check diff --git a/test/stdout/0572 b/test/stdout/0572 index fd77c72b7..0ba712dcf 100644 --- a/test/stdout/0572 +++ b/test/stdout/0572 @@ -55,6 +55,7 @@ hosts_max_try = 5 hosts_max_try_hardlimit = 50 no_hosts_override no_hosts_randomize +hosts_require_alpn = hosts_require_auth = hosts_try_auth = hosts_try_chunking = * |