From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.haj.ipfire.org (localhost [127.0.0.1]) by mail02.haj.ipfire.org (Postfix) with ESMTP id 4ZypqZ0k9tz33BP for ; Thu, 15 May 2025 12:07:22 +0000 (UTC) Received: from mail01.ipfire.org (mail01.haj.ipfire.org [172.28.1.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) client-signature RSA-PSS (4096 bits)) (Client CN "mail01.haj.ipfire.org", Issuer "R10" (verified OK)) by mail02.haj.ipfire.org (Postfix) with ESMTPS id 4ZypqV4Mq6z2yHY for ; Thu, 15 May 2025 12:07:18 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mail01.ipfire.org (Postfix) with ESMTPSA id 4ZypqT4xYcz2Rc; Thu, 15 May 2025 12:07:17 +0000 (UTC) DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=ipfire.org; s=202003ed25519; t=1747310837; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fxH4F5nlEy/cKsxbswDsWqGlhfgW97IpBixh8nP9wyQ=; b=UzZ7o3mXertcoT94dWvgDqTs2tuHz+QIH9rMzqEUdzOXBajDdm1FXMUnv+N203L5GDhAyb igxGcnPHuS8wbODA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ipfire.org; s=202003rsa; t=1747310837; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fxH4F5nlEy/cKsxbswDsWqGlhfgW97IpBixh8nP9wyQ=; b=ivDeqsimJPP+dmmDI8+0vvfz49jkwXJBDU8Br754KW50J+hzWct0PF6eRyQHD0SS4wUcFy WikAKTJ2ANDI8QSasNMRQm6LYGTKINvJedUO7gxK9OfewH/iOq8fcIKHK1+BQrm6+ZYU+F CR336/U9m2aHeVKuCf8hjQHzHYSwaFqEQS4yzd1KyHWkbErmgFXgGsHF4Ilr7s4v3PAmTv BuFVh3q7f22HUhx78G048ZDVtUQagQXUkLtzHasBmY3pN9UwawNyw0ODIJj0lMyxebXs5j VSCVve6j0tNCfhLsaS6n6gBKRMANyKxkw+okhsrfu8kIidNqWILSlDtlZjtdng== Date: Thu, 15 May 2025 13:07:18 +0100 From: Adam Gibbons To: development@lists.ipfire.org, Adolf Belka , =?ISO-8859-1?Q?Peter_M=FCller?= CC: "IPFire: Development-List" Subject: =?US-ASCII?Q?Re=3A_=5BPATCH_1/2=5D_vpnmain=2Ecgi=3A_Use_ML-?= =?US-ASCII?Q?KEM_only_as_a_hybrid_with_Curve_25519?= In-Reply-To: <3a6eb02b-c613-4d2f-96f2-ff863c32989b@ipfire.org> References: <8baae50f-cf7b-4af0-81ec-89d898966993@ipfire.org> <3a6eb02b-c613-4d2f-96f2-ff863c32989b@ipfire.org> Message-ID: Precedence: list List-Id: List-Subscribe: , List-Unsubscribe: , List-Post: List-Help: Sender: Mail-Followup-To: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary=----UYM7KGJ0XMNUIYAOAOPYWEPBZWG1UX Content-Transfer-Encoding: 7bit ------UYM7KGJ0XMNUIYAOAOPYWEPBZWG1UX Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Peter and Adolf=2E I agree, it's very good to see Peter on the list again :) Adam=2E On 15 May 2025 09:16:25 BST, Adolf Belka wrot= e: >Hallo Peter, > >Good to see you on the list again :+1: > >This patch sounds a good approach to take=2E > >Adolf=2E > >On 15/05/2025 10:06, Peter M=C3=BCller wrote: >> In commit 887778e0888d51eb9942ae310a43f6d2813efad3, the post-quantum >> key exchange algorithm ML-KEM was introduced, due to its support being >> added in strongSwan 6=2E0=2E However, using PQC key exchanges is common= ly >> recommended only in conjunction with a traditional one, to avoid >> encrypted traffic becoming subject to trivial decryption in case a PQC >> algorithm proves weak, broken, or backdoored=2E OpenSSH, for instance, >> combines ML-KEM 768 with Curve 25519 (mlkem768x25519-sha256), rather >> than using ML-KEM alone=2E >>=20 >> This patch changes the chipher suites offered for IPsec connections to >> always use ML-KEM as a hybrid with Curve 25519=2E This is possible due = to >> strongSwan 6=2E0 having added support for IKE intermediary key exchange= s >> (RFC 9370); see https://docs=2Estrongswan=2Eorg/docs/latest/config/prop= osals=2Ehtml#_key_exchange_methods >> for additional information=2E >>=20 >> We can reasonably assume an IPsec peer supporting ML-KEM will also >> support Curve 25519, as this has been around for much longer, and is >> used quite commonly=2E Even if this is not the case, or if the IPsec pe= er >> does not implement RFC 9370, any IPsec connection using our default >> cipher selection will fall back to Curve 448, Curve 25519, or other, >> hence continue working=2E >>=20 >> IPsec connections already created will need their ciphers to be changed >> once during the Core Update routine where this patch will be >> incorporated=2E >>=20 >> Tested-by: Peter M=C3=BCller >> Signed-off-by: Peter M=C3=BCller >> --- >> html/cgi-bin/vpnmain=2Ecgi | 36 ++++++++++++++++++------------------ >> 1 file changed, 18 insertions(+), 18 deletions(-) >>=20 >> diff --git a/html/cgi-bin/vpnmain=2Ecgi b/html/cgi-bin/vpnmain=2Ecgi >> index 4f81fecdf=2E=2E154b94033 100644 >> --- a/html/cgi-bin/vpnmain=2Ecgi >> +++ b/html/cgi-bin/vpnmain=2Ecgi >> @@ -2374,11 +2374,11 @@ END >> #use default advanced value >> $cgiparams{'IKE_ENCRYPTION'} =3D 'chacha20poly1305|aes256gcm128|aes= 256'; #[18]; >> $cgiparams{'IKE_INTEGRITY'} =3D 'sha2_512|sha2_256'; #[19]; >> - $cgiparams{'IKE_GROUPTYPE'} =3D 'mlkem1024|mlkem768|mlkem= 512|curve448|curve25519|e521|e384|4096|3072'; #[20]; >> + $cgiparams{'IKE_GROUPTYPE'} =3D 'x25519-ke1_mlkem1024|x25= 519-ke1_mlkem768|x25519-ke1_mlkem512|curve448|curve25519|e521|e384|4096|307= 2'; #[20]; >> $cgiparams{'IKE_LIFETIME'} =3D '3'; #[16]; >> $cgiparams{'ESP_ENCRYPTION'} =3D 'chacha20poly1305|aes256gcm128|aes= 256'; #[21]; >> $cgiparams{'ESP_INTEGRITY'} =3D 'sha2_512|sha2_256'; #[22]; >> - $cgiparams{'ESP_GROUPTYPE'} =3D 'mlkem1024|mlkem768|mlkem= 512|curve448|curve25519|e521|e384|4096|3072'; #[23]; >> + $cgiparams{'ESP_GROUPTYPE'} =3D 'x25519-ke1_mlkem1024|x25= 519-ke1_mlkem768|x25519-ke1_mlkem512|curve448|curve25519|e521|e384|4096|307= 2'; #[23]; >> $cgiparams{'ESP_KEYLIFE'} =3D '1'; #[17]; >> $cgiparams{'COMPRESSION'} =3D 'off'; #[13]; >> $cgiparams{'ONLY_PROPOSED'} =3D 'on'; #[24]; >> @@ -2759,7 +2759,7 @@ if(($cgiparams{'ACTION'} eq $Lang::tr{'advanced'}= ) || >> goto ADVANCED_ERROR; >> } >> foreach my $val (@temp) { >> - if ($val !~ /^(mlkem(1024|768|512)|curve448|curve25519|e521|e384|e2= 56|e224|e192|e512bp|e384bp|e256bp|e224bp|768|1024|1536|2048|3072|4096|6144|= 8192)$/) { >> + if ($val !~ /^(x25519-ke1_mlkem(1024|768|512)|curve448|curve25519|e= 521|e384|e256|e224|e192|e512bp|e384bp|e256bp|e224bp|768|1024|1536|2048|3072= |4096|6144|8192)$/) { >> $errormessage =3D $Lang::tr{'invalid input'}; >> goto ADVANCED_ERROR; >> } >> @@ -2800,7 +2800,7 @@ if(($cgiparams{'ACTION'} eq $Lang::tr{'advanced'}= ) || >> goto ADVANCED_ERROR; >> } >> foreach my $val (@temp) { >> - if ($val !~ /^(mlkem(1024|768|512)|curve448|curve25519|e521|e384|e2= 56|e224|e192|e512bp|e384bp|e256bp|e224bp|768|1024|1536|2048|3072|4096|6144|= 8192|none)$/) { >> + if ($val !~ /^(x25519-ke1_mlkem(1024|768|512)|curve448|curve25519|e= 521|e384|e256|e224|e192|e512bp|e384bp|e256bp|e224bp|768|1024|1536|2048|3072= |4096|6144|8192|none)$/) { >> $errormessage =3D $Lang::tr{'invalid input'}; >> goto ADVANCED_ERROR; >> } >> @@ -2940,9 +2940,9 @@ if(($cgiparams{'ACTION'} eq $Lang::tr{'advanced'}= ) || >> $checked{'IKE_INTEGRITY'}{'aesxcbc'} =3D ''; >> @temp =3D split('\|', $cgiparams{'IKE_INTEGRITY'}); >> foreach my $key (@temp) {$checked{'IKE_INTEGRITY'}{$key} =3D "select= ed=3D'selected'"; } >> - $checked{'IKE_GROUPTYPE'}{'mlkem1024'} =3D ''; >> - $checked{'IKE_GROUPTYPE'}{'mlkem768'} =3D ''; >> - $checked{'IKE_GROUPTYPE'}{'mlkem512'} =3D ''; >> + $checked{'IKE_GROUPTYPE'}{'x25519-ke1_mlkem1024'} =3D ''; >> + $checked{'IKE_GROUPTYPE'}{'x25519-ke1_mlkem768'} =3D ''; >> + $checked{'IKE_GROUPTYPE'}{'x25519-ke1_mlkem512'} =3D ''; >> $checked{'IKE_GROUPTYPE'}{'curve448'} =3D ''; >> $checked{'IKE_GROUPTYPE'}{'curve25519'} =3D ''; >> $checked{'IKE_GROUPTYPE'}{'768'} =3D ''; >> @@ -2983,9 +2983,9 @@ if(($cgiparams{'ACTION'} eq $Lang::tr{'advanced'}= ) || >> $checked{'ESP_INTEGRITY'}{'aesxcbc'} =3D ''; >> @temp =3D split('\|', $cgiparams{'ESP_INTEGRITY'}); >> foreach my $key (@temp) {$checked{'ESP_INTEGRITY'}{$key} =3D "select= ed=3D'selected'"; } >> - $checked{'ESP_GROUPTYPE'}{'mlkem1024'} =3D ''; >> - $checked{'ESP_GROUPTYPE'}{'mlkem768'} =3D ''; >> - $checked{'ESP_GROUPTYPE'}{'mlkem512'} =3D ''; >> + $checked{'ESP_GROUPTYPE'}{'x25519-ke1_mlkem1024'} =3D ''; >> + $checked{'ESP_GROUPTYPE'}{'x25519-ke1_mlkem768'} =3D ''; >> + $checked{'ESP_GROUPTYPE'}{'x25519-ke1_mlkem512'} =3D ''; >> $checked{'ESP_GROUPTYPE'}{'curve448'} =3D ''; >> $checked{'ESP_GROUPTYPE'}{'curve25519'} =3D ''; >> $checked{'ESP_GROUPTYPE'}{'768'} =3D ''; >> @@ -3151,9 +3151,9 @@ if(($cgiparams{'ACTION'} eq $Lang::tr{'advanced'}= ) || >> $Lang::tr{'grouptype'} >> >> >> - >> - >> - >> + >> + >> + >> >> >> >> @@ -3757,7 +3757,7 @@ sub make_algos($$$$$) { >> if ($mode eq "ike") { >> push(@algo, $int); >> - if ($grp =3D~ m/^mlkem(\d+)$/) { >> + if ($grp =3D~ m/^x25519-ke1_mlkem(\d+)$/) { >> push(@algo, "$grp"); >> } elsif ($grp =3D~ m/^e(=2E*)$/) { >> push(@algo, "ecp$1"); >> @@ -3776,7 +3776,7 @@ sub make_algos($$$$$) { >> if (!$pfs || $grp eq "none") { >> # noop >> - } elsif ($grp =3D~ m/^mlkem(\d+)$/) { >> + } elsif ($grp =3D~ m/^x25519-ke1_mlkem(\d+)$/) { >> push(@algo, "$grp"); >> } elsif ($grp =3D~ m/^e(=2E*)$/) { >> push(@algo, "ecp$1"); > > ------UYM7KGJ0XMNUIYAOAOPYWEPBZWG1UX Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable
Hi Peter and Adolf=2E

I a= gree, it's very good to see Peter on the list again :)

Adam=2E
=

On 15 May 2025 09:16:2= 5 BST, Adolf Belka <adolf=2Ebelka@ipfire=2Eorg> wrote:
Hallo Peter,

Good to see yo= u on the list again :+1:

This patch sounds a good approach to take= =2E

Adolf=2E

On 15/05/2025 10:06, Peter M=C3=BCller wrote:
I= n commit 887778e0888d51eb9942ae310a43f6d2813efad3, the post-quantum
key = exchange algorithm ML-KEM was introduced, due to its support being
added= in strongSwan 6=2E0=2E However, using PQC key exchanges is commonly
rec= ommended only in conjunction with a traditional one, to avoid
encrypted = traffic becoming subject to trivial decryption in case a PQC
algorithm p= roves weak, broken, or backdoored=2E OpenSSH, for instance,
combines ML-= KEM 768 with Curve 25519 (mlkem768x25519-sha256), rather
than using ML-K= EM alone=2E

This patch changes the chipher suites offered for IPsec = connections to
always use ML-KEM as a hybrid with Curve 25519=2E This is= possible due to
strongSwan 6=2E0 having added support for IKE intermedi= ary key exchanges
(RFC 9370); see https://d= ocs=2Estrongswan=2Eorg/docs/latest/config/proposals=2Ehtml#_key_exchange_me= thods
for additional information=2E

We can reasonably assume = an IPsec peer supporting ML-KEM will also
support Curve 25519, as this h= as been around for much longer, and is
used quite commonly=2E Even if th= is is not the case, or if the IPsec peer
does not implement RFC 9370, an= y IPsec connection using our default
cipher selection will fall back to = Curve 448, Curve 25519, or other,
hence continue working=2E

IPsec= connections already created will need their ciphers to be changed
once = during the Core Update routine where this patch will be
incorporated=2E<= br>
Tested-by: Peter M=C3=BCller <peter=2Emueller@ipfire=2Eorg>Signed-off-by: Peter M=C3=BCller <peter=2Emueller@ipfire=2Eorg>
= html/cgi-bin/vpnmain=2Ecgi | 36 ++++++++++++++++++------------------
= 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/html/= cgi-bin/vpnmain=2Ecgi b/html/cgi-bin/vpnmain=2Ecgi
index 4f81fecdf=2E=2E= 154b94033 100644
--- a/html/cgi-bin/vpnmain=2Ecgi
+++ b/html/cgi-bin/= vpnmain=2Ecgi
@@ -2374,11 +2374,11 @@ END
#use default advanced va= lue
$cgiparams{'IKE_ENCRYPTION'} =3D 'chacha20poly1305|aes256gcm128|= aes256'; #[18];
$cgiparams{'IKE_INTEGRITY'} =3D 'sha2_512|sha2_256';= #[19];
- $cgiparams{'IKE_GROUPTYPE'} =3D 'mlkem1024|mlkem76= 8|mlkem512|curve448|curve25519|e521|e384|4096|3072'; #[20];
+ $cgiparams= {'IKE_GROUPTYPE'} =3D 'x25519-ke1_mlkem1024|x25519-ke1_mlkem768= |x25519-ke1_mlkem512|curve448|curve25519|e521|e384|4096|3072'; #[20];
= $cgiparams{'IKE_LIFETIME'} =3D '3'; #[16];
$cgiparams{'ESP_ENCRYPTI= ON'} =3D 'chacha20poly1305|aes256gcm128|aes256'; #[21];
$cgiparams{'= ESP_INTEGRITY'} =3D 'sha2_512|sha2_256'; #[22];
- $cgiparams{'ESP_GROUP= TYPE'} =3D 'mlkem1024|mlkem768|mlkem512|curve448|curve25519|e52= 1|e384|4096|3072'; #[23];
+ $cgiparams{'ESP_GROUPTYPE'} =3D = 'x25519-ke1_mlkem1024|x25519-ke1_mlkem768|x25519-ke1_mlkem512|curve448|curv= e25519|e521|e384|4096|3072'; #[23];
$cgiparams{'ESP_KEYLIFE'} =3D '1= '; #[17];
$cgiparams{'COMPRESSION'} =3D 'off'; #[13];
$cgipara= ms{'ONLY_PROPOSED'} =3D 'on'; #[24];
@@ -2759,7 +2759,7 @@ if(($cgipara= ms{'ACTION'} eq $Lang::tr{'advanced'}) ||
goto ADVANCED_ERROR;
= }
foreach my $val (@temp) {
- if ($val !~ /^(mlkem(1024|768|= 512)|curve448|curve25519|e521|e384|e256|e224|e192|e512bp|e384bp|e256bp|e224= bp|768|1024|1536|2048|3072|4096|6144|8192)$/) {
+ if ($val !~ /^(x2551= 9-ke1_mlkem(1024|768|512)|curve448|curve25519|e521|e384|e256|e224|e192|e512= bp|e384bp|e256bp|e224bp|768|1024|1536|2048|3072|4096|6144|8192)$/) {
= $errormessage =3D $Lang::tr{'invalid input'};
goto ADVANCED_ERR= OR;
}
@@ -2800,7 +2800,7 @@ if(($cgiparams{'ACTION'} eq $Lang::t= r{'advanced'}) ||
goto ADVANCED_ERROR;
}
foreach my $= val (@temp) {
- if ($val !~ /^(mlkem(1024|768|512)|curve448|curve25519= |e521|e384|e256|e224|e192|e512bp|e384bp|e256bp|e224bp|768|1024|1536|2048|30= 72|4096|6144|8192|none)$/) {
+ if ($val !~ /^(x25519-ke1_mlkem(1024|76= 8|512)|curve448|curve25519|e521|e384|e256|e224|e192|e512bp|e384bp|e256bp|e2= 24bp|768|1024|1536|2048|3072|4096|6144|8192|none)$/) {
$errormessa= ge =3D $Lang::tr{'invalid input'};
goto ADVANCED_ERROR;
}<= br>@@ -2940,9 +2940,9 @@ if(($cgiparams{'ACTION'} eq $Lang::tr{'advanced'})= ||
$checked{'IKE_INTEGRITY'}{'aesxcbc'} =3D '';
@temp =3D spli= t('\|', $cgiparams{'IKE_INTEGRITY'});
foreach my $key (@temp) {$check= ed{'IKE_INTEGRITY'}{$key} =3D "selected=3D'selected'"; }
- $checked{'IKE= _GROUPTYPE'}{'mlkem1024'} =3D '';
- $checked{'IKE_GROUPTYPE'}{'mlkem768'= } =3D '';
- $checked{'IKE_GROUPTYPE'}{'mlkem512'} =3D '';
+ $checked{= 'IKE_GROUPTYPE'}{'x25519-ke1_mlkem1024'} =3D '';
+ $checked{'IKE_GROUPTY= PE'}{'x25519-ke1_mlkem768'} =3D '';
+ $checked{'IKE_GROUPTYPE'}{'x25519-= ke1_mlkem512'} =3D '';
$checked{'IKE_GROUPTYPE'}{'curve448'} =3D '';<= br> $checked{'IKE_GROUPTYPE'}{'curve25519'} =3D '';
$checked{'IKE_G= ROUPTYPE'}{'768'} =3D '';
@@ -2983,9 +2983,9 @@ if(($cgiparams{'ACTION'}= eq $Lang::tr{'advanced'}) ||
$checked{'ESP_INTEGRITY'}{'aesxcbc'} = =3D '';
@temp =3D split('\|', $cgiparams{'ESP_INTEGRITY'});
for= each my $key (@temp) {$checked{'ESP_INTEGRITY'}{$key} =3D "selected=3D'sele= cted'"; }
- $checked{'ESP_GROUPTYPE'}{'mlkem1024'} =3D '';
- $checked= {'ESP_GROUPTYPE'}{'mlkem768'} =3D '';
- $checked{'ESP_GROUPTYPE'}{'mlkem= 512'} =3D '';
+ $checked{'ESP_GROUPTYPE'}{'x25519-ke1_mlkem1024'} =3D ''= ;
+ $checked{'ESP_GROUPTYPE'}{'x25519-ke1_mlkem768'} =3D '';
+ $check= ed{'ESP_GROUPTYPE'}{'x25519-ke1_mlkem512'} =3D '';
$checked{'ESP_GROU= PTYPE'}{'curve448'} =3D '';
$checked{'ESP_GROUPTYPE'}{'curve25519'} = =3D '';
$checked{'ESP_GROUPTYPE'}{'768'} =3D '';
@@ -3151,9 +3151,= 9 @@ if(($cgiparams{'ACTION'} eq $Lang::tr{'advanced'}) ||
<td c= lass=3D'boldbase' width=3D"15%">$Lang::tr{'grouptype'}</td>
= <td class=3D'boldbase'>
<select name=3D'IKE_GROUPTYPE' = multiple=3D'multiple' size=3D'6' style=3D'width: 100%'>
- <opt= ion value=3D'mlkem1024' $checked{'IKE_GROUPTYPE'}{'mlkem1024'}>ML-KEM 10= 24 (256 bit)</option>
- <option value=3D'mlkem768' $checked= {'IKE_GROUPTYPE'}{'mlkem768'}>ML-KEM 768 (192 bit)</option>
- = <option value=3D'mlkem512' $checked{'IKE_GROUPTYPE'}{'mlkem512'}>M= L-KEM 512 (128 bit)</option>
+ <option value=3D'x25519-ke1_= mlkem1024' $checked{'IKE_GROUPTYPE'}{'x25519-ke1_mlkem1024'}>Curve 25519= x ML-KEM 1024 (256 bit)</option>
+ <option value=3D'x25519= -ke1_mlkem768' $checked{'IKE_GROUPTYPE'}{'x25519-ke1_mlkem768'}>Curve 25= 519 x ML-KEM 768 (192 bit)</option>
+ <option value=3D'x255= 19-ke1_mlkem512' $checked{'IKE_GROUPTYPE'}{'x25519-ke1_mlkem512'}>Curve = 25519 x ML-KEM 512 (128 bit)</option>
<option value=3D'c= urve448' $checked{'IKE_GROUPTYPE'}{'curve448'}>Curve 448 (224 bit)</o= ption>
<option value=3D'curve25519' $checked{'IKE_GROUPTYPE= '}{'curve25519'}>Curve 25519 (128 bit)</option>
<opti= on value=3D'e521' $checked{'IKE_GROUPTYPE'}{'e521'}>ECP-521 (NIST)</o= ption>
@@ -3177,9 +3177,9 @@ if(($cgiparams{'ACTION'} eq $Lang::tr{'a= dvanced'}) ||
</td>
<td class=3D'boldbase'>
= <select name=3D'ESP_GROUPTYPE' multiple=3D'multiple' size=3D'6' st= yle=3D'width: 100%'>
- <option value=3D'mlkem1024' $checked{'E= SP_GROUPTYPE'}{'mlkem1024'}>ML-KEM 1024 (256 bit)</option>
- = <option value=3D'mlkem768' $checked{'ESP_GROUPTYPE'}{'mlkem768'}>ML= -KEM 768 (192 bit)</option>
- <option value=3D'mlkem512' $c= hecked{'ESP_GROUPTYPE'}{'mlkem512'}>ML-KEM 512 (128 bit)</option><= br>+ <option value=3D'x25519-ke1_mlkem1024' $checked{'ESP_GROUPTYPE'= }{'x25519-ke1_mlkem1024'}>Curve 25519 x ML-KEM 1024 (256 bit)</option= >
+ <option value=3D'x25519-ke1_mlkem768' $checked{'ESP_GROUPT= YPE'}{'x25519-ke1_mlkem768'}>Curve 25519 x ML-KEM 768 (192 bit)</opti= on>
+ <option value=3D'x25519-ke1_mlkem512' $checked{'ESP_GROU= PTYPE'}{'x25519-ke1_mlkem512'}>Curve 25519 x ML-KEM 512 (128 bit)</op= tion>
<option value=3D'curve448' $checked{'ESP_GROUPTYPE'}{= 'curve448'}>Curve 448 (224 bit)</option>
<option valu= e=3D'curve25519' $checked{'ESP_GROUPTYPE'}{'curve25519'}>Curve 25519 (12= 8 bit)</option>
<option value=3D'e521' $checked{'ESP_GRO= UPTYPE'}{'e521'}>ECP-521 (NIST)</option>
@@ -3757,7 +3757,7 @@ = sub make_algos($$$$$) {
if ($mode eq "ike") {
push(@algo= , $int);
- if ($grp =3D~ m/^mlkem(\d+)$/) {
+ if ($grp =3D~= m/^x25519-ke1_mlkem(\d+)$/) {
push(@algo, "$grp");
} = elsif ($grp =3D~ m/^e(=2E*)$/) {
push(@algo, "ecp$1");
@@ -37= 76,7 +3776,7 @@ sub make_algos($$$$$) {
if (!$pfs || $grp eq "n= one") {
# noop
- } elsif ($grp =3D~ m/^mlkem(\d+)$/) {+ } elsif ($grp =3D~ m/^x25519-ke1_mlkem(\d+)$/) {
push(@al= go, "$grp");
} elsif ($grp =3D~ m/^e(=2E*)$/) {
push(@= algo, "ecp$1");


------UYM7KGJ0XMNUIYAOAOPYWEPBZWG1UX--