Deleted Added
full compact
ssl_buckets.c (253895) ssl_buckets.c (262324)
1/* Copyright 2002-2004 Justin Erenkrantz and Greg Stein
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *

--- 449 unchanged lines hidden (view full) ---

458 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
459 case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
460 failures |= SERF_SSL_CERT_SELF_SIGNED;
461 break;
462 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
463 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
464 case X509_V_ERR_CERT_UNTRUSTED:
465 case X509_V_ERR_INVALID_CA:
1/* Copyright 2002-2004 Justin Erenkrantz and Greg Stein
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *

--- 449 unchanged lines hidden (view full) ---

458 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
459 case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
460 failures |= SERF_SSL_CERT_SELF_SIGNED;
461 break;
462 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
463 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
464 case X509_V_ERR_CERT_UNTRUSTED:
465 case X509_V_ERR_INVALID_CA:
466 case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
466 failures |= SERF_SSL_CERT_UNKNOWNCA;
467 break;
468 case X509_V_ERR_CERT_REVOKED:
469 failures |= SERF_SSL_CERT_REVOKED;
470 break;
471 default:
472 failures |= SERF_SSL_CERT_UNKNOWN_FAILURE;
473 break;

--- 479 unchanged lines hidden (view full) ---

953 CRYPTO_set_dynlock_lock_callback(NULL);
954 CRYPTO_set_dynlock_destroy_callback(NULL);
955
956 return APR_SUCCESS;
957}
958
959#endif
960
467 failures |= SERF_SSL_CERT_UNKNOWNCA;
468 break;
469 case X509_V_ERR_CERT_REVOKED:
470 failures |= SERF_SSL_CERT_REVOKED;
471 break;
472 default:
473 failures |= SERF_SSL_CERT_UNKNOWN_FAILURE;
474 break;

--- 479 unchanged lines hidden (view full) ---

954 CRYPTO_set_dynlock_lock_callback(NULL);
955 CRYPTO_set_dynlock_destroy_callback(NULL);
956
957 return APR_SUCCESS;
958}
959
960#endif
961
961static apr_uint32_t have_init_ssl = 0;
962#if !APR_VERSION_AT_LEAST(1,0,0)
963#define apr_atomic_cas32(mem, with, cmp) apr_atomic_cas(mem, with, cmp)
964#endif
962
965
966enum ssl_init_e
967{
968 INIT_UNINITIALIZED = 0,
969 INIT_BUSY = 1,
970 INIT_DONE = 2
971};
972
973static volatile apr_uint32_t have_init_ssl = INIT_UNINITIALIZED;
974
963static void init_ssl_libraries(void)
964{
965 apr_uint32_t val;
975static void init_ssl_libraries(void)
976{
977 apr_uint32_t val;
966#if APR_VERSION_AT_LEAST(1,0,0)
967 val = apr_atomic_xchg32(&have_init_ssl, 1);
968#else
969 val = apr_atomic_cas(&have_init_ssl, 1, 0);
970#endif
971
978
979 val = apr_atomic_cas32(&have_init_ssl, INIT_BUSY, INIT_UNINITIALIZED);
980
972 if (!val) {
973#if APR_HAS_THREADS
974 int i, numlocks;
975#endif
976
977#ifdef SSL_VERBOSE
978 /* Warn when compile-time and run-time version of OpenSSL differ in
979 major/minor version number. */

--- 30 unchanged lines hidden (view full) ---

1010 CRYPTO_set_locking_callback(ssl_lock);
1011 CRYPTO_set_id_callback(ssl_id);
1012 CRYPTO_set_dynlock_create_callback(ssl_dyn_create);
1013 CRYPTO_set_dynlock_lock_callback(ssl_dyn_lock);
1014 CRYPTO_set_dynlock_destroy_callback(ssl_dyn_destroy);
1015
1016 apr_pool_cleanup_register(ssl_pool, NULL, cleanup_ssl, cleanup_ssl);
1017#endif
981 if (!val) {
982#if APR_HAS_THREADS
983 int i, numlocks;
984#endif
985
986#ifdef SSL_VERBOSE
987 /* Warn when compile-time and run-time version of OpenSSL differ in
988 major/minor version number. */

--- 30 unchanged lines hidden (view full) ---

1019 CRYPTO_set_locking_callback(ssl_lock);
1020 CRYPTO_set_id_callback(ssl_id);
1021 CRYPTO_set_dynlock_create_callback(ssl_dyn_create);
1022 CRYPTO_set_dynlock_lock_callback(ssl_dyn_lock);
1023 CRYPTO_set_dynlock_destroy_callback(ssl_dyn_destroy);
1024
1025 apr_pool_cleanup_register(ssl_pool, NULL, cleanup_ssl, cleanup_ssl);
1026#endif
1027 apr_atomic_cas32(&have_init_ssl, INIT_DONE, INIT_BUSY);
1018 }
1028 }
1029 else
1030 {
1031 /* Make sure we don't continue before the initialization in another
1032 thread has completed */
1033 while (val != INIT_DONE) {
1034 apr_sleep(APR_USEC_PER_SEC / 1000);
1035
1036 val = apr_atomic_cas32(&have_init_ssl,
1037 INIT_UNINITIALIZED,
1038 INIT_UNINITIALIZED);
1039 }
1040 }
1019}
1020
1021static int ssl_need_client_cert(SSL *ssl, X509 **cert, EVP_PKEY **pkey)
1022{
1023 serf_ssl_context_t *ctx = SSL_get_app_data(ssl);
1024 apr_status_t status;
1025
1026 if (ctx->cached_cert) {

--- 166 unchanged lines hidden (view full) ---

1193 serf_ssl_server_cert_chain_cb_t cert_chain_callback,
1194 void *data)
1195{
1196 context->server_cert_callback = cert_callback;
1197 context->server_cert_chain_callback = cert_chain_callback;
1198 context->server_cert_userdata = data;
1199}
1200
1041}
1042
1043static int ssl_need_client_cert(SSL *ssl, X509 **cert, EVP_PKEY **pkey)
1044{
1045 serf_ssl_context_t *ctx = SSL_get_app_data(ssl);
1046 apr_status_t status;
1047
1048 if (ctx->cached_cert) {

--- 166 unchanged lines hidden (view full) ---

1215 serf_ssl_server_cert_chain_cb_t cert_chain_callback,
1216 void *data)
1217{
1218 context->server_cert_callback = cert_callback;
1219 context->server_cert_chain_callback = cert_chain_callback;
1220 context->server_cert_userdata = data;
1221}
1222
1201static serf_ssl_context_t *ssl_init_context(void)
1223static serf_ssl_context_t *ssl_init_context(serf_bucket_alloc_t *allocator)
1202{
1203 serf_ssl_context_t *ssl_ctx;
1224{
1225 serf_ssl_context_t *ssl_ctx;
1204 apr_pool_t *pool;
1205 serf_bucket_alloc_t *allocator;
1206
1207 init_ssl_libraries();
1208
1226
1227 init_ssl_libraries();
1228
1209 apr_pool_create(&pool, NULL);
1210 allocator = serf_bucket_allocator_create(pool, NULL, NULL);
1211
1212 ssl_ctx = serf_bucket_mem_alloc(allocator, sizeof(*ssl_ctx));
1213
1214 ssl_ctx->refcount = 0;
1229 ssl_ctx = serf_bucket_mem_alloc(allocator, sizeof(*ssl_ctx));
1230
1231 ssl_ctx->refcount = 0;
1215 ssl_ctx->pool = pool;
1232 ssl_ctx->pool = serf_bucket_allocator_get_pool(allocator);
1216 ssl_ctx->allocator = allocator;
1217
1218 ssl_ctx->ctx = SSL_CTX_new(SSLv23_client_method());
1219
1220 SSL_CTX_set_client_cert_cb(ssl_ctx->ctx, ssl_need_client_cert);
1221 ssl_ctx->cached_cert = 0;
1222 ssl_ctx->cached_cert_pw = 0;
1223 ssl_ctx->pending_err = APR_SUCCESS;

--- 40 unchanged lines hidden (view full) ---

1264 ssl_ctx->decrypt.databuf.read_baton = ssl_ctx;
1265
1266 return ssl_ctx;
1267}
1268
1269static apr_status_t ssl_free_context(
1270 serf_ssl_context_t *ssl_ctx)
1271{
1233 ssl_ctx->allocator = allocator;
1234
1235 ssl_ctx->ctx = SSL_CTX_new(SSLv23_client_method());
1236
1237 SSL_CTX_set_client_cert_cb(ssl_ctx->ctx, ssl_need_client_cert);
1238 ssl_ctx->cached_cert = 0;
1239 ssl_ctx->cached_cert_pw = 0;
1240 ssl_ctx->pending_err = APR_SUCCESS;

--- 40 unchanged lines hidden (view full) ---

1281 ssl_ctx->decrypt.databuf.read_baton = ssl_ctx;
1282
1283 return ssl_ctx;
1284}
1285
1286static apr_status_t ssl_free_context(
1287 serf_ssl_context_t *ssl_ctx)
1288{
1272 apr_pool_t *p;
1273
1274 /* If never had the pending buckets, don't try to free them. */
1275 if (ssl_ctx->decrypt.pending != NULL) {
1276 serf_bucket_destroy(ssl_ctx->decrypt.pending);
1277 }
1278 if (ssl_ctx->encrypt.pending != NULL) {
1279 serf_bucket_destroy(ssl_ctx->encrypt.pending);
1280 }
1281
1282 /* SSL_free implicitly frees the underlying BIO. */
1283 SSL_free(ssl_ctx->ssl);
1284 SSL_CTX_free(ssl_ctx->ctx);
1285
1289 /* If never had the pending buckets, don't try to free them. */
1290 if (ssl_ctx->decrypt.pending != NULL) {
1291 serf_bucket_destroy(ssl_ctx->decrypt.pending);
1292 }
1293 if (ssl_ctx->encrypt.pending != NULL) {
1294 serf_bucket_destroy(ssl_ctx->encrypt.pending);
1295 }
1296
1297 /* SSL_free implicitly frees the underlying BIO. */
1298 SSL_free(ssl_ctx->ssl);
1299 SSL_CTX_free(ssl_ctx->ctx);
1300
1286 p = ssl_ctx->pool;
1287
1288 serf_bucket_mem_free(ssl_ctx->allocator, ssl_ctx);
1301 serf_bucket_mem_free(ssl_ctx->allocator, ssl_ctx);
1289 apr_pool_destroy(p);
1290
1291 return APR_SUCCESS;
1292}
1293
1294static serf_bucket_t * serf_bucket_ssl_create(
1295 serf_ssl_context_t *ssl_ctx,
1296 serf_bucket_alloc_t *allocator,
1297 const serf_bucket_type_t *type)
1298{
1299 ssl_context_t *ctx;
1300
1301 ctx = serf_bucket_mem_alloc(allocator, sizeof(*ctx));
1302 if (!ssl_ctx) {
1302
1303 return APR_SUCCESS;
1304}
1305
1306static serf_bucket_t * serf_bucket_ssl_create(
1307 serf_ssl_context_t *ssl_ctx,
1308 serf_bucket_alloc_t *allocator,
1309 const serf_bucket_type_t *type)
1310{
1311 ssl_context_t *ctx;
1312
1313 ctx = serf_bucket_mem_alloc(allocator, sizeof(*ctx));
1314 if (!ssl_ctx) {
1303 ctx->ssl_ctx = ssl_init_context();
1315 ctx->ssl_ctx = ssl_init_context(allocator);
1304 }
1305 else {
1306 ctx->ssl_ctx = ssl_ctx;
1307 }
1308 ctx->ssl_ctx->refcount++;
1309
1310 return serf_bucket_create(type, allocator, ctx);
1311}

--- 464 unchanged lines hidden ---
1316 }
1317 else {
1318 ctx->ssl_ctx = ssl_ctx;
1319 }
1320 ctx->ssl_ctx->refcount++;
1321
1322 return serf_bucket_create(type, allocator, ctx);
1323}

--- 464 unchanged lines hidden ---