9 hours agotesting: Build certificates when make-testing is called master
Tobias Brunner [Tue, 22 Sep 2020 15:31:45 +0000 (17:31 +0200)]
testing: Build certificates when make-testing is called

9 hours agoinit: Remove obsolete StandardOutput setting from legacy systemd unit
Mingli Yu [Wed, 23 Sep 2020 08:20:22 +0000 (16:20 +0800)]
init: Remove obsolete StandardOutput setting from legacy systemd unit

The standard output value "syslog" was deprecated for a while and did fall
back to "journal". It causes a warning since systemd version 246 [1].

By removing the setting it will default to DefaultStandardOutput, which
defaults to "journal".


Closes strongswan/strongswan#181.

9 hours agoSimplify handling of terminating signals in all libcharon wrappers
Tobias Brunner [Tue, 29 Sep 2020 13:38:24 +0000 (15:38 +0200)]
Simplify handling of terminating signals in all libcharon wrappers

Closes strongswan/strongswan#182.

6 days agotravis: Bump tpm2-tss to 2.4.3
Tobias Brunner [Thu, 24 Sep 2020 06:52:22 +0000 (08:52 +0200)]
travis: Bump tpm2-tss to 2.4.3

8 days agolgtm: Fix building dependencies (in particular tpm2-tss)
Tobias Brunner [Tue, 22 Sep 2020 08:51:12 +0000 (10:51 +0200)]
lgtm: Fix building dependencies (in particular tpm2-tss)

This was moved to a separate step with 0ff939585ec7 ("travis: Bump tpm2-tss
to 2.4.1") so packages are installed before these dependencies are built.
However, on LGTM, packages can't be installed explicitly, so `deps` is
a no-op and we still have to list some dependencies in the config.

2 weeks agoike-vendor: Add option to send Cisco FLexVPN vendor ID
Noel Kuntze [Fri, 24 Jul 2020 20:25:40 +0000 (22:25 +0200)]
ike-vendor: Add option to send Cisco FLexVPN vendor ID

A new global option enables sending this vendor ID to prevent Cisco
devices from narrowing the initiator's local traffic selector to the
requested virtual IP, so e.g. can be used instead.

This has been tested with a "tunnel mode ipsec ipv4" Cisco template but
should also work for GRE encapsulation.

Closes strongswan/strongswan#180.

3 weeks agolibipsec: Enable code coverage
Tobias Brunner [Wed, 9 Sep 2020 09:38:02 +0000 (11:38 +0200)]
libipsec: Enable code coverage

Same as with libtls.

3 weeks agolibtls: Enable code coverage
Tobias Brunner [Wed, 9 Sep 2020 09:36:53 +0000 (11:36 +0200)]
libtls: Enable code coverage

While the test runner was already correctly set up, the library itself
was not and no coverage was reported for any of its files.

3 weeks agoleak-detective: Whitelist OPENSSL_init_ssl()
Tobias Brunner [Fri, 4 Sep 2020 14:40:48 +0000 (16:40 +0200)]
leak-detective: Whitelist OPENSSL_init_ssl()

These leaks are reported with OpenSSL 1.1.0+ if the mysql plugin is loaded.

3 weeks agotravis: Read project/organization for SonarCloud from environment variable
Tobias Brunner [Fri, 4 Sep 2020 14:20:40 +0000 (16:20 +0200)]
travis: Read project/organization for SonarCloud from environment variable

3 weeks agoAdd project config for SonarCloud to ignore some files/rules
Tobias Brunner [Tue, 17 Mar 2020 13:37:33 +0000 (14:37 +0100)]
Add project config for SonarCloud to ignore some files/rules

These settings have already been configured in the UI, but it might be
helpful to have them here so it's easier to set up the analysis of forks.

3 weeks agotesting: Increase memory of alice by 20 MiB
Tobias Brunner [Fri, 4 Sep 2020 12:57:56 +0000 (14:57 +0200)]
testing: Increase memory of alice by 20 MiB

It's ever so close with strongTNC, sometimes the OOM killer got triggered
and the tests failed, or even worse, the whole guest system got stuck.
This might just be enough for now.

3 weeks agotesting: Fix dependency issue with strongTNC
Tobias Brunner [Mon, 24 Aug 2020 14:22:18 +0000 (16:22 +0200)]
testing: Fix dependency issue with strongTNC

Apparently, djangorestframework-camel-case, in the referenced version,
uses `six` but does not itself require/install it (later versions removed
Python 2 support altogether).

3 weeks agoMerge branch 'testing-buster'
Tobias Brunner [Thu, 3 Sep 2020 13:53:14 +0000 (15:53 +0200)]
Merge branch 'testing-buster'

Use Debian buster as base image for the testing environment.

3 weeks agotesting: Fix route-based/net2net-xfrmi-ike scenario
Tobias Brunner [Tue, 25 Aug 2020 08:28:58 +0000 (10:28 +0200)]
testing: Fix route-based/net2net-xfrmi-ike scenario

On newer systems, the upper hard limit for open file descriptors (see
`ulimit -H -n`) was increased from 4096 to 524288.  Due to how python-daemon
closes potentially open file descriptors (basically stores them in a set,
removes those excluded by config, and loops through all of them), the updown
script was either killed immediately (by the OOM killer) or not ready yet
when updown events occurred.

3 weeks agoleak-detective: Whitelist leaks that occur on Debian buster
Tobias Brunner [Mon, 24 Aug 2020 14:20:43 +0000 (16:20 +0200)]
leak-detective: Whitelist leaks that occur on Debian buster

3 weeks agotesting: Use Debian buster as base image
Tobias Brunner [Mon, 24 Aug 2020 14:20:15 +0000 (16:20 +0200)]
testing: Use Debian buster as base image

3 weeks agotesting: Use latest x509-ada release
Tobias Brunner [Thu, 3 Sep 2020 11:30:30 +0000 (13:30 +0200)]
testing: Use latest x509-ada release

This fixes an issue with newer compiler versions where crashes would be
caused if functions of the generated C X.509 parser are not aligned.

3 weeks agotesting: Add man, valgrind and strace to base image
Tobias Brunner [Mon, 24 Aug 2020 14:19:34 +0000 (16:19 +0200)]
testing: Add man, valgrind and strace to base image

3 weeks agotesting: Install vici Python module manually
Tobias Brunner [Mon, 24 Aug 2020 14:17:04 +0000 (16:17 +0200)]
testing: Install vici Python module manually

easy_install is not included in Debian's python-setuptools package
anymore, so we install it manually using

3 weeks agotesting: Replace deprecated/removed `pip install --download` command
Tobias Brunner [Mon, 24 Aug 2020 14:15:50 +0000 (16:15 +0200)]
testing: Replace deprecated/removed `pip install --download` command

It was deprecated for a while and has been replaced by `pip download`.

3 weeks agotesting: Use legacy iptables on Debian buster
Tobias Brunner [Mon, 24 Aug 2020 14:14:07 +0000 (16:14 +0200)]
testing: Use legacy iptables on Debian buster

The iptables-nft wrapper that uses the nftables framework can't handle
the CLUSTERIP target (plus we'd require nftables in the kernel).

3 weeks agotesting: Increase maximum guest image size
Tobias Brunner [Mon, 24 Aug 2020 14:06:06 +0000 (16:06 +0200)]
testing: Increase maximum guest image size

Seems that each Debian release increases the image size by about 200 MiB.
But increase it a bit more so we have room for logs/tools/debug symbols.

3 weeks agotesting: Use pkill to reload rsyslogd config/recreate log files
Tobias Brunner [Mon, 24 Aug 2020 14:01:27 +0000 (16:01 +0200)]
testing: Use pkill to reload rsyslogd config/recreate log files

The PID location changes with newer Debian releases so it's more
portable this way.

3 weeks agotesting: Remove deprecated UsePrivilegeSeparation option from sshd_config
Tobias Brunner [Mon, 24 Aug 2020 13:57:03 +0000 (15:57 +0200)]
testing: Remove deprecated UsePrivilegeSeparation option from sshd_config

3 weeks agotesting: Add Linux 5.8 kernel config
Tobias Brunner [Mon, 24 Aug 2020 13:54:13 +0000 (15:54 +0200)]
testing: Add Linux 5.8 kernel config

Enables TCP encap for ESP.

3 weeks agotesting: Use host's /dev/urandom as /dev/random on guests via VirtIO RNG
Tobias Brunner [Mon, 24 Aug 2020 13:33:44 +0000 (15:33 +0200)]
testing: Use host's /dev/urandom as /dev/random on guests via VirtIO RNG

Newer versions of systemd etc. seem to require quite a lot of entropy
from /dev/random while booting, which can block and therefore delay the
start of other services (in particular sshd) by more than a minute.
Using the host's /dev/urandom via VirtIO RNG, we can avoid blocking the

The required kernel options are added for kernel versions 5.4+.

3 weeks agolibimcv: Add Debian 10.5 to IMV database
Tobias Brunner [Mon, 24 Aug 2020 13:32:16 +0000 (15:32 +0200)]
libimcv: Add Debian 10.5 to IMV database

3 weeks agotesting: Support build with Debian buster base image
Tobias Brunner [Tue, 28 Jul 2020 15:20:31 +0000 (17:20 +0200)]
testing: Support build with Debian buster base image

4 weeks agotravis: Bump wolfSSL to 4.5.0
Tobias Brunner [Fri, 21 Aug 2020 06:49:59 +0000 (08:49 +0200)]
travis: Bump wolfSSL to 4.5.0

6 weeks agoimv-scanner: Fix potential buffer overflow
Tobias Brunner [Tue, 18 Aug 2020 11:18:52 +0000 (13:18 +0200)]
imv-scanner: Fix potential buffer overflow

While `pos` was moved to the end, `len` was not adjusted (i.e. set to 0)
so later calls could write beyond the buffer.  However, the last port
written might have been incomplete, so instead we just reset the string.

6 weeks agoaesni: Remove useless algorithm assignments
Tobias Brunner [Tue, 18 Aug 2020 11:17:24 +0000 (13:17 +0200)]
aesni: Remove useless algorithm assignments

6 weeks agovici: Don't use pytest-pycodestyle with Python 3.5
Tobias Brunner [Mon, 17 Aug 2020 13:22:34 +0000 (15:22 +0200)]
vici: Don't use pytest-pycodestyle with Python 3.5

This causes problems due to a deprecation error during the Ubuntu Xenial
build on Travis.

6 weeks agotravis: Bump tpm2-tss to 2.4.2
Tobias Brunner [Mon, 17 Aug 2020 11:45:15 +0000 (13:45 +0200)]
travis: Bump tpm2-tss to 2.4.2

2 months agoVersion bump to 5.9.0 5.9.0
Andreas Steffen [Wed, 29 Jul 2020 11:08:09 +0000 (13:08 +0200)]
Version bump to 5.9.0

2 months agoNEWS: Add news for 5.9.0
Tobias Brunner [Fri, 24 Jul 2020 14:43:00 +0000 (16:43 +0200)]
NEWS: Add news for 5.9.0

2 months agovici: Fix typos in comments
Tobias Brunner [Thu, 23 Jul 2020 12:50:17 +0000 (14:50 +0200)]
vici: Fix typos in comments

2 months agoVersion bump to 5.9.0rc1 5.9.0rc1
Andreas Steffen [Tue, 21 Jul 2020 20:43:36 +0000 (22:43 +0200)]
Version bump to 5.9.0rc1

2 months agoconfigure: Ignore unknown Git version number
Tobias Brunner [Mon, 20 Jul 2020 15:38:03 +0000 (17:38 +0200)]
configure: Ignore unknown Git version number

Don't abort the script if the version is reported as UNKNOWN, which happens
on CI hosts where the repository is only cloned with a certain depth (which
may not include the latest tag).

Also, never map VERSION to UNKNOWN.

Fixes: 2e522952c77d ("configure: Optionally use version information obtained from Git in executables")

2 months agoUse Botan 2.15.0 for tests
Tobias Brunner [Mon, 20 Jul 2020 14:58:03 +0000 (16:58 +0200)]
Use Botan 2.15.0 for tests

2 months agounit-tests: Fix cancel_onoff test
Tobias Brunner [Mon, 20 Jul 2020 09:45:54 +0000 (11:45 +0200)]
unit-tests: Fix cancel_onoff test

If it takes a while to start one of the threads, another thread might already
have passed the usleep() call previously used and re-enabled cancelability
so that the loop that checked for it would never terminate.

2 months agounit-tests: Print a header for each test function/iteration if verbosity is >= 0
Tobias Brunner [Wed, 1 Jul 2020 11:29:22 +0000 (13:29 +0200)]
unit-tests: Print a header for each test function/iteration if verbosity is >= 0

2 months agounit-tests: Add ability to filter test cases and functions
Tobias Brunner [Wed, 17 Jun 2020 08:55:12 +0000 (10:55 +0200)]
unit-tests: Add ability to filter test cases and functions

2 months agoconfigure: Optionally use version information obtained from Git in executables
Tobias Brunner [Tue, 5 May 2020 14:19:09 +0000 (16:19 +0200)]
configure: Optionally use version information obtained from Git in executables

The variable GIT_VERSION is always defined, either obtained from Git or
a file that is embedded in tarballs when they are built.  Optionally,
that version is declared as VERSION in config.h so it will be used e.g. in
the daemons when they print the version number.

There is a check that should catch missing tags (i.e. if the version number
in AC_INIT() isn't a prefix of the version obtained via Git).

2 months agoopenssl: Use consistent ifdefs to disable x25519/448
Tobias Brunner [Thu, 2 Jul 2020 12:09:32 +0000 (14:09 +0200)]
openssl: Use consistent ifdefs to disable x25519/448

When compiling with OPENSSL_NO_ECDH but without OPENSSL_NO_EC the build

2 months agoMerge branch 'vici-ca-certs'
Tobias Brunner [Mon, 20 Jul 2020 12:07:47 +0000 (14:07 +0200)]
Merge branch 'vici-ca-certs'

These changes store all CA certificates in vici_authority_t, which avoids
issues with unloading authority sections or clearing credentials.

Closes strongswan/strongswan#172.

2 months agovici: Keep track of all CA certificates in vici_authority_t
Tobias Brunner [Wed, 20 May 2020 14:50:11 +0000 (16:50 +0200)]
vici: Keep track of all CA certificates in vici_authority_t

This way we only have one reference for each CA certificate, whether it
is loaded in an authority section, a connection or via load-certs() command.
It also avoids enumerating CA certificates multiple times if they are
loaded in different ways.

2 months agoobject: Add helper for callbacks with two void pointers
Tobias Brunner [Wed, 20 May 2020 15:34:39 +0000 (17:34 +0200)]
object: Add helper for callbacks with two void pointers

2 months agovici: Make attribute certificates untrusted again
Tobias Brunner [Wed, 20 May 2020 13:25:51 +0000 (15:25 +0200)]
vici: Make attribute certificates untrusted again

Fixes: 334119b843d7 ("Share vici_cert_info.c with vici_cred.c")

2 months agovici: Clear credential cache when unloading an authority section
Tobias Brunner [Wed, 20 May 2020 13:05:44 +0000 (15:05 +0200)]
vici: Clear credential cache when unloading an authority section

2 months agovici: Directly provide CA certificates in authority sections
Tobias Brunner [Wed, 20 May 2020 12:40:51 +0000 (14:40 +0200)]
vici: Directly provide CA certificates in authority sections

With the previous approach, CA certificates that were not re-loaded via
load-cert() (e.g. from tokens or via absolute paths) would not be available
anymore after the clear-creds() command was used.  This avoids this
issue, but can cause duplicate CA certificates to get stored and enumerated,
so there might be a scaling factor.

2 months agocertificate: Extract helper function to filter certificates
Tobias Brunner [Wed, 20 May 2020 12:25:33 +0000 (14:25 +0200)]
certificate: Extract helper function to filter certificates

2 months agoMerge branch 'ordered-hashtable'
Tobias Brunner [Mon, 20 Jul 2020 12:01:22 +0000 (14:01 +0200)]
Merge branch 'ordered-hashtable'

This changes the hashtable implementation to that it maintains insertion
order.  This is then used in the vici plugin to store connections in a
hash table instead of a linked list, which makes managing them quite a
bit faster if there are lots of connections.

The old implementation is extracted into a new class (hashlist_t), which
optionally supports sorting keys and provides the previous get_match()

2 months agohashtable: Use quadratic probing
Tobias Brunner [Fri, 24 Apr 2020 17:11:25 +0000 (19:11 +0200)]
hashtable: Use quadratic probing

This reduces the clustering problem (primary clustering) but is not
completely free of it (secondary clustering) it still reduces the maximum
and average probing lengths.

2 months agovici: Store configs in a hashtable
Tobias Brunner [Fri, 24 Apr 2020 13:16:26 +0000 (15:16 +0200)]
vici: Store configs in a hashtable

This makes updates more efficient if many configs are loaded. Configs
still have to be enumerated to select them.

2 months agohashtable: Maintain insertion order when enumerating
Tobias Brunner [Fri, 24 Apr 2020 13:51:17 +0000 (15:51 +0200)]
hashtable: Maintain insertion order when enumerating

With the previous approach we'd require at least an additional pointer
per item to store them in a list (15-18% increase in the overhead per
item).  Instead we switch from handling collisions with overflow lists to
an open addressing scheme and store the actual table as variable-sized
indices pointing into an array of all inserted items in their original

This can reduce the memory overhead even compared to the previous
implementation (especially for smaller tables), but because the array for
items is preallocated whenever the table is resized, it can be worse for
certain numbers of items.  However, avoiding all the allocations required
by the previous design is actually a big advantage.

Depending on the usage pattern, the performance can improve quite a bit (in
particular when inserting many items).  The raw lookup performance is a bit
slower as probing lengths increase with open addressing, but there are some
caching benefits due to the compact storage.  So for general usage the
performance should be better.  For instance, one test I did was counting the
occurrences of words in a list of 1'000'000 randomly selected words from a
dictionary of ~58'000 words (i.e. using a counter stored under each word as
key).  The new implementation was ~8% faster on average while requiring
10% less memory.

Since we can't remove items from the array (would change the indices of all
items that follow it) we just mark them as removed and remove them once the
hash table is resized/rehashed (the cells in the hash table for these may
be reused).  Due to this the latter may also happen if the number of stored
items does not increase e.g. after a series of remove/put operations (each
insertion requires storage in the array, no matter if items were removed).
So if the capacity is exhausted, the table is resized/rehashed (after lots
of removals the size may even be reduced) and all items marked as removed
are simply skipped.

Compared to the previous implementation the load factor/capacity is
lowered to reduce chances of collisions and to avoid primary clustering to
some degree.  However, the latter in particular, but the open addressing
scheme in general, make this implementation completely unsuited for the
get_match() functionality (purposefully hashing to the same value and,
therefore, increasing the probing length and clustering).  And keeping the
keys optionally sorted would complicate the code significantly.  So we just
keep the existing hashlist_t implementation without adding code to maintain
the overall insertion order (we could add that feature optionally later, but
with the mentioned overhead for one or two pointers).

The maximum size is currently not changed.  With the new implementation
this translates to a hard limit for the maximum number of items that can be
held in the table (=CAPACITY(MAX_SIZE)).  Since this equals 715'827'882
items with the current settings, this shouldn't be a problem in practice,
the table alone would require 20 GiB in memory for that many items.  The
hashlist_t implementation doesn't have that limitation due to the overflow
lists (it can store beyond it's capacity) but it itself would require over
29 GiB of memory to hold that many items.

2 months agohashlist: Move get_match() and sorting into a separate class
Tobias Brunner [Fri, 24 Apr 2020 11:41:53 +0000 (13:41 +0200)]
hashlist: Move get_match() and sorting into a separate class

The main intention here is that we can change the hashtable_t
implementation without being impeded by the special requirements imposed
by get_match() and sorting the keys/items in buckets.

2 months agounit-tests: Pass test iteration to fixtures
Tobias Brunner [Fri, 24 Apr 2020 12:45:21 +0000 (14:45 +0200)]
unit-tests: Pass test iteration to fixtures

2 months agohashtable: Optionally collect and report profiling data
Tobias Brunner [Fri, 24 Apr 2020 08:56:50 +0000 (10:56 +0200)]
hashtable: Optionally collect and report profiling data

2 months agohashtable: Optionally sort keys/items in buckets in a specific way
Tobias Brunner [Fri, 24 Apr 2020 06:50:24 +0000 (08:50 +0200)]
hashtable: Optionally sort keys/items in buckets in a specific way

This can improve negative lookups, but is mostly intended to be used
with get_match() so keys/items can be matched/enumerated in a specific
order.  It's like storing sorted linked lists under a shared key but
with less memory overhead.

2 months agohashtable: Store items in buckets in insertion order
Tobias Brunner [Fri, 24 Apr 2020 06:30:03 +0000 (08:30 +0200)]
hashtable: Store items in buckets in insertion order

This is more predictable when using get_match() in particular because
the order does not change anymore when the table is rehashed.

2 months agounit-tests: Add tests for larger number of items in hashtables
Tobias Brunner [Fri, 24 Apr 2020 06:02:59 +0000 (08:02 +0200)]
unit-tests: Add tests for larger number of items in hashtables

2 months agounit-tests: Optionally report the times test cases ran
Tobias Brunner [Thu, 16 Apr 2020 16:05:37 +0000 (18:05 +0200)]
unit-tests: Optionally report the times test cases ran

2 months agokernel-netlink: Ignore preference for temporary addresses for IPv6 VIPs
Tobias Brunner [Tue, 7 Jul 2020 08:01:46 +0000 (10:01 +0200)]
kernel-netlink: Ignore preference for temporary addresses for IPv6 VIPs

They are not marked as temporary addresses so make sure we always return
them whether temporary addresses are preferred as source addresses or not
as we need to enumerate them when searching for addresses in traffic selectors
to install routes.

Fixes: 9f12b8a61c47 ("kernel-netlink: Enumerate temporary IPv6 addresses according to config")

2 months agocharon-nm: Set DPD/close action to restart and enable indefinite keying tries
Tobias Brunner [Mon, 18 May 2020 12:17:24 +0000 (14:17 +0200)]
charon-nm: Set DPD/close action to restart and enable indefinite keying tries

We don't track CHILD_SA down events anymore and rely on NM's initial timeout
to let the user know if the connection failed initially.  So we also don't
have to explicitly differentiate between initial connection failures and
later ones like we do an Android.  Also, with the default retransmission
settings, there will only be one keying try as NM's timeout is lower than
the combined retransmission timeout of 165s.

There is no visual indicator while the connection is reestablished later.

Fixes #3300.

3 months agovici: With start_action=start, terminate IKE_SA without children on unload
Tobias Brunner [Wed, 1 Jul 2020 11:49:58 +0000 (13:49 +0200)]
vici: With start_action=start, terminate IKE_SA without children on unload

This includes IKE_SAs in CONNECTING state, which not yet have any

Closes strongswan/strongswan#175.

3 months agoeap-radius: Small spelling fix
Boris Vanhoof [Sat, 27 Jun 2020 08:32:19 +0000 (10:32 +0200)]
eap-radius: Small spelling fix

Closes strongswan/strongswan#174.

3 months agotesting: Skip tests with missing files, don't abort the test run
Tobias Brunner [Tue, 23 Jun 2020 14:24:18 +0000 (16:24 +0200)]
testing: Skip tests with missing files, don't abort the test run

This allows simple test configs in testing/tests/local that are no
actual test cases.

3 months agoVersion bump to 5.9.0dr2 5.9.0dr2
Andreas Steffen [Sun, 14 Jun 2020 10:15:44 +0000 (12:15 +0200)]
Version bump to 5.9.0dr2

3 months agotesting: Fix SQL scenarios after preferring AEAD for ESP
Tobias Brunner [Fri, 5 Jun 2020 13:54:15 +0000 (15:54 +0200)]
testing: Fix SQL scenarios after preferring AEAD for ESP

sql/net2net-route|start-pem seem to be the only ones that configure a
proposal via database.

3 months agotesting: Fix ikev2/net2net-fragmentation scenario
Tobias Brunner [Fri, 5 Jun 2020 13:46:49 +0000 (15:46 +0200)]
testing: Fix ikev2/net2net-fragmentation scenario

The IKE_AUTH message from moon is now larger because of the AEAD proposal.

3 months agoike: Send AEAD ESP default proposal first
Tobias Brunner [Fri, 5 Jun 2020 09:12:06 +0000 (11:12 +0200)]
ike: Send AEAD ESP default proposal first

We generally prefer AEAD nowadays.

References #3461.

3 months agoproposal: Add AES-GCM to the ESP default AEAD proposal
Tobias Brunner [Fri, 5 Jun 2020 09:01:29 +0000 (11:01 +0200)]
proposal: Add AES-GCM to the ESP default AEAD proposal

References #3461.

3 months agoikev2: Ensure ALERT_RETRANSMIT_SEND_CLEARED is triggered
Tobias Brunner [Fri, 29 May 2020 12:58:36 +0000 (14:58 +0200)]
ikev2: Ensure ALERT_RETRANSMIT_SEND_CLEARED is triggered

If a MOBIKE task is deferred, the retransmission counter is reset to 0
when reinitiating.  So if there were retransmits before, this alert would
not be triggered if a response is received now without retransmits.

3 months agotravis: Don't pipe negative result into jq
Tobias Brunner [Thu, 11 Jun 2020 08:29:11 +0000 (10:29 +0200)]
travis: Don't pipe negative result into jq

The data might not be valid JSON.

3 months agoikev1: Ensure local IP is known as identity fallback during Main Mode
Tobias Brunner [Mon, 8 Jun 2020 15:13:50 +0000 (17:13 +0200)]
ikev1: Ensure local IP is known as identity fallback during Main Mode

We usually have a local IP already via ike_sa_t::resolve_hosts() before
build_i() is called but if that's not the case, it's more likely we have
one after we processed the first response (it might also have changed).
There is a potential chance we still don't have one if the socket API
doesn't provide us with the destination address of received messages,
but that seems not very likely nowadays.

3 months agoVersion bump to 5.9.0dr1 5.9.0dr1
Andreas Steffen [Sat, 6 Jun 2020 13:02:42 +0000 (15:02 +0200)]
Version bump to 5.9.0dr1

3 months agochild-create: Don't reset DH group when retrying after INVALID_KE_PAYLOAD
Tobias Brunner [Fri, 5 Jun 2020 14:41:23 +0000 (16:41 +0200)]
child-create: Don't reset DH group when retrying after INVALID_KE_PAYLOAD

migrate() is called before retrying.

Fixes: 0184a69b7b14 ("child-create: Properly handle DH group during
migration when reestablishing")

3 months agoikev1: Fix PSK lookup for Main Mode initiators
Tobias Brunner [Fri, 5 Jun 2020 12:07:43 +0000 (14:07 +0200)]
ikev1: Fix PSK lookup for Main Mode initiators

We need the PSK/identity already when deriving the keys in process_i().

Fixes: 1665a4e0504f ("ikev1: Use actual local identity as initiator or aggressive mode responder")

3 months agoike: Fix retransmission timeouts if base is <= 1
Tobias Brunner [Fri, 5 Jun 2020 11:43:11 +0000 (13:43 +0200)]
ike: Fix retransmission timeouts if base is <= 1

Fixes: 72b282cf202d ("ike: Properly support high number of retransmission tries")

3 months agoandroid: New release after improving connectivity/scheduling
Tobias Brunner [Tue, 2 Jun 2020 12:55:58 +0000 (14:55 +0200)]
android: New release after improving connectivity/scheduling

3 months agotravis: Add build of the Android app
Tobias Brunner [Thu, 14 May 2020 16:14:59 +0000 (18:14 +0200)]
travis: Add build of the Android app

3 months agoandroid: Suppress linting error in manifest related to cert import activity
Tobias Brunner [Thu, 14 May 2020 13:55:36 +0000 (15:55 +0200)]
android: Suppress linting error in manifest related to cert import activity

<data> tags that only specify the mimeType attribute are perfectly fine
according to the docs.

3 months agoandroid: Ignore some missing quantity lint errors
Tobias Brunner [Thu, 14 May 2020 12:47:26 +0000 (14:47 +0200)]
android: Ignore some missing quantity lint errors

Once these strings are translated and the quantities are defined, this
attribute can be removed again.

3 months agoandroid: Mock parseInetAddress() method to fix unit tests
Tobias Brunner [Wed, 13 May 2020 14:02:08 +0000 (16:02 +0200)]
android: Mock parseInetAddress() method to fix unit tests

The native parseInetAddressBytes() method called by that method is not
available when running the tests.

Not very pretty and there are some warnings because PowerMock does
reflection in some illegal way but it fixes the unit tests and does
not require any new dependencies like Apache Commons or Guava just to
parse IP addresses without DNS lookup.

Fixes: 2ef473be1532 ("android: Use helper to parse IP addresses where appropriate")
Fixes #3443.

3 months agoMerge branch 'android-scheduler'
Tobias Brunner [Tue, 2 Jun 2020 12:18:42 +0000 (14:18 +0200)]
Merge branch 'android-scheduler'

Starting with Android 6, the system will aggressively suspend apps when
the device is idle (Doze mode).  With Android 10 on a Pixel 4 this seems
to happen after about 70 minutes.  Then the scheduler thread in our
default scheduler is only woken rarely, combined with our previous use
of the monotonic clock it meant that events were executed with severe
delays and noticing that there was such a delay.  This was particularly
bad in regards to NAT keepalives as it usually meant that the device was
not reachable anymore from the outside.

Some changes here try to improve that situation, e.g. the clock is switched
to CLOCK_REALTIME (Bionic doesn't support CLOCK_BOOTTIME for condvars) so we
can measure the actual difference e.g. since the last outbound message,
other changes try to ensure that connectivity is restored after being asleep
for a while (send DPD instead of keepalive after a long delay, send DPD even
if path to peer stays the same).

However, the most significant change is the replacement of the default
scheduler with one specifically designed for Android.  It schedules
long-term events via AlarmManager, which allows waking up the app even
if the system put it to sleep.  The latter requires adding the app to the
system's battery optimization whitelist, which is requested from the
user automatically if necessary.  With this, NAT keepalives and rekeyings
are now scheduled accurately, with little changes to the battery usage.
If the app is not whitelisted (there is a setting to ignore this), events
are delayed by up to 15 minutes after about 70 minutes, so behind a NAT
the device won't be reachable from the outside afterwards (connectivity
should be restored as soon as the device is woken from deep sleep by the

Fixes #3364.

3 months agoandroid: Add a preference flag to ignore battery optimizations
Tobias Brunner [Mon, 11 May 2020 13:49:22 +0000 (15:49 +0200)]
android: Add a preference flag to ignore battery optimizations

This allows users to ignore whether the app is on the device's power
whitelist without a warning.  The flag is currently not set
automatically if the user denies the request.

3 months agoandroid: Increase lifetimes a bit
Tobias Brunner [Fri, 8 May 2020 12:33:05 +0000 (14:33 +0200)]
android: Increase lifetimes a bit

This should avoid clashes of soft and hard lifetimes even if the app is
not whitelisted.

3 months agoandroid: Ask user to add our app to the device's power whitelist
Tobias Brunner [Fri, 8 May 2020 10:17:52 +0000 (12:17 +0200)]
android: Ask user to add our app to the device's power whitelist

This is necessary so we can actually schedule events accurately in Doze
mode. Otherwise, we'd only get woken in intervals of several minutes (up to
15 according to the docs) after about an hour.

3 months agoandroid: Use the default scheduler for short-term events
Tobias Brunner [Sat, 2 May 2020 07:20:59 +0000 (09:20 +0200)]
android: Use the default scheduler for short-term events

Using AlarmManager has quite some overhead, so we use our regular
scheduler for events that are to be executed in the near future.

3 months agoandroid: Use Android-specific scheduler on Android 6 and later
Tobias Brunner [Fri, 1 May 2020 09:15:38 +0000 (11:15 +0200)]
android: Use Android-specific scheduler on Android 6 and later

3 months agoandroid: Add Android-specific implementation of scheduler_t
Tobias Brunner [Thu, 30 Apr 2020 16:55:23 +0000 (18:55 +0200)]
android: Add Android-specific implementation of scheduler_t

This uses AlarmManager to schedule events in a way that ensures the app
is woken up (requires whitelisting when in Doze mode to be woken up at
the exact time, otherwise there are delays of up to 15 minutes).

3 months agoscheduler: Use timercmp(3) instead of a custom function
Tobias Brunner [Fri, 27 Mar 2020 14:34:32 +0000 (15:34 +0100)]
scheduler: Use timercmp(3) instead of a custom function

3 months agoike: Only track actually sent retransmits as outbound packets
Tobias Brunner [Thu, 30 Apr 2020 15:42:07 +0000 (17:42 +0200)]
ike: Only track actually sent retransmits as outbound packets

Retransmission jobs for old requests for which we already received a
response previously left the impression that messages were sent more
recently than was actually the case.

task_manager_t always defined INVALID_STATE as possible return value if
no retransmit was sent, this just was never actually returned.

I guess we could further differentiate between actual invalid states
(e.g. if we already received the response) and when we don't send a
retransmit for other reasons e.g. because the IKE_SA became stale.

3 months agoandroid: Change how initial log handler is registered
Tobias Brunner [Tue, 31 Mar 2020 12:56:38 +0000 (14:56 +0200)]
android: Change how initial log handler is registered

Previously, if the two utility functions were called while the VPN
connection was established (i.e. charon was initialized) the logger for
libstrongswan would get reset to the initial log handler.  So certain
log messages would not get logged to the log file after the TUN device
was created (one of the helpers is used to convert IPs there).

3 months agoandroid: Check the current path using DPD after a roaming event
Tobias Brunner [Thu, 19 Mar 2020 15:08:07 +0000 (16:08 +0100)]
android: Check the current path using DPD after a roaming event

A new NAT mapping might be created even if the IP stays the same.  Due to
the DPD fallback with NAT keep-alives this might only be necessary in
corner cases, if at all.

3 months agoike: Optionally use DPD to check if the current path still works
Tobias Brunner [Thu, 19 Mar 2020 15:04:01 +0000 (16:04 +0100)]
ike: Optionally use DPD to check if the current path still works

We could maybe check the duration of the last stale condition or when
the last packet was sent as filter to avoid unnecessary updates.

3 months agoandroid: Enable switch from NAT interval to DPDs after 20 seconds
Tobias Brunner [Thu, 19 Mar 2020 12:48:31 +0000 (13:48 +0100)]
android: Enable switch from NAT interval to DPDs after 20 seconds

3 months agoike: Add an option to trigger a DPD instead of a NAT keepalive
Tobias Brunner [Thu, 19 Mar 2020 12:39:48 +0000 (13:39 +0100)]
ike: Add an option to trigger a DPD instead of a NAT keepalive

This is useful on Android where the app might not be able to send
keep-alives if the device is asleep for a while.  If the NAT mapping
has been deleted in the mean time, the NAT-D payloads allow detecting
this and connectivity can be restored by doing a MOBIKE update or
recreating the SA if the peer already deleted it because the client
wasn't reachable.

3 months agoandroid: Switch to CLOCK_REALTIME on Android
Tobias Brunner [Thu, 19 Mar 2020 13:22:56 +0000 (14:22 +0100)]
android: Switch to CLOCK_REALTIME on Android

This allows measuring the delay between events more accurately if a
device is often suspended.

While CLOCK_BOOTTIME would be preferable, Android's bionic C library
does not support it for condvars.