X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fsecurity.c;h=f621f319eb881c2b96bb52cc20bd50bf615e1e16;hb=7a7f424a903ff246b89a455a6fbd801d5b6b0577;hp=9004f38233b30d11d2b654ca6deafc412139ae95;hpb=f99ce750ee781a2584e849a0264300fa4d99aaaa;p=mono.git diff --git a/mono/metadata/security.c b/mono/metadata/security.c index 9004f38233b..f621f319eb8 100644 --- a/mono/metadata/security.c +++ b/mono/metadata/security.c @@ -11,6 +11,7 @@ #include #endif +#include #include #include #include @@ -964,3 +965,45 @@ ves_icall_System_Security_Policy_Evidence_IsAuthenticodePresent (MonoReflectionA } return FALSE; } + + +/* System.Security.SecureString related internal calls */ + +static MonoImage *system_security_assembly = NULL; + +void +ves_icall_System_Security_SecureString_DecryptInternal (MonoArray *data, MonoObject *scope) +{ + invoke_protected_memory_method (data, scope, FALSE); +} +void +ves_icall_System_Security_SecureString_EncryptInternal (MonoArray* data, MonoObject *scope) +{ + invoke_protected_memory_method (data, scope, TRUE); +} + +void invoke_protected_memory_method (MonoArray *data, MonoObject *scope, gboolean encrypt) +{ + MonoClass *klass; + MonoMethod *method; + void *params [2]; + + MONO_ARCH_SAVE_REGS; + + if (system_security_assembly == NULL) { + system_security_assembly = mono_image_loaded ("System.Security"); + if (!system_security_assembly) { + MonoAssembly *sa = mono_assembly_open ("System.Security.dll", NULL); + if (!sa) + g_assert_not_reached (); + system_security_assembly = mono_assembly_get_image (sa); + } + } + + klass = mono_class_from_name (system_security_assembly, + "System.Security.Cryptography", "ProtectedMemory"); + method = mono_class_get_method_from_name (klass, encrypt ? "Protect" : "Unprotect", 2); + params [0] = data; + params [1] = scope; /* MemoryProtectionScope.SameProcess */ + mono_runtime_invoke (method, NULL, params, NULL); +}