t1_enc.c 34.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
/* ssl/t1_enc.c */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */
58
/* ====================================================================
59
 * Copyright (c) 1998-2007 The OpenSSL Project.  All rights reserved.
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
/* ====================================================================
 * Copyright 2005 Nokia. All rights reserved.
 *
 * The portions of the attached software ("Contribution") is developed by
 * Nokia Corporation and is licensed pursuant to the OpenSSL open source
 * license.
 *
 * The Contribution, originally written by Mika Kousa and Pasi Eronen of
 * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
 * support (see RFC 4279) to OpenSSL.
 *
 * No patent licenses or other rights except those expressly stated in
 * the OpenSSL open source license shall be deemed granted or received
 * expressly, by implication, estoppel, or otherwise.
 *
 * No assurances are provided by Nokia that the Contribution does not
 * infringe the patent or other intellectual property rights of any third
 * party or that the license provides you with all the necessary rights
 * to make use of the Contribution.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
 * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
 * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
 * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
 * OTHERWISE.
 */
137 138

#include <stdio.h>
139
#include "ssl_locl.h"
140
#ifndef OPENSSL_NO_COMP
141
#include <openssl/comp.h>
142
#endif
143 144
#include <openssl/evp.h>
#include <openssl/hmac.h>
145
#include <openssl/md5.h>
146
#include <openssl/rand.h>
147 148 149
#ifdef KSSL_DEBUG
#include <openssl/des.h>
#endif
150

151
/* seed1 through seed5 are virtually concatenated */
D
Dr. Stephen Henson 已提交
152
static int tls1_P_hash(const EVP_MD *md, const unsigned char *sec,
153 154 155 156 157 158
			int sec_len,
			const void *seed1, int seed1_len,
			const void *seed2, int seed2_len,
			const void *seed3, int seed3_len,
			const void *seed4, int seed4_len,
			const void *seed5, int seed5_len,
B
Ben Laurie 已提交
159
			unsigned char *out, int olen)
160
	{
B
Ben Laurie 已提交
161
	int chunk;
162 163 164
	size_t j;
	EVP_MD_CTX ctx, ctx_tmp;
	EVP_PKEY *mac_key;
165
	unsigned char A1[EVP_MAX_MD_SIZE];
166
	size_t A1_len;
D
Dr. Stephen Henson 已提交
167
	int ret = 0;
168 169
	
	chunk=EVP_MD_size(md);
170
	OPENSSL_assert(chunk >= 0);
171

172 173
	EVP_MD_CTX_init(&ctx);
	EVP_MD_CTX_init(&ctx_tmp);
174 175
	EVP_MD_CTX_set_flags(&ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
	EVP_MD_CTX_set_flags(&ctx_tmp, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
176 177
	mac_key = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, sec, sec_len);
	if (!mac_key)
D
Dr. Stephen Henson 已提交
178
		goto err;
179
	if (!EVP_DigestSignInit(&ctx,NULL,md, NULL, mac_key))
D
Dr. Stephen Henson 已提交
180
		goto err;
181
	if (!EVP_DigestSignInit(&ctx_tmp,NULL,md, NULL, mac_key))
D
Dr. Stephen Henson 已提交
182
		goto err;
183
	if (seed1 && !EVP_DigestSignUpdate(&ctx,seed1,seed1_len))
D
Dr. Stephen Henson 已提交
184
		goto err;
185
	if (seed2 && !EVP_DigestSignUpdate(&ctx,seed2,seed2_len))
D
Dr. Stephen Henson 已提交
186
		goto err;
187
	if (seed3 && !EVP_DigestSignUpdate(&ctx,seed3,seed3_len))
D
Dr. Stephen Henson 已提交
188
		goto err;
189
	if (seed4 && !EVP_DigestSignUpdate(&ctx,seed4,seed4_len))
D
Dr. Stephen Henson 已提交
190
		goto err;
191 192 193
	if (seed5 && !EVP_DigestSignUpdate(&ctx,seed5,seed5_len))
		goto err;
	if (!EVP_DigestSignFinal(&ctx,A1,&A1_len))
D
Dr. Stephen Henson 已提交
194
		goto err;
195 196 197

	for (;;)
		{
198 199
		/* Reinit mac contexts */
		if (!EVP_DigestSignInit(&ctx,NULL,md, NULL, mac_key))
D
Dr. Stephen Henson 已提交
200
			goto err;
201
		if (!EVP_DigestSignInit(&ctx_tmp,NULL,md, NULL, mac_key))
D
Dr. Stephen Henson 已提交
202
			goto err;
203
		if (!EVP_DigestSignUpdate(&ctx,A1,A1_len))
D
Dr. Stephen Henson 已提交
204
			goto err;
205
		if (!EVP_DigestSignUpdate(&ctx_tmp,A1,A1_len))
D
Dr. Stephen Henson 已提交
206
			goto err;
207
		if (seed1 && !EVP_DigestSignUpdate(&ctx,seed1,seed1_len))
D
Dr. Stephen Henson 已提交
208
			goto err;
209
		if (seed2 && !EVP_DigestSignUpdate(&ctx,seed2,seed2_len))
D
Dr. Stephen Henson 已提交
210
			goto err;
211
		if (seed3 && !EVP_DigestSignUpdate(&ctx,seed3,seed3_len))
D
Dr. Stephen Henson 已提交
212
			goto err;
213
		if (seed4 && !EVP_DigestSignUpdate(&ctx,seed4,seed4_len))
D
Dr. Stephen Henson 已提交
214
			goto err;
215
		if (seed5 && !EVP_DigestSignUpdate(&ctx,seed5,seed5_len))
D
Dr. Stephen Henson 已提交
216
			goto err;
217 218 219

		if (olen > chunk)
			{
220
			if (!EVP_DigestSignFinal(&ctx,out,&j))
D
Dr. Stephen Henson 已提交
221
				goto err;
222 223
			out+=j;
			olen-=j;
224 225
			/* calc the next A1 value */
			if (!EVP_DigestSignFinal(&ctx_tmp,A1,&A1_len))
D
Dr. Stephen Henson 已提交
226
				goto err;
227 228 229
			}
		else	/* last one */
			{
230
			if (!EVP_DigestSignFinal(&ctx,A1,&A1_len))
D
Dr. Stephen Henson 已提交
231
				goto err;
232 233 234 235
			memcpy(out,A1,olen);
			break;
			}
		}
D
Dr. Stephen Henson 已提交
236 237
	ret = 1;
err:
238 239 240
	EVP_PKEY_free(mac_key);
	EVP_MD_CTX_cleanup(&ctx);
	EVP_MD_CTX_cleanup(&ctx_tmp);
241
	OPENSSL_cleanse(A1,sizeof(A1));
D
Dr. Stephen Henson 已提交
242
	return ret;
243 244
	}

245
/* seed1 through seed5 are virtually concatenated */
D
Dr. Stephen Henson 已提交
246
static int tls1_PRF(long digest_mask,
247 248 249 250 251 252 253
		     const void *seed1, int seed1_len,
		     const void *seed2, int seed2_len,
		     const void *seed3, int seed3_len,
		     const void *seed4, int seed4_len,
		     const void *seed5, int seed5_len,
		     const unsigned char *sec, int slen,
		     unsigned char *out1,
B
Ben Laurie 已提交
254
		     unsigned char *out2, int olen)
255
	{
256 257 258 259
	int len,i,idx,count;
	const unsigned char *S1;
	long m;
	const EVP_MD *md;
D
Dr. Stephen Henson 已提交
260
	int ret = 0;
261

262
	/* Count number of digests and partition sec evenly */
263 264 265 266 267
	count=0;
	for (idx=0;ssl_get_handshake_digest(idx,&m,&md);idx++) {
		if ((m<<TLS1_PRF_DGST_SHIFT) & digest_mask) count++;
	}	
	len=slen/count;
268 269
	if (count == 1)
		slen = 0;
270
	S1=sec;
271 272 273 274 275 276
	memset(out1,0,olen);
	for (idx=0;ssl_get_handshake_digest(idx,&m,&md);idx++) {
		if ((m<<TLS1_PRF_DGST_SHIFT) & digest_mask) {
			if (!md) {
				SSLerr(SSL_F_TLS1_PRF,
				SSL_R_UNSUPPORTED_DIGEST_TYPE);
D
Dr. Stephen Henson 已提交
277
				goto err;				
278
			}
D
Dr. Stephen Henson 已提交
279 280 281 282
			if (!tls1_P_hash(md ,S1,len+(slen&1),
					seed1,seed1_len,seed2,seed2_len,seed3,seed3_len,seed4,seed4_len,seed5,seed5_len,
					out2,olen))
				goto err;
283 284 285 286 287 288
			S1+=len;
			for (i=0; i<olen; i++)
			{
				out1[i]^=out2[i];
			}
		}
289
	}
D
Dr. Stephen Henson 已提交
290 291 292
	ret = 1;
err:
	return ret;
293
}
D
Dr. Stephen Henson 已提交
294
static int tls1_generate_key_block(SSL *s, unsigned char *km,
U
Ulf Möller 已提交
295
	     unsigned char *tmp, int num)
296
	{
D
Dr. Stephen Henson 已提交
297
	int ret;
298
	ret = tls1_PRF(ssl_get_algorithm2(s),
299 300 301 302
		 TLS_MD_KEY_EXPANSION_CONST,TLS_MD_KEY_EXPANSION_CONST_SIZE,
		 s->s3->server_random,SSL3_RANDOM_SIZE,
		 s->s3->client_random,SSL3_RANDOM_SIZE,
		 NULL,0,NULL,0,
B
Ben Laurie 已提交
303 304
		 s->session->master_key,s->session->master_key_length,
		 km,tmp,num);
305 306 307 308 309 310 311 312 313 314 315
#ifdef KSSL_DEBUG
	printf("tls1_generate_key_block() ==> %d byte master_key =\n\t",
                s->session->master_key_length);
	{
        int i;
        for (i=0; i < s->session->master_key_length; i++)
                {
                printf("%02X", s->session->master_key[i]);
                }
        printf("\n");  }
#endif    /* KSSL_DEBUG */
D
Dr. Stephen Henson 已提交
316
	return ret;
317 318
	}

U
Ulf Möller 已提交
319
int tls1_change_cipher_state(SSL *s, int which)
320
	{
B
Ben Laurie 已提交
321
	static const unsigned char empty[]="";
B
Ben Laurie 已提交
322
	unsigned char *p,*mac_secret;
323
	unsigned char *exp_label;
324 325 326 327
	unsigned char tmp1[EVP_MAX_KEY_LENGTH];
	unsigned char tmp2[EVP_MAX_KEY_LENGTH];
	unsigned char iv1[EVP_MAX_IV_LENGTH*2];
	unsigned char iv2[EVP_MAX_IV_LENGTH*2];
B
Ben Laurie 已提交
328
	unsigned char *ms,*key,*iv;
329 330
	int client_write;
	EVP_CIPHER_CTX *dd;
B
Ben Laurie 已提交
331
	const EVP_CIPHER *c;
332
#ifndef OPENSSL_NO_COMP
B
Ben Laurie 已提交
333
	const SSL_COMP *comp;
334
#endif
B
Ben Laurie 已提交
335
	const EVP_MD *m;
336 337 338 339
	int mac_type;
	int *mac_secret_size;
	EVP_MD_CTX *mac_ctx;
	EVP_PKEY *mac_key;
B
Bodo Möller 已提交
340 341
	int is_export,n,i,j,k,exp_label_len,cl;
	int reuse_dd = 0;
342

B
Bodo Möller 已提交
343
	is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
344 345
	c=s->s3->tmp.new_sym_enc;
	m=s->s3->tmp.new_hash;
346
	mac_type = s->s3->tmp.new_mac_pkey_type;
347
#ifndef OPENSSL_NO_COMP
348
	comp=s->s3->tmp.new_compression;
349
#endif
350

351 352
#ifdef KSSL_DEBUG
	printf("tls1_change_cipher_state(which= %d) w/\n", which);
353 354 355
	printf("\talg= %ld/%ld, comp= %p\n",
	       s->s3->tmp.new_cipher->algorithm_mkey,
	       s->s3->tmp.new_cipher->algorithm_auth,
356 357 358 359
	       comp);
	printf("\tevp_cipher == %p ==? &d_cbc_ede_cipher3\n", c);
	printf("\tevp_cipher: nid, blksz= %d, %d, keylen=%d, ivlen=%d\n",
                c->nid,c->block_size,c->key_len,c->iv_len);
360 361
	printf("\tkey_block: len= %d, data= ", s->s3->tmp.key_block_length);
	{
362 363 364
        int i;
        for (i=0; i<s->s3->tmp.key_block_length; i++)
		printf("%02x", key_block[i]);  printf("\n");
365 366 367
        }
#endif	/* KSSL_DEBUG */

368 369
	if (which & SSL3_CC_READ)
		{
370 371
		if (s->s3->tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC)
			s->mac_flags |= SSL_MAC_FLAG_READ_MAC_STREAM;
372
		else
373 374
			s->mac_flags &= ~SSL_MAC_FLAG_READ_MAC_STREAM;

B
Bodo Möller 已提交
375 376 377
		if (s->enc_read_ctx != NULL)
			reuse_dd = 1;
		else if ((s->enc_read_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
378
			goto err;
379 380 381
		else
			/* make sure it's intialized in case we exit later with an error */
			EVP_CIPHER_CTX_init(s->enc_read_ctx);
382
		dd= s->enc_read_ctx;
383
		mac_ctx=ssl_replace_hash(&s->read_hash,NULL);
384
#ifndef OPENSSL_NO_COMP
385 386 387 388 389 390 391
		if (s->expand != NULL)
			{
			COMP_CTX_free(s->expand);
			s->expand=NULL;
			}
		if (comp != NULL)
			{
392
			s->expand=COMP_CTX_new(comp->method);
393 394 395 396 397
			if (s->expand == NULL)
				{
				SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
				goto err2;
				}
398 399
			if (s->s3->rrec.comp == NULL)
				s->s3->rrec.comp=(unsigned char *)
400
					OPENSSL_malloc(SSL3_RT_MAX_ENCRYPTED_LENGTH);
401 402 403
			if (s->s3->rrec.comp == NULL)
				goto err;
			}
404
#endif
B
Ben Laurie 已提交
405 406 407
		/* this is done by dtls1_reset_seq_numbers for DTLS1_VERSION */
 		if (s->version != DTLS1_VERSION)
			memset(&(s->s3->read_sequence[0]),0,8);
408
		mac_secret= &(s->s3->read_mac_secret[0]);
409
		mac_secret_size=&(s->s3->read_mac_secret_size);
410 411 412
		}
	else
		{
413 414 415 416
		if (s->s3->tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC)
			s->mac_flags |= SSL_MAC_FLAG_WRITE_MAC_STREAM;
			else
			s->mac_flags &= ~SSL_MAC_FLAG_WRITE_MAC_STREAM;
B
Bodo Möller 已提交
417 418 419 420
		if (s->enc_write_ctx != NULL)
			reuse_dd = 1;
		else if ((s->enc_write_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
			goto err;
421 422 423
		else
			/* make sure it's intialized in case we exit later with an error */
			EVP_CIPHER_CTX_init(s->enc_write_ctx);
424
		dd= s->enc_write_ctx;
425
		mac_ctx = ssl_replace_hash(&s->write_hash,NULL);
426
#ifndef OPENSSL_NO_COMP
427 428 429 430 431 432 433
		if (s->compress != NULL)
			{
			COMP_CTX_free(s->compress);
			s->compress=NULL;
			}
		if (comp != NULL)
			{
434
			s->compress=COMP_CTX_new(comp->method);
435 436 437 438 439 440
			if (s->compress == NULL)
				{
				SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
				goto err2;
				}
			}
441
#endif
B
Ben Laurie 已提交
442 443 444
		/* this is done by dtls1_reset_seq_numbers for DTLS1_VERSION */
 		if (s->version != DTLS1_VERSION)
			memset(&(s->s3->write_sequence[0]),0,8);
445
		mac_secret= &(s->s3->write_mac_secret[0]);
446
		mac_secret_size = &(s->s3->write_mac_secret_size);
447 448
		}

B
Bodo Möller 已提交
449 450
	if (reuse_dd)
		EVP_CIPHER_CTX_cleanup(dd);
451 452

	p=s->s3->tmp.key_block;
453 454
	i=*mac_secret_size=s->s3->tmp.new_mac_secret_size;

455
	cl=EVP_CIPHER_key_length(c);
B
Bodo Möller 已提交
456 457
	j=is_export ? (cl < SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher) ?
	               cl : SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher)) : cl;
458
	/* Was j=(exp)?5:EVP_CIPHER_key_length(c); */
459 460 461 462 463
	/* If GCM mode only part of IV comes from PRF */
	if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE)
		k = EVP_GCM_TLS_FIXED_IV_LEN;
	else
		k=EVP_CIPHER_iv_length(c);
464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486
	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;
		exp_label=(unsigned char *)TLS_MD_CLIENT_WRITE_KEY_CONST;
		exp_label_len=TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE;
		client_write=1;
		}
	else
		{
		n=i;
		ms=  &(p[ n]); n+=i+j;
		key= &(p[ n]); n+=j+k;
		iv=  &(p[ n]); n+=k;
		exp_label=(unsigned char *)TLS_MD_SERVER_WRITE_KEY_CONST;
		exp_label_len=TLS_MD_SERVER_WRITE_KEY_CONST_SIZE;
		client_write=0;
		}

	if (n > s->s3->tmp.key_block_length)
		{
B
Bodo Möller 已提交
487
		SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,ERR_R_INTERNAL_ERROR);
488 489 490 491
		goto err2;
		}

	memcpy(mac_secret,ms,i);
492 493 494 495 496 497 498 499

	if (!(EVP_CIPHER_flags(c)&EVP_CIPH_FLAG_AEAD_CIPHER))
		{
		mac_key = EVP_PKEY_new_mac_key(mac_type, NULL,
				mac_secret,*mac_secret_size);
		EVP_DigestSignInit(mac_ctx,NULL,m,NULL,mac_key);
		EVP_PKEY_free(mac_key);
		}
500 501 502 503
#ifdef TLS_DEBUG
printf("which = %04X\nmac key=",which);
{ int z; for (z=0; z<i; z++) printf("%02X%c",ms[z],((z+1)%16)?' ':'\n'); }
#endif
B
Bodo Möller 已提交
504
	if (is_export)
505 506 507 508
		{
		/* In here I set both the read and write key/iv to the
		 * same value since only the correct one will be used :-).
		 */
509
		if (!tls1_PRF(ssl_get_algorithm2(s),
D
Dr. Stephen Henson 已提交
510 511 512 513 514 515
				exp_label,exp_label_len,
				s->s3->client_random,SSL3_RANDOM_SIZE,
				s->s3->server_random,SSL3_RANDOM_SIZE,
				NULL,0,NULL,0,
				key,j,tmp1,tmp2,EVP_CIPHER_key_length(c)))
			goto err2;
516 517 518 519
		key=tmp1;

		if (k > 0)
			{
520
			if (!tls1_PRF(ssl_get_algorithm2(s),
D
Dr. Stephen Henson 已提交
521 522 523 524 525 526
					TLS_MD_IV_BLOCK_CONST,TLS_MD_IV_BLOCK_CONST_SIZE,
					s->s3->client_random,SSL3_RANDOM_SIZE,
					s->s3->server_random,SSL3_RANDOM_SIZE,
					NULL,0,NULL,0,
					empty,0,iv1,iv2,k*2))
				goto err2;
527 528 529 530 531 532 533 534
			if (client_write)
				iv=iv1;
			else
				iv= &(iv1[k]);
			}
		}

	s->session->key_arg_length=0;
535 536
#ifdef KSSL_DEBUG
	{
537
        int i;
538
	printf("EVP_CipherInit_ex(dd,c,key=,iv=,which)\n");
539
	printf("\tkey= "); for (i=0; i<c->key_len; i++) printf("%02x", key[i]);
540
	printf("\n");
541
	printf("\t iv= "); for (i=0; i<c->iv_len; i++) printf("%02x", iv[i]);
542 543 544
	printf("\n");
	}
#endif	/* KSSL_DEBUG */
545

546 547 548 549 550 551 552
	if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE)
		{
		EVP_CipherInit_ex(dd,c,NULL,key,NULL,(which & SSL3_CC_WRITE));
		EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_GCM_SET_IV_FIXED, k, iv);
		}
	else	
		EVP_CipherInit_ex(dd,c,NULL,key,iv,(which & SSL3_CC_WRITE));
553 554 555 556 557 558

	/* Needed for "composite" AEADs, such as RC4-HMAC-MD5 */
	if ((EVP_CIPHER_flags(c)&EVP_CIPH_FLAG_AEAD_CIPHER) && *mac_secret_size)
		EVP_CIPHER_CTX_ctrl(dd,EVP_CTRL_AEAD_SET_MAC_KEY,
				*mac_secret_size,mac_secret);

559 560 561 562 563 564 565 566
#ifdef TLS_DEBUG
printf("which = %04X\nkey=",which);
{ int z; for (z=0; z<EVP_CIPHER_key_length(c); z++) printf("%02X%c",key[z],((z+1)%16)?' ':'\n'); }
printf("\niv=");
{ int z; for (z=0; z<k; z++) printf("%02X%c",iv[z],((z+1)%16)?' ':'\n'); }
printf("\n");
#endif

567 568 569 570
	OPENSSL_cleanse(tmp1,sizeof(tmp1));
	OPENSSL_cleanse(tmp2,sizeof(tmp1));
	OPENSSL_cleanse(iv1,sizeof(iv1));
	OPENSSL_cleanse(iv2,sizeof(iv2));
571 572 573 574 575 576 577
	return(1);
err:
	SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,ERR_R_MALLOC_FAILURE);
err2:
	return(0);
	}

U
Ulf Möller 已提交
578
int tls1_setup_key_block(SSL *s)
579
	{
D
Dr. Stephen Henson 已提交
580
	unsigned char *p1,*p2=NULL;
B
Ben Laurie 已提交
581 582
	const EVP_CIPHER *c;
	const EVP_MD *hash;
583
	int num;
584
	SSL_COMP *comp;
585
	int mac_type= NID_undef,mac_secret_size=0;
D
Dr. Stephen Henson 已提交
586
	int ret=0;
587

588 589 590 591
#ifdef KSSL_DEBUG
	printf ("tls1_setup_key_block()\n");
#endif	/* KSSL_DEBUG */

592 593 594
	if (s->s3->tmp.key_block_length != 0)
		return(1);

595
	if (!ssl_cipher_get_evp(s->session,&c,&hash,&mac_type,&mac_secret_size,&comp))
596 597 598 599 600 601 602
		{
		SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
		return(0);
		}

	s->s3->tmp.new_sym_enc=c;
	s->s3->tmp.new_hash=hash;
603 604 605
	s->s3->tmp.new_mac_pkey_type = mac_type;
	s->s3->tmp.new_mac_secret_size = mac_secret_size;
	num=EVP_CIPHER_key_length(c)+mac_secret_size+EVP_CIPHER_iv_length(c);
606 607 608 609
	num*=2;

	ssl3_cleanup_key_block(s);

610
	if ((p1=(unsigned char *)OPENSSL_malloc(num)) == NULL)
D
Dr. Stephen Henson 已提交
611 612
		{
		SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE);
613
		goto err;
D
Dr. Stephen Henson 已提交
614
		}
615 616 617 618

	s->s3->tmp.key_block_length=num;
	s->s3->tmp.key_block=p1;

D
Dr. Stephen Henson 已提交
619 620 621 622 623
	if ((p2=(unsigned char *)OPENSSL_malloc(num)) == NULL)
		{
		SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE);
		goto err;
		}
624 625 626 627 628 629 630 631 632

#ifdef TLS_DEBUG
printf("client random\n");
{ int z; for (z=0; z<SSL3_RANDOM_SIZE; z++) printf("%02X%c",s->s3->client_random[z],((z+1)%16)?' ':'\n'); }
printf("server random\n");
{ int z; for (z=0; z<SSL3_RANDOM_SIZE; z++) printf("%02X%c",s->s3->server_random[z],((z+1)%16)?' ':'\n'); }
printf("pre-master\n");
{ int z; for (z=0; z<s->session->master_key_length; z++) printf("%02X%c",s->session->master_key[z],((z+1)%16)?' ':'\n'); }
#endif
D
Dr. Stephen Henson 已提交
633 634
	if (!tls1_generate_key_block(s,p1,p2,num))
		goto err;
635 636 637 638 639
#ifdef TLS_DEBUG
printf("\nkey block\n");
{ int z; for (z=0; z<num; z++) printf("%02X%c",p1[z],((z+1)%16)?' ':'\n'); }
#endif

640 641
	if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)
		&& s->method->version <= TLS1_VERSION)
642 643 644 645 646 647
		{
		/* enable vulnerability countermeasure for CBC ciphers with
		 * known-IV problem (http://www.openssl.org/~bodo/tls-cbc.txt)
		 */
		s->s3->need_empty_fragments = 1;

648 649
		if (s->session->cipher != NULL)
			{
650
			if (s->session->cipher->algorithm_enc == SSL_eNULL)
651 652 653
				s->s3->need_empty_fragments = 0;
			
#ifndef OPENSSL_NO_RC4
654
			if (s->session->cipher->algorithm_enc == SSL_RC4)
655
				s->s3->need_empty_fragments = 0;
656
#endif
657
			}
658
		}
659
		
D
Dr. Stephen Henson 已提交
660
	ret = 1;
661
err:
D
Dr. Stephen Henson 已提交
662 663 664 665 666 667
	if (p2)
		{
		OPENSSL_cleanse(p2,num);
		OPENSSL_free(p2);
		}
	return(ret);
668 669
	}

U
Ulf Möller 已提交
670
int tls1_enc(SSL *s, int send)
671 672 673 674
	{
	SSL3_RECORD *rec;
	EVP_CIPHER_CTX *ds;
	unsigned long l;
675
	int bs,i,ii,j,k,pad=0;
B
Ben Laurie 已提交
676
	const EVP_CIPHER *enc;
677 678 679

	if (send)
		{
680
		if (EVP_MD_CTX_md(s->write_hash))
681
			{
682
			int n=EVP_MD_CTX_size(s->write_hash);
683 684
			OPENSSL_assert(n >= 0);
			}
685 686 687
		ds=s->enc_write_ctx;
		rec= &(s->s3->wrec);
		if (s->enc_write_ctx == NULL)
688
			enc=NULL;
689
		else
690 691
			{
			int ivlen;
692
			enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
693
			/* For TLSv1.1 and later explicit IV */
694 695
			if (s->version >= TLS1_1_VERSION
				&& EVP_CIPHER_mode(enc) == EVP_CIPH_CBC_MODE)
696 697 698 699 700 701
				ivlen = EVP_CIPHER_iv_length(enc);
			else
				ivlen = 0;
			if (ivlen > 1)
				{
				if ( rec->data != rec->input)
702 703 704 705 706 707
					/* we can't write into the input stream:
					 * Can this ever happen?? (steve)
					 */
					fprintf(stderr,
						"%s:%d: rec->data != rec->input\n",
						__FILE__, __LINE__);
708 709 710 711
				else if (RAND_bytes(rec->input, ivlen) <= 0)
					return -1;
				}
			}
712 713 714
		}
	else
		{
715
		if (EVP_MD_CTX_md(s->read_hash))
716
			{
717
			int n=EVP_MD_CTX_size(s->read_hash);
718 719
			OPENSSL_assert(n >= 0);
			}
720 721 722
		ds=s->enc_read_ctx;
		rec= &(s->s3->rrec);
		if (s->enc_read_ctx == NULL)
723
			enc=NULL;
724 725 726 727
		else
			enc=EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
		}

728 729 730 731
#ifdef KSSL_DEBUG
	printf("tls1_enc(%d)\n", send);
#endif    /* KSSL_DEBUG */

732
	if ((s->session == NULL) || (ds == NULL) ||
733
		(enc == NULL))
734
		{
735
		memmove(rec->data,rec->input,rec->length);
736 737 738 739 740 741 742
		rec->input=rec->data;
		}
	else
		{
		l=rec->length;
		bs=EVP_CIPHER_block_size(ds->cipher);

743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779
		if (EVP_CIPHER_flags(ds->cipher)&EVP_CIPH_FLAG_AEAD_CIPHER)
			{
			unsigned char buf[13],*seq;

			seq = send?s->s3->write_sequence:s->s3->read_sequence;

			if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER)
				{
				unsigned char dtlsseq[9],*p=dtlsseq;

				s2n(send?s->d1->w_epoch:s->d1->r_epoch,p);
				memcpy(p,&seq[2],6);
				memcpy(buf,dtlsseq,8);
				}
			else
				{
				memcpy(buf,seq,8);
				for (i=7; i>=0; i--)	/* increment */
					{
					++seq[i];
					if (seq[i] != 0) break; 
					}
				}

			buf[8]=rec->type;
			buf[9]=(unsigned char)(s->version>>8);
			buf[10]=(unsigned char)(s->version);
			buf[11]=rec->length>>8;
			buf[12]=rec->length&0xff;
			pad=EVP_CIPHER_CTX_ctrl(ds,EVP_CTRL_AEAD_TLS1_AAD,13,buf);
			if (send)
				{
				l+=pad;
				rec->length+=pad;
				}
			}
		else if ((bs != 1) && send)
780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797
			{
			i=bs-((int)l%bs);

			/* Add weird padding of upto 256 bytes */

			/* we need to add 'i' padding bytes of value j */
			j=i-1;
			if (s->options & SSL_OP_TLS_BLOCK_PADDING_BUG)
				{
				if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
					j++;
				}
			for (k=(int)l; k<(int)(l+i); k++)
				rec->input[k]=j;
			l+=i;
			rec->length+=i;
			}

798 799
#ifdef KSSL_DEBUG
		{
800
                unsigned long ui;
801
		printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n",
802 803 804 805 806
                        ds,rec->data,rec->input,l);
		printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%d %d], %d iv_len\n",
                        ds->buf_len, ds->cipher->key_len,
                        DES_KEY_SZ, DES_SCHEDULE_SZ,
                        ds->cipher->iv_len);
807 808 809 810
		printf("\t\tIV: ");
		for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]);
		printf("\n");
		printf("\trec->input=");
811
		for (ui=0; ui<l; ui++) printf(" %02x", rec->input[ui]);
812 813 814 815
		printf("\n");
		}
#endif	/* KSSL_DEBUG */

816 817 818 819
		if (!send)
			{
			if (l == 0 || l%bs != 0)
				{
820 821
				if (s->version >= TLS1_1_VERSION)
					return -1;
822
				SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
823 824
				ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED);
				return 0;
825 826 827
				}
			}
		
828
		if (EVP_Cipher(ds,rec->data,rec->input,l) < 0)
829
			return -1;	/* AEAD can fail to verify MAC */
830 831 832 833 834 835
		if (EVP_CIPHER_mode(enc) == EVP_CIPH_GCM_MODE && !send)
			{
			rec->data += EVP_GCM_TLS_EXPLICIT_IV_LEN;
			rec->input += EVP_GCM_TLS_EXPLICIT_IV_LEN;
			rec->length -= EVP_GCM_TLS_EXPLICIT_IV_LEN;
			}
836

837 838
#ifdef KSSL_DEBUG
		{
839
                unsigned long i;
840
                printf("\trec->data=");
841 842
		for (i=0; i<l; i++)
                        printf(" %02x", rec->data[i]);  printf("\n");
843 844 845
                }
#endif	/* KSSL_DEBUG */

846 847
		if ((bs != 1) && !send)
			{
848
			ii=i=rec->data[l-1]; /* padding_length */
849
			i++;
D
Dr. Stephen Henson 已提交
850 851 852 853 854 855 856 857 858
			/* NB: if compression is in operation the first packet
			 * may not be of even length so the padding bug check
			 * cannot be performed. This bug workaround has been
			 * around since SSLeay so hopefully it is either fixed
			 * now or no buggy implementation supports compression 
			 * [steve]
			 */
			if ( (s->options&SSL_OP_TLS_BLOCK_PADDING_BUG)
				&& !s->expand)
859 860 861 862 863 864 865 866
				{
				/* First packet is even in size, so check */
				if ((memcmp(s->s3->read_sequence,
					"\0\0\0\0\0\0\0\0",8) == 0) && !(ii & 1))
					s->s3->flags|=TLS1_FLAGS_TLS_PADDING_BUG;
				if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
					i--;
				}
867 868
			/* TLS 1.0 does not bound the number of padding bytes by the block size.
			 * All of them must have value 'padding_length'. */
869 870
			if (i > (int)rec->length)
				{
871 872
				/* Incorrect padding. SSLerr() and ssl3_alert are done
				 * by caller: we don't want to reveal whether this is
B
comment  
Bodo Möller 已提交
873 874
				 * a decryption error or a MAC verification failure
				 * (see http://www.openssl.org/~bodo/tls-cbc.txt) */
875
				return -1;
876 877 878 879 880
				}
			for (j=(int)(l-i); j<(int)l; j++)
				{
				if (rec->data[j] != ii)
					{
881 882
					/* Incorrect padding */
					return -1;
883 884
					}
				}
885
			rec->length -=i;
886 887
			if (s->version >= TLS1_1_VERSION
				&& EVP_CIPHER_CTX_mode(ds) == EVP_CIPH_CBC_MODE)
888 889 890 891 892
				{
				rec->data += bs;    /* skip the explicit IV */
				rec->input += bs;
				rec->length -= bs;
				}
893
			}
894 895
		if (pad && !send)
			rec->length -= pad;
896 897 898
		}
	return(1);
	}
899
int tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *out)
900 901
	{
	unsigned int ret;
902 903 904 905
	EVP_MD_CTX ctx, *d=NULL;
	int i;

	if (s->s3->handshake_buffer) 
906 907 908
		if (!ssl3_digest_cached_records(s))
			return 0;

909 910 911 912 913 914 915 916 917 918 919 920
	for (i=0;i<SSL_MAX_DIGEST;i++) 
		{
		  if (s->s3->handshake_dgst[i]&&EVP_MD_CTX_type(s->s3->handshake_dgst[i])==md_nid) 
		  	{
		  	d=s->s3->handshake_dgst[i];
			break;
			}
		}
	if (!d) {
		SSLerr(SSL_F_TLS1_CERT_VERIFY_MAC,SSL_R_NO_REQUIRED_DIGEST);
		return 0;
	}	
921

922
	EVP_MD_CTX_init(&ctx);
923
	EVP_MD_CTX_copy_ex(&ctx,d);
D
 
Dr. Stephen Henson 已提交
924
	EVP_DigestFinal_ex(&ctx,out,&ret);
925
	EVP_MD_CTX_cleanup(&ctx);
926 927 928
	return((int)ret);
	}

929
int tls1_final_finish_mac(SSL *s,
B
Bodo Möller 已提交
930
	     const char *str, int slen, unsigned char *out)
931 932 933
	{
	unsigned int i;
	EVP_MD_CTX ctx;
934
	unsigned char buf[2*EVP_MAX_MD_SIZE];
935
	unsigned char *q,buf2[12];
936 937
	int idx;
	long mask;
938
	int err=0;
939
	const EVP_MD *md; 
940 941 942

	q=buf;

943
	if (s->s3->handshake_buffer) 
944 945 946 947
		if (!ssl3_digest_cached_records(s))
			return 0;

	EVP_MD_CTX_init(&ctx);
948

949 950
	for (idx=0;ssl_get_handshake_digest(idx,&mask,&md);idx++)
		{
951
		if (mask & ssl_get_algorithm2(s))
952
			{
953 954
			int hashsize = EVP_MD_size(md);
			if (hashsize < 0 || hashsize > (int)(sizeof buf - (size_t)(q-buf)))
955 956 957 958 959 960 961 962
				{
				/* internal error: 'buf' is too small for this cipersuite! */
				err = 1;
				}
			else
				{
				EVP_MD_CTX_copy_ex(&ctx,s->s3->handshake_dgst[idx]);
				EVP_DigestFinal_ex(&ctx,q,&i);
963
				if (i != (unsigned int)hashsize) /* can't really happen */
964 965 966 967
					err = 1;
				q+=i;
				}
			}
968
		}
969
		
970
	if (!tls1_PRF(ssl_get_algorithm2(s),
D
Dr. Stephen Henson 已提交
971 972 973 974
			str,slen, buf,(int)(q-buf), NULL,0, NULL,0, NULL,0,
			s->session->master_key,s->session->master_key_length,
			out,buf2,sizeof buf2))
		err = 1;
975
	EVP_MD_CTX_cleanup(&ctx);
976

977 978 979 980
	if (err)
		return 0;
	else
		return sizeof buf2;
981 982
	}

U
Ulf Möller 已提交
983
int tls1_mac(SSL *ssl, unsigned char *md, int send)
984 985
	{
	SSL3_RECORD *rec;
B
Ben Laurie 已提交
986
	unsigned char *seq;
987 988
	EVP_MD_CTX *hash;
	size_t md_size;
989
	int i;
990
	EVP_MD_CTX hmac, *mac_ctx;
991
	unsigned char buf[5]; 
992
	int stream_mac = (send?(ssl->mac_flags & SSL_MAC_FLAG_WRITE_MAC_STREAM):(ssl->mac_flags&SSL_MAC_FLAG_READ_MAC_STREAM));
993
	int t;
994

995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007
	if (send)
		{
		rec= &(ssl->s3->wrec);
		seq= &(ssl->s3->write_sequence[0]);
		hash=ssl->write_hash;
		}
	else
		{
		rec= &(ssl->s3->rrec);
		seq= &(ssl->s3->read_sequence[0]);
		hash=ssl->read_hash;
		}

1008 1009 1010
	t=EVP_MD_CTX_size(hash);
	OPENSSL_assert(t >= 0);
	md_size=t;
1011 1012

	buf[0]=rec->type;
1013 1014
	buf[1]=(unsigned char)(ssl->version>>8);
	buf[2]=(unsigned char)(ssl->version);
1015 1016 1017 1018
	buf[3]=rec->length>>8;
	buf[4]=rec->length&0xff;

	/* I should fix this up TLS TLS TLS TLS TLS XXXXXXXX */
1019 1020 1021 1022 1023 1024 1025 1026
	if (stream_mac) 
		{
			mac_ctx = hash;
		}
		else
		{
			EVP_MD_CTX_copy(&hmac,hash);
			mac_ctx = &hmac;
1027 1028
		}

1029
	if (ssl->version == DTLS1_VERSION || ssl->version == DTLS1_BAD_VER)
1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040
		{
		unsigned char dtlsseq[8],*p=dtlsseq;

		s2n(send?ssl->d1->w_epoch:ssl->d1->r_epoch, p);
		memcpy (p,&seq[2],6);

		EVP_DigestSignUpdate(mac_ctx,dtlsseq,8);
		}
	else
		EVP_DigestSignUpdate(mac_ctx,seq,8);

1041 1042
	EVP_DigestSignUpdate(mac_ctx,buf,5);
	EVP_DigestSignUpdate(mac_ctx,rec->input,rec->length);
1043 1044 1045
	t=EVP_DigestSignFinal(mac_ctx,md,&md_size);
	OPENSSL_assert(t > 0);
		
1046
	if (!stream_mac) EVP_MD_CTX_cleanup(&hmac);
1047 1048
#ifdef TLS_DEBUG
printf("sec=");
1049
{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",mac_sec[z]); printf("\n"); }
1050 1051 1052 1053 1054
printf("seq=");
{int z; for (z=0; z<8; z++) printf("%02X ",seq[z]); printf("\n"); }
printf("buf=");
{int z; for (z=0; z<5; z++) printf("%02X ",buf[z]); printf("\n"); }
printf("rec=");
1055
{unsigned int z; for (z=0; z<rec->length; z++) printf("%02X ",buf[z]); printf("\n"); }
1056 1057
#endif

1058
	if (ssl->version != DTLS1_VERSION && ssl->version != DTLS1_BAD_VER)
1059
		{
B
Ben Laurie 已提交
1060 1061 1062 1063 1064
		for (i=7; i>=0; i--)
			{
			++seq[i];
			if (seq[i] != 0) break; 
			}
1065
		}
1066 1067

#ifdef TLS_DEBUG
1068
{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",md[z]); printf("\n"); }
1069 1070 1071 1072
#endif
	return(md_size);
	}

U
Ulf Möller 已提交
1073 1074
int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
	     int len)
1075 1076
	{
	unsigned char buff[SSL_MAX_MASTER_KEY_LENGTH];
1077
	const void *co = NULL, *so = NULL;
1078
	int col = 0, sol = 0;
1079

1080

1081
#ifdef KSSL_DEBUG
1082
	printf ("tls1_generate_master_secret(%p,%p, %p, %d)\n", s,out, p,len);
1083 1084
#endif	/* KSSL_DEBUG */

1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096
#ifdef TLSEXT_TYPE_opaque_prf_input
	if (s->s3->client_opaque_prf_input != NULL && s->s3->server_opaque_prf_input != NULL &&
	    s->s3->client_opaque_prf_input_len > 0 &&
	    s->s3->client_opaque_prf_input_len == s->s3->server_opaque_prf_input_len)
		{
		co = s->s3->client_opaque_prf_input;
		col = s->s3->server_opaque_prf_input_len;
		so = s->s3->server_opaque_prf_input;
		sol = s->s3->client_opaque_prf_input_len; /* must be same as col (see draft-rescorla-tls-opaque-prf-input-00.txt, section 3.1) */
		}
#endif

1097
	tls1_PRF(ssl_get_algorithm2(s),
1098 1099 1100 1101 1102 1103
		TLS_MD_MASTER_SECRET_CONST,TLS_MD_MASTER_SECRET_CONST_SIZE,
		s->s3->client_random,SSL3_RANDOM_SIZE,
		co, col,
		s->s3->server_random,SSL3_RANDOM_SIZE,
		so, sol,
		p,len,
1104
		s->session->master_key,buff,sizeof buff);
1105 1106 1107 1108 1109 1110 1111 1112 1113 1114
#ifdef SSL_DEBUG
	fprintf(stderr, "Premaster Secret:\n");
	BIO_dump_fp(stderr, (char *)p, len);
	fprintf(stderr, "Client Random:\n");
	BIO_dump_fp(stderr, (char *)s->s3->client_random, SSL3_RANDOM_SIZE);
	fprintf(stderr, "Server Random:\n");
	BIO_dump_fp(stderr, (char *)s->s3->server_random, SSL3_RANDOM_SIZE);
	fprintf(stderr, "Master Secret:\n");
	BIO_dump_fp(stderr, (char *)s->session->master_key, SSL3_MASTER_SECRET_SIZE);
#endif
1115

1116 1117 1118
#ifdef KSSL_DEBUG
	printf ("tls1_generate_master_secret() complete\n");
#endif	/* KSSL_DEBUG */
1119 1120 1121
	return(SSL3_MASTER_SECRET_SIZE);
	}

U
Ulf Möller 已提交
1122
int tls1_alert_code(int code)
1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143
	{
	switch (code)
		{
	case SSL_AD_CLOSE_NOTIFY:	return(SSL3_AD_CLOSE_NOTIFY);
	case SSL_AD_UNEXPECTED_MESSAGE:	return(SSL3_AD_UNEXPECTED_MESSAGE);
	case SSL_AD_BAD_RECORD_MAC:	return(SSL3_AD_BAD_RECORD_MAC);
	case SSL_AD_DECRYPTION_FAILED:	return(TLS1_AD_DECRYPTION_FAILED);
	case SSL_AD_RECORD_OVERFLOW:	return(TLS1_AD_RECORD_OVERFLOW);
	case SSL_AD_DECOMPRESSION_FAILURE:return(SSL3_AD_DECOMPRESSION_FAILURE);
	case SSL_AD_HANDSHAKE_FAILURE:	return(SSL3_AD_HANDSHAKE_FAILURE);
	case SSL_AD_NO_CERTIFICATE:	return(-1);
	case SSL_AD_BAD_CERTIFICATE:	return(SSL3_AD_BAD_CERTIFICATE);
	case SSL_AD_UNSUPPORTED_CERTIFICATE:return(SSL3_AD_UNSUPPORTED_CERTIFICATE);
	case SSL_AD_CERTIFICATE_REVOKED:return(SSL3_AD_CERTIFICATE_REVOKED);
	case SSL_AD_CERTIFICATE_EXPIRED:return(SSL3_AD_CERTIFICATE_EXPIRED);
	case SSL_AD_CERTIFICATE_UNKNOWN:return(SSL3_AD_CERTIFICATE_UNKNOWN);
	case SSL_AD_ILLEGAL_PARAMETER:	return(SSL3_AD_ILLEGAL_PARAMETER);
	case SSL_AD_UNKNOWN_CA:		return(TLS1_AD_UNKNOWN_CA);
	case SSL_AD_ACCESS_DENIED:	return(TLS1_AD_ACCESS_DENIED);
	case SSL_AD_DECODE_ERROR:	return(TLS1_AD_DECODE_ERROR);
	case SSL_AD_DECRYPT_ERROR:	return(TLS1_AD_DECRYPT_ERROR);
U
Ulf Möller 已提交
1144
	case SSL_AD_EXPORT_RESTRICTION:	return(TLS1_AD_EXPORT_RESTRICTION);
1145 1146 1147
	case SSL_AD_PROTOCOL_VERSION:	return(TLS1_AD_PROTOCOL_VERSION);
	case SSL_AD_INSUFFICIENT_SECURITY:return(TLS1_AD_INSUFFICIENT_SECURITY);
	case SSL_AD_INTERNAL_ERROR:	return(TLS1_AD_INTERNAL_ERROR);
U
Ulf Möller 已提交
1148
	case SSL_AD_USER_CANCELLED:	return(TLS1_AD_USER_CANCELLED);
1149
	case SSL_AD_NO_RENEGOTIATION:	return(TLS1_AD_NO_RENEGOTIATION);
1150 1151
	case SSL_AD_UNSUPPORTED_EXTENSION: return(TLS1_AD_UNSUPPORTED_EXTENSION);
	case SSL_AD_CERTIFICATE_UNOBTAINABLE: return(TLS1_AD_CERTIFICATE_UNOBTAINABLE);
1152
	case SSL_AD_UNRECOGNIZED_NAME:	return(TLS1_AD_UNRECOGNIZED_NAME);
1153 1154
	case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE: return(TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE);
	case SSL_AD_BAD_CERTIFICATE_HASH_VALUE: return(TLS1_AD_BAD_CERTIFICATE_HASH_VALUE);
1155
	case SSL_AD_UNKNOWN_PSK_IDENTITY:return(TLS1_AD_UNKNOWN_PSK_IDENTITY);
B
Ben Laurie 已提交
1156 1157 1158
#ifndef OPENSSL_NO_SRP
	case SSL_AD_MISSING_SRP_USERNAME:return(TLS1_AD_MISSING_SRP_USERNAME);
#endif
1159
#if 0 /* not appropriate for TLS, not used for DTLS */
B
Ben Laurie 已提交
1160 1161
	case DTLS1_AD_MISSING_HANDSHAKE_MESSAGE: return 
					  (DTLS1_AD_MISSING_HANDSHAKE_MESSAGE);
1162
#endif
1163 1164 1165 1166
	default:			return(-1);
		}
	}

D
Dr. Stephen Henson 已提交
1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178
int SSL_tls1_key_exporter(SSL *s, unsigned char *label, int label_len,
                           unsigned char *context, int context_len,
                           unsigned char *out, int olen)
	{
	unsigned char *tmp;
	int rv;

	tmp = OPENSSL_malloc(olen);

	if (!tmp)
		return 0;
	
1179
	rv = tls1_PRF(ssl_get_algorithm2(s),
D
Dr. Stephen Henson 已提交
1180 1181 1182 1183 1184 1185 1186 1187 1188 1189
			 label, label_len,
			 s->s3->client_random,SSL3_RANDOM_SIZE,
			 s->s3->server_random,SSL3_RANDOM_SIZE,
			 context, context_len, NULL, 0,
			 s->session->master_key, s->session->master_key_length,
			 out, tmp, olen);

	OPENSSL_free(tmp);
	return rv;
	}