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]