]> git.ipfire.org Git - thirdparty/strongswan.git/log
thirdparty/strongswan.git
17 months agoVersion bump to 5.9.11dr2 5.9.11dr2
Andreas Steffen [Wed, 19 Apr 2023 02:24:18 +0000 (04:24 +0200)] 
Version bump to 5.9.11dr2

17 months agopki: Filter whitespace in base64 encoded EST responses
Harald Gutmann [Fri, 31 Mar 2023 11:38:48 +0000 (13:38 +0200)] 
pki: Filter whitespace in base64 encoded EST responses

As clarified in RFC 8951, section 3.1 [1].

[1] https://www.rfc-editor.org/rfc/rfc8951#name-white-space-processing

Co-authored-by: Tobias Brunner <tobias@strongswan.org>
Closes strongswan/strongswan#1616

17 months agopki: Add support for EST server label
Harald Gutmann [Sat, 18 Mar 2023 22:31:39 +0000 (23:31 +0100)] 
pki: Add support for EST server label

As specified in EST RFC 7030, Section 3.1 [1].

[1] https://www.rfc-editor.org/rfc/rfc7030.html#section-3.1

17 months agoMerge branch 'pkcs7-signatures'
Tobias Brunner [Fri, 31 Mar 2023 07:29:12 +0000 (09:29 +0200)] 
Merge branch 'pkcs7-signatures'

Adds support for CMS-style signatures in PKCS#7 containers, which allows
verifying RSA-PSS and ECDSA signatures.

Ed25519 signatures should be supported when verifying, however, they
currently can't be created.  Ed448 signatures are currently not supported.
That's because RFC 8419 has very strict requirements in regards to the
hash algorithms used for signed attributes.  With Ed25519 only SHA-512 is
allowed (pki currently has an issue with Ed25519 in combination with
SHA-512 due to its associated HASH_IDENTITY) and with Ed448 only SHAKE256
with 512-bit output, which has to be encoded in the algorithmIdentifier
parameters (something we currently don't support at all).

Closes strongswan/strongswan#1615

17 months agopki: Allow specifying signature scheme for PKCS#7 signatures
Tobias Brunner [Thu, 30 Mar 2023 09:19:28 +0000 (11:19 +0200)] 
pki: Allow specifying signature scheme for PKCS#7 signatures

Also changed the error handling a bit so it is more like in the other
pki commands.

17 months agopki: Unify parsing of RSA padding scheme and fix disabling PSS
Tobias Brunner [Thu, 30 Mar 2023 12:23:38 +0000 (14:23 +0200)] 
pki: Unify parsing of RSA padding scheme and fix disabling PSS

If PSS padding is enabled by default, not all commands allowed disabling
it explicitly.

17 months agoopenssl: Add support for CMS-style signatures in PKCS#7 (RSA-PSS, ECDSA)
Tobias Brunner [Fri, 24 Mar 2023 16:17:37 +0000 (17:17 +0100)] 
openssl: Add support for CMS-style signatures in PKCS#7 (RSA-PSS, ECDSA)

17 months agopkcs7: Add support for CMS-style signatures (RSA-PSS, ECDSA)
Tobias Brunner [Fri, 24 Mar 2023 16:04:42 +0000 (17:04 +0100)] 
pkcs7: Add support for CMS-style signatures (RSA-PSS, ECDSA)

For the legacy schemes with rsaEncryption nothing changes, but if an
actual signature scheme is encoded we use that to find the key and
verify the signature.

The descriptions for the PKCS#7 structure are adapted for CMS.

17 months agoasn1: Allow suppressing log messages when parsing algorithm identifiers
Tobias Brunner [Fri, 24 Mar 2023 16:00:10 +0000 (17:00 +0100)] 
asn1: Allow suppressing log messages when parsing algorithm identifiers

17 months agobotan: Pass n and e separately for RSA public keys
Tobias Brunner [Mon, 27 Mar 2023 14:40:31 +0000 (16:40 +0200)] 
botan: Pass n and e separately for RSA public keys

Some encoders, like those provided by the dnskey and sshkey plugins,
require these separately when encoding keys.

Also fixes the type for the ASN.1 encoding (which is a subjectPublicKeyInfo
structure) depending on the key type.  This worked fine for PEM encoding
as the pem plugin doesn't care what the actual type of the key is (which
is encoded in the SPKI structure), but other plugins do (e.g. the sshkey
plugin).

17 months agoipseckey: Add support for ECDSA and EdDSA public keys
Tobias Brunner [Thu, 23 Mar 2023 12:51:33 +0000 (13:51 +0100)] 
ipseckey: Add support for ECDSA and EdDSA public keys

17 months agoUse wolfSSL 5.6.0 for tests
Tobias Brunner [Mon, 27 Mar 2023 09:51:48 +0000 (11:51 +0200)] 
Use wolfSSL 5.6.0 for tests

The `--enable-heapmath` configure option has been deprecated.  As
already described in eae30af029b1 ("Use wolfSSL 5.4.0 for tests"), the
alternative is to configure `--with-max-rsa-bits=8192` instead in order
to test the modp6144 and modp8192 DH groups.

18 months agoVersion bump to 5.9.11dr1 5.9.11dr1
Andreas Steffen [Tue, 28 Mar 2023 14:27:04 +0000 (16:27 +0200)] 
Version bump to 5.9.11dr1

18 months agorevocation: Suppress some log messages for cached OCSP responses
Tobias Brunner [Mon, 27 Mar 2023 15:32:57 +0000 (17:32 +0200)] 
revocation: Suppress some log messages for cached OCSP responses

We don't have any information on the issuer of cached OCSP responses, in
particular if the OCSP response is issued by a dedicated OCSP signer,
whose certificate might not be contained in the response or even signed
by the same CA but could just be locally installed.  So the only way to
determine if a response applies to the current certificate and its CA
is searching for the response's issuer certificate and verifying that.

However, when using multiple CAs that provide revocation checking via
OCSP, in particular with multi-level CAs (e.g. like the
ikev2-multi-ca/ocsp-signers test scenario), we might have unrelated OCSP
responses in the cache when verifying a particular certificate.  In this
case we don't need any confusing

  ocsp response verification failed, no signer certificate '...' found

error messages because the response was for a different CA.

Similarly, if lots of clients of the same CA connect there could be lots
of OCSP responses in the cache that, while being applicable to the current
CA, don't have any information on the certificate we are currently
checking.  In this case all the

  ocsp response correctly signed by "..."
  ocsp response contains no status on our certificate

messages don't provide any value.

In the mentioned test scenario, we suppress the

  ocsp response verification failed, no signer certificate 'C=CH, O=strongSwan Project, OU=Research OCSP Signing Authority, CN=ocsp.research.strongswan.org' found

message from the cached OCSP response for carol's end-entity certificate
when verifying the "Research" intermediate CA certificate that issued
carol's certificate.

Then the

  ocsp response verification failed, no signer certificate 'C=CH, O=strongSwan Project, OU=Research OCSP Signing Authority, CN=ocsp.research.strongswan.org' found
  ocsp response verification failed, no signer certificate 'C=CH, O=strongSwan Project, OU=OCSP Signing Authority, CN=ocsp.strongswan.org' found

messages from the cached OCSP responses for carol's end-entity and
intermediate CA certificates when verifying dave's end-entity certificate.

And finally the

  ocsp response verification failed, no signer certificate 'C=CH, O=strongSwan Project, OU=Research OCSP Signing Authority, CN=ocsp.research.strongswan.org' found
    ocsp response correctly signed by "C=CH, O=strongSwan Project, OU=OCSP Signing Authority, CN=ocsp.strongswan.org"
    ocsp response contains no status on our certificate
  ocsp response verification failed, no signer certificate 'C=CH, O=strongSwan Project, OU=Sales OCSP Signing Authority, CN=ocsp.sales.strongswan.org' found

messages from the cached OCSP responses for carol's end-entity
certificate, the applicable but unrelated response for carol's "Research"
intermediate CA certificate and the response for dave's end-entity
certificate when verifying dave's "Sales" intermediate CA.

18 months agotesting: Fix installation of swid-generator with newer versions of setuptools
Tobias Brunner [Tue, 28 Mar 2023 09:55:17 +0000 (11:55 +0200)] 
testing: Fix installation of swid-generator with newer versions of setuptools

With version 60.0.0 setuptools changed to a local installation of
distutils.  This seems to break the installation of swid-generator (causing
an `importlib.metadata.PackageNotFoundError: swid-generator` error).

Note that while Debian ships setuptools 52.0.0, `python-daemon` recently
added a dependency on `setuptools>=62.4.0`, which installs that version
that's then later used to install swid-generator.

The main difference seems to be that the local version installs the
package in `/usr/lib/python3.9/site-packages`, while the stdlib version
does so in `/usr/local/lib/python3.9/dist-packages` (similarly for the
`swid_generator` script and the `distro` dependency).

Not sure if there is a better/proper way to fix this.  Might just be an
issue with Debian bullseye and mixing system packages with those installed
via pip3.

18 months agoMerge branch 'crl-sign'
Tobias Brunner [Fri, 24 Mar 2023 16:34:05 +0000 (17:34 +0100)] 
Merge branch 'crl-sign'

Enforces that the certificate that signed a CRL either encodes the
cRLSign keyUsage (even if it is a CA certificate) or is a CA certificate
without a keyUsage extension (which should rarely be the case nowadays).

This is in compliance with RFC 5280, section 6.3.3. (f):

  If a key usage extension is present in the CRL issuer's certificate,
  verify that the cRLSign bit is set.

strongSwan encodes a keyUsage extension with cRLSign bit set in all CA
certificates it generates since 1ec8f22de222 ("set Certificate Sign and
CRL Sign flags in keyUsage extension if CA is true"), which was 13 years
ago.  Before that the extension was not encoded so those CA certificates
would also still be accepted as CRL issuer (if they are still valid, but
considering the SHA-1 deprecation that happened since then, they were
most likely replaced anyway).

References strongswan/strongswan#1548

18 months agoopenssl: Only allow certificates with cRLSign keyUsage to sign CRLs
Tobias Brunner [Wed, 22 Feb 2023 16:21:15 +0000 (17:21 +0100)] 
openssl: Only allow certificates with cRLSign keyUsage to sign CRLs

18 months agox509: Only allow certificates with cRLSign keyUsage to sign CRLs
Tobias Brunner [Wed, 22 Feb 2023 16:20:07 +0000 (17:20 +0100)] 
x509: Only allow certificates with cRLSign keyUsage to sign CRLs

18 months agoopenssl: Set X509_CRL_SIGN for CA certificates without keyUsage extension
Tobias Brunner [Wed, 22 Feb 2023 16:18:36 +0000 (17:18 +0100)] 
openssl: Set X509_CRL_SIGN for CA certificates without keyUsage extension

18 months agox509: Set X509_CRL_SIGN for CA certificates without keyUsage extension
Tobias Brunner [Wed, 22 Feb 2023 16:18:14 +0000 (17:18 +0100)] 
x509: Set X509_CRL_SIGN for CA certificates without keyUsage extension

18 months agoappveyor: Build eap-radius plugin on Windows
Tobias Brunner [Wed, 8 Mar 2023 14:33:43 +0000 (15:33 +0100)] 
appveyor: Build eap-radius plugin on Windows

18 months agolibradius: Link to winsock32 on Windows
Tobias Brunner [Wed, 8 Mar 2023 14:55:38 +0000 (15:55 +0100)] 
libradius: Link to winsock32 on Windows

18 months agoeap-radius: Don't include socket.h explicitly
Tobias Brunner [Wed, 8 Mar 2023 14:31:42 +0000 (15:31 +0100)] 
eap-radius: Don't include socket.h explicitly

We rely on the includes via utils.h so this compiles on Windows.

18 months agowindows: Fix compat define for sendto(2)
Tobias Brunner [Wed, 8 Mar 2023 14:05:42 +0000 (15:05 +0100)] 
windows: Fix compat define for sendto(2)

18 months agokernel-wfp: Install bypass policies also on FWPM_SUBLAYER_IPSEC_TUNNEL sublayer
Tobias Brunner [Wed, 1 Mar 2023 16:08:37 +0000 (17:08 +0100)] 
kernel-wfp: Install bypass policies also on FWPM_SUBLAYER_IPSEC_TUNNEL sublayer

This is apparently necessary to bypass tunnel mode SAs/policies.

References strongswan/strongswan#1552

18 months agowindows: Fix invalid pointer dereference when terminating service thread
Tobias Brunner [Tue, 7 Mar 2023 15:57:27 +0000 (16:57 +0100)] 
windows: Fix invalid pointer dereference when terminating service thread

When running as a service, the libraries are initialized/deinitialized
not by the main thread but by a separate thread that runs the registered
main service procedure.  When the service is stopped, the libraries are
deinitialized by that thread and the thread lock and hashtable are
destroyed.  But afterwards the DllMain callback is also triggered for
that thread so we have to prevent it from accessing these objects again.

References strongswan/strongswan#1567

18 months agocontroller: Immediately return after re-initiating an existing IKE_SA childless
Tobias Brunner [Wed, 1 Mar 2023 16:31:07 +0000 (17:31 +0100)] 
controller: Immediately return after re-initiating an existing IKE_SA childless

If no CHILD_SA is initiated, we wait for a state change to IKE_ESTABLISHED
but that will never happen for already established IKE_SAs.

References strongswan/strongswan#1553

18 months agovici: Fix fallback to remote ID if no mediation peer ID is configured
Tobias Brunner [Thu, 2 Mar 2023 09:21:43 +0000 (10:21 +0100)] 
vici: Fix fallback to remote ID if no mediation peer ID is configured

Also adds error reporting via VICI for issues with mediation settings.

Fixes: 229cdf6bc8f2 ("vici: Order auth rounds by optional `round` parameter instead of by position in the request")
References strongswan/strongswan#1569

18 months agodhcp: Don't use get_source_addr() to determine source address
Tobias Brunner [Fri, 10 Mar 2023 09:43:24 +0000 (10:43 +0100)] 
dhcp: Don't use get_source_addr() to determine source address

That method is subject to interface filtering, which isn't ideal for
DHCP traffic that probably uses an internal interface on which the IKE
daemon might be disabled.  In that case `giaddr` is set to an incorrect
public IP, which in turn might prevent the plugin from receiving the
DHCP server's unicast response, in particular if the DHCP socket
is bound to the internal interface.

This new approach connects the client socket and thereby determines the
source address to reach the DHCP server.

Closes strongswan/strongswan#1573

18 months agopki: Fix enum for SCEP CA capabilities
Tobias Brunner [Fri, 17 Mar 2023 16:24:41 +0000 (17:24 +0100)] 
pki: Fix enum for SCEP CA capabilities

As indicated by the comparisons and the parsing in scep_parse_caps()
this should be a bitmask.

Fixes: 7c7a5a0260ca ("pki: Enroll an X.509 certificate with a SCEP server")
Closes strongswan/strongswan#1607

18 months agoeap-tls: Fix server implementation with TLS 1.2 and earlier
Tobias Brunner [Mon, 13 Mar 2023 12:39:17 +0000 (13:39 +0100)] 
eap-tls: Fix server implementation with TLS 1.2 and earlier

With 5401a74d3608 ("eap-tls: Add support for TLS 1.3") a TLS application
was added to implement TLS 1.3's protected success indication.  For
earlier TLS versions, its build() method simply returned SUCCESS as
there was nothing to send.  However, that had the unintended side-effect
of also not sending the final TLS handshake messages (ChangeCipherSpec
and Finished).

The reason is that the TLS stack first checks for remaining handshake
messages but then also asks the registered application for data to
piggyback to that response (before the commit there was no application,
so that step was skipped).  The problem is that the status returned by
the application is directly forwarded through the TLS stack.  So not
returning INVALID_STATE caused the session to get concluded immediately
instead of resulting in ALREADY_DONE that would trigger sending the
final EAP message instead of an EAP-Success.

Fixes: 5401a74d3608 ("eap-tls: Add support for TLS 1.3")
18 months agotls: Only return EAP MSK if TLS handshake is complete
Tobias Brunner [Mon, 13 Mar 2023 12:26:25 +0000 (13:26 +0100)] 
tls: Only return EAP MSK if TLS handshake is complete

The MSK is generated when the keys are derived.  For TLS 1.3 that's also
when the handshake is complete.  However, for TLS 1.2 it happens when
generating or processing the ClientKeyExchange message, which, on the
client, happens before the final Finished handshake message has been
received from the server.  This caused the EAP-TLS client to accept an
EAP-Success message instead of the server's final TLS handshake
messages, unintentionally allowing servers to cut the exchange short by
two EAP messages (in the regular exchange the response to the server's
final handshake messages is an empty EAP-Response, which is then
followed by the server's EAP-Success).

While this is not correct, it does not seem to pose a security issue.
If DH is used as key exchange, the server signs the ServerKeyExchange
message and the client is sure to communicate with a trusted server
before it derives the MSK.  If RSA encryption is used as key exchange,
the client sends the premaster secret, on which the MSK is based,
encrypted with the server's public key (as extracted from the trusted
certificate).  An attacker won't be able to decrypt this and, therefore,
can't derive the same MSK to generate a valid AUTH payload and the IKE
authentication will fail.

18 months agogithub: Add LSan workaround for tests on Ubuntu 20.04 again
Tobias Brunner [Thu, 16 Mar 2023 13:11:12 +0000 (14:11 +0100)] 
github: Add LSan workaround for tests on Ubuntu 20.04 again

This was removed with 0fea6a7f8e7e ("github: Adapt to switch to Ubuntu
22.04 for ubuntu-latest") as it didn't seem necessary anymore.  But
recently there have been such random crashes again with the 20.04 image.

18 months agogithub: Use OpenSSL 3.1.0 for tests
Tobias Brunner [Tue, 14 Mar 2023 16:03:05 +0000 (17:03 +0100)] 
github: Use OpenSSL 3.1.0 for tests

18 months agovici: Generalize timeout support in Python bindings
Jean-Tiare Le Bigot [Thu, 2 Mar 2023 22:20:13 +0000 (23:20 +0100)] 
vici: Generalize timeout support in Python bindings

Since 3dd5dc50119d ("Merge branch 'vici-python-timeout'"), any timeout
set directly on the socket is reset by `vici.Transport.receive()` unless
called by `vici.Session.listen()`. This prevents configuring a default
timeout directly on the socket.

However, setting a timeout directly on the socket also had drawbacks
since it can cause `vici.Transport.receive()` to raise a timeout error
while a subset of the data have been received, with no way to recover.

This commit merges both approaches by considering the timeout configured
on the socket by default (when no timeout is explicitly set) and
keeping the switch to blocking receive once the first byte has been
received. When the full expected data have been received, the timeout
configured on the socket is restored.

Co-authored-by: Tobias Brunner <tobias@strongswan.org>
Signed-off-by: Jean-Tiare Le Bigot <jt@yadutaf.fr>
Closes strongswan/strongswan#1562

18 months agogithub: Don't build on Ubuntu 18.04 anymore
Tobias Brunner [Tue, 7 Mar 2023 13:51:10 +0000 (14:51 +0100)] 
github: Don't build on Ubuntu 18.04 anymore

The Ubuntu 18.04 image is deprecated and builds will start to fail
temporarily during four 24 hour periods from now until the final
deprecation on April 1st.  So better remove these runs now.

18 months agoappveyor: Fix LDFLAGS for Windows build
Tobias Brunner [Fri, 3 Mar 2023 12:02:44 +0000 (13:02 +0100)] 
appveyor: Fix LDFLAGS for Windows build

With newer OpenSSL builds, the DLL files contain parts of the version
number and the architecture in their name, e.g. for OpenSSL 1.1.1 the
DLL for libcrypto is called libcrypto-1_1-x64.dll.  So referencing that
directly could be kinda tricky.  And by using `-lcrypto` we therefore
didn't link those DLLs but the OpenSSL version installed by msys2.
Since the latter ships OpenSSL 3 since January and the VS 2019 image
was updated recently, our builds broke as we used the headers from
the 1.1.1 installation but then tried to link OpenSSL 3.

Luckily, in the lib/ directory of the OpenSSL installation, there is a
libcrypto.lib file, which is an import library (containing the symbols
and a reference to the DLL).  We can use that to link the right library
via `-lcrypto`.

With the old OpenSSL 1.0.2 build on the VS 2015 image, there is also
such a .lib file but it seems the linker is too old or otherwise incapable
of finding the DLL.  But since the DLL is just called libeay32.dll there,
we use that directly and don't reference the lib/ dir.

Also removed a superfluous AC_MSG_RESULT() if libeay32 isn't found.

18 months agoappveyor: Install gperf manually on newer versions of msys2
Tobias Brunner [Thu, 2 Mar 2023 10:44:59 +0000 (11:44 +0100)] 
appveyor: Install gperf manually on newer versions of msys2

18 months agoVersion bump to 5.9.10 5.9.10
Andreas Steffen [Thu, 2 Mar 2023 08:58:24 +0000 (09:58 +0100)] 
Version bump to 5.9.10

18 months agoNEWS: Add info about CVE-2023-26463
Tobias Brunner [Fri, 24 Feb 2023 15:07:38 +0000 (16:07 +0100)] 
NEWS: Add info about CVE-2023-26463

18 months agoeap-peap: Initiate Phase 2 immediately for TLS 1.3
Tobias Brunner [Wed, 1 Mar 2023 14:51:38 +0000 (15:51 +0100)] 
eap-peap: Initiate Phase 2 immediately for TLS 1.3

Before TLS 1.3, the server sent the last handshake message and had the
option to piggyback the EAP-Identity request directly onto the packet
with the TLS Finished message, or wait for the empty message by the
client that acknowledges the completion of the handshake.  With TLS 1.3,
the client finishes the handshake after the server.  So this option
is irrelevant there and we immediately start with Phase 2.

18 months agotesting: Negotiate TLS 1.3 for part of the EAP-TLS scenarios
Andreas Steffen [Wed, 1 Mar 2023 09:42:06 +0000 (10:42 +0100)] 
testing: Negotiate TLS 1.3 for part of the EAP-TLS scenarios

19 months agoNEWS: Add news for 5.9.10
Tobias Brunner [Fri, 24 Feb 2023 15:03:07 +0000 (16:03 +0100)] 
NEWS: Add news for 5.9.10

19 months agopki: Add possibility to add/remove flags in requests when issuing certificates
Tobias Brunner [Thu, 23 Feb 2023 16:03:05 +0000 (17:03 +0100)] 
pki: Add possibility to add/remove flags in requests when issuing certificates

19 months agopki: Allow overriding EKU flags from certificate request via command line
Tobias Brunner [Thu, 23 Feb 2023 15:54:51 +0000 (16:54 +0100)] 
pki: Allow overriding EKU flags from certificate request via command line

The flags encoded in the PKCS#10 structure (or derived from the encoded
profile name) might not be appropriate in some instances. This allows
overriding them without having to issue a new certificate request.

19 months agoVersion bump to 5.9.10rc1 5.9.10rc1
Andreas Steffen [Wed, 22 Feb 2023 19:00:18 +0000 (20:00 +0100)] 
Version bump to 5.9.10rc1

19 months agotesting: Add a failing client to the ikev2/rw-eap-tls-only scenario
Tobias Brunner [Wed, 22 Feb 2023 16:10:03 +0000 (17:10 +0100)] 
testing: Add a failing client to the ikev2/rw-eap-tls-only scenario

19 months agolibvici: Fix Doxygen comment for vici_on_close()
Tobias Brunner [Wed, 22 Feb 2023 13:08:24 +0000 (14:08 +0100)] 
libvici: Fix Doxygen comment for vici_on_close()

Fixes: 9e5533fef940 ("libvici: Add callback invoked if connection is closed by daemon")
19 months agoswanctl: Fix Windows build of --monitor-sas command
Tobias Brunner [Wed, 22 Feb 2023 13:01:59 +0000 (14:01 +0100)] 
swanctl: Fix Windows build of --monitor-sas command

Fixes: 4784c92c557f ("swanctl: Terminate --monitor-sa command if daemon closes connection")
19 months agoutils: Add counterpart to wait_sigint() to explicitly stop waiting
Tobias Brunner [Wed, 22 Feb 2023 13:29:39 +0000 (14:29 +0100)] 
utils: Add counterpart to wait_sigint() to explicitly stop waiting

19 months agoMerge branch 'nm-xfrmi'
Tobias Brunner [Wed, 22 Feb 2023 12:44:10 +0000 (13:44 +0100)] 
Merge branch 'nm-xfrmi'

Use XFRM interfaces instead of dummy TUN devices to avoid issues with
name resolution if supported by the kernel.

Closes strongswan/strongswan#1048

19 months agocharon-nm: Use an XFRM interface if available
Tobias Brunner [Mon, 9 Jan 2023 14:19:43 +0000 (15:19 +0100)] 
charon-nm: Use an XFRM interface if available

This allows NM more freedom in regards to how it wants to use the passed
device.  In particular, if dnsmasq is used with NM as that binds to the
interface to send requests via VPN.

Installing the VIPs on lo avoids weird address removal/addition events
that happen for IPv6 on the physical interface (which would cause the VIP
to get incorrectly detected as non-VIP address and ignored during
deletion).

We could let NM install routes via XFRM interface, however, that causes
problems with e.g. the bypass-lan plugin (the throw routes in table 220
wouldn't have any effect).  We could let it install regular routes in
the main table, but determining the physical interface would be tricky
as the routes installed by NM, also in the main table, would conflict.

So instead we let the kernel-netlink interface install routes via XFRM
interface and to avoid routing the IKE traffic that way, we set a mark
on the IKE socket and exclude traffic with that mark from our routing
table.

19 months agokernel-netlink: Add an option to install routes for SAs with XFRM interfaces
Tobias Brunner [Mon, 9 Jan 2023 14:10:55 +0000 (15:10 +0100)] 
kernel-netlink: Add an option to install routes for SAs with XFRM interfaces

Since these might conflict with IKE traffic, this requires special care.
One option is to install bypass policies for the peer, which install
appropriate (throw) routes.  However, that won't work if the traffic to
the gateway itself should be protected, in particular, for host-to-host
tunnels.  So an alternative is to set a mark for the IKE socket and then
exclude that traffic from table 220 via the kernel-netlink plugin's
fwmark option.

19 months agokernel-netlink: Automatically bring up XFRM interfaces after creation
Tobias Brunner [Mon, 9 Jan 2023 13:54:28 +0000 (14:54 +0100)] 
kernel-netlink: Automatically bring up XFRM interfaces after creation

19 months agokernel-netlink: Add manager for XFRM interfaces
Tobias Brunner [Mon, 11 Jul 2022 11:12:46 +0000 (13:12 +0200)] 
kernel-netlink: Add manager for XFRM interfaces

The manager will allow charon-nm to create XFRM interfaces if supported
by the kernel instead of creating an unused dummy TUN interface.

The xfrmi tool is mostly obsolete nowadays as iproute2 supports creating
XFRM interfaces since 5.1.0 (2019-05).  Older Debians don't ship that and
early versions didn't list the interface IDs.  So there might still be
some uses for this tool.

19 months agocharon-nm: Tie lifetime of dummy TUN device to connection
Tobias Brunner [Thu, 5 Jan 2023 15:24:42 +0000 (16:24 +0100)] 
charon-nm: Tie lifetime of dummy TUN device to connection

NM doesn't terminate charon-nm after disconnecting, so the TUN device
previously stayed around even if no connection was established.  This
might be a bit more what users expect.

19 months agoeap-tls: Add support for TLS 1.3
Tobias Brunner [Tue, 17 Jan 2023 14:06:40 +0000 (15:06 +0100)] 
eap-tls: Add support for TLS 1.3

As defined in RFC 9190, a "protected success indication" (0x00) is sent
from the server to the client over the TLS connection when using TLS 1.3.

The client responds with an empty EAP message, which is interpreted as
acknowledgement in our stack.

If we ever support session resumption with tunneled methods such as
EAP-TTLS, we'd have to send such an indication there too.

19 months agotls-crypto: Fix MSK calculation for TLS 1.3
Tobias Brunner [Fri, 12 Feb 2021 12:25:05 +0000 (13:25 +0100)] 
tls-crypto: Fix MSK calculation for TLS 1.3

As noted in 121ac4b9e37e ("tls-crypto: Generate MSK for TLS 1.3"), the
calculation was only preliminary.  It is now fixed according to RFC 9190
and draft-ietf-emu-tls-eap-types (soon to become an RFC, currently in
the RFC editor queue).

Fixes: 121ac4b9e37e ("tls-crypto: Generate MSK for TLS 1.3")
19 months agoMerge branch 'kernel-netlink-sa-lastused'
Tobias Brunner [Wed, 22 Feb 2023 12:21:31 +0000 (13:21 +0100)] 
Merge branch 'kernel-netlink-sa-lastused'

Adds support for a change in Linux kernel 6.2 that allows retrieving
the last use time of an SA from the SA itself instead of having to query
the policies.

19 months agokernel-netlink: Increase log level for dumped Netlink messages
Tobias Brunner [Wed, 11 Jan 2023 16:05:37 +0000 (17:05 +0100)] 
kernel-netlink: Increase log level for dumped Netlink messages

Some of these contain key material so they should be logged on level 4.

19 months agoandroid: Announce support for TFC padding
Tobias Brunner [Thu, 23 Jun 2022 14:38:02 +0000 (16:38 +0200)] 
android: Announce support for TFC padding

Has been supported by libipsec for a long time (since 5.1.1).  UDP encap
is already enforced via config, this just makes the flags the same as
in kernel-libipsec.

19 months agokernel-netlink: Read last use time from SA if possible
Tobias Brunner [Thu, 23 Jun 2022 14:15:45 +0000 (16:15 +0200)] 
kernel-netlink: Read last use time from SA if possible

Since 6.2 the Linux kernel updates the last use time per SA.  In
previous releases the attribute was only updated and reported for
specific outbound IPv6 SAs.

Using this reduces the number of kernel queries per CHILD_SA: for DPDs
from two policy queries (IN/FWD) to a single query of the inbound SA,
and for status reports the three policy queries (IN/FWD/OUT) can be
omitted and only the two SAs have to be queried.  For NAT keepalives the
number of queries doesn't change but a policy query (OUT) is replaced by
a query for the outbound SA.

While we could use the existence of the attribute as indicator for its
support, we don't know this until we queried an SA.  By using a version
check we can announce the feature from the start.

19 months agochild-sa: Query policies only if querying SAs doesn't update the use time
Tobias Brunner [Thu, 23 Jun 2022 14:13:02 +0000 (16:13 +0200)] 
child-sa: Query policies only if querying SAs doesn't update the use time

19 months agokernel-interface: Add feature to indicate if query_sa() returns last use time
Tobias Brunner [Thu, 23 Jun 2022 13:59:56 +0000 (15:59 +0200)] 
kernel-interface: Add feature to indicate if query_sa() returns last use time

Currently supported by libipsec and PF_KEY on macOS (FreeBSD, like Linux,
reports the time the SA was first used in sadb_lifetime_usetime - it also
triggers rekeyings based on that, which Linux doesn't, it also triggers
them if an SA is never used).

19 months agoikev2: Add option to prefer childless IKE_SAs as initiator
Tobias Brunner [Fri, 3 Feb 2023 08:46:37 +0000 (09:46 +0100)] 
ikev2: Add option to prefer childless IKE_SAs as initiator

19 months agoswanctl: Terminate --monitor-sa command if daemon closes connection
Tobias Brunner [Thu, 26 Jan 2023 10:17:30 +0000 (11:17 +0100)] 
swanctl: Terminate --monitor-sa command if daemon closes connection

19 months agolibvici: Add callback invoked if connection is closed by daemon
Tobias Brunner [Thu, 26 Jan 2023 10:16:11 +0000 (11:16 +0100)] 
libvici: Add callback invoked if connection is closed by daemon

19 months agogithub: Explicitly install pkg-config in macOS build
Tobias Brunner [Mon, 20 Feb 2023 13:24:29 +0000 (14:24 +0100)] 
github: Explicitly install pkg-config in macOS build

Apparently not installed anymore in the latest build image.  If it's
missing, we see errors like these:

  configure.ac:38: error: possibly undefined macro: AC_DEFINE

19 months agoandroid: Update the README for the build via NDK
Tobias Brunner [Mon, 20 Feb 2023 13:11:29 +0000 (14:11 +0100)] 
android: Update the README for the build via NDK

19 months agoandroid: New release after OpenSSL plugin fix android-2.4.1-1
Tobias Brunner [Fri, 17 Feb 2023 15:59:13 +0000 (16:59 +0100)] 
android: New release after OpenSSL plugin fix

19 months agoopenssl: Fix size of plugin feature array
Tobias Brunner [Fri, 17 Feb 2023 15:58:19 +0000 (16:58 +0100)] 
openssl: Fix size of plugin feature array

Fixes: 312847e1a322 ("openssl: Add curve25519 and curve448 after ECDH groups")
19 months agoandroid: New release after fixing interoperability issue with Zyxel firewalls android-2.4.1
Tobias Brunner [Fri, 17 Feb 2023 15:36:28 +0000 (16:36 +0100)] 
android: New release after fixing interoperability issue with Zyxel firewalls

19 months agoopenssl: Add curve25519 and curve448 after ECDH groups
Tobias Brunner [Fri, 17 Feb 2023 15:28:07 +0000 (16:28 +0100)] 
openssl: Add curve25519 and curve448 after ECDH groups

This was the order before 46a6b062822c ("openssl: Only announce ECDH
groups actually supported by OpenSSL") but that's not really the reason
for this change.  It's related to the Android app, where we previously
didn't support these DH groups in BoringSSL and added the curve25519
plugin after the openssl plugin instead.  This resulted in the same
order, i.e. ECDH groups before curve25519.  With the switch to OpenSSL
and the mentioned commit, this changed and curve25519 was now the first
group that was proposed and used for the KE payload.  Not really an
issue you'd think, however, there are apparently Zyxel Firewalls with
older firmware versions (some forum posts mentioned a fix in V5.31) that
can't handle KE payloads with DH groups > 21 (ecp521). So with
curve25519 (31) proposed in the KE payload, they silently dropped the
IKE_SA_INIT request and no connection could be established.

19 months agolibtls: Fix double-free for untrusted peer certificates
Tobias Brunner [Fri, 17 Feb 2023 14:07:20 +0000 (15:07 +0100)] 
libtls: Fix double-free for untrusted peer certificates

`public` is returned, but previously only if a trusted key was found.
We obviously don't want to return untrusted keys and since the reference
was correctly destroyed after determining the key type, this later caused
a double-free.

Fixes: 63fd718915b5 ("libtls: call create_public_enumerator() with key_type")
19 months agoenum: Add functions to add and remove mappings from enum names
Tobias Brunner [Thu, 16 Feb 2023 16:04:40 +0000 (17:04 +0100)] 
enum: Add functions to add and remove mappings from enum names

Co-authored-by: Thomas Egerer <thomas.egerer@secunet.com>
19 months agoMerge branch 'hw-packet-offload'
Tobias Brunner [Fri, 17 Feb 2023 12:27:37 +0000 (13:27 +0100)] 
Merge branch 'hw-packet-offload'

This adds support for the new "packet" hardware offload feature that's
added to the Linux kernel with 6.2.  In this mode, the device handles
the complete framing of the ESP packet as well as the policy checks,
in addition to the crypto.

For the IKE sockets, port-based bypass policies are automatically
offloaded to devices that support it.

Closes strongswan/strongswan#1462

19 months agokernel-netlink: Offload bypass policies for IKE ports on interfaces
Tobias Brunner [Fri, 27 Jan 2023 13:08:41 +0000 (14:08 +0100)] 
kernel-netlink: Offload bypass policies for IKE ports on interfaces

While this uses the same mechanism, it's not necessary to explicitly
enable port_bypass, the regular socket policies work fine to bypass any
software policies.

19 months agokernel-netlink: Use event socket wrapper for XFRM and networking events
Tobias Brunner [Thu, 26 Jan 2023 16:50:51 +0000 (17:50 +0100)] 
kernel-netlink: Use event socket wrapper for XFRM and networking events

19 months agokernel-netlink: Add simple wrapper for Netlink event sockets
Tobias Brunner [Thu, 26 Jan 2023 16:43:18 +0000 (17:43 +0100)] 
kernel-netlink: Add simple wrapper for Netlink event sockets

19 months agokernel-pfkey: Always register for events
Tobias Brunner [Thu, 26 Jan 2023 15:21:07 +0000 (16:21 +0100)] 
kernel-pfkey: Always register for events

The starter-specific code path isn't necessary anymore since
d8fdd1018e16 ("starter: Don't flush SAs in the kernel").

19 months agokernel-pfroute: Always listen for events
Tobias Brunner [Thu, 26 Jan 2023 15:19:22 +0000 (16:19 +0100)] 
kernel-pfroute: Always listen for events

The starter-specific code path isn't necessary anymore since
d8fdd1018e16 ("starter: Don't flush SAs in the kernel").

19 months agokernel-netlink: Always register for events
Tobias Brunner [Thu, 26 Jan 2023 15:17:15 +0000 (16:17 +0100)] 
kernel-netlink: Always register for events

The starter-specific code path isn't necessary anymore since
d8fdd1018e16 ("starter: Don't flush SAs in the kernel").

19 months agostarter: Remove starter-specific plugin lists
Tobias Brunner [Thu, 26 Jan 2023 15:09:32 +0000 (16:09 +0100)] 
starter: Remove starter-specific plugin lists

It hasn't loaded any plugins since d8fdd1018e16 ("starter: Don't flush
SAs in the kernel"), which was released with 5.3.3.

19 months agokernel-netlink: Fallback to configured interface when HW offloading policies
Tobias Brunner [Thu, 26 Jan 2023 12:25:11 +0000 (13:25 +0100)] 
kernel-netlink: Fallback to configured interface when HW offloading policies

This allows offloading bypass and drop policies to a specific interface
by configuring `interface` and `hw_offload=packet` (`auto` works too).

19 months agoshunt-manager: Pass HW offload mode when installing policies
Tobias Brunner [Wed, 25 Jan 2023 13:40:39 +0000 (14:40 +0100)] 
shunt-manager: Pass HW offload mode when installing policies

19 months agovici: Update offloading configuration for full packet HW offloading
Tobias Brunner [Thu, 15 Dec 2022 15:41:59 +0000 (16:41 +0100)] 
vici: Update offloading configuration for full packet HW offloading

19 months agokernel-netlink: Add support for full packet and policy HW offloading
Tobias Brunner [Thu, 15 Dec 2022 15:41:43 +0000 (16:41 +0100)] 
kernel-netlink: Add support for full packet and policy HW offloading

19 months agochild-sa: Pass HW offload mode for policies
Tobias Brunner [Mon, 19 Dec 2022 11:50:54 +0000 (12:50 +0100)] 
child-sa: Pass HW offload mode for policies

19 months agokernel-ipsec: Add HW offload mode to policies
Tobias Brunner [Mon, 19 Dec 2022 10:44:48 +0000 (11:44 +0100)] 
kernel-ipsec: Add HW offload mode to policies

19 months agoMerge branch 'android-updates' android-2.4.0
Tobias Brunner [Wed, 15 Feb 2023 13:50:12 +0000 (14:50 +0100)] 
Merge branch 'android-updates'

Switched from BoringSSL to OpenSSL. A script is provided to build the
library as needed.

19 months agoandroid: New release after switching to OpenSSL
Tobias Brunner [Mon, 13 Feb 2023 10:31:09 +0000 (11:31 +0100)] 
android: New release after switching to OpenSSL

19 months agoandroid: Use correct language code for Ukrainian
Tobias Brunner [Mon, 13 Feb 2023 13:25:17 +0000 (14:25 +0100)] 
android: Use correct language code for Ukrainian

While UA is the country code, the language code is apparently uk.

19 months agoandroid: Clean up plugin list after switching to OpenSSL
Tobias Brunner [Fri, 10 Feb 2023 09:36:50 +0000 (10:36 +0100)] 
android: Clean up plugin list after switching to OpenSSL

Keep the kdf plugin because of AES-XCBC (and CAMELLIA-XCBC, which is now
supported due to OpenSSL).  Other plugins like fips-prf, pubkey or pkcs8
were never actually used by the app.  The random plugin might have been
necessary with early versions.

19 months agoandroid: Use custom-built OpenSSL for GH action
Tobias Brunner [Thu, 9 Feb 2023 16:06:47 +0000 (17:06 +0100)] 
android: Use custom-built OpenSSL for GH action

19 months agoandroid: Increase minSdkVersion to 21 (Android 5.0)
Tobias Brunner [Thu, 9 Feb 2023 14:40:58 +0000 (15:40 +0100)] 
android: Increase minSdkVersion to 21 (Android 5.0)

Newer NDKs haven't supported the version(s) we used for a while. Also,
versions < 21 will be removed with the next version of the NDK.

19 months agoandroid: Add a script to build OpenSSL's libcrypto as needed by the app
Tobias Brunner [Thu, 9 Feb 2023 15:39:08 +0000 (16:39 +0100)] 
android: Add a script to build OpenSSL's libcrypto as needed by the app

The build script requires the paths to the NDK and OpenSSL sources.

It runs the build in a Docker container, by default. But if the required
tools are installed on the system (currently jq, make and perl) it can
also be run directly on the system by defining NO_DOCKER.

A relatively recent version of the NDK is required (the pre-built
toolchains are required).

19 months agoandroid: Add the application ID to the log
Tobias Brunner [Fri, 10 Feb 2023 10:24:02 +0000 (11:24 +0100)] 
android: Add the application ID to the log

19 months agoandroid: Update screenshots and add more with advanced settings
Tobias Brunner [Tue, 13 Dec 2022 14:28:12 +0000 (15:28 +0100)] 
android: Update screenshots and add more with advanced settings

19 months agoandroid: Update Gradle plugin
Tobias Brunner [Mon, 3 Oct 2022 08:48:18 +0000 (10:48 +0200)] 
android: Update Gradle plugin

19 months agogithub: Use OpenSSL 3.0.8 for tests
Tobias Brunner [Tue, 7 Feb 2023 17:06:16 +0000 (18:06 +0100)] 
github: Use OpenSSL 3.0.8 for tests