RT3548: Remove unsupported platforms
[openssl.git] / ssl / s3_both.c
index 76258b3c5cf81c6e0949e07514c14c4f78fed2f9..72521531bdc066c421222d79252227abd3e5006a 100644 (file)
@@ -160,6 +160,8 @@ int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
 
                i=s->method->ssl3_enc->final_finish_mac(s,
                        sender,slen,s->s3->tmp.finish_md);
+               if (i == 0)
+                       return 0;
                s->s3->tmp.finish_md_len = i;
                memcpy(p, s->s3->tmp.finish_md, i);
                l=i;
@@ -181,12 +183,6 @@ int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
                         s->s3->previous_server_finished_len=i;
                         }
 
-#ifdef OPENSSL_SYS_WIN16
-               /* MSVC 1.5 does not clear the top bytes of the word unless
-                * I do this.
-                */
-               l&=0xffff;
-#endif
                ssl_set_handshake_header(s, SSL3_MT_FINISHED, l);
                s->state=b;
                }
@@ -201,7 +197,11 @@ static void ssl3_take_mac(SSL *s)
        {
        const char *sender;
        int slen;
-
+       /* If no new cipher setup return immediately: other functions will
+        * set the appropriate error.
+        */
+       if (s->s3->tmp.new_cipher == NULL)
+               return;
        if (s->state & SSL_ST_CONNECT)
                {
                sender=s->method->ssl3_enc->server_finished_label;
@@ -288,7 +288,8 @@ f_err:
        return(0);
        }
 
-/* for these 2 messages, we need to
+/*-
+ * for these 2 messages, we need to
  * ssl->enc_read_ctx                   re-init
  * ssl->s3->read_sequence              zero
  * ssl->s3->read_mac_secret            re-init
@@ -352,6 +353,7 @@ long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
                        goto f_err;
                        }
                *ok=1;
+               s->state = stn;
                s->init_msg = s->init_buf->data + 4;
                s->init_num = (int)s->s3->tmp.message_size;
                return s->init_num;
@@ -404,17 +406,6 @@ long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
                        SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE);
                        goto f_err;
                        }
-               if ((mt < 0) && (*p == SSL3_MT_CLIENT_HELLO) &&
-                                       (st1 == SSL3_ST_SR_CERT_A) &&
-                                       (stn == SSL3_ST_SR_CERT_B))
-                       {
-                       /* At this point we have got an MS SGC second client
-                        * hello (maybe we should always allow the client to
-                        * start a new handshake?). We need to restart the mac.
-                        * Don't increment {num,total}_renegotiations because
-                        * we have not completed the handshake. */
-                       ssl3_init_finished_mac(s);
-                       }
 
                s->s3->tmp.message_type= *(p++);
 
@@ -591,7 +582,8 @@ int ssl_verify_alarm_type(long type)
        }
 
 #ifndef OPENSSL_NO_BUF_FREELISTS
-/* On some platforms, malloc() performance is bad enough that you can't just
+/*-
+ * On some platforms, malloc() performance is bad enough that you can't just
  * free() and malloc() buffers all the time, so we need to use freelists from
  * unused buffers.  Currently, each freelist holds memory chunks of only a
  * given size (list->chunklen); other sized chunks are freed and malloced.
@@ -689,7 +681,7 @@ int ssl3_setup_read_buffer(SSL *s)
                        len += SSL3_RT_MAX_EXTRA;
                        }
 #ifndef OPENSSL_NO_COMP
-               if (!(s->options & SSL_OP_NO_COMPRESSION))
+               if (ssl_allow_compression(s))
                        len += SSL3_RT_MAX_COMPRESSED_OVERHEAD;
 #endif
                if ((p=freelist_extract(s->ctx, 1, len)) == NULL)
@@ -726,7 +718,7 @@ int ssl3_setup_write_buffer(SSL *s)
                        + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD
                        + headerlen + align;
 #ifndef OPENSSL_NO_COMP
-               if (!(s->options & SSL_OP_NO_COMPRESSION))
+               if (ssl_allow_compression(s))
                        len += SSL3_RT_MAX_COMPRESSED_OVERHEAD;
 #endif
                if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS))
@@ -776,3 +768,10 @@ int ssl3_release_read_buffer(SSL *s)
        return 1;
        }
 
+int ssl_allow_compression(SSL *s)
+       {
+       if (s->options & SSL_OP_NO_COMPRESSION)
+               return 0;
+       return ssl_security(s, SSL_SECOP_COMPRESSION, 0, 0, NULL);
+       }
+