You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by od...@apache.org on 2010/09/15 17:18:40 UTC

svn commit: r997362 - in /harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main: java/org/apache/harmony/xnet/provider/jsse/SSLEngineImpl.java native/jsse/shared/sslEngine.c native/jsse/shared/sslEngine.h

Author: odeakin
Date: Wed Sep 15 15:18:37 2010
New Revision: 997362

URL: http://svn.apache.org/viewvc?rev=997362&view=rev
Log:
Apply x-net-7.patch patch for HARMONY-6627 ([classlib][x-net] Creating a JSSE provider based on OpenSSL) - Update to wrap() and unwrap() methods allowing handshake to complete.

Modified:
    harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/SSLEngineImpl.java
    harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.c
    harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.h

Modified: harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/SSLEngineImpl.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/SSLEngineImpl.java?rev=997362&r1=997361&r2=997362&view=diff
==============================================================================
--- harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/SSLEngineImpl.java (original)
+++ harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/SSLEngineImpl.java Wed Sep 15 15:18:37 2010
@@ -32,6 +32,8 @@ import javax.net.ssl.SSLEngineResult;
 import javax.net.ssl.SSLException;
 import javax.net.ssl.SSLSession;
 
+import org.apache.harmony.nio.AddressUtil;
+
 /**
  * Implementation of SSLEngine.
  * @see javax.net.ssl.SSLEngine class documentation for more information.
@@ -80,12 +82,12 @@ public class SSLEngineImpl extends SSLEn
     private static native void initImpl();
     private static native long initSSL(long context);
     private static native long initSSLEngine(long context);
-    private static native SSLEngineResult.HandshakeStatus connectImpl(long sslEngineAddress);
-    private static native SSLEngineResult.HandshakeStatus acceptImpl(long sslEngineAddress);
+    private static native SSLEngineResult.HandshakeStatus connectImpl(long ssl);
+    private static native SSLEngineResult.HandshakeStatus acceptImpl(long ssl);
     private static native SSLEngineResult wrapImpl(long sslEngineAddress,
-            byte[] src, int src_len, byte[] dst, int dst_len);
+            long src_address, int src_len, long dst_address, int dst_len);
     private static native SSLEngineResult unwrapImpl(long sslEngineAddress,
-            byte[] src, int src_len, byte[] dst, int dst_len);
+            long src_address, int src_len, long dst_address, int dst_len);
     
     /**
      * Ctor
@@ -134,12 +136,12 @@ public class SSLEngineImpl extends SSLEn
                     logger.println("SSLEngineImpl: CLIENT connecting");
                 }
 
-                handshakeStatus = connectImpl(SSLEngineAddress);
+                handshakeStatus = connectImpl(SSL);
             } else {
                 if (logger != null) {
                     logger.println("SSLEngineImpl: SERVER accepting connection");
                 }
-                handshakeStatus = acceptImpl(SSLEngineAddress);
+                handshakeStatus = acceptImpl(SSL);
             }
         }
     }
@@ -432,11 +434,46 @@ public class SSLEngineImpl extends SSLEn
         if (!handshake_started) {
             beginHandshake();
         }
-
+        
+        // get direct addresses to the buffers
         // only use the first buffer at the moment
-        byte[] dst = dsts[0].array();
-        int dst_len = dst.length;
-        return unwrapImpl(SSLEngineAddress, src.array(), src.array().length, dst, dst_len);
+        ByteBuffer src_temp_buffer = null, dst_temp_buffer = null;
+        long src_address, dst_address;
+        int src_length = src.remaining();
+        int dst_length = dsts[0].remaining();
+        if (src.isDirect()) {
+            src_address = AddressUtil.getDirectBufferAddress(src) + src.position();
+        } else {
+            // create a temporary buffer and copy the contents
+            src_temp_buffer = ByteBuffer.allocateDirect(src_length);
+            src_temp_buffer.put(src.array(), src.position(), src_length);
+            src_temp_buffer.rewind();
+            src_address = AddressUtil.getDirectBufferAddress(src_temp_buffer);
+        }
+        if (dsts[0].isDirect()) {
+            dst_address = AddressUtil.getDirectBufferAddress(dsts[0]) + dsts[0].position();
+        } else {
+            dst_temp_buffer = ByteBuffer.allocateDirect(dst_length);
+            src_temp_buffer.rewind();
+            dst_address = AddressUtil.getDirectBufferAddress(dst_temp_buffer);
+        }
+        
+        SSLEngineResult result = unwrapImpl(SSLEngineAddress, src_address, src_length, dst_address, dst_length);
+        
+        // update the buffers contents and positions
+        src.position(src.position() + result.bytesConsumed());
+
+        if (dst_temp_buffer == null) {
+            dsts[0].position(dsts[0].position() + result.bytesConsumed());
+        } else {
+            // if reading and a temporary buffer was used, copy buffer contents
+            int position = dsts[0].position();
+            dsts[0].put(dst_temp_buffer);
+            // adjust position as not all bytes may have been written
+            dsts[0].position(position + result.bytesProduced());
+        }
+        
+        return result;
     }
 
     /**
@@ -473,11 +510,45 @@ public class SSLEngineImpl extends SSLEn
             beginHandshake();
         }
         
+        // get direct addresses to the buffers
         // only use the first buffer at the moment
-        byte[] src = srcs[0].array();
-        int src_len = src.length;
+        ByteBuffer src_temp_buffer = null, dst_temp_buffer = null;
+        long src_address, dst_address;
+        int src_length = srcs[0].remaining();
+        int dst_length = dst.remaining();
+        if (srcs[0].isDirect()) {
+            src_address = AddressUtil.getDirectBufferAddress(srcs[0]) + srcs[0].position();
+        } else {
+            // create a temporary buffer and copy the contents
+            src_temp_buffer = ByteBuffer.allocateDirect(src_length);
+            src_temp_buffer.put(srcs[0].array(), srcs[0].position(), src_length);
+            src_temp_buffer.rewind();
+            src_address = AddressUtil.getDirectBufferAddress(src_temp_buffer);
+        }
+        if (dst.isDirect()) {
+            dst_address = AddressUtil.getDirectBufferAddress(dst) + dst.position();
+        } else {
+            dst_temp_buffer = ByteBuffer.allocateDirect(dst_length);
+            src_temp_buffer.rewind();
+            dst_address = AddressUtil.getDirectBufferAddress(dst_temp_buffer);
+        }
+        
+        SSLEngineResult result = wrapImpl(SSLEngineAddress, src_address, src_length, dst_address, dst_length);
+        
+        // update the buffers contents and positions
+        srcs[0].position(srcs[0].position() + result.bytesConsumed());
+
+        if (dst_temp_buffer == null) {
+            dst.position(dst.position() + result.bytesConsumed());
+        } else {
+            // if reading and a temporary buffer was used, copy buffer contents
+            int position = dst.position();
+            dst.put(dst_temp_buffer);
+            // adjust position as not all bytes may have been written
+            dst.position(position + result.bytesProduced());
+        }
         
-        return wrapImpl(SSLEngineAddress, src, src_len, dst.array(), dst.array().length);
+        return result;
     }
     
     // Shutdownes the engine and makes all cleanup work.

Modified: harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.c?rev=997362&r1=997361&r2=997362&view=diff
==============================================================================
--- harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.c (original)
+++ harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.c Wed Sep 15 15:18:37 2010
@@ -100,64 +100,36 @@ JNIEXPORT jlong JNICALL Java_org_apache_
 }
 
 JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_acceptImpl
-  (JNIEnv *env, jclass clazz, jlong jsslengine) {
-    _sslengine *sslengine = jlong2addr(_sslengine, jsslengine);
-    SSL *ssl = NULL;
-    BIO *bio = sslengine->bio;
-    BIO *server_io = sslengine->bio_io;
+  (JNIEnv *env, jclass clazz, jlong jssl) {
+    SSL *ssl = jlong2addr(SSL, jssl);
     int ret;
     
-    BIO_get_ssl(bio, &ssl);
     // Put our SSL into accept state
     SSL_set_accept_state(ssl);
     // Start the client handshake
     ret = SSL_do_handshake(ssl);
     
-    fprintf(stderr, "Server bio pending: %d\n", BIO_ctrl_pending(bio));
-    fprintf(stderr, "Server bio can write: %d\n", BIO_ctrl_get_write_guarantee(bio));
-    fprintf(stderr, "Server bio read request: %d\n", BIO_ctrl_get_read_request(bio));
-    fprintf(stderr, "Server IO pending: %d\n", BIO_ctrl_pending(server_io));
-    fprintf(stderr, "Server IO can write: %d\n", BIO_ctrl_get_write_guarantee(server_io));
-    fprintf(stderr, "Server IO read request: %d\n", BIO_ctrl_get_read_request(server_io));
     return handshake_need_unwrap;
     //return getHandshakeStatus(env, SSL_get_error(ssl, ret));
 }
 
 JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_connectImpl
-  (JNIEnv *env, jclass clazz, jlong jsslengine) {
-    _sslengine *sslengine = jlong2addr(_sslengine, jsslengine);
-    SSL *ssl = NULL;
-    BIO *bio = sslengine->bio;
-    BIO *client_io = sslengine->bio_io;
+  (JNIEnv *env, jclass clazz, jlong jssl) {
+    SSL *ssl = jlong2addr(SSL, jssl);
     int ret;
     
-    BIO_get_ssl(bio, &ssl);
-    // Put our SSL into connect state
+    // Put our SSL into accept state
     SSL_set_connect_state(ssl);
-
-    // Start the client handshake
-    fprintf(stderr, "before handshake: SSL in init? %d : %s\n", SSL_in_init(ssl), SSL_state_string_long(ssl));
-    fprintf(stderr, "Client bio pending: %d\n", BIO_ctrl_pending(bio));
-    fprintf(stderr, "Client bio can write: %d\n", BIO_ctrl_get_write_guarantee(bio));
-    fprintf(stderr, "Client bio read request: %d\n", BIO_ctrl_get_read_request(bio));
-    fprintf(stderr, "Client IO pending: %d\n", BIO_ctrl_pending(client_io));
-    fprintf(stderr, "Client IO can write: %d\n", BIO_ctrl_get_write_guarantee(client_io));
-    fprintf(stderr, "Client IO read request: %d\n", BIO_ctrl_get_read_request(client_io));
+    // Start the server handshake
     ret = SSL_do_handshake(ssl);
-    fprintf(stderr, "after handshake: SSL in init? %d : %s\n", SSL_in_init(ssl), SSL_state_string_long(ssl));
-    fprintf(stderr, "Client bio pending: %d\n", BIO_ctrl_pending(bio));
-    fprintf(stderr, "Client bio can write: %d\n", BIO_ctrl_get_write_guarantee(bio));
-    fprintf(stderr, "Client bio read request: %d\n", BIO_ctrl_get_read_request(bio));
-    fprintf(stderr, "Client IO pending: %d\n", BIO_ctrl_pending(client_io));
-    fprintf(stderr, "Client IO can write: %d\n", BIO_ctrl_get_write_guarantee(client_io));
-    fprintf(stderr, "Client IO read request: %d\n", BIO_ctrl_get_read_request(client_io));
+    
     return handshake_need_wrap;
     //return getHandshakeStatus(env, SSL_get_error(ssl, ret));
 }
 
 JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_wrapImpl
-  (JNIEnv *env, jclass clazz, jlong jsslengine, jbyteArray src, int src_len, 
-  jbyteArray dst, int dst_len) {
+  (JNIEnv *env, jclass clazz, jlong jsslengine, jlong src_address, int src_len, 
+  jlong dst_address, int dst_len) {
     _sslengine *sslengine = jlong2addr(_sslengine, jsslengine);
     BIO *bio = sslengine->bio;
     BIO *bio_io = sslengine->bio_io;
@@ -166,16 +138,15 @@ JNIEXPORT jobject JNICALL Java_org_apach
     jobject handshake_state = NULL, engine_state = NULL, result = NULL;
     jclass result_class;
     jmethodID result_constructor;
-    jbyte *buffer;
+    jbyte *src_buffer = jlong2addr(jbyte, src_address);
+    jbyte *dst_buffer = jlong2addr(jbyte, dst_address);
 
     BIO_get_ssl(bio, &ssl);
 
     fprintf(stderr, ">wrap 1: SSL in init? %d : %s\n", SSL_in_init(ssl), SSL_state_string_long(ssl));
     
     // write input data
-    buffer = (jbyte*) malloc(src_len * sizeof(jbyte*));
-    (*env)->GetByteArrayRegion(env, src, 0, src_len, buffer);
-    write_result = BIO_write(bio, (const void *)buffer, (int)src_len);
+    write_result = BIO_write(bio, (const void *)src_buffer, (int)src_len);
     fprintf(stderr, ">wrap BIO_write, result:%d \n", write_result);
     if (write_result > 0) {
         // wrote some data so must not be handshaking
@@ -190,13 +161,11 @@ JNIEXPORT jobject JNICALL Java_org_apach
         handshake_state = handshake_need_unwrap;
         engine_state = engine_ok;
     }
-    free(buffer);
     
     fprintf(stderr, ">wrap 2: SSL in init? %d : %s\n", SSL_in_init(ssl), SSL_state_string_long(ssl));
     
     // read output data
-    buffer = (jbyte*) malloc(dst_len * sizeof(jbyte*));
-    read_result = BIO_read(bio_io, buffer, dst_len);
+    read_result = BIO_read(bio_io, dst_buffer, dst_len);
     
     fprintf(stderr, ">wrap read result: %d\n", read_result);
     fprintf(stderr, ">wrap 3: SSL in init? %d : %s\n", SSL_in_init(ssl), SSL_state_string_long(ssl));
@@ -206,15 +175,11 @@ JNIEXPORT jobject JNICALL Java_org_apach
     fprintf(stderr, ">wrap IO pending: %d\n", BIO_ctrl_pending(bio_io));
     fprintf(stderr, ">wrap IO can write: %d\n", BIO_ctrl_get_write_guarantee(bio_io));
     fprintf(stderr, ">wrap IO read request: %d\n", BIO_ctrl_get_read_request(bio_io));
-    
-    if (read_result > 0) {
-      (*env)->SetByteArrayRegion(env, dst, 0, read_result, buffer);
-    }
+
     if (read_result < 0) {
         // change state?
         read_result = 0;
     }
-    free(buffer);
     
     // construct return object
     result_class = (*env)->FindClass(env, "javax/net/ssl/SSLEngineResult");
@@ -226,8 +191,8 @@ JNIEXPORT jobject JNICALL Java_org_apach
 }
 
 JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_unwrapImpl
-  (JNIEnv *env, jclass clazz, jlong jsslengine, jbyteArray src, int src_len, 
-  jbyteArray dst, int dst_len) {
+  (JNIEnv *env, jclass clazz, jlong jsslengine, jlong src_address, int src_len, 
+  jlong dst_address, int dst_len) {
     _sslengine *sslengine = jlong2addr(_sslengine, jsslengine);
     BIO *bio = sslengine->bio;
     BIO *bio_io = sslengine->bio_io;
@@ -236,29 +201,32 @@ JNIEXPORT jobject JNICALL Java_org_apach
     jobject handshake_state = NULL, engine_state = NULL, result = NULL;
     jclass result_class;
     jmethodID result_constructor;
-    jbyte *buffer;
+    jbyte *src_buffer = jlong2addr(jbyte, src_address);
+    jbyte *dst_buffer = jlong2addr(jbyte, dst_address);
 
     BIO_get_ssl(bio, &ssl);
 
     fprintf(stderr, ">unwrap 1: SSL in init? %d : %s\n", SSL_in_init(ssl), SSL_state_string_long(ssl));
     
     // write input data
-    buffer = (jbyte*) malloc(src_len * sizeof(jbyte*));
-    (*env)->GetByteArrayRegion(env, src, 0, src_len, buffer);
-    write_result = BIO_write(bio_io, (const void *)buffer, (int)src_len);
+    //buffer = (jbyte*) malloc(src_len * sizeof(jbyte*));
+    //(*env)->GetByteArrayRegion(env, src, 0, src_len, buffer);
+    //write_result = BIO_write(bio_io, (const void *)buffer, (int)src_len);
+    write_result = BIO_write(bio_io, (const void *)src_buffer, (int)src_len);
     fprintf(stderr, ">unwrap BIO_write, result:%d \n", write_result);
     if (write_result < 0) {
         // change state?
         write_result = 0;
     }
     
-    free(buffer);
+    //free(buffer);
     
     fprintf(stderr, ">unwrap 2: SSL in init? %d : %s\n", SSL_in_init(ssl), SSL_state_string_long(ssl));
     
     // read output data
-    buffer = (jbyte*) malloc(dst_len * sizeof(jbyte*));
-    read_result = BIO_read(bio, buffer, dst_len);
+    //buffer = (jbyte*) malloc(dst_len * sizeof(jbyte*));
+    //read_result = BIO_read(bio, buffer, dst_len);
+    read_result = BIO_read(bio, dst_buffer, dst_len);
     
     if (read_result > 0) {
         // wrote some data so must not be handshaking
@@ -283,10 +251,10 @@ JNIEXPORT jobject JNICALL Java_org_apach
     fprintf(stderr, ">unwrap IO can write: %d\n", BIO_ctrl_get_write_guarantee(bio_io));
     fprintf(stderr, ">unwrap IO read request: %d\n", BIO_ctrl_get_read_request(bio_io));
     
-    if (read_result > 0) {
-      (*env)->SetByteArrayRegion(env, dst, 0, read_result, buffer);
-    }
-    free(buffer);
+    //if (read_result > 0) {
+    //  (*env)->SetByteArrayRegion(env, dst, 0, read_result, buffer);
+    //}
+    //free(buffer);
     
     // construct return object
     result_class = (*env)->FindClass(env, "javax/net/ssl/SSLEngineResult");

Modified: harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.h?rev=997362&r1=997361&r2=997362&view=diff
==============================================================================
--- harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.h (original)
+++ harmony/enhanced/java/branches/omd/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.h Wed Sep 15 15:18:37 2010
@@ -32,9 +32,9 @@ JNIEXPORT jobject JNICALL Java_org_apach
 JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_connectImpl
   (JNIEnv *, jclass, jlong);
 JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_wrapImpl
-  (JNIEnv *, jclass, jlong, jbyteArray, int, jbyteArray, int);
+  (JNIEnv *, jclass, jlong, jlong, int, jlong, int);
 JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_unwrapImpl
-  (JNIEnv *, jclass, jlong, jbyteArray, int, jbyteArray, int);
+  (JNIEnv *, jclass, jlong, jlong, int, jlong, int);
 JNIEXPORT void JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_closeInboundImpl
   (JNIEnv *, jclass, jlong);
 JNIEXPORT void JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_closeOutboundImpl