4949#include <winerror.h>
5050#endif
5151
52+ #define SCHANNEL_USE_BLACKLISTS
5253#include <schannel.h>
5354
5455uint16_t QuicTlsTPHeaderSize = FIELD_OFFSET (SEND_GENERIC_TLS_EXTENSION , Buffer );
@@ -125,7 +126,12 @@ typedef struct QUIC_ACHA_CONTEXT {
125126 //
126127 // Holds the credentials configuration for the lifetime of the async call.
127128 //
128- SCHANNEL_CRED Credentials ;
129+ SCH_CREDENTIALS Credentials ;
130+
131+ //
132+ // Holds TLS configuration for the lifetime of the async call.
133+ //
134+ TLS_PARAMETERS TlsParameter ;
129135
130136} QUIC_ACHA_CONTEXT ;
131137#endif
@@ -670,25 +676,35 @@ QuicTlsServerSecConfigCreate(
670676 goto Error ;
671677 }
672678
673- PSCHANNEL_CRED Credentials = & AchaContext -> Credentials ;
679+ PSCH_CREDENTIALS Credentials = & AchaContext -> Credentials ;
680+ Credentials -> pTlsParameters = & AchaContext -> TlsParameters ;
681+ Credentials -> cTlsParameters = 1 ;
674682#else
675- SCHANNEL_CRED LocalCredentials = { 0 };
676- PSCHANNEL_CRED Credentials = & LocalCredentials ;
683+ SCH_CREDENTIALS LocalCredentials = { 0 };
684+ TLS_PARAMETERS LocalTlsParameters = { 0 };
685+ PSCH_CREDENTIALS Credentials = & LocalCredentials ;
686+ Credentials -> pTlsParameters = & LocalTlsParameters ;
687+ Credentials -> cTlsParameters = 1 ;
677688#endif
678689
679690 //
680691 // Initialize user/kernel-common configuration.
681692 //
682- Credentials -> dwVersion = SCHANNEL_CRED_VERSION ;
683- Credentials -> grbitEnabledProtocols = SP_PROT_TLS1_3_SERVER ;
684- Credentials -> cSupportedAlgs = 0 ;
685- Credentials -> palgSupportedAlgs = NULL ;
693+ Credentials -> dwVersion = SCH_CREDENTIALS_VERSION ;
694+ Credentials -> pTlsParameters -> grbitDisabledProtocols = (DWORD ) ~SP_PROT_TLS1_3_SERVER ;
695+ Credentials -> pTlsParameters -> cAlpnIds = 0 ;
696+ Credentials -> pTlsParameters -> rgstrAlpnIds = NULL ; // QUIC manages all the ALPN matching.
697+ Credentials -> pTlsParameters -> cDisabledCrypto = 0 ;
698+ //
699+ // TODO: Disallow AES_CCM_8 algorithm, which are undefined in the QUIC-TLS spec.
700+ //
701+ Credentials -> pTlsParameters -> pDisabledCrypto = NULL ;
686702 Credentials -> dwFlags |= SCH_CRED_NO_SYSTEM_MAPPER ;
687703
688704 //
689- // This flag is required to prevent the SSL BEAST attack .
705+ // This flag disables known-weak crypto algorithms .
690706 //
691- Credentials -> dwFlags |= SCH_SEND_AUX_RECORD ;
707+ Credentials -> dwFlags |= SCH_USE_STRONG_CRYPTO ;
692708
693709 if (Flags & QUIC_SEC_CONFIG_FLAG_ENABLE_OCSP ) {
694710 Credentials -> dwFlags |= SCH_CRED_SNI_ENABLE_OCSP ;
@@ -917,7 +933,8 @@ QuicTlsClientSecConfigCreate(
917933 )
918934{
919935 TimeStamp CredExpiration ;
920- SCHANNEL_CRED SchannelCred = { 0 };
936+ TLS_PARAMETERS TlsParameters = { 0 };
937+ SCH_CREDENTIALS SchannelCred = { 0 };
921938 SECURITY_STATUS SecStatus ;
922939 QUIC_STATUS Status = QUIC_STATUS_SUCCESS ;
923940
@@ -936,6 +953,7 @@ QuicTlsClientSecConfigCreate(
936953 Config -> RefCount = 1 ;
937954
938955 SchannelCred .dwFlags = SCH_CRED_NO_DEFAULT_CREDS ;
956+ SchannelCred .dwFlags |= SCH_USE_STRONG_CRYPTO ;
939957 if (Flags & QUIC_CERTIFICATE_FLAG_DISABLE_CERT_VALIDATION ) {
940958 SchannelCred .dwFlags |= SCH_CRED_MANUAL_CRED_VALIDATION ;
941959 } else if (Flags != 0 ) {
@@ -946,10 +964,17 @@ QuicTlsClientSecConfigCreate(
946964 SchannelCred .dwFlags |= SCH_CRED_MANUAL_CRED_VALIDATION ;
947965 }
948966
949- SchannelCred .grbitEnabledProtocols = SP_PROT_TLS1_3_CLIENT ;
950- SchannelCred .dwVersion = SCHANNEL_CRED_VERSION ;
951- SchannelCred .cSupportedAlgs = 0 ;
952- SchannelCred .palgSupportedAlgs = NULL ;
967+ TlsParameters .grbitDisabledProtocols = (DWORD ) ~SP_PROT_TLS1_3_CLIENT ;
968+ TlsParameters .cAlpnIds = 0 ;
969+ TlsParameters .rgstrAlpnIds = NULL ; // Only used on server.
970+ TlsParameters .cDisabledCrypto = 0 ;
971+ //
972+ // TODO: Disallow AES_CCM_8 algorithm, which are undefined in the QUIC-TLS spec.
973+ //
974+ TlsParameters .pDisabledCrypto = NULL ;
975+ SchannelCred .cTlsParameters = 1 ;
976+ SchannelCred .pTlsParameters = & TlsParameters ;
977+ SchannelCred .dwVersion = SCH_CREDENTIALS_VERSION ;
953978#ifdef _KERNEL_MODE
954979 PSECURITY_STRING PackageName = (PSECURITY_STRING ) & QuicTlsPackageName ;
955980#else
0 commit comments