@@ -57,6 +57,9 @@ internal static bool DisableTlsResume
57
57
private X509Certificate2 ? _remoteCertificate ;
58
58
private bool _remoteCertificateExposed ;
59
59
60
+ // -1 for uninitialized, 0 for false, 1 for true, should be accessed via IsLocalClientCertificateUsed property
61
+ private int _localClientCertificateUsed = - 1 ;
62
+
60
63
// These are the MAX encrypt buffer output sizes, not the actual sizes.
61
64
private int _headerSize = 5 ; //ATTN must be set to at least 5 by default
62
65
private int _trailerSize = 16 ;
@@ -82,11 +85,28 @@ internal X509Certificate? LocalServerCertificate
82
85
}
83
86
}
84
87
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
+
85
105
internal X509Certificate ? LocalClientCertificate
86
106
{
87
107
get
88
108
{
89
- if ( _selectedClientCertificate != null && CertificateValidationPal . IsLocalCertificateUsed ( _credentialsHandle , _securityContext ! ) )
109
+ if ( _selectedClientCertificate != null && IsLocalClientCertificateUsed )
90
110
{
91
111
return _selectedClientCertificate ;
92
112
}
0 commit comments