jfclere 2005/06/10 10:15:56 Modified: jni build.xml jni/java/org/apache/tomcat/jni SSLSocket.java jni/native/src sslnetwork.c Added: jni/examples/org/apache/tomcat/jni BIOSSLServer.java Log: Try to used apr sockets instead the openssl ones. Revision Changes Path 1.8 +10 -0 jakarta-tomcat-connectors/jni/build.xml Index: build.xml =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/build.xml,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- build.xml 6 Jun 2005 08:53:06 -0000 1.7 +++ build.xml 10 Jun 2005 17:15:55 -0000 1.8 @@ -309,4 +309,14 @@ <jvmarg value="-Djava.library.path=${tc.library.path}"/> </java> </target> + <target name="bioserver-example" depends="examples"> + <echo message="Running another Tomcat Native SSL Server example ..."/> + <java dir="${examples.dir}" classname="org.apache.tomcat.jni.BIOSSLServer" + fork="yes" failonerror="${test.failonerror}"> + <env key="PATH" path="${tc.library.path}:${java.library.path}"/> + <env key="Path" path="${tc.library.path}:${java.library.path}"/> + <classpath refid="examples.classpath"/> + <jvmarg value="-Djava.library.path=${tc.library.path}"/> + </java> + </target> </project> 1.1 jakarta-tomcat-connectors/jni/examples/org/apache/tomcat/jni/BIOSSLServer.java Index: BIOSSLServer.java =================================================================== package org.apache.tomcat.jni; import java.util.Properties; import java.io.*; import java.net.*; import java.lang.*; /** SSL Server server example * * @author Mladen Turk * @version $Revision: 1.1 $, $Date: 2005/06/10 17:15:56 $ */ public class BIOSSLServer { public static String serverAddr = null; public static int serverPort = 0; public static int serverNmax = 0; public static long serverPool = 0; public static long serverCtx = 0; public static String serverCert = null; public static String serverKey = null; public static String serverCiphers = null; public static String serverPassword = null; private static Object threadLock = new Object(); static { try { InputStream is = BIOSSLServer.class.getResourceAsStream ("/org/apache/tomcat/jni/SSL.properties"); Properties props = new Properties(); props.load(is); is.close(); serverAddr = props.getProperty("server.ip", "127.0.0.1"); serverPort = Integer.decode(props.getProperty("server.port", "4443")).intValue(); serverNmax = Integer.decode(props.getProperty("server.max", "1")).intValue(); serverCert = props.getProperty("server.cert", "server.pem"); serverKey = props.getProperty("server.key", null); serverCiphers = props.getProperty("server.ciphers", "ALL"); serverPassword = props.getProperty("server.password", null); } catch (Throwable t) { ; // Nothing } } 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 BIOSSLServer() { int i; serverPool = Pool.create(0); try { /* Create SSL Context, one for each Virtual Host */ serverCtx = SSLContext.make(serverPool, SSL.SSL_PROTOCOL_SSLV2 | SSL.SSL_PROTOCOL_SSLV3, SSL.SSL_MODE_SERVER); // serverCtx = SSLContext.make(serverPool, SSL.SSL_PROTOCOL_TLSV1, SSL.SSL_MODE_SERVER); /* List the ciphers that the client is permitted to negotiate. */ SSLContext.setCipherSuite(serverCtx, serverCiphers); /* Load Server key and certificate */ SSLContext.setCertificate(serverCtx, serverCert, serverKey, serverPassword, SSL.SSL_AIDX_RSA); SSLContext.setVerify(serverCtx, SSL.SSL_CVERIFY_NONE, 0); /* CallBack SSLCallBack = new CallBack(); long callback = SSL.newBIO(serverPool, SSLCallBack); SSLContext.setBIO(serverCtx, callback, 1); SSLContext.setBIO(serverCtx, callback, 0); long serverSSL = SSLBIO.make(serverCtx, callback, callback); */ long serverSock = Socket.create(Socket.APR_INET, Socket.SOCK_STREAM, Socket.APR_PROTO_TCP, serverPool); long inetAddress = Address.info(BIOSSLServer.serverAddr, Socket.APR_INET, BIOSSLServer.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 = SSLSocket.accept(serverCtx, clientSock, serverPool); if (retcode<=0) { throw(new Exception("Can't SSL accept: " + SSLBIO.geterror(serverSSL, retcode))); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String [] args) { try { Library.initialize(null); SSL.initialize(null); BIOSSLServer server = new BIOSSLServer(); } catch (Exception e) { e.printStackTrace(); } } } 1.4 +7 -2 jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/SSLSocket.java Index: SSLSocket.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/SSLSocket.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- SSLSocket.java 10 Jun 2005 11:34:03 -0000 1.3 +++ SSLSocket.java 10 Jun 2005 17:15:56 -0000 1.4 @@ -72,5 +72,10 @@ */ public static native int close(long thesocket); - + /** + * Get the SSL error code. + * @param thesocket The SSL socket to use. + * @retcode the "local" error code returned by SSL. + * @return the error code. + public static native int geterror(long thesocket, int retcode); } 1.5 +142 -1 jakarta-tomcat-connectors/jni/native/src/sslnetwork.c Index: sslnetwork.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/sslnetwork.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- sslnetwork.c 10 Jun 2005 11:30:54 -0000 1.4 +++ sslnetwork.c 10 Jun 2005 17:15:56 -0000 1.5 @@ -151,6 +151,87 @@ return con; } +/* + * Use APR sockets directly + */ + +static int jbs_apr_new(BIO *bi) +{ + printf("jbs_apr_new\n"); + fflush(stdout); + bi->shutdown = 1; + bi->init = 0; + bi->num = -1; + bi->ptr = NULL; + return 1; +} + +static int jbs_apr_free(BIO *bi) +{ + if (bi == NULL) + return 0; + else + return 1; +} + +static int jbs_apr_write(BIO *b, const char *in, int inl) +{ + apr_size_t j = inl; + apr_socket_t *sock=b->ptr; + printf("jbs_apr_write\n"); + fflush(stdout); + return(apr_socket_send(sock, in, &j)); +} + +static int jbs_apr_read(BIO *b, char *out, int outl) +{ + apr_size_t j = outl; + apr_socket_t *sock=b->ptr; + int ret; + printf("jbs_apr_read\n"); + fflush(stdout); + ret = apr_socket_recv(sock, out, &j); + if (ret == APR_SUCCESS) + return(j); + return(-1); +} + +static int jbs_apr_puts(BIO *b, const char *in) +{ + return 0; +} + +static int jbs_apr_gets(BIO *b, char *out, int outl) +{ + return 0; +} + +static long jbs_apr_ctrl(BIO *b, int cmd, long num, void *ptr) +{ + printf("jbs_apr_ctrl\n"); + fflush(stdout); + if (cmd==BIO_CTRL_FLUSH || cmd==BIO_CTRL_DUP) + return 1; + else + return 0; +} +static BIO_METHOD jbs_apr_methods = { + BIO_TYPE_FILE, + "APR Callback", + jbs_apr_write, + jbs_apr_read, + jbs_apr_puts, + jbs_apr_gets, + jbs_apr_ctrl, + jbs_apr_new, + jbs_apr_free, + NULL +}; +static BIO_METHOD *BIO_jbs_apr() +{ + return(&jbs_apr_methods); +} + TCN_IMPLEMENT_CALL(jint, SSLSocket, shutdown)(TCN_STDARGS, jlong sock, jint how) { @@ -199,6 +280,65 @@ return (jint)rv; } +#define JFC_TEST 1 +#ifdef JFC_TEST + +TCN_IMPLEMENT_CALL(jint, SSLSocket, geterror)(TCN_STDARGS, jlong ctx, jint retcode) +{ + tcn_ssl_conn_t *c = J2P(ctx, tcn_ssl_conn_t *); + UNREFERENCED_STDARGS; + TCN_ASSERT(ctx != 0); + printf("geterror for %d state: %.08x\n", retcode, c->ssl->state); + perror("geterror"); + fflush(stdout); + return SSL_get_error(c->ssl, retcode); +} + +TCN_IMPLEMENT_CALL(jlong, SSLSocket, accept)(TCN_STDARGS, jlong ctx, + jlong sock, jlong pool) +{ + tcn_ssl_ctxt_t *c = J2P(ctx, tcn_ssl_ctxt_t *); + apr_socket_t *s = J2P(sock, apr_socket_t *); + apr_pool_t *p = J2P(pool, apr_pool_t *); + tcn_ssl_conn_t *con; + BIO *bio = NULL; + int retcode; + + UNREFERENCED(o); + TCN_ASSERT(pool != 0); + TCN_ASSERT(ctx != 0); + TCN_ASSERT(sock != 0); + + if ((con = ssl_create(e, c, p)) == NULL) { + tcn_ThrowException(e, "Create SSL failed"); + return 0; + } + con->sock = s; + + if ((bio = BIO_new(BIO_jbs_apr())) == NULL) { + tcn_ThrowException(e, "Create BIO failed"); + return 0; + } + bio->ptr = s; + + /* XXX cleanup ??? */ + + /* the bio */ + SSL_set_bio(con->ssl, bio, bio); + + /* do the handshake*/ + retcode = SSL_accept(con->ssl); + if (retcode<=0) { + printf("SSL_accept failed %d state: %.08x\n", retcode, con->ssl->state); + printf("SSL_accept %p cert\n", con->ssl->cert); + tcn_ThrowException(e, "Create SSL_accept failed"); + return 0; + } + +cleanup: + return P2J(con); +} +#else TCN_IMPLEMENT_CALL(jlong, SSLSocket, accept)(TCN_STDARGS, jlong ctx, jlong sock, jlong pool) { @@ -225,6 +365,7 @@ cleanup: return P2J(con); } +#endif TCN_IMPLEMENT_CALL(jlong, SSLSocket, connect)(TCN_STDARGS, jlong ctx, jlong sock, jlong pool)
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]