You need to sign in or sign up before continuing.
s3_enc.c 16.0 KB
Newer Older
R
Rich Salz 已提交
1 2
/*
 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
3
 * Copyright 2005 Nokia. All rights reserved.
4
 *
R
Rich Salz 已提交
5 6 7 8
 * Licensed under the OpenSSL license (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
9
 */
R
Rich Salz 已提交
10

11 12
#include <stdio.h>
#include "ssl_locl.h"
13
#include <openssl/evp.h>
14
#include <openssl/md5.h>
M
Matt Caswell 已提交
15
#include "internal/cryptlib.h"
16

B
Bodo Möller 已提交
17
static int ssl3_generate_key_block(SSL *s, unsigned char *km, int num)
18
{
19 20
    EVP_MD_CTX *m5;
    EVP_MD_CTX *s1;
21 22 23
    unsigned char buf[16], smd[SHA_DIGEST_LENGTH];
    unsigned char c = 'A';
    unsigned int i, j, k;
24
    int ret = 0;
25

26
#ifdef CHARSET_EBCDIC
27
    c = os_toascii[c];          /* 'A' in ASCII */
28
#endif
29
    k = 0;
30 31
    m5 = EVP_MD_CTX_new();
    s1 = EVP_MD_CTX_new();
32 33 34 35 36
    if (m5 == NULL || s1 == NULL) {
        SSLerr(SSL_F_SSL3_GENERATE_KEY_BLOCK, ERR_R_MALLOC_FAILURE);
        goto err;
    }
    EVP_MD_CTX_set_flags(m5, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
37 38
    for (i = 0; (int)i < num; i += MD5_DIGEST_LENGTH) {
        k++;
39
        if (k > sizeof(buf)) {
40 41
            /* bug: 'buf' is too small for this ciphersuite */
            SSLerr(SSL_F_SSL3_GENERATE_KEY_BLOCK, ERR_R_INTERNAL_ERROR);
42
            goto err;
43 44 45 46 47
        }

        for (j = 0; j < k; j++)
            buf[j] = c;
        c++;
48 49 50 51 52 53 54 55 56 57 58 59
        if (!EVP_DigestInit_ex(s1, EVP_sha1(), NULL)
            || !EVP_DigestUpdate(s1, buf, k)
            || !EVP_DigestUpdate(s1, s->session->master_key,
                                 s->session->master_key_length)
            || !EVP_DigestUpdate(s1, s->s3->server_random, SSL3_RANDOM_SIZE)
            || !EVP_DigestUpdate(s1, s->s3->client_random, SSL3_RANDOM_SIZE)
            || !EVP_DigestFinal_ex(s1, smd, NULL)
            || !EVP_DigestInit_ex(m5, EVP_md5(), NULL)
            || !EVP_DigestUpdate(m5, s->session->master_key,
                                 s->session->master_key_length)
            || !EVP_DigestUpdate(m5, smd, SHA_DIGEST_LENGTH))
            goto err;
60
        if ((int)(i + MD5_DIGEST_LENGTH) > num) {
61 62
            if (!EVP_DigestFinal_ex(m5, smd, NULL))
                goto err;
63
            memcpy(km, smd, (num - i));
64 65 66 67
        } else {
            if (!EVP_DigestFinal_ex(m5, km, NULL))
                goto err;
        }
68 69 70

        km += MD5_DIGEST_LENGTH;
    }
R
Rich Salz 已提交
71
    OPENSSL_cleanse(smd, sizeof(smd));
72 73
    ret = 1;
 err:
74 75
    EVP_MD_CTX_free(m5);
    EVP_MD_CTX_free(s1);
76
    return ret;
77
}
78

U
Ulf Möller 已提交
79
int ssl3_change_cipher_state(SSL *s, int which)
80 81 82 83
{
    unsigned char *p, *mac_secret;
    unsigned char exp_key[EVP_MAX_KEY_LENGTH];
    unsigned char exp_iv[EVP_MAX_IV_LENGTH];
84
    unsigned char *ms, *key, *iv;
85 86
    EVP_CIPHER_CTX *dd;
    const EVP_CIPHER *c;
87
#ifndef OPENSSL_NO_COMP
88
    COMP_METHOD *comp;
89
#endif
90
    const EVP_MD *m;
91 92
    int mdi;
    size_t n, i, j, k, cl;
93 94 95 96 97
    int reuse_dd = 0;

    c = s->s3->tmp.new_sym_enc;
    m = s->s3->tmp.new_hash;
    /* m == NULL will lead to a crash later */
98 99 100 101
    if (!ossl_assert(m != NULL)) {
        SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
        goto err2;
    }
102
#ifndef OPENSSL_NO_COMP
103 104 105 106
    if (s->s3->tmp.new_compression == NULL)
        comp = NULL;
    else
        comp = s->s3->tmp.new_compression->method;
107
#endif
108

109 110 111
    if (which & SSL3_CC_READ) {
        if (s->enc_read_ctx != NULL)
            reuse_dd = 1;
112
        else if ((s->enc_read_ctx = EVP_CIPHER_CTX_new()) == NULL)
113 114 115
            goto err;
        else
            /*
F
FdaSilvaYY 已提交
116
             * make sure it's initialised in case we exit later with an error
117
             */
118
            EVP_CIPHER_CTX_reset(s->enc_read_ctx);
119 120
        dd = s->enc_read_ctx;

121
        if (ssl_replace_hash(&s->read_hash, m) == NULL) {
E
Emilia Kasper 已提交
122 123
            SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
            goto err2;
M
Matt Caswell 已提交
124
        }
125
#ifndef OPENSSL_NO_COMP
126
        /* COMPRESS */
R
Rich Salz 已提交
127 128
        COMP_CTX_free(s->expand);
        s->expand = NULL;
129 130 131 132 133 134 135 136
        if (comp != NULL) {
            s->expand = COMP_CTX_new(comp);
            if (s->expand == NULL) {
                SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,
                       SSL_R_COMPRESSION_LIBRARY_ERROR);
                goto err2;
            }
        }
137
#endif
138
        RECORD_LAYER_reset_read_sequence(&s->rlayer);
139 140 141 142
        mac_secret = &(s->s3->read_mac_secret[0]);
    } else {
        if (s->enc_write_ctx != NULL)
            reuse_dd = 1;
143
        else if ((s->enc_write_ctx = EVP_CIPHER_CTX_new()) == NULL)
144 145 146
            goto err;
        else
            /*
F
FdaSilvaYY 已提交
147
             * make sure it's initialised in case we exit later with an error
148
             */
149
            EVP_CIPHER_CTX_reset(s->enc_write_ctx);
150
        dd = s->enc_write_ctx;
151
        if (ssl_replace_hash(&s->write_hash, m) == NULL) {
E
Emilia Kasper 已提交
152 153
            SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
            goto err2;
M
Matt Caswell 已提交
154
        }
155
#ifndef OPENSSL_NO_COMP
156
        /* COMPRESS */
R
Rich Salz 已提交
157 158
        COMP_CTX_free(s->compress);
        s->compress = NULL;
159 160 161 162 163 164 165 166
        if (comp != NULL) {
            s->compress = COMP_CTX_new(comp);
            if (s->compress == NULL) {
                SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,
                       SSL_R_COMPRESSION_LIBRARY_ERROR);
                goto err2;
            }
        }
167
#endif
168
        RECORD_LAYER_reset_write_sequence(&s->rlayer);
169 170 171 172
        mac_secret = &(s->s3->write_mac_secret[0]);
    }

    if (reuse_dd)
173
        EVP_CIPHER_CTX_reset(dd);
174 175

    p = s->s3->tmp.key_block;
176 177
    mdi = EVP_MD_size(m);
    if (mdi < 0)
178
        goto err2;
179
    i = mdi;
180
    cl = EVP_CIPHER_key_length(c);
181
    j = cl;
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
    k = EVP_CIPHER_iv_length(c);
    if ((which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) ||
        (which == SSL3_CHANGE_CIPHER_SERVER_READ)) {
        ms = &(p[0]);
        n = i + i;
        key = &(p[n]);
        n += j + j;
        iv = &(p[n]);
        n += k + k;
    } else {
        n = i;
        ms = &(p[n]);
        n += i + j;
        key = &(p[n]);
        n += j + k;
        iv = &(p[n]);
        n += k;
    }

    if (n > s->s3->tmp.key_block_length) {
        SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
        goto err2;
    }

    memcpy(mac_secret, ms, i);

208 209
    if (!EVP_CipherInit_ex(dd, c, NULL, key, iv, (which & SSL3_CC_WRITE)))
        goto err2;
210

R
Rich Salz 已提交
211 212
    OPENSSL_cleanse(exp_key, sizeof(exp_key));
    OPENSSL_cleanse(exp_iv, sizeof(exp_iv));
213
    return 1;
214 215 216
 err:
    SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE, ERR_R_MALLOC_FAILURE);
 err2:
R
Rich Salz 已提交
217 218
    OPENSSL_cleanse(exp_key, sizeof(exp_key));
    OPENSSL_cleanse(exp_iv, sizeof(exp_iv));
219 220
    return (0);
}
221

U
Ulf Möller 已提交
222
int ssl3_setup_key_block(SSL *s)
223 224 225 226 227 228 229 230 231
{
    unsigned char *p;
    const EVP_CIPHER *c;
    const EVP_MD *hash;
    int num;
    int ret = 0;
    SSL_COMP *comp;

    if (s->s3->tmp.key_block_length != 0)
232
        return 1;
233 234 235 236 237 238 239 240

    if (!ssl_cipher_get_evp(s->session, &c, &hash, NULL, NULL, &comp, 0)) {
        SSLerr(SSL_F_SSL3_SETUP_KEY_BLOCK, SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
        return (0);
    }

    s->s3->tmp.new_sym_enc = c;
    s->s3->tmp.new_hash = hash;
241
#ifdef OPENSSL_NO_COMP
242
    s->s3->tmp.new_compression = NULL;
243
#else
244
    s->s3->tmp.new_compression = comp;
245
#endif
246

247 248 249 250 251 252
    num = EVP_MD_size(hash);
    if (num < 0)
        return 0;

    num = EVP_CIPHER_key_length(c) + num + EVP_CIPHER_iv_length(c);
    num *= 2;
253

254
    ssl3_cleanup_key_block(s);
255

256 257
    if ((p = OPENSSL_malloc(num)) == NULL)
        goto err;
258

259 260
    s->s3->tmp.key_block_length = num;
    s->s3->tmp.key_block = p;
261

262
    ret = ssl3_generate_key_block(s, p, num);
263

264 265 266 267 268 269
    if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)) {
        /*
         * enable vulnerability countermeasure for CBC ciphers with known-IV
         * problem (http://www.openssl.org/~bodo/tls-cbc.txt)
         */
        s->s3->need_empty_fragments = 1;
270

271 272 273
        if (s->session->cipher != NULL) {
            if (s->session->cipher->algorithm_enc == SSL_eNULL)
                s->s3->need_empty_fragments = 0;
274

275
#ifndef OPENSSL_NO_RC4
276 277
            if (s->session->cipher->algorithm_enc == SSL_RC4)
                s->s3->need_empty_fragments = 0;
278
#endif
279 280
        }
    }
281

282 283 284 285 286 287
    return ret;

 err:
    SSLerr(SSL_F_SSL3_SETUP_KEY_BLOCK, ERR_R_MALLOC_FAILURE);
    return (0);
}
288

U
Ulf Möller 已提交
289
void ssl3_cleanup_key_block(SSL *s)
290
{
R
Rich Salz 已提交
291 292
    OPENSSL_clear_free(s->s3->tmp.key_block, s->s3->tmp.key_block_length);
    s->s3->tmp.key_block = NULL;
293 294
    s->s3->tmp.key_block_length = 0;
}
295

296
int ssl3_init_finished_mac(SSL *s)
297
{
298 299 300 301 302 303
    BIO *buf = BIO_new(BIO_s_mem());

    if (buf == NULL) {
        SSLerr(SSL_F_SSL3_INIT_FINISHED_MAC, ERR_R_MALLOC_FAILURE);
        return 0;
    }
304
    ssl3_free_digest_list(s);
305
    s->s3->handshake_buffer = buf;
306
    (void)BIO_set_close(s->s3->handshake_buffer, BIO_CLOSE);
307
    return 1;
308 309
}

D
Dr. Stephen Henson 已提交
310 311 312 313 314
/*
 * Free digest list. Also frees handshake buffer since they are always freed
 * together.
 */

315 316
void ssl3_free_digest_list(SSL *s)
{
D
Dr. Stephen Henson 已提交
317 318
    BIO_free(s->s3->handshake_buffer);
    s->s3->handshake_buffer = NULL;
319
    EVP_MD_CTX_free(s->s3->handshake_dgst);
320 321
    s->s3->handshake_dgst = NULL;
}
322

M
Matt Caswell 已提交
323
int ssl3_finish_mac(SSL *s, const unsigned char *buf, size_t len)
324
{
M
Matt Caswell 已提交
325 326
    if (s->s3->handshake_dgst == NULL) {
        int ret;
327
        /* Note: this writes to a memory BIO so a failure is a fatal error */
M
Matt Caswell 已提交
328 329 330 331 332
        if (len > INT_MAX)
            return 0;
        ret = BIO_write(s->s3->handshake_buffer, (void *)buf, (int)len);
        return ret > 0 && ret == (int)len;
    } else {
333
        return EVP_DigestUpdate(s->s3->handshake_dgst, buf, len);
M
Matt Caswell 已提交
334
    }
335
}
336

337
int ssl3_digest_cached_records(SSL *s, int keep)
338 339 340 341 342 343
{
    const EVP_MD *md;
    long hdatalen;
    void *hdata;

    if (s->s3->handshake_dgst == NULL) {
344 345
        hdatalen = BIO_get_mem_data(s->s3->handshake_buffer, &hdata);
        if (hdatalen <= 0) {
E
Emilia Kasper 已提交
346 347
            SSLerr(SSL_F_SSL3_DIGEST_CACHED_RECORDS,
                   SSL_R_BAD_HANDSHAKE_LENGTH);
348 349
            return 0;
        }
350

351
        s->s3->handshake_dgst = EVP_MD_CTX_new();
352 353 354 355 356 357
        if (s->s3->handshake_dgst == NULL) {
            SSLerr(SSL_F_SSL3_DIGEST_CACHED_RECORDS, ERR_R_MALLOC_FAILURE);
            return 0;
        }

        md = ssl_handshake_md(s);
E
Emilia Kasper 已提交
358 359
        if (md == NULL || !EVP_DigestInit_ex(s->s3->handshake_dgst, md, NULL)
            || !EVP_DigestUpdate(s->s3->handshake_dgst, hdata, hdatalen)) {
360 361
            SSLerr(SSL_F_SSL3_DIGEST_CACHED_RECORDS, ERR_R_INTERNAL_ERROR);
            return 0;
362 363
        }
    }
364
    if (keep == 0) {
365 366 367 368 369 370
        BIO_free(s->s3->handshake_buffer);
        s->s3->handshake_buffer = NULL;
    }

    return 1;
}
371

372 373
size_t ssl3_final_finish_mac(SSL *s, const char *sender, size_t len,
                             unsigned char *p)
374
{
375
    int ret;
376
    EVP_MD_CTX *ctx = NULL;
377

378 379
    if (!ssl3_digest_cached_records(s, 0))
        return 0;
380

381
    if (EVP_MD_CTX_type(s->s3->handshake_dgst) != NID_md5_sha1) {
D
Dr. Stephen Henson 已提交
382
        SSLerr(SSL_F_SSL3_FINAL_FINISH_MAC, SSL_R_NO_REQUIRED_DIGEST);
383 384
        return 0;
    }
385

386
    ctx = EVP_MD_CTX_new();
387 388 389 390
    if (ctx == NULL) {
        SSLerr(SSL_F_SSL3_FINAL_FINISH_MAC, ERR_R_MALLOC_FAILURE);
        return 0;
    }
391 392 393 394
    if (!EVP_MD_CTX_copy_ex(ctx, s->s3->handshake_dgst)) {
        SSLerr(SSL_F_SSL3_FINAL_FINISH_MAC, ERR_R_INTERNAL_ERROR);
        return 0;
    }
395

396
    ret = EVP_MD_CTX_size(ctx);
397
    if (ret < 0) {
398
        EVP_MD_CTX_reset(ctx);
399
        return 0;
400
    }
401

402
    if ((sender != NULL && EVP_DigestUpdate(ctx, sender, len) <= 0)
E
Emilia Kasper 已提交
403
        || EVP_MD_CTX_ctrl(ctx, EVP_CTRL_SSL3_MASTER_SECRET,
404
                           (int)s->session->master_key_length,
E
Emilia Kasper 已提交
405 406
                           s->session->master_key) <= 0
        || EVP_DigestFinal_ex(ctx, p, NULL) <= 0) {
D
Dr. Stephen Henson 已提交
407
        SSLerr(SSL_F_SSL3_FINAL_FINISH_MAC, ERR_R_INTERNAL_ERROR);
408 409
        ret = 0;
    }
410

411
    EVP_MD_CTX_free(ctx);
412

413
    return ret;
414
}
415

U
Ulf Möller 已提交
416
int ssl3_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
417
                                size_t len, size_t *secret_size)
418 419
{
    static const unsigned char *salt[3] = {
420
#ifndef CHARSET_EBCDIC
421 422 423
        (const unsigned char *)"A",
        (const unsigned char *)"BB",
        (const unsigned char *)"CCC",
424
#else
425 426 427
        (const unsigned char *)"\x41",
        (const unsigned char *)"\x42\x42",
        (const unsigned char *)"\x43\x43\x43",
428
#endif
429 430
    };
    unsigned char buf[EVP_MAX_MD_SIZE];
431
    EVP_MD_CTX *ctx = EVP_MD_CTX_new();
432
    int i, ret = 1;
433
    unsigned int n;
434
    size_t ret_secret_size = 0;
435

436 437 438 439
    if (ctx == NULL) {
        SSLerr(SSL_F_SSL3_GENERATE_MASTER_SECRET, ERR_R_MALLOC_FAILURE);
        return 0;
    }
440
    for (i = 0; i < 3; i++) {
441
        if (EVP_DigestInit_ex(ctx, s->ctx->sha1, NULL) <= 0
E
Emilia Kasper 已提交
442 443 444 445 446 447 448
            || EVP_DigestUpdate(ctx, salt[i],
                                strlen((const char *)salt[i])) <= 0
            || EVP_DigestUpdate(ctx, p, len) <= 0
            || EVP_DigestUpdate(ctx, &(s->s3->client_random[0]),
                                SSL3_RANDOM_SIZE) <= 0
            || EVP_DigestUpdate(ctx, &(s->s3->server_random[0]),
                                SSL3_RANDOM_SIZE) <= 0
449
               /* TODO(size_t) : convert me */
E
Emilia Kasper 已提交
450 451 452 453 454
            || EVP_DigestFinal_ex(ctx, buf, &n) <= 0
            || EVP_DigestInit_ex(ctx, s->ctx->md5, NULL) <= 0
            || EVP_DigestUpdate(ctx, p, len) <= 0
            || EVP_DigestUpdate(ctx, buf, n) <= 0
            || EVP_DigestFinal_ex(ctx, out, &n) <= 0) {
455 456 457 458
            SSLerr(SSL_F_SSL3_GENERATE_MASTER_SECRET, ERR_R_INTERNAL_ERROR);
            ret = 0;
            break;
        }
459
        out += n;
460
        ret_secret_size += n;
461
    }
462
    EVP_MD_CTX_free(ctx);
463

R
Rich Salz 已提交
464
    OPENSSL_cleanse(buf, sizeof(buf));
465 466 467
    if (ret)
        *secret_size = ret_secret_size;
    return ret;
468
}
469

U
Ulf Möller 已提交
470
int ssl3_alert_code(int code)
471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534
{
    switch (code) {
    case SSL_AD_CLOSE_NOTIFY:
        return (SSL3_AD_CLOSE_NOTIFY);
    case SSL_AD_UNEXPECTED_MESSAGE:
        return (SSL3_AD_UNEXPECTED_MESSAGE);
    case SSL_AD_BAD_RECORD_MAC:
        return (SSL3_AD_BAD_RECORD_MAC);
    case SSL_AD_DECRYPTION_FAILED:
        return (SSL3_AD_BAD_RECORD_MAC);
    case SSL_AD_RECORD_OVERFLOW:
        return (SSL3_AD_BAD_RECORD_MAC);
    case SSL_AD_DECOMPRESSION_FAILURE:
        return (SSL3_AD_DECOMPRESSION_FAILURE);
    case SSL_AD_HANDSHAKE_FAILURE:
        return (SSL3_AD_HANDSHAKE_FAILURE);
    case SSL_AD_NO_CERTIFICATE:
        return (SSL3_AD_NO_CERTIFICATE);
    case SSL_AD_BAD_CERTIFICATE:
        return (SSL3_AD_BAD_CERTIFICATE);
    case SSL_AD_UNSUPPORTED_CERTIFICATE:
        return (SSL3_AD_UNSUPPORTED_CERTIFICATE);
    case SSL_AD_CERTIFICATE_REVOKED:
        return (SSL3_AD_CERTIFICATE_REVOKED);
    case SSL_AD_CERTIFICATE_EXPIRED:
        return (SSL3_AD_CERTIFICATE_EXPIRED);
    case SSL_AD_CERTIFICATE_UNKNOWN:
        return (SSL3_AD_CERTIFICATE_UNKNOWN);
    case SSL_AD_ILLEGAL_PARAMETER:
        return (SSL3_AD_ILLEGAL_PARAMETER);
    case SSL_AD_UNKNOWN_CA:
        return (SSL3_AD_BAD_CERTIFICATE);
    case SSL_AD_ACCESS_DENIED:
        return (SSL3_AD_HANDSHAKE_FAILURE);
    case SSL_AD_DECODE_ERROR:
        return (SSL3_AD_HANDSHAKE_FAILURE);
    case SSL_AD_DECRYPT_ERROR:
        return (SSL3_AD_HANDSHAKE_FAILURE);
    case SSL_AD_EXPORT_RESTRICTION:
        return (SSL3_AD_HANDSHAKE_FAILURE);
    case SSL_AD_PROTOCOL_VERSION:
        return (SSL3_AD_HANDSHAKE_FAILURE);
    case SSL_AD_INSUFFICIENT_SECURITY:
        return (SSL3_AD_HANDSHAKE_FAILURE);
    case SSL_AD_INTERNAL_ERROR:
        return (SSL3_AD_HANDSHAKE_FAILURE);
    case SSL_AD_USER_CANCELLED:
        return (SSL3_AD_HANDSHAKE_FAILURE);
    case SSL_AD_NO_RENEGOTIATION:
        return (-1);            /* Don't send it :-) */
    case SSL_AD_UNSUPPORTED_EXTENSION:
        return (SSL3_AD_HANDSHAKE_FAILURE);
    case SSL_AD_CERTIFICATE_UNOBTAINABLE:
        return (SSL3_AD_HANDSHAKE_FAILURE);
    case SSL_AD_UNRECOGNIZED_NAME:
        return (SSL3_AD_HANDSHAKE_FAILURE);
    case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE:
        return (SSL3_AD_HANDSHAKE_FAILURE);
    case SSL_AD_BAD_CERTIFICATE_HASH_VALUE:
        return (SSL3_AD_HANDSHAKE_FAILURE);
    case SSL_AD_UNKNOWN_PSK_IDENTITY:
        return (TLS1_AD_UNKNOWN_PSK_IDENTITY);
    case SSL_AD_INAPPROPRIATE_FALLBACK:
        return (TLS1_AD_INAPPROPRIATE_FALLBACK);
535 536
    case SSL_AD_NO_APPLICATION_PROTOCOL:
        return (TLS1_AD_NO_APPLICATION_PROTOCOL);
537 538
    case SSL_AD_CERTIFICATE_REQUIRED:
        return SSL_AD_HANDSHAKE_FAILURE;
539 540 541 542
    default:
        return (-1);
    }
}