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/16 11:28:06 UTC
svn commit: r997649 - 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
Author: odeakin
Date: Thu Sep 16 09:28:06 2010
New Revision: 997649
URL: http://svn.apache.org/viewvc?rev=997649&view=rev
Log:
Apply x-net-8.patch patch for HARMONY-6627 ([classlib][x-net] Creating a JSSE provider based on OpenSSL) - update handshake status correctly.
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
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=997649&r1=997648&r2=997649&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 Thu Sep 16 09:28:06 2010
@@ -17,17 +17,10 @@
package org.apache.harmony.xnet.provider.jsse;
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.nio.ReadOnlyBufferException;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import javax.net.ssl.SSLEngine;
-import javax.net.ssl.SSLHandshakeException;
import javax.net.ssl.SSLEngineResult;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSession;
@@ -48,16 +41,12 @@ public class SSLEngineImpl extends SSLEn
private boolean isInboundDone = false;
// indicates if outbound operations finished
private boolean isOutboundDone = false;
- // indicates if close_notify alert had been sent to another peer
- private boolean close_notify_was_sent = false;
- // indicates if close_notify alert had been received from another peer
- private boolean close_notify_was_received = false;
// indicates if engine was closed (it means that
// all the works on it are done, except (probably) some finalizing work)
private boolean engine_was_closed = false;
- // indicates if engine was shutted down (it means that
+ // indicates if engine was shut down (it means that
// all cleaning work had been done and the engine is not operable)
- private boolean engine_was_shutteddown = false;
+ private boolean engine_was_shutdown = false;
// active session object
private SSLSessionImpl session;
@@ -373,7 +362,7 @@ public class SSLEngineImpl extends SSLEn
*/
@Override
public SSLEngineResult.HandshakeStatus getHandshakeStatus() {
- if (!handshake_started || engine_was_shutteddown) {
+ if (!handshake_started || engine_was_shutdown) {
// initial handshake has not been started yet
return SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING;
}
@@ -427,7 +416,7 @@ public class SSLEngineImpl extends SSLEn
@Override
public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer[] dsts,
int offset, int length) throws SSLException {
- if (engine_was_shutteddown) {
+ if (engine_was_shutdown) {
return new SSLEngineResult(SSLEngineResult.Status.CLOSED,
SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING, 0, 0);
}
@@ -459,7 +448,6 @@ public class SSLEngineImpl extends SSLEn
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);
}
@@ -471,13 +459,15 @@ public class SSLEngineImpl extends SSLEn
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
+ // if 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());
}
+ // update handshake status
+ handshakeStatus = result.getHandshakeStatus();
return result;
}
@@ -499,7 +489,7 @@ public class SSLEngineImpl extends SSLEn
@Override
public SSLEngineResult wrap(ByteBuffer[] srcs, int offset,
int len, ByteBuffer dst) throws SSLException {
- if (engine_was_shutteddown) {
+ if (engine_was_shutdown) {
return new SSLEngineResult(SSLEngineResult.Status.CLOSED,
SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING, 0, 0);
}
@@ -534,7 +524,6 @@ public class SSLEngineImpl extends SSLEn
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);
}
@@ -546,20 +535,22 @@ public class SSLEngineImpl extends SSLEn
if (dst_temp_buffer == null) {
dst.position(dst.position() + result.bytesConsumed());
} else {
- // if reading and a temporary buffer was used, copy buffer contents
+ // if 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());
}
+ // update handshake status
+ handshakeStatus = result.getHandshakeStatus();
return result;
}
// Shutdownes the engine and makes all cleanup work.
private void shutdown() {
engine_was_closed = true;
- engine_was_shutteddown = true;
+ engine_was_shutdown = true;
isOutboundDone = true;
isInboundDone = true;
}
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=997649&r1=997648&r2=997649&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 Thu Sep 16 09:28:06 2010
@@ -32,20 +32,16 @@ typedef struct {
static jobject handshake_need_wrap, handshake_need_unwrap, handshake_finished, handshake_not_handshaking;
static jobject engine_buffer_overflow, engine_buffer_underflow, engine_closed, engine_ok;
-jobject getHandshakeStatus(JNIEnv *env, int state) {
+int check_ssl_error(JNIEnv *env, int state) {
jclass exception;
switch(state) {
- case SSL_ERROR_NONE:
- return handshake_not_handshaking;
- case SSL_ERROR_WANT_READ:
- return handshake_need_unwrap;
- case SSL_ERROR_WANT_WRITE:
- return handshake_need_wrap;
- default:
+ case SSL_ERROR_SYSCALL:
+ case SSL_ERROR_SSL:
exception = (*env)->FindClass(env, "javax/net/ssl/SSLHandshakeException");
(*env)->ThrowNew(env, exception, ERR_reason_error_string(ERR_get_error()));
+ return 1;
}
- return NULL;
+ return 0;
}
JNIEXPORT void JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_initImpl
@@ -109,8 +105,11 @@ JNIEXPORT jobject JNICALL Java_org_apach
// Start the client handshake
ret = SSL_do_handshake(ssl);
+ if (check_ssl_error(env, SSL_get_error(ssl, ret))) {
+ return NULL;
+ }
+
return handshake_need_unwrap;
- //return getHandshakeStatus(env, SSL_get_error(ssl, ret));
}
JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_connectImpl
@@ -123,8 +122,11 @@ JNIEXPORT jobject JNICALL Java_org_apach
// Start the server handshake
ret = SSL_do_handshake(ssl);
+ if (check_ssl_error(env, SSL_get_error(ssl, ret))) {
+ return NULL;
+ }
+
return handshake_need_wrap;
- //return getHandshakeStatus(env, SSL_get_error(ssl, ret));
}
JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_wrapImpl
@@ -140,14 +142,13 @@ JNIEXPORT jobject JNICALL Java_org_apach
jmethodID result_constructor;
jbyte *src_buffer = jlong2addr(jbyte, src_address);
jbyte *dst_buffer = jlong2addr(jbyte, dst_address);
+ int initial_init_state, init_state;
BIO_get_ssl(bio, &ssl);
-
- fprintf(stderr, ">wrap 1: SSL in init? %d : %s\n", SSL_in_init(ssl), SSL_state_string_long(ssl));
+ initial_init_state = SSL_in_init(ssl);
// write input data
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
handshake_state = handshake_not_handshaking;
@@ -162,25 +163,26 @@ JNIEXPORT jobject JNICALL Java_org_apach
engine_state = engine_ok;
}
- fprintf(stderr, ">wrap 2: SSL in init? %d : %s\n", SSL_in_init(ssl), SSL_state_string_long(ssl));
-
// read output data
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));
- fprintf(stderr, ">wrap bio pending: %d\n", BIO_ctrl_pending(bio));
- fprintf(stderr, ">wrap bio can write: %d\n", BIO_ctrl_get_write_guarantee(bio));
- fprintf(stderr, ">wrap bio read request: %d\n", BIO_ctrl_get_read_request(bio));
- 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) {
// change state?
read_result = 0;
}
+ init_state = SSL_in_init(ssl);
+
+ // if not in SSL init state
+ if (!init_state) {
+ // if we were in init state when we entered this function
+ if (initial_init_state) {
+ handshake_state = handshake_finished;
+ } else {
+ handshake_state = handshake_not_handshaking;
+ }
+ }
+
// construct return object
result_class = (*env)->FindClass(env, "javax/net/ssl/SSLEngineResult");
result_constructor = (*env)->GetMethodID(env, result_class, "<init>",
@@ -203,29 +205,19 @@ JNIEXPORT jobject JNICALL Java_org_apach
jmethodID result_constructor;
jbyte *src_buffer = jlong2addr(jbyte, src_address);
jbyte *dst_buffer = jlong2addr(jbyte, dst_address);
+ int initial_init_state, init_state;
BIO_get_ssl(bio, &ssl);
-
- fprintf(stderr, ">unwrap 1: SSL in init? %d : %s\n", SSL_in_init(ssl), SSL_state_string_long(ssl));
+ initial_init_state = SSL_in_init(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);
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);
-
- 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);
read_result = BIO_read(bio, dst_buffer, dst_len);
if (read_result > 0) {
@@ -242,19 +234,16 @@ JNIEXPORT jobject JNICALL Java_org_apach
engine_state = engine_ok;
}
- fprintf(stderr, ">unwrap read result: %d\n", read_result);
- fprintf(stderr, ">unwrap 3: SSL in init? %d : %s\n", SSL_in_init(ssl), SSL_state_string_long(ssl));
- fprintf(stderr, ">unwrap bio pending: %d\n", BIO_ctrl_pending(bio));
- fprintf(stderr, ">unwrap bio can write: %d\n", BIO_ctrl_get_write_guarantee(bio));
- fprintf(stderr, ">unwrap bio read request: %d\n", BIO_ctrl_get_read_request(bio));
- fprintf(stderr, ">unwrap IO pending: %d\n", BIO_ctrl_pending(bio_io));
- 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);
+ init_state = SSL_in_init(ssl);
+ // if not in SSL init state
+ if (!init_state) {
+ // if we were in init state when we entered this function
+ if (initial_init_state) {
+ handshake_state = handshake_finished;
+ } else {
+ handshake_state = handshake_not_handshaking;
+ }
+ }
// construct return object
result_class = (*env)->FindClass(env, "javax/net/ssl/SSLEngineResult");