@@ -11,13 +11,14 @@ use openssl_sys::{
1111 EVP_PKEY , SSL_ERROR_NONE , SSL_ERROR_SSL , SSL_ERROR_WANT_READ , SSL_ERROR_WANT_WRITE , X509 ,
1212 X509_STORE , X509_V_ERR_UNSPECIFIED ,
1313} ;
14+
1415use rustls:: client:: Resumption ;
1516use rustls:: crypto:: { aws_lc_rs as provider, SupportedKxGroup } ;
1617use rustls:: pki_types:: { CertificateDer , ServerName } ;
1718use rustls:: server:: { Accepted , Acceptor , ProducesTickets } ;
1819use rustls:: {
1920 AlertDescription , CipherSuite , ClientConfig , ClientConnection , Connection , HandshakeKind ,
20- ProtocolVersion , ServerConfig , SignatureScheme , SupportedProtocolVersion ,
21+ NamedGroup , ProtocolVersion , ServerConfig , SignatureScheme , SupportedProtocolVersion ,
2122} ;
2223
2324use not_thread_safe:: NotThreadSafe ;
@@ -239,6 +240,158 @@ static TLS13_CHACHA20_POLY1305_SHA256: SslCipher = SslCipher {
239240 description : c"TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD\n " ,
240241} ;
241242
243+ #[ allow( dead_code) ]
244+ struct TlsGroupInfo {
245+ pub tls_name : & ' static CStr ,
246+ pub standard_name : & ' static CStr ,
247+ pub algorithm : & ' static CStr ,
248+ pub secbits : usize ,
249+ pub group_id : NamedGroup ,
250+ }
251+
252+ impl TlsGroupInfo {
253+ pub fn find_by_id ( id : NamedGroup ) -> Option < & ' static Self > {
254+ match id {
255+ NamedGroup :: secp256r1 => Some ( & SECP256R1 ) ,
256+ NamedGroup :: secp384r1 => Some ( & SECP384R1 ) ,
257+ NamedGroup :: secp521r1 => Some ( & SECP521R1 ) ,
258+ NamedGroup :: X25519 => Some ( & X25519 ) ,
259+ NamedGroup :: X448 => Some ( & X448 ) ,
260+ NamedGroup :: FFDHE2048 => Some ( & FFDHE2048 ) ,
261+ NamedGroup :: FFDHE3072 => Some ( & FFDHE3072 ) ,
262+ NamedGroup :: FFDHE4096 => Some ( & FFDHE4096 ) ,
263+ NamedGroup :: FFDHE6144 => Some ( & FFDHE6144 ) ,
264+ NamedGroup :: FFDHE8192 => Some ( & FFDHE8192 ) ,
265+ NamedGroup :: MLKEM512 => Some ( & MLKEM512 ) ,
266+ NamedGroup :: MLKEM768 => Some ( & MLKEM768 ) ,
267+ NamedGroup :: MLKEM1024 => Some ( & MLKEM1024 ) ,
268+ NamedGroup :: X25519MLKEM768 => Some ( & X25519MLKEM768 ) ,
269+ NamedGroup :: secp256r1MLKEM768 => Some ( & SECP256R1_MLKEM768 ) ,
270+ _ => None ,
271+ }
272+ }
273+ }
274+
275+ static SECP256R1 : TlsGroupInfo = TlsGroupInfo {
276+ tls_name : c"secp256r1" ,
277+ standard_name : c"prime256v1" ,
278+ algorithm : c"EC" ,
279+ secbits : 128 ,
280+ group_id : NamedGroup :: secp256r1,
281+ } ;
282+
283+ static SECP384R1 : TlsGroupInfo = TlsGroupInfo {
284+ tls_name : c"secp384r1" ,
285+ standard_name : c"secp384r1" ,
286+ algorithm : c"EC" ,
287+ secbits : 192 ,
288+ group_id : NamedGroup :: secp384r1,
289+ } ;
290+
291+ static SECP521R1 : TlsGroupInfo = TlsGroupInfo {
292+ tls_name : c"secp521r1" ,
293+ standard_name : c"secp521r1" ,
294+ algorithm : c"EC" ,
295+ secbits : 256 ,
296+ group_id : NamedGroup :: secp521r1,
297+ } ;
298+
299+ static X25519 : TlsGroupInfo = TlsGroupInfo {
300+ tls_name : c"x25519" ,
301+ standard_name : c"X25519" ,
302+ algorithm : c"X25519" ,
303+ secbits : 128 ,
304+ group_id : NamedGroup :: X25519 ,
305+ } ;
306+
307+ static X448 : TlsGroupInfo = TlsGroupInfo {
308+ tls_name : c"x448" ,
309+ standard_name : c"X448" ,
310+ algorithm : c"X448" ,
311+ secbits : 224 ,
312+ group_id : NamedGroup :: X448 ,
313+ } ;
314+
315+ static FFDHE2048 : TlsGroupInfo = TlsGroupInfo {
316+ tls_name : c"ffdhe2048" ,
317+ standard_name : c"ffdhe2048" ,
318+ algorithm : c"DH" ,
319+ secbits : 112 ,
320+ group_id : NamedGroup :: FFDHE2048 ,
321+ } ;
322+
323+ static FFDHE3072 : TlsGroupInfo = TlsGroupInfo {
324+ tls_name : c"ffdhe3072" ,
325+ standard_name : c"ffdhe3072" ,
326+ algorithm : c"DH" ,
327+ secbits : 128 ,
328+ group_id : NamedGroup :: FFDHE3072 ,
329+ } ;
330+
331+ static FFDHE4096 : TlsGroupInfo = TlsGroupInfo {
332+ tls_name : c"ffdhe4096" ,
333+ standard_name : c"ffdhe4096" ,
334+ algorithm : c"DH" ,
335+ secbits : 128 ,
336+ group_id : NamedGroup :: FFDHE4096 ,
337+ } ;
338+
339+ static FFDHE6144 : TlsGroupInfo = TlsGroupInfo {
340+ tls_name : c"ffdhe6144" ,
341+ standard_name : c"ffdhe6144" ,
342+ algorithm : c"DH" ,
343+ secbits : 128 ,
344+ group_id : NamedGroup :: FFDHE6144 ,
345+ } ;
346+
347+ static FFDHE8192 : TlsGroupInfo = TlsGroupInfo {
348+ tls_name : c"ffdhe8192" ,
349+ standard_name : c"ffdhe8192" ,
350+ algorithm : c"DH" ,
351+ secbits : 192 ,
352+ group_id : NamedGroup :: FFDHE8192 ,
353+ } ;
354+
355+ static MLKEM512 : TlsGroupInfo = TlsGroupInfo {
356+ tls_name : c"MLKEM512" ,
357+ standard_name : c"" ,
358+ algorithm : c"ML-KEM-512" ,
359+ secbits : 128 ,
360+ group_id : NamedGroup :: MLKEM512 ,
361+ } ;
362+
363+ static MLKEM768 : TlsGroupInfo = TlsGroupInfo {
364+ tls_name : c"MLKEM768" ,
365+ standard_name : c"" ,
366+ algorithm : c"ML-KEM-768" ,
367+ secbits : 192 ,
368+ group_id : NamedGroup :: MLKEM768 ,
369+ } ;
370+
371+ static MLKEM1024 : TlsGroupInfo = TlsGroupInfo {
372+ tls_name : c"MLKEM1024" ,
373+ standard_name : c"" ,
374+ algorithm : c"ML-KEM-1024" ,
375+ secbits : 256 ,
376+ group_id : NamedGroup :: MLKEM1024 ,
377+ } ;
378+
379+ static X25519MLKEM768 : TlsGroupInfo = TlsGroupInfo {
380+ tls_name : c"X25519MLKEM768" ,
381+ standard_name : c"" ,
382+ algorithm : c"X25519MLKEM768" ,
383+ secbits : 192 ,
384+ group_id : NamedGroup :: X25519MLKEM768 ,
385+ } ;
386+
387+ static SECP256R1_MLKEM768 : TlsGroupInfo = TlsGroupInfo {
388+ tls_name : c"SecP256r1MLKEM768" ,
389+ standard_name : c"" ,
390+ algorithm : c"SecP256r1MLKEM768" ,
391+ secbits : 192 ,
392+ group_id : NamedGroup :: secp256r1MLKEM768,
393+ } ;
394+
242395/// Backs a server-side SSL_SESSION object
243396///
244397/// Note that this has equality and ordering entirely based on the `id` field.
@@ -459,6 +612,7 @@ pub struct SslContext {
459612 info_callback : callbacks:: InfoCallbackConfig ,
460613 client_hello_callback : callbacks:: ClientHelloCallbackConfig ,
461614 auth_keys : sign:: CertifiedKeySet ,
615+ groups : Vec < & ' static dyn SupportedKxGroup > ,
462616 max_early_data : u32 ,
463617}
464618
@@ -491,6 +645,7 @@ impl SslContext {
491645 info_callback : callbacks:: InfoCallbackConfig :: default ( ) ,
492646 client_hello_callback : callbacks:: ClientHelloCallbackConfig :: default ( ) ,
493647 auth_keys : sign:: CertifiedKeySet :: default ( ) ,
648+ groups : provider:: default_provider ( ) . kx_groups . clone ( ) ,
494649 max_early_data : 0 ,
495650 }
496651 }
@@ -521,6 +676,10 @@ impl SslContext {
521676 self . raw_options
522677 }
523678
679+ fn get_groups ( & self ) -> & Vec < & ' static dyn SupportedKxGroup > {
680+ & self . groups
681+ }
682+
524683 fn get_num_tickets ( & self ) -> usize {
525684 self . num_tickets
526685 }
@@ -880,6 +1039,10 @@ impl Ssl {
8801039 self . raw_options
8811040 }
8821041
1042+ fn get_groups ( & self ) -> & Vec < & ' static dyn SupportedKxGroup > {
1043+ self . ctx . get ( ) . get_groups ( )
1044+ }
1045+
8831046 fn get_num_tickets ( & self ) -> usize {
8841047 self . num_tickets
8851048 }
@@ -1098,7 +1261,6 @@ impl Ssl {
10981261 if let ConnMode :: Unknown = self . mode {
10991262 self . set_client_mode ( ) ;
11001263 }
1101-
11021264 if matches ! ( self . conn, ConnState :: Nothing ) {
11031265 self . init_client_conn ( ) ?;
11041266 }
0 commit comments