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 static MonoSecurityCoreCLRLevel
47 mono_security_core_clr_level_from_cinfo (MonoCustomAttrInfo *cinfo, MonoImage *image)
49 int level = MONO_SECURITY_CORE_CLR_TRANSPARENT;
51 if (cinfo && mono_custom_attrs_has_attr (cinfo, security_safe_critical_attribute ()))
52 level = MONO_SECURITY_CORE_CLR_SAFE_CRITICAL;
53 if (cinfo && mono_custom_attrs_has_attr (cinfo, security_critical_attribute ()))
54 level = MONO_SECURITY_CORE_CLR_CRITICAL;
59 MonoSecurityCoreCLRLevel
60 mono_security_core_clr_class_level (MonoClass *class)
62 MonoCustomAttrInfo *cinfo;
63 MonoSecurityCoreCLRLevel level = MONO_SECURITY_CORE_CLR_TRANSPARENT;
65 /* non-platform code is always Transparent - whatever the attributes says */
66 if (!mono_security_core_clr_test && !mono_security_core_clr_is_platform_image (class->image))
69 cinfo = mono_custom_attrs_from_class (class);
71 level = mono_security_core_clr_level_from_cinfo (cinfo, class->image);
72 mono_custom_attrs_free (cinfo);
75 if (level == MONO_SECURITY_CORE_CLR_TRANSPARENT && class->nested_in)
76 level = mono_security_core_clr_class_level (class->nested_in);
81 MonoSecurityCoreCLRLevel
82 mono_security_core_clr_method_level (MonoMethod *method, gboolean with_class_level)
84 MonoCustomAttrInfo *cinfo;
85 MonoSecurityCoreCLRLevel level = MONO_SECURITY_CORE_CLR_TRANSPARENT;
87 /* non-platform code is always Transparent - whatever the attributes says */
88 if (!mono_security_core_clr_test && !mono_security_core_clr_is_platform_image (method->klass->image))
91 cinfo = mono_custom_attrs_from_method (method);
93 level = mono_security_core_clr_level_from_cinfo (cinfo, method->klass->image);
94 mono_custom_attrs_free (cinfo);
97 if (with_class_level && level == MONO_SECURITY_CORE_CLR_TRANSPARENT)
98 level = mono_security_core_clr_class_level (method->klass);
104 mono_security_core_clr_is_platform_image (MonoImage *image)
106 const char *prefix = mono_assembly_getrootdir ();
107 int prefix_len = strlen (prefix);
108 static const char subprefix[] = "/mono/2.1/";
109 int subprefix_len = strlen (subprefix);
113 if (strncmp (prefix, image->name, prefix_len) != 0)
115 if (strncmp (subprefix, image->name + prefix_len, subprefix_len) != 0)
117 if (strchr (image->name + prefix_len + subprefix_len, '/'))
123 mono_security_enable_core_clr ()
125 mono_verifier_set_mode (MONO_VERIFIER_MODE_VERIFIABLE);
126 mono_security_set_mode (MONO_SECURITY_MODE_CORE_CLR);