blob: 669f736cbdc02598d1019ce3c47d016e7e228fce [file] [log] [blame]
Adam Langley95c29f32014-06-20 12:00:00 -07001/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2 * All rights reserved.
3 *
4 * This package is an SSL implementation written
5 * by Eric Young (eay@cryptsoft.com).
6 * The implementation was written so as to conform with Netscapes SSL.
7 *
8 * This library is free for commercial and non-commercial use as long as
9 * the following conditions are aheared to. The following conditions
10 * apply to all code found in this distribution, be it the RC4, RSA,
11 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
12 * included with this distribution is covered by the same copyright terms
13 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14 *
15 * Copyright remains Eric Young's, and as such any Copyright notices in
16 * the code are not to be removed.
17 * If this package is used in a product, Eric Young should be given attribution
18 * as the author of the parts of the library used.
19 * This can be in the form of a textual message at program startup or
20 * in documentation (online or textual) provided with the package.
21 *
22 * Redistribution and use in source and binary forms, with or without
23 * modification, are permitted provided that the following conditions
24 * are met:
25 * 1. Redistributions of source code must retain the copyright
26 * notice, this list of conditions and the following disclaimer.
27 * 2. Redistributions in binary form must reproduce the above copyright
28 * notice, this list of conditions and the following disclaimer in the
29 * documentation and/or other materials provided with the distribution.
30 * 3. All advertising materials mentioning features or use of this software
31 * must display the following acknowledgement:
32 * "This product includes cryptographic software written by
33 * Eric Young (eay@cryptsoft.com)"
34 * The word 'cryptographic' can be left out if the rouines from the library
35 * being used are not cryptographic related :-).
36 * 4. If you include any Windows specific code (or a derivative thereof) from
37 * the apps directory (application code) you must include an acknowledgement:
38 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39 *
40 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50 * SUCH DAMAGE.
51 *
52 * The licence and distribution terms for any publically available version or
53 * derivative of this code cannot be changed. i.e. this code cannot simply be
54 * copied and put under another distribution licence
55 * [including the GNU Public Licence.]
56 */
57/* ====================================================================
58 * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved.
59 *
60 * Redistribution and use in source and binary forms, with or without
61 * modification, are permitted provided that the following conditions
62 * are met:
63 *
64 * 1. Redistributions of source code must retain the above copyright
65 * notice, this list of conditions and the following disclaimer.
66 *
67 * 2. Redistributions in binary form must reproduce the above copyright
68 * notice, this list of conditions and the following disclaimer in
69 * the documentation and/or other materials provided with the
70 * distribution.
71 *
72 * 3. All advertising materials mentioning features or use of this
73 * software must display the following acknowledgment:
74 * "This product includes software developed by the OpenSSL Project
75 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
76 *
77 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
78 * endorse or promote products derived from this software without
79 * prior written permission. For written permission, please contact
80 * openssl-core@openssl.org.
81 *
82 * 5. Products derived from this software may not be called "OpenSSL"
83 * nor may "OpenSSL" appear in their names without prior written
84 * permission of the OpenSSL Project.
85 *
86 * 6. Redistributions of any form whatsoever must retain the following
87 * acknowledgment:
88 * "This product includes software developed by the OpenSSL Project
89 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
90 *
91 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
92 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
93 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
94 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
95 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
96 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
97 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
98 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
99 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
100 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
101 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
102 * OF THE POSSIBILITY OF SUCH DAMAGE.
103 * ====================================================================
104 *
105 * This product includes cryptographic software written by Eric Young
106 * (eay@cryptsoft.com). This product includes software written by Tim
107 * Hudson (tjh@cryptsoft.com).
108 *
109 */
110/* ====================================================================
111 * Copyright 2005 Nokia. All rights reserved.
112 *
113 * The portions of the attached software ("Contribution") is developed by
114 * Nokia Corporation and is licensed pursuant to the OpenSSL open source
115 * license.
116 *
117 * The Contribution, originally written by Mika Kousa and Pasi Eronen of
118 * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
119 * support (see RFC 4279) to OpenSSL.
120 *
121 * No patent licenses or other rights except those expressly stated in
122 * the OpenSSL open source license shall be deemed granted or received
123 * expressly, by implication, estoppel, or otherwise.
124 *
125 * No assurances are provided by Nokia that the Contribution does not
126 * infringe the patent or other intellectual property rights of any third
127 * party or that the license provides you with all the necessary rights
128 * to make use of the Contribution.
129 *
130 * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
131 * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
132 * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
133 * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
134 * OTHERWISE. */
135
136#include <stdio.h>
137#include <assert.h>
138
Adam Langley95c29f32014-06-20 12:00:00 -0700139#include <openssl/err.h>
140#include <openssl/evp.h>
141#include <openssl/hmac.h>
142#include <openssl/md5.h>
143#include <openssl/mem.h>
144#include <openssl/obj.h>
145#include <openssl/rand.h>
146
147#include "ssl_locl.h"
148
Adam Langley95c29f32014-06-20 12:00:00 -0700149
Adam Langleyfcf25832014-12-18 17:42:32 -0800150/* seed1 through seed3 are virtually concatenated */
151static int tls1_P_hash(const EVP_MD *md, const uint8_t *sec, int sec_len,
152 const void *seed1, int seed1_len,
153 const void *seed2, int seed2_len,
154 const void *seed3, int seed3_len,
155 uint8_t *out, int olen) {
156 int chunk;
157 size_t j;
158 EVP_MD_CTX ctx, ctx_tmp, ctx_init;
159 EVP_PKEY *mac_key;
160 uint8_t A1[EVP_MAX_MD_SIZE];
161 size_t A1_len;
162 int ret = 0;
Adam Langley95c29f32014-06-20 12:00:00 -0700163
Adam Langleyfcf25832014-12-18 17:42:32 -0800164 chunk = EVP_MD_size(md);
Adam Langley95c29f32014-06-20 12:00:00 -0700165
Adam Langleyfcf25832014-12-18 17:42:32 -0800166 EVP_MD_CTX_init(&ctx);
167 EVP_MD_CTX_init(&ctx_tmp);
168 EVP_MD_CTX_init(&ctx_init);
169 mac_key = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, sec, sec_len);
170 A1_len = EVP_MAX_MD_SIZE;
171 if (!mac_key ||
172 !EVP_DigestSignInit(&ctx_init, NULL, md, NULL, mac_key) ||
173 !EVP_MD_CTX_copy_ex(&ctx, &ctx_init) ||
174 (seed1 && !EVP_DigestSignUpdate(&ctx, seed1, seed1_len)) ||
175 (seed2 && !EVP_DigestSignUpdate(&ctx, seed2, seed2_len)) ||
176 (seed3 && !EVP_DigestSignUpdate(&ctx, seed3, seed3_len)) ||
177 !EVP_DigestSignFinal(&ctx, A1, &A1_len)) {
178 goto err;
179 }
180
181 for (;;) {
182 /* Reinit mac contexts */
183 if (!EVP_MD_CTX_copy_ex(&ctx, &ctx_init) ||
184 !EVP_DigestSignUpdate(&ctx, A1, A1_len) ||
185 (olen > chunk && !EVP_MD_CTX_copy_ex(&ctx_tmp, &ctx)) ||
186 (seed1 && !EVP_DigestSignUpdate(&ctx, seed1, seed1_len)) ||
187 (seed2 && !EVP_DigestSignUpdate(&ctx, seed2, seed2_len)) ||
188 (seed3 && !EVP_DigestSignUpdate(&ctx, seed3, seed3_len))) {
189 goto err;
190 }
191
192 if (olen > chunk) {
193 j = olen;
194 if (!EVP_DigestSignFinal(&ctx, out, &j)) {
195 goto err;
196 }
197 out += j;
198 olen -= j;
199 /* calc the next A1 value */
200 A1_len = EVP_MAX_MD_SIZE;
201 if (!EVP_DigestSignFinal(&ctx_tmp, A1, &A1_len)) {
202 goto err;
203 }
204 } else {
205 /* last one */
206 A1_len = EVP_MAX_MD_SIZE;
207 if (!EVP_DigestSignFinal(&ctx, A1, &A1_len)) {
208 goto err;
209 }
210 memcpy(out, A1, olen);
211 break;
212 }
213 }
214
215 ret = 1;
216
Adam Langley95c29f32014-06-20 12:00:00 -0700217err:
Adam Langleyfcf25832014-12-18 17:42:32 -0800218 EVP_PKEY_free(mac_key);
219 EVP_MD_CTX_cleanup(&ctx);
220 EVP_MD_CTX_cleanup(&ctx_tmp);
221 EVP_MD_CTX_cleanup(&ctx_init);
222 OPENSSL_cleanse(A1, sizeof(A1));
223 return ret;
Adam Langley95c29f32014-06-20 12:00:00 -0700224}
Adam Langley9447dff2014-06-24 17:29:06 -0700225
Adam Langleyfcf25832014-12-18 17:42:32 -0800226/* seed1 through seed3 are virtually concatenated */
227static int tls1_PRF(long digest_mask,
228 const void *seed1, int seed1_len,
229 const void *seed2, int seed2_len,
230 const void *seed3, int seed3_len,
231 const uint8_t *sec, int slen,
232 uint8_t *out1, uint8_t *out2, int olen) {
233 int len, i, idx, count;
234 const uint8_t *S1;
235 long m;
236 const EVP_MD *md;
237 int ret = 0;
238
239 /* Count number of digests and partition sec evenly */
240 count = 0;
241 for (idx = 0; ssl_get_handshake_digest(idx, &m, &md); idx++) {
242 if ((m << TLS1_PRF_DGST_SHIFT) & digest_mask) {
243 count++;
244 }
245 }
246 len = slen / count;
247 if (count == 1) {
248 slen = 0;
249 }
250 S1 = sec;
251 memset(out1, 0, olen);
252 for (idx = 0; ssl_get_handshake_digest(idx, &m, &md); idx++) {
253 if ((m << TLS1_PRF_DGST_SHIFT) & digest_mask) {
254 if (!md) {
255 OPENSSL_PUT_ERROR(SSL, tls1_PRF, SSL_R_UNSUPPORTED_DIGEST_TYPE);
256 goto err;
257 }
258 if (!tls1_P_hash(md, S1, len + (slen & 1), seed1, seed1_len, seed2,
259 seed2_len, seed3, seed3_len, out2, olen)) {
260 goto err;
261 }
262 S1 += len;
263 for (i = 0; i < olen; i++) {
264 out1[i] ^= out2[i];
265 }
266 }
267 }
268 ret = 1;
269
270err:
271 return ret;
272}
273
274static int tls1_generate_key_block(SSL *s, uint8_t *km, uint8_t *tmp, int num) {
275 return tls1_PRF(ssl_get_algorithm2(s), TLS_MD_KEY_EXPANSION_CONST,
276 TLS_MD_KEY_EXPANSION_CONST_SIZE, s->s3->server_random,
277 SSL3_RANDOM_SIZE, s->s3->client_random, SSL3_RANDOM_SIZE,
278 s->session->master_key, s->session->master_key_length, km,
279 tmp, num);
280}
Adam Langley95c29f32014-06-20 12:00:00 -0700281
Adam Langleyc9fb3752014-06-20 12:00:00 -0700282/* tls1_aead_ctx_init allocates |*aead_ctx|, if needed and returns 1. It
283 * returns 0 on malloc error. */
Adam Langleyfcf25832014-12-18 17:42:32 -0800284static int tls1_aead_ctx_init(SSL_AEAD_CTX **aead_ctx) {
285 if (*aead_ctx != NULL) {
286 EVP_AEAD_CTX_cleanup(&(*aead_ctx)->ctx);
287 } else {
288 *aead_ctx = (SSL_AEAD_CTX *)OPENSSL_malloc(sizeof(SSL_AEAD_CTX));
289 if (*aead_ctx == NULL) {
290 OPENSSL_PUT_ERROR(SSL, tls1_aead_ctx_init, ERR_R_MALLOC_FAILURE);
291 return 0;
292 }
293 }
Adam Langleyc9fb3752014-06-20 12:00:00 -0700294
Adam Langleyfcf25832014-12-18 17:42:32 -0800295 return 1;
296}
Adam Langleyc9fb3752014-06-20 12:00:00 -0700297
Adam Langleyfcf25832014-12-18 17:42:32 -0800298static void tls1_cleanup_enc_ctx(EVP_CIPHER_CTX **ctx) {
299 if (*ctx != NULL) {
300 EVP_CIPHER_CTX_free(*ctx);
301 }
302 *ctx = NULL;
303}
Adam Langley88333ef2014-10-15 20:13:35 -0700304
Adam Langleyfcf25832014-12-18 17:42:32 -0800305static void tls1_cleanup_hash_ctx(EVP_MD_CTX **ctx) {
306 if (*ctx != NULL) {
307 EVP_MD_CTX_destroy(*ctx);
308 }
309 *ctx = NULL;
310}
Adam Langley88333ef2014-10-15 20:13:35 -0700311
Adam Langleyc9fb3752014-06-20 12:00:00 -0700312static int tls1_change_cipher_state_aead(SSL *s, char is_read,
Adam Langleyfcf25832014-12-18 17:42:32 -0800313 const uint8_t *key, unsigned key_len,
314 const uint8_t *iv, unsigned iv_len,
315 const uint8_t *mac_secret,
316 unsigned mac_secret_len) {
317 const EVP_AEAD *aead = s->s3->tmp.new_aead;
318 SSL_AEAD_CTX *aead_ctx;
319 /* mac_key_and_key is used to merge the MAC and cipher keys for an AEAD which
320 * simulates pre-AEAD cipher suites. It needs to be large enough to cope with
321 * the largest pair of keys. */
322 uint8_t mac_key_and_key[32 /* HMAC(SHA256) */ + 32 /* AES-256 */];
Adam Langley9447dff2014-06-24 17:29:06 -0700323
Adam Langleyfcf25832014-12-18 17:42:32 -0800324 if (is_read) {
325 tls1_cleanup_enc_ctx(&s->enc_read_ctx);
326 tls1_cleanup_hash_ctx(&s->read_hash);
327 } else {
328 tls1_cleanup_enc_ctx(&s->enc_write_ctx);
329 tls1_cleanup_hash_ctx(&s->write_hash);
330 }
Adam Langley88333ef2014-10-15 20:13:35 -0700331
Adam Langleyfcf25832014-12-18 17:42:32 -0800332 if (mac_secret_len > 0) {
333 /* This is a "stateful" AEAD (for compatibility with pre-AEAD cipher
334 * suites). */
335 if (mac_secret_len + key_len > sizeof(mac_key_and_key)) {
336 OPENSSL_PUT_ERROR(SSL, tls1_change_cipher_state_aead,
337 ERR_R_INTERNAL_ERROR);
338 return 0;
339 }
340 memcpy(mac_key_and_key, mac_secret, mac_secret_len);
341 memcpy(mac_key_and_key + mac_secret_len, key, key_len);
342 key = mac_key_and_key;
343 key_len += mac_secret_len;
344 }
Adam Langleyc9fb3752014-06-20 12:00:00 -0700345
Adam Langleyfcf25832014-12-18 17:42:32 -0800346 if (is_read) {
347 if (!tls1_aead_ctx_init(&s->aead_read_ctx)) {
348 return 0;
349 }
350 aead_ctx = s->aead_read_ctx;
351 } else {
352 if (!tls1_aead_ctx_init(&s->aead_write_ctx)) {
353 return 0;
354 }
355 aead_ctx = s->aead_write_ctx;
356 }
Adam Langleyc9fb3752014-06-20 12:00:00 -0700357
Adam Langleyfcf25832014-12-18 17:42:32 -0800358 if (!EVP_AEAD_CTX_init(&aead_ctx->ctx, aead, key, key_len,
359 EVP_AEAD_DEFAULT_TAG_LENGTH, NULL /* engine */)) {
360 OPENSSL_free(aead_ctx);
361 if (is_read) {
362 s->aead_read_ctx = NULL;
363 } else {
364 s->aead_write_ctx = NULL;
365 }
Adam Langleyc9fb3752014-06-20 12:00:00 -0700366
Adam Langleyfcf25832014-12-18 17:42:32 -0800367 return 0;
368 }
Adam Langleyc9fb3752014-06-20 12:00:00 -0700369
Adam Langleyfcf25832014-12-18 17:42:32 -0800370 if (iv_len > sizeof(aead_ctx->fixed_nonce)) {
371 OPENSSL_PUT_ERROR(SSL, tls1_change_cipher_state_aead, ERR_R_INTERNAL_ERROR);
372 return 0;
373 }
374
375 memcpy(aead_ctx->fixed_nonce, iv, iv_len);
376 aead_ctx->fixed_nonce_len = iv_len;
377 aead_ctx->variable_nonce_len = 8; /* correct for all true AEADs so far. */
378 if (s->s3->tmp.new_cipher->algorithm2 & SSL_CIPHER_ALGORITHM2_STATEFUL_AEAD) {
379 aead_ctx->variable_nonce_len = 0;
380 }
381
382 aead_ctx->variable_nonce_included_in_record =
383 (s->s3->tmp.new_cipher->algorithm2 &
384 SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD) != 0;
385 if (aead_ctx->variable_nonce_len + aead_ctx->fixed_nonce_len !=
386 EVP_AEAD_nonce_length(aead)) {
387 OPENSSL_PUT_ERROR(SSL, tls1_change_cipher_state_aead, ERR_R_INTERNAL_ERROR);
388 return 0;
389 }
390 aead_ctx->tag_len = EVP_AEAD_max_overhead(aead);
391
392 return 1;
393}
394
395static void tls1_cleanup_aead_ctx(SSL_AEAD_CTX **ctx) {
396 if (*ctx != NULL) {
397 EVP_AEAD_CTX_cleanup(&(*ctx)->ctx);
398 OPENSSL_free(*ctx);
399 }
400 *ctx = NULL;
401}
Adam Langley88333ef2014-10-15 20:13:35 -0700402
Adam Langleya5fa5b72014-06-20 12:00:00 -0700403/* tls1_change_cipher_state_cipher performs the work needed to switch cipher
404 * states when using EVP_CIPHER. The argument |is_read| is true iff this
405 * function is being called due to reading, as opposed to writing, a
406 * ChangeCipherSpec message. In order to support export ciphersuites,
407 * use_client_keys indicates whether the key material provided is in the
408 * "client write" direction. */
Adam Langleyfcf25832014-12-18 17:42:32 -0800409static int tls1_change_cipher_state_cipher(SSL *s, char is_read,
410 char use_client_keys,
411 const uint8_t *mac_secret,
412 unsigned mac_secret_len,
413 const uint8_t *key, unsigned key_len,
414 const uint8_t *iv, unsigned iv_len) {
415 const EVP_CIPHER *cipher = s->s3->tmp.new_sym_enc;
416 EVP_CIPHER_CTX *cipher_ctx;
417 EVP_MD_CTX *mac_ctx;
Adam Langley95c29f32014-06-20 12:00:00 -0700418
Adam Langleyfcf25832014-12-18 17:42:32 -0800419 if (is_read) {
420 tls1_cleanup_aead_ctx(&s->aead_read_ctx);
421 } else {
422 tls1_cleanup_aead_ctx(&s->aead_write_ctx);
423 }
Adam Langley88333ef2014-10-15 20:13:35 -0700424
Adam Langleyfcf25832014-12-18 17:42:32 -0800425 if (is_read) {
426 if (s->enc_read_ctx != NULL && !SSL_IS_DTLS(s)) {
427 EVP_CIPHER_CTX_cleanup(s->enc_read_ctx);
428 } else if ((s->enc_read_ctx = EVP_CIPHER_CTX_new()) == NULL) {
429 goto err;
430 }
Adam Langleya5fa5b72014-06-20 12:00:00 -0700431
Adam Langleyfcf25832014-12-18 17:42:32 -0800432 cipher_ctx = s->enc_read_ctx;
433 mac_ctx = ssl_replace_hash(&s->read_hash, NULL);
434 if (mac_ctx == NULL) {
435 goto err;
436 }
Adam Langleya5fa5b72014-06-20 12:00:00 -0700437
Adam Langleyfcf25832014-12-18 17:42:32 -0800438 memcpy(s->s3->read_mac_secret, mac_secret, mac_secret_len);
439 s->s3->read_mac_secret_size = mac_secret_len;
440 } else {
441 /* When updating the write contexts for DTLS, we do not wish to free the
442 * old ones because DTLS stores pointers to them in order to implement
443 * retransmission. */
Adam Langleya5fa5b72014-06-20 12:00:00 -0700444
Adam Langleyfcf25832014-12-18 17:42:32 -0800445 if (s->enc_write_ctx != NULL && !SSL_IS_DTLS(s)) {
446 EVP_CIPHER_CTX_cleanup(s->enc_write_ctx);
447 } else {
448 s->enc_write_ctx = OPENSSL_malloc(sizeof(EVP_CIPHER_CTX));
449 if (s->enc_write_ctx == NULL) {
450 goto err;
451 }
452 }
453 EVP_CIPHER_CTX_init(s->enc_write_ctx);
Adam Langleya5fa5b72014-06-20 12:00:00 -0700454
Adam Langleyfcf25832014-12-18 17:42:32 -0800455 cipher_ctx = s->enc_write_ctx;
456 if (SSL_IS_DTLS(s)) {
457 /* This is the same as ssl_replace_hash, but doesn't
458 * free the old |s->write_hash|. */
459 mac_ctx = EVP_MD_CTX_create();
460 if (!mac_ctx) {
461 goto err;
462 }
463 s->write_hash = mac_ctx;
464 } else {
465 mac_ctx = ssl_replace_hash(&s->write_hash, NULL);
466 if (mac_ctx == NULL) {
467 goto err;
468 }
469 }
Adam Langleya5fa5b72014-06-20 12:00:00 -0700470
Adam Langleyfcf25832014-12-18 17:42:32 -0800471 memcpy(s->s3->write_mac_secret, mac_secret, mac_secret_len);
472 s->s3->write_mac_secret_size = mac_secret_len;
473 }
Adam Langley95c29f32014-06-20 12:00:00 -0700474
Adam Langleyfcf25832014-12-18 17:42:32 -0800475 EVP_PKEY *mac_key = EVP_PKEY_new_mac_key(s->s3->tmp.new_mac_pkey_type, NULL,
476 mac_secret, mac_secret_len);
477 if (!mac_key) {
478 return 0;
479 }
Adam Langley95c29f32014-06-20 12:00:00 -0700480
Adam Langleyfcf25832014-12-18 17:42:32 -0800481 if (!EVP_DigestSignInit(mac_ctx, NULL, s->s3->tmp.new_hash, NULL, mac_key)) {
482 EVP_PKEY_free(mac_key);
483 goto err;
484 }
485 EVP_PKEY_free(mac_key);
Adam Langley95c29f32014-06-20 12:00:00 -0700486
Adam Langleyfcf25832014-12-18 17:42:32 -0800487 if (!EVP_CipherInit_ex(cipher_ctx, cipher, NULL /* engine */, key, iv,
488 !is_read)) {
489 goto err;
490 }
491
492 return 1;
Adam Langley95c29f32014-06-20 12:00:00 -0700493
Adam Langley95c29f32014-06-20 12:00:00 -0700494err:
Adam Langleyfcf25832014-12-18 17:42:32 -0800495 OPENSSL_PUT_ERROR(SSL, tls1_change_cipher_state_cipher, ERR_R_MALLOC_FAILURE);
496 return 0;
497}
Adam Langleya5fa5b72014-06-20 12:00:00 -0700498
Adam Langleyfcf25832014-12-18 17:42:32 -0800499int tls1_change_cipher_state(SSL *s, int which) {
500 /* is_read is true if we have just read a ChangeCipherSpec message - i.e. we
501 * need to update the read cipherspec. Otherwise we have just written one. */
502 const char is_read = (which & SSL3_CC_READ) != 0;
503 /* use_client_keys is true if we wish to use the keys for the "client write"
504 * direction. This is the case if we're a client sending a ChangeCipherSpec,
505 * or a server reading a client's ChangeCipherSpec. */
506 const char use_client_keys = which == SSL3_CHANGE_CIPHER_CLIENT_WRITE ||
507 which == SSL3_CHANGE_CIPHER_SERVER_READ;
508 const uint8_t *client_write_mac_secret, *server_write_mac_secret, *mac_secret;
509 const uint8_t *client_write_key, *server_write_key, *key;
510 const uint8_t *client_write_iv, *server_write_iv, *iv;
511 const EVP_CIPHER *cipher = s->s3->tmp.new_sym_enc;
512 const EVP_AEAD *aead = s->s3->tmp.new_aead;
513 unsigned key_len, iv_len, mac_secret_len;
514 const uint8_t *key_data;
Adam Langleya5fa5b72014-06-20 12:00:00 -0700515
Adam Langleyfcf25832014-12-18 17:42:32 -0800516 /* Reset sequence number to zero. */
517 if (!SSL_IS_DTLS(s)) {
518 memset(is_read ? s->s3->read_sequence : s->s3->write_sequence, 0, 8);
519 }
Adam Langleya5fa5b72014-06-20 12:00:00 -0700520
Adam Langleyfcf25832014-12-18 17:42:32 -0800521 mac_secret_len = s->s3->tmp.new_mac_secret_size;
Adam Langleya5fa5b72014-06-20 12:00:00 -0700522
Adam Langleyfcf25832014-12-18 17:42:32 -0800523 if (aead != NULL) {
524 key_len = EVP_AEAD_key_length(aead);
525 /* For "stateful" AEADs (i.e. compatibility with pre-AEAD cipher suites)
526 * the key length reported by |EVP_AEAD_key_length| will include the MAC
527 * key bytes. */
528 if (key_len < mac_secret_len) {
529 OPENSSL_PUT_ERROR(SSL, tls1_change_cipher_state, ERR_R_INTERNAL_ERROR);
530 return 0;
531 }
532 key_len -= mac_secret_len;
533 iv_len = SSL_CIPHER_AEAD_FIXED_NONCE_LEN(s->s3->tmp.new_cipher);
534 } else {
535 key_len = EVP_CIPHER_key_length(cipher);
536 iv_len = EVP_CIPHER_iv_length(cipher);
537 }
Adam Langleya5fa5b72014-06-20 12:00:00 -0700538
Adam Langleyfcf25832014-12-18 17:42:32 -0800539 key_data = s->s3->tmp.key_block;
540 client_write_mac_secret = key_data;
541 key_data += mac_secret_len;
542 server_write_mac_secret = key_data;
543 key_data += mac_secret_len;
544 client_write_key = key_data;
545 key_data += key_len;
546 server_write_key = key_data;
547 key_data += key_len;
548 client_write_iv = key_data;
549 key_data += iv_len;
550 server_write_iv = key_data;
551 key_data += iv_len;
Adam Langleya5fa5b72014-06-20 12:00:00 -0700552
Adam Langleyfcf25832014-12-18 17:42:32 -0800553 if (use_client_keys) {
554 mac_secret = client_write_mac_secret;
555 key = client_write_key;
556 iv = client_write_iv;
557 } else {
558 mac_secret = server_write_mac_secret;
559 key = server_write_key;
560 iv = server_write_iv;
561 }
Adam Langleya5fa5b72014-06-20 12:00:00 -0700562
Adam Langleyfcf25832014-12-18 17:42:32 -0800563 if (key_data - s->s3->tmp.key_block != s->s3->tmp.key_block_length) {
564 OPENSSL_PUT_ERROR(SSL, tls1_change_cipher_state, ERR_R_INTERNAL_ERROR);
565 return 0;
566 }
Adam Langleya5fa5b72014-06-20 12:00:00 -0700567
Adam Langleyfcf25832014-12-18 17:42:32 -0800568 if (aead != NULL) {
569 if (!tls1_change_cipher_state_aead(s, is_read, key, key_len, iv, iv_len,
570 mac_secret, mac_secret_len)) {
571 return 0;
572 }
573 } else {
574 if (!tls1_change_cipher_state_cipher(s, is_read, use_client_keys,
575 mac_secret, mac_secret_len, key,
576 key_len, iv, iv_len)) {
577 return 0;
578 }
579 }
Adam Langleya5fa5b72014-06-20 12:00:00 -0700580
Adam Langleyfcf25832014-12-18 17:42:32 -0800581 return 1;
582}
Adam Langley95c29f32014-06-20 12:00:00 -0700583
Adam Langleyfcf25832014-12-18 17:42:32 -0800584int tls1_setup_key_block(SSL *s) {
585 uint8_t *p1, *p2 = NULL;
586 const EVP_CIPHER *c = NULL;
587 const EVP_MD *hash = NULL;
588 const EVP_AEAD *aead = NULL;
589 int num;
590 int mac_type = NID_undef, mac_secret_size = 0;
591 int ret = 0;
592 unsigned key_len, iv_len;
Adam Langley95c29f32014-06-20 12:00:00 -0700593
Adam Langley95c29f32014-06-20 12:00:00 -0700594
Adam Langleyfcf25832014-12-18 17:42:32 -0800595 if (s->s3->tmp.key_block_length != 0) {
596 return 1;
597 }
Adam Langley95c29f32014-06-20 12:00:00 -0700598
Adam Langleyfcf25832014-12-18 17:42:32 -0800599 if (s->session->cipher &&
600 ((s->session->cipher->algorithm2 & SSL_CIPHER_ALGORITHM2_AEAD) ||
601 (s->session->cipher->algorithm2 &
602 SSL_CIPHER_ALGORITHM2_STATEFUL_AEAD))) {
603 if (!ssl_cipher_get_evp_aead(s->session, &aead)) {
604 goto cipher_unavailable_err;
605 }
606 key_len = EVP_AEAD_key_length(aead);
607 iv_len = SSL_CIPHER_AEAD_FIXED_NONCE_LEN(s->session->cipher);
608 if ((s->session->cipher->algorithm2 &
609 SSL_CIPHER_ALGORITHM2_STATEFUL_AEAD) &&
610 !ssl_cipher_get_mac(s->session, &hash, &mac_type, &mac_secret_size)) {
611 goto cipher_unavailable_err;
612 }
613 /* For "stateful" AEADs (i.e. compatibility with pre-AEAD cipher suites)
614 * the key length reported by |EVP_AEAD_key_length| will include the MAC
615 * key bytes. */
616 if (key_len < (size_t)mac_secret_size) {
617 OPENSSL_PUT_ERROR(SSL, tls1_change_cipher_state, ERR_R_INTERNAL_ERROR);
618 return 0;
619 }
620 key_len -= mac_secret_size;
621 } else {
622 if (!ssl_cipher_get_evp(s->session, &c, &hash, &mac_type,
623 &mac_secret_size)) {
624 goto cipher_unavailable_err;
625 }
626 key_len = EVP_CIPHER_key_length(c);
627 iv_len = EVP_CIPHER_iv_length(c);
628 }
Adam Langley95c29f32014-06-20 12:00:00 -0700629
Adam Langleyfcf25832014-12-18 17:42:32 -0800630 s->s3->tmp.new_aead = aead;
631 s->s3->tmp.new_sym_enc = c;
632 s->s3->tmp.new_hash = hash;
633 s->s3->tmp.new_mac_pkey_type = mac_type;
634 s->s3->tmp.new_mac_secret_size = mac_secret_size;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700635
Adam Langleyfcf25832014-12-18 17:42:32 -0800636 num = key_len + mac_secret_size + iv_len;
637 num *= 2;
Adam Langley95c29f32014-06-20 12:00:00 -0700638
Adam Langleyfcf25832014-12-18 17:42:32 -0800639 ssl3_cleanup_key_block(s);
Adam Langley95c29f32014-06-20 12:00:00 -0700640
Adam Langleyfcf25832014-12-18 17:42:32 -0800641 p1 = (uint8_t *)OPENSSL_malloc(num);
642 if (p1 == NULL) {
643 OPENSSL_PUT_ERROR(SSL, tls1_setup_key_block, ERR_R_MALLOC_FAILURE);
644 goto err;
645 }
Adam Langley95c29f32014-06-20 12:00:00 -0700646
Adam Langleyfcf25832014-12-18 17:42:32 -0800647 s->s3->tmp.key_block_length = num;
648 s->s3->tmp.key_block = p1;
Adam Langley95c29f32014-06-20 12:00:00 -0700649
Adam Langleyfcf25832014-12-18 17:42:32 -0800650 p2 = (uint8_t *)OPENSSL_malloc(num);
651 if (p2 == NULL) {
652 OPENSSL_PUT_ERROR(SSL, tls1_setup_key_block, ERR_R_MALLOC_FAILURE);
653 goto err;
654 }
Adam Langley95c29f32014-06-20 12:00:00 -0700655
Adam Langleyfcf25832014-12-18 17:42:32 -0800656 if (!tls1_generate_key_block(s, p1, p2, num)) {
657 goto err;
658 }
Adam Langley95c29f32014-06-20 12:00:00 -0700659
Adam Langleyfcf25832014-12-18 17:42:32 -0800660 if (!SSL_USE_EXPLICIT_IV(s) &&
661 (s->mode & SSL_MODE_CBC_RECORD_SPLITTING) != 0) {
662 /* enable vulnerability countermeasure for CBC ciphers with known-IV
663 * problem (http://www.openssl.org/~bodo/tls-cbc.txt). */
664 s->s3->need_record_splitting = 1;
Adam Langley95c29f32014-06-20 12:00:00 -0700665
Adam Langleyfcf25832014-12-18 17:42:32 -0800666 if (s->session->cipher != NULL &&
667 s->session->cipher->algorithm_enc == SSL_RC4) {
668 s->s3->need_record_splitting = 0;
669 }
670 }
671
672 ret = 1;
673
Adam Langley95c29f32014-06-20 12:00:00 -0700674err:
Adam Langleyfcf25832014-12-18 17:42:32 -0800675 if (p2) {
676 OPENSSL_cleanse(p2, num);
677 OPENSSL_free(p2);
678 }
679 return ret;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700680
681cipher_unavailable_err:
Adam Langleyfcf25832014-12-18 17:42:32 -0800682 OPENSSL_PUT_ERROR(SSL, tls1_setup_key_block,
683 SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
684 return 0;
685}
Adam Langley95c29f32014-06-20 12:00:00 -0700686
Adam Langleyfcf25832014-12-18 17:42:32 -0800687/* tls1_enc encrypts/decrypts the record in |s->wrec| / |s->rrec|,
688 * respectively.
Adam Langley95c29f32014-06-20 12:00:00 -0700689 *
690 * Returns:
691 * 0: (in non-constant time) if the record is publically invalid (i.e. too
692 * short etc).
693 * 1: if the record's padding is valid / the encryption was successful.
694 * -1: if the record's padding/AEAD-authenticator is invalid or, if sending,
Adam Langleyfcf25832014-12-18 17:42:32 -0800695 * an internal error occured. */
696int tls1_enc(SSL *s, int send) {
697 SSL3_RECORD *rec;
698 EVP_CIPHER_CTX *ds;
699 unsigned long l;
700 int bs, i, j, k, pad = 0, ret, mac_size = 0;
701 const EVP_CIPHER *enc;
702 const SSL_AEAD_CTX *aead;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700703
Adam Langleyfcf25832014-12-18 17:42:32 -0800704 if (send) {
705 rec = &s->s3->wrec;
706 aead = s->aead_write_ctx;
707 } else {
708 rec = &s->s3->rrec;
709 aead = s->aead_read_ctx;
710 }
Adam Langleyc9fb3752014-06-20 12:00:00 -0700711
Adam Langleyfcf25832014-12-18 17:42:32 -0800712 if (aead) {
713 uint8_t ad[13], *seq, *in, *out, nonce[16];
714 unsigned nonce_used;
715 size_t n;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700716
Adam Langleyfcf25832014-12-18 17:42:32 -0800717 seq = send ? s->s3->write_sequence : s->s3->read_sequence;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700718
Adam Langleyfcf25832014-12-18 17:42:32 -0800719 if (SSL_IS_DTLS(s)) {
720 uint8_t dtlsseq[9], *p = dtlsseq;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700721
Adam Langleyfcf25832014-12-18 17:42:32 -0800722 s2n(send ? s->d1->w_epoch : s->d1->r_epoch, p);
723 memcpy(p, &seq[2], 6);
724 memcpy(ad, dtlsseq, 8);
725 } else {
726 memcpy(ad, seq, 8);
727 for (i = 7; i >= 0; i--) {
728 ++seq[i];
729 if (seq[i] != 0) {
730 break;
731 }
732 }
733 }
Adam Langleyc9fb3752014-06-20 12:00:00 -0700734
Adam Langleyfcf25832014-12-18 17:42:32 -0800735 ad[8] = rec->type;
736 ad[9] = (uint8_t)(s->version >> 8);
737 ad[10] = (uint8_t)(s->version);
Adam Langleyc9fb3752014-06-20 12:00:00 -0700738
Adam Langleyfcf25832014-12-18 17:42:32 -0800739 if (aead->fixed_nonce_len + aead->variable_nonce_len > sizeof(nonce) ||
740 aead->variable_nonce_len > 8) {
741 return -1; /* internal error - should never happen. */
742 }
Adam Langleyc9fb3752014-06-20 12:00:00 -0700743
Adam Langleyfcf25832014-12-18 17:42:32 -0800744 memcpy(nonce, aead->fixed_nonce, aead->fixed_nonce_len);
745 nonce_used = aead->fixed_nonce_len;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700746
Adam Langleyfcf25832014-12-18 17:42:32 -0800747 if (send) {
748 size_t len = rec->length;
749 size_t eivlen = 0;
750 in = rec->input;
751 out = rec->data;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700752
Adam Langleyfcf25832014-12-18 17:42:32 -0800753 /* When sending we use the sequence number as the variable part of the
754 * nonce. */
755 if (aead->variable_nonce_len > 8) {
756 return -1;
757 }
758 memcpy(nonce + nonce_used, ad, aead->variable_nonce_len);
759 nonce_used += aead->variable_nonce_len;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700760
Adam Langleyfcf25832014-12-18 17:42:32 -0800761 /* in do_ssl3_write, rec->input is moved forward by variable_nonce_len in
762 * order to leave space for the variable nonce. Thus we can copy the
763 * sequence number bytes into place without overwriting any of the
764 * plaintext. */
765 if (aead->variable_nonce_included_in_record) {
766 memcpy(out, ad, aead->variable_nonce_len);
767 len -= aead->variable_nonce_len;
768 eivlen = aead->variable_nonce_len;
769 }
Adam Langleyc9fb3752014-06-20 12:00:00 -0700770
Adam Langleyfcf25832014-12-18 17:42:32 -0800771 ad[11] = len >> 8;
772 ad[12] = len & 0xff;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700773
Adam Langleyfcf25832014-12-18 17:42:32 -0800774 if (!EVP_AEAD_CTX_seal(&aead->ctx, out + eivlen, &n, len + aead->tag_len,
775 nonce, nonce_used, in + eivlen, len, ad,
776 sizeof(ad))) {
777 return -1;
778 }
Adam Langleyc9fb3752014-06-20 12:00:00 -0700779
Adam Langleyfcf25832014-12-18 17:42:32 -0800780 if (aead->variable_nonce_included_in_record) {
781 n += aead->variable_nonce_len;
782 }
783 } else {
784 /* receive */
785 size_t len = rec->length;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700786
Adam Langleyfcf25832014-12-18 17:42:32 -0800787 if (rec->data != rec->input) {
788 return -1; /* internal error - should never happen. */
789 }
790 out = in = rec->input;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700791
Adam Langleyfcf25832014-12-18 17:42:32 -0800792 if (len < aead->variable_nonce_len) {
793 return 0;
794 }
795 memcpy(nonce + nonce_used,
796 aead->variable_nonce_included_in_record ? in : ad,
797 aead->variable_nonce_len);
798 nonce_used += aead->variable_nonce_len;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700799
Adam Langleyfcf25832014-12-18 17:42:32 -0800800 if (aead->variable_nonce_included_in_record) {
801 in += aead->variable_nonce_len;
802 len -= aead->variable_nonce_len;
803 out += aead->variable_nonce_len;
804 }
Adam Langleyc9fb3752014-06-20 12:00:00 -0700805
Adam Langleyfcf25832014-12-18 17:42:32 -0800806 if (len < aead->tag_len) {
807 return 0;
808 }
809 len -= aead->tag_len;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700810
Adam Langleyfcf25832014-12-18 17:42:32 -0800811 ad[11] = len >> 8;
812 ad[12] = len & 0xff;
Adam Langleyc9fb3752014-06-20 12:00:00 -0700813
Adam Langleyfcf25832014-12-18 17:42:32 -0800814 if (!EVP_AEAD_CTX_open(&aead->ctx, out, &n, len, nonce, nonce_used, in,
815 len + aead->tag_len, ad, sizeof(ad))) {
816 return -1;
817 }
Adam Langleyc9fb3752014-06-20 12:00:00 -0700818
Adam Langleyfcf25832014-12-18 17:42:32 -0800819 rec->data = rec->input = out;
820 }
Adam Langleyc9fb3752014-06-20 12:00:00 -0700821
Adam Langleyfcf25832014-12-18 17:42:32 -0800822 rec->length = n;
823 return 1;
824 }
Adam Langley95c29f32014-06-20 12:00:00 -0700825
Adam Langleyfcf25832014-12-18 17:42:32 -0800826 if (send) {
827 ds = s->enc_write_ctx;
828 rec = &(s->s3->wrec);
829 if (s->enc_write_ctx == NULL) {
830 enc = NULL;
831 } else {
832 int ivlen;
833 enc = EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
834 /* For TLSv1.1 and later explicit IV */
835 if (SSL_USE_EXPLICIT_IV(s) && EVP_CIPHER_mode(enc) == EVP_CIPH_CBC_MODE) {
836 ivlen = EVP_CIPHER_iv_length(enc);
837 } else {
838 ivlen = 0;
839 }
Adam Langley95c29f32014-06-20 12:00:00 -0700840
Adam Langleyfcf25832014-12-18 17:42:32 -0800841 if (ivlen > 1) {
842 if (rec->data != rec->input) {
843 /* we can't write into the input stream:
844 * Can this ever happen?? (steve)
845 */
846 fprintf(stderr, "%s:%d: rec->data != rec->input\n", __FILE__,
847 __LINE__);
848 } else if (!RAND_bytes(rec->input, ivlen)) {
849 return -1;
850 }
851 }
852 }
853 } else {
854 ds = s->enc_read_ctx;
855 rec = &(s->s3->rrec);
856 if (s->enc_read_ctx == NULL) {
857 enc = NULL;
858 } else {
859 enc = EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
860 }
861 }
Adam Langley95c29f32014-06-20 12:00:00 -0700862
Adam Langleyfcf25832014-12-18 17:42:32 -0800863 if (s->session == NULL || ds == NULL || enc == NULL) {
864 memmove(rec->data, rec->input, rec->length);
865 rec->input = rec->data;
866 ret = 1;
867 } else {
868 l = rec->length;
869 bs = EVP_CIPHER_block_size(ds->cipher);
Adam Langley95c29f32014-06-20 12:00:00 -0700870
Adam Langleyfcf25832014-12-18 17:42:32 -0800871 if (bs != 1 && send) {
872 i = bs - ((int)l % bs);
Adam Langley95c29f32014-06-20 12:00:00 -0700873
Adam Langleyfcf25832014-12-18 17:42:32 -0800874 /* Add weird padding of upto 256 bytes */
875 /* we need to add 'i' padding bytes of value j */
876 j = i - 1;
877 for (k = (int)l; k < (int)(l + i); k++) {
878 rec->input[k] = j;
879 }
880 l += i;
881 rec->length += i;
882 }
Adam Langley95c29f32014-06-20 12:00:00 -0700883
Adam Langleyfcf25832014-12-18 17:42:32 -0800884 if (!send && (l == 0 || l % bs != 0)) {
885 return 0;
886 }
Adam Langley95c29f32014-06-20 12:00:00 -0700887
Adam Langleyfcf25832014-12-18 17:42:32 -0800888 if (!EVP_Cipher(ds, rec->data, rec->input, l)) {
889 return -1;
890 }
Adam Langley95c29f32014-06-20 12:00:00 -0700891
Adam Langleyfcf25832014-12-18 17:42:32 -0800892 ret = 1;
893 if (EVP_MD_CTX_md(s->read_hash) != NULL) {
894 mac_size = EVP_MD_CTX_size(s->read_hash);
895 }
Adam Langley95c29f32014-06-20 12:00:00 -0700896
Adam Langleyfcf25832014-12-18 17:42:32 -0800897 if (bs != 1 && !send) {
898 ret = tls1_cbc_remove_padding(s, rec, bs, mac_size);
899 }
900 if (pad && !send) {
901 rec->length -= pad;
902 }
903 }
904 return ret;
905}
Adam Langley95c29f32014-06-20 12:00:00 -0700906
Adam Langleyfcf25832014-12-18 17:42:32 -0800907int tls1_cert_verify_mac(SSL *s, int md_nid, uint8_t *out) {
908 unsigned int ret;
909 EVP_MD_CTX ctx, *d = NULL;
910 int i;
Adam Langley95c29f32014-06-20 12:00:00 -0700911
Adam Langleyfcf25832014-12-18 17:42:32 -0800912 if (s->s3->handshake_buffer &&
913 !ssl3_digest_cached_records(s, free_handshake_buffer)) {
914 return 0;
915 }
916
917 for (i = 0; i < SSL_MAX_DIGEST; i++) {
918 if (s->s3->handshake_dgst[i] &&
919 EVP_MD_CTX_type(s->s3->handshake_dgst[i]) == md_nid) {
920 d = s->s3->handshake_dgst[i];
921 break;
922 }
923 }
924
925 if (!d) {
926 OPENSSL_PUT_ERROR(SSL, tls1_cert_verify_mac, SSL_R_NO_REQUIRED_DIGEST);
927 return 0;
928 }
929
930 EVP_MD_CTX_init(&ctx);
931 EVP_MD_CTX_copy_ex(&ctx, d);
932 EVP_DigestFinal_ex(&ctx, out, &ret);
933 EVP_MD_CTX_cleanup(&ctx);
934
935 return ret;
936}
Adam Langley95c29f32014-06-20 12:00:00 -0700937
Adam Langley1258b6a2014-06-20 12:00:00 -0700938/* tls1_handshake_digest calculates the current handshake hash and writes it to
939 * |out|, which has space for |out_len| bytes. It returns the number of bytes
940 * written or -1 in the event of an error. This function works on a copy of the
941 * underlying digests so can be called multiple times and prior to the final
942 * update etc. */
Adam Langleyfcf25832014-12-18 17:42:32 -0800943int tls1_handshake_digest(SSL *s, uint8_t *out, size_t out_len) {
944 const EVP_MD *md;
945 EVP_MD_CTX ctx;
946 int i, err = 0, len = 0;
947 long mask;
Adam Langley95c29f32014-06-20 12:00:00 -0700948
Adam Langleyfcf25832014-12-18 17:42:32 -0800949 EVP_MD_CTX_init(&ctx);
Adam Langley95c29f32014-06-20 12:00:00 -0700950
Adam Langleyfcf25832014-12-18 17:42:32 -0800951 for (i = 0; ssl_get_handshake_digest(i, &mask, &md); i++) {
952 int hash_size;
953 unsigned int digest_len;
954 EVP_MD_CTX *hdgst = s->s3->handshake_dgst[i];
Adam Langley1258b6a2014-06-20 12:00:00 -0700955
Adam Langleyfcf25832014-12-18 17:42:32 -0800956 if ((mask & ssl_get_algorithm2(s)) == 0) {
957 continue;
958 }
Adam Langley1258b6a2014-06-20 12:00:00 -0700959
Adam Langleyfcf25832014-12-18 17:42:32 -0800960 hash_size = EVP_MD_size(md);
961 if (!hdgst ||
962 hash_size < 0 ||
963 (size_t)hash_size > out_len ||
964 !EVP_MD_CTX_copy_ex(&ctx, hdgst) ||
965 !EVP_DigestFinal_ex(&ctx, out, &digest_len) ||
966 digest_len != (unsigned int)hash_size /* internal error */) {
967 err = 1;
968 break;
969 }
Adam Langley1258b6a2014-06-20 12:00:00 -0700970
Adam Langleyfcf25832014-12-18 17:42:32 -0800971 out += digest_len;
972 out_len -= digest_len;
973 len += digest_len;
974 }
Adam Langley1258b6a2014-06-20 12:00:00 -0700975
Adam Langleyfcf25832014-12-18 17:42:32 -0800976 EVP_MD_CTX_cleanup(&ctx);
Adam Langley1258b6a2014-06-20 12:00:00 -0700977
Adam Langleyfcf25832014-12-18 17:42:32 -0800978 if (err != 0) {
979 return -1;
980 }
981 return len;
982}
Adam Langley1258b6a2014-06-20 12:00:00 -0700983
Adam Langleyfcf25832014-12-18 17:42:32 -0800984int tls1_final_finish_mac(SSL *s, const char *str, int slen, uint8_t *out) {
985 uint8_t buf[2 * EVP_MAX_MD_SIZE];
986 uint8_t buf2[12];
987 int err = 0;
988 int digests_len;
Adam Langley1258b6a2014-06-20 12:00:00 -0700989
Adam Langleyfcf25832014-12-18 17:42:32 -0800990 if (s->s3->handshake_buffer &&
991 !ssl3_digest_cached_records(s, free_handshake_buffer)) {
992 return 0;
993 }
Adam Langley1258b6a2014-06-20 12:00:00 -0700994
Adam Langleyfcf25832014-12-18 17:42:32 -0800995 digests_len = tls1_handshake_digest(s, buf, sizeof(buf));
996 if (digests_len < 0) {
997 err = 1;
998 digests_len = 0;
999 }
Adam Langley95c29f32014-06-20 12:00:00 -07001000
Adam Langleyfcf25832014-12-18 17:42:32 -08001001 if (!tls1_PRF(ssl_get_algorithm2(s), str, slen, buf, digests_len, NULL, 0,
1002 s->session->master_key, s->session->master_key_length, out,
1003 buf2, sizeof buf2)) {
1004 err = 1;
1005 }
Adam Langley95c29f32014-06-20 12:00:00 -07001006
Adam Langleyfcf25832014-12-18 17:42:32 -08001007 if (err) {
1008 return 0;
1009 } else {
1010 return sizeof(buf2);
1011 }
1012}
Adam Langley95c29f32014-06-20 12:00:00 -07001013
Adam Langleyfcf25832014-12-18 17:42:32 -08001014int tls1_mac(SSL *ssl, uint8_t *md, int send) {
1015 SSL3_RECORD *rec;
1016 uint8_t *seq;
1017 EVP_MD_CTX *hash;
1018 size_t md_size, orig_len;
1019 int i, ok;
1020 EVP_MD_CTX hmac, *mac_ctx;
1021 uint8_t header[13];
1022 int t;
Adam Langley95c29f32014-06-20 12:00:00 -07001023
Adam Langleyfcf25832014-12-18 17:42:32 -08001024 if (send) {
1025 rec = &ssl->s3->wrec;
1026 seq = &ssl->s3->write_sequence[0];
1027 hash = ssl->write_hash;
1028 } else {
1029 rec = &ssl->s3->rrec;
1030 seq = &ssl->s3->read_sequence[0];
1031 hash = ssl->read_hash;
1032 }
Adam Langley95c29f32014-06-20 12:00:00 -07001033
Adam Langleyfcf25832014-12-18 17:42:32 -08001034 t = EVP_MD_CTX_size(hash);
1035 assert(t >= 0);
1036 md_size = t;
Adam Langley95c29f32014-06-20 12:00:00 -07001037
Adam Langleyfcf25832014-12-18 17:42:32 -08001038 mac_ctx = &hmac;
1039 if (!EVP_MD_CTX_copy(mac_ctx, hash)) {
1040 return -1;
1041 }
Adam Langley95c29f32014-06-20 12:00:00 -07001042
Adam Langleyfcf25832014-12-18 17:42:32 -08001043 if (SSL_IS_DTLS(ssl)) {
1044 uint8_t dtlsseq[8], *p = dtlsseq;
Adam Langley95c29f32014-06-20 12:00:00 -07001045
Adam Langleyfcf25832014-12-18 17:42:32 -08001046 s2n(send ? ssl->d1->w_epoch : ssl->d1->r_epoch, p);
1047 memcpy(p, &seq[2], 6);
Adam Langley95c29f32014-06-20 12:00:00 -07001048
Adam Langleyfcf25832014-12-18 17:42:32 -08001049 memcpy(header, dtlsseq, 8);
1050 } else {
1051 memcpy(header, seq, 8);
1052 }
Adam Langley95c29f32014-06-20 12:00:00 -07001053
Adam Langleyfcf25832014-12-18 17:42:32 -08001054 /* kludge: tls1_cbc_remove_padding passes padding length in rec->type */
1055 orig_len = rec->length + md_size + ((unsigned int)rec->type >> 8);
1056 rec->type &= 0xff;
Adam Langley95c29f32014-06-20 12:00:00 -07001057
Adam Langleyfcf25832014-12-18 17:42:32 -08001058 header[8] = rec->type;
1059 header[9] = (uint8_t)(ssl->version >> 8);
1060 header[10] = (uint8_t)(ssl->version);
1061 header[11] = (rec->length) >> 8;
1062 header[12] = (rec->length) & 0xff;
Adam Langley69a01602014-11-17 17:26:55 -08001063
Adam Langleyfcf25832014-12-18 17:42:32 -08001064 if (!send && EVP_CIPHER_CTX_mode(ssl->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
1065 ssl3_cbc_record_digest_supported(mac_ctx)) {
1066 /* This is a CBC-encrypted record. We must avoid leaking any timing-side
1067 * channel information about how many blocks of data we are hashing because
1068 * that gives an attacker a timing-oracle. */
1069 ok = ssl3_cbc_digest_record(
1070 mac_ctx, md, &md_size, header, rec->input, rec->length + md_size,
1071 orig_len, ssl->s3->read_mac_secret, ssl->s3->read_mac_secret_size,
1072 0 /* not SSLv3 */);
1073 } else {
1074 EVP_DigestSignUpdate(mac_ctx, header, sizeof(header));
1075 EVP_DigestSignUpdate(mac_ctx, rec->input, rec->length);
1076 ok = EVP_DigestSignFinal(mac_ctx, md, &md_size);
1077 }
Adam Langley69a01602014-11-17 17:26:55 -08001078
Adam Langleyfcf25832014-12-18 17:42:32 -08001079 EVP_MD_CTX_cleanup(mac_ctx);
Adam Langley95c29f32014-06-20 12:00:00 -07001080
Adam Langleyfcf25832014-12-18 17:42:32 -08001081 if (!ok) {
1082 return -1;
1083 }
Adam Langley95c29f32014-06-20 12:00:00 -07001084
Adam Langleyfcf25832014-12-18 17:42:32 -08001085 if (!SSL_IS_DTLS(ssl)) {
1086 for (i = 7; i >= 0; i--) {
1087 ++seq[i];
1088 if (seq[i] != 0) {
1089 break;
1090 }
1091 }
1092 }
Adam Langley95c29f32014-06-20 12:00:00 -07001093
Adam Langleyfcf25832014-12-18 17:42:32 -08001094 return md_size;
1095}
Adam Langley95c29f32014-06-20 12:00:00 -07001096
Adam Langleyfcf25832014-12-18 17:42:32 -08001097int tls1_generate_master_secret(SSL *s, uint8_t *out, uint8_t *p, int len) {
1098 uint8_t buff[SSL_MAX_MASTER_KEY_LENGTH];
Adam Langley75712922014-10-10 16:23:43 -07001099
Adam Langleyfcf25832014-12-18 17:42:32 -08001100 if (s->s3->tmp.extended_master_secret) {
1101 uint8_t digests[2 * EVP_MAX_MD_SIZE];
1102 int digests_len;
Adam Langley75712922014-10-10 16:23:43 -07001103
Adam Langleyfcf25832014-12-18 17:42:32 -08001104 /* The master secret is based on the handshake hash just after sending the
1105 * ClientKeyExchange. However, we might have a client certificate to send,
1106 * in which case we might need different hashes for the verification and
1107 * thus still need the handshake buffer around. Keeping both a handshake
1108 * buffer *and* running hashes isn't yet supported so, when it comes to
1109 * calculating the Finished hash, we'll have to hash the handshake buffer
1110 * again. */
1111 if (s->s3->handshake_buffer &&
1112 !ssl3_digest_cached_records(s, dont_free_handshake_buffer)) {
1113 return 0;
1114 }
Adam Langley75712922014-10-10 16:23:43 -07001115
Adam Langleyfcf25832014-12-18 17:42:32 -08001116 digests_len = tls1_handshake_digest(s, digests, sizeof(digests));
Adam Langley75712922014-10-10 16:23:43 -07001117
Adam Langleyfcf25832014-12-18 17:42:32 -08001118 if (digests_len == -1) {
1119 return 0;
1120 }
Adam Langley75712922014-10-10 16:23:43 -07001121
Adam Langleyfcf25832014-12-18 17:42:32 -08001122 tls1_PRF(ssl_get_algorithm2(s), TLS_MD_EXTENDED_MASTER_SECRET_CONST,
1123 TLS_MD_EXTENDED_MASTER_SECRET_CONST_SIZE, digests, digests_len,
1124 NULL, 0, p, len, s->session->master_key, buff, sizeof(buff));
1125 } else {
1126 tls1_PRF(ssl_get_algorithm2(s), TLS_MD_MASTER_SECRET_CONST,
1127 TLS_MD_MASTER_SECRET_CONST_SIZE, s->s3->client_random,
1128 SSL3_RANDOM_SIZE, s->s3->server_random, SSL3_RANDOM_SIZE, p, len,
1129 s->session->master_key, buff, sizeof buff);
1130 }
Adam Langley95c29f32014-06-20 12:00:00 -07001131
Adam Langleyfcf25832014-12-18 17:42:32 -08001132 return SSL3_MASTER_SECRET_SIZE;
1133}
Adam Langley95c29f32014-06-20 12:00:00 -07001134
Adam Langleyfcf25832014-12-18 17:42:32 -08001135int tls1_export_keying_material(SSL *s, uint8_t *out, size_t olen,
1136 const char *label, size_t llen,
1137 const uint8_t *context, size_t contextlen,
1138 int use_context) {
1139 uint8_t *buff;
1140 uint8_t *val = NULL;
1141 size_t vallen, currentvalpos;
1142 int ret;
Adam Langley95c29f32014-06-20 12:00:00 -07001143
Adam Langleyfcf25832014-12-18 17:42:32 -08001144 buff = OPENSSL_malloc(olen);
1145 if (buff == NULL) {
1146 goto err2;
1147 }
Adam Langley95c29f32014-06-20 12:00:00 -07001148
Adam Langleyfcf25832014-12-18 17:42:32 -08001149 /* construct PRF arguments we construct the PRF argument ourself rather than
1150 * passing separate values into the TLS PRF to ensure that the concatenation
1151 * of values does not create a prohibited label. */
1152 vallen = llen + SSL3_RANDOM_SIZE * 2;
1153 if (use_context) {
1154 vallen += 2 + contextlen;
1155 }
Adam Langley95c29f32014-06-20 12:00:00 -07001156
Adam Langleyfcf25832014-12-18 17:42:32 -08001157 val = OPENSSL_malloc(vallen);
1158 if (val == NULL) {
1159 goto err2;
1160 }
Adam Langley95c29f32014-06-20 12:00:00 -07001161
Adam Langleyfcf25832014-12-18 17:42:32 -08001162 currentvalpos = 0;
1163 memcpy(val + currentvalpos, (uint8_t *)label, llen);
1164 currentvalpos += llen;
1165 memcpy(val + currentvalpos, s->s3->client_random, SSL3_RANDOM_SIZE);
1166 currentvalpos += SSL3_RANDOM_SIZE;
1167 memcpy(val + currentvalpos, s->s3->server_random, SSL3_RANDOM_SIZE);
1168 currentvalpos += SSL3_RANDOM_SIZE;
Adam Langley95c29f32014-06-20 12:00:00 -07001169
Adam Langleyfcf25832014-12-18 17:42:32 -08001170 if (use_context) {
1171 val[currentvalpos] = (contextlen >> 8) & 0xff;
1172 currentvalpos++;
1173 val[currentvalpos] = contextlen & 0xff;
1174 currentvalpos++;
1175 if (contextlen > 0 || context != NULL) {
1176 memcpy(val + currentvalpos, context, contextlen);
1177 }
1178 }
Adam Langley95c29f32014-06-20 12:00:00 -07001179
Adam Langleyfcf25832014-12-18 17:42:32 -08001180 /* disallow prohibited labels note that SSL3_RANDOM_SIZE > max(prohibited
1181 * label len) = 15, so size of val > max(prohibited label len) = 15 and the
1182 * comparisons won't have buffer overflow. */
1183 if (memcmp(val, TLS_MD_CLIENT_FINISH_CONST,
1184 TLS_MD_CLIENT_FINISH_CONST_SIZE) == 0 ||
1185 memcmp(val, TLS_MD_SERVER_FINISH_CONST,
1186 TLS_MD_SERVER_FINISH_CONST_SIZE) == 0 ||
1187 memcmp(val, TLS_MD_MASTER_SECRET_CONST,
1188 TLS_MD_MASTER_SECRET_CONST_SIZE) == 0 ||
1189 memcmp(val, TLS_MD_KEY_EXPANSION_CONST,
1190 TLS_MD_KEY_EXPANSION_CONST_SIZE) == 0) {
1191 goto err1;
1192 }
Adam Langley95c29f32014-06-20 12:00:00 -07001193
Adam Langleyfcf25832014-12-18 17:42:32 -08001194 ret = tls1_PRF(ssl_get_algorithm2(s), val, vallen, NULL, 0, NULL, 0,
1195 s->session->master_key, s->session->master_key_length, out,
1196 buff, olen);
Adam Langley95c29f32014-06-20 12:00:00 -07001197
Adam Langleyfcf25832014-12-18 17:42:32 -08001198 goto out;
1199
Adam Langley95c29f32014-06-20 12:00:00 -07001200err1:
Adam Langleyfcf25832014-12-18 17:42:32 -08001201 OPENSSL_PUT_ERROR(SSL, tls1_export_keying_material,
1202 SSL_R_TLS_ILLEGAL_EXPORTER_LABEL);
1203 ret = 0;
1204 goto out;
Adam Langley95c29f32014-06-20 12:00:00 -07001205
Adam Langleyfcf25832014-12-18 17:42:32 -08001206err2:
1207 OPENSSL_PUT_ERROR(SSL, tls1_export_keying_material, ERR_R_MALLOC_FAILURE);
1208 ret = 0;
1209
1210out:
1211 if (buff != NULL) {
1212 OPENSSL_free(buff);
1213 }
1214 if (val != NULL) {
1215 OPENSSL_free(val);
1216 }
1217
1218 return ret;
1219}
1220
1221int tls1_alert_code(int code) {
1222 switch (code) {
1223 case SSL_AD_CLOSE_NOTIFY:
1224 return SSL3_AD_CLOSE_NOTIFY;
1225
1226 case SSL_AD_UNEXPECTED_MESSAGE:
1227 return SSL3_AD_UNEXPECTED_MESSAGE;
1228
1229 case SSL_AD_BAD_RECORD_MAC:
1230 return SSL3_AD_BAD_RECORD_MAC;
1231
1232 case SSL_AD_DECRYPTION_FAILED:
1233 return TLS1_AD_DECRYPTION_FAILED;
1234
1235 case SSL_AD_RECORD_OVERFLOW:
1236 return TLS1_AD_RECORD_OVERFLOW;
1237
1238 case SSL_AD_DECOMPRESSION_FAILURE:
1239 return SSL3_AD_DECOMPRESSION_FAILURE;
1240
1241 case SSL_AD_HANDSHAKE_FAILURE:
1242 return SSL3_AD_HANDSHAKE_FAILURE;
1243
1244 case SSL_AD_NO_CERTIFICATE:
1245 return -1;
1246
1247 case SSL_AD_BAD_CERTIFICATE:
1248 return SSL3_AD_BAD_CERTIFICATE;
1249
1250 case SSL_AD_UNSUPPORTED_CERTIFICATE:
1251 return SSL3_AD_UNSUPPORTED_CERTIFICATE;
1252
1253 case SSL_AD_CERTIFICATE_REVOKED:
1254 return SSL3_AD_CERTIFICATE_REVOKED;
1255
1256 case SSL_AD_CERTIFICATE_EXPIRED:
1257 return SSL3_AD_CERTIFICATE_EXPIRED;
1258
1259 case SSL_AD_CERTIFICATE_UNKNOWN:
1260 return SSL3_AD_CERTIFICATE_UNKNOWN;
1261
1262 case SSL_AD_ILLEGAL_PARAMETER:
1263 return SSL3_AD_ILLEGAL_PARAMETER;
1264
1265 case SSL_AD_UNKNOWN_CA:
1266 return TLS1_AD_UNKNOWN_CA;
1267
1268 case SSL_AD_ACCESS_DENIED:
1269 return TLS1_AD_ACCESS_DENIED;
1270
1271 case SSL_AD_DECODE_ERROR:
1272 return TLS1_AD_DECODE_ERROR;
1273
1274 case SSL_AD_DECRYPT_ERROR:
1275 return TLS1_AD_DECRYPT_ERROR;
1276 case SSL_AD_EXPORT_RESTRICTION:
1277 return TLS1_AD_EXPORT_RESTRICTION;
1278
1279 case SSL_AD_PROTOCOL_VERSION:
1280 return TLS1_AD_PROTOCOL_VERSION;
1281
1282 case SSL_AD_INSUFFICIENT_SECURITY:
1283 return TLS1_AD_INSUFFICIENT_SECURITY;
1284
1285 case SSL_AD_INTERNAL_ERROR:
1286 return TLS1_AD_INTERNAL_ERROR;
1287
1288 case SSL_AD_USER_CANCELLED:
1289 return TLS1_AD_USER_CANCELLED;
1290
1291 case SSL_AD_NO_RENEGOTIATION:
1292 return TLS1_AD_NO_RENEGOTIATION;
1293
1294 case SSL_AD_UNSUPPORTED_EXTENSION:
1295 return TLS1_AD_UNSUPPORTED_EXTENSION;
1296
1297 case SSL_AD_CERTIFICATE_UNOBTAINABLE:
1298 return TLS1_AD_CERTIFICATE_UNOBTAINABLE;
1299
1300 case SSL_AD_UNRECOGNIZED_NAME:
1301 return TLS1_AD_UNRECOGNIZED_NAME;
1302
1303 case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE:
1304 return TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
1305
1306 case SSL_AD_BAD_CERTIFICATE_HASH_VALUE:
1307 return TLS1_AD_BAD_CERTIFICATE_HASH_VALUE;
1308
1309 case SSL_AD_UNKNOWN_PSK_IDENTITY:
1310 return TLS1_AD_UNKNOWN_PSK_IDENTITY;
1311
1312 case SSL_AD_INAPPROPRIATE_FALLBACK:
1313 return SSL3_AD_INAPPROPRIATE_FALLBACK;
1314
1315 default:
1316 return -1;
1317 }
1318}