diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/ssl_sess.c | 1094 |
1 files changed, 539 insertions, 555 deletions
diff --git a/src/lib/libssl/ssl_sess.c b/src/lib/libssl/ssl_sess.c index ad40fadd02..b29115862b 100644 --- a/src/lib/libssl/ssl_sess.c +++ b/src/lib/libssl/ssl_sess.c | |||
| @@ -144,68 +144,74 @@ | |||
| 144 | #include "ssl_locl.h" | 144 | #include "ssl_locl.h" |
| 145 | 145 | ||
| 146 | static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s); | 146 | static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s); |
| 147 | static void SSL_SESSION_list_add(SSL_CTX *ctx,SSL_SESSION *s); | 147 | static void SSL_SESSION_list_add(SSL_CTX *ctx, SSL_SESSION *s); |
| 148 | static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck); | 148 | static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck); |
| 149 | 149 | ||
| 150 | SSL_SESSION *SSL_get_session(const SSL *ssl) | 150 | SSL_SESSION |
| 151 | *SSL_get_session(const SSL *ssl) | ||
| 151 | /* aka SSL_get0_session; gets 0 objects, just returns a copy of the pointer */ | 152 | /* aka SSL_get0_session; gets 0 objects, just returns a copy of the pointer */ |
| 152 | { | 153 | { |
| 153 | return(ssl->session); | 154 | return (ssl->session); |
| 154 | } | 155 | } |
| 155 | 156 | ||
| 156 | SSL_SESSION *SSL_get1_session(SSL *ssl) | 157 | SSL_SESSION |
| 158 | *SSL_get1_session(SSL *ssl) | ||
| 157 | /* variant of SSL_get_session: caller really gets something */ | 159 | /* variant of SSL_get_session: caller really gets something */ |
| 158 | { | 160 | { |
| 159 | SSL_SESSION *sess; | 161 | SSL_SESSION *sess; |
| 160 | /* Need to lock this all up rather than just use CRYPTO_add so that | 162 | /* Need to lock this all up rather than just use CRYPTO_add so that |
| 161 | * somebody doesn't free ssl->session between when we check it's | 163 | * somebody doesn't free ssl->session between when we check it's |
| 162 | * non-null and when we up the reference count. */ | 164 | * non-null and when we up the reference count. */ |
| 163 | CRYPTO_w_lock(CRYPTO_LOCK_SSL_SESSION); | 165 | CRYPTO_w_lock(CRYPTO_LOCK_SSL_SESSION); |
| 164 | sess = ssl->session; | 166 | sess = ssl->session; |
| 165 | if(sess) | 167 | if (sess) |
| 166 | sess->references++; | 168 | sess->references++; |
| 167 | CRYPTO_w_unlock(CRYPTO_LOCK_SSL_SESSION); | 169 | CRYPTO_w_unlock(CRYPTO_LOCK_SSL_SESSION); |
| 168 | return(sess); | 170 | return (sess); |
| 169 | } | 171 | } |
| 170 | 172 | ||
| 171 | int SSL_SESSION_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | 173 | int |
| 172 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) | 174 | SSL_SESSION_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, |
| 173 | { | 175 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) |
| 176 | { | ||
| 174 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_SESSION, argl, argp, | 177 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_SESSION, argl, argp, |
| 175 | new_func, dup_func, free_func); | 178 | new_func, dup_func, free_func); |
| 176 | } | 179 | } |
| 177 | 180 | ||
| 178 | int SSL_SESSION_set_ex_data(SSL_SESSION *s, int idx, void *arg) | 181 | int |
| 179 | { | 182 | SSL_SESSION_set_ex_data(SSL_SESSION *s, int idx, void *arg) |
| 180 | return(CRYPTO_set_ex_data(&s->ex_data,idx,arg)); | 183 | { |
| 181 | } | 184 | return (CRYPTO_set_ex_data(&s->ex_data, idx, arg)); |
| 185 | } | ||
| 182 | 186 | ||
| 183 | void *SSL_SESSION_get_ex_data(const SSL_SESSION *s, int idx) | 187 | void |
| 184 | { | 188 | *SSL_SESSION_get_ex_data(const SSL_SESSION *s, int idx) |
| 185 | return(CRYPTO_get_ex_data(&s->ex_data,idx)); | 189 | { |
| 186 | } | 190 | return (CRYPTO_get_ex_data(&s->ex_data, idx)); |
| 191 | } | ||
| 187 | 192 | ||
| 188 | SSL_SESSION *SSL_SESSION_new(void) | 193 | SSL_SESSION |
| 189 | { | 194 | *SSL_SESSION_new(void) |
| 195 | { | ||
| 190 | SSL_SESSION *ss; | 196 | SSL_SESSION *ss; |
| 191 | 197 | ||
| 192 | ss=(SSL_SESSION *)OPENSSL_malloc(sizeof(SSL_SESSION)); | 198 | ss = (SSL_SESSION *)OPENSSL_malloc(sizeof(SSL_SESSION)); |
| 193 | if (ss == NULL) | 199 | if (ss == NULL) { |
| 194 | { | 200 | SSLerr(SSL_F_SSL_SESSION_NEW, ERR_R_MALLOC_FAILURE); |
| 195 | SSLerr(SSL_F_SSL_SESSION_NEW,ERR_R_MALLOC_FAILURE); | 201 | return (0); |
| 196 | return(0); | 202 | } |
| 197 | } | 203 | memset(ss, 0, sizeof(SSL_SESSION)); |
| 198 | memset(ss,0,sizeof(SSL_SESSION)); | ||
| 199 | 204 | ||
| 200 | ss->verify_result = 1; /* avoid 0 (= X509_V_OK) just in case */ | 205 | ss->verify_result = 1; /* avoid 0 (= X509_V_OK) just in case */ |
| 201 | ss->references=1; | 206 | ss->references = 1; |
| 202 | ss->timeout=60*5+4; /* 5 minute timeout by default */ | 207 | ss->timeout=60*5+4; /* 5 minute timeout by default */ |
| 203 | ss->time=(unsigned long)time(NULL); | 208 | ss->time = (unsigned long)time(NULL); |
| 204 | ss->prev=NULL; | 209 | ss->prev = NULL; |
| 205 | ss->next=NULL; | 210 | ss->next = NULL; |
| 206 | ss->compress_meth=0; | 211 | ss->compress_meth = 0; |
| 207 | #ifndef OPENSSL_NO_TLSEXT | 212 | #ifndef OPENSSL_NO_TLSEXT |
| 208 | ss->tlsext_hostname = NULL; | 213 | ss->tlsext_hostname = NULL; |
| 214 | |||
| 209 | #ifndef OPENSSL_NO_EC | 215 | #ifndef OPENSSL_NO_EC |
| 210 | ss->tlsext_ecpointformatlist_length = 0; | 216 | ss->tlsext_ecpointformatlist_length = 0; |
| 211 | ss->tlsext_ecpointformatlist = NULL; | 217 | ss->tlsext_ecpointformatlist = NULL; |
| @@ -215,26 +221,28 @@ SSL_SESSION *SSL_SESSION_new(void) | |||
| 215 | #endif | 221 | #endif |
| 216 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data); | 222 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data); |
| 217 | #ifndef OPENSSL_NO_PSK | 223 | #ifndef OPENSSL_NO_PSK |
| 218 | ss->psk_identity_hint=NULL; | 224 | ss->psk_identity_hint = NULL; |
| 219 | ss->psk_identity=NULL; | 225 | ss->psk_identity = NULL; |
| 220 | #endif | 226 | #endif |
| 221 | #ifndef OPENSSL_NO_SRP | 227 | #ifndef OPENSSL_NO_SRP |
| 222 | ss->srp_username=NULL; | 228 | ss->srp_username = NULL; |
| 223 | #endif | 229 | #endif |
| 224 | return(ss); | 230 | return (ss); |
| 225 | } | 231 | } |
| 226 | 232 | ||
| 227 | const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, unsigned int *len) | 233 | const unsigned char |
| 228 | { | 234 | *SSL_SESSION_get_id(const SSL_SESSION *s, unsigned int *len) |
| 229 | if(len) | 235 | { |
| 236 | if (len) | ||
| 230 | *len = s->session_id_length; | 237 | *len = s->session_id_length; |
| 231 | return s->session_id; | 238 | return s->session_id; |
| 232 | } | 239 | } |
| 233 | 240 | ||
| 234 | unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s) | 241 | unsigned int |
| 235 | { | 242 | SSL_SESSION_get_compress_id(const SSL_SESSION *s) |
| 243 | { | ||
| 236 | return s->compress_meth; | 244 | return s->compress_meth; |
| 237 | } | 245 | } |
| 238 | 246 | ||
| 239 | /* Even with SSLv2, we have 16 bytes (128 bits) of session ID space. SSLv3/TLSv1 | 247 | /* Even with SSLv2, we have 16 bytes (128 bits) of session ID space. SSLv3/TLSv1 |
| 240 | * has 32 bytes (256 bits). As such, filling the ID with random gunk repeatedly | 248 | * has 32 bytes (256 bits). As such, filling the ID with random gunk repeatedly |
| @@ -246,16 +254,17 @@ unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s) | |||
| 246 | * store that many sessions is perhaps a more interesting question ... */ | 254 | * store that many sessions is perhaps a more interesting question ... */ |
| 247 | 255 | ||
| 248 | #define MAX_SESS_ID_ATTEMPTS 10 | 256 | #define MAX_SESS_ID_ATTEMPTS 10 |
| 249 | static int def_generate_session_id(const SSL *ssl, unsigned char *id, | 257 | static int |
| 250 | unsigned int *id_len) | 258 | def_generate_session_id(const SSL *ssl, unsigned char *id, |
| 259 | unsigned int *id_len) | ||
| 251 | { | 260 | { |
| 252 | unsigned int retry = 0; | 261 | unsigned int retry = 0; |
| 253 | do | 262 | do |
| 254 | if (RAND_pseudo_bytes(id, *id_len) <= 0) | 263 | if (RAND_pseudo_bytes(id, *id_len) <= 0) |
| 255 | return 0; | 264 | return 0; |
| 256 | while(SSL_has_matching_session_id(ssl, id, *id_len) && | 265 | while (SSL_has_matching_session_id(ssl, id, *id_len) && |
| 257 | (++retry < MAX_SESS_ID_ATTEMPTS)); | 266 | (++retry < MAX_SESS_ID_ATTEMPTS)); |
| 258 | if(retry < MAX_SESS_ID_ATTEMPTS) | 267 | if (retry < MAX_SESS_ID_ATTEMPTS) |
| 259 | return 1; | 268 | return 1; |
| 260 | /* else - woops a session_id match */ | 269 | /* else - woops a session_id match */ |
| 261 | /* XXX We should also check the external cache -- | 270 | /* XXX We should also check the external cache -- |
| @@ -269,120 +278,100 @@ static int def_generate_session_id(const SSL *ssl, unsigned char *id, | |||
| 269 | return 0; | 278 | return 0; |
| 270 | } | 279 | } |
| 271 | 280 | ||
| 272 | int ssl_get_new_session(SSL *s, int session) | 281 | int |
| 273 | { | 282 | ssl_get_new_session(SSL *s, int session) |
| 283 | { | ||
| 274 | /* This gets used by clients and servers. */ | 284 | /* This gets used by clients and servers. */ |
| 275 | 285 | ||
| 276 | unsigned int tmp; | 286 | unsigned int tmp; |
| 277 | SSL_SESSION *ss=NULL; | 287 | SSL_SESSION *ss = NULL; |
| 278 | GEN_SESSION_CB cb = def_generate_session_id; | 288 | GEN_SESSION_CB cb = def_generate_session_id; |
| 279 | 289 | ||
| 280 | if ((ss=SSL_SESSION_new()) == NULL) return(0); | 290 | if ((ss = SSL_SESSION_new()) == NULL) return (0); |
| 281 | 291 | ||
| 282 | /* If the context has a default timeout, use it */ | 292 | /* If the context has a default timeout, use it */ |
| 283 | if (s->session_ctx->session_timeout == 0) | 293 | if (s->session_ctx->session_timeout == 0) |
| 284 | ss->timeout=SSL_get_default_timeout(s); | 294 | ss->timeout = SSL_get_default_timeout(s); |
| 285 | else | 295 | else |
| 286 | ss->timeout=s->session_ctx->session_timeout; | 296 | ss->timeout = s->session_ctx->session_timeout; |
| 287 | 297 | ||
| 288 | if (s->session != NULL) | 298 | if (s->session != NULL) { |
| 289 | { | ||
| 290 | SSL_SESSION_free(s->session); | 299 | SSL_SESSION_free(s->session); |
| 291 | s->session=NULL; | 300 | s->session = NULL; |
| 292 | } | 301 | } |
| 293 | 302 | ||
| 294 | if (session) | 303 | if (session) { |
| 295 | { | 304 | if (s->version == SSL2_VERSION) { |
| 296 | if (s->version == SSL2_VERSION) | 305 | ss->ssl_version = SSL2_VERSION; |
| 297 | { | 306 | ss->session_id_length = SSL2_SSL_SESSION_ID_LENGTH; |
| 298 | ss->ssl_version=SSL2_VERSION; | 307 | } else if (s->version == SSL3_VERSION) { |
| 299 | ss->session_id_length=SSL2_SSL_SESSION_ID_LENGTH; | 308 | ss->ssl_version = SSL3_VERSION; |
| 300 | } | 309 | ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH; |
| 301 | else if (s->version == SSL3_VERSION) | 310 | } else if (s->version == TLS1_VERSION) { |
| 302 | { | 311 | ss->ssl_version = TLS1_VERSION; |
| 303 | ss->ssl_version=SSL3_VERSION; | 312 | ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH; |
| 304 | ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH; | 313 | } else if (s->version == TLS1_1_VERSION) { |
| 305 | } | 314 | ss->ssl_version = TLS1_1_VERSION; |
| 306 | else if (s->version == TLS1_VERSION) | 315 | ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH; |
| 307 | { | 316 | } else if (s->version == TLS1_2_VERSION) { |
| 308 | ss->ssl_version=TLS1_VERSION; | 317 | ss->ssl_version = TLS1_2_VERSION; |
| 309 | ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH; | 318 | ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH; |
| 310 | } | 319 | } else if (s->version == DTLS1_BAD_VER) { |
| 311 | else if (s->version == TLS1_1_VERSION) | 320 | ss->ssl_version = DTLS1_BAD_VER; |
| 312 | { | 321 | ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH; |
| 313 | ss->ssl_version=TLS1_1_VERSION; | 322 | } else if (s->version == DTLS1_VERSION) { |
| 314 | ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH; | 323 | ss->ssl_version = DTLS1_VERSION; |
| 315 | } | 324 | ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH; |
| 316 | else if (s->version == TLS1_2_VERSION) | 325 | } else { |
| 317 | { | 326 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, SSL_R_UNSUPPORTED_SSL_VERSION); |
| 318 | ss->ssl_version=TLS1_2_VERSION; | ||
| 319 | ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH; | ||
| 320 | } | ||
| 321 | else if (s->version == DTLS1_BAD_VER) | ||
| 322 | { | ||
| 323 | ss->ssl_version=DTLS1_BAD_VER; | ||
| 324 | ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH; | ||
| 325 | } | ||
| 326 | else if (s->version == DTLS1_VERSION) | ||
| 327 | { | ||
| 328 | ss->ssl_version=DTLS1_VERSION; | ||
| 329 | ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH; | ||
| 330 | } | ||
| 331 | else | ||
| 332 | { | ||
| 333 | SSLerr(SSL_F_SSL_GET_NEW_SESSION,SSL_R_UNSUPPORTED_SSL_VERSION); | ||
| 334 | SSL_SESSION_free(ss); | 327 | SSL_SESSION_free(ss); |
| 335 | return(0); | 328 | return (0); |
| 336 | } | 329 | } |
| 337 | #ifndef OPENSSL_NO_TLSEXT | 330 | #ifndef OPENSSL_NO_TLSEXT |
| 338 | /* If RFC4507 ticket use empty session ID */ | 331 | /* If RFC4507 ticket use empty session ID */ |
| 339 | if (s->tlsext_ticket_expected) | 332 | if (s->tlsext_ticket_expected) { |
| 340 | { | ||
| 341 | ss->session_id_length = 0; | 333 | ss->session_id_length = 0; |
| 342 | goto sess_id_done; | 334 | goto sess_id_done; |
| 343 | } | 335 | } |
| 344 | #endif | 336 | #endif |
| 345 | /* Choose which callback will set the session ID */ | 337 | /* Choose which callback will set the session ID */ |
| 346 | CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX); | 338 | CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX); |
| 347 | if(s->generate_session_id) | 339 | if (s->generate_session_id) |
| 348 | cb = s->generate_session_id; | 340 | cb = s->generate_session_id; |
| 349 | else if(s->session_ctx->generate_session_id) | 341 | else if (s->session_ctx->generate_session_id) |
| 350 | cb = s->session_ctx->generate_session_id; | 342 | cb = s->session_ctx->generate_session_id; |
| 351 | CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX); | 343 | CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX); |
| 352 | /* Choose a session ID */ | 344 | /* Choose a session ID */ |
| 353 | tmp = ss->session_id_length; | 345 | tmp = ss->session_id_length; |
| 354 | if(!cb(s, ss->session_id, &tmp)) | 346 | if (!cb(s, ss->session_id, &tmp)) { |
| 355 | { | ||
| 356 | /* The callback failed */ | 347 | /* The callback failed */ |
| 357 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, | 348 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, |
| 358 | SSL_R_SSL_SESSION_ID_CALLBACK_FAILED); | 349 | SSL_R_SSL_SESSION_ID_CALLBACK_FAILED); |
| 359 | SSL_SESSION_free(ss); | 350 | SSL_SESSION_free(ss); |
| 360 | return(0); | 351 | return (0); |
| 361 | } | 352 | } |
| 362 | /* Don't allow the callback to set the session length to zero. | 353 | /* Don't allow the callback to set the session length to zero. |
| 363 | * nor set it higher than it was. */ | 354 | * nor set it higher than it was. */ |
| 364 | if(!tmp || (tmp > ss->session_id_length)) | 355 | if (!tmp || (tmp > ss->session_id_length)) { |
| 365 | { | ||
| 366 | /* The callback set an illegal length */ | 356 | /* The callback set an illegal length */ |
| 367 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, | 357 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, |
| 368 | SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH); | 358 | SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH); |
| 369 | SSL_SESSION_free(ss); | 359 | SSL_SESSION_free(ss); |
| 370 | return(0); | 360 | return (0); |
| 371 | } | 361 | } |
| 372 | /* If the session length was shrunk and we're SSLv2, pad it */ | 362 | /* If the session length was shrunk and we're SSLv2, pad it */ |
| 373 | if((tmp < ss->session_id_length) && (s->version == SSL2_VERSION)) | 363 | if ((tmp < ss->session_id_length) && (s->version == SSL2_VERSION)) |
| 374 | memset(ss->session_id + tmp, 0, ss->session_id_length - tmp); | 364 | memset(ss->session_id + tmp, 0, ss->session_id_length - tmp); |
| 375 | else | 365 | else |
| 376 | ss->session_id_length = tmp; | 366 | ss->session_id_length = tmp; |
| 377 | /* Finally, check for a conflict */ | 367 | /* Finally, check for a conflict */ |
| 378 | if(SSL_has_matching_session_id(s, ss->session_id, | 368 | if (SSL_has_matching_session_id(s, ss->session_id, |
| 379 | ss->session_id_length)) | 369 | ss->session_id_length)) { |
| 380 | { | ||
| 381 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, | 370 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, |
| 382 | SSL_R_SSL_SESSION_ID_CONFLICT); | 371 | SSL_R_SSL_SESSION_ID_CONFLICT); |
| 383 | SSL_SESSION_free(ss); | 372 | SSL_SESSION_free(ss); |
| 384 | return(0); | 373 | return (0); |
| 385 | } | 374 | } |
| 386 | #ifndef OPENSSL_NO_TLSEXT | 375 | #ifndef OPENSSL_NO_TLSEXT |
| 387 | sess_id_done: | 376 | sess_id_done: |
| 388 | if (s->tlsext_hostname) { | 377 | if (s->tlsext_hostname) { |
| @@ -391,55 +380,50 @@ int ssl_get_new_session(SSL *s, int session) | |||
| 391 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_INTERNAL_ERROR); | 380 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_INTERNAL_ERROR); |
| 392 | SSL_SESSION_free(ss); | 381 | SSL_SESSION_free(ss); |
| 393 | return 0; | 382 | return 0; |
| 394 | } | ||
| 395 | } | 383 | } |
| 384 | } | ||
| 396 | #ifndef OPENSSL_NO_EC | 385 | #ifndef OPENSSL_NO_EC |
| 397 | if (s->tlsext_ecpointformatlist) | 386 | if (s->tlsext_ecpointformatlist) { |
| 398 | { | 387 | if (ss->tlsext_ecpointformatlist != NULL) |
| 399 | if (ss->tlsext_ecpointformatlist != NULL) OPENSSL_free(ss->tlsext_ecpointformatlist); | 388 | OPENSSL_free(ss->tlsext_ecpointformatlist); |
| 400 | if ((ss->tlsext_ecpointformatlist = OPENSSL_malloc(s->tlsext_ecpointformatlist_length)) == NULL) | 389 | if ((ss->tlsext_ecpointformatlist = OPENSSL_malloc(s->tlsext_ecpointformatlist_length)) == NULL) { |
| 401 | { | ||
| 402 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_MALLOC_FAILURE); | 390 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_MALLOC_FAILURE); |
| 403 | SSL_SESSION_free(ss); | 391 | SSL_SESSION_free(ss); |
| 404 | return 0; | 392 | return 0; |
| 405 | } | 393 | } |
| 406 | ss->tlsext_ecpointformatlist_length = s->tlsext_ecpointformatlist_length; | 394 | ss->tlsext_ecpointformatlist_length = s->tlsext_ecpointformatlist_length; |
| 407 | memcpy(ss->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist_length); | 395 | memcpy(ss->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist_length); |
| 408 | } | 396 | } |
| 409 | if (s->tlsext_ellipticcurvelist) | 397 | if (s->tlsext_ellipticcurvelist) { |
| 410 | { | 398 | if (ss->tlsext_ellipticcurvelist != NULL) |
| 411 | if (ss->tlsext_ellipticcurvelist != NULL) OPENSSL_free(ss->tlsext_ellipticcurvelist); | 399 | OPENSSL_free(ss->tlsext_ellipticcurvelist); |
| 412 | if ((ss->tlsext_ellipticcurvelist = OPENSSL_malloc(s->tlsext_ellipticcurvelist_length)) == NULL) | 400 | if ((ss->tlsext_ellipticcurvelist = OPENSSL_malloc(s->tlsext_ellipticcurvelist_length)) == NULL) { |
| 413 | { | ||
| 414 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_MALLOC_FAILURE); | 401 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_MALLOC_FAILURE); |
| 415 | SSL_SESSION_free(ss); | 402 | SSL_SESSION_free(ss); |
| 416 | return 0; | 403 | return 0; |
| 417 | } | 404 | } |
| 418 | ss->tlsext_ellipticcurvelist_length = s->tlsext_ellipticcurvelist_length; | 405 | ss->tlsext_ellipticcurvelist_length = s->tlsext_ellipticcurvelist_length; |
| 419 | memcpy(ss->tlsext_ellipticcurvelist, s->tlsext_ellipticcurvelist, s->tlsext_ellipticcurvelist_length); | 406 | memcpy(ss->tlsext_ellipticcurvelist, s->tlsext_ellipticcurvelist, s->tlsext_ellipticcurvelist_length); |
| 420 | } | 407 | } |
| 421 | #endif | 408 | #endif |
| 422 | #endif | 409 | #endif |
| 423 | } | 410 | } else { |
| 424 | else | 411 | ss->session_id_length = 0; |
| 425 | { | 412 | } |
| 426 | ss->session_id_length=0; | ||
| 427 | } | ||
| 428 | 413 | ||
| 429 | if (s->sid_ctx_length > sizeof ss->sid_ctx) | 414 | if (s->sid_ctx_length > sizeof ss->sid_ctx) { |
| 430 | { | ||
| 431 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_INTERNAL_ERROR); | 415 | SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_INTERNAL_ERROR); |
| 432 | SSL_SESSION_free(ss); | 416 | SSL_SESSION_free(ss); |
| 433 | return 0; | 417 | return 0; |
| 434 | } | 418 | } |
| 435 | memcpy(ss->sid_ctx,s->sid_ctx,s->sid_ctx_length); | 419 | memcpy(ss->sid_ctx, s->sid_ctx, s->sid_ctx_length); |
| 436 | ss->sid_ctx_length=s->sid_ctx_length; | 420 | ss->sid_ctx_length = s->sid_ctx_length; |
| 437 | s->session=ss; | 421 | s->session = ss; |
| 438 | ss->ssl_version=s->version; | 422 | ss->ssl_version = s->version; |
| 439 | ss->verify_result = X509_V_OK; | 423 | ss->verify_result = X509_V_OK; |
| 440 | 424 | ||
| 441 | return(1); | 425 | return (1); |
| 442 | } | 426 | } |
| 443 | 427 | ||
| 444 | /* ssl_get_prev attempts to find an SSL_SESSION to be used to resume this | 428 | /* ssl_get_prev attempts to find an SSL_SESSION to be used to resume this |
| 445 | * connection. It is only called by servers. | 429 | * connection. It is only called by servers. |
| @@ -460,12 +444,13 @@ int ssl_get_new_session(SSL *s, int session) | |||
| 460 | * - Both for new and resumed sessions, s->tlsext_ticket_expected is set to 1 | 444 | * - Both for new and resumed sessions, s->tlsext_ticket_expected is set to 1 |
| 461 | * if the server should issue a new session ticket (to 0 otherwise). | 445 | * if the server should issue a new session ticket (to 0 otherwise). |
| 462 | */ | 446 | */ |
| 463 | int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len, | 447 | int |
| 464 | const unsigned char *limit) | 448 | ssl_get_prev_session(SSL *s, unsigned char *session_id, int len, |
| 465 | { | 449 | const unsigned char *limit) |
| 450 | { | ||
| 466 | /* This is used only by servers. */ | 451 | /* This is used only by servers. */ |
| 467 | 452 | ||
| 468 | SSL_SESSION *ret=NULL; | 453 | SSL_SESSION *ret = NULL; |
| 469 | int fatal = 0; | 454 | int fatal = 0; |
| 470 | int try_session_cache = 1; | 455 | int try_session_cache = 1; |
| 471 | #ifndef OPENSSL_NO_TLSEXT | 456 | #ifndef OPENSSL_NO_TLSEXT |
| @@ -480,8 +465,7 @@ int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len, | |||
| 480 | 465 | ||
| 481 | #ifndef OPENSSL_NO_TLSEXT | 466 | #ifndef OPENSSL_NO_TLSEXT |
| 482 | r = tls1_process_ticket(s, session_id, len, limit, &ret); /* sets s->tlsext_ticket_expected */ | 467 | r = tls1_process_ticket(s, session_id, len, limit, &ret); /* sets s->tlsext_ticket_expected */ |
| 483 | switch (r) | 468 | switch (r) { |
| 484 | { | ||
| 485 | case -1: /* Error during processing */ | 469 | case -1: /* Error during processing */ |
| 486 | fatal = 1; | 470 | fatal = 1; |
| 487 | goto err; | 471 | goto err; |
| @@ -494,39 +478,35 @@ int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len, | |||
| 494 | break; | 478 | break; |
| 495 | default: | 479 | default: |
| 496 | abort(); | 480 | abort(); |
| 497 | } | 481 | } |
| 498 | #endif | 482 | #endif |
| 499 | 483 | ||
| 500 | if (try_session_cache && | 484 | if (try_session_cache && |
| 501 | ret == NULL && | 485 | ret == NULL && |
| 502 | !(s->session_ctx->session_cache_mode & SSL_SESS_CACHE_NO_INTERNAL_LOOKUP)) | 486 | !(s->session_ctx->session_cache_mode & SSL_SESS_CACHE_NO_INTERNAL_LOOKUP)) { |
| 503 | { | ||
| 504 | SSL_SESSION data; | 487 | SSL_SESSION data; |
| 505 | data.ssl_version=s->version; | 488 | data.ssl_version = s->version; |
| 506 | data.session_id_length=len; | 489 | data.session_id_length = len; |
| 507 | if (len == 0) | 490 | if (len == 0) |
| 508 | return 0; | 491 | return 0; |
| 509 | memcpy(data.session_id,session_id,len); | 492 | memcpy(data.session_id, session_id, len); |
| 510 | CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX); | 493 | CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX); |
| 511 | ret=lh_SSL_SESSION_retrieve(s->session_ctx->sessions,&data); | 494 | ret = lh_SSL_SESSION_retrieve(s->session_ctx->sessions, &data); |
| 512 | if (ret != NULL) | 495 | if (ret != NULL) { |
| 513 | { | ||
| 514 | /* don't allow other threads to steal it: */ | 496 | /* don't allow other threads to steal it: */ |
| 515 | CRYPTO_add(&ret->references,1,CRYPTO_LOCK_SSL_SESSION); | 497 | CRYPTO_add(&ret->references, 1, CRYPTO_LOCK_SSL_SESSION); |
| 516 | } | 498 | } |
| 517 | CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX); | 499 | CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX); |
| 518 | if (ret == NULL) | 500 | if (ret == NULL) |
| 519 | s->session_ctx->stats.sess_miss++; | 501 | s->session_ctx->stats.sess_miss++; |
| 520 | } | 502 | } |
| 521 | 503 | ||
| 522 | if (try_session_cache && | 504 | if (try_session_cache && |
| 523 | ret == NULL && | 505 | ret == NULL && |
| 524 | s->session_ctx->get_session_cb != NULL) | 506 | s->session_ctx->get_session_cb != NULL) { |
| 525 | { | 507 | int copy = 1; |
| 526 | int copy=1; | 508 | |
| 527 | 509 | if ((ret = s->session_ctx->get_session_cb(s, session_id, len, ©))) { | |
| 528 | if ((ret=s->session_ctx->get_session_cb(s,session_id,len,©))) | ||
| 529 | { | ||
| 530 | s->session_ctx->stats.sess_cb_hit++; | 510 | s->session_ctx->stats.sess_cb_hit++; |
| 531 | 511 | ||
| 532 | /* Increment reference count now if the session callback | 512 | /* Increment reference count now if the session callback |
| @@ -535,16 +515,16 @@ int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len, | |||
| 535 | * it must handle the reference count itself [i.e. copy == 0], | 515 | * it must handle the reference count itself [i.e. copy == 0], |
| 536 | * or things won't be thread-safe). */ | 516 | * or things won't be thread-safe). */ |
| 537 | if (copy) | 517 | if (copy) |
| 538 | CRYPTO_add(&ret->references,1,CRYPTO_LOCK_SSL_SESSION); | 518 | CRYPTO_add(&ret->references, 1, CRYPTO_LOCK_SSL_SESSION); |
| 539 | 519 | ||
| 540 | /* Add the externally cached session to the internal | 520 | /* Add the externally cached session to the internal |
| 541 | * cache as well if and only if we are supposed to. */ | 521 | * cache as well if and only if we are supposed to. */ |
| 542 | if(!(s->session_ctx->session_cache_mode & SSL_SESS_CACHE_NO_INTERNAL_STORE)) | 522 | if (!(s->session_ctx->session_cache_mode & SSL_SESS_CACHE_NO_INTERNAL_STORE)) |
| 543 | /* The following should not return 1, otherwise, | 523 | /* The following should not return 1, otherwise, |
| 544 | * things are very strange */ | 524 | * things are very strange */ |
| 545 | SSL_CTX_add_session(s->session_ctx,ret); | 525 | SSL_CTX_add_session(s->session_ctx, ret); |
| 546 | } | ||
| 547 | } | 526 | } |
| 527 | } | ||
| 548 | 528 | ||
| 549 | if (ret == NULL) | 529 | if (ret == NULL) |
| 550 | goto err; | 530 | goto err; |
| @@ -552,15 +532,13 @@ int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len, | |||
| 552 | /* Now ret is non-NULL and we own one of its reference counts. */ | 532 | /* Now ret is non-NULL and we own one of its reference counts. */ |
| 553 | 533 | ||
| 554 | if (ret->sid_ctx_length != s->sid_ctx_length | 534 | if (ret->sid_ctx_length != s->sid_ctx_length |
| 555 | || memcmp(ret->sid_ctx,s->sid_ctx,ret->sid_ctx_length)) | 535 | || memcmp(ret->sid_ctx, s->sid_ctx, ret->sid_ctx_length)) { |
| 556 | { | ||
| 557 | /* We have the session requested by the client, but we don't | 536 | /* We have the session requested by the client, but we don't |
| 558 | * want to use it in this context. */ | 537 | * want to use it in this context. */ |
| 559 | goto err; /* treat like cache miss */ | 538 | goto err; /* treat like cache miss */ |
| 560 | } | 539 | } |
| 561 | 540 | ||
| 562 | if((s->verify_mode & SSL_VERIFY_PEER) && s->sid_ctx_length == 0) | 541 | if ((s->verify_mode & SSL_VERIFY_PEER) && s->sid_ctx_length == 0) { |
| 563 | { | ||
| 564 | /* We can't be sure if this session is being used out of | 542 | /* We can't be sure if this session is being used out of |
| 565 | * context, which is especially important for SSL_VERIFY_PEER. | 543 | * context, which is especially important for SSL_VERIFY_PEER. |
| 566 | * The application should have used SSL[_CTX]_set_session_id_context. | 544 | * The application should have used SSL[_CTX]_set_session_id_context. |
| @@ -570,87 +548,83 @@ int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len, | |||
| 570 | * applications to effectively disable the session cache by | 548 | * applications to effectively disable the session cache by |
| 571 | * accident without anyone noticing). | 549 | * accident without anyone noticing). |
| 572 | */ | 550 | */ |
| 573 | 551 | ||
| 574 | SSLerr(SSL_F_SSL_GET_PREV_SESSION,SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED); | 552 | SSLerr(SSL_F_SSL_GET_PREV_SESSION, SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED); |
| 575 | fatal = 1; | 553 | fatal = 1; |
| 576 | goto err; | 554 | goto err; |
| 577 | } | 555 | } |
| 578 | 556 | ||
| 579 | if (ret->cipher == NULL) | 557 | if (ret->cipher == NULL) { |
| 580 | { | 558 | unsigned char buf[5], *p; |
| 581 | unsigned char buf[5],*p; | ||
| 582 | unsigned long l; | 559 | unsigned long l; |
| 583 | 560 | ||
| 584 | p=buf; | 561 | p = buf; |
| 585 | l=ret->cipher_id; | 562 | l = ret->cipher_id; |
| 586 | l2n(l,p); | 563 | l2n(l, p); |
| 587 | if ((ret->ssl_version>>8) >= SSL3_VERSION_MAJOR) | 564 | if ((ret->ssl_version >> 8) >= SSL3_VERSION_MAJOR) |
| 588 | ret->cipher=ssl_get_cipher_by_char(s,&(buf[2])); | 565 | ret->cipher = ssl_get_cipher_by_char(s, &(buf[2])); |
| 589 | else | 566 | else |
| 590 | ret->cipher=ssl_get_cipher_by_char(s,&(buf[1])); | 567 | ret->cipher = ssl_get_cipher_by_char(s, &(buf[1])); |
| 591 | if (ret->cipher == NULL) | 568 | if (ret->cipher == NULL) |
| 592 | goto err; | 569 | goto err; |
| 593 | } | 570 | } |
| 594 | 571 | ||
| 595 | if (ret->timeout < (long)(time(NULL) - ret->time)) /* timeout */ | 572 | if (ret->timeout < (long)(time(NULL) - ret->time)) /* timeout */ |
| 596 | { | 573 | { |
| 597 | s->session_ctx->stats.sess_timeout++; | 574 | s->session_ctx->stats.sess_timeout++; |
| 598 | if (try_session_cache) | 575 | if (try_session_cache) { |
| 599 | { | ||
| 600 | /* session was from the cache, so remove it */ | 576 | /* session was from the cache, so remove it */ |
| 601 | SSL_CTX_remove_session(s->session_ctx,ret); | 577 | SSL_CTX_remove_session(s->session_ctx, ret); |
| 602 | } | ||
| 603 | goto err; | ||
| 604 | } | 578 | } |
| 579 | goto err; | ||
| 580 | } | ||
| 605 | 581 | ||
| 606 | s->session_ctx->stats.sess_hit++; | 582 | s->session_ctx->stats.sess_hit++; |
| 607 | 583 | ||
| 608 | if (s->session != NULL) | 584 | if (s->session != NULL) |
| 609 | SSL_SESSION_free(s->session); | 585 | SSL_SESSION_free(s->session); |
| 610 | s->session=ret; | 586 | s->session = ret; |
| 611 | s->verify_result = s->session->verify_result; | 587 | s->verify_result = s->session->verify_result; |
| 612 | return 1; | 588 | return 1; |
| 613 | 589 | ||
| 614 | err: | 590 | err: |
| 615 | if (ret != NULL) | 591 | if (ret != NULL) { |
| 616 | { | ||
| 617 | SSL_SESSION_free(ret); | 592 | SSL_SESSION_free(ret); |
| 618 | #ifndef OPENSSL_NO_TLSEXT | 593 | #ifndef OPENSSL_NO_TLSEXT |
| 619 | if (!try_session_cache) | 594 | if (!try_session_cache) { |
| 620 | { | ||
| 621 | /* The session was from a ticket, so we should | 595 | /* The session was from a ticket, so we should |
| 622 | * issue a ticket for the new session */ | 596 | * issue a ticket for the new session */ |
| 623 | s->tlsext_ticket_expected = 1; | 597 | s->tlsext_ticket_expected = 1; |
| 624 | } | ||
| 625 | #endif | ||
| 626 | } | 598 | } |
| 599 | #endif | ||
| 600 | } | ||
| 627 | if (fatal) | 601 | if (fatal) |
| 628 | return -1; | 602 | return -1; |
| 629 | else | 603 | else |
| 630 | return 0; | 604 | return 0; |
| 631 | } | 605 | } |
| 632 | 606 | ||
| 633 | int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *c) | 607 | int |
| 634 | { | 608 | SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *c) |
| 635 | int ret=0; | 609 | { |
| 610 | int ret = 0; | ||
| 636 | SSL_SESSION *s; | 611 | SSL_SESSION *s; |
| 637 | 612 | ||
| 638 | /* add just 1 reference count for the SSL_CTX's session cache | 613 | /* add just 1 reference count for the SSL_CTX's session cache |
| 639 | * even though it has two ways of access: each session is in a | 614 | * even though it has two ways of access: each session is in a |
| 640 | * doubly linked list and an lhash */ | 615 | * doubly linked list and an lhash */ |
| 641 | CRYPTO_add(&c->references,1,CRYPTO_LOCK_SSL_SESSION); | 616 | CRYPTO_add(&c->references, 1, CRYPTO_LOCK_SSL_SESSION); |
| 642 | /* if session c is in already in cache, we take back the increment later */ | 617 | /* if session c is in already in cache, we take back the increment later */ |
| 643 | 618 | ||
| 644 | CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); | 619 | CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); |
| 645 | s=lh_SSL_SESSION_insert(ctx->sessions,c); | 620 | s = lh_SSL_SESSION_insert(ctx->sessions, c); |
| 646 | 621 | ||
| 647 | /* s != NULL iff we already had a session with the given PID. | 622 | /* s != NULL iff we already had a session with the given PID. |
| 648 | * In this case, s == c should hold (then we did not really modify | 623 | * In this case, s == c should hold (then we did not really modify |
| 649 | * ctx->sessions), or we're in trouble. */ | 624 | * ctx->sessions), or we're in trouble. */ |
| 650 | if (s != NULL && s != c) | 625 | if (s != NULL && s != c) { |
| 651 | { | ||
| 652 | /* We *are* in trouble ... */ | 626 | /* We *are* in trouble ... */ |
| 653 | SSL_SESSION_list_remove(ctx,s); | 627 | SSL_SESSION_list_remove(ctx, s); |
| 654 | SSL_SESSION_free(s); | 628 | SSL_SESSION_free(s); |
| 655 | /* ... so pretend the other session did not exist in cache | 629 | /* ... so pretend the other session did not exist in cache |
| 656 | * (we cannot handle two SSL_SESSION structures with identical | 630 | * (we cannot handle two SSL_SESSION structures with identical |
| @@ -658,114 +632,117 @@ int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *c) | |||
| 658 | * two threads concurrently obtain the same session from an external | 632 | * two threads concurrently obtain the same session from an external |
| 659 | * cache) */ | 633 | * cache) */ |
| 660 | s = NULL; | 634 | s = NULL; |
| 661 | } | 635 | } |
| 662 | 636 | ||
| 663 | /* Put at the head of the queue unless it is already in the cache */ | 637 | /* Put at the head of the queue unless it is already in the cache */ |
| 664 | if (s == NULL) | 638 | if (s == NULL) |
| 665 | SSL_SESSION_list_add(ctx,c); | 639 | SSL_SESSION_list_add(ctx, c); |
| 666 | 640 | ||
| 667 | if (s != NULL) | 641 | if (s != NULL) { |
| 668 | { | ||
| 669 | /* existing cache entry -- decrement previously incremented reference | 642 | /* existing cache entry -- decrement previously incremented reference |
| 670 | * count because it already takes into account the cache */ | 643 | * count because it already takes into account the cache */ |
| 671 | 644 | ||
| 672 | SSL_SESSION_free(s); /* s == c */ | 645 | SSL_SESSION_free(s); /* s == c */ |
| 673 | ret=0; | 646 | ret = 0; |
| 674 | } | 647 | } else { |
| 675 | else | ||
| 676 | { | ||
| 677 | /* new cache entry -- remove old ones if cache has become too large */ | 648 | /* new cache entry -- remove old ones if cache has become too large */ |
| 678 | |||
| 679 | ret=1; | ||
| 680 | 649 | ||
| 681 | if (SSL_CTX_sess_get_cache_size(ctx) > 0) | 650 | ret = 1; |
| 682 | { | 651 | |
| 652 | if (SSL_CTX_sess_get_cache_size(ctx) > 0) { | ||
| 683 | while (SSL_CTX_sess_number(ctx) > | 653 | while (SSL_CTX_sess_number(ctx) > |
| 684 | SSL_CTX_sess_get_cache_size(ctx)) | 654 | SSL_CTX_sess_get_cache_size(ctx)) { |
| 685 | { | ||
| 686 | if (!remove_session_lock(ctx, | 655 | if (!remove_session_lock(ctx, |
| 687 | ctx->session_cache_tail, 0)) | 656 | ctx->session_cache_tail, 0)) |
| 688 | break; | 657 | break; |
| 689 | else | 658 | else |
| 690 | ctx->stats.sess_cache_full++; | 659 | ctx->stats.sess_cache_full++; |
| 691 | } | ||
| 692 | } | 660 | } |
| 693 | } | 661 | } |
| 694 | CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); | ||
| 695 | return(ret); | ||
| 696 | } | 662 | } |
| 663 | CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); | ||
| 664 | return (ret); | ||
| 665 | } | ||
| 697 | 666 | ||
| 698 | int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *c) | 667 | int |
| 668 | SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *c) | ||
| 699 | { | 669 | { |
| 700 | return remove_session_lock(ctx, c, 1); | 670 | return remove_session_lock(ctx, c, 1); |
| 701 | } | 671 | } |
| 702 | 672 | ||
| 703 | static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck) | 673 | static int |
| 704 | { | 674 | remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck) |
| 675 | { | ||
| 705 | SSL_SESSION *r; | 676 | SSL_SESSION *r; |
| 706 | int ret=0; | 677 | int ret = 0; |
| 707 | 678 | ||
| 708 | if ((c != NULL) && (c->session_id_length != 0)) | 679 | if ((c != NULL) && (c->session_id_length != 0)) { |
| 709 | { | 680 | if (lck) |
| 710 | if(lck) CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); | 681 | CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); |
| 711 | if ((r = lh_SSL_SESSION_retrieve(ctx->sessions,c)) == c) | 682 | if ((r = lh_SSL_SESSION_retrieve(ctx->sessions, c)) == c) { |
| 712 | { | 683 | ret = 1; |
| 713 | ret=1; | 684 | r = lh_SSL_SESSION_delete(ctx->sessions, c); |
| 714 | r=lh_SSL_SESSION_delete(ctx->sessions,c); | 685 | SSL_SESSION_list_remove(ctx, c); |
| 715 | SSL_SESSION_list_remove(ctx,c); | 686 | } |
| 716 | } | ||
| 717 | 687 | ||
| 718 | if(lck) CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); | 688 | if (lck) |
| 689 | CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); | ||
| 719 | 690 | ||
| 720 | if (ret) | 691 | if (ret) { |
| 721 | { | 692 | r->not_resumable = 1; |
| 722 | r->not_resumable=1; | ||
| 723 | if (ctx->remove_session_cb != NULL) | 693 | if (ctx->remove_session_cb != NULL) |
| 724 | ctx->remove_session_cb(ctx,r); | 694 | ctx->remove_session_cb(ctx, r); |
| 725 | SSL_SESSION_free(r); | 695 | SSL_SESSION_free(r); |
| 726 | } | ||
| 727 | } | 696 | } |
| 728 | else | 697 | } else |
| 729 | ret=0; | 698 | ret = 0; |
| 730 | return(ret); | 699 | return (ret); |
| 731 | } | 700 | } |
| 732 | 701 | ||
| 733 | void SSL_SESSION_free(SSL_SESSION *ss) | 702 | void |
| 734 | { | 703 | SSL_SESSION_free(SSL_SESSION *ss) |
| 704 | { | ||
| 735 | int i; | 705 | int i; |
| 736 | 706 | ||
| 737 | if(ss == NULL) | 707 | if (ss == NULL) |
| 738 | return; | 708 | return; |
| 739 | 709 | ||
| 740 | i=CRYPTO_add(&ss->references,-1,CRYPTO_LOCK_SSL_SESSION); | 710 | i = CRYPTO_add(&ss->references, -1, CRYPTO_LOCK_SSL_SESSION); |
| 741 | #ifdef REF_PRINT | 711 | #ifdef REF_PRINT |
| 742 | REF_PRINT("SSL_SESSION",ss); | 712 | REF_PRINT("SSL_SESSION", ss); |
| 743 | #endif | 713 | #endif |
| 744 | if (i > 0) return; | 714 | if (i > 0) |
| 715 | return; | ||
| 745 | #ifdef REF_CHECK | 716 | #ifdef REF_CHECK |
| 746 | if (i < 0) | 717 | if (i < 0) { |
| 747 | { | 718 | fprintf(stderr, "SSL_SESSION_free, bad reference count\n"); |
| 748 | fprintf(stderr,"SSL_SESSION_free, bad reference count\n"); | ||
| 749 | abort(); /* ok */ | 719 | abort(); /* ok */ |
| 750 | } | 720 | } |
| 751 | #endif | 721 | #endif |
| 752 | 722 | ||
| 753 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data); | 723 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data); |
| 754 | 724 | ||
| 755 | OPENSSL_cleanse(ss->key_arg,sizeof ss->key_arg); | 725 | OPENSSL_cleanse(ss->key_arg, sizeof ss->key_arg); |
| 756 | OPENSSL_cleanse(ss->master_key,sizeof ss->master_key); | 726 | OPENSSL_cleanse(ss->master_key, sizeof ss->master_key); |
| 757 | OPENSSL_cleanse(ss->session_id,sizeof ss->session_id); | 727 | OPENSSL_cleanse(ss->session_id, sizeof ss->session_id); |
| 758 | if (ss->sess_cert != NULL) ssl_sess_cert_free(ss->sess_cert); | 728 | if (ss->sess_cert != NULL) |
| 759 | if (ss->peer != NULL) X509_free(ss->peer); | 729 | ssl_sess_cert_free(ss->sess_cert); |
| 760 | if (ss->ciphers != NULL) sk_SSL_CIPHER_free(ss->ciphers); | 730 | if (ss->peer != NULL) |
| 731 | X509_free(ss->peer); | ||
| 732 | if (ss->ciphers != NULL) | ||
| 733 | sk_SSL_CIPHER_free(ss->ciphers); | ||
| 761 | #ifndef OPENSSL_NO_TLSEXT | 734 | #ifndef OPENSSL_NO_TLSEXT |
| 762 | if (ss->tlsext_hostname != NULL) OPENSSL_free(ss->tlsext_hostname); | 735 | if (ss->tlsext_hostname != NULL) |
| 763 | if (ss->tlsext_tick != NULL) OPENSSL_free(ss->tlsext_tick); | 736 | OPENSSL_free(ss->tlsext_hostname); |
| 737 | if (ss->tlsext_tick != NULL) | ||
| 738 | OPENSSL_free(ss->tlsext_tick); | ||
| 764 | #ifndef OPENSSL_NO_EC | 739 | #ifndef OPENSSL_NO_EC |
| 765 | ss->tlsext_ecpointformatlist_length = 0; | 740 | ss->tlsext_ecpointformatlist_length = 0; |
| 766 | if (ss->tlsext_ecpointformatlist != NULL) OPENSSL_free(ss->tlsext_ecpointformatlist); | 741 | if (ss->tlsext_ecpointformatlist != NULL) |
| 742 | OPENSSL_free(ss->tlsext_ecpointformatlist); | ||
| 767 | ss->tlsext_ellipticcurvelist_length = 0; | 743 | ss->tlsext_ellipticcurvelist_length = 0; |
| 768 | if (ss->tlsext_ellipticcurvelist != NULL) OPENSSL_free(ss->tlsext_ellipticcurvelist); | 744 | if (ss->tlsext_ellipticcurvelist != NULL) |
| 745 | OPENSSL_free(ss->tlsext_ellipticcurvelist); | ||
| 769 | #endif /* OPENSSL_NO_EC */ | 746 | #endif /* OPENSSL_NO_EC */ |
| 770 | #endif | 747 | #endif |
| 771 | #ifndef OPENSSL_NO_PSK | 748 | #ifndef OPENSSL_NO_PSK |
| @@ -778,382 +755,389 @@ void SSL_SESSION_free(SSL_SESSION *ss) | |||
| 778 | if (ss->srp_username != NULL) | 755 | if (ss->srp_username != NULL) |
| 779 | OPENSSL_free(ss->srp_username); | 756 | OPENSSL_free(ss->srp_username); |
| 780 | #endif | 757 | #endif |
| 781 | OPENSSL_cleanse(ss,sizeof(*ss)); | 758 | OPENSSL_cleanse(ss, sizeof(*ss)); |
| 782 | OPENSSL_free(ss); | 759 | OPENSSL_free(ss); |
| 783 | } | 760 | } |
| 784 | 761 | ||
| 785 | int SSL_set_session(SSL *s, SSL_SESSION *session) | 762 | int |
| 786 | { | 763 | SSL_set_session(SSL *s, SSL_SESSION *session) |
| 787 | int ret=0; | 764 | { |
| 765 | int ret = 0; | ||
| 788 | const SSL_METHOD *meth; | 766 | const SSL_METHOD *meth; |
| 789 | 767 | ||
| 790 | if (session != NULL) | 768 | if (session != NULL) { |
| 791 | { | 769 | meth = s->ctx->method->get_ssl_method(session->ssl_version); |
| 792 | meth=s->ctx->method->get_ssl_method(session->ssl_version); | ||
| 793 | if (meth == NULL) | 770 | if (meth == NULL) |
| 794 | meth=s->method->get_ssl_method(session->ssl_version); | 771 | meth = s->method->get_ssl_method(session->ssl_version); |
| 795 | if (meth == NULL) | 772 | if (meth == NULL) { |
| 796 | { | 773 | SSLerr(SSL_F_SSL_SET_SESSION, SSL_R_UNABLE_TO_FIND_SSL_METHOD); |
| 797 | SSLerr(SSL_F_SSL_SET_SESSION,SSL_R_UNABLE_TO_FIND_SSL_METHOD); | 774 | return (0); |
| 798 | return(0); | 775 | } |
| 799 | } | ||
| 800 | 776 | ||
| 801 | if (meth != s->method) | 777 | if (meth != s->method) { |
| 802 | { | 778 | if (!SSL_set_ssl_method(s, meth)) |
| 803 | if (!SSL_set_ssl_method(s,meth)) | 779 | return (0); |
| 804 | return(0); | 780 | } |
| 805 | } | ||
| 806 | 781 | ||
| 807 | #ifndef OPENSSL_NO_KRB5 | 782 | #ifndef OPENSSL_NO_KRB5 |
| 808 | if (s->kssl_ctx && !s->kssl_ctx->client_princ && | 783 | if (s->kssl_ctx && !s->kssl_ctx->client_princ && |
| 809 | session->krb5_client_princ_len > 0) | 784 | session->krb5_client_princ_len > 0) { |
| 810 | { | 785 | s->kssl_ctx->client_princ = (char *)OPENSSL_malloc(session->krb5_client_princ_len + 1); |
| 811 | s->kssl_ctx->client_princ = (char *)OPENSSL_malloc(session->krb5_client_princ_len + 1); | 786 | memcpy(s->kssl_ctx->client_princ, session->krb5_client_princ, |
| 812 | memcpy(s->kssl_ctx->client_princ,session->krb5_client_princ, | 787 | session->krb5_client_princ_len); |
| 813 | session->krb5_client_princ_len); | 788 | s->kssl_ctx->client_princ[session->krb5_client_princ_len] = '\0'; |
| 814 | s->kssl_ctx->client_princ[session->krb5_client_princ_len] = '\0'; | 789 | } |
| 815 | } | ||
| 816 | #endif /* OPENSSL_NO_KRB5 */ | 790 | #endif /* OPENSSL_NO_KRB5 */ |
| 817 | 791 | ||
| 818 | /* CRYPTO_w_lock(CRYPTO_LOCK_SSL);*/ | 792 | /* CRYPTO_w_lock(CRYPTO_LOCK_SSL);*/ |
| 819 | CRYPTO_add(&session->references,1,CRYPTO_LOCK_SSL_SESSION); | 793 | CRYPTO_add(&session->references, 1, CRYPTO_LOCK_SSL_SESSION); |
| 820 | if (s->session != NULL) | 794 | if (s->session != NULL) |
| 821 | SSL_SESSION_free(s->session); | 795 | SSL_SESSION_free(s->session); |
| 822 | s->session=session; | 796 | s->session = session; |
| 823 | s->verify_result = s->session->verify_result; | 797 | s->verify_result = s->session->verify_result; |
| 824 | /* CRYPTO_w_unlock(CRYPTO_LOCK_SSL);*/ | 798 | /* CRYPTO_w_unlock(CRYPTO_LOCK_SSL);*/ |
| 825 | ret=1; | 799 | ret = 1; |
| 826 | } | 800 | } else { |
| 827 | else | 801 | if (s->session != NULL) { |
| 828 | { | ||
| 829 | if (s->session != NULL) | ||
| 830 | { | ||
| 831 | SSL_SESSION_free(s->session); | 802 | SSL_SESSION_free(s->session); |
| 832 | s->session=NULL; | 803 | s->session = NULL; |
| 833 | } | 804 | } |
| 834 | 805 | ||
| 835 | meth=s->ctx->method; | 806 | meth = s->ctx->method; |
| 836 | if (meth != s->method) | 807 | if (meth != s->method) { |
| 837 | { | 808 | if (!SSL_set_ssl_method(s, meth)) |
| 838 | if (!SSL_set_ssl_method(s,meth)) | 809 | return (0); |
| 839 | return(0); | ||
| 840 | } | ||
| 841 | ret=1; | ||
| 842 | } | 810 | } |
| 843 | return(ret); | 811 | ret = 1; |
| 844 | } | 812 | } |
| 813 | return (ret); | ||
| 814 | } | ||
| 845 | 815 | ||
| 846 | long SSL_SESSION_set_timeout(SSL_SESSION *s, long t) | 816 | long |
| 847 | { | 817 | SSL_SESSION_set_timeout(SSL_SESSION *s, long t) |
| 848 | if (s == NULL) return(0); | 818 | { |
| 849 | s->timeout=t; | 819 | if (s == NULL) |
| 850 | return(1); | 820 | return (0); |
| 851 | } | 821 | s->timeout = t; |
| 822 | return (1); | ||
| 823 | } | ||
| 852 | 824 | ||
| 853 | long SSL_SESSION_get_timeout(const SSL_SESSION *s) | 825 | long |
| 854 | { | 826 | SSL_SESSION_get_timeout(const SSL_SESSION *s) |
| 855 | if (s == NULL) return(0); | 827 | { |
| 856 | return(s->timeout); | 828 | if (s == NULL) |
| 857 | } | 829 | return (0); |
| 830 | return (s->timeout); | ||
| 831 | } | ||
| 858 | 832 | ||
| 859 | long SSL_SESSION_get_time(const SSL_SESSION *s) | 833 | long |
| 860 | { | 834 | SSL_SESSION_get_time(const SSL_SESSION *s) |
| 861 | if (s == NULL) return(0); | 835 | { |
| 862 | return(s->time); | 836 | if (s == NULL) |
| 863 | } | 837 | return (0); |
| 838 | return (s->time); | ||
| 839 | } | ||
| 864 | 840 | ||
| 865 | long SSL_SESSION_set_time(SSL_SESSION *s, long t) | 841 | long |
| 866 | { | 842 | SSL_SESSION_set_time(SSL_SESSION *s, long t) |
| 867 | if (s == NULL) return(0); | 843 | { |
| 868 | s->time=t; | 844 | if (s == NULL) |
| 869 | return(t); | 845 | return (0); |
| 870 | } | 846 | s->time = t; |
| 847 | return (t); | ||
| 848 | } | ||
| 871 | 849 | ||
| 872 | X509 *SSL_SESSION_get0_peer(SSL_SESSION *s) | 850 | X509 |
| 873 | { | 851 | *SSL_SESSION_get0_peer(SSL_SESSION *s) |
| 852 | { | ||
| 874 | return s->peer; | 853 | return s->peer; |
| 875 | } | 854 | } |
| 876 | 855 | ||
| 877 | int SSL_SESSION_set1_id_context(SSL_SESSION *s,const unsigned char *sid_ctx, | 856 | int |
| 878 | unsigned int sid_ctx_len) | 857 | SSL_SESSION_set1_id_context(SSL_SESSION *s, const unsigned char *sid_ctx, |
| 879 | { | 858 | unsigned int sid_ctx_len) |
| 880 | if(sid_ctx_len > SSL_MAX_SID_CTX_LENGTH) | 859 | { |
| 881 | { | 860 | if (sid_ctx_len > SSL_MAX_SID_CTX_LENGTH) { |
| 882 | SSLerr(SSL_F_SSL_SESSION_SET1_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); | 861 | SSLerr(SSL_F_SSL_SESSION_SET1_ID_CONTEXT, SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); |
| 883 | return 0; | 862 | return 0; |
| 884 | } | 863 | } |
| 885 | s->sid_ctx_length=sid_ctx_len; | 864 | s->sid_ctx_length = sid_ctx_len; |
| 886 | memcpy(s->sid_ctx,sid_ctx,sid_ctx_len); | 865 | memcpy(s->sid_ctx, sid_ctx, sid_ctx_len); |
| 887 | 866 | ||
| 888 | return 1; | 867 | return 1; |
| 889 | } | 868 | } |
| 890 | 869 | ||
| 891 | long SSL_CTX_set_timeout(SSL_CTX *s, long t) | 870 | long |
| 892 | { | 871 | SSL_CTX_set_timeout(SSL_CTX *s, long t) |
| 872 | { | ||
| 893 | long l; | 873 | long l; |
| 894 | if (s == NULL) return(0); | 874 | if (s == NULL) |
| 895 | l=s->session_timeout; | 875 | return (0); |
| 896 | s->session_timeout=t; | 876 | l = s->session_timeout; |
| 897 | return(l); | 877 | s->session_timeout = t; |
| 898 | } | 878 | return (l); |
| 879 | } | ||
| 899 | 880 | ||
| 900 | long SSL_CTX_get_timeout(const SSL_CTX *s) | 881 | long |
| 901 | { | 882 | SSL_CTX_get_timeout(const SSL_CTX *s) |
| 902 | if (s == NULL) return(0); | 883 | { |
| 903 | return(s->session_timeout); | 884 | if (s == NULL) |
| 904 | } | 885 | return (0); |
| 886 | return (s->session_timeout); | ||
| 887 | } | ||
| 905 | 888 | ||
| 906 | #ifndef OPENSSL_NO_TLSEXT | 889 | #ifndef OPENSSL_NO_TLSEXT |
| 907 | int SSL_set_session_secret_cb(SSL *s, int (*tls_session_secret_cb)(SSL *s, void *secret, int *secret_len, | 890 | int |
| 908 | STACK_OF(SSL_CIPHER) *peer_ciphers, SSL_CIPHER **cipher, void *arg), void *arg) | 891 | SSL_set_session_secret_cb(SSL *s, int (*tls_session_secret_cb)(SSL *s, void *secret, int *secret_len, |
| 909 | { | 892 | STACK_OF(SSL_CIPHER) *peer_ciphers, SSL_CIPHER **cipher, void *arg), void *arg) |
| 910 | if (s == NULL) return(0); | 893 | { |
| 894 | if (s == NULL) | ||
| 895 | return (0); | ||
| 911 | s->tls_session_secret_cb = tls_session_secret_cb; | 896 | s->tls_session_secret_cb = tls_session_secret_cb; |
| 912 | s->tls_session_secret_cb_arg = arg; | 897 | s->tls_session_secret_cb_arg = arg; |
| 913 | return(1); | 898 | return (1); |
| 914 | } | 899 | } |
| 915 | 900 | ||
| 916 | int SSL_set_session_ticket_ext_cb(SSL *s, tls_session_ticket_ext_cb_fn cb, | 901 | int |
| 917 | void *arg) | 902 | SSL_set_session_ticket_ext_cb(SSL *s, tls_session_ticket_ext_cb_fn cb, |
| 918 | { | 903 | void *arg) |
| 919 | if (s == NULL) return(0); | 904 | { |
| 905 | if (s == NULL) | ||
| 906 | return (0); | ||
| 920 | s->tls_session_ticket_ext_cb = cb; | 907 | s->tls_session_ticket_ext_cb = cb; |
| 921 | s->tls_session_ticket_ext_cb_arg = arg; | 908 | s->tls_session_ticket_ext_cb_arg = arg; |
| 922 | return(1); | 909 | return (1); |
| 923 | } | 910 | } |
| 924 | 911 | ||
| 925 | int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len) | 912 | int |
| 926 | { | 913 | SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len) |
| 927 | if (s->version >= TLS1_VERSION) | 914 | { |
| 928 | { | 915 | if (s->version >= TLS1_VERSION) { |
| 929 | if (s->tlsext_session_ticket) | 916 | if (s->tlsext_session_ticket) { |
| 930 | { | ||
| 931 | OPENSSL_free(s->tlsext_session_ticket); | 917 | OPENSSL_free(s->tlsext_session_ticket); |
| 932 | s->tlsext_session_ticket = NULL; | 918 | s->tlsext_session_ticket = NULL; |
| 933 | } | 919 | } |
| 934 | 920 | ||
| 935 | s->tlsext_session_ticket = OPENSSL_malloc(sizeof(TLS_SESSION_TICKET_EXT) + ext_len); | 921 | s->tlsext_session_ticket = OPENSSL_malloc(sizeof(TLS_SESSION_TICKET_EXT) + ext_len); |
| 936 | if (!s->tlsext_session_ticket) | 922 | if (!s->tlsext_session_ticket) { |
| 937 | { | ||
| 938 | SSLerr(SSL_F_SSL_SET_SESSION_TICKET_EXT, ERR_R_MALLOC_FAILURE); | 923 | SSLerr(SSL_F_SSL_SET_SESSION_TICKET_EXT, ERR_R_MALLOC_FAILURE); |
| 939 | return 0; | 924 | return 0; |
| 940 | } | 925 | } |
| 941 | 926 | ||
| 942 | if (ext_data) | 927 | if (ext_data) { |
| 943 | { | ||
| 944 | s->tlsext_session_ticket->length = ext_len; | 928 | s->tlsext_session_ticket->length = ext_len; |
| 945 | s->tlsext_session_ticket->data = s->tlsext_session_ticket + 1; | 929 | s->tlsext_session_ticket->data = s->tlsext_session_ticket + 1; |
| 946 | memcpy(s->tlsext_session_ticket->data, ext_data, ext_len); | 930 | memcpy(s->tlsext_session_ticket->data, ext_data, ext_len); |
| 947 | } | 931 | } else { |
| 948 | else | ||
| 949 | { | ||
| 950 | s->tlsext_session_ticket->length = 0; | 932 | s->tlsext_session_ticket->length = 0; |
| 951 | s->tlsext_session_ticket->data = NULL; | 933 | s->tlsext_session_ticket->data = NULL; |
| 952 | } | 934 | } |
| 953 | 935 | ||
| 954 | return 1; | 936 | return 1; |
| 955 | } | 937 | } |
| 956 | 938 | ||
| 957 | return 0; | 939 | return 0; |
| 958 | } | 940 | } |
| 959 | #endif /* OPENSSL_NO_TLSEXT */ | 941 | #endif /* OPENSSL_NO_TLSEXT */ |
| 960 | 942 | ||
| 961 | typedef struct timeout_param_st | 943 | typedef struct timeout_param_st { |
| 962 | { | ||
| 963 | SSL_CTX *ctx; | 944 | SSL_CTX *ctx; |
| 964 | long time; | 945 | long time; |
| 965 | LHASH_OF(SSL_SESSION) *cache; | 946 | LHASH_OF(SSL_SESSION) *cache; |
| 966 | } TIMEOUT_PARAM; | 947 | } TIMEOUT_PARAM; |
| 967 | 948 | ||
| 968 | static void timeout_doall_arg(SSL_SESSION *s, TIMEOUT_PARAM *p) | 949 | static void |
| 969 | { | 950 | timeout_doall_arg(SSL_SESSION *s, TIMEOUT_PARAM *p) |
| 951 | { | ||
| 970 | if ((p->time == 0) || (p->time > (s->time+s->timeout))) /* timeout */ | 952 | if ((p->time == 0) || (p->time > (s->time+s->timeout))) /* timeout */ |
| 971 | { | 953 | { |
| 972 | /* The reason we don't call SSL_CTX_remove_session() is to | 954 | /* The reason we don't call SSL_CTX_remove_session() is to |
| 973 | * save on locking overhead */ | 955 | * save on locking overhead */ |
| 974 | (void)lh_SSL_SESSION_delete(p->cache,s); | 956 | (void)lh_SSL_SESSION_delete(p->cache, s); |
| 975 | SSL_SESSION_list_remove(p->ctx,s); | 957 | SSL_SESSION_list_remove(p->ctx, s); |
| 976 | s->not_resumable=1; | 958 | s->not_resumable = 1; |
| 977 | if (p->ctx->remove_session_cb != NULL) | 959 | if (p->ctx->remove_session_cb != NULL) |
| 978 | p->ctx->remove_session_cb(p->ctx,s); | 960 | p->ctx->remove_session_cb(p->ctx, s); |
| 979 | SSL_SESSION_free(s); | 961 | SSL_SESSION_free(s); |
| 980 | } | ||
| 981 | } | 962 | } |
| 963 | } | ||
| 982 | 964 | ||
| 983 | static IMPLEMENT_LHASH_DOALL_ARG_FN(timeout, SSL_SESSION, TIMEOUT_PARAM) | 965 | static |
| 966 | IMPLEMENT_LHASH_DOALL_ARG_FN(timeout, SSL_SESSION, TIMEOUT_PARAM) | ||
| 984 | 967 | ||
| 985 | void SSL_CTX_flush_sessions(SSL_CTX *s, long t) | 968 | void |
| 986 | { | 969 | SSL_CTX_flush_sessions(SSL_CTX *s, long t) |
| 970 | { | ||
| 987 | unsigned long i; | 971 | unsigned long i; |
| 988 | TIMEOUT_PARAM tp; | 972 | TIMEOUT_PARAM tp; |
| 989 | 973 | ||
| 990 | tp.ctx=s; | 974 | tp.ctx = s; |
| 991 | tp.cache=s->sessions; | 975 | tp.cache = s->sessions; |
| 992 | if (tp.cache == NULL) return; | 976 | if (tp.cache == NULL) |
| 993 | tp.time=t; | 977 | return; |
| 978 | tp.time = t; | ||
| 994 | CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); | 979 | CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); |
| 995 | i=CHECKED_LHASH_OF(SSL_SESSION, tp.cache)->down_load; | 980 | i = CHECKED_LHASH_OF(SSL_SESSION, tp.cache)->down_load; |
| 996 | CHECKED_LHASH_OF(SSL_SESSION, tp.cache)->down_load=0; | 981 | CHECKED_LHASH_OF(SSL_SESSION, tp.cache)->down_load = 0; |
| 997 | lh_SSL_SESSION_doall_arg(tp.cache, LHASH_DOALL_ARG_FN(timeout), | 982 | lh_SSL_SESSION_doall_arg(tp.cache, LHASH_DOALL_ARG_FN(timeout), |
| 998 | TIMEOUT_PARAM, &tp); | 983 | TIMEOUT_PARAM, &tp); |
| 999 | CHECKED_LHASH_OF(SSL_SESSION, tp.cache)->down_load=i; | 984 | CHECKED_LHASH_OF(SSL_SESSION, tp.cache)->down_load = i; |
| 1000 | CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); | 985 | CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); |
| 1001 | } | 986 | } |
| 1002 | 987 | ||
| 1003 | int ssl_clear_bad_session(SSL *s) | 988 | int |
| 1004 | { | 989 | ssl_clear_bad_session(SSL *s) |
| 1005 | if ( (s->session != NULL) && | 990 | { |
| 991 | if ((s->session != NULL) && | ||
| 1006 | !(s->shutdown & SSL_SENT_SHUTDOWN) && | 992 | !(s->shutdown & SSL_SENT_SHUTDOWN) && |
| 1007 | !(SSL_in_init(s) || SSL_in_before(s))) | 993 | !(SSL_in_init(s) || SSL_in_before(s))) { |
| 1008 | { | 994 | SSL_CTX_remove_session(s->ctx, s->session); |
| 1009 | SSL_CTX_remove_session(s->ctx,s->session); | 995 | return (1); |
| 1010 | return(1); | 996 | } else |
| 1011 | } | 997 | return (0); |
| 1012 | else | 998 | } |
| 1013 | return(0); | ||
| 1014 | } | ||
| 1015 | 999 | ||
| 1016 | /* locked by SSL_CTX in the calling function */ | 1000 | /* locked by SSL_CTX in the calling function */ |
| 1017 | static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s) | 1001 | static void |
| 1018 | { | 1002 | SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s) |
| 1019 | if ((s->next == NULL) || (s->prev == NULL)) return; | 1003 | { |
| 1004 | if ((s->next == NULL) | ||
| 1005 | || (s->prev == NULL)) return; | ||
| 1020 | 1006 | ||
| 1021 | if (s->next == (SSL_SESSION *)&(ctx->session_cache_tail)) | 1007 | if (s->next == (SSL_SESSION *)&(ctx->session_cache_tail)) |
| 1022 | { /* last element in list */ | 1008 | { /* last element in list */ |
| 1023 | if (s->prev == (SSL_SESSION *)&(ctx->session_cache_head)) | 1009 | if (s->prev == (SSL_SESSION *)&(ctx->session_cache_head)) |
| 1024 | { /* only one element in list */ | 1010 | { /* only one element in list */ |
| 1025 | ctx->session_cache_head=NULL; | 1011 | ctx->session_cache_head = NULL; |
| 1026 | ctx->session_cache_tail=NULL; | 1012 | ctx->session_cache_tail = NULL; |
| 1027 | } | 1013 | } else { |
| 1028 | else | 1014 | ctx->session_cache_tail = s->prev; |
| 1029 | { | 1015 | s->prev->next = (SSL_SESSION *)&(ctx->session_cache_tail); |
| 1030 | ctx->session_cache_tail=s->prev; | ||
| 1031 | s->prev->next=(SSL_SESSION *)&(ctx->session_cache_tail); | ||
| 1032 | } | ||
| 1033 | } | 1016 | } |
| 1034 | else | 1017 | } else { |
| 1035 | { | ||
| 1036 | if (s->prev == (SSL_SESSION *)&(ctx->session_cache_head)) | 1018 | if (s->prev == (SSL_SESSION *)&(ctx->session_cache_head)) |
| 1037 | { /* first element in list */ | 1019 | { /* first element in list */ |
| 1038 | ctx->session_cache_head=s->next; | 1020 | ctx->session_cache_head = s->next; |
| 1039 | s->next->prev=(SSL_SESSION *)&(ctx->session_cache_head); | 1021 | s->next->prev = (SSL_SESSION *)&(ctx->session_cache_head); |
| 1040 | } | 1022 | } else |
| 1041 | else | 1023 | { /* middle of list */ |
| 1042 | { /* middle of list */ | 1024 | s->next->prev = s->prev; |
| 1043 | s->next->prev=s->prev; | 1025 | s->prev->next = s->next; |
| 1044 | s->prev->next=s->next; | ||
| 1045 | } | ||
| 1046 | } | 1026 | } |
| 1047 | s->prev=s->next=NULL; | ||
| 1048 | } | 1027 | } |
| 1028 | s->prev = s->next = NULL; | ||
| 1029 | } | ||
| 1049 | 1030 | ||
| 1050 | static void SSL_SESSION_list_add(SSL_CTX *ctx, SSL_SESSION *s) | 1031 | static void |
| 1051 | { | 1032 | SSL_SESSION_list_add(SSL_CTX *ctx, SSL_SESSION *s) |
| 1033 | { | ||
| 1052 | if ((s->next != NULL) && (s->prev != NULL)) | 1034 | if ((s->next != NULL) && (s->prev != NULL)) |
| 1053 | SSL_SESSION_list_remove(ctx,s); | 1035 | SSL_SESSION_list_remove(ctx, s); |
| 1054 | 1036 | ||
| 1055 | if (ctx->session_cache_head == NULL) | 1037 | if (ctx->session_cache_head == NULL) { |
| 1056 | { | 1038 | ctx->session_cache_head = s; |
| 1057 | ctx->session_cache_head=s; | 1039 | ctx->session_cache_tail = s; |
| 1058 | ctx->session_cache_tail=s; | 1040 | s->prev = (SSL_SESSION *)&(ctx->session_cache_head); |
| 1059 | s->prev=(SSL_SESSION *)&(ctx->session_cache_head); | 1041 | s->next = (SSL_SESSION *)&(ctx->session_cache_tail); |
| 1060 | s->next=(SSL_SESSION *)&(ctx->session_cache_tail); | 1042 | } else { |
| 1061 | } | 1043 | s->next = ctx->session_cache_head; |
| 1062 | else | 1044 | s->next->prev = s; |
| 1063 | { | 1045 | s->prev = (SSL_SESSION *)&(ctx->session_cache_head); |
| 1064 | s->next=ctx->session_cache_head; | 1046 | ctx->session_cache_head = s; |
| 1065 | s->next->prev=s; | ||
| 1066 | s->prev=(SSL_SESSION *)&(ctx->session_cache_head); | ||
| 1067 | ctx->session_cache_head=s; | ||
| 1068 | } | ||
| 1069 | } | 1047 | } |
| 1048 | } | ||
| 1070 | 1049 | ||
| 1071 | void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, | 1050 | void |
| 1072 | int (*cb)(struct ssl_st *ssl,SSL_SESSION *sess)) | 1051 | SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, |
| 1073 | { | 1052 | int (*cb)(struct ssl_st *ssl, SSL_SESSION *sess)) { |
| 1074 | ctx->new_session_cb=cb; | 1053 | ctx->new_session_cb = cb; |
| 1075 | } | 1054 | } |
| 1076 | 1055 | ||
| 1077 | int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx))(SSL *ssl, SSL_SESSION *sess) | 1056 | int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx))(SSL *ssl, SSL_SESSION *sess) |
| 1078 | { | 1057 | { |
| 1079 | return ctx->new_session_cb; | 1058 | return ctx->new_session_cb; |
| 1080 | } | 1059 | } |
| 1081 | 1060 | ||
| 1082 | void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, | 1061 | void |
| 1083 | void (*cb)(SSL_CTX *ctx,SSL_SESSION *sess)) | 1062 | SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, |
| 1084 | { | 1063 | void (*cb)(SSL_CTX *ctx, SSL_SESSION *sess)) |
| 1085 | ctx->remove_session_cb=cb; | 1064 | { |
| 1086 | } | 1065 | ctx->remove_session_cb = cb; |
| 1066 | } | ||
| 1087 | 1067 | ||
| 1088 | void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx))(SSL_CTX * ctx,SSL_SESSION *sess) | 1068 | void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx))(SSL_CTX * ctx, SSL_SESSION *sess) |
| 1089 | { | 1069 | { |
| 1090 | return ctx->remove_session_cb; | 1070 | return ctx->remove_session_cb; |
| 1091 | } | 1071 | } |
| 1092 | 1072 | ||
| 1093 | void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, | 1073 | void |
| 1094 | SSL_SESSION *(*cb)(struct ssl_st *ssl, | 1074 | SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, |
| 1095 | unsigned char *data,int len,int *copy)) | 1075 | SSL_SESSION *(*cb)(struct ssl_st *ssl, |
| 1096 | { | 1076 | unsigned char *data, int len, int *copy)) |
| 1097 | ctx->get_session_cb=cb; | 1077 | { |
| 1098 | } | 1078 | ctx->get_session_cb = cb; |
| 1079 | } | ||
| 1099 | 1080 | ||
| 1100 | SSL_SESSION * (*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx))(SSL *ssl, | 1081 | SSL_SESSION * (*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx))(SSL *ssl, |
| 1101 | unsigned char *data,int len,int *copy) | 1082 | unsigned char *data, int len, int *copy) |
| 1102 | { | 1083 | { |
| 1103 | return ctx->get_session_cb; | 1084 | return ctx->get_session_cb; |
| 1104 | } | 1085 | } |
| 1105 | 1086 | ||
| 1106 | void SSL_CTX_set_info_callback(SSL_CTX *ctx, | 1087 | void |
| 1107 | void (*cb)(const SSL *ssl,int type,int val)) | 1088 | SSL_CTX_set_info_callback(SSL_CTX *ctx, |
| 1108 | { | 1089 | void (*cb)(const SSL *ssl, int type, int val)) |
| 1109 | ctx->info_callback=cb; | 1090 | { |
| 1110 | } | 1091 | ctx->info_callback = cb; |
| 1092 | } | ||
| 1111 | 1093 | ||
| 1112 | void (*SSL_CTX_get_info_callback(SSL_CTX *ctx))(const SSL *ssl,int type,int val) | 1094 | void (*SSL_CTX_get_info_callback(SSL_CTX *ctx))(const SSL *ssl, int type, int val) |
| 1113 | { | 1095 | { |
| 1114 | return ctx->info_callback; | 1096 | return ctx->info_callback; |
| 1115 | } | 1097 | } |
| 1116 | 1098 | ||
| 1117 | void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, | 1099 | void |
| 1118 | int (*cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey)) | 1100 | SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, |
| 1119 | { | 1101 | int (*cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey)) |
| 1120 | ctx->client_cert_cb=cb; | 1102 | { |
| 1121 | } | 1103 | ctx->client_cert_cb = cb; |
| 1104 | } | ||
| 1122 | 1105 | ||
| 1123 | int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx))(SSL * ssl, X509 ** x509 , EVP_PKEY **pkey) | 1106 | int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx))(SSL * ssl, X509 ** x509 , EVP_PKEY **pkey) |
| 1124 | { | 1107 | { |
| 1125 | return ctx->client_cert_cb; | 1108 | return ctx->client_cert_cb; |
| 1126 | } | 1109 | } |
| 1127 | 1110 | ||
| 1128 | #ifndef OPENSSL_NO_ENGINE | 1111 | #ifndef OPENSSL_NO_ENGINE |
| 1129 | int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e) | 1112 | int |
| 1130 | { | 1113 | SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e) |
| 1131 | if (!ENGINE_init(e)) | 1114 | { |
| 1132 | { | 1115 | if (!ENGINE_init(e)) { |
| 1133 | SSLerr(SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE, ERR_R_ENGINE_LIB); | 1116 | SSLerr(SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE, ERR_R_ENGINE_LIB); |
| 1134 | return 0; | 1117 | return 0; |
| 1135 | } | 1118 | } |
| 1136 | if(!ENGINE_get_ssl_client_cert_function(e)) | 1119 | if (!ENGINE_get_ssl_client_cert_function(e)) { |
| 1137 | { | ||
| 1138 | SSLerr(SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE, SSL_R_NO_CLIENT_CERT_METHOD); | 1120 | SSLerr(SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE, SSL_R_NO_CLIENT_CERT_METHOD); |
| 1139 | ENGINE_finish(e); | 1121 | ENGINE_finish(e); |
| 1140 | return 0; | 1122 | return 0; |
| 1141 | } | 1123 | } |
| 1142 | ctx->client_cert_engine = e; | 1124 | ctx->client_cert_engine = e; |
| 1143 | return 1; | 1125 | return 1; |
| 1144 | } | 1126 | } |
| 1145 | #endif | 1127 | #endif |
| 1146 | 1128 | ||
| 1147 | void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, | 1129 | void |
| 1148 | int (*cb)(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len)) | 1130 | SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, |
| 1149 | { | 1131 | int (*cb)(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len)) |
| 1150 | ctx->app_gen_cookie_cb=cb; | 1132 | { |
| 1151 | } | 1133 | ctx->app_gen_cookie_cb = cb; |
| 1134 | } | ||
| 1152 | 1135 | ||
| 1153 | void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, | 1136 | void |
| 1154 | int (*cb)(SSL *ssl, unsigned char *cookie, unsigned int cookie_len)) | 1137 | SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, |
| 1155 | { | 1138 | int (*cb)(SSL *ssl, unsigned char *cookie, unsigned int cookie_len)) |
| 1156 | ctx->app_verify_cookie_cb=cb; | 1139 | { |
| 1157 | } | 1140 | ctx->app_verify_cookie_cb = cb; |
| 1141 | } | ||
| 1158 | 1142 | ||
| 1159 | IMPLEMENT_PEM_rw(SSL_SESSION, SSL_SESSION, PEM_STRING_SSL_SESSION, SSL_SESSION) | 1143 | IMPLEMENT_PEM_rw(SSL_SESSION, SSL_SESSION, PEM_STRING_SSL_SESSION, SSL_SESSION) |
