Jacek Caban : wininet: Added NETCON_send support for schannel-based connections.

Alexandre Julliard julliard at winehq.org
Wed Apr 3 14:33:55 CDT 2013


Module: wine
Branch: master
Commit: 71ba6fcb9fa30a06610b426028e60ab61efa6770
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=71ba6fcb9fa30a06610b426028e60ab61efa6770

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Apr  3 14:03:34 2013 +0200

wininet: Added NETCON_send support for schannel-based connections.

---

 dlls/wininet/netconnection.c |   46 ++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/dlls/wininet/netconnection.c b/dlls/wininet/netconnection.c
index cc16950..53308b9 100644
--- a/dlls/wininet/netconnection.c
+++ b/dlls/wininet/netconnection.c
@@ -1127,6 +1127,34 @@ DWORD NETCON_secure_connect(netconn_t *connection, server_t *server)
     return res;
 }
 
+#ifndef SONAME_LIBSSL
+static BOOL send_ssl_chunk(netconn_t *conn, const void *msg, size_t size)
+{
+    SecBuffer bufs[4] = {
+        {conn->ssl_sizes.cbHeader, SECBUFFER_STREAM_HEADER, conn->ssl_buf},
+        {size,  SECBUFFER_DATA, conn->ssl_buf+conn->ssl_sizes.cbHeader},
+        {conn->ssl_sizes.cbTrailer, SECBUFFER_STREAM_TRAILER, conn->ssl_buf+conn->ssl_sizes.cbHeader+size},
+        {0, SECBUFFER_EMPTY, NULL}
+    };
+    SecBufferDesc buf_desc = {SECBUFFER_VERSION, sizeof(bufs)/sizeof(*bufs), bufs};
+    SECURITY_STATUS res;
+
+    memcpy(bufs[1].pvBuffer, msg, size);
+    res = EncryptMessage(&conn->ssl_ctx, 0, &buf_desc, 0);
+    if(res != SEC_E_OK) {
+        WARN("EncryptMessage failed\n");
+        return FALSE;
+    }
+
+    if(send(conn->socket, conn->ssl_buf, bufs[0].cbBuffer+bufs[1].cbBuffer+bufs[2].cbBuffer, 0) < 1) {
+        WARN("send failed\n");
+        return FALSE;
+    }
+
+    return TRUE;
+}
+#endif
+
 /******************************************************************************
  * NETCON_send
  * Basically calls 'send()' unless we should use SSL
@@ -1156,8 +1184,22 @@ DWORD NETCON_send(netconn_t *connection, const void *msg, size_t len, int flags,
 	    return ERROR_INTERNET_CONNECTION_ABORTED;
         return ERROR_SUCCESS;
 #else
-        FIXME("not supported on this platform\n");
-	return ERROR_NOT_SUPPORTED;
+        const BYTE *ptr = msg;
+        size_t chunk_size;
+
+        *sent = 0;
+
+        while(len) {
+            chunk_size = min(len, connection->ssl_sizes.cbMaximumMessage);
+            if(!send_ssl_chunk(connection, ptr, chunk_size))
+                return ERROR_INTERNET_SECURITY_CHANNEL_ERROR;
+
+            *sent += chunk_size;
+            ptr += chunk_size;
+            len -= chunk_size;
+        }
+
+        return ERROR_SUCCESS;
 #endif
     }
 }




More information about the wine-cvs mailing list