@@ -16,8 +16,8 @@ use rustls::crypto::{aws_lc_rs as provider, SupportedKxGroup};
1616use rustls:: pki_types:: { CertificateDer , ServerName } ;
1717use rustls:: server:: { Accepted , Acceptor , ProducesTickets } ;
1818use rustls:: {
19- CipherSuite , ClientConfig , ClientConnection , Connection , HandshakeKind , ProtocolVersion ,
20- ServerConfig , SignatureScheme , SupportedProtocolVersion ,
19+ AlertDescription , CipherSuite , ClientConfig , ClientConnection , Connection , HandshakeKind ,
20+ ProtocolVersion , ServerConfig , SignatureScheme , SupportedProtocolVersion ,
2121} ;
2222
2323use not_thread_safe:: NotThreadSafe ;
@@ -456,6 +456,7 @@ pub struct SslContext {
456456 alpn_callback : callbacks:: AlpnCallbackConfig ,
457457 cert_callback : callbacks:: CertCallbackConfig ,
458458 servername_callback : callbacks:: ServerNameCallbackConfig ,
459+ info_callback : callbacks:: InfoCallbackConfig ,
459460 auth_keys : sign:: CertifiedKeySet ,
460461 max_early_data : u32 ,
461462}
@@ -486,6 +487,7 @@ impl SslContext {
486487 alpn_callback : callbacks:: AlpnCallbackConfig :: default ( ) ,
487488 cert_callback : callbacks:: CertCallbackConfig :: default ( ) ,
488489 servername_callback : callbacks:: ServerNameCallbackConfig :: default ( ) ,
490+ info_callback : callbacks:: InfoCallbackConfig :: default ( ) ,
489491 auth_keys : sign:: CertifiedKeySet :: default ( ) ,
490492 max_early_data : 0 ,
491493 }
@@ -600,6 +602,10 @@ impl SslContext {
600602 self . caches . flush_all ( ) ;
601603 }
602604
605+ fn set_info_callback ( & mut self , callback : entry:: SSL_CTX_info_callback_func ) {
606+ self . info_callback . cb = callback;
607+ }
608+
603609 fn set_max_early_data ( & mut self , max : u32 ) {
604610 self . max_early_data = max;
605611 }
@@ -776,6 +782,7 @@ struct Ssl {
776782 alpn : Vec < Vec < u8 > > ,
777783 alpn_callback : callbacks:: AlpnCallbackConfig ,
778784 cert_callback : callbacks:: CertCallbackConfig ,
785+ info_callback : callbacks:: InfoCallbackConfig ,
779786 servername_callback : callbacks:: ServerNameCallbackConfig ,
780787 sni_server_name : Option < ServerName < ' static > > ,
781788 server_name : Option < CString > ,
@@ -817,6 +824,7 @@ impl Ssl {
817824 alpn : inner. alpn . clone ( ) ,
818825 alpn_callback : inner. alpn_callback . clone ( ) ,
819826 cert_callback : inner. cert_callback . clone ( ) ,
827+ info_callback : inner. info_callback . clone ( ) ,
820828 servername_callback : inner. servername_callback . clone ( ) ,
821829 sni_server_name : None ,
822830 server_name : None ,
@@ -927,6 +935,10 @@ impl Ssl {
927935 . unwrap_or_default ( )
928936 }
929937
938+ fn set_info_callback ( & mut self , cb : entry:: SSL_CTX_info_callback_func ) {
939+ self . info_callback . cb = cb;
940+ }
941+
930942 fn set_alpn_offer ( & mut self , alpn : Vec < Vec < u8 > > ) {
931943 self . alpn = alpn;
932944 }
@@ -1301,6 +1313,10 @@ impl Ssl {
13011313 // obtain underlying TLS protocol error (if any), and let it stamp
13021314 // out the one wrapped in io::Error.
13031315 if let Some ( tls_err) = conn. process_new_packets ( ) . err ( ) {
1316+ if let rustls:: Error :: AlertReceived ( alert) = & tls_err {
1317+ self . info_callback
1318+ . invoke ( callbacks:: Info :: AlertReceived ( * alert) ) ;
1319+ }
13041320 return Err ( error:: Error :: from_rustls ( tls_err) ) ;
13051321 }
13061322 return Err ( error:: Error :: from_io ( e) ) ;
@@ -1326,7 +1342,17 @@ impl Ssl {
13261342 self . invoke_accepted_callbacks ( )
13271343 }
13281344 Err ( ( error, mut alert) ) => {
1329- alert. write_all ( bio) . map_err ( error:: Error :: from_io) ?;
1345+ let mut buffer = Vec :: new ( ) ;
1346+ alert. write_all ( & mut buffer) . unwrap ( ) ;
1347+
1348+ // this only works for unencrypted alerts (header plus `Alert` structure)
1349+ if buffer. len ( ) == ( 5 + 2 ) {
1350+ self . info_callback . invoke ( callbacks:: Info :: AlertSent (
1351+ AlertDescription :: from ( buffer[ 6 ] ) ,
1352+ ) ) ;
1353+ }
1354+
1355+ bio. write_all ( & buffer) . map_err ( error:: Error :: from_io) ?;
13301356 Err ( error:: Error :: from_rustls ( error) )
13311357 }
13321358 }
0 commit comments