[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