* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / Mono.Security / Test / tools / mutual / mutual.cs
1 using System;\r
2 using System.IO;\r
3 using System.Net.Sockets;\r
4 using System.Security.Cryptography;\r
5 using System.Security.Cryptography.X509Certificates;\r
6 \r
7 using Mono.Security.Protocol.Tls;\r
8 \r
9 class TestSslClientStream {\r
10 \r
11         static Mono.Security.X509.PKCS12 p12;\r
12 \r
13         [STAThread]\r
14         static void Main(string[] args)\r
15         {\r
16                 string host = "localhost";\r
17                 if (args.Length > 0)\r
18                         host = args[0];\r
19 \r
20                 SecurityProtocolType protocol = SecurityProtocolType.Tls;\r
21                 if (args.Length > 1) {\r
22                         switch (args [1].ToUpper ()) {\r
23                         case "SSL":\r
24                                 protocol = SecurityProtocolType.Ssl3;\r
25                                 break;\r
26                         }\r
27                 }\r
28 \r
29                 X509CertificateCollection certificates = null;\r
30                 if (args.Length > 2) {\r
31                         string password = null;\r
32                         if (args.Length > 3)\r
33                                 password = args [3];\r
34 \r
35                         p12 = Mono.Security.X509.PKCS12.LoadFromFile(args [2], password);\r
36 \r
37                         certificates = new X509CertificateCollection ();\r
38                         foreach (Mono.Security.X509.X509Certificate cert in p12.Certificates) {\r
39                                 certificates.Add(new X509Certificate(cert.RawData));\r
40                         }\r
41                 }\r
42 \r
43                 TcpClient client = new TcpClient ();\r
44                 client.Connect (host, 4433);\r
45  \r
46                 SslClientStream ssl = new SslClientStream (client.GetStream(), host, false, protocol, certificates);\r
47                 ssl.ServerCertValidationDelegate += new CertificateValidationCallback (CertificateValidation);\r
48                 ssl.ClientCertSelectionDelegate += new CertificateSelectionCallback (ClientCertificateSelection);\r
49                 ssl.PrivateKeyCertSelectionDelegate += new PrivateKeySelectionCallback (PrivateKeySelection);\r
50         \r
51                 StreamWriter sw = new StreamWriter (ssl, System.Text.Encoding.ASCII);
52                 sw.WriteLine ("GET /clientcert.aspx{0}", Environment.NewLine);
53                 sw.Flush ();
54 \r
55                 StreamReader sr = new StreamReader (ssl);
56                 Console.WriteLine (sr.ReadToEnd ());\r
57         }\r
58 \r
59         static bool CertificateValidation (X509Certificate certificate, int[] certificateErrors)\r
60         {\r
61                 Console.WriteLine ("CertificateValidation");\r
62                 Console.WriteLine (certificate.ToString (true));\r
63                 Console.WriteLine ("\tError(s)");\r
64                 foreach (int error in certificateErrors)\r
65                         Console.WriteLine ("\t\t#{0}", error);\r
66                 Console.WriteLine ();\r
67                 return true;\r
68         }\r
69 \r
70         static X509Certificate ClientCertificateSelection (X509CertificateCollection clientCertificates,\r
71                 X509Certificate serverCertificate, string targetHost, X509CertificateCollection serverRequestedCertificates)\r
72         {\r
73                 Console.WriteLine ("ClientCertificateSelection");\r
74                 Console.WriteLine ("\tClient Certificates ({0})", clientCertificates.Count);\r
75                 int i = 1;\r
76                 foreach (X509Certificate client in clientCertificates)\r
77                         Console.WriteLine ("#{0} - {1}", i++, client.ToString (true));\r
78                 Console.WriteLine ("\tHost: {0}", targetHost);\r
79                 Console.Write ("SERVER {0}", serverCertificate.ToString (true));\r
80                 Console.WriteLine ();\r
81                 return clientCertificates [0];\r
82         }\r
83 \r
84         static AsymmetricAlgorithm PrivateKeySelection (X509Certificate certificate, string targetHost)\r
85         {\r
86                 Console.WriteLine ("PrivateKeySelection");\r
87                 Console.WriteLine ("\tHost: {0}", targetHost);\r
88                 Console.WriteLine (certificate.ToString (true));\r
89                 Console.WriteLine ("\tPrivateKeySelection ({0})", p12.Keys.Count);\r
90                 Console.WriteLine ();\r
91                 return (AsymmetricAlgorithm) p12.Keys [0];\r
92         }\r
93 }\r