<feed xmlns='http://www.w3.org/2005/Atom'>
<title>vyos-1x.git/src/tests, branch fix/T8859-dh-keysize-validation</title>
<subtitle>VyOS command definitions, scripts, and utilities (mirror of https://github.com/vyos/vyos-1x.git)
</subtitle>
<id>https://git.amelek.net/vyos/vyos-1x.git/atom?h=fix%2FT8859-dh-keysize-validation</id>
<link rel='self' href='https://git.amelek.net/vyos/vyos-1x.git/atom?h=fix%2FT8859-dh-keysize-validation'/>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/'/>
<updated>2026-09-26T17:09:05+00:00</updated>
<entry>
<title>python: T8859: fail loudly on an invalid Diffie-Hellman keysize argument</title>
<updated>2026-09-26T17:09:05+00:00</updated>
<author>
<name>Yuriy Andamasov</name>
<email>yuriy@vyos.io</email>
</author>
<published>2026-09-26T16:58:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=d497c3b7a7504bb578874cc706dc75849ad84c2d'/>
<id>urn:sha1:d497c3b7a7504bb578874cc706dc75849ad84c2d</id>
<content type='text'>
The Diffie-Hellman length check stringified the requested minimum keysize
into a variable it never used, then converted the original argument again
for the comparison. A non-numeric value therefore escaped as an uncaught
ValueError from the comparison rather than being reported where it was
passed in.

The argument is now typed and validated up front: a non-integer raises
TypeError, booleans included, and a non-positive integer raises
ValueError. Both indicate a logic error in the calling script and should
fail loudly instead of silently reporting an undersized key. The only
callers today are the unit tests, so the contract is free to change.

A file that exists but holds no readable parameters is user input rather
than a logic error, and now fails the check instead of propagating the
error from openssl.

The bit-count pattern becomes a raw string, and the tests pass integer
keysizes and cover the new paths.
</content>
</entry>
<entry>
<title>Merge pull request #5466 from rnavarro/fix/configtree-serialize-libvyosconfig</title>
<updated>2026-09-22T14:18:00+00:00</updated>
<author>
<name>Christian Breunig</name>
<email>christian@breunig.cc</email>
</author>
<published>2026-09-22T14:18:00+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=2b06da194c61091511a6eaf995b5186a919a4a7b'/>
<id>urn:sha1:2b06da194c61091511a6eaf995b5186a919a4a7b</id>
<content type='text'>
configtree: T9307: serialize libvyosconfig calls across threads</content>
</entry>
<entry>
<title>Merge pull request #5429 from rockfish-vyos/T9254-ike-esn</title>
<updated>2026-09-15T12:48:01+00:00</updated>
<author>
<name>Daniil Baturin</name>
<email>daniil@vyos.io</email>
</author>
<published>2026-09-15T12:48:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=f5aec62f3d48f091b07c61d4666d824748a27c96'/>
<id>urn:sha1:f5aec62f3d48f091b07c61d4666d824748a27c96</id>
<content type='text'>
ipsec: T9254: do not emit ESN transforms in IKE proposals</content>
</entry>
<entry>
<title>ipsec: T9254: split get_esp_ike_cipher() into get_esp_cipher() / get_ike_cipher()</title>
<updated>2026-09-14T08:19:12+00:00</updated>
<author>
<name>rockfish-vyos</name>
<email>321823801+rockfish-vyos@users.noreply.github.com</email>
</author>
<published>2026-09-14T08:17:41+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=0db7521a96f3d314ec4914c72932cfbcced2dc98'/>
<id>urn:sha1:0db7521a96f3d314ec4914c72932cfbcced2dc98</id>
<content type='text'>
get_esp_ike_cipher() took an esn flag defaulting to True (ESP/CHILD_SA
semantics), and every IKE_SA call site had to remember to pass
esn=False. Nothing enforced that, so a future call site could reintroduce
the ESN-in-IKE bug this task fixed.

Following review feedback from hedrok, split it into two public filters:

  get_esp_cipher(group_config, ike_group=None)  ESP/CHILD_SA, esn=True
  get_ike_cipher(group_config)                  IKE_SA, esn=False always

The shared implementation moves to _get_esp_ike_cipher() (no
register_filter), so a template can no longer call it directly and
skip picking one of the two entry points.

Updated call sites: peer.j2, profile.j2, remote_access.j2, l2tp.j2
(proposals -&gt; get_ike_cipher, esp_proposals -&gt; get_esp_cipher), and
test_template.py.
</content>
</entry>
<entry>
<title>openvpn: T8264: reject the raw options DCO cannot serve</title>
<updated>2026-09-13T19:06:12+00:00</updated>
<author>
<name>Antonio Quartulli</name>
<email>antonio@mandelbit.com</email>
</author>
<published>2026-09-02T23:46:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=043992126c638940d26ee075de84d8d457bd446d'/>
<id>urn:sha1:043992126c638940d26ee075de84d8d457bd446d</id>
<content type='text'>
Raw options are appended after --config and therefore override what the CLI
rendered, so they have to face the same checks. A single cipher the Kernel
module does not implement makes OpenVPN fall back to the userspace data path;
"ncp-ciphers" is the 2.4 name for the negotiation list, and outside server and
pull mode "cipher" becomes the fallback cipher. "dev-type" other than tun, an
AF_UNIX "dev-node" and, in server mode, a "topology" other than subnet drop
the offload just the same.

"DEFAULT" stands for the built-in list, which OpenVPN expands to AEAD ciphers
alone before it weighs the offload, and the migration drops the offload from
whatever stays rejected.
</content>
</entry>
<entry>
<title>openvpn: T8264: keep the keepalive within what OpenVPN accepts</title>
<updated>2026-09-13T19:06:12+00:00</updated>
<author>
<name>Antonio Quartulli</name>
<email>antonio@mandelbit.com</email>
</author>
<published>2026-08-31T23:28:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=2985a69d02e01c2642ce70dda9bf81051ee99095'/>
<id>urn:sha1:2985a69d02e01c2642ce70dda9bf81051ee99095</id>
<content type='text'>
The CLI renders "keepalive &lt;interval&gt; &lt;interval * failure-count&gt;" while its
two ranges are independent, so it can produce parameters the daemon refuses
to start on: a timeout below twice the interval, or one beyond the 12 hours
OpenVPN is about to cap ping and keepalive at.

A zero interval renders "keepalive 0 0", on which OpenVPN skips these checks
and simply runs without keepalive, so leave that combination alone.

Migrate what stays rejected, or an upgrade would leave a configuration the
router can no longer commit at boot.
</content>
</entry>
<entry>
<title>openvpn: T8264: migrate away DCO the Kernel module cannot serve</title>
<updated>2026-09-13T19:06:12+00:00</updated>
<author>
<name>Antonio Quartulli</name>
<email>antonio@mandelbit.com</email>
</author>
<published>2026-08-30T17:43:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=585c491b3ee5c02a0367bf2bd752fe4510200c6a'/>
<id>urn:sha1:585c491b3ee5c02a0367bf2bd752fe4510200c6a</id>
<content type='text'>
"offload dco" was accepted next to tap, static keys, compression, CBC
ciphers and raw options OpenVPN refuses to offload, because 2.6 ignored the
module altogether. Those combinations now fail verify(), which would break
config load on upgrade, so drop the request instead.

The migration has to mirror verify_dco() exactly: anything it keeps that
verify() turns away leaves a router unable to commit its own configuration.
</content>
</entry>
<entry>
<title>configtree: T9307: serialize libvyosconfig calls across threads</title>
<updated>2026-09-13T03:40:37+00:00</updated>
<author>
<name>Robert Navarro</name>
<email>crshman@gmail.com</email>
</author>
<published>2026-09-13T01:04:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=387372db10ef8e63aa2171f1e4d3721aa1cc6cdb'/>
<id>urn:sha1:387372db10ef8e63aa2171f1e4d3721aa1cc6cdb</id>
<content type='text'>
libvyosconfig is not safe for concurrent entry. ctypes releases the GIL
for each foreign call, so threads in one process can be inside the
library at the same time; two concurrent from_string calls, or
from_string racing destroy, corrupt the shared parser state and
crash the process with SIGSEGV. vyos-http-api reaches this when a
configure operation runs in the threadpool while a retrieve is served
on the event loop.

Serialize every entry point on one process-wide RLock in the _Lib
wrapper. For the entry points that report through the library's global
error buffer, read the buffer while the lock is held and keep it per
thread, so get_error() returns the caller's own error; destroy, which
can run from __del__ between a failed call and get_error(), leaves it
untouched.
</content>
</entry>
<entry>
<title>Merge pull request #5454 from c-po/bond-fix-add-member</title>
<updated>2026-09-10T15:26:11+00:00</updated>
<author>
<name>Christian Breunig</name>
<email>christian@breunig.cc</email>
</author>
<published>2026-09-10T15:26:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=148dd2b2f5ac5f0cd3671650aa11100fc293b588'/>
<id>urn:sha1:148dd2b2f5ac5f0cd3671650aa11100fc293b588</id>
<content type='text'>
bond: T9269: keep the bond MAC when appending a member interface</content>
</entry>
<entry>
<title>configdict: T9269: no phantom removal when a multi node gains a value</title>
<updated>2026-09-10T15:23:50+00:00</updated>
<author>
<name>Christian Breunig</name>
<email>christian@breunig.cc</email>
</author>
<published>2026-09-09T20:31:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=aa3f1c548198a1110d67385f19ccc910c5c48be8'/>
<id>urn:sha1:aa3f1c548198a1110d67385f19ccc910c5c48be8</id>
<content type='text'>
A multi node with a single value is a plain string in the JSON rendering
of the config tree, and only becomes a list once it holds several values.
leaf_node_changed() tested for a string before diffing the lists, so
appending a value reported the already configured one as gone.

Adding a second bond member thus produced an "interface_remove" entry for
the first, and BondIf.update() released it right after enslaving the new
one, leaving the bond with the new member only.

Normalize to a list and reuse list_diff(). Only the string to list append
changes, from [old] to []. interface.py was immune as it re-applies
list_diff() to address_old, protocols_static_arp.py was not.
</content>
</entry>
</feed>
