blob: f860609eeb0fec533285a02d5be3c15d48765589 [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.
David Benjamin820731a2015-07-23 20:01:51 -04007 *
Adam Langley95c29f32014-06-20 12:00:00 -07008 * 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).
David Benjamin820731a2015-07-23 20:01:51 -040014 *
Adam Langley95c29f32014-06-20 12:00:00 -070015 * 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.
David Benjamin820731a2015-07-23 20:01:51 -040021 *
Adam Langley95c29f32014-06-20 12:00:00 -070022 * 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 :-).
David Benjamin820731a2015-07-23 20:01:51 -040036 * 4. If you include any Windows specific code (or a derivative thereof) from
Adam Langley95c29f32014-06-20 12:00:00 -070037 * the apps directory (application code) you must include an acknowledgement:
38 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
David Benjamin820731a2015-07-23 20:01:51 -040039 *
Adam Langley95c29f32014-06-20 12:00:00 -070040 * 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.
David Benjamin820731a2015-07-23 20:01:51 -040051 *
Adam Langley95c29f32014-06-20 12:00:00 -070052 * 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
David Benjamin820731a2015-07-23 20:01:51 -040065 * notice, this list of conditions and the following disclaimer.
Adam Langley95c29f32014-06-20 12:00:00 -070066 *
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
Adam Langley95c29f32014-06-20 12:00:00 -0700136#include <assert.h>
David Benjaminf0ae1702015-04-07 23:05:04 -0400137#include <stdio.h>
138#include <string.h>
Adam Langley95c29f32014-06-20 12:00:00 -0700139
140#include <openssl/err.h>
141#include <openssl/evp.h>
142#include <openssl/mem.h>
143#include <openssl/md5.h>
144#include <openssl/obj.h>
145
David Benjamin2ee94aa2015-04-07 22:38:30 -0400146#include "internal.h"
Adam Langley95c29f32014-06-20 12:00:00 -0700147
Adam Langley95c29f32014-06-20 12:00:00 -0700148
Adam Langleybe2900a2014-12-18 12:09:04 -0800149static const uint8_t ssl3_pad_1[48] = {
150 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
151 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
152 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
153 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
154};
Adam Langley95c29f32014-06-20 12:00:00 -0700155
Adam Langleybe2900a2014-12-18 12:09:04 -0800156static const uint8_t ssl3_pad_2[48] = {
157 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
158 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
159 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
160 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
161};
Adam Langley95c29f32014-06-20 12:00:00 -0700162
Adam Langleybe2900a2014-12-18 12:09:04 -0800163static int ssl3_handshake_mac(SSL *s, int md_nid, const char *sender, int len,
164 uint8_t *p);
Adam Langley95c29f32014-06-20 12:00:00 -0700165
David Benjamin41ac9792014-12-23 10:41:06 -0500166int ssl3_prf(SSL *s, uint8_t *out, size_t out_len, const uint8_t *secret,
167 size_t secret_len, const char *label, size_t label_len,
168 const uint8_t *seed1, size_t seed1_len,
169 const uint8_t *seed2, size_t seed2_len) {
Adam Langleybe2900a2014-12-18 12:09:04 -0800170 EVP_MD_CTX md5;
171 EVP_MD_CTX sha1;
172 uint8_t buf[16], smd[SHA_DIGEST_LENGTH];
173 uint8_t c = 'A';
David Benjamin31b1d812014-12-23 10:01:09 -0500174 size_t i, j, k;
Adam Langley95c29f32014-06-20 12:00:00 -0700175
Adam Langleybe2900a2014-12-18 12:09:04 -0800176 k = 0;
177 EVP_MD_CTX_init(&md5);
178 EVP_MD_CTX_init(&sha1);
David Benjamin31b1d812014-12-23 10:01:09 -0500179 for (i = 0; i < out_len; i += MD5_DIGEST_LENGTH) {
Adam Langleybe2900a2014-12-18 12:09:04 -0800180 k++;
181 if (k > sizeof(buf)) {
182 /* bug: 'buf' is too small for this ciphersuite */
David Benjamin3570d732015-06-29 00:28:17 -0400183 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
Adam Langleybe2900a2014-12-18 12:09:04 -0800184 return 0;
185 }
Adam Langley95c29f32014-06-20 12:00:00 -0700186
Adam Langleybe2900a2014-12-18 12:09:04 -0800187 for (j = 0; j < k; j++) {
188 buf[j] = c;
189 }
190 c++;
191 if (!EVP_DigestInit_ex(&sha1, EVP_sha1(), NULL)) {
David Benjamin3570d732015-06-29 00:28:17 -0400192 OPENSSL_PUT_ERROR(SSL, ERR_LIB_EVP);
Adam Langleybe2900a2014-12-18 12:09:04 -0800193 return 0;
194 }
195 EVP_DigestUpdate(&sha1, buf, k);
David Benjamin31b1d812014-12-23 10:01:09 -0500196 EVP_DigestUpdate(&sha1, secret, secret_len);
David Benjamin41ac9792014-12-23 10:41:06 -0500197 /* |label| is ignored for SSLv3. */
David Benjamin31b1d812014-12-23 10:01:09 -0500198 if (seed1_len) {
199 EVP_DigestUpdate(&sha1, seed1, seed1_len);
200 }
201 if (seed2_len) {
202 EVP_DigestUpdate(&sha1, seed2, seed2_len);
203 }
Adam Langleybe2900a2014-12-18 12:09:04 -0800204 EVP_DigestFinal_ex(&sha1, smd, NULL);
Adam Langley95c29f32014-06-20 12:00:00 -0700205
Adam Langleybe2900a2014-12-18 12:09:04 -0800206 if (!EVP_DigestInit_ex(&md5, EVP_md5(), NULL)) {
David Benjamin3570d732015-06-29 00:28:17 -0400207 OPENSSL_PUT_ERROR(SSL, ERR_LIB_EVP);
Adam Langleybe2900a2014-12-18 12:09:04 -0800208 return 0;
209 }
David Benjamin31b1d812014-12-23 10:01:09 -0500210 EVP_DigestUpdate(&md5, secret, secret_len);
Adam Langleybe2900a2014-12-18 12:09:04 -0800211 EVP_DigestUpdate(&md5, smd, SHA_DIGEST_LENGTH);
David Benjamin31b1d812014-12-23 10:01:09 -0500212 if (i + MD5_DIGEST_LENGTH > out_len) {
Adam Langleybe2900a2014-12-18 12:09:04 -0800213 EVP_DigestFinal_ex(&md5, smd, NULL);
David Benjamin31b1d812014-12-23 10:01:09 -0500214 memcpy(out, smd, out_len - i);
Adam Langleybe2900a2014-12-18 12:09:04 -0800215 } else {
David Benjamin31b1d812014-12-23 10:01:09 -0500216 EVP_DigestFinal_ex(&md5, out, NULL);
Adam Langleybe2900a2014-12-18 12:09:04 -0800217 }
Adam Langley95c29f32014-06-20 12:00:00 -0700218
David Benjamin31b1d812014-12-23 10:01:09 -0500219 out += MD5_DIGEST_LENGTH;
Adam Langleybe2900a2014-12-18 12:09:04 -0800220 }
Adam Langley95c29f32014-06-20 12:00:00 -0700221
Adam Langleybe2900a2014-12-18 12:09:04 -0800222 OPENSSL_cleanse(smd, SHA_DIGEST_LENGTH);
223 EVP_MD_CTX_cleanup(&md5);
224 EVP_MD_CTX_cleanup(&sha1);
Adam Langley95c29f32014-06-20 12:00:00 -0700225
Adam Langleybe2900a2014-12-18 12:09:04 -0800226 return 1;
227}
Adam Langley95c29f32014-06-20 12:00:00 -0700228
Adam Langleybe2900a2014-12-18 12:09:04 -0800229void ssl3_cleanup_key_block(SSL *s) {
230 if (s->s3->tmp.key_block != NULL) {
231 OPENSSL_cleanse(s->s3->tmp.key_block, s->s3->tmp.key_block_length);
232 OPENSSL_free(s->s3->tmp.key_block);
233 s->s3->tmp.key_block = NULL;
234 }
235 s->s3->tmp.key_block_length = 0;
236}
Adam Langley95c29f32014-06-20 12:00:00 -0700237
David Benjamin9550c3a2015-08-05 08:50:34 -0400238int ssl3_init_handshake_buffer(SSL *ssl) {
239 ssl3_free_handshake_buffer(ssl);
240 ssl3_free_handshake_hash(ssl);
David Benjamin5375fd52015-08-06 01:32:10 -0400241 ssl->s3->handshake_buffer = BUF_MEM_new();
242 return ssl->s3->handshake_buffer != NULL;
Adam Langleybe2900a2014-12-18 12:09:04 -0800243}
Adam Langley95c29f32014-06-20 12:00:00 -0700244
David Benjamin9550c3a2015-08-05 08:50:34 -0400245int ssl3_init_handshake_hash(SSL *ssl) {
Adam Langleybe2900a2014-12-18 12:09:04 -0800246 int i;
David Benjamin107db582015-04-08 00:41:59 -0400247 uint32_t mask;
Adam Langleybe2900a2014-12-18 12:09:04 -0800248 const EVP_MD *md;
Adam Langley95c29f32014-06-20 12:00:00 -0700249
Adam Langleybe2900a2014-12-18 12:09:04 -0800250 /* Allocate handshake_dgst array */
David Benjamin9550c3a2015-08-05 08:50:34 -0400251 ssl3_free_handshake_hash(ssl);
252 ssl->s3->handshake_dgst = OPENSSL_malloc(SSL_MAX_DIGEST *
253 sizeof(EVP_MD_CTX *));
254 if (ssl->s3->handshake_dgst == NULL) {
David Benjamin3570d732015-06-29 00:28:17 -0400255 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
Adam Langleybe2900a2014-12-18 12:09:04 -0800256 return 0;
257 }
David Benjamin9550c3a2015-08-05 08:50:34 -0400258 memset(ssl->s3->handshake_dgst, 0, SSL_MAX_DIGEST * sizeof(EVP_MD_CTX *));
Adam Langley95c29f32014-06-20 12:00:00 -0700259
David Benjamin5055c762015-08-04 09:24:14 -0400260 /* Loop through bits of algorithm_prf field and create MD_CTX-es */
David Benjamin71f07942015-04-08 02:36:59 -0400261 for (i = 0; ssl_get_handshake_digest(&mask, &md, i); i++) {
David Benjamin9550c3a2015-08-05 08:50:34 -0400262 if ((mask & ssl_get_algorithm_prf(ssl)) && md) {
263 ssl->s3->handshake_dgst[i] = EVP_MD_CTX_create();
264 if (ssl->s3->handshake_dgst[i] == NULL) {
David Benjamin3570d732015-06-29 00:28:17 -0400265 OPENSSL_PUT_ERROR(SSL, ERR_LIB_EVP);
Adam Langleybe2900a2014-12-18 12:09:04 -0800266 return 0;
267 }
David Benjamin9550c3a2015-08-05 08:50:34 -0400268 if (!EVP_DigestInit_ex(ssl->s3->handshake_dgst[i], md, NULL)) {
269 EVP_MD_CTX_destroy(ssl->s3->handshake_dgst[i]);
270 ssl->s3->handshake_dgst[i] = NULL;
David Benjamin3570d732015-06-29 00:28:17 -0400271 OPENSSL_PUT_ERROR(SSL, ERR_LIB_EVP);
Adam Langleybe2900a2014-12-18 12:09:04 -0800272 return 0;
273 }
David Benjamin5375fd52015-08-06 01:32:10 -0400274 EVP_DigestUpdate(ssl->s3->handshake_dgst[i],
275 ssl->s3->handshake_buffer->data,
276 ssl->s3->handshake_buffer->length);
Adam Langleybe2900a2014-12-18 12:09:04 -0800277 } else {
David Benjamin9550c3a2015-08-05 08:50:34 -0400278 ssl->s3->handshake_dgst[i] = NULL;
Adam Langleybe2900a2014-12-18 12:09:04 -0800279 }
280 }
Adam Langley95c29f32014-06-20 12:00:00 -0700281
David Benjamin9550c3a2015-08-05 08:50:34 -0400282 return 1;
283}
284
285void ssl3_free_handshake_hash(SSL *ssl) {
286 int i;
287 if (!ssl->s3->handshake_dgst) {
288 return;
289 }
290 for (i = 0; i < SSL_MAX_DIGEST; i++) {
291 if (ssl->s3->handshake_dgst[i]) {
292 EVP_MD_CTX_destroy(ssl->s3->handshake_dgst[i]);
293 }
294 }
295 OPENSSL_free(ssl->s3->handshake_dgst);
296 ssl->s3->handshake_dgst = NULL;
297}
298
299void ssl3_free_handshake_buffer(SSL *ssl) {
David Benjamin5375fd52015-08-06 01:32:10 -0400300 BUF_MEM_free(ssl->s3->handshake_buffer);
David Benjamin9550c3a2015-08-05 08:50:34 -0400301 ssl->s3->handshake_buffer = NULL;
302}
303
304int ssl3_update_handshake_hash(SSL *ssl, const uint8_t *in, size_t in_len) {
305 /* Depending on the state of the handshake, either the handshake buffer may be
306 * active, the rolling hash, or both. */
307
David Benjamin5375fd52015-08-06 01:32:10 -0400308 if (ssl->s3->handshake_buffer != NULL) {
309 size_t new_len = ssl->s3->handshake_buffer->length + in_len;
310 if (new_len < in_len) {
311 OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
312 return 0;
313 }
314 if (!BUF_MEM_grow(ssl->s3->handshake_buffer, new_len)) {
315 return 0;
316 }
317 memcpy(ssl->s3->handshake_buffer->data + new_len - in_len, in, in_len);
Adam Langleybe2900a2014-12-18 12:09:04 -0800318 }
Adam Langley0fbf33a2014-06-20 12:00:00 -0700319
David Benjamin9550c3a2015-08-05 08:50:34 -0400320 if (ssl->s3->handshake_dgst != NULL) {
321 int i;
322 for (i = 0; i < SSL_MAX_DIGEST; i++) {
323 if (ssl->s3->handshake_dgst[i] != NULL) {
324 EVP_DigestUpdate(ssl->s3->handshake_dgst[i], in, in_len);
325 }
326 }
327 }
Adam Langleybe2900a2014-12-18 12:09:04 -0800328 return 1;
329}
Adam Langley0fbf33a2014-06-20 12:00:00 -0700330
Adam Langleybe2900a2014-12-18 12:09:04 -0800331int ssl3_cert_verify_mac(SSL *s, int md_nid, uint8_t *p) {
332 return ssl3_handshake_mac(s, md_nid, NULL, 0, p);
333}
Adam Langley0fbf33a2014-06-20 12:00:00 -0700334
Adam Langleybe2900a2014-12-18 12:09:04 -0800335int ssl3_final_finish_mac(SSL *s, const char *sender, int len, uint8_t *p) {
336 int ret, sha1len;
337 ret = ssl3_handshake_mac(s, NID_md5, sender, len, p);
338 if (ret == 0) {
339 return 0;
340 }
Adam Langley95c29f32014-06-20 12:00:00 -0700341
Adam Langleybe2900a2014-12-18 12:09:04 -0800342 p += ret;
Adam Langley95c29f32014-06-20 12:00:00 -0700343
Adam Langleybe2900a2014-12-18 12:09:04 -0800344 sha1len = ssl3_handshake_mac(s, NID_sha1, sender, len, p);
345 if (sha1len == 0) {
346 return 0;
347 }
Adam Langley95c29f32014-06-20 12:00:00 -0700348
Adam Langleybe2900a2014-12-18 12:09:04 -0800349 ret += sha1len;
350 return ret;
351}
Adam Langley95c29f32014-06-20 12:00:00 -0700352
Adam Langleybe2900a2014-12-18 12:09:04 -0800353static int ssl3_handshake_mac(SSL *s, int md_nid, const char *sender, int len,
354 uint8_t *p) {
355 unsigned int ret;
356 int npad, n;
357 unsigned int i;
358 uint8_t md_buf[EVP_MAX_MD_SIZE];
359 EVP_MD_CTX ctx, *d = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -0700360
Adam Langleybe2900a2014-12-18 12:09:04 -0800361 /* Search for digest of specified type in the handshake_dgst array. */
362 for (i = 0; i < SSL_MAX_DIGEST; i++) {
363 if (s->s3->handshake_dgst[i] &&
364 EVP_MD_CTX_type(s->s3->handshake_dgst[i]) == md_nid) {
365 d = s->s3->handshake_dgst[i];
366 break;
367 }
368 }
Adam Langley95c29f32014-06-20 12:00:00 -0700369
Adam Langleybe2900a2014-12-18 12:09:04 -0800370 if (!d) {
David Benjamin3570d732015-06-29 00:28:17 -0400371 OPENSSL_PUT_ERROR(SSL, SSL_R_NO_REQUIRED_DIGEST);
Adam Langleybe2900a2014-12-18 12:09:04 -0800372 return 0;
373 }
Adam Langley95c29f32014-06-20 12:00:00 -0700374
Adam Langleybe2900a2014-12-18 12:09:04 -0800375 EVP_MD_CTX_init(&ctx);
376 if (!EVP_MD_CTX_copy_ex(&ctx, d)) {
377 EVP_MD_CTX_cleanup(&ctx);
David Benjamin3570d732015-06-29 00:28:17 -0400378 OPENSSL_PUT_ERROR(SSL, ERR_LIB_EVP);
Adam Langleybe2900a2014-12-18 12:09:04 -0800379 return 0;
380 }
Adam Langley95c29f32014-06-20 12:00:00 -0700381
Adam Langleybe2900a2014-12-18 12:09:04 -0800382 n = EVP_MD_CTX_size(&ctx);
383 if (n < 0) {
384 return 0;
385 }
Adam Langley95c29f32014-06-20 12:00:00 -0700386
Adam Langleybe2900a2014-12-18 12:09:04 -0800387 npad = (48 / n) * n;
388 if (sender != NULL) {
389 EVP_DigestUpdate(&ctx, sender, len);
390 }
391 EVP_DigestUpdate(&ctx, s->session->master_key, s->session->master_key_length);
392 EVP_DigestUpdate(&ctx, ssl3_pad_1, npad);
393 EVP_DigestFinal_ex(&ctx, md_buf, &i);
Adam Langley95c29f32014-06-20 12:00:00 -0700394
Adam Langleybe2900a2014-12-18 12:09:04 -0800395 if (!EVP_DigestInit_ex(&ctx, EVP_MD_CTX_md(&ctx), NULL)) {
396 EVP_MD_CTX_cleanup(&ctx);
David Benjamin3570d732015-06-29 00:28:17 -0400397 OPENSSL_PUT_ERROR(SSL, ERR_LIB_EVP);
Adam Langleybe2900a2014-12-18 12:09:04 -0800398 return 0;
399 }
400 EVP_DigestUpdate(&ctx, s->session->master_key, s->session->master_key_length);
401 EVP_DigestUpdate(&ctx, ssl3_pad_2, npad);
402 EVP_DigestUpdate(&ctx, md_buf, i);
403 EVP_DigestFinal_ex(&ctx, p, &ret);
Adam Langley95c29f32014-06-20 12:00:00 -0700404
Adam Langleybe2900a2014-12-18 12:09:04 -0800405 EVP_MD_CTX_cleanup(&ctx);
Adam Langley95c29f32014-06-20 12:00:00 -0700406
Adam Langleybe2900a2014-12-18 12:09:04 -0800407 return ret;
408}
Adam Langley95c29f32014-06-20 12:00:00 -0700409
David Benjamind81e73d2015-04-05 00:21:39 -0400410int ssl3_record_sequence_update(uint8_t *seq, size_t seq_len) {
411 size_t i;
412 for (i = seq_len - 1; i < seq_len; i--) {
Adam Langleybe2900a2014-12-18 12:09:04 -0800413 ++seq[i];
414 if (seq[i] != 0) {
David Benjamind81e73d2015-04-05 00:21:39 -0400415 return 1;
Adam Langleybe2900a2014-12-18 12:09:04 -0800416 }
417 }
David Benjamin3570d732015-06-29 00:28:17 -0400418 OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
David Benjamind81e73d2015-04-05 00:21:39 -0400419 return 0;
Adam Langleybe2900a2014-12-18 12:09:04 -0800420}
Adam Langley95c29f32014-06-20 12:00:00 -0700421
Adam Langleybe2900a2014-12-18 12:09:04 -0800422int ssl3_alert_code(int code) {
423 switch (code) {
424 case SSL_AD_CLOSE_NOTIFY:
425 return SSL3_AD_CLOSE_NOTIFY;
426
427 case SSL_AD_UNEXPECTED_MESSAGE:
428 return SSL3_AD_UNEXPECTED_MESSAGE;
429
430 case SSL_AD_BAD_RECORD_MAC:
431 return SSL3_AD_BAD_RECORD_MAC;
432
433 case SSL_AD_DECRYPTION_FAILED:
434 return SSL3_AD_BAD_RECORD_MAC;
435
436 case SSL_AD_RECORD_OVERFLOW:
437 return SSL3_AD_BAD_RECORD_MAC;
438
439 case SSL_AD_DECOMPRESSION_FAILURE:
440 return SSL3_AD_DECOMPRESSION_FAILURE;
441
442 case SSL_AD_HANDSHAKE_FAILURE:
443 return SSL3_AD_HANDSHAKE_FAILURE;
444
445 case SSL_AD_NO_CERTIFICATE:
446 return SSL3_AD_NO_CERTIFICATE;
447
448 case SSL_AD_BAD_CERTIFICATE:
449 return SSL3_AD_BAD_CERTIFICATE;
450
451 case SSL_AD_UNSUPPORTED_CERTIFICATE:
452 return SSL3_AD_UNSUPPORTED_CERTIFICATE;
453
454 case SSL_AD_CERTIFICATE_REVOKED:
455 return SSL3_AD_CERTIFICATE_REVOKED;
456
457 case SSL_AD_CERTIFICATE_EXPIRED:
458 return SSL3_AD_CERTIFICATE_EXPIRED;
459
460 case SSL_AD_CERTIFICATE_UNKNOWN:
461 return SSL3_AD_CERTIFICATE_UNKNOWN;
462
463 case SSL_AD_ILLEGAL_PARAMETER:
464 return SSL3_AD_ILLEGAL_PARAMETER;
465
466 case SSL_AD_UNKNOWN_CA:
467 return SSL3_AD_BAD_CERTIFICATE;
468
469 case SSL_AD_ACCESS_DENIED:
470 return SSL3_AD_HANDSHAKE_FAILURE;
471
472 case SSL_AD_DECODE_ERROR:
473 return SSL3_AD_HANDSHAKE_FAILURE;
474
475 case SSL_AD_DECRYPT_ERROR:
476 return SSL3_AD_HANDSHAKE_FAILURE;
477
478 case SSL_AD_EXPORT_RESTRICTION:
479 return SSL3_AD_HANDSHAKE_FAILURE;
480
481 case SSL_AD_PROTOCOL_VERSION:
482 return SSL3_AD_HANDSHAKE_FAILURE;
483
484 case SSL_AD_INSUFFICIENT_SECURITY:
485 return SSL3_AD_HANDSHAKE_FAILURE;
486
487 case SSL_AD_INTERNAL_ERROR:
488 return SSL3_AD_HANDSHAKE_FAILURE;
489
490 case SSL_AD_USER_CANCELLED:
491 return SSL3_AD_HANDSHAKE_FAILURE;
492
493 case SSL_AD_NO_RENEGOTIATION:
494 return -1; /* Don't send it. */
495
496 case SSL_AD_UNSUPPORTED_EXTENSION:
497 return SSL3_AD_HANDSHAKE_FAILURE;
498
499 case SSL_AD_CERTIFICATE_UNOBTAINABLE:
500 return SSL3_AD_HANDSHAKE_FAILURE;
501
502 case SSL_AD_UNRECOGNIZED_NAME:
503 return SSL3_AD_HANDSHAKE_FAILURE;
504
505 case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE:
506 return SSL3_AD_HANDSHAKE_FAILURE;
507
508 case SSL_AD_BAD_CERTIFICATE_HASH_VALUE:
509 return SSL3_AD_HANDSHAKE_FAILURE;
510
511 case SSL_AD_UNKNOWN_PSK_IDENTITY:
512 return TLS1_AD_UNKNOWN_PSK_IDENTITY;
513
514 case SSL_AD_INAPPROPRIATE_FALLBACK:
515 return SSL3_AD_INAPPROPRIATE_FALLBACK;
516
517 default:
518 return -1;
519 }
520}