t1_enc.c 32.5 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 174 175
	EVP_MD_CTX_init(&ctx);
	EVP_MD_CTX_init(&ctx_tmp);
	mac_key = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, sec, sec_len);
	if (!mac_key)
D
Dr. Stephen Henson 已提交
176
		goto err;
177
	if (!EVP_DigestSignInit(&ctx,NULL,md, NULL, mac_key))
D
Dr. Stephen Henson 已提交
178
		goto err;
179
	if (!EVP_DigestSignInit(&ctx_tmp,NULL,md, NULL, mac_key))
D
Dr. Stephen Henson 已提交
180
		goto err;
181
	if (seed1 && !EVP_DigestSignUpdate(&ctx,seed1,seed1_len))
D
Dr. Stephen Henson 已提交
182
		goto err;
183
	if (seed2 && !EVP_DigestSignUpdate(&ctx,seed2,seed2_len))
D
Dr. Stephen Henson 已提交
184
		goto err;
185
	if (seed3 && !EVP_DigestSignUpdate(&ctx,seed3,seed3_len))
D
Dr. Stephen Henson 已提交
186
		goto err;
187
	if (seed4 && !EVP_DigestSignUpdate(&ctx,seed4,seed4_len))
D
Dr. Stephen Henson 已提交
188
		goto err;
189 190 191
	if (seed5 && !EVP_DigestSignUpdate(&ctx,seed5,seed5_len))
		goto err;
	if (!EVP_DigestSignFinal(&ctx,A1,&A1_len))
D
Dr. Stephen Henson 已提交
192
		goto err;
193 194 195

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

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

243
/* seed1 through seed5 are virtually concatenated */
D
Dr. Stephen Henson 已提交
244
static int tls1_PRF(long digest_mask,
245 246 247 248 249 250 251
		     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 已提交
252
		     unsigned char *out2, int olen)
253
	{
254 255 256 257
	int len,i,idx,count;
	const unsigned char *S1;
	long m;
	const EVP_MD *md;
D
Dr. Stephen Henson 已提交
258
	int ret = 0;
259

260
	/* Count number of digests and partition sec evenly */
261 262 263 264 265
	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;
266
	S1=sec;
267 268 269 270 271 272
	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 已提交
273
				goto err;				
274
			}
D
Dr. Stephen Henson 已提交
275 276 277 278
			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;
279 280 281 282 283 284
			S1+=len;
			for (i=0; i<olen; i++)
			{
				out1[i]^=out2[i];
			}
		}
285
	}
D
Dr. Stephen Henson 已提交
286 287 288
	ret = 1;
err:
	return ret;
289
}
D
Dr. Stephen Henson 已提交
290
static int tls1_generate_key_block(SSL *s, unsigned char *km,
U
Ulf Möller 已提交
291
	     unsigned char *tmp, int num)
292
	{
D
Dr. Stephen Henson 已提交
293 294
	int ret;
	ret = tls1_PRF(s->s3->tmp.new_cipher->algorithm2,
295 296 297 298
		 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 已提交
299 300
		 s->session->master_key,s->session->master_key_length,
		 km,tmp,num);
301 302 303 304 305 306 307 308 309 310 311
#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 已提交
312
	return ret;
313 314
	}

U
Ulf Möller 已提交
315
int tls1_change_cipher_state(SSL *s, int which)
316
	{
B
Ben Laurie 已提交
317
	static const unsigned char empty[]="";
B
Ben Laurie 已提交
318
	unsigned char *p,*mac_secret;
319
	unsigned char *exp_label;
320 321 322 323
	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 已提交
324
	unsigned char *ms,*key,*iv;
325 326
	int client_write;
	EVP_CIPHER_CTX *dd;
B
Ben Laurie 已提交
327
	const EVP_CIPHER *c;
328
#ifndef OPENSSL_NO_COMP
B
Ben Laurie 已提交
329
	const SSL_COMP *comp;
330
#endif
B
Ben Laurie 已提交
331
	const EVP_MD *m;
332 333 334 335
	int mac_type;
	int *mac_secret_size;
	EVP_MD_CTX *mac_ctx;
	EVP_PKEY *mac_key;
B
Bodo Möller 已提交
336 337
	int is_export,n,i,j,k,exp_label_len,cl;
	int reuse_dd = 0;
338

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

347 348
#ifdef KSSL_DEBUG
	printf("tls1_change_cipher_state(which= %d) w/\n", which);
349 350 351
	printf("\talg= %ld/%ld, comp= %p\n",
	       s->s3->tmp.new_cipher->algorithm_mkey,
	       s->s3->tmp.new_cipher->algorithm_auth,
352 353 354 355
	       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);
356 357
	printf("\tkey_block: len= %d, data= ", s->s3->tmp.key_block_length);
	{
358 359 360
        int i;
        for (i=0; i<s->s3->tmp.key_block_length; i++)
		printf("%02x", key_block[i]);  printf("\n");
361 362 363
        }
#endif	/* KSSL_DEBUG */

364 365
	if (which & SSL3_CC_READ)
		{
366 367 368 369 370
		if (s->s3->tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC)
			s->mac_flags |= SSL_MAC_FLAG_READ_MAC_STREAM;
			else
			s->mac_flags &= ~SSL_MAC_FLAG_READ_MAC_STREAM;

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

B
Bodo Möller 已提交
445 446
	if (reuse_dd)
		EVP_CIPHER_CTX_cleanup(dd);
447 448

	p=s->s3->tmp.key_block;
449 450
	i=*mac_secret_size=s->s3->tmp.new_mac_secret_size;

451
	cl=EVP_CIPHER_key_length(c);
B
Bodo Möller 已提交
452 453
	j=is_export ? (cl < SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher) ?
	               cl : SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher)) : cl;
454
	/* Was j=(exp)?5:EVP_CIPHER_key_length(c); */
455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478
	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;
		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 已提交
479
		SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,ERR_R_INTERNAL_ERROR);
480 481 482 483
		goto err2;
		}

	memcpy(mac_secret,ms,i);
484 485 486 487
	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);
488 489 490 491
#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 已提交
492
	if (is_export)
493 494 495 496
		{
		/* In here I set both the read and write key/iv to the
		 * same value since only the correct one will be used :-).
		 */
D
Dr. Stephen Henson 已提交
497 498 499 500 501 502 503
		if (!tls1_PRF(s->s3->tmp.new_cipher->algorithm2,
				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;
504 505 506 507
		key=tmp1;

		if (k > 0)
			{
D
Dr. Stephen Henson 已提交
508 509 510 511 512 513 514
			if (!tls1_PRF(s->s3->tmp.new_cipher->algorithm2,
					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;
515 516 517 518 519 520 521 522
			if (client_write)
				iv=iv1;
			else
				iv= &(iv1[k]);
			}
		}

	s->session->key_arg_length=0;
523 524
#ifdef KSSL_DEBUG
	{
525
        int i;
526
	printf("EVP_CipherInit_ex(dd,c,key=,iv=,which)\n");
527
	printf("\tkey= "); for (i=0; i<c->key_len; i++) printf("%02x", key[i]);
528
	printf("\n");
529
	printf("\t iv= "); for (i=0; i<c->iv_len; i++) printf("%02x", iv[i]);
530 531 532
	printf("\n");
	}
#endif	/* KSSL_DEBUG */
533

534
	EVP_CipherInit_ex(dd,c,NULL,key,iv,(which & SSL3_CC_WRITE));
535 536 537 538 539 540 541 542
#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

543 544 545 546
	OPENSSL_cleanse(tmp1,sizeof(tmp1));
	OPENSSL_cleanse(tmp2,sizeof(tmp1));
	OPENSSL_cleanse(iv1,sizeof(iv1));
	OPENSSL_cleanse(iv2,sizeof(iv2));
547 548 549 550 551 552 553
	return(1);
err:
	SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,ERR_R_MALLOC_FAILURE);
err2:
	return(0);
	}

U
Ulf Möller 已提交
554
int tls1_setup_key_block(SSL *s)
555
	{
D
Dr. Stephen Henson 已提交
556
	unsigned char *p1,*p2=NULL;
B
Ben Laurie 已提交
557 558
	const EVP_CIPHER *c;
	const EVP_MD *hash;
559
	int num;
560
	SSL_COMP *comp;
561
	int mac_type= NID_undef,mac_secret_size=0;
D
Dr. Stephen Henson 已提交
562
	int ret=0;
563

564 565 566 567
#ifdef KSSL_DEBUG
	printf ("tls1_setup_key_block()\n");
#endif	/* KSSL_DEBUG */

568 569 570
	if (s->s3->tmp.key_block_length != 0)
		return(1);

571
	if (!ssl_cipher_get_evp(s->session,&c,&hash,&mac_type,&mac_secret_size,&comp))
572 573 574 575 576 577 578
		{
		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;
579 580 581
	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);
582 583 584 585
	num*=2;

	ssl3_cleanup_key_block(s);

586
	if ((p1=(unsigned char *)OPENSSL_malloc(num)) == NULL)
D
Dr. Stephen Henson 已提交
587 588
		{
		SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE);
589
		goto err;
D
Dr. Stephen Henson 已提交
590
		}
591 592 593 594

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

D
Dr. Stephen Henson 已提交
595 596 597 598 599
	if ((p2=(unsigned char *)OPENSSL_malloc(num)) == NULL)
		{
		SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE);
		goto err;
		}
600 601 602 603 604 605 606 607 608

#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 已提交
609 610
	if (!tls1_generate_key_block(s,p1,p2,num))
		goto err;
611 612 613 614 615
#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

616 617
	if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)
		&& s->method->version <= TLS1_VERSION)
618 619 620 621 622 623
		{
		/* enable vulnerability countermeasure for CBC ciphers with
		 * known-IV problem (http://www.openssl.org/~bodo/tls-cbc.txt)
		 */
		s->s3->need_empty_fragments = 1;

624 625
		if (s->session->cipher != NULL)
			{
626
			if (s->session->cipher->algorithm_enc == SSL_eNULL)
627 628 629
				s->s3->need_empty_fragments = 0;
			
#ifndef OPENSSL_NO_RC4
630
			if (s->session->cipher->algorithm_enc == SSL_RC4)
631
				s->s3->need_empty_fragments = 0;
632
#endif
633
			}
634
		}
635
		
D
Dr. Stephen Henson 已提交
636
	ret = 1;
637
err:
D
Dr. Stephen Henson 已提交
638 639 640 641 642 643
	if (p2)
		{
		OPENSSL_cleanse(p2,num);
		OPENSSL_free(p2);
		}
	return(ret);
644 645
	}

U
Ulf Möller 已提交
646
int tls1_enc(SSL *s, int send)
647 648 649 650 651
	{
	SSL3_RECORD *rec;
	EVP_CIPHER_CTX *ds;
	unsigned long l;
	int bs,i,ii,j,k,n=0;
B
Ben Laurie 已提交
652
	const EVP_CIPHER *enc;
653 654 655

	if (send)
		{
656
		if (EVP_MD_CTX_md(s->write_hash))
657
			{
658
			n=EVP_MD_CTX_size(s->write_hash);
659 660
			OPENSSL_assert(n >= 0);
			}
661 662 663
		ds=s->enc_write_ctx;
		rec= &(s->s3->wrec);
		if (s->enc_write_ctx == NULL)
664
			enc=NULL;
665
		else
666 667
			{
			int ivlen;
668
			enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
669
			/* For TLSv1.1 and later explicit IV */
670 671
			if (s->version >= TLS1_1_VERSION
				&& EVP_CIPHER_mode(enc) == EVP_CIPH_CBC_MODE)
672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687
				ivlen = EVP_CIPHER_iv_length(enc);
			else
				ivlen = 0;
			if (ivlen > 1)
				{
				if ( rec->data != rec->input)
				/* we can't write into the input stream:
				 * Can this ever happen?? (steve)
				 */
				fprintf(stderr,
					"%s:%d: rec->data != rec->input\n",
					__FILE__, __LINE__);
				else if (RAND_bytes(rec->input, ivlen) <= 0)
					return -1;
				}
			}
688 689 690
		}
	else
		{
691
		if (EVP_MD_CTX_md(s->read_hash))
692
			{
693
			n=EVP_MD_CTX_size(s->read_hash);
694 695
			OPENSSL_assert(n >= 0);
			}
696 697 698
		ds=s->enc_read_ctx;
		rec= &(s->s3->rrec);
		if (s->enc_read_ctx == NULL)
699
			enc=NULL;
700 701 702 703
		else
			enc=EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
		}

704 705 706 707
#ifdef KSSL_DEBUG
	printf("tls1_enc(%d)\n", send);
#endif    /* KSSL_DEBUG */

708
	if ((s->session == NULL) || (ds == NULL) ||
709
		(enc == NULL))
710
		{
711
		memmove(rec->data,rec->input,rec->length);
712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737
		rec->input=rec->data;
		}
	else
		{
		l=rec->length;
		bs=EVP_CIPHER_block_size(ds->cipher);

		if ((bs != 1) && send)
			{
			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;
			}

738 739
#ifdef KSSL_DEBUG
		{
740
                unsigned long ui;
741
		printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n",
742 743 744 745 746
                        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);
747 748 749 750
		printf("\t\tIV: ");
		for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]);
		printf("\n");
		printf("\trec->input=");
751
		for (ui=0; ui<l; ui++) printf(" %02x", rec->input[ui]);
752 753 754 755
		printf("\n");
		}
#endif	/* KSSL_DEBUG */

756 757 758 759
		if (!send)
			{
			if (l == 0 || l%bs != 0)
				{
760 761
				if (s->version >= TLS1_1_VERSION)
					return -1;
762
				SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
763 764
				ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED);
				return 0;
765 766 767
				}
			}
		
768 769
		EVP_Cipher(ds,rec->data,rec->input,l);

770 771
#ifdef KSSL_DEBUG
		{
772
                unsigned long i;
773
                printf("\trec->data=");
774 775
		for (i=0; i<l; i++)
                        printf(" %02x", rec->data[i]);  printf("\n");
776 777 778
                }
#endif	/* KSSL_DEBUG */

779 780
		if ((bs != 1) && !send)
			{
781
			ii=i=rec->data[l-1]; /* padding_length */
782
			i++;
D
Dr. Stephen Henson 已提交
783 784 785 786 787 788 789 790 791
			/* 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)
792 793 794 795 796 797 798 799
				{
				/* 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--;
				}
800 801
			/* TLS 1.0 does not bound the number of padding bytes by the block size.
			 * All of them must have value 'padding_length'. */
802 803
			if (i > (int)rec->length)
				{
804 805
				/* Incorrect padding. SSLerr() and ssl3_alert are done
				 * by caller: we don't want to reveal whether this is
B
comment  
Bodo Möller 已提交
806 807
				 * a decryption error or a MAC verification failure
				 * (see http://www.openssl.org/~bodo/tls-cbc.txt) */
808
				return -1;
809 810 811 812 813
				}
			for (j=(int)(l-i); j<(int)l; j++)
				{
				if (rec->data[j] != ii)
					{
814 815
					/* Incorrect padding */
					return -1;
816 817
					}
				}
818
			rec->length -=i;
819 820
			if (s->version >= TLS1_1_VERSION
				&& EVP_CIPHER_CTX_mode(ds) == EVP_CIPH_CBC_MODE)
821 822 823 824 825
				{
				rec->data += bs;    /* skip the explicit IV */
				rec->input += bs;
				rec->length -= bs;
				}
826 827 828 829
			}
		}
	return(1);
	}
830
int tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *out)
831 832
	{
	unsigned int ret;
833 834 835 836
	EVP_MD_CTX ctx, *d=NULL;
	int i;

	if (s->s3->handshake_buffer) 
837 838 839
		if (!ssl3_digest_cached_records(s))
			return 0;

840 841 842 843 844 845 846 847 848 849 850 851
	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;
	}	
852

853
	EVP_MD_CTX_init(&ctx);
854
	EVP_MD_CTX_copy_ex(&ctx,d);
D
 
Dr. Stephen Henson 已提交
855
	EVP_DigestFinal_ex(&ctx,out,&ret);
856
	EVP_MD_CTX_cleanup(&ctx);
857 858 859
	return((int)ret);
	}

860
int tls1_final_finish_mac(SSL *s,
B
Bodo Möller 已提交
861
	     const char *str, int slen, unsigned char *out)
862 863 864
	{
	unsigned int i;
	EVP_MD_CTX ctx;
865
	unsigned char buf[2*EVP_MAX_MD_SIZE];
866
	unsigned char *q,buf2[12];
867 868
	int idx;
	long mask;
869
	int err=0;
870
	const EVP_MD *md; 
871 872 873

	q=buf;

874
	if (s->s3->handshake_buffer) 
875 876 877 878
		if (!ssl3_digest_cached_records(s))
			return 0;

	EVP_MD_CTX_init(&ctx);
879

880 881 882 883
	for (idx=0;ssl_get_handshake_digest(idx,&mask,&md);idx++)
		{
		if (mask & s->s3->tmp.new_cipher->algorithm2)
			{
884 885
			int hashsize = EVP_MD_size(md);
			if (hashsize < 0 || hashsize > (int)(sizeof buf - (size_t)(q-buf)))
886 887 888 889 890 891 892 893
				{
				/* 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);
894
				if (i != (unsigned int)hashsize) /* can't really happen */
895 896 897 898
					err = 1;
				q+=i;
				}
			}
899
		}
900
		
D
Dr. Stephen Henson 已提交
901 902 903 904 905
	if (!tls1_PRF(s->s3->tmp.new_cipher->algorithm2,
			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;
906
	EVP_MD_CTX_cleanup(&ctx);
907

908 909 910 911
	if (err)
		return 0;
	else
		return sizeof buf2;
912 913
	}

U
Ulf Möller 已提交
914
int tls1_mac(SSL *ssl, unsigned char *md, int send)
915 916
	{
	SSL3_RECORD *rec;
B
Ben Laurie 已提交
917
	unsigned char *seq;
918 919
	EVP_MD_CTX *hash;
	size_t md_size;
920
	int i;
921
	EVP_MD_CTX hmac, *mac_ctx;
922
	unsigned char buf[5]; 
923
	int stream_mac = (send?(ssl->mac_flags & SSL_MAC_FLAG_WRITE_MAC_STREAM):(ssl->mac_flags&SSL_MAC_FLAG_READ_MAC_STREAM));
924
	int t;
925

926 927 928 929 930 931 932 933 934 935 936 937 938
	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;
		}

939 940 941
	t=EVP_MD_CTX_size(hash);
	OPENSSL_assert(t >= 0);
	md_size=t;
942 943

	buf[0]=rec->type;
944 945
	buf[1]=(unsigned char)(ssl->version>>8);
	buf[2]=(unsigned char)(ssl->version);
946 947 948 949
	buf[3]=rec->length>>8;
	buf[4]=rec->length&0xff;

	/* I should fix this up TLS TLS TLS TLS TLS XXXXXXXX */
950 951 952 953 954 955 956 957
	if (stream_mac) 
		{
			mac_ctx = hash;
		}
		else
		{
			EVP_MD_CTX_copy(&hmac,hash);
			mac_ctx = &hmac;
958 959
		}

960
	if (ssl->version == DTLS1_VERSION || ssl->version == DTLS1_BAD_VER)
961 962 963 964 965 966 967 968 969 970 971
		{
		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);

972 973
	EVP_DigestSignUpdate(mac_ctx,buf,5);
	EVP_DigestSignUpdate(mac_ctx,rec->input,rec->length);
974 975 976
	t=EVP_DigestSignFinal(mac_ctx,md,&md_size);
	OPENSSL_assert(t > 0);
		
977
	if (!stream_mac) EVP_MD_CTX_cleanup(&hmac);
978 979
#ifdef TLS_DEBUG
printf("sec=");
980
{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",mac_sec[z]); printf("\n"); }
981 982 983 984 985
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=");
986
{unsigned int z; for (z=0; z<rec->length; z++) printf("%02X ",buf[z]); printf("\n"); }
987 988
#endif

989
	if (ssl->version != DTLS1_VERSION && ssl->version != DTLS1_BAD_VER)
990
		{
B
Ben Laurie 已提交
991 992 993 994 995
		for (i=7; i>=0; i--)
			{
			++seq[i];
			if (seq[i] != 0) break; 
			}
996
		}
997 998

#ifdef TLS_DEBUG
999
{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",md[z]); printf("\n"); }
1000 1001 1002 1003
#endif
	return(md_size);
	}

U
Ulf Möller 已提交
1004 1005
int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
	     int len)
1006 1007
	{
	unsigned char buff[SSL_MAX_MASTER_KEY_LENGTH];
1008
	const void *co = NULL, *so = NULL;
1009
	int col = 0, sol = 0;
1010

1011
#ifdef KSSL_DEBUG
1012
	printf ("tls1_generate_master_secret(%p,%p, %p, %d)\n", s,out, p,len);
1013 1014
#endif	/* KSSL_DEBUG */

1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026
#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

1027
	tls1_PRF(s->s3->tmp.new_cipher->algorithm2,
1028 1029 1030 1031 1032 1033
		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,
1034
		s->session->master_key,buff,sizeof buff);
1035

1036 1037 1038
#ifdef KSSL_DEBUG
	printf ("tls1_generate_master_secret() complete\n");
#endif	/* KSSL_DEBUG */
1039 1040 1041
	return(SSL3_MASTER_SECRET_SIZE);
	}

U
Ulf Möller 已提交
1042
int tls1_alert_code(int code)
1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
	{
	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 已提交
1064
	case SSL_AD_EXPORT_RESTRICTION:	return(TLS1_AD_EXPORT_RESTRICTION);
1065 1066 1067
	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 已提交
1068
	case SSL_AD_USER_CANCELLED:	return(TLS1_AD_USER_CANCELLED);
1069
	case SSL_AD_NO_RENEGOTIATION:	return(TLS1_AD_NO_RENEGOTIATION);
1070 1071
	case SSL_AD_UNSUPPORTED_EXTENSION: return(TLS1_AD_UNSUPPORTED_EXTENSION);
	case SSL_AD_CERTIFICATE_UNOBTAINABLE: return(TLS1_AD_CERTIFICATE_UNOBTAINABLE);
1072
	case SSL_AD_UNRECOGNIZED_NAME:	return(TLS1_AD_UNRECOGNIZED_NAME);
1073 1074
	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);
1075
	case SSL_AD_UNKNOWN_PSK_IDENTITY:return(TLS1_AD_UNKNOWN_PSK_IDENTITY);
1076
#if 0 /* not appropriate for TLS, not used for DTLS */
B
Ben Laurie 已提交
1077 1078
	case DTLS1_AD_MISSING_HANDSHAKE_MESSAGE: return 
					  (DTLS1_AD_MISSING_HANDSHAKE_MESSAGE);
1079
#endif
1080 1081 1082 1083
	default:			return(-1);
		}
	}

D
Dr. Stephen Henson 已提交
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106
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;
	
	rv = tls1_PRF(s->s3->tmp.new_cipher->algorithm2,
			 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;
	}