2 * security-core-clr.c: CoreCLR security
5 * Mark Probst <mark.probst@gmail.com>
7 * Copyright 2007-2009 Novell, Inc (http://www.novell.com)
10 #include <mono/metadata/class-internals.h>
11 #include <mono/metadata/security-manager.h>
12 #include <mono/metadata/assembly.h>
13 #include <mono/metadata/appdomain.h>
14 #include <mono/metadata/verify-internals.h>
16 #include "security-core-clr.h"
18 gboolean mono_security_core_clr_test = FALSE;
21 security_critical_attribute (void)
23 static MonoClass *class = NULL;
26 class = mono_class_from_name (mono_defaults.corlib, "System.Security",
27 "SecurityCriticalAttribute");
34 security_safe_critical_attribute (void)
36 static MonoClass *class = NULL;
39 class = mono_class_from_name (mono_defaults.corlib, "System.Security",
40 "SecuritySafeCriticalAttribute");
46 MonoSecurityCoreCLRLevel
47 mono_security_core_clr_level_from_cinfo (MonoCustomAttrInfo *cinfo, MonoImage *image)
49 int level = MONO_SECURITY_CORE_CLR_TRANSPARENT;
51 if (!mono_security_core_clr_test && !mono_security_core_clr_is_platform_image (image))
54 if (cinfo && mono_custom_attrs_has_attr (cinfo, security_safe_critical_attribute ()))
55 level = MONO_SECURITY_CORE_CLR_SAFE_CRITICAL;
56 if (cinfo && mono_custom_attrs_has_attr (cinfo, security_critical_attribute ()))
57 level = MONO_SECURITY_CORE_CLR_CRITICAL;
62 MonoSecurityCoreCLRLevel
63 mono_security_core_clr_class_level (MonoClass *class)
65 MonoCustomAttrInfo *cinfo = mono_custom_attrs_from_class (class);
66 MonoSecurityCoreCLRLevel lvl = mono_security_core_clr_level_from_cinfo (cinfo, class->image);
69 mono_custom_attrs_free (cinfo);
71 if (lvl == MONO_SECURITY_CORE_CLR_TRANSPARENT && class->nested_in)
72 return mono_security_core_clr_class_level (class->nested_in);
77 MonoSecurityCoreCLRLevel
78 mono_security_core_clr_method_level (MonoMethod *method, gboolean with_class_level)
80 MonoCustomAttrInfo *cinfo = mono_custom_attrs_from_method (method);
81 MonoSecurityCoreCLRLevel level = mono_security_core_clr_level_from_cinfo (cinfo, method->klass->image);
83 if (with_class_level && level == MONO_SECURITY_CORE_CLR_TRANSPARENT)
84 level = mono_security_core_clr_class_level (method->klass);
87 mono_custom_attrs_free (cinfo);
93 mono_security_core_clr_is_platform_image (MonoImage *image)
95 const char *prefix = mono_assembly_getrootdir ();
96 int prefix_len = strlen (prefix);
97 static const char subprefix[] = "/mono/2.1/";
98 int subprefix_len = strlen (subprefix);
102 if (strncmp (prefix, image->name, prefix_len) != 0)
104 if (strncmp (subprefix, image->name + prefix_len, subprefix_len) != 0)
106 if (strchr (image->name + prefix_len + subprefix_len, '/'))
112 mono_security_enable_core_clr ()
114 mono_verifier_set_mode (MONO_VERIFIER_MODE_VERIFIABLE);
115 mono_security_set_mode (MONO_SECURITY_MODE_CORE_CLR);