Imported Upstream version 5.16.0.144

Former-commit-id: 2b9e8926e7df56dfea2d6991a64c8f5129cfffcb
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2018-09-05 08:26:42 +00:00
parent 6dab091a3e
commit 47a1b3e592
53 changed files with 201 additions and 108 deletions

View File

@@ -215,93 +215,100 @@ namespace Mono.Btls
bool success, ref MonoSslPolicyErrors errors, ref int status11)
{
status11 = unchecked((int)0);
if (!success) {
errors = MonoSslPolicyErrors.RemoteCertificateChainErrors;
var error = storeCtx.GetError();
if (error != Mono.Btls.MonoBtlsX509Error.OK &
error != Mono.Btls.MonoBtlsX509Error.CRL_NOT_YET_VALID) {
chain.Impl.AddStatus(MapVerifyErrorToChainStatus(error));
status11 = unchecked((int)0x800B010B);
}
if (success)
return;
errors = MonoSslPolicyErrors.RemoteCertificateChainErrors;
if (!wantsChain || storeCtx == null || chain == null) {
status11 = unchecked((int)0x800B010B);
return;
}
var error = storeCtx.GetError();
if (error != Mono.Btls.MonoBtlsX509Error.OK &
error != Mono.Btls.MonoBtlsX509Error.CRL_NOT_YET_VALID) {
chain.Impl.AddStatus(MapVerifyErrorToChainStatus(error));
status11 = unchecked((int)0x800B010B);
}
}
internal static X509ChainStatusFlags MapVerifyErrorToChainStatus(MonoBtlsX509Error code)
internal static X509ChainStatusFlags MapVerifyErrorToChainStatus (MonoBtlsX509Error code)
{
switch (code)
{
case Mono.Btls.MonoBtlsX509Error.OK :
return X509ChainStatusFlags.NoError;
switch (code) {
case MonoBtlsX509Error.OK :
return X509ChainStatusFlags.NoError;
case Mono.Btls.MonoBtlsX509Error.CERT_NOT_YET_VALID :
case Mono.Btls.MonoBtlsX509Error.CERT_HAS_EXPIRED:
case Mono.Btls.MonoBtlsX509Error.ERROR_IN_CERT_NOT_BEFORE_FIELD:
case Mono.Btls.MonoBtlsX509Error.ERROR_IN_CERT_NOT_AFTER_FIELD:
return X509ChainStatusFlags.NotTimeValid;
case MonoBtlsX509Error.CERT_NOT_YET_VALID :
case MonoBtlsX509Error.CERT_HAS_EXPIRED:
case MonoBtlsX509Error.ERROR_IN_CERT_NOT_BEFORE_FIELD:
case MonoBtlsX509Error.ERROR_IN_CERT_NOT_AFTER_FIELD:
return X509ChainStatusFlags.NotTimeValid;
case Mono.Btls.MonoBtlsX509Error.CERT_REVOKED:
return X509ChainStatusFlags.Revoked;
case MonoBtlsX509Error.CERT_REVOKED:
return X509ChainStatusFlags.Revoked;
case Mono.Btls.MonoBtlsX509Error.UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
case Mono.Btls.MonoBtlsX509Error.CERT_SIGNATURE_FAILURE:
return X509ChainStatusFlags.NotSignatureValid;
case MonoBtlsX509Error.UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
case MonoBtlsX509Error.CERT_SIGNATURE_FAILURE:
return X509ChainStatusFlags.NotSignatureValid;
case Mono.Btls.MonoBtlsX509Error.CERT_UNTRUSTED:
case Mono.Btls.MonoBtlsX509Error.DEPTH_ZERO_SELF_SIGNED_CERT:
case Mono.Btls.MonoBtlsX509Error.SELF_SIGNED_CERT_IN_CHAIN:
return X509ChainStatusFlags.UntrustedRoot;
case MonoBtlsX509Error.CERT_UNTRUSTED:
case MonoBtlsX509Error.DEPTH_ZERO_SELF_SIGNED_CERT:
case MonoBtlsX509Error.SELF_SIGNED_CERT_IN_CHAIN:
return X509ChainStatusFlags.UntrustedRoot;
case Mono.Btls.MonoBtlsX509Error.CRL_HAS_EXPIRED:
return X509ChainStatusFlags.OfflineRevocation;
case MonoBtlsX509Error.CRL_HAS_EXPIRED:
return X509ChainStatusFlags.OfflineRevocation;
case Mono.Btls.MonoBtlsX509Error.CRL_NOT_YET_VALID:
case Mono.Btls.MonoBtlsX509Error.CRL_SIGNATURE_FAILURE:
case Mono.Btls.MonoBtlsX509Error.ERROR_IN_CRL_LAST_UPDATE_FIELD:
case Mono.Btls.MonoBtlsX509Error.ERROR_IN_CRL_NEXT_UPDATE_FIELD:
case Mono.Btls.MonoBtlsX509Error.KEYUSAGE_NO_CRL_SIGN:
case Mono.Btls.MonoBtlsX509Error.UNABLE_TO_DECRYPT_CRL_SIGNATURE:
case Mono.Btls.MonoBtlsX509Error.UNABLE_TO_GET_CRL:
case Mono.Btls.MonoBtlsX509Error.UNABLE_TO_GET_CRL_ISSUER:
case Mono.Btls.MonoBtlsX509Error.UNHANDLED_CRITICAL_CRL_EXTENSION:
return X509ChainStatusFlags.RevocationStatusUnknown;
case MonoBtlsX509Error.CRL_NOT_YET_VALID:
case MonoBtlsX509Error.CRL_SIGNATURE_FAILURE:
case MonoBtlsX509Error.ERROR_IN_CRL_LAST_UPDATE_FIELD:
case MonoBtlsX509Error.ERROR_IN_CRL_NEXT_UPDATE_FIELD:
case MonoBtlsX509Error.KEYUSAGE_NO_CRL_SIGN:
case MonoBtlsX509Error.UNABLE_TO_DECRYPT_CRL_SIGNATURE:
case MonoBtlsX509Error.UNABLE_TO_GET_CRL:
case MonoBtlsX509Error.UNABLE_TO_GET_CRL_ISSUER:
case MonoBtlsX509Error.UNHANDLED_CRITICAL_CRL_EXTENSION:
return X509ChainStatusFlags.RevocationStatusUnknown;
case Mono.Btls.MonoBtlsX509Error.INVALID_EXTENSION:
return X509ChainStatusFlags.InvalidExtension;
case MonoBtlsX509Error.INVALID_EXTENSION:
return X509ChainStatusFlags.InvalidExtension;
case Mono.Btls.MonoBtlsX509Error.UNABLE_TO_GET_ISSUER_CERT:
case Mono.Btls.MonoBtlsX509Error.UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
case Mono.Btls.MonoBtlsX509Error.UNABLE_TO_VERIFY_LEAF_SIGNATURE:
return X509ChainStatusFlags.PartialChain;
case MonoBtlsX509Error.UNABLE_TO_GET_ISSUER_CERT:
case MonoBtlsX509Error.UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
case MonoBtlsX509Error.UNABLE_TO_VERIFY_LEAF_SIGNATURE:
return X509ChainStatusFlags.PartialChain;
case Mono.Btls.MonoBtlsX509Error.INVALID_PURPOSE:
return X509ChainStatusFlags.NotValidForUsage;
case MonoBtlsX509Error.INVALID_PURPOSE:
return X509ChainStatusFlags.NotValidForUsage;
case Mono.Btls.MonoBtlsX509Error.INVALID_CA:
case Mono.Btls.MonoBtlsX509Error.INVALID_NON_CA:
case Mono.Btls.MonoBtlsX509Error.PATH_LENGTH_EXCEEDED:
case Mono.Btls.MonoBtlsX509Error.KEYUSAGE_NO_CERTSIGN:
case Mono.Btls.MonoBtlsX509Error.KEYUSAGE_NO_DIGITAL_SIGNATURE:
return X509ChainStatusFlags.InvalidBasicConstraints;
case MonoBtlsX509Error.INVALID_CA:
case MonoBtlsX509Error.INVALID_NON_CA:
case MonoBtlsX509Error.PATH_LENGTH_EXCEEDED:
case MonoBtlsX509Error.KEYUSAGE_NO_CERTSIGN:
case MonoBtlsX509Error.KEYUSAGE_NO_DIGITAL_SIGNATURE:
return X509ChainStatusFlags.InvalidBasicConstraints;
case Mono.Btls.MonoBtlsX509Error.INVALID_POLICY_EXTENSION:
case Mono.Btls.MonoBtlsX509Error.NO_EXPLICIT_POLICY:
return X509ChainStatusFlags.InvalidPolicyConstraints;
case MonoBtlsX509Error.INVALID_POLICY_EXTENSION:
case MonoBtlsX509Error.NO_EXPLICIT_POLICY:
return X509ChainStatusFlags.InvalidPolicyConstraints;
case Mono.Btls.MonoBtlsX509Error.CERT_REJECTED:
return X509ChainStatusFlags.ExplicitDistrust;
case MonoBtlsX509Error.CERT_REJECTED:
return X509ChainStatusFlags.ExplicitDistrust;
case Mono.Btls.MonoBtlsX509Error.UNHANDLED_CRITICAL_EXTENSION:
return X509ChainStatusFlags.HasNotSupportedCriticalExtension;
case MonoBtlsX509Error.UNHANDLED_CRITICAL_EXTENSION:
return X509ChainStatusFlags.HasNotSupportedCriticalExtension;
case Mono.Btls.MonoBtlsX509Error.CERT_CHAIN_TOO_LONG:
throw new CryptographicException();
case MonoBtlsX509Error.HOSTNAME_MISMATCH:
// FIXME: we should have a better error flag for this.
return X509ChainStatusFlags.UntrustedRoot;
case Mono.Btls.MonoBtlsX509Error.OUT_OF_MEM:
throw new OutOfMemoryException();
case MonoBtlsX509Error.CERT_CHAIN_TOO_LONG:
throw new CryptographicException ();
case MonoBtlsX509Error.OUT_OF_MEM:
throw new OutOfMemoryException ();
default:
throw new CryptographicException("Unrecognized X509VerifyStatusCode:" + code);
}
throw new CryptographicException ("Unrecognized X509VerifyStatusCode:" + code);
}
}
internal static void SetupCertificateStore (MonoBtlsX509Store store, MonoTlsSettings settings, bool server)

View File

@@ -77,7 +77,7 @@ namespace Mono.Net.Security
Settings = settings;
Provider = provider;
readBuffer = new BufferOffsetSize2 (16834);
readBuffer = new BufferOffsetSize2 (16500);
writeBuffer = new BufferOffsetSize2 (16384);
operation = Operation.None;
}

View File

@@ -50,7 +50,7 @@ using System.Security.Cryptography;
namespace Mono.Net.Security
{
class MonoTlsStream
class MonoTlsStream : IDisposable
{
#if SECURITY_DEP
readonly MonoTlsProvider provider;
@@ -136,6 +136,7 @@ namespace Mono.Net.Security
request.ServicePoint.UpdateClientCertificate (sslStream.InternalLocalCertificate);
else {
request.ServicePoint.UpdateClientCertificate (null);
sslStream.Dispose ();
sslStream = null;
}
}
@@ -154,5 +155,13 @@ namespace Mono.Net.Security
throw new PlatformNotSupportedException (EXCEPTION_MESSAGE);
#endif
}
public void Dispose ()
{
if (sslStream != null) {
sslStream.Dispose ();
sslStream = null;
}
}
}
}

View File

@@ -405,6 +405,7 @@ namespace System.Net
void CloseSocket ()
{
lock (this) {
Debug ($"WC CLOSE SOCKET: Cnc={ID} NS={networkStream} TLS={monoTlsStream}");
if (networkStream != null) {
try {
networkStream.Dispose ();
@@ -412,6 +413,13 @@ namespace System.Net
networkStream = null;
}
if (monoTlsStream != null) {
try {
monoTlsStream.Dispose ();
} catch { }
monoTlsStream = null;
}
if (socket != null) {
try {
socket.Dispose ();

View File

@@ -41,7 +41,7 @@ namespace System.Net
}
#if MONO_WEB_DEBUG
internal string ME => $"WRS({GetType ().Name}:Op={operation.ID})";
internal string ME => $"WRS({GetType ().Name}:Op={Operation.ID})";
#else
internal string ME => null;
#endif