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
);