blob: 7436027c79c451f2e0fdb55130a4c61b2f448a22 [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
David Benjamin86e95b82017-07-18 16:34:25 -0400136#define BORINGSSL_INTERNAL_CXX_TYPES
137
David Benjamin9e4e01e2015-09-15 01:48:04 -0400138#include <openssl/ssl.h>
139
Adam Langley95c29f32014-06-20 12:00:00 -0700140#include <assert.h>
David Benjaminf0ae1702015-04-07 23:05:04 -0400141#include <string.h>
Adam Langley95c29f32014-06-20 12:00:00 -0700142
Steven Valdez908ac192017-01-12 13:17:07 -0500143#include <openssl/buf.h>
144#include <openssl/digest.h>
Adam Langley95c29f32014-06-20 12:00:00 -0700145#include <openssl/err.h>
Adam Langley95c29f32014-06-20 12:00:00 -0700146#include <openssl/mem.h>
147#include <openssl/md5.h>
David Benjamin98193672016-03-25 18:07:11 -0400148#include <openssl/nid.h>
Steven Valdez908ac192017-01-12 13:17:07 -0500149#include <openssl/sha.h>
Adam Langley95c29f32014-06-20 12:00:00 -0700150
David Benjamin17cf2cb2016-12-13 01:07:13 -0500151#include "../crypto/internal.h"
David Benjamin2ee94aa2015-04-07 22:38:30 -0400152#include "internal.h"
Adam Langley95c29f32014-06-20 12:00:00 -0700153
David Benjamin17cf2cb2016-12-13 01:07:13 -0500154
David Benjamin86e95b82017-07-18 16:34:25 -0400155namespace bssl {
156
Steven Valdez908ac192017-01-12 13:17:07 -0500157int SSL_TRANSCRIPT_init(SSL_TRANSCRIPT *transcript) {
158 SSL_TRANSCRIPT_cleanup(transcript);
159 transcript->buffer = BUF_MEM_new();
160 return transcript->buffer != NULL;
Adam Langleybe2900a2014-12-18 12:09:04 -0800161}
Adam Langley95c29f32014-06-20 12:00:00 -0700162
David Benjaminb0883312015-08-06 09:54:13 -0400163/* init_digest_with_data calls |EVP_DigestInit_ex| on |ctx| with |md| and then
164 * writes the data in |buf| to it. */
165static int init_digest_with_data(EVP_MD_CTX *ctx, const EVP_MD *md,
166 const BUF_MEM *buf) {
167 if (!EVP_DigestInit_ex(ctx, md, NULL)) {
Adam Langleybe2900a2014-12-18 12:09:04 -0800168 return 0;
169 }
David Benjaminb0883312015-08-06 09:54:13 -0400170 EVP_DigestUpdate(ctx, buf->data, buf->length);
171 return 1;
172}
Adam Langley95c29f32014-06-20 12:00:00 -0700173
Steven Valdez908ac192017-01-12 13:17:07 -0500174int SSL_TRANSCRIPT_init_hash(SSL_TRANSCRIPT *transcript, uint16_t version,
175 int algorithm_prf) {
176 const EVP_MD *md = ssl_get_handshake_digest(algorithm_prf, version);
David Benjaminb0883312015-08-06 09:54:13 -0400177
Steven Valdez908ac192017-01-12 13:17:07 -0500178 /* To support SSL 3.0's Finished and CertificateVerify constructions,
179 * EVP_md5_sha1() is split into MD5 and SHA-1 halves. When SSL 3.0 is removed,
180 * we can simplify this. */
181 if (md == EVP_md5_sha1()) {
182 if (!init_digest_with_data(&transcript->md5, EVP_md5(),
183 transcript->buffer)) {
184 return 0;
185 }
186 md = EVP_sha1();
David Benjaminb0883312015-08-06 09:54:13 -0400187 }
188
Steven Valdez908ac192017-01-12 13:17:07 -0500189 if (!init_digest_with_data(&transcript->hash, md, transcript->buffer)) {
David Benjaminb0883312015-08-06 09:54:13 -0400190 return 0;
Adam Langleybe2900a2014-12-18 12:09:04 -0800191 }
Adam Langley95c29f32014-06-20 12:00:00 -0700192
David Benjamin9550c3a2015-08-05 08:50:34 -0400193 return 1;
194}
195
Steven Valdez908ac192017-01-12 13:17:07 -0500196void SSL_TRANSCRIPT_cleanup(SSL_TRANSCRIPT *transcript) {
197 SSL_TRANSCRIPT_free_buffer(transcript);
198 EVP_MD_CTX_cleanup(&transcript->hash);
199 EVP_MD_CTX_cleanup(&transcript->md5);
David Benjamin9550c3a2015-08-05 08:50:34 -0400200}
201
Steven Valdez908ac192017-01-12 13:17:07 -0500202void SSL_TRANSCRIPT_free_buffer(SSL_TRANSCRIPT *transcript) {
203 BUF_MEM_free(transcript->buffer);
204 transcript->buffer = NULL;
David Benjamin9550c3a2015-08-05 08:50:34 -0400205}
206
Steven Valdez908ac192017-01-12 13:17:07 -0500207size_t SSL_TRANSCRIPT_digest_len(const SSL_TRANSCRIPT *transcript) {
208 return EVP_MD_size(SSL_TRANSCRIPT_md(transcript));
209}
210
211const EVP_MD *SSL_TRANSCRIPT_md(const SSL_TRANSCRIPT *transcript) {
212 if (EVP_MD_CTX_md(&transcript->md5) != NULL) {
213 return EVP_md5_sha1();
214 }
215 return EVP_MD_CTX_md(&transcript->hash);
216}
217
218int SSL_TRANSCRIPT_update(SSL_TRANSCRIPT *transcript, const uint8_t *in,
219 size_t in_len) {
David Benjamin9550c3a2015-08-05 08:50:34 -0400220 /* Depending on the state of the handshake, either the handshake buffer may be
221 * active, the rolling hash, or both. */
Steven Valdez908ac192017-01-12 13:17:07 -0500222 if (transcript->buffer != NULL) {
223 size_t new_len = transcript->buffer->length + in_len;
David Benjamin5375fd52015-08-06 01:32:10 -0400224 if (new_len < in_len) {
225 OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
226 return 0;
227 }
Steven Valdez908ac192017-01-12 13:17:07 -0500228 if (!BUF_MEM_grow(transcript->buffer, new_len)) {
David Benjamin5375fd52015-08-06 01:32:10 -0400229 return 0;
230 }
Steven Valdez908ac192017-01-12 13:17:07 -0500231 OPENSSL_memcpy(transcript->buffer->data + new_len - in_len, in, in_len);
Adam Langleybe2900a2014-12-18 12:09:04 -0800232 }
Adam Langley0fbf33a2014-06-20 12:00:00 -0700233
Steven Valdez908ac192017-01-12 13:17:07 -0500234 if (EVP_MD_CTX_md(&transcript->hash) != NULL) {
235 EVP_DigestUpdate(&transcript->hash, in, in_len);
David Benjaminb0883312015-08-06 09:54:13 -0400236 }
Steven Valdez908ac192017-01-12 13:17:07 -0500237 if (EVP_MD_CTX_md(&transcript->md5) != NULL) {
238 EVP_DigestUpdate(&transcript->md5, in, in_len);
David Benjamin9550c3a2015-08-05 08:50:34 -0400239 }
Steven Valdez908ac192017-01-12 13:17:07 -0500240
Adam Langleybe2900a2014-12-18 12:09:04 -0800241 return 1;
242}
Adam Langley0fbf33a2014-06-20 12:00:00 -0700243
Steven Valdez908ac192017-01-12 13:17:07 -0500244int SSL_TRANSCRIPT_get_hash(const SSL_TRANSCRIPT *transcript, uint8_t *out,
245 size_t *out_len) {
246 int ret = 0;
247 EVP_MD_CTX ctx;
248 EVP_MD_CTX_init(&ctx);
249 unsigned md5_len = 0;
250 if (EVP_MD_CTX_md(&transcript->md5) != NULL) {
251 if (!EVP_MD_CTX_copy_ex(&ctx, &transcript->md5) ||
252 !EVP_DigestFinal_ex(&ctx, out, &md5_len)) {
253 goto err;
254 }
255 }
256
257 unsigned len;
258 if (!EVP_MD_CTX_copy_ex(&ctx, &transcript->hash) ||
259 !EVP_DigestFinal_ex(&ctx, out + md5_len, &len)) {
260 goto err;
261 }
262
263 *out_len = md5_len + len;
264 ret = 1;
265
266err:
267 EVP_MD_CTX_cleanup(&ctx);
268 return ret;
269}
270
271static int ssl3_handshake_mac(SSL_TRANSCRIPT *transcript,
272 const SSL_SESSION *session,
273 const EVP_MD_CTX *ctx_template,
274 const char *sender, size_t sender_len,
275 uint8_t *p, size_t *out_len) {
276 unsigned int len;
Eric Roman8c9b8782015-09-22 18:32:43 -0700277 size_t npad, n;
Adam Langleybe2900a2014-12-18 12:09:04 -0800278 unsigned int i;
279 uint8_t md_buf[EVP_MAX_MD_SIZE];
David Benjaminb0883312015-08-06 09:54:13 -0400280 EVP_MD_CTX ctx;
Adam Langley95c29f32014-06-20 12:00:00 -0700281
Adam Langleybe2900a2014-12-18 12:09:04 -0800282 EVP_MD_CTX_init(&ctx);
David Benjaminb0883312015-08-06 09:54:13 -0400283 if (!EVP_MD_CTX_copy_ex(&ctx, ctx_template)) {
Adam Langleybe2900a2014-12-18 12:09:04 -0800284 EVP_MD_CTX_cleanup(&ctx);
David Benjamin3570d732015-06-29 00:28:17 -0400285 OPENSSL_PUT_ERROR(SSL, ERR_LIB_EVP);
Adam Langleybe2900a2014-12-18 12:09:04 -0800286 return 0;
287 }
Adam Langley95c29f32014-06-20 12:00:00 -0700288
David Benjamin23b0a652015-12-29 23:41:34 -0500289 static const uint8_t kPad1[48] = {
290 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
291 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
292 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
293 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
294 };
295
296 static const uint8_t kPad2[48] = {
297 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
298 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
299 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
300 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
301 };
302
Adam Langleybe2900a2014-12-18 12:09:04 -0800303 n = EVP_MD_CTX_size(&ctx);
Adam Langley95c29f32014-06-20 12:00:00 -0700304
Adam Langleybe2900a2014-12-18 12:09:04 -0800305 npad = (48 / n) * n;
306 if (sender != NULL) {
David Benjaminbaa12162015-12-29 19:13:58 -0500307 EVP_DigestUpdate(&ctx, sender, sender_len);
Adam Langleybe2900a2014-12-18 12:09:04 -0800308 }
Steven Valdez87eab492016-06-27 16:34:59 -0400309 EVP_DigestUpdate(&ctx, session->master_key, session->master_key_length);
David Benjamin23b0a652015-12-29 23:41:34 -0500310 EVP_DigestUpdate(&ctx, kPad1, npad);
Adam Langleybe2900a2014-12-18 12:09:04 -0800311 EVP_DigestFinal_ex(&ctx, md_buf, &i);
Adam Langley95c29f32014-06-20 12:00:00 -0700312
Adam Langleybe2900a2014-12-18 12:09:04 -0800313 if (!EVP_DigestInit_ex(&ctx, EVP_MD_CTX_md(&ctx), NULL)) {
314 EVP_MD_CTX_cleanup(&ctx);
David Benjamin3570d732015-06-29 00:28:17 -0400315 OPENSSL_PUT_ERROR(SSL, ERR_LIB_EVP);
Adam Langleybe2900a2014-12-18 12:09:04 -0800316 return 0;
317 }
Steven Valdez87eab492016-06-27 16:34:59 -0400318 EVP_DigestUpdate(&ctx, session->master_key, session->master_key_length);
David Benjamin23b0a652015-12-29 23:41:34 -0500319 EVP_DigestUpdate(&ctx, kPad2, npad);
Adam Langleybe2900a2014-12-18 12:09:04 -0800320 EVP_DigestUpdate(&ctx, md_buf, i);
Steven Valdez908ac192017-01-12 13:17:07 -0500321 EVP_DigestFinal_ex(&ctx, p, &len);
Adam Langley95c29f32014-06-20 12:00:00 -0700322
Adam Langleybe2900a2014-12-18 12:09:04 -0800323 EVP_MD_CTX_cleanup(&ctx);
Adam Langley95c29f32014-06-20 12:00:00 -0700324
Steven Valdez908ac192017-01-12 13:17:07 -0500325 *out_len = len;
326 return 1;
Adam Langleybe2900a2014-12-18 12:09:04 -0800327}
Adam Langley95c29f32014-06-20 12:00:00 -0700328
Steven Valdez908ac192017-01-12 13:17:07 -0500329int SSL_TRANSCRIPT_ssl3_cert_verify_hash(SSL_TRANSCRIPT *transcript,
330 uint8_t *out, size_t *out_len,
331 const SSL_SESSION *session,
332 int signature_algorithm) {
333 if (SSL_TRANSCRIPT_md(transcript) != EVP_md5_sha1()) {
Steven Valdez2b8415e2016-06-30 13:27:23 -0400334 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
335 return 0;
336 }
337
Steven Valdez908ac192017-01-12 13:17:07 -0500338 if (signature_algorithm == SSL_SIGN_RSA_PKCS1_MD5_SHA1) {
339 size_t md5_len, len;
340 if (!ssl3_handshake_mac(transcript, session, &transcript->md5, NULL, 0, out,
341 &md5_len) ||
342 !ssl3_handshake_mac(transcript, session, &transcript->hash, NULL, 0,
343 out + md5_len, &len)) {
344 return 0;
345 }
346 *out_len = md5_len + len;
347 return 1;
348 }
349
350 if (signature_algorithm == SSL_SIGN_ECDSA_SHA1) {
351 return ssl3_handshake_mac(transcript, session, &transcript->hash, NULL, 0,
352 out, out_len);
353 }
354
355 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
356 return 0;
Steven Valdez2b8415e2016-06-30 13:27:23 -0400357}
David Benjamin23b0a652015-12-29 23:41:34 -0500358
Steven Valdez908ac192017-01-12 13:17:07 -0500359int SSL_TRANSCRIPT_finish_mac(SSL_TRANSCRIPT *transcript, uint8_t *out,
360 size_t *out_len, const SSL_SESSION *session,
361 int from_server, uint16_t version) {
362 if (version == SSL3_VERSION) {
363 if (SSL_TRANSCRIPT_md(transcript) != EVP_md5_sha1()) {
364 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
365 return 0;
366 }
367
368 const char *sender = from_server ? SSL3_MD_SERVER_FINISHED_CONST
369 : SSL3_MD_CLIENT_FINISHED_CONST;
370 const size_t sender_len = 4;
371 size_t md5_len, len;
372 if (!ssl3_handshake_mac(transcript, session, &transcript->md5, sender,
373 sender_len, out, &md5_len) ||
374 !ssl3_handshake_mac(transcript, session, &transcript->hash, sender,
375 sender_len, out + md5_len, &len)) {
376 return 0;
377 }
378
379 *out_len = md5_len + len;
380 return 1;
381 }
382
383 /* At this point, the handshake should have released the handshake buffer on
384 * its own. */
385 assert(transcript->buffer == NULL);
386
387 const char *label = TLS_MD_CLIENT_FINISH_CONST;
388 size_t label_len = TLS_MD_SERVER_FINISH_CONST_SIZE;
389 if (from_server) {
390 label = TLS_MD_SERVER_FINISH_CONST;
391 label_len = TLS_MD_SERVER_FINISH_CONST_SIZE;
392 }
393
394 uint8_t digests[EVP_MAX_MD_SIZE];
395 size_t digests_len;
396 if (!SSL_TRANSCRIPT_get_hash(transcript, digests, &digests_len)) {
397 return 0;
398 }
399
400 static const size_t kFinishedLen = 12;
401 if (!tls1_prf(SSL_TRANSCRIPT_md(transcript), out, kFinishedLen,
402 session->master_key, session->master_key_length, label,
403 label_len, digests, digests_len, NULL, 0)) {
404 return 0;
405 }
406
407 *out_len = kFinishedLen;
408 return 1;
409}
David Benjamin86e95b82017-07-18 16:34:25 -0400410
411} // namespace bssl