@@ -57,6 +57,9 @@ internal static bool DisableTlsResume
5757 private X509Certificate2 ? _remoteCertificate ;
5858 private bool _remoteCertificateExposed ;
5959
60+ // -1 for uninitialized, 0 for false, 1 for true, should be accessed via IsLocalClientCertificateUsed property
61+ private int _localClientCertificateUsed = - 1 ;
62+
6063 // These are the MAX encrypt buffer output sizes, not the actual sizes.
6164 private int _headerSize = 5 ; //ATTN must be set to at least 5 by default
6265 private int _trailerSize = 16 ;
@@ -82,11 +85,28 @@ internal X509Certificate? LocalServerCertificate
8285 }
8386 }
8487
88+ // IsLocalCertificateUsed is expensive, but it does not change during the lifetime of the SslStream except for renegotiation, so we
89+ // can cache the value.
90+ private bool IsLocalClientCertificateUsed
91+ {
92+ get
93+ {
94+ if ( _localClientCertificateUsed == - 1 )
95+ {
96+ _localClientCertificateUsed = CertificateValidationPal . IsLocalCertificateUsed ( _credentialsHandle , _securityContext ! )
97+ ? 1
98+ : 0 ;
99+ }
100+
101+ return _localClientCertificateUsed == 1 ;
102+ }
103+ }
104+
85105 internal X509Certificate ? LocalClientCertificate
86106 {
87107 get
88108 {
89- if ( _selectedClientCertificate != null && CertificateValidationPal . IsLocalCertificateUsed ( _credentialsHandle , _securityContext ! ) )
109+ if ( _selectedClientCertificate != null && IsLocalClientCertificateUsed )
90110 {
91111 return _selectedClientCertificate ;
92112 }
0 commit comments