jfclere 2005/06/08 09:52:58
Modified: jni/examples/org/apache/tomcat/jni SSLServer.java
jni/java/org/apache/tomcat/jni BIOCallback.java SSL.java
SSLContext.java
jni/native/src ssl.c sslcontext.c
Log:
Change the BIOCallback interface to use write(byte[] buf) and
read(byte[] buf);
Add SSL_accept to do the client handshake.
Arrange the corresponding example.
Revision Changes Path
1.3 +52 -1
jakarta-tomcat-connectors/jni/examples/org/apache/tomcat/jni/SSLServer.java
Index: SSLServer.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jni/examples/org/apache/tomcat/jni/SSLServer.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- SSLServer.java 7 Jun 2005 09:16:59 -0000 1.2
+++ SSLServer.java 8 Jun 2005 16:52:57 -0000 1.3
@@ -47,6 +47,27 @@
}
}
+ private class CallBack implements BIOCallback {
+ long clientSock = 0;
+ public int write(byte [] buf) {
+ return(Socket.send(clientSock, buf, 0, buf.length));
+ }
+ public int read(byte [] buf) {
+ return(Socket.recv(clientSock, buf, 0, buf.length));
+ }
+ public int puts(String data) {
+ System.out.println("CallBack.puts");
+ return -1;
+ }
+ public String gets(int len) {
+ System.out.println("CallBack.gets");
+ return "";
+ }
+ public void setsock(long sock) {
+ clientSock = sock;
+ }
+ }
+
public SSLServer()
{
int i;
@@ -60,6 +81,36 @@
SSLContext.setCertificate(serverCtx, serverCert, serverKey,
serverPassword, SSL.SSL_AIDX_RSA);
SSLContext.setVerifyDepth(serverCtx, 10);
SSLContext.setVerifyClient(serverCtx, SSL.SSL_CVERIFY_REQUIRE);
+
+ CallBack SSLCallBack = new CallBack();
+ long callback = SSL.newBIO(serverPool, SSLCallBack);
+ /*
+ SSLContext.setBIO(serverCtx, callback, 1);
+ SSLContext.setBIO(serverCtx, callback, 0);
+ */
+ long serverSSL = SSL.make(serverCtx, callback, callback);
+
+ long serverSock = Socket.create(Socket.APR_INET,
Socket.SOCK_STREAM,
+ Socket.APR_PROTO_TCP,
serverPool);
+ long inetAddress = Address.info(SSLServer.serverAddr,
Socket.APR_INET, SSLServer.serverPort, 0, serverPool);
+ int rc = Socket.bind(serverSock, inetAddress);
+ if (rc != 0) {
+ throw(new Exception("Can't bind: " + Error.strerror(rc)));
+ }
+ Socket.listen(serverSock, 5);
+ long clientSock = Socket.accept(serverSock, serverPool);
+ long sa = Address.get(Socket.APR_REMOTE, clientSock);
+ Sockaddr raddr = new Sockaddr();
+ if (Address.fill(raddr, sa)) {
+ System.out.println("Remote Host: " + Address.getnameinfo(sa,
0));
+ System.out.println("Remote IP: " + Address.getip(sa) +
+ ":" + raddr.port);
+ }
+ SSLCallBack.setsock(clientSock);
+ int retcode = SSL.accept(serverSSL);
+ if (retcode<=0) {
+ throw(new Exception("Can't SSL accept: " +
SSLContext.geterror(serverCtx, retcode)));
+ }
} catch (Exception e) {
e.printStackTrace();
1.2 +7 -7
jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/BIOCallback.java
Index: BIOCallback.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/BIOCallback.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- BIOCallback.java 1 Jun 2005 08:20:43 -0000 1.1
+++ BIOCallback.java 8 Jun 2005 16:52:58 -0000 1.2
@@ -26,17 +26,17 @@
/**
* Write data
- * @param data String to write
- * @return Number of characters written
+ * @param buf containg the bytes to write.
+ * @return Number of characters written.
*/
- public int write(String data);
+ public int write(byte [] buf);
/**
* Read data
- * @param len Maximum number of characters to read
- * @return String with up to len bytes readed
+ * @param buf buffer to store the read bytes.
+ * @return number of bytes read.
*/
- public String read(int len);
+ public int read(byte [] buf);
/**
* Puts string
1.14 +16 -1
jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/SSL.java
Index: SSL.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/SSL.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- SSL.java 7 Jun 2005 18:38:48 -0000 1.13
+++ SSL.java 8 Jun 2005 16:52:58 -0000 1.14
@@ -258,4 +258,19 @@
*/
public static native boolean loadDSATempKey(int idx, String file);
+ /**
+ * Create a new SSL structure for a Client connection
+ * @param ctx Client context to accept.
+ * @param bior BIO for read.
+ * @param biow BIO for read.
+ * @return pointer to the created SSL structure.
+ */
+ public static native int make(long ctx, long bior, long biow);
+
+ /**
+ * Do the TLS/SSL handshake with a Client
+ * @param ssl Client communication channel to accept.
+ * @return Status code.
+ */
+ public static native int accept(long ssl);
}
1.14 +14 -1
jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/SSLContext.java
Index: SSLContext.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/SSLContext.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- SSLContext.java 6 Jun 2005 06:54:19 -0000 1.13
+++ SSLContext.java 8 Jun 2005 16:52:58 -0000 1.14
@@ -47,6 +47,19 @@
throws Exception;
/**
+ * Do the TLS/SSL handshake with a Client
+ * @param ctx Client context to accept.
+ * @return Status code.
+ */
+ public static native int accept(long ctx);
+
+ /**
+ * Return the error code for openssl.
+ * @return Status code.
+ */
+ public static native int geterror(long ctx, int retcode);
+
+ /**
* Free the resources used by the Context
* @param ctx Server or Client context to free.
* @return APR Status code.
1.27 +50 -17 jakarta-tomcat-connectors/jni/native/src/ssl.c
Index: ssl.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/ssl.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- ssl.c 7 Jun 2005 18:46:09 -0000 1.26
+++ ssl.c 8 Jun 2005 16:52:58 -0000 1.27
@@ -434,6 +434,37 @@
return (jint)APR_SUCCESS;
}
+TCN_IMPLEMENT_CALL(jint, SSL, accept)(TCN_STDARGS, jlong ctx)
+{
+ tcn_ssl_conn_t *c = J2P(ctx, tcn_ssl_conn_t *);
+ UNREFERENCED_STDARGS;
+ TCN_ASSERT(ctx != 0);
+ return SSL_accept(c->ssl);
+}
+
+TCN_IMPLEMENT_CALL(jint, SSL, make)(TCN_STDARGS, jlong ctx, jlong bior,
jlong biow)
+{
+ tcn_ssl_ctxt_t *c = J2P(ctx, tcn_ssl_ctxt_t *);
+ BIO *bio_handler = J2P(bior, BIO *);
+ BIO *bio_handlew = J2P(biow, BIO *);
+ SSL *ssl;
+ tcn_ssl_conn_t *cssl = NULL;
+
+ UNREFERENCED_STDARGS;
+ TCN_ASSERT(ctx != 0);
+
+ ssl=SSL_new(c->ctx);
+ SSL_set_bio(ssl, bio_handler, bio_handlew);
+ if ((cssl = apr_pcalloc(c->pool, sizeof(tcn_ssl_conn_t))) == NULL) {
+ goto make_failed;
+ }
+ cssl->ctx=c;
+ cssl->ssl=ssl;
+ return P2J(cssl);
+make_failed:
+ return 0;
+}
+
TCN_IMPLEMENT_CALL(jboolean, SSL, randLoad)(TCN_STDARGS, jstring file)
{
TCN_ALLOC_CSTRING(file);
@@ -551,10 +582,12 @@
if (b->init && in != NULL) {
BIO_JAVA *j = (BIO_JAVA *)b->ptr;
JNIEnv *e = j->cb.env;
- if ((*e)->CallIntMethod(e, j->cb.obj,
- j->cb.mid[0],
- tcn_new_string(e, in, inl)))
- ret = inl;
+ jbyteArray jb = (*e)->NewByteArray(e, inl);
+ (*e)->SetByteArrayRegion(e, jb, 0, inl, (jbyte *)in);
+ jint o = (*e)->CallIntMethod(e, j->cb.obj,
+ j->cb.mid[0], jb);
+ (*e)->ReleaseByteArrayElements(e, jb, (jbyte *)in, 0);
+ ret = o;
}
return ret;
}
@@ -565,16 +598,16 @@
if (b->init && out != NULL) {
BIO_JAVA *j = (BIO_JAVA *)b->ptr;
JNIEnv *e = j->cb.env;
- jobject o;
- if ((o = (*e)->CallObjectMethod(e, j->cb.obj,
- j->cb.mid[1], (jint)(outl - 1)))) {
- TCN_ALLOC_CSTRING(o);
- if (J2S(o)) {
- int l = (int)strlen(J2S(o));
- ret = TCN_MIN(outl, l);
- memcpy(out, J2S(o), ret);
- }
- TCN_FREE_CSTRING(o);
+ jbyteArray jb = (*e)->NewByteArray(e, outl);
+
+ jint o = (*e)->CallObjectMethod(e, j->cb.obj,
+ j->cb.mid[1], jb);
+ if (o>=0) {
+ int i;
+ jbyte *jout = (*e)->GetByteArrayElements(e, jb, 0);
+ memcpy(out, jout, o);
+ (*e)->ReleaseByteArrayElements(e, jb, jout, 0);
+ ret = o;
}
}
return ret;
@@ -666,8 +699,8 @@
cls = (*e)->GetObjectClass(e, callback);
j->cb.env = e;
- j->cb.mid[0] = (*e)->GetMethodID(e, cls, "write",
"(Ljava/lang/String;)I");
- j->cb.mid[1] = (*e)->GetMethodID(e, cls, "read",
"(I)Ljava/lang/String;");
+ j->cb.mid[0] = (*e)->GetMethodID(e, cls, "write", "([B)I");
+ j->cb.mid[1] = (*e)->GetMethodID(e, cls, "read", "([B)I");
j->cb.mid[2] = (*e)->GetMethodID(e, cls, "puts",
"(Ljava/lang/String;)I");
j->cb.mid[3] = (*e)->GetMethodID(e, cls, "gets",
"(I)Ljava/lang/String;");
/* TODO: Check if method id's are valid */
1.28 +9 -1 jakarta-tomcat-connectors/jni/native/src/sslcontext.c
Index: sslcontext.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/sslcontext.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- sslcontext.c 7 Jun 2005 11:05:07 -0000 1.27
+++ sslcontext.c 8 Jun 2005 16:52:58 -0000 1.28
@@ -174,6 +174,14 @@
return 0;
}
+TCN_IMPLEMENT_CALL(jint, SSLContext, geterror)(TCN_STDARGS, jlong ctx, jint
retcode)
+{
+ tcn_ssl_ctxt_t *c = J2P(ctx, tcn_ssl_ctxt_t *);
+ UNREFERENCED_STDARGS;
+ TCN_ASSERT(ctx != 0);
+ return SSL_get_error(c->ctx, retcode);
+}
+
TCN_IMPLEMENT_CALL(jint, SSLContext, free)(TCN_STDARGS, jlong ctx)
{
tcn_ssl_ctxt_t *c = J2P(ctx, tcn_ssl_ctxt_t *);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]