/* the SSL_read replacement routine which knows about the suck buffer */ static int ssl_io_suck_read(SSL *ssl, char *buf, int len) { ap_ctx *actx; struct ssl_io_suck_st *ss; request_rec *r = NULL; int rv; actx = (ap_ctx *)SSL_get_app_data2(ssl); if (actx != NULL) r = (request_rec *)ap_ctx_get(actx, "ssl::request_rec"); rv = -1; if (r != NULL && r->ctx != NULL) { ss = ap_ctx_get(r->ctx, "ssl::io::suck"); if (ss != NULL) { if (ss->active && ss->pendlen > 0) { /* ok, there is pre-sucked data */ len = (ss->pendlen > len ? len : ss->pendlen); memcpy(buf, ss->pendptr, len); ss->pendptr += len; ss->pendlen -= len; ssl_log(r->server, SSL_LOG_TRACE, "I/O: injecting %d bytes of pre-sucked data " "into Apache I/O layer", len); rv = len; } } } if (rv == -1) rv = SSL_read(ssl, buf, len); return rv; }
WF_OPENSSL(void, setSSLVerify)(JNIEnv *e, jobject o, jlong ssl, jint level, jint depth) { #pragma comment(linker, "/EXPORT:"__FUNCTION__"="__FUNCDNAME__) tcn_ssl_ctxt_t *c; int verify; SSL *ssl_ = J2P(ssl, SSL *); if (ssl_ == NULL) { throwIllegalStateException(e, "ssl is null"); return; } c = SSL_get_app_data2(ssl_); verify = SSL_VERIFY_NONE; UNREFERENCED(o); c->verify_mode = level; if (c->verify_mode == SSL_CVERIFY_UNSET) c->verify_mode = SSL_CVERIFY_NONE; if (depth > 0) c->verify_depth = depth; /* * Configure callbacks for SSL context */ if (c->verify_mode == SSL_CVERIFY_REQUIRE) verify |= SSL_VERIFY_PEER_STRICT; if ((c->verify_mode == SSL_CVERIFY_OPTIONAL) || (c->verify_mode == SSL_CVERIFY_OPTIONAL_NO_CA)) verify |= SSL_VERIFY_PEER; if (!c->store) { if (ssl_methods.SSL_CTX_set_default_verify_paths(c->ctx)) { c->store = ssl_methods.SSL_CTX_get_cert_store(c->ctx); crypto_methods.X509_STORE_set_flags(c->store, 0); } else { /* XXX: See if this is fatal */ } } ssl_methods.SSL_set_verify(ssl_, verify, SSL_callback_SSL_verify); }