Author: markt
Date: Wed Apr 29 21:31:43 2015
New Revision: 1676864

URL: http://svn.apache.org/r1676864
Log:
Implement the native part of SNI

Modified:
    tomcat/native/trunk/native/include/ssl_private.h
    tomcat/native/trunk/native/src/sslcontext.c

Modified: tomcat/native/trunk/native/include/ssl_private.h
URL: 
http://svn.apache.org/viewvc/tomcat/native/trunk/native/include/ssl_private.h?rev=1676864&r1=1676863&r2=1676864&view=diff
==============================================================================
--- tomcat/native/trunk/native/include/ssl_private.h (original)
+++ tomcat/native/trunk/native/include/ssl_private.h Wed Apr 29 21:31:43 2015
@@ -261,10 +261,6 @@ struct tcn_ssl_ctxt_t {
      */
     char            *alpn;
     int             alpnlen;
-    
-    /* References to Java SSLContext class used by SNI callbacks */
-    JNIEnv          *jnienv;
-    jobject         java_object;
 };
 
   

Modified: tomcat/native/trunk/native/src/sslcontext.c
URL: 
http://svn.apache.org/viewvc/tomcat/native/trunk/native/src/sslcontext.c?rev=1676864&r1=1676863&r2=1676864&view=diff
==============================================================================
--- tomcat/native/trunk/native/src/sslcontext.c (original)
+++ tomcat/native/trunk/native/src/sslcontext.c Wed Apr 29 21:31:43 2015
@@ -62,12 +62,37 @@ static apr_status_t ssl_context_cleanup(
     return APR_SUCCESS;
 }
 
+static jclass    ssl_context_class;
+static jmethodID sni_java_callback;
+
 /* Callback used when OpenSSL receives a client hello with a Server Name
  * Indication extension.
  */
 int ssl_callback_ServerNameIndication(SSL *ssl, int *al, tcn_ssl_ctxt_t *c)
 {
-    printf("SNI callback received");
+    // Get the JNI environment for this callback
+    JavaVM *javavm = tcn_get_java_vm();
+    JNIEnv *env;
+    (*javavm)->AttachCurrentThread(javavm, (void **)&env, NULL);
+    
+    // Get the host name presented by the client
+    const char *servername = SSL_get_servername(ssl, 
TLSEXT_NAMETYPE_host_name);
+    
+    // Convert parameters ready for the method call
+    jstring hostname = (*env)->NewStringUTF(env, servername);
+    jlong original_ssl_context = P2J(c->ctx);
+ 
+    // Make the call
+    jlong new_ssl_context = (*env)->CallStaticLongMethod(env,
+                                                            ssl_context_class,
+                                                            sni_java_callback,
+                                                            
original_ssl_context,
+                                                            hostname);
+
+    if (original_ssl_context != new_ssl_context) {
+        SSL_set_SSL_CTX(ssl, J2P(new_ssl_context, SSL_CTX *));
+    }
+ 
     return SSL_TLSEXT_ERR_OK;
 }
  
@@ -206,9 +231,14 @@ TCN_IMPLEMENT_CALL(jlong, SSLContext, ma
     SSL_CTX_set_default_passwd_cb_userdata(c->ctx, (void 
*)(&tcn_password_callback));
     SSL_CTX_set_info_callback(c->ctx, SSL_callback_handshake);
     
-    /* Set Server Name Indication (SNI) callback */
-    c->jnienv      = e;
-    c->java_object = o;
+    /* Cache Java side SNI callback if not already cached */
+    if (ssl_context_class == 0) {
+        ssl_context_class = (*e)->NewGlobalRef(e, o);
+        sni_java_callback = (*e)->GetStaticMethodID(e, ssl_context_class,
+                                                    "sniCallBack", 
"(JLjava/lang/String;)J");
+    }
+
+    /* Set up OpenSSL call back if SNI is provided by the client */
     SSL_CTX_set_tlsext_servername_callback(c->ctx, 
ssl_callback_ServerNameIndication);
     SSL_CTX_set_tlsext_servername_arg(c->ctx, c);
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to