diff -uN curl-7.21.1\lib\/ssluse.c curl-7.21.1-xware\lib\/ssluse.c
--- curl-7.21.1\lib\/ssluse.c	2010-08-01 23:38:00.000000000 +0200
+++ curl-7.21.1-xware\lib\/ssluse.c	2010-09-20 14:59:56.660119100 +0200
@@ -1761,6 +1761,19 @@
     }
   }
   else {
+    /* give application chance to perform any additional OpenSSL operations */
+    if(data->set.ssl.fsslcnt) {
+      CURLcode retcode = (*data->set.ssl.fsslcnt)(data,
+                                                  connssl->handle,
+                                                  data->set.ssl.fsslcntp);
+      if(retcode) {
+        connssl->connecting_state = ssl_connect_2; /* state for failure */
+        Curl_ssl_close(conn, sockindex); /* TODO: Is this necessary? */
+        failf(data,"error signaled by ssl callback");
+        return retcode;
+      }
+    }
+
     /* we have been connected fine, we're not waiting for anything else. */
     connssl->connecting_state = ssl_connect_3;

diff -uN curl-7.21.1\lib\/url.c curl-7.21.1-xware\lib\/url.c
--- curl-7.21.1\lib\/url.c	2010-08-10 14:44:00.000000000 +0200
+++ curl-7.21.1-xware\lib\/url.c	2010-09-20 14:30:08.363459100 +0200
@@ -2001,7 +2001,7 @@
     data->set.ssl.verifyhost = va_arg(param, long);
     break;
 #ifdef USE_SSLEAY
-    /* since these two options are only possible to use on an OpenSSL-
+    /* since these five options are only possible to use on an OpenSSL-
        powered libcurl we #ifdef them on this condition so that libcurls
        built against other SSL libs will return a proper error when trying
        to set this option! */
@@ -2020,6 +2020,18 @@
   case CURLOPT_CERTINFO:
     data->set.ssl.certinfo = (bool)(0 != va_arg(param, long));
     break;
+  case CURLOPT_SSL_CNT_FUNCTION:
+    /*
+     * Set a SSL callback
+     */
+    data->set.ssl.fsslcnt = va_arg(param, curl_ssl_cnt_callback);
+    break;
+  case CURLOPT_SSL_CNT_DATA:
+    /*
+     * Set a SSL callback parameter pointer
+     */
+    data->set.ssl.fsslcntp = va_arg(param, void *);
+    break;
 #endif
   case CURLOPT_CAINFO:
     /*
diff -uN curl-7.21.1\lib\/urldata.h curl-7.21.1-xware\lib\/urldata.h
--- curl-7.21.1\lib\/urldata.h	2010-08-10 14:44:00.000000000 +0200
+++ curl-7.21.1-xware\lib\/urldata.h	2010-09-20 14:28:35.838952600 +0200
@@ -283,6 +283,8 @@
   long numsessions;      /* SSL session id cache size */
   curl_ssl_ctx_callback fsslctx; /* function to initialize ssl ctx */
   void *fsslctxp;        /* parameter for call back */
+  curl_ssl_cnt_callback fsslcnt; /* function to perform additional ops on SSL object */
+  void *fsslcntp;        /* parameter for call back */
   bool sessionid;        /* cache session IDs or not */
   bool certinfo;         /* gather lots of certificate info */
 };


