23
23
#include <openssl/store.h>
24
24
#include <openssl/core_names.h>
25
25
#include <openssl/rand.h>
26
+ #include <openssl/safestack.h>
27
+ #include <openssl/ssl.h>
26
28
#include <openssl/tls1.h>
27
29
#include "apps.h"
28
30
#include "app_params.h"
@@ -776,6 +778,42 @@ static int list_tls_sigalg_caps(OSSL_PROVIDER *provider, void *cbdata)
776
778
return 1 ;
777
779
}
778
780
781
+ #if !defined(OPENSSL_NO_TLS1_3 ) || !defined(OPENSSL_NO_TLS1_2 )
782
+ static void list_tls_groups (int version , int all )
783
+ {
784
+ SSL_CTX * ctx = NULL ;
785
+ STACK_OF (OPENSSL_CSTRING ) * groups ;
786
+ size_t i , num ;
787
+
788
+ if ((groups = sk_OPENSSL_CSTRING_new_null ()) == NULL ) {
789
+ BIO_printf (bio_err , "ERROR: Memory allocation\n" );
790
+ return ;
791
+ }
792
+ if ((ctx = SSL_CTX_new (TLS_method ())) == NULL ) {
793
+ BIO_printf (bio_err , "ERROR: Memory allocation\n" );
794
+ goto err ;
795
+ }
796
+ if (!SSL_CTX_set_min_proto_version (ctx , version )
797
+ || !SSL_CTX_set_max_proto_version (ctx , version )) {
798
+ BIO_printf (bio_err , "ERROR: setting TLS protocol version\n" );
799
+ goto err ;
800
+ }
801
+ if (!SSL_CTX_get0_implemented_groups (ctx , all , groups )) {
802
+ BIO_printf (bio_err , "ERROR: getting implemented TLS group list\n" );
803
+ goto err ;
804
+ }
805
+ num = sk_OPENSSL_CSTRING_num (groups );
806
+ for (i = 0 ; i < num ; ++ i ) {
807
+ BIO_printf (bio_out , "%s%c" , sk_OPENSSL_CSTRING_value (groups , i ),
808
+ (i < num - 1 ) ? ':' : '\n' );
809
+ }
810
+ err :
811
+ SSL_CTX_free (ctx );
812
+ sk_OPENSSL_CSTRING_free (groups );
813
+ return ;
814
+ }
815
+ #endif
816
+
779
817
static void list_tls_signatures (void )
780
818
{
781
819
int tls_sigalg_listed = 0 ;
@@ -1515,6 +1553,15 @@ typedef enum HELPLIST_CHOICE {
1515
1553
OPT_TLS_SIGNATURE_ALGORITHMS , OPT_ASYM_CIPHER_ALGORITHMS ,
1516
1554
OPT_STORE_LOADERS , OPT_PROVIDER_INFO , OPT_OBJECTS ,
1517
1555
OPT_SELECT_NAME ,
1556
+ #if !defined(OPENSSL_NO_TLS1_3 ) || !defined(OPENSSL_NO_TLS1_2 )
1557
+ OPT_ALL_TLS_GROUPS , OPT_TLS_GROUPS ,
1558
+ # if !defined(OPENSSL_NO_TLS1_2 )
1559
+ OPT_TLS1_2 ,
1560
+ # endif
1561
+ # if !defined(OPENSSL_NO_TLS1_3 )
1562
+ OPT_TLS1_3 ,
1563
+ # endif
1564
+ #endif
1518
1565
#ifndef OPENSSL_NO_DEPRECATED_3_0
1519
1566
OPT_ENGINES ,
1520
1567
#endif
@@ -1572,6 +1619,20 @@ const OPTIONS list_options[] = {
1572
1619
"List of public key methods" },
1573
1620
{"store-loaders" , OPT_STORE_LOADERS , '-' ,
1574
1621
"List of store loaders" },
1622
+ #if !defined (OPENSSL_NO_TLS1_2 ) || !defined (OPENSSL_NO_TLS1_3 )
1623
+ {"tls-groups" , OPT_TLS_GROUPS , '-' ,
1624
+ "List implemented TLS key exchange 'groups'" },
1625
+ {"all-tls-groups" , OPT_ALL_TLS_GROUPS , '-' ,
1626
+ "List implemented TLS key exchange 'groups' and all aliases" },
1627
+ # ifndef OPENSSL_NO_TLS1_2
1628
+ {"tls1_2" , OPT_TLS1_2 , '-' ,
1629
+ "When listing 'groups', list those compatible with TLS1.2" },
1630
+ # endif
1631
+ # ifndef OPENSSL_NO_TLS1_3
1632
+ {"tls1_3" , OPT_TLS1_3 , '-' ,
1633
+ "When listing 'groups', list those compatible with TLS1.3" },
1634
+ # endif
1635
+ #endif
1575
1636
{"providers" , OPT_PROVIDER_INFO , '-' ,
1576
1637
"List of provider information" },
1577
1638
#ifndef OPENSSL_NO_DEPRECATED_3_0
@@ -1594,6 +1655,14 @@ int list_main(int argc, char **argv)
1594
1655
HELPLIST_CHOICE o ;
1595
1656
int one = 0 , done = 0 ;
1596
1657
int print_newline = 0 ;
1658
+ #if !defined(OPENSSL_NO_TLS1_3 ) || !defined(OPENSSL_NO_TLS1_2 )
1659
+ int all_tls_groups = 0 ;
1660
+ # if !defined(OPENSSL_NO_TLS1_3 )
1661
+ unsigned int tls_version = TLS1_3_VERSION ;
1662
+ # else
1663
+ unsigned int tls_version = TLS1_2_VERSION ;
1664
+ # endif
1665
+ #endif
1597
1666
struct {
1598
1667
unsigned int commands :1 ;
1599
1668
unsigned int all_algorithms :1 ;
@@ -1612,6 +1681,7 @@ int list_main(int argc, char **argv)
1612
1681
unsigned int tls_signature_algorithms :1 ;
1613
1682
unsigned int keyexchange_algorithms :1 ;
1614
1683
unsigned int kem_algorithms :1 ;
1684
+ unsigned int tls_groups :1 ;
1615
1685
unsigned int asym_cipher_algorithms :1 ;
1616
1686
unsigned int pk_algorithms :1 ;
1617
1687
unsigned int pk_method :1 ;
@@ -1692,6 +1762,25 @@ int list_main(int argc, char **argv)
1692
1762
case OPT_KEM_ALGORITHMS :
1693
1763
todo .kem_algorithms = 1 ;
1694
1764
break ;
1765
+ #if !defined(OPENSSL_NO_TLS1_3 ) || !defined(OPENSSL_NO_TLS1_2 )
1766
+ case OPT_TLS_GROUPS :
1767
+ todo .tls_groups = 1 ;
1768
+ break ;
1769
+ case OPT_ALL_TLS_GROUPS :
1770
+ all_tls_groups = 1 ;
1771
+ todo .tls_groups = 1 ;
1772
+ break ;
1773
+ # if !defined(OPENSSL_NO_TLS1_2 )
1774
+ case OPT_TLS1_2 :
1775
+ tls_version = TLS1_2_VERSION ;
1776
+ break ;
1777
+ # endif
1778
+ # if !defined(OPENSSL_NO_TLS1_3 )
1779
+ case OPT_TLS1_3 :
1780
+ tls_version = TLS1_3_VERSION ;
1781
+ break ;
1782
+ # endif
1783
+ #endif
1695
1784
case OPT_ASYM_CIPHER_ALGORITHMS :
1696
1785
todo .asym_cipher_algorithms = 1 ;
1697
1786
break ;
@@ -1811,6 +1900,10 @@ int list_main(int argc, char **argv)
1811
1900
MAYBE_ADD_NL (list_keyexchanges ());
1812
1901
if (todo .kem_algorithms )
1813
1902
MAYBE_ADD_NL (list_kems ());
1903
+ #if !defined(OPENSSL_NO_TLS1_3 ) || !defined(OPENSSL_NO_TLS1_2 )
1904
+ if (todo .tls_groups )
1905
+ MAYBE_ADD_NL (list_tls_groups (tls_version , all_tls_groups ));
1906
+ #endif
1814
1907
if (todo .pk_algorithms )
1815
1908
MAYBE_ADD_NL (list_pkey ());
1816
1909
if (todo .pk_method )
0 commit comments