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 ();
277 static void ArraysCreatedByTransparentCaller ()
279 // Transparent creating an array of a Critical type
280 // using Class[] (rank == 1) throws a TypeLoadException on SL2 - but that looks like a bug
281 // reported as https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=490406
282 CClass
[] c_array
= new CClass
[0];
283 // Transparent creating an array of a SafeCritical type
284 SCClass
[] sc_array
= new SCClass
[0];
286 // Transparent creating a multidimentional array of a Critical type
287 CClass
[,] c_multi
= new CClass
[0,0];
288 // Transparent creating a multidimentional array of a SafeCritical type
289 SCClass
[,] sc_multi
= new SCClass
[0,0];
291 // Transparent creating a jagged array of a Critical type
292 CClass
[][] c_jagged
= new CClass
[0][];
293 // Transparent creating a jagged array of a Critical type
294 SCClass
[][] sc_jagged
= new SCClass
[0][];
297 [SecuritySafeCritical
]
298 static void ArraysCreatedBySafeCriticalCaller ()
300 // SafeCritical creating an array of a Critical type
301 CClass
[] c_array
= new CClass
[0];
302 // SafeCritical creating an array of a SafeCritical type
303 SCClass
[] sc_array
= new SCClass
[0];
305 // SafeCritical creating a multidimentional array of a Critical type
306 CClass
[,] c_multi
= new CClass
[0,0];
307 // SafeCritical creating a multidimentional array of a SafeCritical type
308 SCClass
[,] sc_multi
= new SCClass
[0,0];
310 // SafeCritical creating a jagged array of a Critical type
311 CClass
[][] c_jagged
= new CClass
[0][];
312 // SafeCritical creating a jagged array of a Critical type
313 SCClass
[][] sc_jagged
= new SCClass
[0][];
315 // Transparent Main could not call a critical method by itself
316 ArraysCreatedByCriticalCaller ();
320 static void ArraysCreatedByCriticalCaller ()
322 // Critical creating an array of a Critical type
323 CClass
[] c_array
= new CClass
[0];
324 // Critical creating an array of a SafeCritical type
325 SCClass
[] sc_array
= new SCClass
[0];
327 // Critical creating a multidimentional array of a Critical type
328 CClass
[,] c_multi
= new CClass
[0,0];
329 // Critical creating a multidimentional array of a SafeCritical type
330 SCClass
[,] sc_multi
= new SCClass
[0,0];
332 // Critical creating a jagged array of a Critical type
333 CClass
[][] c_jagged
= new CClass
[0][];
334 // Critical creating a jagged array of a Critical type
335 SCClass
[][] sc_jagged
= new SCClass
[0][];
338 public static int Main ()
344 error ("static critical method called");
345 } catch (MethodAccessException
) {
348 SCClass sc
= new SCClass ();
352 CClass c
= new CClass (); // Illegal
353 error ("critical object instantiated");
354 c
.Method (); // Illegal
355 error ("critical method called");
356 } catch (MethodAccessException
) {
361 error ("security-critical-derived class error");
362 } catch (TypeLoadException
) {
367 } catch (TypeLoadException
) {
372 error ("pinvoke called");
373 } catch (MethodAccessException
) {
377 MethodDelegate md
= new MethodDelegate (CClass
.StaticMethod
);
379 error ("critical method called via delegate");
380 } catch (MethodAccessException
) {
384 CriticalClass
.NestedClassInsideCritical
.Method ();
385 } catch (MethodAccessException
) {
390 } catch (TypeLoadException
) {
396 } catch (VerificationException) {
401 Type type
= Type
.GetType ("Test");
402 MethodInfo method
= type
.GetMethod ("TransparentReflectionCMethod");
404 method
.Invoke(null, null);
405 } catch (MethodAccessException
) {
406 error ("transparent method not called via reflection");
410 Type type
= Type
.GetType ("Test");
411 MethodInfo method
= type
.GetMethod ("ReflectionCMethod");
413 method
.Invoke(null, null);
414 } catch (MethodAccessException
) {
418 Type type
= Type
.GetType ("Test");
419 MethodInfo method
= type
.GetMethod ("TransparentReflectionCMethod");
420 InvokeDelegate id
= new InvokeDelegate (method
.Invoke
);
423 } catch (MethodAccessException
) {
424 error ("transparent method not called via reflection delegate");
428 Type type
= Type
.GetType ("Test");
429 MethodInfo method
= type
.GetMethod ("ReflectionCMethod");
430 InvokeDelegate id
= new InvokeDelegate (method
.Invoke
);
433 } catch (MethodAccessException
) {
440 } catch (MethodAccessException
) {
441 error ("string test failed");
445 doBadTransparentOverrideClass ();
446 error ("BadTransparentOverrideClass error");
447 } catch (TypeLoadException
) {
451 doBadSafeCriticalOverrideClass ();
452 error ("BadSafeCriticalOverrideClass error");
453 } catch (TypeLoadException
) {
457 doBadCriticalOverrideClass ();
458 error ("BadCriticalOverrideClass error");
459 } catch (TypeLoadException
) {
462 new TransparentClassWithSafeCriticalDefaultConstructor ();
464 new TransparentInheritFromSafeCriticalDefaultConstructor ();
465 } catch (TypeLoadException
) {
467 new SafeInheritFromSafeCriticalDefaultConstructor ();
469 // arrays creation tests
470 ArraysCreatedByTransparentCaller ();
471 ArraysCreatedBySafeCriticalCaller ();
472 // the above also calls ArraysCreatedBySafeCriticalCaller since (Transparent) Main cannot call it directly
477 // Console.WriteLine ("ok");