Imported Upstream version 5.18.0.142

Former-commit-id: 7467d4b717762eeaf652d77f1486dd11ffb1ff1f
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2018-10-09 08:20:59 +00:00
parent e52655b4dc
commit 0abdbe5a7d
1547 changed files with 93792 additions and 47893 deletions

View File

@@ -26,143 +26,28 @@
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
#if SECURITY_DEP
#if MONO_SECURITY_ALIAS
extern alias MonoSecurity;
#endif
#if MONO_SECURITY_ALIAS
using MonoSecurity::Mono.Security.Interface;
using MX = MonoSecurity::Mono.Security.X509;
#else
#if MONO_FEATURE_BTLS
using Mono.Security.Interface;
#endif
using MX = Mono.Security.X509;
#endif
#if MONO_FEATURE_BTLS
using Mono.Btls;
#endif
#endif
using System.IO;
using System.Text;
using Mono;
namespace System.Security.Cryptography.X509Certificates
{
internal static class X509Helper2
{
internal static long GetSubjectNameHash (X509Certificate certificate)
{
return GetSubjectNameHash (certificate.Impl);
}
internal static long GetSubjectNameHash (X509CertificateImpl impl)
{
#if SECURITY_DEP
using (var x509 = GetNativeInstance (impl))
return GetSubjectNameHash (x509);
#else
throw new NotSupportedException ();
#endif
}
internal static void ExportAsPEM (X509Certificate certificate, Stream stream, bool includeHumanReadableForm)
{
ExportAsPEM (certificate.Impl, stream, includeHumanReadableForm);
}
internal static void ExportAsPEM (X509CertificateImpl impl, Stream stream, bool includeHumanReadableForm)
{
#if SECURITY_DEP
using (var x509 = GetNativeInstance (impl))
ExportAsPEM (x509, stream, includeHumanReadableForm);
#else
throw new NotSupportedException ();
#endif
}
#if SECURITY_DEP
internal static void Initialize ()
{
X509Helper.InstallNativeHelper (new MyNativeHelper ());
}
internal static void ThrowIfContextInvalid (X509CertificateImpl impl)
{
X509Helper.ThrowIfContextInvalid (impl);
}
#if !MONO_FEATURE_BTLS
static X509Certificate GetNativeInstance (X509CertificateImpl impl)
{
throw new PlatformNotSupportedException ();
}
#else
static MonoBtlsX509 GetNativeInstance (X509CertificateImpl impl)
{
ThrowIfContextInvalid (impl);
var btlsImpl = impl as X509CertificateImplBtls;
if (btlsImpl != null)
return btlsImpl.X509.Copy ();
else
return MonoBtlsX509.LoadFromData (impl.GetRawCertData (), MonoBtlsX509Format.DER);
}
internal static long GetSubjectNameHash (MonoBtlsX509 x509)
{
using (var subject = x509.GetSubjectName ())
return subject.GetHash ();
}
internal static void ExportAsPEM (MonoBtlsX509 x509, Stream stream, bool includeHumanReadableForm)
{
using (var bio = MonoBtlsBio.CreateMonoStream (stream)) {
x509.ExportAsPEM (bio, includeHumanReadableForm);
}
}
#endif // !MONO_FEATURE_BTLS
internal static X509Certificate2Impl Import (byte[] rawData, string password, X509KeyStorageFlags keyStorageFlags, bool disableProvider = false)
{
if (rawData == null || rawData.Length == 0)
return null;
#if MONO_FEATURE_BTLS
if (!disableProvider) {
var provider = MonoTlsProviderFactory.GetProvider ();
if (provider.HasNativeCertificates) {
var impl = provider.GetNativeCertificate (rawData, password, keyStorageFlags);
return impl;
}
}
#endif // MONO_FEATURE_BTLS
var impl2 = new X509Certificate2ImplMono ();
impl2.Import (rawData, password, keyStorageFlags);
return impl2;
}
internal static X509Certificate2Impl Import (X509Certificate cert, bool disableProvider = false)
{
if (cert.Impl == null)
return null;
#if MONO_FEATURE_BTLS
if (!disableProvider) {
var provider = MonoTlsProviderFactory.GetProvider ();
if (provider.HasNativeCertificates) {
var impl = provider.GetNativeCertificate (cert);
return impl;
}
}
#endif // MONO_FEATURE_BTLS
var impl2 = cert.Impl as X509Certificate2Impl;
if (impl2 != null)
return (X509Certificate2Impl)impl2.Clone ();
return Import (cert.GetRawCertData (), null, X509KeyStorageFlags.DefaultKeySet);
}
/*
* This is used by X509ChainImplMono
*
@@ -175,13 +60,15 @@ namespace System.Security.Cryptography.X509Certificates
[MonoTODO ("Investigate replacement; see comments in source.")]
internal static MX.X509Certificate GetMonoCertificate (X509Certificate2 certificate)
{
var impl2 = certificate.Impl as X509Certificate2Impl;
if (impl2 == null)
impl2 = Import (certificate, true);
var fallbackImpl = impl2.FallbackImpl as X509Certificate2ImplMono;
if (fallbackImpl == null)
throw new NotSupportedException ();
return fallbackImpl.MonoCertificate;
if (certificate.Impl is X509Certificate2ImplMono monoImpl)
return monoImpl.MonoCertificate;
if (certificate.Impl is X509Certificate2Impl impl2 && impl2.FallbackImpl is X509Certificate2ImplMono fallbackImpl)
return fallbackImpl.MonoCertificate;
var impl = SystemDependencyProvider.Instance.CertificateProvider.Import (certificate, CertificateImportFlags.DisableNativeBackend);
if (impl is X509Certificate2ImplMono fallbackImpl2)
return fallbackImpl2.MonoCertificate;
throw new NotSupportedException ();
}
internal static X509ChainImpl CreateChainImpl (bool useMachineContext)
@@ -205,18 +92,41 @@ namespace System.Security.Cryptography.X509Certificates
return new CryptographicException (Locale.GetText ("Chain instance is empty."));
}
class MyNativeHelper : INativeCertificateHelper
[Obsolete ("This is only used by Mono.Security's X509Store and will be replaced shortly.")]
internal static long GetSubjectNameHash (X509Certificate certificate)
{
public X509CertificateImpl Import (
byte[] data, string password, X509KeyStorageFlags flags)
{
return X509Helper2.Import (data, password, flags);
}
#if MONO_FEATURE_BTLS
X509Helper.ThrowIfContextInvalid (certificate.Impl);
using (var x509 = GetNativeInstance (certificate.Impl))
using (var subject = x509.GetSubjectName ())
return subject.GetHash ();
#else
throw new PlatformNotSupportedException ();
#endif
}
public X509CertificateImpl Import (X509Certificate cert)
{
return X509Helper2.Import (cert);
}
[Obsolete ("This is only used by Mono.Security's X509Store and will be replaced shortly.")]
internal static void ExportAsPEM (X509Certificate certificate, Stream stream, bool includeHumanReadableForm)
{
#if MONO_FEATURE_BTLS
X509Helper.ThrowIfContextInvalid (certificate.Impl);
using (var x509 = GetNativeInstance (certificate.Impl))
using (var bio = MonoBtlsBio.CreateMonoStream (stream))
x509.ExportAsPEM (bio, includeHumanReadableForm);
#else
throw new PlatformNotSupportedException ();
#endif
}
#if MONO_FEATURE_BTLS
static MonoBtlsX509 GetNativeInstance (X509CertificateImpl impl)
{
X509Helper.ThrowIfContextInvalid (impl);
var btlsImpl = impl as X509CertificateImplBtls;
if (btlsImpl != null)
return btlsImpl.X509.Copy ();
else
return MonoBtlsX509.LoadFromData (impl.RawData, MonoBtlsX509Format.DER);
}
#endif
}