diff options
Diffstat (limited to 'src/lib/libssl/ssl_sess.c')
-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) |