Author: mturk
Date: Tue Sep 13 07:36:52 2011
New Revision: 1170067
URL: http://svn.apache.org/viewvc?rev=1170067&view=rev
Log:
Add ssl BIO wrapper and missing api
Added:
commons/sandbox/runtime/trunk/src/main/native/modules/openssl/bio.c (with
props)
Modified:
commons/sandbox/runtime/trunk/src/main/native/Makefile.unx.in
commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h
commons/sandbox/runtime/trunk/src/main/native/modules/openssl/api.c
commons/sandbox/runtime/trunk/src/main/native/modules/openssl/ctx.c
Modified: commons/sandbox/runtime/trunk/src/main/native/Makefile.unx.in
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/Makefile.unx.in?rev=1170067&r1=1170066&r2=1170067&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.unx.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.unx.in Tue Sep 13
07:36:52 2011
@@ -150,6 +150,7 @@ LIBSOURCES=\
SSLSOURCES=\
$(TOPDIR)/modules/openssl/api.c \
+ $(TOPDIR)/modules/openssl/bio.c \
$(TOPDIR)/modules/openssl/ctx.c \
$(TOPDIR)/modules/openssl/init.c \
$(TOPDIR)/modules/openssl/password.c \
Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h?rev=1170067&r1=1170066&r2=1170067&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h Tue Sep 13
07:36:52 2011
@@ -278,8 +278,6 @@ typedef struct acr_ssl_ctxt_t {
X509_STORE *crl;
/* pointer to the context verify store */
X509_STORE *store;
- const char *cert_files[SSL_AIDX_MAX];
- const char *key_files[SSL_AIDX_MAX];
X509 *certs[SSL_AIDX_MAX];
EVP_PKEY *keys[SSL_AIDX_MAX];
@@ -287,7 +285,6 @@ typedef struct acr_ssl_ctxt_t {
int shutdown_type;
char *rand_file;
- const char *cipher_suite;
/* for client or downstream server authentication */
int verify_depth;
int verify_mode;
@@ -301,14 +298,14 @@ typedef struct acr_ssl_ctxt_t {
int stapling_fake_trylater;
int stapling_errcache_timeout;
acr_time_t stapling_responder_timeout;
- const char *stapling_force_url;
+ char *stapling_force_url;
#endif
int ocsp_enabled; /* true if OCSP verification enabled
*/
int ocsp_force_default; /* true if the default responder URL
is
* used regardless of per-cert URL
*/
- const char *ocsp_responder; /* default responder URL */
+ char *ocsp_responder; /* default responder URL */
long ocsp_resptime_skew;
long ocsp_resp_maxage;
acr_time_t ocsp_responder_timeout;
Modified: commons/sandbox/runtime/trunk/src/main/native/modules/openssl/api.c
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/modules/openssl/api.c?rev=1170067&r1=1170066&r2=1170067&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/modules/openssl/api.c
(original)
+++ commons/sandbox/runtime/trunk/src/main/native/modules/openssl/api.c Tue Sep
13 07:36:52 2011
@@ -86,9 +86,13 @@ struct SSLAPIst {
/*** BIO ***/
long (*fpBIO_ctrl)(BIO *, int, long, void *);
int (*fpBIO_free)(BIO *);
+ void (*fpBIO_free_all)(BIO *);
BIO* (*fpBIO_new)(BIO_METHOD *);
BIO* (*fpBIO_new_file)(const char *, const char *);
BIO* (*fpBIO_new_fp)(FILE *, int);
+ BIO* (*fpBIO_push)(BIO *, BIO *);
+
+ BIO_METHOD* (*fpBIO_f_base64)(void);
BIO_METHOD* (*fpBIO_s_file)(void);
BIO_METHOD* (*fpBIO_s_mem)(void);
int (*fpBIO_printf)(BIO *, const char *, ...);
@@ -98,6 +102,8 @@ struct SSLAPIst {
BIGNUM* (*fpBN_bin2bn)(const unsigned char *, int, BIGNUM *);
/*** CRYPTO ***/
+ void (*fpCRYPTO_free)(void *);
+ void* (*fpCRYPTO_malloc)(int, const char *, int);
int (*fpCRYPTO_num_locks)(void);
void (*fpCRYPTO_set_dynlock_create_callback)(struct
CRYPTO_dynlock_value *(*)(const char *, int));
void (*fpCRYPTO_set_dynlock_lock_callback)(void (*)(int,
struct CRYPTO_dynlock_value *, const char *, int));
@@ -111,11 +117,15 @@ struct SSLAPIst {
void (*fpDH_free)(DH *dh);
/*** ERR ***/
+ void (*fpERR_clear_error)(void);
void (*fpERR_error_string_n)(unsigned long, char *, size_t);
unsigned long (*fpERR_get_error)(void);
void (*fpERR_load_crypto_strings)(void);
unsigned long (*fpERR_peek_error)(void);
+ /*** EVP ***/
+ void (*fpEVP_PKEY_free)(EVP_PKEY *);
+
/*** MD5 ***/
int (*fpMD5_Final)(unsigned char *, MD5_CTX *);
int (*fpMD5_Init)(MD5_CTX *);
@@ -172,6 +182,7 @@ struct SSLAPIst {
/*** X509 ***/
void (*fpX509_free)(X509 *);
+ void (*fpX509_STORE_free)(X509_STORE *);
void (*fpNULL)(void);
/*** _STACK ***/
@@ -271,9 +282,12 @@ ACR_JNI_EXPORT(jboolean, Native, ldopens
/*** BIO ***/
CRYPTO_FPLOAD(BIO_ctrl);
CRYPTO_FPLOAD(BIO_free);
+ CRYPTO_FPLOAD(BIO_free_all);
CRYPTO_FPLOAD(BIO_new);
CRYPTO_FPLOAD(BIO_new_file);
CRYPTO_FPLOAD(BIO_new_fp);
+ CRYPTO_FPLOAD(BIO_push);
+ CRYPTO_FPLOAD(BIO_f_base64);
CRYPTO_FPLOAD(BIO_s_file);
CRYPTO_FPLOAD(BIO_s_mem);
CRYPTO_FPLOAD(BIO_printf);
@@ -296,11 +310,15 @@ ACR_JNI_EXPORT(jboolean, Native, ldopens
CRYPTO_FPLOAD(DH_free);
/*** ERR ***/
+ CRYPTO_FPLOAD(ERR_clear_error);
CRYPTO_FPLOAD(ERR_error_string_n);
CRYPTO_FPLOAD(ERR_get_error);
CRYPTO_FPLOAD(ERR_load_crypto_strings);
CRYPTO_FPLOAD(ERR_peek_error);
+ /*** EVP ***/
+ CRYPTO_FPLOAD(EVP_PKEY_free);
+
/*** MD5 ***/
CRYPTO_FPLOAD(MD5_Final);
CRYPTO_FPLOAD(MD5_Init);
@@ -396,6 +414,11 @@ int BIO_free(BIO *a)
return SSLAPI_CALL(BIO_free)(a);
}
+void BIO_free_all(BIO *a)
+{
+ SSLAPI_CALL(BIO_free_all)(a);
+}
+
BIO *BIO_new_file(const char *filename, const char *mode)
{
return SSLAPI_CALL(BIO_new_file)(filename, mode);
@@ -406,6 +429,16 @@ BIO *BIO_new_fp(FILE *stream, int close_
return SSLAPI_CALL(BIO_new_fp)(stream, close_flag);
}
+BIO *BIO_push(BIO *b, BIO *append)
+{
+ return SSLAPI_CALL(BIO_push)(b, append);
+}
+
+BIO_METHOD *BIO_f_base64(void)
+{
+ return SSLAPI_CALL(BIO_f_base64)();
+}
+
BIO_METHOD *BIO_s_file(void)
{
return SSLAPI_CALL(BIO_s_file)();
@@ -437,6 +470,16 @@ BIGNUM *BN_bin2bn(const unsigned char *s
return SSLAPI_CALL(BN_bin2bn)(s, len, ret);
}
+void CRYPTO_free(void *p)
+{
+ SSLAPI_CALL(CRYPTO_free)(p);
+}
+
+void *CRYPTO_malloc(int num, const char *file, int line)
+{
+ return SSLAPI_CALL(CRYPTO_malloc)(num, file, line);
+}
+
int CRYPTO_num_locks(void)
{
return SSLAPI_CALL(CRYPTO_num_locks)();
@@ -558,6 +601,11 @@ int RAND_set_rand_engine(ENGINE *engine)
#endif /* OPENSSL_NO_ENGINE */
+void ERR_clear_error(void)
+{
+ SSLAPI_CALL(ERR_clear_error)();
+}
+
void ERR_error_string_n(unsigned long e, char *buf, size_t len)
{
return SSLAPI_CALL(ERR_error_string_n)(e, buf, len);
@@ -578,6 +626,11 @@ unsigned long ERR_peek_error(void)
return SSLAPI_CALL(ERR_peek_error)();
}
+void EVP_PKEY_free(EVP_PKEY *pkey)
+{
+ SSLAPI_CALL(EVP_PKEY_free)(pkey);
+}
+
int MD5_Init(MD5_CTX *c)
{
return SSLAPI_CALL(MD5_Init)(c);
@@ -737,6 +790,11 @@ void X509_free(X509 *x)
SSLAPI_CALL(X509_free)(x);
}
+void X509_STORE_free(X509_STORE *v)
+{
+ SSLAPI_CALL(X509_STORE_free)(v);
+}
+
void sk_pop_free(SSLAPI_STACK *st, void (*func)(void *))
{
SSLAPI_CALL(sk_pop_free)(st, func);
Added: commons/sandbox/runtime/trunk/src/main/native/modules/openssl/bio.c
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/modules/openssl/bio.c?rev=1170067&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/modules/openssl/bio.c (added)
+++ commons/sandbox/runtime/trunk/src/main/native/modules/openssl/bio.c Tue Sep
13 07:36:52 2011
@@ -0,0 +1,188 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "acr/clazz.h"
+#include "acr/error.h"
+#include "acr/misc.h"
+#include "acr/string.h"
+#include "acr/port.h"
+#include "acr/ssl.h"
+#include "arch_sync.h"
+
+#if !HAVE_OPENSSL
+#error "Cannot compile this file without HAVE_OPENSSL defined"
+#endif
+
+J_DECLARE_CLAZZ = {
+ INVALID_FIELD_OFFSET,
+ 0,
+ 0,
+ 0,
+ ACR_SSL_CP "SSLBio"
+};
+
+J_DECLARE_M_ID(0000) = {
+ 0,
+ "<init>",
+ "(J)V"
+};
+
+J_DECLARE_M_ID(0001) = {
+ 0,
+ "write",
+ "([B)I"
+};
+
+J_DECLARE_M_ID(0002) = {
+ 0,
+ "read",
+ "([B)I"
+};
+
+J_DECLARE_M_ID(0003) = {
+ 0,
+ "puts",
+ "(Ljava/lang/String;)I"
+};
+
+J_DECLARE_M_ID(0004) = {
+ 0,
+ "gets",
+ "(I)Ljava/lang/String;"
+};
+
+typedef struct acr_bio_t {
+ volatile acr_atomic32_t refs;
+ jobject obj;
+} acr_bio_t;
+
+ACR_SSL_EXPORT(void, SSLBio, init0)(JNI_STDARGS)
+{
+ if (_clazzn.u == 0) {
+ if (AcrLoadClass(env, &_clazzn, 0) == JNI_FALSE)
+ return;
+ V_LOAD_METHOD(0000);
+ V_LOAD_METHOD(0001);
+ V_LOAD_METHOD(0002);
+ V_LOAD_METHOD(0003);
+ V_LOAD_METHOD(0004);
+ _clazzn.u = 1;
+ }
+}
+
+void ssl_bio_close(BIO *bi)
+{
+ if (bi == 0)
+ return;
+ if (bi->ptr != 0 && (bi->flags & SSL_BIO_FLAG_CALLBACK)) {
+ acr_bio_t *bp = (acr_bio_t *)bi->ptr;
+ if (AcrAtomic32Dec(&bp->refs) == 0) {
+ OPENSSL_free(bp);
+ BIO_free(bi);
+ }
+ }
+ else
+ BIO_free(bi);
+}
+
+void ssl_bio_doref(BIO *bi)
+{
+ if (bi == 0)
+ return;
+ if (bi->ptr != 0 && (bi->flags & SSL_BIO_FLAG_CALLBACK)) {
+ acr_bio_t *bp = (acr_bio_t *)bi->ptr;
+ AcrAtomic32Inc(&bp->refs);
+ }
+}
+
+static int bio_j_new(BIO *bi)
+{
+ acr_bio_t *bp;
+
+ if ((bp = OPENSSL_malloc(sizeof(acr_bio_t))) == 0)
+ return 0;
+ bp->refs = 1;
+ bi->shutdown = 1;
+ bi->init = 0;
+ bi->num = -1;
+ bi->ptr = (char *)bp;
+
+ return 1;
+}
+
+static int bio_j_free(BIO *bi)
+{
+ if (bi == 0)
+ return 0;
+ if (bi->ptr != NULL) {
+ acr_bio_t *bp = (acr_bio_t *)bi->ptr;
+ if (bi->init) {
+ bi->init = 0;
+ if (bp->obj != 0) {
+ JNIEnv *env = AcrGetJNIEnv();
+ if (env != 0)
+ (*env)->DeleteWeakGlobalRef(env, bp->obj);
+ bp->obj = 0;
+ }
+ }
+ OPENSSL_free(bi->ptr);
+ }
+ bi->ptr = 0;
+ return 1;
+}
+
+static long bio_j_ctrl(BIO *b, int cmd, long num, void *ptr)
+{
+ return 0;
+}
+
+static BIO_METHOD bio_j_methods = {
+ BIO_TYPE_FILE,
+ "Java OpenSSL BIO",
+ 0,
+ 0,
+ 0,
+ 0,
+ bio_j_ctrl,
+ bio_j_new,
+ bio_j_free,
+ 0
+};
+
+static BIO_METHOD *BIO_j_file()
+{
+ return &bio_j_methods;
+}
+
+ACR_SSL_EXPORT(jlong, SSLBio, new0)(JNI_STDARGS, jobject cb)
+{
+ BIO *bi;
+ acr_bio_t *bp;
+
+ if ((bi = BIO_new(BIO_j_file())) == 0) {
+ ACR_THROW(ACR_EX_ENOMEM, 0);
+ return 0;
+ }
+ bp = (acr_bio_t *)bi->ptr;
+ bp->obj = (*env)->NewWeakGlobalRef(env, cb);
+ if (bp->obj == 0) {
+ ssl_bio_close(bi);
+ ACR_THROW(ACR_EX_ENOMEM, 0);
+ return 0;
+ }
+
+ return P2J(bi);
+}
Propchange: commons/sandbox/runtime/trunk/src/main/native/modules/openssl/bio.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: commons/sandbox/runtime/trunk/src/main/native/modules/openssl/ctx.c
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/modules/openssl/ctx.c?rev=1170067&r1=1170066&r2=1170067&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/modules/openssl/ctx.c
(original)
+++ commons/sandbox/runtime/trunk/src/main/native/modules/openssl/ctx.c Tue Sep
13 07:36:52 2011
@@ -37,3 +37,30 @@ ACR_SSL_EXPORT(jlong, SSLContext, new0)(
return P2J(ctx);
}
+ACR_SSL_EXPORT(void, SSLContext, free0)(JNI_STDARGS, jlong ctx)
+{
+ int i;
+ acr_ssl_ctxt_t *c = J2P(ctx, acr_ssl_ctxt_t *);
+
+ if (c == 0)
+ return;
+ if (c->crl != 0)
+ X509_STORE_free(c->crl);
+ if (c->ctx != 0)
+ SSL_CTX_free(c->ctx);
+ for (i = 0; i < SSL_AIDX_MAX; i++) {
+ if (c->certs[i] != 0)
+ X509_free(c->certs[i]);
+ if (c->keys[i] != 0)
+ EVP_PKEY_free(c->keys[i]);
+ }
+#ifdef HAVE_OCSP_STAPLING
+ AcrFree(c->stapling_force_url);
+#endif
+ AcrFree(c->ocsp_responder);
+ AcrFree(c->rand_file);
+ ssl_bio_close(c->bio_is);
+ ssl_bio_close(c->bio_os);
+ AcrFree(c);
+}
+