Merge pull request #496 from nicolas-raoul/unit-test-for-issue2907
[mono.git] / mcs / class / System.Core / System.Security.Cryptography / Aes.cs
index d65743ab2ab35148277f639e6aecb72e534d0b84..cb2ddbc93fab41b52784ebb551f562efa1c2856b 100644 (file)
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
+
+// Since 4.0 (both FX and SL) this type is defined in mscorlib - before 4.0 it was in System.Core.dll
+#if (INSIDE_CORLIB && (NET_4_0 || MOONLIGHT || MOBILE)) || (!INSIDE_CORLIB && !NET_4_0 && !MOONLIGHT && !MOBILE)
 \r
+using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 \r
 namespace System.Security.Cryptography {\r
@@ -37,24 +41,44 @@ namespace System.Security.Cryptography {
        // References:
        // a.   FIPS PUB 197: Advanced Encryption Standard
        //      http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
-\r
+
+#if INSIDE_CORLIB
+       // since 4.0 (both FX and SL) this type now resides inside mscorlib.dll and link back to System.Core.dll\r
+       #if MOONLIGHT || MOBILE
+       // version has not changed between SL3 (System.Core) and SL4
+       [TypeForwardedFrom (Consts.AssemblySystem_Core)]
+       #elif NET_4_0
+       // use 3.5 version
+       [TypeForwardedFrom ("System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
+       #endif
+#endif
        public abstract class Aes : SymmetricAlgorithm {\r
-\r
+
                public static new Aes Create () \r
                {\r
-                       return Create ("System.Security.Cryptography.AesManaged, System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");\r
+#if FULL_AOT_RUNTIME\r
+                       // The Aes base class was moved from System.Core to mscorlib - so we can't just return a new AesCryptoServiceProvider instance\r
+                       // note: the linker is aware of this condition\r
+                       return (Aes) Activator.CreateInstance (Type.GetType ("System.Security.Cryptography.AesCryptoServiceProvider, " + Consts.AssemblySystem_Core));\r
+#elif MOBILE\r
+                       // there was a mixup in the MOBILE profile, to be compatible with Silverlight it's\r
+                       // AesManaged that should have been provided, not AesCryptoServiceProvider\r
+                       return Create ("System.Security.Cryptography.AesCryptoServiceProvider, " + Consts.AssemblySystem_Core);\r
+#else\r
+                       return Create ("System.Security.Cryptography.AesManaged, " + Consts.AssemblySystem_Core);\r
+#endif\r
                }\r
 \r
-               public static new Aes Create (string algName) \r
+               public static new Aes Create (string algorithmName) \r
                {\r
-                       return (Aes) CryptoConfig.CreateFromName (algName);\r
+                       return (Aes) CryptoConfig.CreateFromName (algorithmName);\r
                }\r
 
                protected Aes ()
                {\r
                        KeySizeValue = 256;\r
                        BlockSizeValue = 128;
-#if !NET_2_1
+#if !MOONLIGHT
                        // Silverlight 2.0 only supports CBC mode (i.e. no feedback)\r
                        FeedbackSizeValue = 128;
 #endif\r
@@ -66,3 +90,5 @@ namespace System.Security.Cryptography {
                }\r
        }\r
 }\r
+#endif
+