Coverage Report

Created: 2025-06-13 06:58

/src/openssl32/ssl/t1_enc.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
3
 * Copyright 2005 Nokia. All rights reserved.
4
 *
5
 * Licensed under the Apache License 2.0 (the "License").  You may not use
6
 * this file except in compliance with the License.  You can obtain a copy
7
 * in the file LICENSE in the source distribution or at
8
 * https://www.openssl.org/source/license.html
9
 */
10
11
#include <stdio.h>
12
#include "ssl_local.h"
13
#include "record/record_local.h"
14
#include "internal/ktls.h"
15
#include "internal/cryptlib.h"
16
#include <openssl/comp.h>
17
#include <openssl/evp.h>
18
#include <openssl/kdf.h>
19
#include <openssl/rand.h>
20
#include <openssl/obj_mac.h>
21
#include <openssl/core_names.h>
22
#include <openssl/trace.h>
23
24
/* seed1 through seed5 are concatenated */
25
static int tls1_PRF(SSL_CONNECTION *s,
26
                    const void *seed1, size_t seed1_len,
27
                    const void *seed2, size_t seed2_len,
28
                    const void *seed3, size_t seed3_len,
29
                    const void *seed4, size_t seed4_len,
30
                    const void *seed5, size_t seed5_len,
31
                    const unsigned char *sec, size_t slen,
32
                    unsigned char *out, size_t olen, int fatal)
33
27.5k
{
34
27.5k
    const EVP_MD *md = ssl_prf_md(s);
35
27.5k
    EVP_KDF *kdf;
36
27.5k
    EVP_KDF_CTX *kctx = NULL;
37
27.5k
    OSSL_PARAM params[8], *p = params;
38
27.5k
    const char *mdname;
39
40
27.5k
    if (md == NULL) {
41
        /* Should never happen */
42
0
        if (fatal)
43
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
44
0
        else
45
0
            ERR_raise(ERR_LIB_SSL, ERR_R_INTERNAL_ERROR);
46
0
        return 0;
47
0
    }
48
27.5k
    kdf = EVP_KDF_fetch(SSL_CONNECTION_GET_CTX(s)->libctx,
49
27.5k
                        OSSL_KDF_NAME_TLS1_PRF,
50
27.5k
                        SSL_CONNECTION_GET_CTX(s)->propq);
51
27.5k
    if (kdf == NULL)
52
0
        goto err;
53
27.5k
    kctx = EVP_KDF_CTX_new(kdf);
54
27.5k
    EVP_KDF_free(kdf);
55
27.5k
    if (kctx == NULL)
56
0
        goto err;
57
27.5k
    mdname = EVP_MD_get0_name(md);
58
27.5k
    *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST,
59
27.5k
                                            (char *)mdname, 0);
60
27.5k
    *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SECRET,
61
27.5k
                                             (unsigned char *)sec,
62
27.5k
                                             (size_t)slen);
63
27.5k
    *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SEED,
64
27.5k
                                             (void *)seed1, (size_t)seed1_len);
65
27.5k
    *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SEED,
66
27.5k
                                             (void *)seed2, (size_t)seed2_len);
67
27.5k
    *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SEED,
68
27.5k
                                             (void *)seed3, (size_t)seed3_len);
69
27.5k
    *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SEED,
70
27.5k
                                             (void *)seed4, (size_t)seed4_len);
71
27.5k
    *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SEED,
72
27.5k
                                             (void *)seed5, (size_t)seed5_len);
73
27.5k
    *p = OSSL_PARAM_construct_end();
74
27.5k
    if (EVP_KDF_derive(kctx, out, olen, params)) {
75
27.5k
        EVP_KDF_CTX_free(kctx);
76
27.5k
        return 1;
77
27.5k
    }
78
79
0
 err:
80
0
    if (fatal)
81
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
82
0
    else
83
0
        ERR_raise(ERR_LIB_SSL, ERR_R_INTERNAL_ERROR);
84
0
    EVP_KDF_CTX_free(kctx);
85
0
    return 0;
86
27.5k
}
87
88
static int tls1_generate_key_block(SSL_CONNECTION *s, unsigned char *km,
89
                                   size_t num)
90
9.29k
{
91
9.29k
    int ret;
92
93
    /* Calls SSLfatal() as required */
94
9.29k
    ret = tls1_PRF(s,
95
9.29k
                   TLS_MD_KEY_EXPANSION_CONST,
96
9.29k
                   TLS_MD_KEY_EXPANSION_CONST_SIZE, s->s3.server_random,
97
9.29k
                   SSL3_RANDOM_SIZE, s->s3.client_random, SSL3_RANDOM_SIZE,
98
9.29k
                   NULL, 0, NULL, 0, s->session->master_key,
99
9.29k
                   s->session->master_key_length, km, num, 1);
100
101
9.29k
    return ret;
102
9.29k
}
103
104
static int tls_iv_length_within_key_block(const EVP_CIPHER *c)
105
21.2k
{
106
    /* If GCM/CCM mode only part of IV comes from PRF */
107
21.2k
    if (EVP_CIPHER_get_mode(c) == EVP_CIPH_GCM_MODE)
108
3.32k
        return EVP_GCM_TLS_FIXED_IV_LEN;
109
17.9k
    else if (EVP_CIPHER_get_mode(c) == EVP_CIPH_CCM_MODE)
110
987
        return EVP_CCM_TLS_FIXED_IV_LEN;
111
16.9k
    else
112
16.9k
        return EVP_CIPHER_get_iv_length(c);
113
21.2k
}
114
115
int tls1_change_cipher_state(SSL_CONNECTION *s, int which)
116
3.26k
{
117
3.26k
    unsigned char *p, *mac_secret;
118
3.26k
    unsigned char *key, *iv;
119
3.26k
    const EVP_CIPHER *c;
120
3.26k
    const SSL_COMP *comp = NULL;
121
3.26k
    const EVP_MD *m;
122
3.26k
    int mac_type;
123
3.26k
    size_t mac_secret_size;
124
3.26k
    size_t n, i, j, k, cl;
125
3.26k
    int iivlen;
126
    /*
127
     * Taglen is only relevant for CCM ciphersuites. Other ciphersuites
128
     * ignore this value so we can default it to 0.
129
     */
130
3.26k
    size_t taglen = 0;
131
3.26k
    int direction;
132
133
3.26k
    c = s->s3.tmp.new_sym_enc;
134
3.26k
    m = s->s3.tmp.new_hash;
135
3.26k
    mac_type = s->s3.tmp.new_mac_pkey_type;
136
3.26k
#ifndef OPENSSL_NO_COMP
137
3.26k
    comp = s->s3.tmp.new_compression;
138
3.26k
#endif
139
140
3.26k
    p = s->s3.tmp.key_block;
141
3.26k
    i = mac_secret_size = s->s3.tmp.new_mac_secret_size;
142
143
3.26k
    cl = EVP_CIPHER_get_key_length(c);
144
3.26k
    j = cl;
145
3.26k
    iivlen = tls_iv_length_within_key_block(c);
146
3.26k
    if (iivlen < 0) {
147
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
148
0
        goto err;
149
0
    }
150
3.26k
    k = iivlen;
151
3.26k
    if ((which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) ||
152
3.26k
        (which == SSL3_CHANGE_CIPHER_SERVER_READ)) {
153
2.28k
        mac_secret = &(p[0]);
154
2.28k
        n = i + i;
155
2.28k
        key = &(p[n]);
156
2.28k
        n += j + j;
157
2.28k
        iv = &(p[n]);
158
2.28k
        n += k + k;
159
2.28k
    } else {
160
981
        n = i;
161
981
        mac_secret = &(p[n]);
162
981
        n += i + j;
163
981
        key = &(p[n]);
164
981
        n += j + k;
165
981
        iv = &(p[n]);
166
981
        n += k;
167
981
    }
168
169
3.26k
    if (n > s->s3.tmp.key_block_length) {
170
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
171
0
        goto err;
172
0
    }
173
174
3.26k
    switch (EVP_CIPHER_get_mode(c)) {
175
267
    case EVP_CIPH_GCM_MODE:
176
267
        taglen = EVP_GCM_TLS_TAG_LEN;
177
267
        break;
178
137
    case EVP_CIPH_CCM_MODE:
179
137
        if ((s->s3.tmp.new_cipher->algorithm_enc
180
137
                & (SSL_AES128CCM8 | SSL_AES256CCM8)) != 0)
181
122
            taglen = EVP_CCM8_TLS_TAG_LEN;
182
15
        else
183
15
            taglen = EVP_CCM_TLS_TAG_LEN;
184
137
        break;
185
2.86k
    default:
186
2.86k
        if (EVP_CIPHER_is_a(c, "CHACHA20-POLY1305")) {
187
33
            taglen = EVP_CHACHAPOLY_TLS_TAG_LEN;
188
2.82k
        } else {
189
            /* MAC secret size corresponds to the MAC output size */
190
2.82k
            taglen = s->s3.tmp.new_mac_secret_size;
191
2.82k
        }
192
2.86k
        break;
193
3.26k
    }
194
195
3.26k
    if (which & SSL3_CC_READ) {
196
1.52k
        if (s->ext.use_etm)
197
83
            s->s3.flags |= TLS1_FLAGS_ENCRYPT_THEN_MAC_READ;
198
1.44k
        else
199
1.44k
            s->s3.flags &= ~TLS1_FLAGS_ENCRYPT_THEN_MAC_READ;
200
201
1.52k
        if (s->s3.tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC)
202
0
            s->mac_flags |= SSL_MAC_FLAG_READ_MAC_STREAM;
203
1.52k
        else
204
1.52k
            s->mac_flags &= ~SSL_MAC_FLAG_READ_MAC_STREAM;
205
206
1.52k
        if (s->s3.tmp.new_cipher->algorithm2 & TLS1_TLSTREE)
207
0
            s->mac_flags |= SSL_MAC_FLAG_READ_MAC_TLSTREE;
208
1.52k
        else
209
1.52k
            s->mac_flags &= ~SSL_MAC_FLAG_READ_MAC_TLSTREE;
210
211
1.52k
        direction = OSSL_RECORD_DIRECTION_READ;
212
1.73k
    } else {
213
1.73k
        if (s->ext.use_etm)
214
71
            s->s3.flags |= TLS1_FLAGS_ENCRYPT_THEN_MAC_WRITE;
215
1.66k
        else
216
1.66k
            s->s3.flags &= ~TLS1_FLAGS_ENCRYPT_THEN_MAC_WRITE;
217
218
1.73k
        if (s->s3.tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC)
219
0
            s->mac_flags |= SSL_MAC_FLAG_WRITE_MAC_STREAM;
220
1.73k
        else
221
1.73k
            s->mac_flags &= ~SSL_MAC_FLAG_WRITE_MAC_STREAM;
222
223
1.73k
        if (s->s3.tmp.new_cipher->algorithm2 & TLS1_TLSTREE)
224
0
            s->mac_flags |= SSL_MAC_FLAG_WRITE_MAC_TLSTREE;
225
1.73k
        else
226
1.73k
            s->mac_flags &= ~SSL_MAC_FLAG_WRITE_MAC_TLSTREE;
227
228
1.73k
        direction = OSSL_RECORD_DIRECTION_WRITE;
229
1.73k
    }
230
231
3.26k
    if (!ssl_set_new_record_layer(s, s->version, direction,
232
3.26k
                                    OSSL_RECORD_PROTECTION_LEVEL_APPLICATION,
233
3.26k
                                    NULL, 0, key, cl, iv, (size_t)k, mac_secret,
234
3.26k
                                    mac_secret_size, c, taglen, mac_type,
235
3.26k
                                    m, comp, NULL)) {
236
        /* SSLfatal already called */
237
0
        goto err;
238
0
    }
239
240
3.26k
    OSSL_TRACE_BEGIN(TLS) {
241
0
        BIO_printf(trc_out, "which = %04X, key:\n", which);
242
0
        BIO_dump_indent(trc_out, key, EVP_CIPHER_get_key_length(c), 4);
243
0
        BIO_printf(trc_out, "iv:\n");
244
0
        BIO_dump_indent(trc_out, iv, k, 4);
245
3.26k
    } OSSL_TRACE_END(TLS);
246
247
3.26k
    return 1;
248
0
 err:
249
0
    return 0;
250
3.26k
}
251
252
int tls1_setup_key_block(SSL_CONNECTION *s)
253
7.10k
{
254
7.10k
    unsigned char *p;
255
7.10k
    const EVP_CIPHER *c;
256
7.10k
    const EVP_MD *hash;
257
7.10k
    SSL_COMP *comp;
258
7.10k
    int mac_type = NID_undef;
259
7.10k
    size_t num, mac_secret_size = 0;
260
7.10k
    int ret = 0;
261
7.10k
    int ivlen;
262
263
7.10k
    if (s->s3.tmp.key_block_length != 0)
264
929
        return 1;
265
266
6.17k
    if (!ssl_cipher_get_evp(SSL_CONNECTION_GET_CTX(s), s->session, &c, &hash,
267
6.17k
                            &mac_type, &mac_secret_size, &comp,
268
6.17k
                            s->ext.use_etm)) {
269
        /* Error is already recorded */
270
0
        SSLfatal_alert(s, SSL_AD_INTERNAL_ERROR);
271
0
        return 0;
272
0
    }
273
274
6.17k
    ssl_evp_cipher_free(s->s3.tmp.new_sym_enc);
275
6.17k
    s->s3.tmp.new_sym_enc = c;
276
6.17k
    ssl_evp_md_free(s->s3.tmp.new_hash);
277
6.17k
    s->s3.tmp.new_hash = hash;
278
6.17k
    s->s3.tmp.new_mac_pkey_type = mac_type;
279
6.17k
    s->s3.tmp.new_mac_secret_size = mac_secret_size;
280
6.17k
    ivlen = tls_iv_length_within_key_block(c);
281
6.17k
    if (ivlen < 0) {
282
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
283
0
        return 0;
284
0
    }
285
6.17k
    num = mac_secret_size + EVP_CIPHER_get_key_length(c) + ivlen;
286
6.17k
    num *= 2;
287
288
6.17k
    ssl3_cleanup_key_block(s);
289
290
6.17k
    if ((p = OPENSSL_malloc(num)) == NULL) {
291
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_CRYPTO_LIB);
292
0
        goto err;
293
0
    }
294
295
6.17k
    s->s3.tmp.key_block_length = num;
296
6.17k
    s->s3.tmp.key_block = p;
297
298
6.17k
    OSSL_TRACE_BEGIN(TLS) {
299
0
        BIO_printf(trc_out, "key block length: %zu\n", num);
300
0
        BIO_printf(trc_out, "client random\n");
301
0
        BIO_dump_indent(trc_out, s->s3.client_random, SSL3_RANDOM_SIZE, 4);
302
0
        BIO_printf(trc_out, "server random\n");
303
0
        BIO_dump_indent(trc_out, s->s3.server_random, SSL3_RANDOM_SIZE, 4);
304
0
        BIO_printf(trc_out, "master key\n");
305
0
        BIO_dump_indent(trc_out,
306
0
                        s->session->master_key,
307
0
                        s->session->master_key_length, 4);
308
6.17k
    } OSSL_TRACE_END(TLS);
309
310
6.17k
    if (!tls1_generate_key_block(s, p, num)) {
311
        /* SSLfatal() already called */
312
0
        goto err;
313
0
    }
314
315
6.17k
    OSSL_TRACE_BEGIN(TLS) {
316
0
        BIO_printf(trc_out, "key block\n");
317
0
        BIO_dump_indent(trc_out, p, num, 4);
318
6.17k
    } OSSL_TRACE_END(TLS);
319
320
6.17k
    ret = 1;
321
6.17k
 err:
322
6.17k
    return ret;
323
6.17k
}
324
325
size_t tls1_final_finish_mac(SSL_CONNECTION *s, const char *str,
326
                             size_t slen, unsigned char *out)
327
7.20k
{
328
7.20k
    size_t hashlen;
329
7.20k
    unsigned char hash[EVP_MAX_MD_SIZE];
330
7.20k
    size_t finished_size = TLS1_FINISH_MAC_LENGTH;
331
332
7.20k
    if (s->s3.tmp.new_cipher->algorithm_mkey & SSL_kGOST18)
333
0
        finished_size = 32;
334
335
7.20k
    if (!ssl3_digest_cached_records(s, 0)) {
336
        /* SSLfatal() already called */
337
0
        return 0;
338
0
    }
339
340
7.20k
    if (!ssl_handshake_hash(s, hash, sizeof(hash), &hashlen)) {
341
        /* SSLfatal() already called */
342
0
        return 0;
343
0
    }
344
345
7.20k
    if (!tls1_PRF(s, str, slen, hash, hashlen, NULL, 0, NULL, 0, NULL, 0,
346
7.20k
                  s->session->master_key, s->session->master_key_length,
347
7.20k
                  out, finished_size, 1)) {
348
        /* SSLfatal() already called */
349
0
        return 0;
350
0
    }
351
7.20k
    OPENSSL_cleanse(hash, hashlen);
352
7.20k
    return finished_size;
353
7.20k
}
354
355
int tls1_generate_master_secret(SSL_CONNECTION *s, unsigned char *out,
356
                                unsigned char *p, size_t len,
357
                                size_t *secret_size)
358
11.0k
{
359
11.0k
    if (s->session->flags & SSL_SESS_FLAG_EXTMS) {
360
1.48k
        unsigned char hash[EVP_MAX_MD_SIZE * 2];
361
1.48k
        size_t hashlen;
362
        /*
363
         * Digest cached records keeping record buffer (if present): this won't
364
         * affect client auth because we're freezing the buffer at the same
365
         * point (after client key exchange and before certificate verify)
366
         */
367
1.48k
        if (!ssl3_digest_cached_records(s, 1)
368
1.48k
                || !ssl_handshake_hash(s, hash, sizeof(hash), &hashlen)) {
369
            /* SSLfatal() already called */
370
0
            return 0;
371
0
        }
372
1.48k
        OSSL_TRACE_BEGIN(TLS) {
373
0
            BIO_printf(trc_out, "Handshake hashes:\n");
374
0
            BIO_dump(trc_out, (char *)hash, hashlen);
375
1.48k
        } OSSL_TRACE_END(TLS);
376
1.48k
        if (!tls1_PRF(s,
377
1.48k
                      TLS_MD_EXTENDED_MASTER_SECRET_CONST,
378
1.48k
                      TLS_MD_EXTENDED_MASTER_SECRET_CONST_SIZE,
379
1.48k
                      hash, hashlen,
380
1.48k
                      NULL, 0,
381
1.48k
                      NULL, 0,
382
1.48k
                      NULL, 0, p, len, out,
383
1.48k
                      SSL3_MASTER_SECRET_SIZE, 1)) {
384
            /* SSLfatal() already called */
385
0
            return 0;
386
0
        }
387
1.48k
        OPENSSL_cleanse(hash, hashlen);
388
9.54k
    } else {
389
9.54k
        if (!tls1_PRF(s,
390
9.54k
                      TLS_MD_MASTER_SECRET_CONST,
391
9.54k
                      TLS_MD_MASTER_SECRET_CONST_SIZE,
392
9.54k
                      s->s3.client_random, SSL3_RANDOM_SIZE,
393
9.54k
                      NULL, 0,
394
9.54k
                      s->s3.server_random, SSL3_RANDOM_SIZE,
395
9.54k
                      NULL, 0, p, len, out,
396
9.54k
                      SSL3_MASTER_SECRET_SIZE, 1)) {
397
           /* SSLfatal() already called */
398
0
            return 0;
399
0
        }
400
9.54k
    }
401
402
11.0k
    OSSL_TRACE_BEGIN(TLS) {
403
0
        BIO_printf(trc_out, "Premaster Secret:\n");
404
0
        BIO_dump_indent(trc_out, p, len, 4);
405
0
        BIO_printf(trc_out, "Client Random:\n");
406
0
        BIO_dump_indent(trc_out, s->s3.client_random, SSL3_RANDOM_SIZE, 4);
407
0
        BIO_printf(trc_out, "Server Random:\n");
408
0
        BIO_dump_indent(trc_out, s->s3.server_random, SSL3_RANDOM_SIZE, 4);
409
0
        BIO_printf(trc_out, "Master Secret:\n");
410
0
        BIO_dump_indent(trc_out,
411
0
                        s->session->master_key,
412
0
                        SSL3_MASTER_SECRET_SIZE, 4);
413
11.0k
    } OSSL_TRACE_END(TLS);
414
415
11.0k
    *secret_size = SSL3_MASTER_SECRET_SIZE;
416
11.0k
    return 1;
417
11.0k
}
418
419
int tls1_export_keying_material(SSL_CONNECTION *s, unsigned char *out,
420
                                size_t olen, const char *label, size_t llen,
421
                                const unsigned char *context,
422
                                size_t contextlen, int use_context)
423
0
{
424
0
    unsigned char *val = NULL;
425
0
    size_t vallen = 0, currentvalpos;
426
0
    int rv = 0;
427
428
    /*
429
     * construct PRF arguments we construct the PRF argument ourself rather
430
     * than passing separate values into the TLS PRF to ensure that the
431
     * concatenation of values does not create a prohibited label.
432
     */
433
0
    vallen = llen + SSL3_RANDOM_SIZE * 2;
434
0
    if (use_context) {
435
0
        vallen += 2 + contextlen;
436
0
    }
437
438
0
    val = OPENSSL_malloc(vallen);
439
0
    if (val == NULL)
440
0
        goto ret;
441
0
    currentvalpos = 0;
442
0
    memcpy(val + currentvalpos, (unsigned char *)label, llen);
443
0
    currentvalpos += llen;
444
0
    memcpy(val + currentvalpos, s->s3.client_random, SSL3_RANDOM_SIZE);
445
0
    currentvalpos += SSL3_RANDOM_SIZE;
446
0
    memcpy(val + currentvalpos, s->s3.server_random, SSL3_RANDOM_SIZE);
447
0
    currentvalpos += SSL3_RANDOM_SIZE;
448
449
0
    if (use_context) {
450
0
        val[currentvalpos] = (contextlen >> 8) & 0xff;
451
0
        currentvalpos++;
452
0
        val[currentvalpos] = contextlen & 0xff;
453
0
        currentvalpos++;
454
0
        if ((contextlen > 0) || (context != NULL)) {
455
0
            memcpy(val + currentvalpos, context, contextlen);
456
0
        }
457
0
    }
458
459
    /*
460
     * disallow prohibited labels note that SSL3_RANDOM_SIZE > max(prohibited
461
     * label len) = 15, so size of val > max(prohibited label len) = 15 and
462
     * the comparisons won't have buffer overflow
463
     */
464
0
    if (memcmp(val, TLS_MD_CLIENT_FINISH_CONST,
465
0
               TLS_MD_CLIENT_FINISH_CONST_SIZE) == 0)
466
0
        goto err1;
467
0
    if (memcmp(val, TLS_MD_SERVER_FINISH_CONST,
468
0
               TLS_MD_SERVER_FINISH_CONST_SIZE) == 0)
469
0
        goto err1;
470
0
    if (memcmp(val, TLS_MD_MASTER_SECRET_CONST,
471
0
               TLS_MD_MASTER_SECRET_CONST_SIZE) == 0)
472
0
        goto err1;
473
0
    if (memcmp(val, TLS_MD_EXTENDED_MASTER_SECRET_CONST,
474
0
               TLS_MD_EXTENDED_MASTER_SECRET_CONST_SIZE) == 0)
475
0
        goto err1;
476
0
    if (memcmp(val, TLS_MD_KEY_EXPANSION_CONST,
477
0
               TLS_MD_KEY_EXPANSION_CONST_SIZE) == 0)
478
0
        goto err1;
479
480
0
    rv = tls1_PRF(s,
481
0
                  val, vallen,
482
0
                  NULL, 0,
483
0
                  NULL, 0,
484
0
                  NULL, 0,
485
0
                  NULL, 0,
486
0
                  s->session->master_key, s->session->master_key_length,
487
0
                  out, olen, 0);
488
489
0
    goto ret;
490
0
 err1:
491
0
    ERR_raise(ERR_LIB_SSL, SSL_R_TLS_ILLEGAL_EXPORTER_LABEL);
492
0
 ret:
493
0
    OPENSSL_clear_free(val, vallen);
494
0
    return rv;
495
0
}
496
497
int tls1_alert_code(int code)
498
102k
{
499
102k
    switch (code) {
500
666
    case SSL_AD_CLOSE_NOTIFY:
501
666
        return SSL3_AD_CLOSE_NOTIFY;
502
4.74k
    case SSL_AD_UNEXPECTED_MESSAGE:
503
4.74k
        return SSL3_AD_UNEXPECTED_MESSAGE;
504
2.28k
    case SSL_AD_BAD_RECORD_MAC:
505
2.28k
        return SSL3_AD_BAD_RECORD_MAC;
506
0
    case SSL_AD_DECRYPTION_FAILED:
507
0
        return TLS1_AD_DECRYPTION_FAILED;
508
594
    case SSL_AD_RECORD_OVERFLOW:
509
594
        return TLS1_AD_RECORD_OVERFLOW;
510
0
    case SSL_AD_DECOMPRESSION_FAILURE:
511
0
        return SSL3_AD_DECOMPRESSION_FAILURE;
512
1.98k
    case SSL_AD_HANDSHAKE_FAILURE:
513
1.98k
        return SSL3_AD_HANDSHAKE_FAILURE;
514
0
    case SSL_AD_NO_CERTIFICATE:
515
0
        return -1;
516
7.98k
    case SSL_AD_BAD_CERTIFICATE:
517
7.98k
        return SSL3_AD_BAD_CERTIFICATE;
518
0
    case SSL_AD_UNSUPPORTED_CERTIFICATE:
519
0
        return SSL3_AD_UNSUPPORTED_CERTIFICATE;
520
0
    case SSL_AD_CERTIFICATE_REVOKED:
521
0
        return SSL3_AD_CERTIFICATE_REVOKED;
522
0
    case SSL_AD_CERTIFICATE_EXPIRED:
523
0
        return SSL3_AD_CERTIFICATE_EXPIRED;
524
0
    case SSL_AD_CERTIFICATE_UNKNOWN:
525
0
        return SSL3_AD_CERTIFICATE_UNKNOWN;
526
4.39k
    case SSL_AD_ILLEGAL_PARAMETER:
527
4.39k
        return SSL3_AD_ILLEGAL_PARAMETER;
528
0
    case SSL_AD_UNKNOWN_CA:
529
0
        return TLS1_AD_UNKNOWN_CA;
530
0
    case SSL_AD_ACCESS_DENIED:
531
0
        return TLS1_AD_ACCESS_DENIED;
532
8.36k
    case SSL_AD_DECODE_ERROR:
533
8.36k
        return TLS1_AD_DECODE_ERROR;
534
2.30k
    case SSL_AD_DECRYPT_ERROR:
535
2.30k
        return TLS1_AD_DECRYPT_ERROR;
536
0
    case SSL_AD_EXPORT_RESTRICTION:
537
0
        return TLS1_AD_EXPORT_RESTRICTION;
538
1.71k
    case SSL_AD_PROTOCOL_VERSION:
539
1.71k
        return TLS1_AD_PROTOCOL_VERSION;
540
0
    case SSL_AD_INSUFFICIENT_SECURITY:
541
0
        return TLS1_AD_INSUFFICIENT_SECURITY;
542
2.49k
    case SSL_AD_INTERNAL_ERROR:
543
2.49k
        return TLS1_AD_INTERNAL_ERROR;
544
0
    case SSL_AD_USER_CANCELLED:
545
0
        return TLS1_AD_USER_CANCELLED;
546
64.5k
    case SSL_AD_NO_RENEGOTIATION:
547
64.5k
        return TLS1_AD_NO_RENEGOTIATION;
548
60
    case SSL_AD_UNSUPPORTED_EXTENSION:
549
60
        return TLS1_AD_UNSUPPORTED_EXTENSION;
550
0
    case SSL_AD_CERTIFICATE_UNOBTAINABLE:
551
0
        return TLS1_AD_CERTIFICATE_UNOBTAINABLE;
552
19
    case SSL_AD_UNRECOGNIZED_NAME:
553
19
        return TLS1_AD_UNRECOGNIZED_NAME;
554
0
    case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE:
555
0
        return TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
556
0
    case SSL_AD_BAD_CERTIFICATE_HASH_VALUE:
557
0
        return TLS1_AD_BAD_CERTIFICATE_HASH_VALUE;
558
0
    case SSL_AD_UNKNOWN_PSK_IDENTITY:
559
0
        return TLS1_AD_UNKNOWN_PSK_IDENTITY;
560
12
    case SSL_AD_INAPPROPRIATE_FALLBACK:
561
12
        return TLS1_AD_INAPPROPRIATE_FALLBACK;
562
0
    case SSL_AD_NO_APPLICATION_PROTOCOL:
563
0
        return TLS1_AD_NO_APPLICATION_PROTOCOL;
564
0
    case SSL_AD_CERTIFICATE_REQUIRED:
565
0
        return SSL_AD_HANDSHAKE_FAILURE;
566
10
    case TLS13_AD_MISSING_EXTENSION:
567
10
        return SSL_AD_HANDSHAKE_FAILURE;
568
0
    default:
569
0
        return -1;
570
102k
    }
571
102k
}