| 1 |  |  | /* $OpenBSD: ssl_both.c,v 1.10 2017/08/12 02:55:22 jsing Exp $ */ | 
    
    | 2 |  |  | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 
    
    | 3 |  |  |  * All rights reserved. | 
    
    | 4 |  |  |  * | 
    
    | 5 |  |  |  * This package is an SSL implementation written | 
    
    | 6 |  |  |  * by Eric Young (eay@cryptsoft.com). | 
    
    | 7 |  |  |  * The implementation was written so as to conform with Netscapes SSL. | 
    
    | 8 |  |  |  * | 
    
    | 9 |  |  |  * This library is free for commercial and non-commercial use as long as | 
    
    | 10 |  |  |  * the following conditions are aheared to.  The following conditions | 
    
    | 11 |  |  |  * apply to all code found in this distribution, be it the RC4, RSA, | 
    
    | 12 |  |  |  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation | 
    
    | 13 |  |  |  * included with this distribution is covered by the same copyright terms | 
    
    | 14 |  |  |  * except that the holder is Tim Hudson (tjh@cryptsoft.com). | 
    
    | 15 |  |  |  * | 
    
    | 16 |  |  |  * Copyright remains Eric Young's, and as such any Copyright notices in | 
    
    | 17 |  |  |  * the code are not to be removed. | 
    
    | 18 |  |  |  * If this package is used in a product, Eric Young should be given attribution | 
    
    | 19 |  |  |  * as the author of the parts of the library used. | 
    
    | 20 |  |  |  * This can be in the form of a textual message at program startup or | 
    
    | 21 |  |  |  * in documentation (online or textual) provided with the package. | 
    
    | 22 |  |  |  * | 
    
    | 23 |  |  |  * Redistribution and use in source and binary forms, with or without | 
    
    | 24 |  |  |  * modification, are permitted provided that the following conditions | 
    
    | 25 |  |  |  * are met: | 
    
    | 26 |  |  |  * 1. Redistributions of source code must retain the copyright | 
    
    | 27 |  |  |  *    notice, this list of conditions and the following disclaimer. | 
    
    | 28 |  |  |  * 2. Redistributions in binary form must reproduce the above copyright | 
    
    | 29 |  |  |  *    notice, this list of conditions and the following disclaimer in the | 
    
    | 30 |  |  |  *    documentation and/or other materials provided with the distribution. | 
    
    | 31 |  |  |  * 3. All advertising materials mentioning features or use of this software | 
    
    | 32 |  |  |  *    must display the following acknowledgement: | 
    
    | 33 |  |  |  *    "This product includes cryptographic software written by | 
    
    | 34 |  |  |  *     Eric Young (eay@cryptsoft.com)" | 
    
    | 35 |  |  |  *    The word 'cryptographic' can be left out if the rouines from the library | 
    
    | 36 |  |  |  *    being used are not cryptographic related :-). | 
    
    | 37 |  |  |  * 4. If you include any Windows specific code (or a derivative thereof) from | 
    
    | 38 |  |  |  *    the apps directory (application code) you must include an acknowledgement: | 
    
    | 39 |  |  |  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" | 
    
    | 40 |  |  |  * | 
    
    | 41 |  |  |  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND | 
    
    | 42 |  |  |  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
    
    | 43 |  |  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
    
    | 44 |  |  |  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | 
    
    | 45 |  |  |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
    
    | 46 |  |  |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 
    
    | 47 |  |  |  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 
    
    | 48 |  |  |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | 
    
    | 49 |  |  |  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | 
    
    | 50 |  |  |  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
    
    | 51 |  |  |  * SUCH DAMAGE. | 
    
    | 52 |  |  |  * | 
    
    | 53 |  |  |  * The licence and distribution terms for any publically available version or | 
    
    | 54 |  |  |  * derivative of this code cannot be changed.  i.e. this code cannot simply be | 
    
    | 55 |  |  |  * copied and put under another distribution licence | 
    
    | 56 |  |  |  * [including the GNU Public Licence.] | 
    
    | 57 |  |  |  */ | 
    
    | 58 |  |  | /* ==================================================================== | 
    
    | 59 |  |  |  * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved. | 
    
    | 60 |  |  |  * | 
    
    | 61 |  |  |  * Redistribution and use in source and binary forms, with or without | 
    
    | 62 |  |  |  * modification, are permitted provided that the following conditions | 
    
    | 63 |  |  |  * are met: | 
    
    | 64 |  |  |  * | 
    
    | 65 |  |  |  * 1. Redistributions of source code must retain the above copyright | 
    
    | 66 |  |  |  *    notice, this list of conditions and the following disclaimer. | 
    
    | 67 |  |  |  * | 
    
    | 68 |  |  |  * 2. Redistributions in binary form must reproduce the above copyright | 
    
    | 69 |  |  |  *    notice, this list of conditions and the following disclaimer in | 
    
    | 70 |  |  |  *    the documentation and/or other materials provided with the | 
    
    | 71 |  |  |  *    distribution. | 
    
    | 72 |  |  |  * | 
    
    | 73 |  |  |  * 3. All advertising materials mentioning features or use of this | 
    
    | 74 |  |  |  *    software must display the following acknowledgment: | 
    
    | 75 |  |  |  *    "This product includes software developed by the OpenSSL Project | 
    
    | 76 |  |  |  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)" | 
    
    | 77 |  |  |  * | 
    
    | 78 |  |  |  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | 
    
    | 79 |  |  |  *    endorse or promote products derived from this software without | 
    
    | 80 |  |  |  *    prior written permission. For written permission, please contact | 
    
    | 81 |  |  |  *    openssl-core@openssl.org. | 
    
    | 82 |  |  |  * | 
    
    | 83 |  |  |  * 5. Products derived from this software may not be called "OpenSSL" | 
    
    | 84 |  |  |  *    nor may "OpenSSL" appear in their names without prior written | 
    
    | 85 |  |  |  *    permission of the OpenSSL Project. | 
    
    | 86 |  |  |  * | 
    
    | 87 |  |  |  * 6. Redistributions of any form whatsoever must retain the following | 
    
    | 88 |  |  |  *    acknowledgment: | 
    
    | 89 |  |  |  *    "This product includes software developed by the OpenSSL Project | 
    
    | 90 |  |  |  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)" | 
    
    | 91 |  |  |  * | 
    
    | 92 |  |  |  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | 
    
    | 93 |  |  |  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
    
    | 94 |  |  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 
    
    | 95 |  |  |  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR | 
    
    | 96 |  |  |  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
    
    | 97 |  |  |  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | 
    
    | 98 |  |  |  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 
    
    | 99 |  |  |  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 
    
    | 100 |  |  |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | 
    
    | 101 |  |  |  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
    
    | 102 |  |  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | 
    
    | 103 |  |  |  * OF THE POSSIBILITY OF SUCH DAMAGE. | 
    
    | 104 |  |  |  * ==================================================================== | 
    
    | 105 |  |  |  * | 
    
    | 106 |  |  |  * This product includes cryptographic software written by Eric Young | 
    
    | 107 |  |  |  * (eay@cryptsoft.com).  This product includes software written by Tim | 
    
    | 108 |  |  |  * Hudson (tjh@cryptsoft.com). | 
    
    | 109 |  |  |  * | 
    
    | 110 |  |  |  */ | 
    
    | 111 |  |  | /* ==================================================================== | 
    
    | 112 |  |  |  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. | 
    
    | 113 |  |  |  * ECC cipher suite support in OpenSSL originally developed by | 
    
    | 114 |  |  |  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. | 
    
    | 115 |  |  |  */ | 
    
    | 116 |  |  |  | 
    
    | 117 |  |  | #include <limits.h> | 
    
    | 118 |  |  | #include <stdio.h> | 
    
    | 119 |  |  | #include <string.h> | 
    
    | 120 |  |  |  | 
    
    | 121 |  |  | #include "ssl_locl.h" | 
    
    | 122 |  |  |  | 
    
    | 123 |  |  | #include <openssl/buffer.h> | 
    
    | 124 |  |  | #include <openssl/evp.h> | 
    
    | 125 |  |  | #include <openssl/objects.h> | 
    
    | 126 |  |  | #include <openssl/x509.h> | 
    
    | 127 |  |  |  | 
    
    | 128 |  |  | #include "bytestring.h" | 
    
    | 129 |  |  |  | 
    
    | 130 |  |  | /* | 
    
    | 131 |  |  |  * Send s->internal->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or | 
    
    | 132 |  |  |  * SSL3_RT_CHANGE_CIPHER_SPEC). | 
    
    | 133 |  |  |  */ | 
    
    | 134 |  |  | int | 
    
    | 135 |  |  | ssl3_do_write(SSL *s, int type) | 
    
    | 136 |  |  | { | 
    
    | 137 |  |  | 	int ret; | 
    
    | 138 |  |  |  | 
    
    | 139 |  | 80934 | 	ret = ssl3_write_bytes(s, type, &s->internal->init_buf->data[s->internal->init_off], | 
    
    | 140 |  | 26978 | 	    s->internal->init_num); | 
    
    | 141 | ✗✓ | 26978 | 	if (ret < 0) | 
    
    | 142 |  |  | 		return (-1); | 
    
    | 143 |  |  |  | 
    
    | 144 | ✓✓ | 26978 | 	if (type == SSL3_RT_HANDSHAKE) | 
    
    | 145 |  |  | 		/* | 
    
    | 146 |  |  | 		 * Should not be done for 'Hello Request's, but in that case | 
    
    | 147 |  |  | 		 * we'll ignore the result anyway. | 
    
    | 148 |  |  | 		 */ | 
    
    | 149 |  | 18641 | 		tls1_finish_mac(s, | 
    
    | 150 |  | 18641 | 		    (unsigned char *)&s->internal->init_buf->data[s->internal->init_off], ret); | 
    
    | 151 |  |  |  | 
    
    | 152 | ✓✗ | 26978 | 	if (ret == s->internal->init_num) { | 
    
    | 153 | ✗✓ | 26978 | 		if (s->internal->msg_callback) | 
    
    | 154 |  |  | 			s->internal->msg_callback(1, s->version, type, s->internal->init_buf->data, | 
    
    | 155 |  |  | 			    (size_t)(s->internal->init_off + s->internal->init_num), s, | 
    
    | 156 |  |  | 			    s->internal->msg_callback_arg); | 
    
    | 157 |  | 26978 | 		return (1); | 
    
    | 158 |  |  | 	} | 
    
    | 159 |  |  |  | 
    
    | 160 |  |  | 	s->internal->init_off += ret; | 
    
    | 161 |  |  | 	s->internal->init_num -= ret; | 
    
    | 162 |  |  |  | 
    
    | 163 |  |  | 	return (0); | 
    
    | 164 |  | 26978 | } | 
    
    | 165 |  |  |  | 
    
    | 166 |  |  | int | 
    
    | 167 |  |  | ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen) | 
    
    | 168 |  |  | { | 
    
    | 169 |  | 16866 | 	CBB cbb, finished; | 
    
    | 170 |  |  | 	int md_len; | 
    
    | 171 |  |  |  | 
    
    | 172 |  | 8433 | 	memset(&cbb, 0, sizeof(cbb)); | 
    
    | 173 |  |  |  | 
    
    | 174 | ✓✗ | 8433 | 	if (S3I(s)->hs.state == a) { | 
    
    | 175 |  |  | 		md_len = TLS1_FINISH_MAC_LENGTH; | 
    
    | 176 | ✗✓ | 8433 | 		OPENSSL_assert(md_len <= EVP_MAX_MD_SIZE); | 
    
    | 177 |  |  |  | 
    
    | 178 | ✗✓ | 16866 | 		if (tls1_final_finish_mac(s, sender, slen, | 
    
    | 179 |  | 16866 | 		    S3I(s)->tmp.finish_md) != md_len) | 
    
    | 180 |  |  | 			return (0); | 
    
    | 181 |  | 8433 | 		S3I(s)->tmp.finish_md_len = md_len; | 
    
    | 182 |  |  |  | 
    
    | 183 |  |  | 		/* Copy finished so we can use it for renegotiation checks. */ | 
    
    | 184 | ✓✓ | 8433 | 		if (s->internal->type == SSL_ST_CONNECT) { | 
    
    | 185 |  | 16354 | 			memcpy(S3I(s)->previous_client_finished, | 
    
    | 186 |  | 8177 | 			    S3I(s)->tmp.finish_md, md_len); | 
    
    | 187 |  | 8177 | 			S3I(s)->previous_client_finished_len = md_len; | 
    
    | 188 |  | 8177 | 		} else { | 
    
    | 189 |  | 512 | 			memcpy(S3I(s)->previous_server_finished, | 
    
    | 190 |  | 256 | 			    S3I(s)->tmp.finish_md, md_len); | 
    
    | 191 |  | 256 | 			S3I(s)->previous_server_finished_len = md_len; | 
    
    | 192 |  |  | 		} | 
    
    | 193 |  |  |  | 
    
    | 194 | ✓✗ | 8433 | 		if (!ssl3_handshake_msg_start_cbb(s, &cbb, &finished, | 
    
    | 195 |  |  | 		    SSL3_MT_FINISHED)) | 
    
    | 196 |  |  |                         goto err; | 
    
    | 197 | ✓✗ | 8433 | 		if (!CBB_add_bytes(&finished, S3I(s)->tmp.finish_md, md_len)) | 
    
    | 198 |  |  | 			goto err; | 
    
    | 199 | ✓✗ | 8433 | 		if (!ssl3_handshake_msg_finish_cbb(s, &cbb)) | 
    
    | 200 |  |  | 			goto err; | 
    
    | 201 |  |  |  | 
    
    | 202 |  | 8433 | 		S3I(s)->hs.state = b; | 
    
    | 203 |  | 8433 | 	} | 
    
    | 204 |  |  |  | 
    
    | 205 |  | 8433 | 	return (ssl3_handshake_write(s)); | 
    
    | 206 |  |  |  | 
    
    | 207 |  |  |  err: | 
    
    | 208 |  |  | 	CBB_cleanup(&cbb); | 
    
    | 209 |  |  |  | 
    
    | 210 |  |  | 	return (-1); | 
    
    | 211 |  | 8433 | } | 
    
    | 212 |  |  |  | 
    
    | 213 |  |  | /* | 
    
    | 214 |  |  |  * ssl3_take_mac calculates the Finished MAC for the handshakes messages seen | 
    
    | 215 |  |  |  * so far. | 
    
    | 216 |  |  |  */ | 
    
    | 217 |  |  | static void | 
    
    | 218 |  |  | ssl3_take_mac(SSL *s) | 
    
    | 219 |  |  | { | 
    
    | 220 |  |  | 	const char *sender; | 
    
    | 221 |  |  | 	int slen; | 
    
    | 222 |  |  |  | 
    
    | 223 |  |  | 	/* | 
    
    | 224 |  |  | 	 * If no new cipher setup return immediately: other functions will | 
    
    | 225 |  |  | 	 * set the appropriate error. | 
    
    | 226 |  |  | 	 */ | 
    
    | 227 | ✗✓ | 16674 | 	if (S3I(s)->hs.new_cipher == NULL) | 
    
    | 228 |  |  | 		return; | 
    
    | 229 |  |  |  | 
    
    | 230 | ✓✓ | 8337 | 	if (S3I(s)->hs.state & SSL_ST_CONNECT) { | 
    
    | 231 |  |  | 		sender = TLS_MD_SERVER_FINISH_CONST; | 
    
    | 232 |  |  | 		slen = TLS_MD_SERVER_FINISH_CONST_SIZE; | 
    
    | 233 |  | 8129 | 	} else { | 
    
    | 234 |  |  | 		sender = TLS_MD_CLIENT_FINISH_CONST; | 
    
    | 235 |  |  | 		slen = TLS_MD_CLIENT_FINISH_CONST_SIZE; | 
    
    | 236 |  |  | 	} | 
    
    | 237 |  |  |  | 
    
    | 238 |  | 8337 | 	S3I(s)->tmp.peer_finish_md_len = | 
    
    | 239 |  | 8337 | 	    tls1_final_finish_mac(s, sender, slen, | 
    
    | 240 |  | 8337 | 		S3I(s)->tmp.peer_finish_md); | 
    
    | 241 |  | 16674 | } | 
    
    | 242 |  |  |  | 
    
    | 243 |  |  | int | 
    
    | 244 |  |  | ssl3_get_finished(SSL *s, int a, int b) | 
    
    | 245 |  |  | { | 
    
    | 246 |  | 17234 | 	int al, ok, md_len; | 
    
    | 247 |  |  | 	long n; | 
    
    | 248 |  | 8617 | 	CBS cbs; | 
    
    | 249 |  |  |  | 
    
    | 250 |  |  | 	/* should actually be 36+4 :-) */ | 
    
    | 251 |  | 8617 | 	n = s->method->internal->ssl_get_message(s, a, b, SSL3_MT_FINISHED, 64, &ok); | 
    
    | 252 | ✓✓ | 8617 | 	if (!ok) | 
    
    | 253 |  | 184 | 		return ((int)n); | 
    
    | 254 |  |  |  | 
    
    | 255 |  |  | 	/* If this occurs, we have missed a message */ | 
    
    | 256 | ✗✓ | 8433 | 	if (!S3I(s)->change_cipher_spec) { | 
    
    | 257 |  |  | 		al = SSL_AD_UNEXPECTED_MESSAGE; | 
    
    | 258 |  |  | 		SSLerror(s, SSL_R_GOT_A_FIN_BEFORE_A_CCS); | 
    
    | 259 |  |  | 		goto f_err; | 
    
    | 260 |  |  | 	} | 
    
    | 261 |  | 8433 | 	S3I(s)->change_cipher_spec = 0; | 
    
    | 262 |  |  |  | 
    
    | 263 |  |  | 	md_len = TLS1_FINISH_MAC_LENGTH; | 
    
    | 264 |  |  |  | 
    
    | 265 | ✗✓ | 8433 | 	if (n < 0) { | 
    
    | 266 |  |  | 		al = SSL_AD_DECODE_ERROR; | 
    
    | 267 |  |  | 		SSLerror(s, SSL_R_BAD_DIGEST_LENGTH); | 
    
    | 268 |  |  | 		goto f_err; | 
    
    | 269 |  |  | 	} | 
    
    | 270 |  |  |  | 
    
    | 271 |  | 8433 | 	CBS_init(&cbs, s->internal->init_msg, n); | 
    
    | 272 |  |  |  | 
    
    | 273 | ✓✗✗✓ 
 | 16866 | 	if (S3I(s)->tmp.peer_finish_md_len != md_len || | 
    
    | 274 |  | 8433 | 	    CBS_len(&cbs) != md_len) { | 
    
    | 275 |  |  | 		al = SSL_AD_DECODE_ERROR; | 
    
    | 276 |  |  | 		SSLerror(s, SSL_R_BAD_DIGEST_LENGTH); | 
    
    | 277 |  |  | 		goto f_err; | 
    
    | 278 |  |  | 	} | 
    
    | 279 |  |  |  | 
    
    | 280 | ✗✓ | 8433 | 	if (!CBS_mem_equal(&cbs, S3I(s)->tmp.peer_finish_md, CBS_len(&cbs))) { | 
    
    | 281 |  |  | 		al = SSL_AD_DECRYPT_ERROR; | 
    
    | 282 |  |  | 		SSLerror(s, SSL_R_DIGEST_CHECK_FAILED); | 
    
    | 283 |  |  | 		goto f_err; | 
    
    | 284 |  |  | 	} | 
    
    | 285 |  |  |  | 
    
    | 286 |  |  | 	/* Copy finished so we can use it for renegotiation checks. */ | 
    
    | 287 | ✗✓ | 8433 | 	OPENSSL_assert(md_len <= EVP_MAX_MD_SIZE); | 
    
    | 288 | ✓✓ | 8433 | 	if (s->internal->type == SSL_ST_ACCEPT) { | 
    
    | 289 |  | 512 | 		memcpy(S3I(s)->previous_client_finished, | 
    
    | 290 |  | 256 | 		    S3I(s)->tmp.peer_finish_md, md_len); | 
    
    | 291 |  | 256 | 		S3I(s)->previous_client_finished_len = md_len; | 
    
    | 292 |  | 256 | 	} else { | 
    
    | 293 |  | 16354 | 		memcpy(S3I(s)->previous_server_finished, | 
    
    | 294 |  | 8177 | 		    S3I(s)->tmp.peer_finish_md, md_len); | 
    
    | 295 |  | 8177 | 		S3I(s)->previous_server_finished_len = md_len; | 
    
    | 296 |  |  | 	} | 
    
    | 297 |  |  |  | 
    
    | 298 |  | 8433 | 	return (1); | 
    
    | 299 |  |  | f_err: | 
    
    | 300 |  |  | 	ssl3_send_alert(s, SSL3_AL_FATAL, al); | 
    
    | 301 |  |  | 	return (0); | 
    
    | 302 |  | 8617 | } | 
    
    | 303 |  |  |  | 
    
    | 304 |  |  | /* for these 2 messages, we need to | 
    
    | 305 |  |  |  * ssl->enc_read_ctx			re-init | 
    
    | 306 |  |  |  * ssl->s3->internal->read_sequence		zero | 
    
    | 307 |  |  |  * ssl->s3->internal->read_mac_secret		re-init | 
    
    | 308 |  |  |  * ssl->session->read_sym_enc		assign | 
    
    | 309 |  |  |  * ssl->session->read_hash		assign | 
    
    | 310 |  |  |  */ | 
    
    | 311 |  |  | int | 
    
    | 312 |  |  | ssl3_send_change_cipher_spec(SSL *s, int a, int b) | 
    
    | 313 |  |  | { | 
    
    | 314 |  |  | 	unsigned char *p; | 
    
    | 315 |  |  |  | 
    
    | 316 | ✓✗ | 16674 | 	if (S3I(s)->hs.state == a) { | 
    
    | 317 |  | 8337 | 		p = (unsigned char *)s->internal->init_buf->data; | 
    
    | 318 |  | 8337 | 		*p = SSL3_MT_CCS; | 
    
    | 319 |  | 8337 | 		s->internal->init_num = 1; | 
    
    | 320 |  | 8337 | 		s->internal->init_off = 0; | 
    
    | 321 |  |  |  | 
    
    | 322 |  | 8337 | 		S3I(s)->hs.state = b; | 
    
    | 323 |  | 8337 | 	} | 
    
    | 324 |  |  |  | 
    
    | 325 |  |  | 	/* SSL3_ST_CW_CHANGE_B */ | 
    
    | 326 |  | 8337 | 	return (ssl3_do_write(s, SSL3_RT_CHANGE_CIPHER_SPEC)); | 
    
    | 327 |  |  | } | 
    
    | 328 |  |  |  | 
    
    | 329 |  |  | static int | 
    
    | 330 |  |  | ssl3_add_cert(CBB *cbb, X509 *x) | 
    
    | 331 |  |  | { | 
    
    | 332 |  | 776 | 	unsigned char *data; | 
    
    | 333 |  |  | 	int cert_len; | 
    
    | 334 |  |  | 	int ret = 0; | 
    
    | 335 |  | 388 | 	CBB cert; | 
    
    | 336 |  |  |  | 
    
    | 337 | ✓✗ | 388 | 	if ((cert_len = i2d_X509(x, NULL)) < 0) | 
    
    | 338 |  |  | 		goto err; | 
    
    | 339 |  |  |  | 
    
    | 340 | ✓✗ | 388 | 	if (!CBB_add_u24_length_prefixed(cbb, &cert)) | 
    
    | 341 |  |  | 		goto err; | 
    
    | 342 | ✓✗ | 388 | 	if (!CBB_add_space(&cert, &data, cert_len)) | 
    
    | 343 |  |  | 		goto err; | 
    
    | 344 | ✓✗ | 388 | 	if (i2d_X509(x, &data) < 0) | 
    
    | 345 |  |  | 		goto err; | 
    
    | 346 | ✓✗ | 388 | 	if (!CBB_flush(cbb)) | 
    
    | 347 |  |  | 		goto err; | 
    
    | 348 |  |  |  | 
    
    | 349 |  | 388 | 	ret = 1; | 
    
    | 350 |  |  |  | 
    
    | 351 |  |  |  err: | 
    
    | 352 |  | 388 | 	return (ret); | 
    
    | 353 |  | 388 | } | 
    
    | 354 |  |  |  | 
    
    | 355 |  |  | int | 
    
    | 356 |  |  | ssl3_output_cert_chain(SSL *s, CBB *cbb, X509 *x) | 
    
    | 357 |  |  | { | 
    
    | 358 |  |  | 	int no_chain = 0; | 
    
    | 359 |  | 504 | 	CBB cert_list; | 
    
    | 360 |  |  | 	int ret = 0; | 
    
    | 361 |  |  | 	int i; | 
    
    | 362 |  |  |  | 
    
    | 363 | ✓✗ | 252 | 	if (!CBB_add_u24_length_prefixed(cbb, &cert_list)) | 
    
    | 364 |  |  | 		goto err; | 
    
    | 365 |  |  |  | 
    
    | 366 | ✓✗✗✓ 
 | 504 | 	if ((s->internal->mode & SSL_MODE_NO_AUTO_CHAIN) || s->ctx->extra_certs) | 
    
    | 367 |  |  | 		no_chain = 1; | 
    
    | 368 |  |  |  | 
    
    | 369 |  |  | 	/* TLSv1 sends a chain with nothing in it, instead of an alert. */ | 
    
    | 370 | ✓✗ | 252 | 	if (x != NULL) { | 
    
    | 371 | ✗✓ | 252 | 		if (no_chain) { | 
    
    | 372 |  |  | 			if (!ssl3_add_cert(&cert_list, x)) | 
    
    | 373 |  |  | 				goto err; | 
    
    | 374 |  |  | 		} else { | 
    
    | 375 |  | 252 | 			X509_STORE_CTX xs_ctx; | 
    
    | 376 |  |  |  | 
    
    | 377 | ✗✓ | 252 | 			if (!X509_STORE_CTX_init(&xs_ctx, s->ctx->cert_store, | 
    
    | 378 |  |  | 			    x, NULL)) { | 
    
    | 379 |  |  | 				SSLerror(s, ERR_R_X509_LIB); | 
    
    | 380 |  |  | 				goto err; | 
    
    | 381 |  |  | 			} | 
    
    | 382 |  | 252 | 			X509_verify_cert(&xs_ctx); | 
    
    | 383 |  |  |  | 
    
    | 384 |  |  | 			/* Don't leave errors in the queue. */ | 
    
    | 385 |  | 252 | 			ERR_clear_error(); | 
    
    | 386 | ✓✓ | 1280 | 			for (i = 0; i < sk_X509_num(xs_ctx.chain); i++) { | 
    
    | 387 |  | 388 | 				x = sk_X509_value(xs_ctx.chain, i); | 
    
    | 388 | ✗✓ | 388 | 				if (!ssl3_add_cert(&cert_list, x)) { | 
    
    | 389 |  |  | 					X509_STORE_CTX_cleanup(&xs_ctx); | 
    
    | 390 |  |  | 					goto err; | 
    
    | 391 |  |  | 				} | 
    
    | 392 |  |  | 			} | 
    
    | 393 |  | 252 | 			X509_STORE_CTX_cleanup(&xs_ctx); | 
    
    | 394 | ✓✓✓ | 1008 | 		} | 
    
    | 395 |  |  | 	} | 
    
    | 396 |  |  |  | 
    
    | 397 |  |  | 	/* Thawte special :-) */ | 
    
    | 398 | ✗✓ | 504 | 	for (i = 0; i < sk_X509_num(s->ctx->extra_certs); i++) { | 
    
    | 399 |  |  | 		x = sk_X509_value(s->ctx->extra_certs, i); | 
    
    | 400 |  |  | 		if (!ssl3_add_cert(&cert_list, x)) | 
    
    | 401 |  |  | 			goto err; | 
    
    | 402 |  |  | 	} | 
    
    | 403 |  |  |  | 
    
    | 404 | ✓✗ | 252 | 	if (!CBB_flush(cbb)) | 
    
    | 405 |  |  | 		goto err; | 
    
    | 406 |  |  |  | 
    
    | 407 |  | 252 | 	ret = 1; | 
    
    | 408 |  |  |  | 
    
    | 409 |  |  |  err: | 
    
    | 410 |  | 252 | 	return (ret); | 
    
    | 411 |  | 252 | } | 
    
    | 412 |  |  |  | 
    
    | 413 |  |  | /* | 
    
    | 414 |  |  |  * Obtain handshake message of message type 'mt' (any if mt == -1), | 
    
    | 415 |  |  |  * maximum acceptable body length 'max'. | 
    
    | 416 |  |  |  * The first four bytes (msg_type and length) are read in state 'st1', | 
    
    | 417 |  |  |  * the body is read in state 'stn'. | 
    
    | 418 |  |  |  */ | 
    
    | 419 |  |  | long | 
    
    | 420 |  |  | ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) | 
    
    | 421 |  |  | { | 
    
    | 422 |  |  | 	unsigned char *p; | 
    
    | 423 |  | 75334 | 	uint32_t l; | 
    
    | 424 |  |  | 	long n; | 
    
    | 425 |  |  | 	int i, al; | 
    
    | 426 |  | 37667 | 	CBS cbs; | 
    
    | 427 |  | 37667 | 	uint8_t u8; | 
    
    | 428 |  |  |  | 
    
    | 429 | ✓✓ | 37667 | 	if (S3I(s)->tmp.reuse_message) { | 
    
    | 430 |  | 8325 | 		S3I(s)->tmp.reuse_message = 0; | 
    
    | 431 | ✓✓✗✓ 
 | 16622 | 		if ((mt >= 0) && (S3I(s)->tmp.message_type != mt)) { | 
    
    | 432 |  |  | 			al = SSL_AD_UNEXPECTED_MESSAGE; | 
    
    | 433 |  |  | 			SSLerror(s, SSL_R_UNEXPECTED_MESSAGE); | 
    
    | 434 |  |  | 			goto f_err; | 
    
    | 435 |  |  | 		} | 
    
    | 436 |  | 8325 | 		*ok = 1; | 
    
    | 437 |  | 8325 | 		s->internal->init_msg = s->internal->init_buf->data + 4; | 
    
    | 438 |  | 8325 | 		s->internal->init_num = (int)S3I(s)->tmp.message_size; | 
    
    | 439 |  | 8325 | 		return s->internal->init_num; | 
    
    | 440 |  |  | 	} | 
    
    | 441 |  |  |  | 
    
    | 442 |  | 29342 | 	p = (unsigned char *)s->internal->init_buf->data; | 
    
    | 443 |  |  |  | 
    
    | 444 |  |  | 	/* s->internal->init_num < 4 */ | 
    
    | 445 | ✓✗ | 29342 | 	if (S3I(s)->hs.state == st1) { | 
    
    | 446 |  |  | 		int skip_message; | 
    
    | 447 |  |  |  | 
    
    | 448 |  | 29342 | 		do { | 
    
    | 449 | ✓✓ | 101112 | 			while (s->internal->init_num < 4) { | 
    
    | 450 |  | 58684 | 				i = s->method->internal->ssl_read_bytes(s, | 
    
    | 451 |  | 29342 | 				    SSL3_RT_HANDSHAKE, &p[s->internal->init_num], | 
    
    | 452 |  | 29342 | 				    4 - s->internal->init_num, 0); | 
    
    | 453 | ✓✓ | 29342 | 				if (i <= 0) { | 
    
    | 454 |  | 8128 | 					s->internal->rwstate = SSL_READING; | 
    
    | 455 |  | 8128 | 					*ok = 0; | 
    
    | 456 |  | 8128 | 					return i; | 
    
    | 457 |  |  | 				} | 
    
    | 458 |  | 21214 | 				s->internal->init_num += i; | 
    
    | 459 |  |  | 			} | 
    
    | 460 |  |  |  | 
    
    | 461 |  |  | 			skip_message = 0; | 
    
    | 462 | ✓✓✗✓ 
 | 41756 | 			if (!s->server && p[0] == SSL3_MT_HELLO_REQUEST) { | 
    
    | 463 |  |  | 				/* | 
    
    | 464 |  |  | 				 * The server may always send 'Hello Request' | 
    
    | 465 |  |  | 				 * messages -- we are doing a handshake anyway | 
    
    | 466 |  |  | 				 * now, so ignore them if their format is | 
    
    | 467 |  |  | 				 * correct.  Does not count for 'Finished' MAC. | 
    
    | 468 |  |  | 				 */ | 
    
    | 469 |  |  | 				if (p[1] == 0 && p[2] == 0 &&p[3] == 0) { | 
    
    | 470 |  |  | 					s->internal->init_num = 0; | 
    
    | 471 |  |  | 					skip_message = 1; | 
    
    | 472 |  |  |  | 
    
    | 473 |  |  | 					if (s->internal->msg_callback) | 
    
    | 474 |  |  | 						s->internal->msg_callback(0, s->version, | 
    
    | 475 |  |  | 						    SSL3_RT_HANDSHAKE, p, 4, s, | 
    
    | 476 |  |  | 						    s->internal->msg_callback_arg); | 
    
    | 477 |  |  | 				} | 
    
    | 478 |  |  | 			} | 
    
    | 479 | ✗✓ | 21214 | 		} while (skip_message); | 
    
    | 480 |  |  |  | 
    
    | 481 |  |  | 		/* s->internal->init_num == 4 */ | 
    
    | 482 |  |  |  | 
    
    | 483 | ✓✓✗✓ 
 | 22765 | 		if ((mt >= 0) && (*p != mt)) { | 
    
    | 484 |  |  | 			al = SSL_AD_UNEXPECTED_MESSAGE; | 
    
    | 485 |  |  | 			SSLerror(s, SSL_R_UNEXPECTED_MESSAGE); | 
    
    | 486 |  |  | 			goto f_err; | 
    
    | 487 |  |  | 		} | 
    
    | 488 |  |  |  | 
    
    | 489 |  | 21214 | 		CBS_init(&cbs, p, 4); | 
    
    | 490 | ✓✗✗✓ 
 | 42428 | 		if (!CBS_get_u8(&cbs, &u8) || | 
    
    | 491 |  | 21214 | 		    !CBS_get_u24(&cbs, &l)) { | 
    
    | 492 |  |  | 			SSLerror(s, ERR_R_BUF_LIB); | 
    
    | 493 |  |  | 			goto err; | 
    
    | 494 |  |  | 		} | 
    
    | 495 |  | 21214 | 		S3I(s)->tmp.message_type = u8; | 
    
    | 496 |  |  |  | 
    
    | 497 | ✗✓ | 21214 | 		if (l > (unsigned long)max) { | 
    
    | 498 |  |  | 			al = SSL_AD_ILLEGAL_PARAMETER; | 
    
    | 499 |  |  | 			SSLerror(s, SSL_R_EXCESSIVE_MESSAGE_SIZE); | 
    
    | 500 |  |  | 			goto f_err; | 
    
    | 501 |  |  | 		} | 
    
    | 502 | ✓✓✗✓ 
 | 41341 | 		if (l && !BUF_MEM_grow_clean(s->internal->init_buf, l + 4)) { | 
    
    | 503 |  |  | 			SSLerror(s, ERR_R_BUF_LIB); | 
    
    | 504 |  |  | 			goto err; | 
    
    | 505 |  |  | 		} | 
    
    | 506 |  | 21214 | 		S3I(s)->tmp.message_size = l; | 
    
    | 507 |  | 21214 | 		S3I(s)->hs.state = stn; | 
    
    | 508 |  |  |  | 
    
    | 509 |  | 21214 | 		s->internal->init_msg = s->internal->init_buf->data + 4; | 
    
    | 510 |  | 21214 | 		s->internal->init_num = 0; | 
    
    | 511 | ✓✗✗✓ 
 | 21214 | 	} | 
    
    | 512 |  |  |  | 
    
    | 513 |  |  | 	/* next state (stn) */ | 
    
    | 514 |  | 21214 | 	p = s->internal->init_msg; | 
    
    | 515 |  | 21214 | 	n = S3I(s)->tmp.message_size - s->internal->init_num; | 
    
    | 516 | ✓✓ | 82682 | 	while (n > 0) { | 
    
    | 517 |  | 40254 | 		i = s->method->internal->ssl_read_bytes(s, SSL3_RT_HANDSHAKE, | 
    
    | 518 |  | 20127 | 		    &p[s->internal->init_num], n, 0); | 
    
    | 519 | ✗✓ | 20127 | 		if (i <= 0) { | 
    
    | 520 |  |  | 			s->internal->rwstate = SSL_READING; | 
    
    | 521 |  |  | 			*ok = 0; | 
    
    | 522 |  |  | 			return i; | 
    
    | 523 |  |  | 		} | 
    
    | 524 |  | 20127 | 		s->internal->init_num += i; | 
    
    | 525 |  | 20127 | 		n -= i; | 
    
    | 526 |  |  | 	} | 
    
    | 527 |  |  |  | 
    
    | 528 |  |  | 	/* If receiving Finished, record MAC of prior handshake messages for | 
    
    | 529 |  |  | 	 * Finished verification. */ | 
    
    | 530 | ✓✓ | 21214 | 	if (*s->internal->init_buf->data == SSL3_MT_FINISHED) | 
    
    | 531 |  | 8337 | 		ssl3_take_mac(s); | 
    
    | 532 |  |  |  | 
    
    | 533 |  |  | 	/* Feed this message into MAC computation. */ | 
    
    | 534 | ✓✓ | 21214 | 	if (s->internal->mac_packet) { | 
    
    | 535 |  | 42412 | 		tls1_finish_mac(s, (unsigned char *)s->internal->init_buf->data, | 
    
    | 536 |  | 21206 | 		    s->internal->init_num + 4); | 
    
    | 537 |  |  |  | 
    
    | 538 | ✗✓ | 21206 | 		if (s->internal->msg_callback) | 
    
    | 539 |  |  | 			s->internal->msg_callback(0, s->version, | 
    
    | 540 |  |  | 			    SSL3_RT_HANDSHAKE, s->internal->init_buf->data, | 
    
    | 541 |  |  | 			    (size_t)s->internal->init_num + 4, s, | 
    
    | 542 |  |  | 			    s->internal->msg_callback_arg); | 
    
    | 543 |  |  | 	} | 
    
    | 544 |  |  |  | 
    
    | 545 |  | 21214 | 	*ok = 1; | 
    
    | 546 |  | 21214 | 	return (s->internal->init_num); | 
    
    | 547 |  |  |  | 
    
    | 548 |  |  | f_err: | 
    
    | 549 |  |  | 	ssl3_send_alert(s, SSL3_AL_FATAL, al); | 
    
    | 550 |  |  | err: | 
    
    | 551 |  |  | 	*ok = 0; | 
    
    | 552 |  |  | 	return (-1); | 
    
    | 553 |  | 37667 | } | 
    
    | 554 |  |  |  | 
    
    | 555 |  |  | int | 
    
    | 556 |  |  | ssl_cert_type(X509 *x, EVP_PKEY *pkey) | 
    
    | 557 |  |  | { | 
    
    | 558 |  |  | 	EVP_PKEY *pk; | 
    
    | 559 |  |  | 	int ret = -1, i; | 
    
    | 560 |  |  |  | 
    
    | 561 | ✗✓ | 3638 | 	if (pkey == NULL) | 
    
    | 562 |  |  | 		pk = X509_get_pubkey(x); | 
    
    | 563 |  |  | 	else | 
    
    | 564 |  |  | 		pk = pkey; | 
    
    | 565 | ✓✗ | 1819 | 	if (pk == NULL) | 
    
    | 566 |  |  | 		goto err; | 
    
    | 567 |  |  |  | 
    
    | 568 |  | 1819 | 	i = pk->type; | 
    
    | 569 | ✓✗ | 1819 | 	if (i == EVP_PKEY_RSA) { | 
    
    | 570 |  |  | 		ret = SSL_PKEY_RSA_ENC; | 
    
    | 571 | ✗✗ | 1819 | 	} else if (i == EVP_PKEY_EC) { | 
    
    | 572 |  |  | 		ret = SSL_PKEY_ECC; | 
    
    | 573 |  |  | 	} else if (i == NID_id_GostR3410_2001 || | 
    
    | 574 |  |  | 	    i == NID_id_GostR3410_2001_cc) { | 
    
    | 575 |  |  | 		ret = SSL_PKEY_GOST01; | 
    
    | 576 |  |  | 	} | 
    
    | 577 |  |  |  | 
    
    | 578 |  |  | err: | 
    
    | 579 | ✗✓ | 1819 | 	if (!pkey) | 
    
    | 580 |  |  | 		EVP_PKEY_free(pk); | 
    
    | 581 |  | 1819 | 	return (ret); | 
    
    | 582 |  |  | } | 
    
    | 583 |  |  |  | 
    
    | 584 |  |  | int | 
    
    | 585 |  |  | ssl_verify_alarm_type(long type) | 
    
    | 586 |  |  | { | 
    
    | 587 |  |  | 	int al; | 
    
    | 588 |  |  |  | 
    
    | 589 |  |  | 	switch (type) { | 
    
    | 590 |  |  | 	case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: | 
    
    | 591 |  |  | 	case X509_V_ERR_UNABLE_TO_GET_CRL: | 
    
    | 592 |  |  | 	case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER: | 
    
    | 593 |  |  | 		al = SSL_AD_UNKNOWN_CA; | 
    
    | 594 |  |  | 		break; | 
    
    | 595 |  |  | 	case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE: | 
    
    | 596 |  |  | 	case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE: | 
    
    | 597 |  |  | 	case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY: | 
    
    | 598 |  |  | 	case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD: | 
    
    | 599 |  |  | 	case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD: | 
    
    | 600 |  |  | 	case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD: | 
    
    | 601 |  |  | 	case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD: | 
    
    | 602 |  |  | 	case X509_V_ERR_CERT_NOT_YET_VALID: | 
    
    | 603 |  |  | 	case X509_V_ERR_CRL_NOT_YET_VALID: | 
    
    | 604 |  |  | 	case X509_V_ERR_CERT_UNTRUSTED: | 
    
    | 605 |  |  | 	case X509_V_ERR_CERT_REJECTED: | 
    
    | 606 |  |  | 		al = SSL_AD_BAD_CERTIFICATE; | 
    
    | 607 |  |  | 		break; | 
    
    | 608 |  |  | 	case X509_V_ERR_CERT_SIGNATURE_FAILURE: | 
    
    | 609 |  |  | 	case X509_V_ERR_CRL_SIGNATURE_FAILURE: | 
    
    | 610 |  |  | 		al = SSL_AD_DECRYPT_ERROR; | 
    
    | 611 |  |  | 		break; | 
    
    | 612 |  |  | 	case X509_V_ERR_CERT_HAS_EXPIRED: | 
    
    | 613 |  |  | 	case X509_V_ERR_CRL_HAS_EXPIRED: | 
    
    | 614 |  |  | 		al = SSL_AD_CERTIFICATE_EXPIRED; | 
    
    | 615 |  |  | 		break; | 
    
    | 616 |  |  | 	case X509_V_ERR_CERT_REVOKED: | 
    
    | 617 |  |  | 		al = SSL_AD_CERTIFICATE_REVOKED; | 
    
    | 618 |  |  | 		break; | 
    
    | 619 |  |  | 	case X509_V_ERR_OUT_OF_MEM: | 
    
    | 620 |  |  | 		al = SSL_AD_INTERNAL_ERROR; | 
    
    | 621 |  |  | 		break; | 
    
    | 622 |  |  | 	case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: | 
    
    | 623 |  |  | 	case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: | 
    
    | 624 |  |  | 	case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: | 
    
    | 625 |  |  | 	case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE: | 
    
    | 626 |  |  | 	case X509_V_ERR_CERT_CHAIN_TOO_LONG: | 
    
    | 627 |  |  | 	case X509_V_ERR_PATH_LENGTH_EXCEEDED: | 
    
    | 628 |  |  | 	case X509_V_ERR_INVALID_CA: | 
    
    | 629 |  |  | 		al = SSL_AD_UNKNOWN_CA; | 
    
    | 630 |  |  | 		break; | 
    
    | 631 |  |  | 	case X509_V_ERR_APPLICATION_VERIFICATION: | 
    
    | 632 |  |  | 		al = SSL_AD_HANDSHAKE_FAILURE; | 
    
    | 633 |  |  | 		break; | 
    
    | 634 |  |  | 	case X509_V_ERR_INVALID_PURPOSE: | 
    
    | 635 |  |  | 		al = SSL_AD_UNSUPPORTED_CERTIFICATE; | 
    
    | 636 |  |  | 		break; | 
    
    | 637 |  |  | 	default: | 
    
    | 638 |  |  | 		al = SSL_AD_CERTIFICATE_UNKNOWN; | 
    
    | 639 |  |  | 		break; | 
    
    | 640 |  |  | 	} | 
    
    | 641 |  |  | 	return (al); | 
    
    | 642 |  |  | } | 
    
    | 643 |  |  |  | 
    
    | 644 |  |  | int | 
    
    | 645 |  |  | ssl3_setup_init_buffer(SSL *s) | 
    
    | 646 |  |  | { | 
    
    | 647 |  |  | 	BUF_MEM *buf = NULL; | 
    
    | 648 |  |  |  | 
    
    | 649 | ✗✓ | 16970 | 	if (s->internal->init_buf != NULL) | 
    
    | 650 |  |  | 		return (1); | 
    
    | 651 |  |  |  | 
    
    | 652 | ✓✗ | 8485 | 	if ((buf = BUF_MEM_new()) == NULL) | 
    
    | 653 |  |  | 		goto err; | 
    
    | 654 | ✓✗ | 8485 | 	if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) | 
    
    | 655 |  |  | 		goto err; | 
    
    | 656 |  |  |  | 
    
    | 657 |  | 8485 | 	s->internal->init_buf = buf; | 
    
    | 658 |  | 8485 | 	return (1); | 
    
    | 659 |  |  |  | 
    
    | 660 |  |  | err: | 
    
    | 661 |  |  | 	BUF_MEM_free(buf); | 
    
    | 662 |  |  | 	return (0); | 
    
    | 663 |  | 8485 | } | 
    
    | 664 |  |  |  | 
    
    | 665 |  |  | int | 
    
    | 666 |  |  | ssl3_setup_read_buffer(SSL *s) | 
    
    | 667 |  |  | { | 
    
    | 668 |  |  | 	unsigned char *p; | 
    
    | 669 |  |  | 	size_t len, align, headerlen; | 
    
    | 670 |  |  |  | 
    
    | 671 | ✓✓ | 17258 | 	if (SSL_IS_DTLS(s)) | 
    
    | 672 |  | 148 | 		headerlen = DTLS1_RT_HEADER_LENGTH; | 
    
    | 673 |  |  | 	else | 
    
    | 674 |  |  | 		headerlen = SSL3_RT_HEADER_LENGTH; | 
    
    | 675 |  |  |  | 
    
    | 676 |  |  | 	align = (-SSL3_RT_HEADER_LENGTH) & (SSL3_ALIGN_PAYLOAD - 1); | 
    
    | 677 |  |  |  | 
    
    | 678 | ✓✓ | 8629 | 	if (s->s3->rbuf.buf == NULL) { | 
    
    | 679 |  |  | 		len = SSL3_RT_MAX_PLAIN_LENGTH + | 
    
    | 680 |  | 1371 | 		    SSL3_RT_MAX_ENCRYPTED_OVERHEAD + headerlen + align; | 
    
    | 681 | ✓✗ | 1371 | 		if ((p = malloc(len)) == NULL) | 
    
    | 682 |  |  | 			goto err; | 
    
    | 683 |  | 1371 | 		s->s3->rbuf.buf = p; | 
    
    | 684 |  | 1371 | 		s->s3->rbuf.len = len; | 
    
    | 685 |  | 1371 | 	} | 
    
    | 686 |  |  |  | 
    
    | 687 |  | 8629 | 	s->internal->packet = &(s->s3->rbuf.buf[0]); | 
    
    | 688 |  | 8629 | 	return 1; | 
    
    | 689 |  |  |  | 
    
    | 690 |  |  | err: | 
    
    | 691 |  |  | 	SSLerror(s, ERR_R_MALLOC_FAILURE); | 
    
    | 692 |  |  | 	return 0; | 
    
    | 693 |  | 8629 | } | 
    
    | 694 |  |  |  | 
    
    | 695 |  |  | int | 
    
    | 696 |  |  | ssl3_setup_write_buffer(SSL *s) | 
    
    | 697 |  |  | { | 
    
    | 698 |  |  | 	unsigned char *p; | 
    
    | 699 |  |  | 	size_t len, align, headerlen; | 
    
    | 700 |  |  |  | 
    
    | 701 | ✓✓ | 17066 | 	if (SSL_IS_DTLS(s)) | 
    
    | 702 |  | 148 | 		headerlen = DTLS1_RT_HEADER_LENGTH + 1; | 
    
    | 703 |  |  | 	else | 
    
    | 704 |  |  | 		headerlen = SSL3_RT_HEADER_LENGTH; | 
    
    | 705 |  |  |  | 
    
    | 706 |  |  | 	align = (-SSL3_RT_HEADER_LENGTH) & (SSL3_ALIGN_PAYLOAD - 1); | 
    
    | 707 |  |  |  | 
    
    | 708 | ✓✓ | 8533 | 	if (s->s3->wbuf.buf == NULL) { | 
    
    | 709 |  | 1371 | 		len = s->max_send_fragment + | 
    
    | 710 |  | 1371 | 		    SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD + headerlen + align; | 
    
    | 711 | ✓✗ | 1371 | 		if (!(s->internal->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)) | 
    
    | 712 |  | 1371 | 			len += headerlen + align + | 
    
    | 713 |  |  | 			    SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD; | 
    
    | 714 |  |  |  | 
    
    | 715 | ✓✗ | 1371 | 		if ((p = malloc(len)) == NULL) | 
    
    | 716 |  |  | 			goto err; | 
    
    | 717 |  | 1371 | 		s->s3->wbuf.buf = p; | 
    
    | 718 |  | 1371 | 		s->s3->wbuf.len = len; | 
    
    | 719 |  | 1371 | 	} | 
    
    | 720 |  |  |  | 
    
    | 721 |  | 8533 | 	return 1; | 
    
    | 722 |  |  |  | 
    
    | 723 |  |  | err: | 
    
    | 724 |  |  | 	SSLerror(s, ERR_R_MALLOC_FAILURE); | 
    
    | 725 |  |  | 	return 0; | 
    
    | 726 |  | 8533 | } | 
    
    | 727 |  |  |  | 
    
    | 728 |  |  | int | 
    
    | 729 |  |  | ssl3_setup_buffers(SSL *s) | 
    
    | 730 |  |  | { | 
    
    | 731 | ✗✓ | 17066 | 	if (!ssl3_setup_read_buffer(s)) | 
    
    | 732 |  |  | 		return 0; | 
    
    | 733 | ✗✓ | 8533 | 	if (!ssl3_setup_write_buffer(s)) | 
    
    | 734 |  |  | 		return 0; | 
    
    | 735 |  | 8533 | 	return 1; | 
    
    | 736 |  | 8533 | } | 
    
    | 737 |  |  |  | 
    
    | 738 |  |  | int | 
    
    | 739 |  |  | ssl3_release_write_buffer(SSL *s) | 
    
    | 740 |  |  | { | 
    
    | 741 |  | 3106 | 	free(s->s3->wbuf.buf); | 
    
    | 742 |  | 1553 | 	s->s3->wbuf.buf = NULL; | 
    
    | 743 |  | 1553 | 	return 1; | 
    
    | 744 |  |  | } | 
    
    | 745 |  |  |  | 
    
    | 746 |  |  | int | 
    
    | 747 |  |  | ssl3_release_read_buffer(SSL *s) | 
    
    | 748 |  |  | { | 
    
    | 749 |  | 3106 | 	free(s->s3->rbuf.buf); | 
    
    | 750 |  | 1553 | 	s->s3->rbuf.buf = NULL; | 
    
    | 751 |  | 1553 | 	return 1; | 
    
    | 752 |  |  | } |