| 
									
										
										
										
											2016-05-18 02:18:30 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2020-04-23 20:55:52 +08:00
										 |  |  |  * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2017-06-20 22:14:36 +08:00
										 |  |  |  * Copyright 2005 Nokia. All rights reserved. | 
					
						
							| 
									
										
										
										
											2002-04-14 06:47:20 +08:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-12-06 20:08:51 +08:00
										 |  |  |  * Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							| 
									
										
										
										
											2016-05-18 02:18:30 +08:00
										 |  |  |  * this file except in compliance with the License.  You can obtain a copy | 
					
						
							|  |  |  |  * in the file LICENSE in the source distribution or at | 
					
						
							|  |  |  |  * https://www.openssl.org/source/license.html
 | 
					
						
							| 
									
										
										
										
											2002-04-14 06:47:20 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-05-18 02:18:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | #include <stdio.h>
 | 
					
						
							| 
									
										
										
										
											2019-09-28 06:45:40 +08:00
										 |  |  | #include "ssl_local.h"
 | 
					
						
							| 
									
										
										
										
											2002-07-10 15:01:54 +08:00
										 |  |  | #include <openssl/evp.h>
 | 
					
						
							| 
									
										
										
										
											2001-07-31 07:57:25 +08:00
										 |  |  | #include <openssl/md5.h>
 | 
					
						
							| 
									
										
										
										
											2019-04-11 18:27:59 +08:00
										 |  |  | #include <openssl/core_names.h>
 | 
					
						
							| 
									
										
										
										
											2017-08-02 21:46:31 +08:00
										 |  |  | #include "internal/cryptlib.h"
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-08 21:47:51 +08:00
										 |  |  | static int ssl3_generate_key_block(SSL *s, unsigned char *km, int num) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-04-21 00:04:57 +08:00
										 |  |  |     const EVP_MD *md5 = NULL, *sha1 = NULL; | 
					
						
							| 
									
										
										
										
											2015-11-27 21:02:12 +08:00
										 |  |  |     EVP_MD_CTX *m5; | 
					
						
							|  |  |  |     EVP_MD_CTX *s1; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     unsigned char buf[16], smd[SHA_DIGEST_LENGTH]; | 
					
						
							|  |  |  |     unsigned char c = 'A'; | 
					
						
							| 
									
										
										
										
											2020-08-11 19:51:04 +08:00
										 |  |  |     unsigned int i, k; | 
					
						
							| 
									
										
										
										
											2015-11-27 21:02:12 +08:00
										 |  |  |     int ret = 0; | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-05 05:54:13 +08:00
										 |  |  | #ifdef CHARSET_EBCDIC
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     c = os_toascii[c];          /* 'A' in ASCII */ | 
					
						
							| 
									
										
										
										
											1999-06-05 05:54:13 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     k = 0; | 
					
						
							| 
									
										
										
										
											2020-04-21 00:04:57 +08:00
										 |  |  |     md5 = ssl_evp_md_fetch(s->ctx->libctx, NID_md5, s->ctx->propq); | 
					
						
							|  |  |  |     sha1 = ssl_evp_md_fetch(s->ctx->libctx, NID_sha1, s->ctx->propq); | 
					
						
							| 
									
										
										
										
											2015-12-02 07:49:35 +08:00
										 |  |  |     m5 = EVP_MD_CTX_new(); | 
					
						
							|  |  |  |     s1 = EVP_MD_CTX_new(); | 
					
						
							| 
									
										
										
										
											2020-04-21 00:04:57 +08:00
										 |  |  |     if (md5 == NULL || sha1 == NULL || m5 == NULL || s1 == NULL) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_MALLOC_FAILURE); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:02:12 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     for (i = 0; (int)i < num; i += MD5_DIGEST_LENGTH) { | 
					
						
							|  |  |  |         k++; | 
					
						
							| 
									
										
										
										
											2017-01-01 08:43:20 +08:00
										 |  |  |         if (k > sizeof(buf)) { | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             /* bug: 'buf' is too small for this ciphersuite */ | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2017-01-01 08:43:20 +08:00
										 |  |  |             goto err; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-11 19:51:04 +08:00
										 |  |  |         memset(buf, c, k); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         c++; | 
					
						
							| 
									
										
										
										
											2020-04-21 00:04:57 +08:00
										 |  |  |         if (!EVP_DigestInit_ex(s1, sha1, NULL) | 
					
						
							| 
									
										
										
										
											2016-06-18 22:46:13 +08:00
										 |  |  |             || !EVP_DigestUpdate(s1, buf, k) | 
					
						
							|  |  |  |             || !EVP_DigestUpdate(s1, s->session->master_key, | 
					
						
							|  |  |  |                                  s->session->master_key_length) | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |             || !EVP_DigestUpdate(s1, s->s3.server_random, SSL3_RANDOM_SIZE) | 
					
						
							|  |  |  |             || !EVP_DigestUpdate(s1, s->s3.client_random, SSL3_RANDOM_SIZE) | 
					
						
							| 
									
										
										
										
											2016-06-18 22:46:13 +08:00
										 |  |  |             || !EVP_DigestFinal_ex(s1, smd, NULL) | 
					
						
							| 
									
										
										
										
											2019-10-11 00:49:28 +08:00
										 |  |  |             || !EVP_DigestInit_ex(m5, md5, NULL) | 
					
						
							| 
									
										
										
										
											2016-06-18 22:46:13 +08:00
										 |  |  |             || !EVP_DigestUpdate(m5, s->session->master_key, | 
					
						
							|  |  |  |                                  s->session->master_key_length) | 
					
						
							| 
									
										
										
										
											2017-11-23 18:37:51 +08:00
										 |  |  |             || !EVP_DigestUpdate(m5, smd, SHA_DIGEST_LENGTH)) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2016-06-18 22:46:13 +08:00
										 |  |  |             goto err; | 
					
						
							| 
									
										
										
										
											2017-11-23 18:37:51 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         if ((int)(i + MD5_DIGEST_LENGTH) > num) { | 
					
						
							| 
									
										
										
										
											2017-11-23 18:37:51 +08:00
										 |  |  |             if (!EVP_DigestFinal_ex(m5, smd, NULL)) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |                 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2016-06-18 22:46:13 +08:00
										 |  |  |                 goto err; | 
					
						
							| 
									
										
										
										
											2017-11-23 18:37:51 +08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             memcpy(km, smd, (num - i)); | 
					
						
							| 
									
										
										
										
											2016-06-18 22:46:13 +08:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2017-11-23 18:37:51 +08:00
										 |  |  |             if (!EVP_DigestFinal_ex(m5, km, NULL)) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |                 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2016-06-18 22:46:13 +08:00
										 |  |  |                 goto err; | 
					
						
							| 
									
										
										
										
											2017-11-23 18:37:51 +08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-06-18 22:46:13 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         km += MD5_DIGEST_LENGTH; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-05-30 00:22:43 +08:00
										 |  |  |     OPENSSL_cleanse(smd, sizeof(smd)); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:02:12 +08:00
										 |  |  |     ret = 1; | 
					
						
							|  |  |  |  err: | 
					
						
							| 
									
										
										
										
											2015-12-02 07:49:35 +08:00
										 |  |  |     EVP_MD_CTX_free(m5); | 
					
						
							|  |  |  |     EVP_MD_CTX_free(s1); | 
					
						
							| 
									
										
										
										
											2020-01-16 20:14:27 +08:00
										 |  |  |     ssl_evp_md_free(md5); | 
					
						
							| 
									
										
										
										
											2020-04-21 00:04:57 +08:00
										 |  |  |     ssl_evp_md_free(sha1); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:02:12 +08:00
										 |  |  |     return ret; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-20 05:31:43 +08:00
										 |  |  | int ssl3_change_cipher_state(SSL *s, int which) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     unsigned char *p, *mac_secret; | 
					
						
							| 
									
										
										
										
											2015-12-05 09:04:41 +08:00
										 |  |  |     unsigned char *ms, *key, *iv; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     EVP_CIPHER_CTX *dd; | 
					
						
							|  |  |  |     const EVP_CIPHER *c; | 
					
						
							| 
									
										
										
										
											2005-10-01 07:35:33 +08:00
										 |  |  | #ifndef OPENSSL_NO_COMP
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     COMP_METHOD *comp; | 
					
						
							| 
									
										
										
										
											2005-10-01 07:35:33 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     const EVP_MD *m; | 
					
						
							| 
									
										
										
										
											2016-10-04 06:22:07 +08:00
										 |  |  |     int mdi; | 
					
						
							|  |  |  |     size_t n, i, j, k, cl; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     int reuse_dd = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     c = s->s3.tmp.new_sym_enc; | 
					
						
							|  |  |  |     m = s->s3.tmp.new_hash; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     /* m == NULL will lead to a crash later */ | 
					
						
							| 
									
										
										
										
											2017-05-19 16:35:19 +08:00
										 |  |  |     if (!ossl_assert(m != NULL)) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         goto err; | 
					
						
							| 
									
										
										
										
											2017-05-19 16:35:19 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-10-01 07:35:33 +08:00
										 |  |  | #ifndef OPENSSL_NO_COMP
 | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     if (s->s3.tmp.new_compression == NULL) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         comp = NULL; | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |         comp = s->s3.tmp.new_compression->method; | 
					
						
							| 
									
										
										
										
											2005-10-01 07:35:33 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     if (which & SSL3_CC_READ) { | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         if (s->enc_read_ctx != NULL) { | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             reuse_dd = 1; | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         } else if ((s->enc_read_ctx = EVP_CIPHER_CTX_new()) == NULL) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_MALLOC_FAILURE); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             goto err; | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             /*
 | 
					
						
							| 
									
										
										
										
											2016-03-11 04:34:48 +08:00
										 |  |  |              * make sure it's initialised in case we exit later with an error | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |              */ | 
					
						
							| 
									
										
										
										
											2015-12-14 05:08:41 +08:00
										 |  |  |             EVP_CIPHER_CTX_reset(s->enc_read_ctx); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         dd = s->enc_read_ctx; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-07 00:31:21 +08:00
										 |  |  |         if (ssl_replace_hash(&s->read_hash, m) == NULL) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |             goto err; | 
					
						
							| 
									
										
										
										
											2015-03-06 22:37:17 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-10-01 07:35:33 +08:00
										 |  |  | #ifndef OPENSSL_NO_COMP
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         /* COMPRESS */ | 
					
						
							| 
									
										
										
										
											2015-05-01 22:15:18 +08:00
										 |  |  |         COMP_CTX_free(s->expand); | 
					
						
							|  |  |  |         s->expand = NULL; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         if (comp != NULL) { | 
					
						
							|  |  |  |             s->expand = COMP_CTX_new(comp); | 
					
						
							|  |  |  |             if (s->expand == NULL) { | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |                 SSLfatal(s, SSL_AD_INTERNAL_ERROR, | 
					
						
							| 
									
										
										
										
											2017-12-04 21:37:01 +08:00
										 |  |  |                          SSL_R_COMPRESSION_LIBRARY_ERROR); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |                 goto err; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-10-01 07:35:33 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-02-03 22:26:50 +08:00
										 |  |  |         RECORD_LAYER_reset_read_sequence(&s->rlayer); | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |         mac_secret = &(s->s3.read_mac_secret[0]); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2018-08-07 17:25:54 +08:00
										 |  |  |         s->statem.enc_write_state = ENC_WRITE_STATE_INVALID; | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         if (s->enc_write_ctx != NULL) { | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             reuse_dd = 1; | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         } else if ((s->enc_write_ctx = EVP_CIPHER_CTX_new()) == NULL) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_MALLOC_FAILURE); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             goto err; | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             /*
 | 
					
						
							| 
									
										
										
										
											2016-03-11 04:34:48 +08:00
										 |  |  |              * make sure it's initialised in case we exit later with an error | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |              */ | 
					
						
							| 
									
										
										
										
											2015-12-14 05:08:41 +08:00
										 |  |  |             EVP_CIPHER_CTX_reset(s->enc_write_ctx); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         dd = s->enc_write_ctx; | 
					
						
							| 
									
										
										
										
											2015-11-07 00:31:21 +08:00
										 |  |  |         if (ssl_replace_hash(&s->write_hash, m) == NULL) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_MALLOC_FAILURE); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |             goto err; | 
					
						
							| 
									
										
										
										
											2015-03-06 22:37:17 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-10-01 07:35:33 +08:00
										 |  |  | #ifndef OPENSSL_NO_COMP
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         /* COMPRESS */ | 
					
						
							| 
									
										
										
										
											2015-05-01 22:15:18 +08:00
										 |  |  |         COMP_CTX_free(s->compress); | 
					
						
							|  |  |  |         s->compress = NULL; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         if (comp != NULL) { | 
					
						
							|  |  |  |             s->compress = COMP_CTX_new(comp); | 
					
						
							|  |  |  |             if (s->compress == NULL) { | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |                 SSLfatal(s, SSL_AD_INTERNAL_ERROR, | 
					
						
							|  |  |  |                          SSL_R_COMPRESSION_LIBRARY_ERROR); | 
					
						
							|  |  |  |                 goto err; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-10-01 07:35:33 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-02-03 22:26:50 +08:00
										 |  |  |         RECORD_LAYER_reset_write_sequence(&s->rlayer); | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |         mac_secret = &(s->s3.write_mac_secret[0]); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (reuse_dd) | 
					
						
							| 
									
										
										
										
											2015-12-14 05:08:41 +08:00
										 |  |  |         EVP_CIPHER_CTX_reset(dd); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     p = s->s3.tmp.key_block; | 
					
						
							| 
									
										
										
										
											2016-10-04 06:22:07 +08:00
										 |  |  |     mdi = EVP_MD_size(m); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |     if (mdi < 0) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-10-04 06:22:07 +08:00
										 |  |  |     i = mdi; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     cl = EVP_CIPHER_key_length(c); | 
					
						
							| 
									
										
										
										
											2015-12-05 09:04:41 +08:00
										 |  |  |     j = cl; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     k = EVP_CIPHER_iv_length(c); | 
					
						
							|  |  |  |     if ((which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) || | 
					
						
							|  |  |  |         (which == SSL3_CHANGE_CIPHER_SERVER_READ)) { | 
					
						
							|  |  |  |         ms = &(p[0]); | 
					
						
							|  |  |  |         n = i + i; | 
					
						
							|  |  |  |         key = &(p[n]); | 
					
						
							|  |  |  |         n += j + j; | 
					
						
							|  |  |  |         iv = &(p[n]); | 
					
						
							|  |  |  |         n += k + k; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         n = i; | 
					
						
							|  |  |  |         ms = &(p[n]); | 
					
						
							|  |  |  |         n += i + j; | 
					
						
							|  |  |  |         key = &(p[n]); | 
					
						
							|  |  |  |         n += j + k; | 
					
						
							|  |  |  |         iv = &(p[n]); | 
					
						
							|  |  |  |         n += k; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     if (n > s->s3.tmp.key_block_length) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         goto err; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     memcpy(mac_secret, ms, i); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |     if (!EVP_CipherInit_ex(dd, c, NULL, key, iv, (which & SSL3_CC_WRITE))) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-26 20:05:18 +08:00
										 |  |  |     if (EVP_CIPHER_provider(c) != NULL | 
					
						
							|  |  |  |             && !tls_provider_set_tls_params(s, dd, c, m)) { | 
					
						
							|  |  |  |         /* SSLfatal already called */ | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-07 17:25:54 +08:00
										 |  |  |     s->statem.enc_write_state = ENC_WRITE_STATE_VALID; | 
					
						
							| 
									
										
										
										
											2017-10-09 19:05:58 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |  err: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-20 05:31:43 +08:00
										 |  |  | int ssl3_setup_key_block(SSL *s) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     unsigned char *p; | 
					
						
							|  |  |  |     const EVP_CIPHER *c; | 
					
						
							|  |  |  |     const EVP_MD *hash; | 
					
						
							|  |  |  |     int num; | 
					
						
							|  |  |  |     int ret = 0; | 
					
						
							|  |  |  |     SSL_COMP *comp; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     if (s->s3.tmp.key_block_length != 0) | 
					
						
							| 
									
										
										
										
											2017-10-09 19:05:58 +08:00
										 |  |  |         return 1; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-16 20:14:27 +08:00
										 |  |  |     if (!ssl_cipher_get_evp(s->ctx, s->session, &c, &hash, NULL, NULL, &comp, | 
					
						
							|  |  |  |                             0)) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_CIPHER_OR_HASH_UNAVAILABLE); | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-16 20:14:27 +08:00
										 |  |  |     ssl_evp_cipher_free(s->s3.tmp.new_sym_enc); | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     s->s3.tmp.new_sym_enc = c; | 
					
						
							| 
									
										
										
										
											2020-01-16 20:14:27 +08:00
										 |  |  |     ssl_evp_md_free(s->s3.tmp.new_hash); | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     s->s3.tmp.new_hash = hash; | 
					
						
							| 
									
										
										
										
											2005-10-01 07:35:33 +08:00
										 |  |  | #ifdef OPENSSL_NO_COMP
 | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     s->s3.tmp.new_compression = NULL; | 
					
						
							| 
									
										
										
										
											2005-10-01 07:35:33 +08:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     s->s3.tmp.new_compression = comp; | 
					
						
							| 
									
										
										
										
											2005-10-01 07:35:33 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     num = EVP_MD_size(hash); | 
					
						
							|  |  |  |     if (num < 0) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     num = EVP_CIPHER_key_length(c) + num + EVP_CIPHER_iv_length(c); | 
					
						
							|  |  |  |     num *= 2; | 
					
						
							| 
									
										
										
										
											2008-12-30 00:11:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     ssl3_cleanup_key_block(s); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |     if ((p = OPENSSL_malloc(num)) == NULL) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_MALLOC_FAILURE); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     s->s3.tmp.key_block_length = num; | 
					
						
							|  |  |  |     s->s3.tmp.key_block = p; | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-23 18:37:51 +08:00
										 |  |  |     /* Calls SSLfatal() as required */ | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     ret = ssl3_generate_key_block(s, p, num); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)) { | 
					
						
							|  |  |  |         /*
 | 
					
						
							|  |  |  |          * enable vulnerability countermeasure for CBC ciphers with known-IV | 
					
						
							|  |  |  |          * problem (http://www.openssl.org/~bodo/tls-cbc.txt)
 | 
					
						
							|  |  |  |          */ | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |         s->s3.need_empty_fragments = 1; | 
					
						
							| 
									
										
										
										
											2002-04-14 06:47:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         if (s->session->cipher != NULL) { | 
					
						
							|  |  |  |             if (s->session->cipher->algorithm_enc == SSL_eNULL) | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |                 s->s3.need_empty_fragments = 0; | 
					
						
							| 
									
										
										
										
											2002-06-14 20:21:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-04-14 06:47:20 +08:00
										 |  |  | #ifndef OPENSSL_NO_RC4
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             if (s->session->cipher->algorithm_enc == SSL_RC4) | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |                 s->s3.need_empty_fragments = 0; | 
					
						
							| 
									
										
										
										
											2002-04-14 06:47:20 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-20 05:31:43 +08:00
										 |  |  | void ssl3_cleanup_key_block(SSL *s) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     OPENSSL_clear_free(s->s3.tmp.key_block, s->s3.tmp.key_block_length); | 
					
						
							|  |  |  |     s->s3.tmp.key_block = NULL; | 
					
						
							|  |  |  |     s->s3.tmp.key_block_length = 0; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-03 18:59:19 +08:00
										 |  |  | int ssl3_init_finished_mac(SSL *s) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-03 18:59:19 +08:00
										 |  |  |     BIO *buf = BIO_new(BIO_s_mem()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (buf == NULL) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_MALLOC_FAILURE); | 
					
						
							| 
									
										
										
										
											2016-06-03 18:59:19 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-06-20 22:37:22 +08:00
										 |  |  |     ssl3_free_digest_list(s); | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     s->s3.handshake_buffer = buf; | 
					
						
							|  |  |  |     (void)BIO_set_close(s->s3.handshake_buffer, BIO_CLOSE); | 
					
						
							| 
									
										
										
										
											2016-06-03 18:59:19 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-20 22:44:03 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Free digest list. Also frees handshake buffer since they are always freed | 
					
						
							|  |  |  |  * together. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | void ssl3_free_digest_list(SSL *s) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     BIO_free(s->s3.handshake_buffer); | 
					
						
							|  |  |  |     s->s3.handshake_buffer = NULL; | 
					
						
							|  |  |  |     EVP_MD_CTX_free(s->s3.handshake_dgst); | 
					
						
							|  |  |  |     s->s3.handshake_dgst = NULL; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2007-08-31 20:42:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 18:34:39 +08:00
										 |  |  | int ssl3_finish_mac(SSL *s, const unsigned char *buf, size_t len) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     if (s->s3.handshake_dgst == NULL) { | 
					
						
							| 
									
										
										
										
											2016-06-18 22:46:13 +08:00
										 |  |  |         /* Note: this writes to a memory BIO so a failure is a fatal error */ | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         if (len > INT_MAX) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_OVERFLOW_ERROR); | 
					
						
							| 
									
										
										
										
											2016-09-07 18:34:39 +08:00
										 |  |  |             return 0; | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |         ret = BIO_write(s->s3.handshake_buffer, (void *)buf, (int)len); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         if (ret <= 0 || ret != (int)len) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-09-07 18:34:39 +08:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |         ret = EVP_DigestUpdate(s->s3.handshake_dgst, buf, len); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |         if (!ret) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-09-07 18:34:39 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-11-22 01:18:43 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-27 10:00:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-16 21:44:29 +08:00
										 |  |  | int ssl3_digest_cached_records(SSL *s, int keep) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     const EVP_MD *md; | 
					
						
							|  |  |  |     long hdatalen; | 
					
						
							|  |  |  |     void *hdata; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     if (s->s3.handshake_dgst == NULL) { | 
					
						
							|  |  |  |         hdatalen = BIO_get_mem_data(s->s3.handshake_buffer, &hdata); | 
					
						
							| 
									
										
										
										
											2015-06-16 21:44:29 +08:00
										 |  |  |         if (hdatalen <= 0) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_BAD_HANDSHAKE_LENGTH); | 
					
						
							| 
									
										
										
										
											2015-06-16 21:44:29 +08:00
										 |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |         s->s3.handshake_dgst = EVP_MD_CTX_new(); | 
					
						
							|  |  |  |         if (s->s3.handshake_dgst == NULL) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_MALLOC_FAILURE); | 
					
						
							| 
									
										
										
										
											2015-11-26 02:20:50 +08:00
										 |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         md = ssl_handshake_md(s); | 
					
						
							| 
									
										
										
										
											2020-08-27 23:19:27 +08:00
										 |  |  |         if (md == NULL) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |             SSLfatal(s, SSL_AD_INTERNAL_ERROR, | 
					
						
							| 
									
										
										
										
											2020-08-27 23:19:27 +08:00
										 |  |  |                      SSL_R_NO_SUITABLE_DIGEST_ALGORITHM); | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (!EVP_DigestInit_ex(s->s3.handshake_dgst, md, NULL) | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |             || !EVP_DigestUpdate(s->s3.handshake_dgst, hdata, hdatalen)) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2015-11-26 02:20:50 +08:00
										 |  |  |             return 0; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-06-16 21:44:29 +08:00
										 |  |  |     if (keep == 0) { | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |         BIO_free(s->s3.handshake_buffer); | 
					
						
							|  |  |  |         s->s3.handshake_buffer = NULL; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-27 10:00:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-11 18:27:59 +08:00
										 |  |  | void ssl3_digest_master_key_set_params(const SSL_SESSION *session, | 
					
						
							|  |  |  |                                        OSSL_PARAM params[]) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int n = 0; | 
					
						
							| 
									
										
										
										
											2019-06-07 10:05:23 +08:00
										 |  |  |     params[n++] = OSSL_PARAM_construct_octet_string(OSSL_DIGEST_PARAM_SSL3_MS, | 
					
						
							|  |  |  |                                                     (void *)session->master_key, | 
					
						
							| 
									
										
										
										
											2019-06-24 12:43:55 +08:00
										 |  |  |                                                     session->master_key_length); | 
					
						
							| 
									
										
										
										
											2019-04-11 18:27:59 +08:00
										 |  |  |     params[n++] = OSSL_PARAM_construct_end(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-05 04:14:24 +08:00
										 |  |  | size_t ssl3_final_finish_mac(SSL *s, const char *sender, size_t len, | 
					
						
							|  |  |  |                              unsigned char *p) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-11-26 02:20:50 +08:00
										 |  |  |     int ret; | 
					
						
							| 
									
										
										
										
											2015-11-27 21:02:12 +08:00
										 |  |  |     EVP_MD_CTX *ctx = NULL; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-23 18:37:51 +08:00
										 |  |  |     if (!ssl3_digest_cached_records(s, 0)) { | 
					
						
							|  |  |  |         /* SSLfatal() already called */ | 
					
						
							| 
									
										
										
										
											2015-06-16 21:44:29 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2017-11-23 18:37:51 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     if (EVP_MD_CTX_type(s->s3.handshake_dgst) != NID_md5_sha1) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_NO_REQUIRED_DIGEST); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-11-26 02:20:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-02 07:49:35 +08:00
										 |  |  |     ctx = EVP_MD_CTX_new(); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:02:12 +08:00
										 |  |  |     if (ctx == NULL) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_MALLOC_FAILURE); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:02:12 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |     if (!EVP_MD_CTX_copy_ex(ctx, s->s3.handshake_dgst)) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2018-09-02 19:07:58 +08:00
										 |  |  |         ret = 0; | 
					
						
							|  |  |  |         goto err; | 
					
						
							| 
									
										
										
										
											2016-06-10 23:51:39 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-11-26 02:20:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 21:02:12 +08:00
										 |  |  |     ret = EVP_MD_CTX_size(ctx); | 
					
						
							| 
									
										
										
										
											2015-11-26 02:20:50 +08:00
										 |  |  |     if (ret < 0) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2018-09-02 19:07:58 +08:00
										 |  |  |         ret = 0; | 
					
						
							|  |  |  |         goto err; | 
					
						
							| 
									
										
										
										
											2015-11-26 02:20:50 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-11 18:27:59 +08:00
										 |  |  |     if (sender != NULL) { | 
					
						
							|  |  |  |         OSSL_PARAM digest_cmd_params[3]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ssl3_digest_master_key_set_params(s->session, digest_cmd_params); | 
					
						
							| 
									
										
										
										
											2019-06-07 10:05:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-11 18:27:59 +08:00
										 |  |  |         if (EVP_DigestUpdate(ctx, sender, len) <= 0 | 
					
						
							|  |  |  |             || EVP_MD_CTX_set_params(ctx, digest_cmd_params) <= 0 | 
					
						
							|  |  |  |             || EVP_DigestFinal_ex(ctx, p, NULL) <= 0) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |                 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2019-04-11 18:27:59 +08:00
										 |  |  |                 ret = 0; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-11-07 00:31:21 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-02 19:07:58 +08:00
										 |  |  |  err: | 
					
						
							| 
									
										
										
										
											2015-12-02 07:49:35 +08:00
										 |  |  |     EVP_MD_CTX_free(ctx); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-26 02:20:50 +08:00
										 |  |  |     return ret; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-20 05:31:43 +08:00
										 |  |  | int ssl3_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p, | 
					
						
							| 
									
										
										
										
											2016-10-04 06:22:07 +08:00
										 |  |  |                                 size_t len, size_t *secret_size) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     static const unsigned char *salt[3] = { | 
					
						
							| 
									
										
										
										
											1999-06-05 05:54:13 +08:00
										 |  |  | #ifndef CHARSET_EBCDIC
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         (const unsigned char *)"A", | 
					
						
							|  |  |  |         (const unsigned char *)"BB", | 
					
						
							|  |  |  |         (const unsigned char *)"CCC", | 
					
						
							| 
									
										
										
										
											1999-06-05 05:54:13 +08:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         (const unsigned char *)"\x41", | 
					
						
							|  |  |  |         (const unsigned char *)"\x42\x42", | 
					
						
							|  |  |  |         (const unsigned char *)"\x43\x43\x43", | 
					
						
							| 
									
										
										
										
											1999-06-05 05:54:13 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     }; | 
					
						
							|  |  |  |     unsigned char buf[EVP_MAX_MD_SIZE]; | 
					
						
							| 
									
										
										
										
											2015-12-02 07:49:35 +08:00
										 |  |  |     EVP_MD_CTX *ctx = EVP_MD_CTX_new(); | 
					
						
							| 
									
										
										
										
											2016-10-04 06:22:07 +08:00
										 |  |  |     int i, ret = 1; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     unsigned int n; | 
					
						
							| 
									
										
										
										
											2016-10-04 06:22:07 +08:00
										 |  |  |     size_t ret_secret_size = 0; | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 21:02:12 +08:00
										 |  |  |     if (ctx == NULL) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_MALLOC_FAILURE); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:02:12 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     for (i = 0; i < 3; i++) { | 
					
						
							| 
									
										
										
										
											2015-11-27 21:02:12 +08:00
										 |  |  |         if (EVP_DigestInit_ex(ctx, s->ctx->sha1, NULL) <= 0 | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  |             || EVP_DigestUpdate(ctx, salt[i], | 
					
						
							|  |  |  |                                 strlen((const char *)salt[i])) <= 0 | 
					
						
							|  |  |  |             || EVP_DigestUpdate(ctx, p, len) <= 0 | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |             || EVP_DigestUpdate(ctx, &(s->s3.client_random[0]), | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  |                                 SSL3_RANDOM_SIZE) <= 0 | 
					
						
							| 
									
										
										
										
											2018-12-13 02:09:50 +08:00
										 |  |  |             || EVP_DigestUpdate(ctx, &(s->s3.server_random[0]), | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  |                                 SSL3_RANDOM_SIZE) <= 0 | 
					
						
							| 
									
										
										
										
											2016-10-04 06:22:07 +08:00
										 |  |  |                /* TODO(size_t) : convert me */ | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  |             || EVP_DigestFinal_ex(ctx, buf, &n) <= 0 | 
					
						
							|  |  |  |             || EVP_DigestInit_ex(ctx, s->ctx->md5, NULL) <= 0 | 
					
						
							|  |  |  |             || EVP_DigestUpdate(ctx, p, len) <= 0 | 
					
						
							|  |  |  |             || EVP_DigestUpdate(ctx, buf, n) <= 0 | 
					
						
							|  |  |  |             || EVP_DigestFinal_ex(ctx, out, &n) <= 0) { | 
					
						
							| 
									
										
										
										
											2020-11-04 21:39:57 +08:00
										 |  |  |             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); | 
					
						
							| 
									
										
										
										
											2015-11-07 00:31:21 +08:00
										 |  |  |             ret = 0; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         out += n; | 
					
						
							| 
									
										
										
										
											2016-10-04 06:22:07 +08:00
										 |  |  |         ret_secret_size += n; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-12-02 07:49:35 +08:00
										 |  |  |     EVP_MD_CTX_free(ctx); | 
					
						
							| 
									
										
										
										
											2012-08-29 07:17:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-30 00:22:43 +08:00
										 |  |  |     OPENSSL_cleanse(buf, sizeof(buf)); | 
					
						
							| 
									
										
										
										
											2016-10-04 06:22:07 +08:00
										 |  |  |     if (ret) | 
					
						
							|  |  |  |         *secret_size = ret_secret_size; | 
					
						
							|  |  |  |     return ret; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-20 05:31:43 +08:00
										 |  |  | int ssl3_alert_code(int code) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     switch (code) { | 
					
						
							|  |  |  |     case SSL_AD_CLOSE_NOTIFY: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_CLOSE_NOTIFY; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_UNEXPECTED_MESSAGE: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_UNEXPECTED_MESSAGE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_BAD_RECORD_MAC: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_BAD_RECORD_MAC; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_DECRYPTION_FAILED: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_BAD_RECORD_MAC; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_RECORD_OVERFLOW: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_BAD_RECORD_MAC; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_DECOMPRESSION_FAILURE: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_DECOMPRESSION_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_HANDSHAKE_FAILURE: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_NO_CERTIFICATE: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_NO_CERTIFICATE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_BAD_CERTIFICATE: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_BAD_CERTIFICATE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_UNSUPPORTED_CERTIFICATE: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_UNSUPPORTED_CERTIFICATE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_CERTIFICATE_REVOKED: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_CERTIFICATE_REVOKED; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_CERTIFICATE_EXPIRED: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_CERTIFICATE_EXPIRED; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_CERTIFICATE_UNKNOWN: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_CERTIFICATE_UNKNOWN; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_ILLEGAL_PARAMETER: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_ILLEGAL_PARAMETER; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_UNKNOWN_CA: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_BAD_CERTIFICATE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_ACCESS_DENIED: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_DECODE_ERROR: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_DECRYPT_ERROR: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_EXPORT_RESTRICTION: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_PROTOCOL_VERSION: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_INSUFFICIENT_SECURITY: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_INTERNAL_ERROR: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_USER_CANCELLED: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_NO_RENEGOTIATION: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return -1;            /* Don't send it :-) */ | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_UNSUPPORTED_EXTENSION: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_CERTIFICATE_UNOBTAINABLE: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_UNRECOGNIZED_NAME: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_BAD_CERTIFICATE_HASH_VALUE: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return SSL3_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_UNKNOWN_PSK_IDENTITY: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return TLS1_AD_UNKNOWN_PSK_IDENTITY; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     case SSL_AD_INAPPROPRIATE_FALLBACK: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return TLS1_AD_INAPPROPRIATE_FALLBACK; | 
					
						
							| 
									
										
										
										
											2015-09-22 21:20:26 +08:00
										 |  |  |     case SSL_AD_NO_APPLICATION_PROTOCOL: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return TLS1_AD_NO_APPLICATION_PROTOCOL; | 
					
						
							| 
									
										
										
										
											2017-03-10 23:09:24 +08:00
										 |  |  |     case SSL_AD_CERTIFICATE_REQUIRED: | 
					
						
							|  |  |  |         return SSL_AD_HANDSHAKE_FAILURE; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     default: | 
					
						
							| 
									
										
										
										
											2017-10-17 22:04:09 +08:00
										 |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } |