[Mono-bugs] [Bug 75687][Nor] New - SslClientStream.StartRead()
blocks
bugzilla-daemon at bugzilla.ximian.com
bugzilla-daemon at bugzilla.ximian.com
Tue Aug 2 08:46:53 EDT 2005
Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.
Changed by dominz at wp.pl.
http://bugzilla.ximian.com/show_bug.cgi?id=75687
--- shadow/75687 2005-08-02 08:46:52.000000000 -0400
+++ shadow/75687.tmp.16204 2005-08-02 08:46:52.000000000 -0400
@@ -0,0 +1,136 @@
+Bug#: 75687
+Product: Mono: Class Libraries
+Version: 1.1
+OS:
+OS Details: ubuntu breezy
+Status: NEW
+Resolution:
+Severity:
+Priority: Normal
+Component: Mono.Security
+AssignedTo: mono-bugs at ximian.com
+ReportedBy: dominz at wp.pl
+QAContact: mono-bugs at ximian.com
+TargetMilestone: ---
+URL:
+Cc:
+Summary: SslClientStream.StartRead() blocks
+
+I tried to use asynchronously SslClientStream. It works properly, except
+that BeginRead() method blocks just like Read(). It makes no difference if
+it's first or fifth read operation afte swiching to TLS.
+
+ Below is sample program that connects to Jabber server, performs TLS
+negotiation and switches to TLS, then writes a space to actually establish
+TLS. There's no "pong" ever printed after call to BeginRead() when no data
+is available for reading.
+
+Program compiles with: mcs -r:Mono.Security.dll test.cs
+Mono.Security.dll version: 1.0.5000.0, Key: 0738eb9f132ed756
+
+using System;
+using System.Text;
+using System.IO;
+using System.Net.Sockets;
+using Mono.Security.Protocol.Tls;
+using Mono.Security.X509;
+using System.Threading;
+
+class MainClass
+{
+
+ const string hostname = "jabber.org.au";
+ const string init = "<?xml version=\"1.0\"?>\n"+
+ "<stream:stream to=\""+hostname+"\" "+
+ "xmlns=\"jabber:client\" xmlns:stream=\"http://etherx.jabber.org/streams\" "+
+ "version=\"1.0\">";
+ const string starttls =
+ "<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"/>";
+
+ const int bufSize = 4096;
+ static byte[] buf = new byte[bufSize];
+
+ static SslClientStream sslStream;
+ static Stream stream;
+
+ // reads string from stream
+ static string Read()
+ {
+ int x = stream.Read(buf, 0, bufSize);
+ string s = Encoding.UTF8.GetString(buf, 0, x);
+ Console.WriteLine("\nincoming:\n"+s);
+ return s;
+ }
+
+ // writes string to stream
+ static void Write(string s)
+ {
+ stream.Write( Encoding.UTF8.GetBytes(s), 0,
+ Encoding.UTF8.GetByteCount(s) );
+ Console.WriteLine("\noutgoing:\n"+s);
+ }
+
+ private static bool CertificateValidation
+(System.Security.Cryptography.X509Certificates.X509Certificate certificate,
+int[] certificateErrors)
+ {
+ Console.WriteLine("CertificateValidation");
+ return true; // don't care, always accept
+ }
+
+ public static void DataReceived(IAsyncResult ar)
+ {
+ try {
+ int bytes = stream.EndRead(ar);
+ Console.WriteLine("\nasync
+incoming:\n"+Encoding.UTF8.GetString(buf, 0, bytes));
+ }
+ catch (Exception e) {
+ Console.WriteLine(e.ToString());
+ }
+ }
+
+ public static void Main(string[] args)
+ {
+ Mono.Security.Protocol.Tls.SecurityProtocolType protocol =
+ Mono.Security.Protocol.Tls.SecurityProtocolType.Tls;
+ System.Security.Cryptography.X509Certificates.X509CertificateCollection
+certificates =
+ new
+System.Security.Cryptography.X509Certificates.X509CertificateCollection ();
+
+ TcpClient client = new TcpClient();
+ client.Connect(hostname, 5222);
+ stream = client.GetStream();
+
+ // TLS negotiation
+ Write(init);
+ if (Read().Length < 200) Read();
+ Write(starttls);
+ Read();
+
+ Console.WriteLine("\nswitching to TlsClientStream\n");
+ sslStream = new SslClientStream(stream,hostname, true,
+protocol,certificates);
+ sslStream.ServerCertValidationDelegate += new
+CertificateValidationCallback (CertificateValidation);
+ stream = sslStream;
+
+ // uncommenting this forces server to return some data
+ // Write(init);
+
+ Write(" "); // to establish connection
+
+ // HERE IS THE PROBLEM
+ Console.WriteLine("ping");
+ try {
+ sslStream.BeginRead(buf, 0, bufSize,
+ new AsyncCallback(DataReceived), null );
+ }
+ catch (Exception e) {
+ Console.WriteLine(e.ToString() );
+ }
+ Console.WriteLine("pong");
+ System.Threading.Thread.Sleep(10000); // wait for async
+ }
+}
More information about the mono-bugs
mailing list