3 using System.Runtime.InteropServices;
4 using System.Reflection;
6 [SecurityCriticalAttribute]
11 //Console.WriteLine ("c ctor");
14 public virtual void Method ()
16 //Console.WriteLine ("c class");
19 public static void StaticMethod ()
21 //Console.WriteLine ("c class static");
25 [SecuritySafeCriticalAttribute]
30 //Console.WriteLine ("sc ctor");
33 public virtual void Method ()
35 //Console.WriteLine ("sc class");
36 CClass cc = new CClass ();
41 public class SCDevClass : SCClass
45 Test.error ("safe-critical-derived class instantiated");
48 public override void Method ()
51 Test.error ("safe-critical-derived method called");
55 public class CMethodClass
57 public CMethodClass ()
59 //Console.WriteLine ("cmethod ctor");
62 [SecurityCriticalAttribute]
63 public virtual void Method ()
65 //Console.WriteLine ("cmethod");
69 public class CMethodDevClass : CMethodClass
71 public CMethodDevClass ()
73 Test.error ("critical-derived constructor called");
76 public override void Method ()
79 Test.error ("critical-derived method called");
83 public interface CMethodInterface {
84 [SecurityCriticalAttribute]
88 public class CInterfaceClass : CMethodInterface {
89 public CInterfaceClass () { }
93 Test.error ("security-critical-interface-derived method called");
97 [SecurityCriticalAttribute]
98 public class CriticalClass {
100 public class NestedClassInsideCritical {
102 static public void Method ()
104 Test.error ("critical inner class method called");
109 public class TransparentBaseClass {
110 public virtual void TransparentMethod ()
114 [SecuritySafeCritical]
115 public virtual void SafeCriticalMethod ()
120 public virtual void CriticalMethod ()
125 public class BadTransparentOverrideClass : TransparentBaseClass {
127 public override void TransparentMethod ()
129 Test.error ("this method is critical and cannot override its base (transparent)");
133 public class BadSafeCriticalOverrideClass : TransparentBaseClass {
135 public override void SafeCriticalMethod ()
137 Test.error ("this method is critical and cannot override its base (safe critical)");
141 public class BadCriticalOverrideClass : TransparentBaseClass {
142 public override void CriticalMethod ()
144 Test.error ("this method is NOT critical and cannot override its base (critical)");
148 public delegate void MethodDelegate ();
150 public delegate Object InvokeDelegate (Object obj, Object[] parms);
152 // the 0.1% case from http://blogs.msdn.com/shawnfa/archive/2007/05/11/silverlight-security-iii-inheritance.aspx
153 public class TransparentClassWithSafeCriticalDefaultConstructor {
155 [SecuritySafeCritical]
156 public TransparentClassWithSafeCriticalDefaultConstructor ()
161 public class TransparentInheritFromSafeCriticalDefaultConstructor : TransparentClassWithSafeCriticalDefaultConstructor {
163 public TransparentInheritFromSafeCriticalDefaultConstructor ()
168 public class SafeInheritFromSafeCriticalDefaultConstructor : TransparentClassWithSafeCriticalDefaultConstructor {
170 [SecuritySafeCritical]
171 public SafeInheritFromSafeCriticalDefaultConstructor ()
178 static bool haveError = false;
180 public static void error (string text)
182 Console.WriteLine (text);
186 [SecurityCriticalAttribute]
187 static void CMethod ()
189 //Console.WriteLine ("c");
192 [SecuritySafeCriticalAttribute]
193 static void SCMethod ()
195 //Console.WriteLine ("sc");
199 static void doSCDev ()
201 SCDevClass scdev = new SCDevClass ();
205 static void doCMethodDev ()
207 CMethodDevClass cmdev = new CMethodDevClass ();
208 error ("critical-derived object instantiated");
210 Console.WriteLine ("critical-derived method called");
213 static void doSCInterfaceDev ()
215 CMethodInterface mi = new CInterfaceClass ();
216 error ("safe-critical-interface-derived object instantiated");
218 error ("safe-critical-interface-derived method called");
222 static unsafe void unsafeMethod ()
225 error ("unsafe method called");
229 static void doBadTransparentOverrideClass ()
231 new BadTransparentOverrideClass ();
234 static void doBadSafeCriticalOverrideClass ()
236 new BadSafeCriticalOverrideClass ();
239 static void doBadCriticalOverrideClass ()
241 new BadCriticalOverrideClass ();
244 public static void TransparentReflectionCMethod ()
248 [SecurityCriticalAttribute]
249 public static void ReflectionCMethod ()
251 error ("method called via reflection");
254 [SecurityCriticalAttribute]
255 public static unsafe void StringTest ()
257 string str = "blabla";
258 char [] arr = str.ToCharArray ();
261 fixed (char *tarr = arr) {
263 r = new string (tarr, ss, l - ss);
267 [SecuritySafeCriticalAttribute]
268 public static void CallStringTest ()
273 [DllImport ("/lib64/libc.so.6")]
274 static extern int getpid ();
276 public static int Main ()
282 error ("static critical method called");
283 } catch (MethodAccessException) {
286 SCClass sc = new SCClass ();
290 CClass c = new CClass (); // Illegal
291 error ("critical object instantiated");
292 c.Method (); // Illegal
293 error ("critical method called");
294 } catch (MethodAccessException) {
299 error ("security-critical-derived class error");
300 } catch (TypeLoadException) {
305 } catch (TypeLoadException) {
310 error ("pinvoke called");
311 } catch (MethodAccessException) {
315 MethodDelegate md = new MethodDelegate (CClass.StaticMethod);
317 error ("critical method called via delegate");
318 } catch (MethodAccessException) {
322 CriticalClass.NestedClassInsideCritical.Method ();
323 } catch (MethodAccessException) {
328 } catch (TypeLoadException) {
334 } catch (VerificationException) {
339 Type type = Type.GetType ("Test");
340 MethodInfo method = type.GetMethod ("TransparentReflectionCMethod");
342 method.Invoke(null, null);
343 } catch (MethodAccessException) {
344 error ("transparent method not called via reflection");
348 Type type = Type.GetType ("Test");
349 MethodInfo method = type.GetMethod ("ReflectionCMethod");
351 method.Invoke(null, null);
352 } catch (MethodAccessException) {
356 Type type = Type.GetType ("Test");
357 MethodInfo method = type.GetMethod ("TransparentReflectionCMethod");
358 InvokeDelegate id = new InvokeDelegate (method.Invoke);
361 } catch (MethodAccessException) {
362 error ("transparent method not called via reflection delegate");
366 Type type = Type.GetType ("Test");
367 MethodInfo method = type.GetMethod ("ReflectionCMethod");
368 InvokeDelegate id = new InvokeDelegate (method.Invoke);
371 } catch (MethodAccessException) {
378 } catch (MethodAccessException) {
379 error ("string test failed");
383 doBadTransparentOverrideClass ();
384 error ("BadTransparentOverrideClass error");
385 } catch (TypeLoadException) {
389 doBadSafeCriticalOverrideClass ();
390 error ("BadSafeCriticalOverrideClass error");
391 } catch (TypeLoadException) {
395 doBadCriticalOverrideClass ();
396 error ("BadCriticalOverrideClass error");
397 } catch (TypeLoadException) {
400 new TransparentClassWithSafeCriticalDefaultConstructor ();
402 new TransparentInheritFromSafeCriticalDefaultConstructor ();
403 } catch (TypeLoadException) {
405 new SafeInheritFromSafeCriticalDefaultConstructor ();
410 // Console.WriteLine ("ok");