mturk 2005/06/15 05:08:02 Modified: jni/java/org/apache/tomcat/jni SSL.java SSLSocket.java jni/native/include ssl_private.h jni/native/src sslinfo.c Log: Update sslinfo to use the indexed approach to the params instead a name based. This way we'll keep the lower number of native functions. Revision Changes Path 1.19 +7 -2 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.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- SSL.java 12 Jun 2005 07:33:08 -0000 1.18 +++ SSL.java 15 Jun 2005 12:08:02 -0000 1.19 @@ -158,6 +158,11 @@ public static final int SSL_SHUTDOWN_TYPE_UNCLEAN = 2; public static final int SSL_SHUTDOWN_TYPE_ACCURATE = 3; + public static final int SSL_INFO_SESSION_ID = 1; + public static final int SSL_INFO_CIPHER = 2; + public static final int SSL_INFO_CIPHER_USEKEYSIZE = 3; + public static final int SSL_INFO_CIPHER_ALGKEYSIZE = 4; + /* Return OpenSSL version number */ public static native int version(); @@ -261,7 +266,7 @@ * @param file File contatining DH params. */ public static native boolean loadDSATempKey(int idx, String file); - + /** * Return last SSL error string */ 1.12 +27 -4 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.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- SSLSocket.java 14 Jun 2005 20:59:33 -0000 1.11 +++ SSLSocket.java 15 Jun 2005 12:08:02 -0000 1.12 @@ -234,10 +234,33 @@ int offset, int nbytes, long timeout); /** - * Retrun SSL SESSION id. + * Retrun SSL Info parameter as byte array. * * @param sock The socket to read the data from. - * @return Byte array containing session id. + * @param id Parameter id. + * @return Byte array containing info id value. */ - public static native byte[] getSessionId(long sock); + public static native byte[] getInfoB(long sock, int id) + throws Exception; + + /** + * Retrun SSL Info parameter as String. + * + * @param sock The socket to read the data from. + * @param id Parameter id. + * @return String containing info id value. + */ + public static native String getInfoS(long sock, int id) + throws Exception; + + /** + * Retrun SSL Info parameter as integer. + * + * @param sock The socket to read the data from. + * @param id Parameter id. + * @return Integer containing info id value or -1 on error. + */ + public static native int getInfoI(long sock, int id) + throws Exception; + } 1.29 +6 -1 jakarta-tomcat-connectors/jni/native/include/ssl_private.h Index: ssl_private.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/include/ssl_private.h,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- ssl_private.h 12 Jun 2005 10:31:16 -0000 1.28 +++ ssl_private.h 15 Jun 2005 12:08:02 -0000 1.29 @@ -141,6 +141,11 @@ #define SSL_TO_APR_ERROR(X) (APR_OS_START_USERERR + 1000 + X) +#define SSL_INFO_SESSION_ID (1) +#define SSL_INFO_CIPHER (2) +#define SSL_INFO_CIPHER_USEKEYSIZE (3) +#define SSL_INFO_CIPHER_ALGKEYSIZE (4) + #define SSL_VERIFY_ERROR_IS_OPTIONAL(errnum) \ ((errnum == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT) \ || (errnum == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN) \ 1.2 +103 -13 jakarta-tomcat-connectors/jni/native/src/sslinfo.c Index: sslinfo.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/sslinfo.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- sslinfo.c 14 Jun 2005 11:55:54 -0000 1.1 +++ sslinfo.c 15 Jun 2005 12:08:02 -0000 1.2 @@ -31,27 +31,117 @@ #ifdef HAVE_OPENSSL #include "ssl_private.h" -TCN_IMPLEMENT_CALL(jobject, SSLSocket, getSessionId)(TCN_STDARGS, jlong sock) +static const char *hex_basis = "0123456789ABCDEF"; + +static char *convert_to_hex(const void *buf, size_t len) +{ + const unsigned char *p = ( const unsigned char *)buf; + char *str, *s; + size_t i; + + if ((len < 1) || ((str = malloc(len * 2 + 1)) == NULL)) + return NULL; + for (i = 0, s = str; i < len; i++) { + unsigned char c = *p++; + *s++ = hex_basis[c >> 4]; + *s++ = hex_basis[c & 0x0F]; + } + *s = '\0'; + return str; +} + +TCN_IMPLEMENT_CALL(jobject, SSLSocket, getInfoB)(TCN_STDARGS, jlong sock, + jint what) { tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *); - SSL_SESSION *session; + jbyteArray array = NULL; UNREFERENCED(o); TCN_ASSERT(sock != 0); - if ((session = SSL_get_session(s->ssl)) != NULL) { - jbyteArray array; - jsize len = (jsize)session->session_id_length; - array = (*e)->NewByteArray(e, len); - if (array) { - (*e)->SetByteArrayRegion(e, array, 0, len, - (jbyte *)(&session->session_id[0])); + + switch (what) { + case SSL_INFO_SESSION_ID: + { + SSL_SESSION *session = SSL_get_session(s->ssl); + if (session) { + jsize len = (jsize)session->session_id_length; + if ((array = (*e)->NewByteArray(e, len)) != NULL) + (*e)->SetByteArrayRegion(e, array, 0, len, + (jbyte *)(&session->session_id[0])); + } } - return array; + break; + default: + tcn_ThrowAPRException(e, APR_EINVAL); + break; } - else - return NULL; + + return array; } +TCN_IMPLEMENT_CALL(jstring, SSLSocket, getInfoS)(TCN_STDARGS, jlong sock, + jint what) +{ + tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *); + jstring value = NULL; + + UNREFERENCED(o); + TCN_ASSERT(sock != 0); + + switch (what) { + case SSL_INFO_SESSION_ID: + { + SSL_SESSION *session = SSL_get_session(s->ssl); + if (session) { + char *hs = convert_to_hex(&session->session_id[0], + session->session_id_length); + if (hs) { + value = tcn_new_string(e, hs, -1); + free(hs); + } + } + } + break; + default: + tcn_ThrowAPRException(e, APR_EINVAL); + break; + } + + return value; +} + +TCN_IMPLEMENT_CALL(jint, SSLSocket, getInfoI)(TCN_STDARGS, jlong sock, + jint what) +{ + tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *); + jint value = -1; + + UNREFERENCED(o); + TCN_ASSERT(sock != 0); + + switch (what) { + case SSL_INFO_CIPHER_USEKEYSIZE: + case SSL_INFO_CIPHER_ALGKEYSIZE: + { + int usekeysize = 0; + int algkeysize = 0; + SSL_CIPHER *cipher = SSL_get_current_cipher(s->ssl); + if (cipher) { + usekeysize = SSL_CIPHER_get_bits(cipher, &algkeysize); + if (what == SSL_INFO_CIPHER_USEKEYSIZE) + value = usekeysize; + else + value = algkeysize; + } + } + break; + default: + tcn_ThrowAPRException(e, APR_EINVAL); + break; + } + + return value; +} #else /* OpenSSL is not supported
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]