Merge pull request #2800 from BrzVlad/feature-lazy-sweep
[mono.git] / mcs / class / System / System.Security.Cryptography.X509Certificates / X509Helper2.cs
1 //
2 // X509Helper2.cs
3 //
4 // Authors:
5 //      Martin Baulig  <martin.baulig@xamarin.com>
6 //
7 // Copyright (C) 2016 Xamarin, Inc. (http://www.xamarin.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 #if SECURITY_DEP
30 #if MONO_SECURITY_ALIAS
31 extern alias MonoSecurity;
32 #endif
33 #if MONO_X509_ALIAS
34 extern alias PrebuiltSystem;
35 #endif
36
37 #if MONO_SECURITY_ALIAS
38 using MonoSecurity::Mono.Security.Interface;
39 #else
40 using Mono.Security.Interface;
41 #endif
42
43 namespace System.Security.Cryptography.X509Certificates
44 {
45         internal static class X509Helper2
46         {
47                 internal static void Initialize ()
48                 {
49                         X509Helper.InstallNativeHelper (new MyNativeHelper ());
50                 }
51
52                 internal static void ThrowIfContextInvalid (X509CertificateImpl impl)
53                 {
54                         X509Helper.ThrowIfContextInvalid (impl);
55                 }
56
57                 internal static X509Certificate2Impl Import (byte[] rawData, string password, X509KeyStorageFlags keyStorageFlags)
58                 {
59                         var provider = MonoTlsProviderFactory.GetProvider ();
60                         if (provider.HasNativeCertificates) {
61                                 var impl = provider.GetNativeCertificate (rawData, password, keyStorageFlags);
62                                 return (X509Certificate2Impl)(object)impl;
63                         } else {
64                                 var impl = new X509Certificate2ImplMono ();
65                                 impl.Import (rawData, password, keyStorageFlags);
66                                 return impl;
67                         }
68                 }
69
70                 internal static X509Certificate2Impl Import (X509Certificate cert)
71                 {
72                         var provider = MonoTlsProviderFactory.GetProvider ();
73                         if (provider.HasNativeCertificates) {
74                                 var impl = provider.GetNativeCertificate (cert);
75                                 return (X509Certificate2Impl)(object)impl;
76                         }
77                         var impl2 = cert.Impl as X509Certificate2Impl;
78                         if (impl2 != null)
79                                 return (X509Certificate2Impl)impl2.Clone ();
80                         return Import (cert.GetRawCertData (), null, X509KeyStorageFlags.DefaultKeySet);
81                 }
82
83                 internal static X509ChainImpl CreateChainImpl (bool useMachineContext)
84                 {
85                         return new X509ChainImplMono (useMachineContext);
86                 }
87
88                 public static bool IsValid (X509ChainImpl impl)
89                 {
90                         return impl != null && impl.IsValid;
91                 }
92
93                 internal static void ThrowIfContextInvalid (X509ChainImpl impl)
94                 {
95                         if (!IsValid (impl))
96                                 throw GetInvalidChainContextException ();
97                 }
98
99                 internal static Exception GetInvalidChainContextException ()
100                 {
101                         return new CryptographicException (Locale.GetText ("Chain instance is empty."));
102                 }
103
104                 class MyNativeHelper : INativeCertificateHelper
105                 {
106                         public X509CertificateImpl Import (
107                                 byte[] data, string password, X509KeyStorageFlags flags)
108                         {
109                                 return X509Helper2.Import (data, password, flags);
110                         }
111
112                         public X509CertificateImpl Import (X509Certificate cert)
113                         {
114                                 return X509Helper2.Import (cert);
115                         }
116                 }
117         }
118 }
119 #endif