Hi Peter and Adolf.

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

Adam.

On 15 May 2025 09:16:25 BST, Adolf Belka <[email protected]> wrote:
>Hallo Peter,
>
>Good to see you on the list again :+1:
>
>This patch sounds a good approach to take.
>
>Adolf.
>
>On 15/05/2025 10:06, Peter Müller wrote:
>> In commit 887778e0888d51eb9942ae310a43f6d2813efad3, the post-quantum
>> key exchange algorithm ML-KEM was introduced, due to its support being
>> added in strongSwan 6.0. However, using PQC key exchanges is commonly
>> 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. OpenSSH, for instance,
>> combines ML-KEM 768 with Curve 25519 (mlkem768x25519-sha256), rather
>> than using ML-KEM alone.
>> 
>> This patch changes the chipher suites offered for IPsec connections to
>> always use ML-KEM as a hybrid with Curve 25519. This is possible due to
>> strongSwan 6.0 having added support for IKE intermediary key exchanges
>> (RFC 9370); see 
>> https://docs.strongswan.org/docs/latest/config/proposals.html#_key_exchange_methods
>> for additional information.
>> 
>> 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. Even if this is not the case, or if the IPsec peer
>> 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.
>> 
>> IPsec connections already created will need their ciphers to be changed
>> once during the Core Update routine where this patch will be
>> incorporated.
>> 
>> Tested-by: Peter Müller <[email protected]>
>> Signed-off-by: Peter Müller <[email protected]>
>> ---
>>   html/cgi-bin/vpnmain.cgi | 36 ++++++++++++++++++------------------
>>   1 file changed, 18 insertions(+), 18 deletions(-)
>> 
>> diff --git a/html/cgi-bin/vpnmain.cgi b/html/cgi-bin/vpnmain.cgi
>> index 4f81fecdf..154b94033 100644
>> --- a/html/cgi-bin/vpnmain.cgi
>> +++ b/html/cgi-bin/vpnmain.cgi
>> @@ -2374,11 +2374,11 @@ END
>>      #use default advanced value
>>      $cgiparams{'IKE_ENCRYPTION'}            = 
>> 'chacha20poly1305|aes256gcm128|aes256'; #[18];
>>      $cgiparams{'IKE_INTEGRITY'}             = 'sha2_512|sha2_256'; #[19];
>> -    $cgiparams{'IKE_GROUPTYPE'}             = 
>> 'mlkem1024|mlkem768|mlkem512|curve448|curve25519|e521|e384|4096|3072'; #[20];
>> +    $cgiparams{'IKE_GROUPTYPE'}             = 
>> 'x25519-ke1_mlkem1024|x25519-ke1_mlkem768|x25519-ke1_mlkem512|curve448|curve25519|e521|e384|4096|3072';
>>  #[20];
>>      $cgiparams{'IKE_LIFETIME'}              = '3'; #[16];
>>      $cgiparams{'ESP_ENCRYPTION'}            = 
>> 'chacha20poly1305|aes256gcm128|aes256'; #[21];
>>      $cgiparams{'ESP_INTEGRITY'}             = 'sha2_512|sha2_256'; #[22];
>> -    $cgiparams{'ESP_GROUPTYPE'}             = 
>> 'mlkem1024|mlkem768|mlkem512|curve448|curve25519|e521|e384|4096|3072'; #[23];
>> +    $cgiparams{'ESP_GROUPTYPE'}             = 
>> 'x25519-ke1_mlkem1024|x25519-ke1_mlkem768|x25519-ke1_mlkem512|curve448|curve25519|e521|e384|4096|3072';
>>  #[23];
>>      $cgiparams{'ESP_KEYLIFE'}               = '1'; #[17];
>>      $cgiparams{'COMPRESSION'}               = 'off'; #[13];
>>      $cgiparams{'ONLY_PROPOSED'}             = '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|e256|e224|e192|e512bp|e384bp|e256bp|e224bp|768|1024|1536|2048|3072|4096|6144|8192)$/)
>>  {
>> +                    if ($val !~ 
>> /^(x25519-ke1_mlkem(1024|768|512)|curve448|curve25519|e521|e384|e256|e224|e192|e512bp|e384bp|e256bp|e224bp|768|1024|1536|2048|3072|4096|6144|8192)$/)
>>  {
>>                              $errormessage = $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|e256|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|e521|e384|e256|e224|e192|e512bp|e384bp|e256bp|e224bp|768|1024|1536|2048|3072|4096|6144|8192|none)$/)
>>  {
>>                              $errormessage = $Lang::tr{'invalid input'};
>>                              goto ADVANCED_ERROR;
>>                      }
>> @@ -2940,9 +2940,9 @@ if(($cgiparams{'ACTION'} eq $Lang::tr{'advanced'}) ||
>>      $checked{'IKE_INTEGRITY'}{'aesxcbc'} = '';
>>      @temp = split('\|', $cgiparams{'IKE_INTEGRITY'});
>>      foreach my $key (@temp) {$checked{'IKE_INTEGRITY'}{$key} = 
>> "selected='selected'"; }
>> -    $checked{'IKE_GROUPTYPE'}{'mlkem1024'} = '';
>> -    $checked{'IKE_GROUPTYPE'}{'mlkem768'} = '';
>> -    $checked{'IKE_GROUPTYPE'}{'mlkem512'} = '';
>> +    $checked{'IKE_GROUPTYPE'}{'x25519-ke1_mlkem1024'} = '';
>> +    $checked{'IKE_GROUPTYPE'}{'x25519-ke1_mlkem768'} = '';
>> +    $checked{'IKE_GROUPTYPE'}{'x25519-ke1_mlkem512'} = '';
>>      $checked{'IKE_GROUPTYPE'}{'curve448'} = '';
>>      $checked{'IKE_GROUPTYPE'}{'curve25519'} = '';
>>      $checked{'IKE_GROUPTYPE'}{'768'} = '';
>> @@ -2983,9 +2983,9 @@ if(($cgiparams{'ACTION'} eq $Lang::tr{'advanced'}) ||
>>      $checked{'ESP_INTEGRITY'}{'aesxcbc'} = '';
>>      @temp = split('\|', $cgiparams{'ESP_INTEGRITY'});
>>      foreach my $key (@temp) {$checked{'ESP_INTEGRITY'}{$key} = 
>> "selected='selected'"; }
>> -    $checked{'ESP_GROUPTYPE'}{'mlkem1024'} = '';
>> -    $checked{'ESP_GROUPTYPE'}{'mlkem768'} = '';
>> -    $checked{'ESP_GROUPTYPE'}{'mlkem512'} = '';
>> +    $checked{'ESP_GROUPTYPE'}{'x25519-ke1_mlkem1024'} = '';
>> +    $checked{'ESP_GROUPTYPE'}{'x25519-ke1_mlkem768'} = '';
>> +    $checked{'ESP_GROUPTYPE'}{'x25519-ke1_mlkem512'} = '';
>>      $checked{'ESP_GROUPTYPE'}{'curve448'} = '';
>>      $checked{'ESP_GROUPTYPE'}{'curve25519'} = '';
>>      $checked{'ESP_GROUPTYPE'}{'768'} = '';
>> @@ -3151,9 +3151,9 @@ if(($cgiparams{'ACTION'} eq $Lang::tr{'advanced'}) ||
>>                      <td class='boldbase' 
>> width="15%">$Lang::tr{'grouptype'}</td>
>>                      <td class='boldbase'>
>>                              <select name='IKE_GROUPTYPE' 
>> multiple='multiple' size='6' style='width: 100%'>
>> -                                    <option value='mlkem1024' 
>> $checked{'IKE_GROUPTYPE'}{'mlkem1024'}>ML-KEM 1024 (256 bit)</option>
>> -                                    <option value='mlkem768' 
>> $checked{'IKE_GROUPTYPE'}{'mlkem768'}>ML-KEM 768 (192 bit)</option>
>> -                                    <option value='mlkem512' 
>> $checked{'IKE_GROUPTYPE'}{'mlkem512'}>ML-KEM 512 (128 bit)</option>
>> +                                    <option value='x25519-ke1_mlkem1024' 
>> $checked{'IKE_GROUPTYPE'}{'x25519-ke1_mlkem1024'}>Curve 25519 x ML-KEM 1024 
>> (256 bit)</option>
>> +                                    <option value='x25519-ke1_mlkem768' 
>> $checked{'IKE_GROUPTYPE'}{'x25519-ke1_mlkem768'}>Curve 25519 x ML-KEM 768 
>> (192 bit)</option>
>> +                                    <option value='x25519-ke1_mlkem512' 
>> $checked{'IKE_GROUPTYPE'}{'x25519-ke1_mlkem512'}>Curve 25519 x ML-KEM 512 
>> (128 bit)</option>
>>                                      <option value='curve448' 
>> $checked{'IKE_GROUPTYPE'}{'curve448'}>Curve 448 (224 bit)</option>
>>                                      <option value='curve25519' 
>> $checked{'IKE_GROUPTYPE'}{'curve25519'}>Curve 25519 (128 bit)</option>
>>                                      <option value='e521' 
>> $checked{'IKE_GROUPTYPE'}{'e521'}>ECP-521 (NIST)</option>
>> @@ -3177,9 +3177,9 @@ if(($cgiparams{'ACTION'} eq $Lang::tr{'advanced'}) ||
>>                      </td>
>>                      <td class='boldbase'>
>>                              <select name='ESP_GROUPTYPE' 
>> multiple='multiple' size='6' style='width: 100%'>
>> -                                    <option value='mlkem1024' 
>> $checked{'ESP_GROUPTYPE'}{'mlkem1024'}>ML-KEM 1024 (256 bit)</option>
>> -                                    <option value='mlkem768' 
>> $checked{'ESP_GROUPTYPE'}{'mlkem768'}>ML-KEM 768 (192 bit)</option>
>> -                                    <option value='mlkem512' 
>> $checked{'ESP_GROUPTYPE'}{'mlkem512'}>ML-KEM 512 (128 bit)</option>
>> +                                    <option value='x25519-ke1_mlkem1024' 
>> $checked{'ESP_GROUPTYPE'}{'x25519-ke1_mlkem1024'}>Curve 25519 x ML-KEM 1024 
>> (256 bit)</option>
>> +                                    <option value='x25519-ke1_mlkem768' 
>> $checked{'ESP_GROUPTYPE'}{'x25519-ke1_mlkem768'}>Curve 25519 x ML-KEM 768 
>> (192 bit)</option>
>> +                                    <option value='x25519-ke1_mlkem512' 
>> $checked{'ESP_GROUPTYPE'}{'x25519-ke1_mlkem512'}>Curve 25519 x ML-KEM 512 
>> (128 bit)</option>
>>                                      <option value='curve448' 
>> $checked{'ESP_GROUPTYPE'}{'curve448'}>Curve 448 (224 bit)</option>
>>                                      <option value='curve25519' 
>> $checked{'ESP_GROUPTYPE'}{'curve25519'}>Curve 25519 (128 bit)</option>
>>                                      <option value='e521' 
>> $checked{'ESP_GROUPTYPE'}{'e521'}>ECP-521 (NIST)</option>
>> @@ -3757,7 +3757,7 @@ sub make_algos($$$$$) {
>>                              if ($mode eq "ike") {
>>                                      push(@algo, $int);
>>   -                                  if ($grp =~ m/^mlkem(\d+)$/) {
>> +                                    if ($grp =~ m/^x25519-ke1_mlkem(\d+)$/) 
>> {
>>                                              push(@algo, "$grp");
>>                                      } elsif ($grp =~ m/^e(.*)$/) {
>>                                              push(@algo, "ecp$1");
>> @@ -3776,7 +3776,7 @@ sub make_algos($$$$$) {
>>                                      if (!$pfs || $grp eq "none") {
>>                                              # noop
>> -                                    } elsif ($grp =~ m/^mlkem(\d+)$/) {
>> +                                    } elsif ($grp =~ 
>> m/^x25519-ke1_mlkem(\d+)$/) {
>>                                              push(@algo, "$grp");
>>                                      } elsif ($grp =~ m/^e(.*)$/) {
>>                                              push(@algo, "ecp$1");
>
>

Reply via email to