9885f24fe80b3cd20e62a18b36e5311bbb2a2308
[openssl.git] / ssl / t1_enc.c
1 /* ssl/t1_enc.c */
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-2007 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 2005 Nokia. All rights reserved.
113  *
114  * The portions of the attached software ("Contribution") is developed by
115  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
116  * license.
117  *
118  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
119  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
120  * support (see RFC 4279) to OpenSSL.
121  *
122  * No patent licenses or other rights except those expressly stated in
123  * the OpenSSL open source license shall be deemed granted or received
124  * expressly, by implication, estoppel, or otherwise.
125  *
126  * No assurances are provided by Nokia that the Contribution does not
127  * infringe the patent or other intellectual property rights of any third
128  * party or that the license provides you with all the necessary rights
129  * to make use of the Contribution.
130  *
131  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
132  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
133  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
134  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
135  * OTHERWISE.
136  */
137
138 #include <stdio.h>
139 #include "ssl_locl.h"
140 #ifndef OPENSSL_NO_COMP
141 # include <openssl/comp.h>
142 #endif
143 #include <openssl/evp.h>
144 #include <openssl/hmac.h>
145 #include <openssl/md5.h>
146 #include <openssl/rand.h>
147
148 /* seed1 through seed5 are virtually concatenated */
149 static int tls1_P_hash(const EVP_MD *md, const unsigned char *sec,
150                        int sec_len,
151                        const void *seed1, int seed1_len,
152                        const void *seed2, int seed2_len,
153                        const void *seed3, int seed3_len,
154                        const void *seed4, int seed4_len,
155                        const void *seed5, int seed5_len,
156                        unsigned char *out, int olen)
157 {
158     int chunk;
159     size_t j;
160     EVP_MD_CTX *ctx = NULL, *ctx_tmp = NULL, *ctx_init = NULL;
161     EVP_PKEY *mac_key = NULL;
162     unsigned char A1[EVP_MAX_MD_SIZE];
163     size_t A1_len;
164     int ret = 0;
165
166     chunk = EVP_MD_size(md);
167     OPENSSL_assert(chunk >= 0);
168
169     ctx = EVP_MD_CTX_new();
170     ctx_tmp = EVP_MD_CTX_new();
171     ctx_init = EVP_MD_CTX_new();
172     if (ctx == NULL || ctx_tmp == NULL || ctx_init == NULL)
173         goto err;
174     EVP_MD_CTX_set_flags(ctx_init, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
175     mac_key = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, sec, sec_len);
176     if (!mac_key)
177         goto err;
178     if (!EVP_DigestSignInit(ctx_init, NULL, md, NULL, mac_key))
179         goto err;
180     if (!EVP_MD_CTX_copy_ex(ctx, ctx_init))
181         goto err;
182     if (seed1 && !EVP_DigestSignUpdate(ctx, seed1, seed1_len))
183         goto err;
184     if (seed2 && !EVP_DigestSignUpdate(ctx, seed2, seed2_len))
185         goto err;
186     if (seed3 && !EVP_DigestSignUpdate(ctx, seed3, seed3_len))
187         goto err;
188     if (seed4 && !EVP_DigestSignUpdate(ctx, seed4, seed4_len))
189         goto err;
190     if (seed5 && !EVP_DigestSignUpdate(ctx, seed5, seed5_len))
191         goto err;
192     if (!EVP_DigestSignFinal(ctx, A1, &A1_len))
193         goto err;
194
195     for (;;) {
196         /* Reinit mac contexts */
197         if (!EVP_MD_CTX_copy_ex(ctx, ctx_init))
198             goto err;
199         if (!EVP_DigestSignUpdate(ctx, A1, A1_len))
200             goto err;
201         if (olen > chunk && !EVP_MD_CTX_copy_ex(ctx_tmp, ctx))
202             goto err;
203         if (seed1 && !EVP_DigestSignUpdate(ctx, seed1, seed1_len))
204             goto err;
205         if (seed2 && !EVP_DigestSignUpdate(ctx, seed2, seed2_len))
206             goto err;
207         if (seed3 && !EVP_DigestSignUpdate(ctx, seed3, seed3_len))
208             goto err;
209         if (seed4 && !EVP_DigestSignUpdate(ctx, seed4, seed4_len))
210             goto err;
211         if (seed5 && !EVP_DigestSignUpdate(ctx, seed5, seed5_len))
212             goto err;
213
214         if (olen > chunk) {
215             if (!EVP_DigestSignFinal(ctx, out, &j))
216                 goto err;
217             out += j;
218             olen -= j;
219             /* calc the next A1 value */
220             if (!EVP_DigestSignFinal(ctx_tmp, A1, &A1_len))
221                 goto err;
222         } else {                /* last one */
223
224             if (!EVP_DigestSignFinal(ctx, A1, &A1_len))
225                 goto err;
226             memcpy(out, A1, olen);
227             break;
228         }
229     }
230     ret = 1;
231  err:
232     EVP_PKEY_free(mac_key);
233     EVP_MD_CTX_free(ctx);
234     EVP_MD_CTX_free(ctx_tmp);
235     EVP_MD_CTX_free(ctx_init);
236     OPENSSL_cleanse(A1, sizeof(A1));
237     return ret;
238 }
239
240 /* seed1 through seed5 are virtually concatenated */
241 static int tls1_PRF(SSL *s,
242                     const void *seed1, int seed1_len,
243                     const void *seed2, int seed2_len,
244                     const void *seed3, int seed3_len,
245                     const void *seed4, int seed4_len,
246                     const void *seed5, int seed5_len,
247                     const unsigned char *sec, int slen,
248                     unsigned char *out1, unsigned char *out2, int olen)
249 {
250     const EVP_MD *md = ssl_prf_md(s);
251
252     if (md == NULL) {
253         /* Should never happen */
254         SSLerr(SSL_F_TLS1_PRF, ERR_R_INTERNAL_ERROR);
255         return 0;
256     }
257     if (EVP_MD_type(md) == NID_md5_sha1) {
258         int i;
259         if (!tls1_P_hash(EVP_md5(), sec, slen/2 + (slen & 1),
260                          seed1, seed1_len, seed2, seed2_len, seed3,
261                          seed3_len, seed4, seed4_len, seed5, seed5_len,
262                          out1, olen))
263             return 0;
264         if (!tls1_P_hash(EVP_sha1(), sec + slen/2, slen/2 + (slen & 1),
265                          seed1, seed1_len, seed2, seed2_len, seed3,
266                          seed3_len, seed4, seed4_len, seed5, seed5_len,
267                          out2, olen))
268             return 0;
269         for (i = 0; i < olen; i++)
270             out1[i] ^= out2[i];
271         return 1;
272     }
273     memset(out2, 0, olen);
274     if (!tls1_P_hash(md, sec, slen,
275                      seed1, seed1_len, seed2, seed2_len, seed3,
276                      seed3_len, seed4, seed4_len, seed5, seed5_len,
277                      out1, olen))
278         return 0;
279
280     return 1;
281 }
282
283 static int tls1_generate_key_block(SSL *s, unsigned char *km,
284                                    unsigned char *tmp, int num)
285 {
286     int ret;
287     ret = tls1_PRF(s,
288                    TLS_MD_KEY_EXPANSION_CONST,
289                    TLS_MD_KEY_EXPANSION_CONST_SIZE, s->s3->server_random,
290                    SSL3_RANDOM_SIZE, s->s3->client_random, SSL3_RANDOM_SIZE,
291                    NULL, 0, NULL, 0, s->session->master_key,
292                    s->session->master_key_length, km, tmp, num);
293
294     return ret;
295 }
296
297 int tls1_change_cipher_state(SSL *s, int which)
298 {
299     unsigned char *p, *mac_secret;
300     unsigned char tmp1[EVP_MAX_KEY_LENGTH];
301     unsigned char tmp2[EVP_MAX_KEY_LENGTH];
302     unsigned char iv1[EVP_MAX_IV_LENGTH * 2];
303     unsigned char iv2[EVP_MAX_IV_LENGTH * 2];
304     unsigned char *ms, *key, *iv;
305     EVP_CIPHER_CTX *dd;
306     const EVP_CIPHER *c;
307 #ifndef OPENSSL_NO_COMP
308     const SSL_COMP *comp;
309 #endif
310     const EVP_MD *m;
311     int mac_type;
312     int *mac_secret_size;
313     EVP_MD_CTX *mac_ctx;
314     EVP_PKEY *mac_key;
315     int n, i, j, k, cl;
316     int reuse_dd = 0;
317
318     c = s->s3->tmp.new_sym_enc;
319     m = s->s3->tmp.new_hash;
320     mac_type = s->s3->tmp.new_mac_pkey_type;
321 #ifndef OPENSSL_NO_COMP
322     comp = s->s3->tmp.new_compression;
323 #endif
324
325     if (which & SSL3_CC_READ) {
326         if (s->s3->tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC)
327             s->mac_flags |= SSL_MAC_FLAG_READ_MAC_STREAM;
328         else
329             s->mac_flags &= ~SSL_MAC_FLAG_READ_MAC_STREAM;
330
331         if (s->enc_read_ctx != NULL)
332             reuse_dd = 1;
333         else if ((s->enc_read_ctx = EVP_CIPHER_CTX_new()) == NULL)
334             goto err;
335         else
336             /*
337              * make sure it's intialized in case we exit later with an error
338              */
339             EVP_CIPHER_CTX_reset(s->enc_read_ctx);
340         dd = s->enc_read_ctx;
341         mac_ctx = ssl_replace_hash(&s->read_hash, NULL);
342         if (mac_ctx == NULL)
343             goto err;
344 #ifndef OPENSSL_NO_COMP
345         COMP_CTX_free(s->expand);
346         s->expand = NULL;
347         if (comp != NULL) {
348             s->expand = COMP_CTX_new(comp->method);
349             if (s->expand == NULL) {
350                 SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,
351                        SSL_R_COMPRESSION_LIBRARY_ERROR);
352                 goto err2;
353             }
354             if (!RECORD_LAYER_setup_comp_buffer(&s->rlayer))
355                 goto err;
356         }
357 #endif
358         /*
359          * this is done by dtls1_reset_seq_numbers for DTLS
360          */
361         if (!SSL_IS_DTLS(s))
362             RECORD_LAYER_reset_read_sequence(&s->rlayer);
363         mac_secret = &(s->s3->read_mac_secret[0]);
364         mac_secret_size = &(s->s3->read_mac_secret_size);
365     } else {
366         if (s->s3->tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC)
367             s->mac_flags |= SSL_MAC_FLAG_WRITE_MAC_STREAM;
368         else
369             s->mac_flags &= ~SSL_MAC_FLAG_WRITE_MAC_STREAM;
370         if (s->enc_write_ctx != NULL && !SSL_IS_DTLS(s))
371             reuse_dd = 1;
372         else if ((s->enc_write_ctx = EVP_CIPHER_CTX_new()) == NULL)
373             goto err;
374         dd = s->enc_write_ctx;
375         if (SSL_IS_DTLS(s)) {
376             mac_ctx = EVP_MD_CTX_new();
377             if (mac_ctx == NULL)
378                 goto err;
379             s->write_hash = mac_ctx;
380         } else {
381             mac_ctx = ssl_replace_hash(&s->write_hash, NULL);
382             if (mac_ctx == NULL)
383                 goto err;
384         }
385 #ifndef OPENSSL_NO_COMP
386         COMP_CTX_free(s->compress);
387         s->compress = NULL;
388         if (comp != NULL) {
389             s->compress = COMP_CTX_new(comp->method);
390             if (s->compress == NULL) {
391                 SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,
392                        SSL_R_COMPRESSION_LIBRARY_ERROR);
393                 goto err2;
394             }
395         }
396 #endif
397         /*
398          * this is done by dtls1_reset_seq_numbers for DTLS
399          */
400         if (!SSL_IS_DTLS(s))
401             RECORD_LAYER_reset_write_sequence(&s->rlayer);
402         mac_secret = &(s->s3->write_mac_secret[0]);
403         mac_secret_size = &(s->s3->write_mac_secret_size);
404     }
405
406     if (reuse_dd)
407         EVP_CIPHER_CTX_reset(dd);
408
409     p = s->s3->tmp.key_block;
410     i = *mac_secret_size = s->s3->tmp.new_mac_secret_size;
411
412     cl = EVP_CIPHER_key_length(c);
413     j = cl;
414     /* Was j=(exp)?5:EVP_CIPHER_key_length(c); */
415     /* If GCM/CCM mode only part of IV comes from PRF */
416     if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE)
417         k = EVP_GCM_TLS_FIXED_IV_LEN;
418     else if (EVP_CIPHER_mode(c) == EVP_CIPH_CCM_MODE)
419         k = EVP_CCM_TLS_FIXED_IV_LEN;
420     else
421         k = EVP_CIPHER_iv_length(c);
422     if ((which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) ||
423         (which == SSL3_CHANGE_CIPHER_SERVER_READ)) {
424         ms = &(p[0]);
425         n = i + i;
426         key = &(p[n]);
427         n += j + j;
428         iv = &(p[n]);
429         n += k + k;
430     } else {
431         n = i;
432         ms = &(p[n]);
433         n += i + j;
434         key = &(p[n]);
435         n += j + k;
436         iv = &(p[n]);
437         n += k;
438     }
439
440     if (n > s->s3->tmp.key_block_length) {
441         SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
442         goto err2;
443     }
444
445     memcpy(mac_secret, ms, i);
446
447     if (!(EVP_CIPHER_flags(c) & EVP_CIPH_FLAG_AEAD_CIPHER)) {
448         mac_key = EVP_PKEY_new_mac_key(mac_type, NULL,
449                                        mac_secret, *mac_secret_size);
450         if (mac_key == NULL
451                 || EVP_DigestSignInit(mac_ctx, NULL, m, NULL, mac_key) <= 0) {
452             EVP_PKEY_free(mac_key);
453             SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
454             goto err2;
455         }
456         EVP_PKEY_free(mac_key);
457     }
458 #ifdef TLS_DEBUG
459     printf("which = %04X\nmac key=", which);
460     {
461         int z;
462         for (z = 0; z < i; z++)
463             printf("%02X%c", ms[z], ((z + 1) % 16) ? ' ' : '\n');
464     }
465 #endif
466
467     if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE) {
468         if (!EVP_CipherInit_ex(dd, c, NULL, key, NULL, (which & SSL3_CC_WRITE))
469             || !EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_GCM_SET_IV_FIXED, k, iv)) {
470             SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
471             goto err2;
472         }
473     } else if (EVP_CIPHER_mode(c) == EVP_CIPH_CCM_MODE) {
474         int taglen;
475         if (s->s3->tmp.new_cipher->algorithm_enc & (SSL_AES128CCM8|SSL_AES256CCM8))
476             taglen = 8;
477         else
478             taglen = 16;
479         if (!EVP_CipherInit_ex(dd, c, NULL, NULL, NULL, (which & SSL3_CC_WRITE))
480             || !EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_AEAD_SET_IVLEN, 12, NULL)
481             || !EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_AEAD_SET_TAG, taglen, NULL)
482             || !EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_CCM_SET_IV_FIXED, k, iv)
483             || !EVP_CipherInit_ex(dd, NULL, NULL, key, NULL, -1)) {
484             SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
485             goto err2;
486         }
487     } else {
488         if (!EVP_CipherInit_ex(dd, c, NULL, key, iv, (which & SSL3_CC_WRITE))) {
489             SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
490             goto err2;
491         }
492     }
493     /* Needed for "composite" AEADs, such as RC4-HMAC-MD5 */
494     if ((EVP_CIPHER_flags(c) & EVP_CIPH_FLAG_AEAD_CIPHER) && *mac_secret_size
495         && !EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_AEAD_SET_MAC_KEY,
496                                 *mac_secret_size, mac_secret)) {
497         SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
498         goto err2;
499     }
500 #ifdef OPENSSL_SSL_TRACE_CRYPTO
501     if (s->msg_callback) {
502         int wh = which & SSL3_CC_WRITE ? TLS1_RT_CRYPTO_WRITE : 0;
503         if (*mac_secret_size)
504             s->msg_callback(2, s->version, wh | TLS1_RT_CRYPTO_MAC,
505                             mac_secret, *mac_secret_size,
506                             s, s->msg_callback_arg);
507         if (c->key_len)
508             s->msg_callback(2, s->version, wh | TLS1_RT_CRYPTO_KEY,
509                             key, c->key_len, s, s->msg_callback_arg);
510         if (k) {
511             if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE)
512                 wh |= TLS1_RT_CRYPTO_FIXED_IV;
513             else
514                 wh |= TLS1_RT_CRYPTO_IV;
515             s->msg_callback(2, s->version, wh, iv, k, s, s->msg_callback_arg);
516         }
517     }
518 #endif
519
520 #ifdef TLS_DEBUG
521     printf("which = %04X\nkey=", which);
522     {
523         int z;
524         for (z = 0; z < EVP_CIPHER_key_length(c); z++)
525             printf("%02X%c", key[z], ((z + 1) % 16) ? ' ' : '\n');
526     }
527     printf("\niv=");
528     {
529         int z;
530         for (z = 0; z < k; z++)
531             printf("%02X%c", iv[z], ((z + 1) % 16) ? ' ' : '\n');
532     }
533     printf("\n");
534 #endif
535
536     OPENSSL_cleanse(tmp1, sizeof(tmp1));
537     OPENSSL_cleanse(tmp2, sizeof(tmp1));
538     OPENSSL_cleanse(iv1, sizeof(iv1));
539     OPENSSL_cleanse(iv2, sizeof(iv2));
540     return (1);
541  err:
542     SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE, ERR_R_MALLOC_FAILURE);
543  err2:
544     OPENSSL_cleanse(tmp1, sizeof(tmp1));
545     OPENSSL_cleanse(tmp2, sizeof(tmp1));
546     OPENSSL_cleanse(iv1, sizeof(iv1));
547     OPENSSL_cleanse(iv2, sizeof(iv2));
548     return (0);
549 }
550
551 int tls1_setup_key_block(SSL *s)
552 {
553     unsigned char *p1, *p2 = NULL;
554     const EVP_CIPHER *c;
555     const EVP_MD *hash;
556     int num;
557     SSL_COMP *comp;
558     int mac_type = NID_undef, mac_secret_size = 0;
559     int ret = 0;
560
561     if (s->s3->tmp.key_block_length != 0)
562         return (1);
563
564     if (!ssl_cipher_get_evp
565         (s->session, &c, &hash, &mac_type, &mac_secret_size, &comp,
566          SSL_USE_ETM(s))) {
567         SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK, SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
568         return (0);
569     }
570
571     s->s3->tmp.new_sym_enc = c;
572     s->s3->tmp.new_hash = hash;
573     s->s3->tmp.new_mac_pkey_type = mac_type;
574     s->s3->tmp.new_mac_secret_size = mac_secret_size;
575     num =
576         EVP_CIPHER_key_length(c) + mac_secret_size + EVP_CIPHER_iv_length(c);
577     num *= 2;
578
579     ssl3_cleanup_key_block(s);
580
581     if ((p1 = OPENSSL_malloc(num)) == NULL) {
582         SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK, ERR_R_MALLOC_FAILURE);
583         goto err;
584     }
585
586     s->s3->tmp.key_block_length = num;
587     s->s3->tmp.key_block = p1;
588
589     if ((p2 = OPENSSL_malloc(num)) == NULL) {
590         SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK, ERR_R_MALLOC_FAILURE);
591         OPENSSL_free(p1);
592         goto err;
593     }
594 #ifdef TLS_DEBUG
595     printf("client random\n");
596     {
597         int z;
598         for (z = 0; z < SSL3_RANDOM_SIZE; z++)
599             printf("%02X%c", s->s3->client_random[z],
600                    ((z + 1) % 16) ? ' ' : '\n');
601     }
602     printf("server random\n");
603     {
604         int z;
605         for (z = 0; z < SSL3_RANDOM_SIZE; z++)
606             printf("%02X%c", s->s3->server_random[z],
607                    ((z + 1) % 16) ? ' ' : '\n');
608     }
609     printf("master key\n");
610     {
611         int z;
612         for (z = 0; z < s->session->master_key_length; z++)
613             printf("%02X%c", s->session->master_key[z],
614                    ((z + 1) % 16) ? ' ' : '\n');
615     }
616 #endif
617     if (!tls1_generate_key_block(s, p1, p2, num))
618         goto err;
619 #ifdef TLS_DEBUG
620     printf("\nkey block\n");
621     {
622         int z;
623         for (z = 0; z < num; z++)
624             printf("%02X%c", p1[z], ((z + 1) % 16) ? ' ' : '\n');
625     }
626 #endif
627
628     if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)
629         && s->method->version <= TLS1_VERSION) {
630         /*
631          * enable vulnerability countermeasure for CBC ciphers with known-IV
632          * problem (http://www.openssl.org/~bodo/tls-cbc.txt)
633          */
634         s->s3->need_empty_fragments = 1;
635
636         if (s->session->cipher != NULL) {
637             if (s->session->cipher->algorithm_enc == SSL_eNULL)
638                 s->s3->need_empty_fragments = 0;
639
640 #ifndef OPENSSL_NO_RC4
641             if (s->session->cipher->algorithm_enc == SSL_RC4)
642                 s->s3->need_empty_fragments = 0;
643 #endif
644         }
645     }
646
647     ret = 1;
648  err:
649     OPENSSL_clear_free(p2, num);
650     return (ret);
651 }
652
653 int tls1_final_finish_mac(SSL *s, const char *str, int slen,
654                           unsigned char *out)
655 {
656     int hashlen;
657     unsigned char hash[EVP_MAX_MD_SIZE];
658     unsigned char buf2[12];
659
660     if (!ssl3_digest_cached_records(s, 0))
661         return 0;
662
663     hashlen = ssl_handshake_hash(s, hash, sizeof(hash));
664
665     if (hashlen == 0)
666         return 0;
667
668     if (!tls1_PRF(s,
669                   str, slen, hash, hashlen, NULL, 0, NULL, 0, NULL, 0,
670                   s->session->master_key, s->session->master_key_length,
671                   out, buf2, sizeof buf2))
672         return 0;
673     OPENSSL_cleanse(hash, hashlen);
674     OPENSSL_cleanse(buf2, sizeof(buf2));
675     return sizeof(buf2);
676 }
677
678 int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
679                                 int len)
680 {
681     unsigned char buff[SSL_MAX_MASTER_KEY_LENGTH];
682
683     if (s->session->flags & SSL_SESS_FLAG_EXTMS) {
684         unsigned char hash[EVP_MAX_MD_SIZE * 2];
685         int hashlen;
686         /* Digest cached records keeping record buffer (if present):
687          * this wont affect client auth because we're freezing the buffer
688          * at the same point (after client key exchange and before certificate
689          * verify)
690          */
691         if (!ssl3_digest_cached_records(s, 1))
692             return -1;
693         hashlen = ssl_handshake_hash(s, hash, sizeof(hash));
694 #ifdef SSL_DEBUG
695         fprintf(stderr, "Handshake hashes:\n");
696         BIO_dump_fp(stderr, (char *)hash, hashlen);
697 #endif
698         tls1_PRF(s,
699                  TLS_MD_EXTENDED_MASTER_SECRET_CONST,
700                  TLS_MD_EXTENDED_MASTER_SECRET_CONST_SIZE,
701                  hash, hashlen,
702                  NULL, 0,
703                  NULL, 0,
704                  NULL, 0, p, len, s->session->master_key, buff, sizeof buff);
705         OPENSSL_cleanse(hash, hashlen);
706     } else {
707         tls1_PRF(s,
708                  TLS_MD_MASTER_SECRET_CONST,
709                  TLS_MD_MASTER_SECRET_CONST_SIZE,
710                  s->s3->client_random, SSL3_RANDOM_SIZE,
711                  NULL, 0,
712                  s->s3->server_random, SSL3_RANDOM_SIZE,
713                  NULL, 0, p, len, s->session->master_key, buff, sizeof buff);
714     }
715     OPENSSL_cleanse(buff, sizeof buff);
716 #ifdef SSL_DEBUG
717     fprintf(stderr, "Premaster Secret:\n");
718     BIO_dump_fp(stderr, (char *)p, len);
719     fprintf(stderr, "Client Random:\n");
720     BIO_dump_fp(stderr, (char *)s->s3->client_random, SSL3_RANDOM_SIZE);
721     fprintf(stderr, "Server Random:\n");
722     BIO_dump_fp(stderr, (char *)s->s3->server_random, SSL3_RANDOM_SIZE);
723     fprintf(stderr, "Master Secret:\n");
724     BIO_dump_fp(stderr, (char *)s->session->master_key,
725                 SSL3_MASTER_SECRET_SIZE);
726 #endif
727
728 #ifdef OPENSSL_SSL_TRACE_CRYPTO
729     if (s->msg_callback) {
730         s->msg_callback(2, s->version, TLS1_RT_CRYPTO_PREMASTER,
731                         p, len, s, s->msg_callback_arg);
732         s->msg_callback(2, s->version, TLS1_RT_CRYPTO_CLIENT_RANDOM,
733                         s->s3->client_random, SSL3_RANDOM_SIZE,
734                         s, s->msg_callback_arg);
735         s->msg_callback(2, s->version, TLS1_RT_CRYPTO_SERVER_RANDOM,
736                         s->s3->server_random, SSL3_RANDOM_SIZE,
737                         s, s->msg_callback_arg);
738         s->msg_callback(2, s->version, TLS1_RT_CRYPTO_MASTER,
739                         s->session->master_key,
740                         SSL3_MASTER_SECRET_SIZE, s, s->msg_callback_arg);
741     }
742 #endif
743
744     return (SSL3_MASTER_SECRET_SIZE);
745 }
746
747 int tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen,
748                                 const char *label, size_t llen,
749                                 const unsigned char *context,
750                                 size_t contextlen, int use_context)
751 {
752     unsigned char *buff;
753     unsigned char *val = NULL;
754     size_t vallen = 0, currentvalpos;
755     int rv;
756
757     buff = OPENSSL_malloc(olen);
758     if (buff == NULL)
759         goto err2;
760
761     /*
762      * construct PRF arguments we construct the PRF argument ourself rather
763      * than passing separate values into the TLS PRF to ensure that the
764      * concatenation of values does not create a prohibited label.
765      */
766     vallen = llen + SSL3_RANDOM_SIZE * 2;
767     if (use_context) {
768         vallen += 2 + contextlen;
769     }
770
771     val = OPENSSL_malloc(vallen);
772     if (val == NULL)
773         goto err2;
774     currentvalpos = 0;
775     memcpy(val + currentvalpos, (unsigned char *)label, llen);
776     currentvalpos += llen;
777     memcpy(val + currentvalpos, s->s3->client_random, SSL3_RANDOM_SIZE);
778     currentvalpos += SSL3_RANDOM_SIZE;
779     memcpy(val + currentvalpos, s->s3->server_random, SSL3_RANDOM_SIZE);
780     currentvalpos += SSL3_RANDOM_SIZE;
781
782     if (use_context) {
783         val[currentvalpos] = (contextlen >> 8) & 0xff;
784         currentvalpos++;
785         val[currentvalpos] = contextlen & 0xff;
786         currentvalpos++;
787         if ((contextlen > 0) || (context != NULL)) {
788             memcpy(val + currentvalpos, context, contextlen);
789         }
790     }
791
792     /*
793      * disallow prohibited labels note that SSL3_RANDOM_SIZE > max(prohibited
794      * label len) = 15, so size of val > max(prohibited label len) = 15 and
795      * the comparisons won't have buffer overflow
796      */
797     if (memcmp(val, TLS_MD_CLIENT_FINISH_CONST,
798                TLS_MD_CLIENT_FINISH_CONST_SIZE) == 0)
799         goto err1;
800     if (memcmp(val, TLS_MD_SERVER_FINISH_CONST,
801                TLS_MD_SERVER_FINISH_CONST_SIZE) == 0)
802         goto err1;
803     if (memcmp(val, TLS_MD_MASTER_SECRET_CONST,
804                TLS_MD_MASTER_SECRET_CONST_SIZE) == 0)
805         goto err1;
806     if (memcmp(val, TLS_MD_EXTENDED_MASTER_SECRET_CONST,
807                TLS_MD_EXTENDED_MASTER_SECRET_CONST_SIZE) == 0)
808         goto err1;
809     if (memcmp(val, TLS_MD_KEY_EXPANSION_CONST,
810                TLS_MD_KEY_EXPANSION_CONST_SIZE) == 0)
811         goto err1;
812
813     rv = tls1_PRF(s,
814                   val, vallen,
815                   NULL, 0,
816                   NULL, 0,
817                   NULL, 0,
818                   NULL, 0,
819                   s->session->master_key, s->session->master_key_length,
820                   out, buff, olen);
821
822     goto ret;
823  err1:
824     SSLerr(SSL_F_TLS1_EXPORT_KEYING_MATERIAL,
825            SSL_R_TLS_ILLEGAL_EXPORTER_LABEL);
826     rv = 0;
827     goto ret;
828  err2:
829     SSLerr(SSL_F_TLS1_EXPORT_KEYING_MATERIAL, ERR_R_MALLOC_FAILURE);
830     rv = 0;
831  ret:
832     CRYPTO_clear_free(val, vallen);
833     CRYPTO_clear_free(buff, olen);
834     return (rv);
835 }
836
837 int tls1_alert_code(int code)
838 {
839     switch (code) {
840     case SSL_AD_CLOSE_NOTIFY:
841         return (SSL3_AD_CLOSE_NOTIFY);
842     case SSL_AD_UNEXPECTED_MESSAGE:
843         return (SSL3_AD_UNEXPECTED_MESSAGE);
844     case SSL_AD_BAD_RECORD_MAC:
845         return (SSL3_AD_BAD_RECORD_MAC);
846     case SSL_AD_DECRYPTION_FAILED:
847         return (TLS1_AD_DECRYPTION_FAILED);
848     case SSL_AD_RECORD_OVERFLOW:
849         return (TLS1_AD_RECORD_OVERFLOW);
850     case SSL_AD_DECOMPRESSION_FAILURE:
851         return (SSL3_AD_DECOMPRESSION_FAILURE);
852     case SSL_AD_HANDSHAKE_FAILURE:
853         return (SSL3_AD_HANDSHAKE_FAILURE);
854     case SSL_AD_NO_CERTIFICATE:
855         return (-1);
856     case SSL_AD_BAD_CERTIFICATE:
857         return (SSL3_AD_BAD_CERTIFICATE);
858     case SSL_AD_UNSUPPORTED_CERTIFICATE:
859         return (SSL3_AD_UNSUPPORTED_CERTIFICATE);
860     case SSL_AD_CERTIFICATE_REVOKED:
861         return (SSL3_AD_CERTIFICATE_REVOKED);
862     case SSL_AD_CERTIFICATE_EXPIRED:
863         return (SSL3_AD_CERTIFICATE_EXPIRED);
864     case SSL_AD_CERTIFICATE_UNKNOWN:
865         return (SSL3_AD_CERTIFICATE_UNKNOWN);
866     case SSL_AD_ILLEGAL_PARAMETER:
867         return (SSL3_AD_ILLEGAL_PARAMETER);
868     case SSL_AD_UNKNOWN_CA:
869         return (TLS1_AD_UNKNOWN_CA);
870     case SSL_AD_ACCESS_DENIED:
871         return (TLS1_AD_ACCESS_DENIED);
872     case SSL_AD_DECODE_ERROR:
873         return (TLS1_AD_DECODE_ERROR);
874     case SSL_AD_DECRYPT_ERROR:
875         return (TLS1_AD_DECRYPT_ERROR);
876     case SSL_AD_EXPORT_RESTRICTION:
877         return (TLS1_AD_EXPORT_RESTRICTION);
878     case SSL_AD_PROTOCOL_VERSION:
879         return (TLS1_AD_PROTOCOL_VERSION);
880     case SSL_AD_INSUFFICIENT_SECURITY:
881         return (TLS1_AD_INSUFFICIENT_SECURITY);
882     case SSL_AD_INTERNAL_ERROR:
883         return (TLS1_AD_INTERNAL_ERROR);
884     case SSL_AD_USER_CANCELLED:
885         return (TLS1_AD_USER_CANCELLED);
886     case SSL_AD_NO_RENEGOTIATION:
887         return (TLS1_AD_NO_RENEGOTIATION);
888     case SSL_AD_UNSUPPORTED_EXTENSION:
889         return (TLS1_AD_UNSUPPORTED_EXTENSION);
890     case SSL_AD_CERTIFICATE_UNOBTAINABLE:
891         return (TLS1_AD_CERTIFICATE_UNOBTAINABLE);
892     case SSL_AD_UNRECOGNIZED_NAME:
893         return (TLS1_AD_UNRECOGNIZED_NAME);
894     case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE:
895         return (TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE);
896     case SSL_AD_BAD_CERTIFICATE_HASH_VALUE:
897         return (TLS1_AD_BAD_CERTIFICATE_HASH_VALUE);
898     case SSL_AD_UNKNOWN_PSK_IDENTITY:
899         return (TLS1_AD_UNKNOWN_PSK_IDENTITY);
900     case SSL_AD_INAPPROPRIATE_FALLBACK:
901         return (TLS1_AD_INAPPROPRIATE_FALLBACK);
902     default:
903         return (-1);
904     }
905 }