Home | History | Annotate | Download | only in ssl
      1 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      2  * All rights reserved.
      3  *
      4  * This package is an SSL implementation written
      5  * by Eric Young (eay (at) 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 (at) 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 (at) 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 (at) 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-2002 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 (at) 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 (at) cryptsoft.com).  This product includes software written by Tim
    107  * Hudson (tjh (at) cryptsoft.com). */
    108 
    109 #include <openssl/ssl.h>
    110 
    111 #include <assert.h>
    112 #include <limits.h>
    113 #include <stdio.h>
    114 #include <string.h>
    115 
    116 #include <openssl/buf.h>
    117 #include <openssl/err.h>
    118 #include <openssl/evp.h>
    119 #include <openssl/mem.h>
    120 #include <openssl/rand.h>
    121 
    122 #include "internal.h"
    123 
    124 
    125 static int do_ssl3_write(SSL *ssl, int type, const uint8_t *buf, unsigned len);
    126 
    127 /* kMaxWarningAlerts is the number of consecutive warning alerts that will be
    128  * processed. */
    129 static const uint8_t kMaxWarningAlerts = 4;
    130 
    131 /* ssl3_get_record reads a new input record. On success, it places it in
    132  * |ssl->s3->rrec| and returns one. Otherwise it returns <= 0 on error or if
    133  * more data is needed. */
    134 static int ssl3_get_record(SSL *ssl) {
    135   int ret;
    136 again:
    137   /* Ensure the buffer is large enough to decrypt in-place. */
    138   ret = ssl_read_buffer_extend_to(ssl, ssl_record_prefix_len(ssl));
    139   if (ret <= 0) {
    140     return ret;
    141   }
    142   assert(ssl_read_buffer_len(ssl) >= ssl_record_prefix_len(ssl));
    143 
    144   uint8_t *out = ssl_read_buffer(ssl) + ssl_record_prefix_len(ssl);
    145   size_t max_out = ssl_read_buffer_len(ssl) - ssl_record_prefix_len(ssl);
    146   uint8_t type, alert;
    147   size_t len, consumed;
    148   switch (tls_open_record(ssl, &type, out, &len, &consumed, &alert, max_out,
    149                           ssl_read_buffer(ssl), ssl_read_buffer_len(ssl))) {
    150     case ssl_open_record_success:
    151       ssl_read_buffer_consume(ssl, consumed);
    152 
    153       if (len > 0xffff) {
    154         OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
    155         return -1;
    156       }
    157 
    158       SSL3_RECORD *rr = &ssl->s3->rrec;
    159       rr->type = type;
    160       rr->length = (uint16_t)len;
    161       rr->data = out;
    162       return 1;
    163 
    164     case ssl_open_record_partial:
    165       ret = ssl_read_buffer_extend_to(ssl, consumed);
    166       if (ret <= 0) {
    167         return ret;
    168       }
    169       goto again;
    170 
    171     case ssl_open_record_discard:
    172       ssl_read_buffer_consume(ssl, consumed);
    173       goto again;
    174 
    175     case ssl_open_record_error:
    176       ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);
    177       return -1;
    178   }
    179 
    180   assert(0);
    181   OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
    182   return -1;
    183 }
    184 
    185 int ssl3_write_app_data(SSL *ssl, const void *buf, int len) {
    186   return ssl3_write_bytes(ssl, SSL3_RT_APPLICATION_DATA, buf, len);
    187 }
    188 
    189 /* Call this to write data in records of type |type|. It will return <= 0 if
    190  * not all data has been sent or non-blocking IO. */
    191 int ssl3_write_bytes(SSL *ssl, int type, const void *buf_, int len) {
    192   const uint8_t *buf = buf_;
    193   unsigned int tot, n, nw;
    194   int i;
    195 
    196   ssl->rwstate = SSL_NOTHING;
    197   assert(ssl->s3->wnum <= INT_MAX);
    198   tot = ssl->s3->wnum;
    199   ssl->s3->wnum = 0;
    200 
    201   if (!ssl->in_handshake && SSL_in_init(ssl) && !SSL_in_false_start(ssl)) {
    202     i = ssl->handshake_func(ssl);
    203     if (i < 0) {
    204       return i;
    205     }
    206     if (i == 0) {
    207       OPENSSL_PUT_ERROR(SSL, SSL_R_SSL_HANDSHAKE_FAILURE);
    208       return -1;
    209     }
    210   }
    211 
    212   /* Ensure that if we end up with a smaller value of data to write out than
    213    * the the original len from a write which didn't complete for non-blocking
    214    * I/O and also somehow ended up avoiding the check for this in
    215    * ssl3_write_pending/SSL_R_BAD_WRITE_RETRY as it must never be possible to
    216    * end up with (len-tot) as a large number that will then promptly send
    217    * beyond the end of the users buffer ... so we trap and report the error in
    218    * a way the user will notice. */
    219   if (len < 0 || (size_t)len < tot) {
    220     OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_LENGTH);
    221     return -1;
    222   }
    223 
    224   n = (len - tot);
    225   for (;;) {
    226     /* max contains the maximum number of bytes that we can put into a
    227      * record. */
    228     unsigned max = ssl->max_send_fragment;
    229     if (n > max) {
    230       nw = max;
    231     } else {
    232       nw = n;
    233     }
    234 
    235     i = do_ssl3_write(ssl, type, &buf[tot], nw);
    236     if (i <= 0) {
    237       ssl->s3->wnum = tot;
    238       return i;
    239     }
    240 
    241     if (i == (int)n || (type == SSL3_RT_APPLICATION_DATA &&
    242                         (ssl->mode & SSL_MODE_ENABLE_PARTIAL_WRITE))) {
    243       return tot + i;
    244     }
    245 
    246     n -= i;
    247     tot += i;
    248   }
    249 }
    250 
    251 static int ssl3_write_pending(SSL *ssl, int type, const uint8_t *buf,
    252                               unsigned int len) {
    253   if (ssl->s3->wpend_tot > (int)len ||
    254       (ssl->s3->wpend_buf != buf &&
    255        !(ssl->mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER)) ||
    256       ssl->s3->wpend_type != type) {
    257     OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_WRITE_RETRY);
    258     return -1;
    259   }
    260 
    261   int ret = ssl_write_buffer_flush(ssl);
    262   if (ret <= 0) {
    263     return ret;
    264   }
    265   return ssl->s3->wpend_ret;
    266 }
    267 
    268 /* do_ssl3_write writes an SSL record of the given type. */
    269 static int do_ssl3_write(SSL *ssl, int type, const uint8_t *buf, unsigned len) {
    270   /* If there is still data from the previous record, flush it. */
    271   if (ssl_write_buffer_is_pending(ssl)) {
    272     return ssl3_write_pending(ssl, type, buf, len);
    273   }
    274 
    275   /* If we have an alert to send, lets send it */
    276   if (ssl->s3->alert_dispatch) {
    277     int ret = ssl->method->ssl_dispatch_alert(ssl);
    278     if (ret <= 0) {
    279       return ret;
    280     }
    281     /* if it went, fall through and send more stuff */
    282   }
    283 
    284   if (len > SSL3_RT_MAX_PLAIN_LENGTH) {
    285     OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
    286     return -1;
    287   }
    288 
    289   if (len == 0) {
    290     return 0;
    291   }
    292 
    293   size_t max_out = len + ssl_max_seal_overhead(ssl);
    294   if (max_out < len) {
    295     OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
    296     return -1;
    297   }
    298   uint8_t *out;
    299   size_t ciphertext_len;
    300   if (!ssl_write_buffer_init(ssl, &out, max_out) ||
    301       !tls_seal_record(ssl, out, &ciphertext_len, max_out, type, buf, len)) {
    302     return -1;
    303   }
    304   ssl_write_buffer_set_len(ssl, ciphertext_len);
    305 
    306   /* memorize arguments so that ssl3_write_pending can detect bad write retries
    307    * later */
    308   ssl->s3->wpend_tot = len;
    309   ssl->s3->wpend_buf = buf;
    310   ssl->s3->wpend_type = type;
    311   ssl->s3->wpend_ret = len;
    312 
    313   /* we now just need to write the buffer */
    314   return ssl3_write_pending(ssl, type, buf, len);
    315 }
    316 
    317 int ssl3_read_app_data(SSL *ssl, uint8_t *buf, int len, int peek) {
    318   return ssl3_read_bytes(ssl, SSL3_RT_APPLICATION_DATA, buf, len, peek);
    319 }
    320 
    321 int ssl3_read_change_cipher_spec(SSL *ssl) {
    322   uint8_t byte;
    323   int ret = ssl3_read_bytes(ssl, SSL3_RT_CHANGE_CIPHER_SPEC, &byte, 1 /* len */,
    324                             0 /* no peek */);
    325   if (ret <= 0) {
    326     return ret;
    327   }
    328   assert(ret == 1);
    329 
    330   if (ssl->s3->rrec.length != 0 || byte != SSL3_MT_CCS) {
    331     OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_CHANGE_CIPHER_SPEC);
    332     ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
    333     return -1;
    334   }
    335 
    336   if (ssl->msg_callback != NULL) {
    337     ssl->msg_callback(0, ssl->version, SSL3_RT_CHANGE_CIPHER_SPEC, &byte, 1,
    338                       ssl, ssl->msg_callback_arg);
    339   }
    340 
    341   return 1;
    342 }
    343 
    344 void ssl3_read_close_notify(SSL *ssl) {
    345   ssl3_read_bytes(ssl, 0, NULL, 0, 0);
    346 }
    347 
    348 static int ssl3_can_renegotiate(SSL *ssl) {
    349   switch (ssl->renegotiate_mode) {
    350     case ssl_renegotiate_never:
    351       return 0;
    352     case ssl_renegotiate_once:
    353       return ssl->s3->total_renegotiations == 0;
    354     case ssl_renegotiate_freely:
    355       return 1;
    356     case ssl_renegotiate_ignore:
    357       return 1;
    358   }
    359 
    360   assert(0);
    361   return 0;
    362 }
    363 
    364 /* Return up to 'len' payload bytes received in 'type' records.
    365  * 'type' is one of the following:
    366  *
    367  *   -  SSL3_RT_HANDSHAKE (when ssl3_get_message calls us)
    368  *   -  SSL3_RT_CHANGE_CIPHER_SPEC (when ssl3_read_change_cipher_spec calls us)
    369  *   -  SSL3_RT_APPLICATION_DATA (when ssl3_read_app_data calls us)
    370  *   -  0 (during a shutdown, no data has to be returned)
    371  *
    372  * If we don't have stored data to work from, read a SSL/TLS record first
    373  * (possibly multiple records if we still don't have anything to return).
    374  *
    375  * This function must handle any surprises the peer may have for us, such as
    376  * Alert records (e.g. close_notify) or renegotiation requests. */
    377 int ssl3_read_bytes(SSL *ssl, int type, uint8_t *buf, int len, int peek) {
    378   int al, i, ret;
    379   unsigned int n;
    380   SSL3_RECORD *rr;
    381   void (*cb)(const SSL *ssl, int type, int value) = NULL;
    382 
    383   if ((type && type != SSL3_RT_APPLICATION_DATA && type != SSL3_RT_HANDSHAKE &&
    384        type != SSL3_RT_CHANGE_CIPHER_SPEC) ||
    385       (peek && type != SSL3_RT_APPLICATION_DATA)) {
    386     OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
    387     return -1;
    388   }
    389 
    390   /* This may require multiple iterations. False Start will cause
    391    * |ssl->handshake_func| to signal success one step early, but the handshake
    392    * must be completely finished before other modes are accepted.
    393    *
    394    * TODO(davidben): Move this check up to a higher level. */
    395   while (!ssl->in_handshake && SSL_in_init(ssl)) {
    396     assert(type == SSL3_RT_APPLICATION_DATA);
    397     i = ssl->handshake_func(ssl);
    398     if (i < 0) {
    399       return i;
    400     }
    401     if (i == 0) {
    402       OPENSSL_PUT_ERROR(SSL, SSL_R_SSL_HANDSHAKE_FAILURE);
    403       return -1;
    404     }
    405   }
    406 
    407 start:
    408   ssl->rwstate = SSL_NOTHING;
    409 
    410   /* ssl->s3->rrec.type    - is the type of record
    411    * ssl->s3->rrec.data    - data
    412    * ssl->s3->rrec.off     - offset into 'data' for next read
    413    * ssl->s3->rrec.length  - number of bytes. */
    414   rr = &ssl->s3->rrec;
    415 
    416   /* get new packet if necessary */
    417   if (rr->length == 0) {
    418     ret = ssl3_get_record(ssl);
    419     if (ret <= 0) {
    420       return ret;
    421     }
    422   }
    423 
    424   /* we now have a packet which can be read and processed */
    425 
    426   /* If the other end has shut down, throw anything we read away (even in
    427    * 'peek' mode) */
    428   if (ssl->shutdown & SSL_RECEIVED_SHUTDOWN) {
    429     rr->length = 0;
    430     ssl->rwstate = SSL_NOTHING;
    431     return 0;
    432   }
    433 
    434   if (type != 0 && type == rr->type) {
    435     ssl->s3->warning_alert_count = 0;
    436 
    437     /* Make sure that we are not getting application data when we are doing a
    438      * handshake for the first time. */
    439     if (SSL_in_init(ssl) && type == SSL3_RT_APPLICATION_DATA &&
    440         ssl->aead_read_ctx == NULL) {
    441       /* TODO(davidben): Is this check redundant with the handshake_func
    442        * check? */
    443       al = SSL_AD_UNEXPECTED_MESSAGE;
    444       OPENSSL_PUT_ERROR(SSL, SSL_R_APP_DATA_IN_HANDSHAKE);
    445       goto f_err;
    446     }
    447 
    448     /* Discard empty records. */
    449     if (rr->length == 0) {
    450       goto start;
    451     }
    452 
    453     if (len <= 0) {
    454       return len;
    455     }
    456 
    457     if ((unsigned int)len > rr->length) {
    458       n = rr->length;
    459     } else {
    460       n = (unsigned int)len;
    461     }
    462 
    463     memcpy(buf, rr->data, n);
    464     if (!peek) {
    465       rr->length -= n;
    466       rr->data += n;
    467       if (rr->length == 0) {
    468         /* The record has been consumed, so we may now clear the buffer. */
    469         ssl_read_buffer_discard(ssl);
    470       }
    471     }
    472 
    473     return n;
    474   }
    475 
    476   /* Process unexpected records. */
    477 
    478   if (type == SSL3_RT_APPLICATION_DATA && rr->type == SSL3_RT_HANDSHAKE) {
    479     /* If peer renegotiations are disabled, all out-of-order handshake records
    480      * are fatal. Renegotiations as a server are never supported. */
    481     if (ssl->server || !ssl3_can_renegotiate(ssl)) {
    482       al = SSL_AD_NO_RENEGOTIATION;
    483       OPENSSL_PUT_ERROR(SSL, SSL_R_NO_RENEGOTIATION);
    484       goto f_err;
    485     }
    486 
    487     /* This must be a HelloRequest, possibly fragmented over multiple records.
    488      * Consume data from the handshake protocol until it is complete. */
    489     static const uint8_t kHelloRequest[] = {SSL3_MT_HELLO_REQUEST, 0, 0, 0};
    490     while (ssl->s3->hello_request_len < sizeof(kHelloRequest)) {
    491       if (rr->length == 0) {
    492         /* Get a new record. */
    493         goto start;
    494       }
    495       if (rr->data[0] != kHelloRequest[ssl->s3->hello_request_len]) {
    496         al = SSL_AD_DECODE_ERROR;
    497         OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_HELLO_REQUEST);
    498         goto f_err;
    499       }
    500       rr->data++;
    501       rr->length--;
    502       ssl->s3->hello_request_len++;
    503     }
    504     ssl->s3->hello_request_len = 0;
    505 
    506     if (ssl->msg_callback) {
    507       ssl->msg_callback(0, ssl->version, SSL3_RT_HANDSHAKE, kHelloRequest,
    508                       sizeof(kHelloRequest), ssl, ssl->msg_callback_arg);
    509     }
    510 
    511     if (!SSL_is_init_finished(ssl) || !ssl->s3->initial_handshake_complete) {
    512       /* This cannot happen. If a handshake is in progress, |type| must be
    513        * |SSL3_RT_HANDSHAKE|. */
    514       assert(0);
    515       OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
    516       goto err;
    517     }
    518 
    519     if (ssl->renegotiate_mode == ssl_renegotiate_ignore) {
    520       goto start;
    521     }
    522 
    523     /* Renegotiation is only supported at quiescent points in the application
    524      * protocol, namely in HTTPS, just before reading the HTTP response. Require
    525      * the record-layer be idle and avoid complexities of sending a handshake
    526      * record while an application_data record is being written. */
    527     if (ssl_write_buffer_is_pending(ssl)) {
    528       al = SSL_AD_NO_RENEGOTIATION;
    529       OPENSSL_PUT_ERROR(SSL, SSL_R_NO_RENEGOTIATION);
    530       goto f_err;
    531     }
    532 
    533     /* Begin a new handshake. */
    534     ssl->s3->total_renegotiations++;
    535     ssl->state = SSL_ST_CONNECT;
    536     i = ssl->handshake_func(ssl);
    537     if (i < 0) {
    538       return i;
    539     }
    540     if (i == 0) {
    541       OPENSSL_PUT_ERROR(SSL, SSL_R_SSL_HANDSHAKE_FAILURE);
    542       return -1;
    543     }
    544 
    545     /* The handshake completed synchronously. Continue reading records. */
    546     goto start;
    547   }
    548 
    549   /* If an alert record, process one alert out of the record. Note that we allow
    550    * a single record to contain multiple alerts. */
    551   if (rr->type == SSL3_RT_ALERT) {
    552     /* Alerts may not be fragmented. */
    553     if (rr->length < 2) {
    554       al = SSL_AD_DECODE_ERROR;
    555       OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_ALERT);
    556       goto f_err;
    557     }
    558 
    559     if (ssl->msg_callback) {
    560       ssl->msg_callback(0, ssl->version, SSL3_RT_ALERT, rr->data, 2, ssl,
    561                         ssl->msg_callback_arg);
    562     }
    563     const uint8_t alert_level = rr->data[0];
    564     const uint8_t alert_descr = rr->data[1];
    565     rr->length -= 2;
    566     rr->data += 2;
    567 
    568     if (ssl->info_callback != NULL) {
    569       cb = ssl->info_callback;
    570     } else if (ssl->ctx->info_callback != NULL) {
    571       cb = ssl->ctx->info_callback;
    572     }
    573 
    574     if (cb != NULL) {
    575       uint16_t alert = (alert_level << 8) | alert_descr;
    576       cb(ssl, SSL_CB_READ_ALERT, alert);
    577     }
    578 
    579     if (alert_level == SSL3_AL_WARNING) {
    580       ssl->s3->warn_alert = alert_descr;
    581       if (alert_descr == SSL_AD_CLOSE_NOTIFY) {
    582         ssl->shutdown |= SSL_RECEIVED_SHUTDOWN;
    583         return 0;
    584       }
    585 
    586       /* This is a warning but we receive it if we requested renegotiation and
    587        * the peer denied it. Terminate with a fatal alert because if
    588        * application tried to renegotiatie it presumably had a good reason and
    589        * expects it to succeed.
    590        *
    591        * In future we might have a renegotiation where we don't care if the
    592        * peer refused it where we carry on. */
    593       else if (alert_descr == SSL_AD_NO_RENEGOTIATION) {
    594         al = SSL_AD_HANDSHAKE_FAILURE;
    595         OPENSSL_PUT_ERROR(SSL, SSL_R_NO_RENEGOTIATION);
    596         goto f_err;
    597       }
    598 
    599       ssl->s3->warning_alert_count++;
    600       if (ssl->s3->warning_alert_count > kMaxWarningAlerts) {
    601         al = SSL_AD_UNEXPECTED_MESSAGE;
    602         OPENSSL_PUT_ERROR(SSL, SSL_R_TOO_MANY_WARNING_ALERTS);
    603         goto f_err;
    604       }
    605     } else if (alert_level == SSL3_AL_FATAL) {
    606       char tmp[16];
    607 
    608       ssl->rwstate = SSL_NOTHING;
    609       ssl->s3->fatal_alert = alert_descr;
    610       OPENSSL_PUT_ERROR(SSL, SSL_AD_REASON_OFFSET + alert_descr);
    611       BIO_snprintf(tmp, sizeof(tmp), "%d", alert_descr);
    612       ERR_add_error_data(2, "SSL alert number ", tmp);
    613       ssl->shutdown |= SSL_RECEIVED_SHUTDOWN;
    614       SSL_CTX_remove_session(ssl->ctx, ssl->session);
    615       return 0;
    616     } else {
    617       al = SSL_AD_ILLEGAL_PARAMETER;
    618       OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_ALERT_TYPE);
    619       goto f_err;
    620     }
    621 
    622     goto start;
    623   }
    624 
    625   if (ssl->shutdown & SSL_SENT_SHUTDOWN) {
    626     /* close_notify has been sent, so discard all records other than alerts. */
    627     rr->length = 0;
    628     goto start;
    629   }
    630 
    631   al = SSL_AD_UNEXPECTED_MESSAGE;
    632   OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_RECORD);
    633 
    634 f_err:
    635   ssl3_send_alert(ssl, SSL3_AL_FATAL, al);
    636 err:
    637   return -1;
    638 }
    639 
    640 int ssl3_do_change_cipher_spec(SSL *ssl) {
    641   int i;
    642 
    643   if (ssl->state & SSL_ST_ACCEPT) {
    644     i = SSL3_CHANGE_CIPHER_SERVER_READ;
    645   } else {
    646     i = SSL3_CHANGE_CIPHER_CLIENT_READ;
    647   }
    648 
    649   if (ssl->s3->tmp.key_block == NULL) {
    650     if (ssl->session == NULL || ssl->session->master_key_length == 0) {
    651       /* might happen if dtls1_read_bytes() calls this */
    652       OPENSSL_PUT_ERROR(SSL, SSL_R_CCS_RECEIVED_EARLY);
    653       return 0;
    654     }
    655 
    656     ssl->session->cipher = ssl->s3->tmp.new_cipher;
    657     if (!ssl->enc_method->setup_key_block(ssl)) {
    658       return 0;
    659     }
    660   }
    661 
    662   if (!ssl->enc_method->change_cipher_state(ssl, i)) {
    663     return 0;
    664   }
    665 
    666   return 1;
    667 }
    668 
    669 int ssl3_send_alert(SSL *ssl, int level, int desc) {
    670   /* Map tls/ssl alert value to correct one */
    671   desc = ssl->enc_method->alert_value(desc);
    672   if (ssl->version == SSL3_VERSION && desc == SSL_AD_PROTOCOL_VERSION) {
    673     /* SSL 3.0 does not have protocol_version alerts */
    674     desc = SSL_AD_HANDSHAKE_FAILURE;
    675   }
    676   if (desc < 0) {
    677     return -1;
    678   }
    679 
    680   /* If a fatal one, remove from cache */
    681   if (level == 2 && ssl->session != NULL) {
    682     SSL_CTX_remove_session(ssl->ctx, ssl->session);
    683   }
    684 
    685   ssl->s3->alert_dispatch = 1;
    686   ssl->s3->send_alert[0] = level;
    687   ssl->s3->send_alert[1] = desc;
    688   if (!ssl_write_buffer_is_pending(ssl)) {
    689     /* Nothing is being written out, so the alert may be dispatched
    690      * immediately. */
    691     return ssl->method->ssl_dispatch_alert(ssl);
    692   }
    693 
    694   /* else data is still being written out, we will get written some time in the
    695    * future */
    696   return -1;
    697 }
    698 
    699 int ssl3_dispatch_alert(SSL *ssl) {
    700   int i, j;
    701   void (*cb)(const SSL *ssl, int type, int value) = NULL;
    702 
    703   ssl->s3->alert_dispatch = 0;
    704   i = do_ssl3_write(ssl, SSL3_RT_ALERT, &ssl->s3->send_alert[0], 2);
    705   if (i <= 0) {
    706     ssl->s3->alert_dispatch = 1;
    707   } else {
    708     /* Alert sent to BIO.  If it is important, flush it now. If the message
    709      * does not get sent due to non-blocking IO, we will not worry too much. */
    710     if (ssl->s3->send_alert[0] == SSL3_AL_FATAL) {
    711       BIO_flush(ssl->wbio);
    712     }
    713 
    714     if (ssl->msg_callback) {
    715       ssl->msg_callback(1, ssl->version, SSL3_RT_ALERT, ssl->s3->send_alert, 2,
    716                         ssl, ssl->msg_callback_arg);
    717     }
    718 
    719     if (ssl->info_callback != NULL) {
    720       cb = ssl->info_callback;
    721     } else if (ssl->ctx->info_callback != NULL) {
    722       cb = ssl->ctx->info_callback;
    723     }
    724 
    725     if (cb != NULL) {
    726       j = (ssl->s3->send_alert[0] << 8) | ssl->s3->send_alert[1];
    727       cb(ssl, SSL_CB_WRITE_ALERT, j);
    728     }
    729   }
    730 
    731   return i;
    732 }
    733