RT3548: Remove unsupported platforms
[openssl.git] / ssl / s3_both.c
index a537738f4298971a61304ab130921f81ab6b652a..72521531bdc066c421222d79252227abd3e5006a 100644 (file)
@@ -150,20 +150,20 @@ int ssl3_do_write(SSL *s, int type)
 
 int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
        {
-       unsigned char *p,*d;
+       unsigned char *p;
        int i;
        unsigned long l;
 
        if (s->state == a)
                {
-               d=(unsigned char *)s->init_buf->data;
-               p= &(d[4]);
+               p = ssl_handshake_start(s);
 
                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);
-               p+=i;
                l=i;
 
                 /* Copy the finished so we can use it for
@@ -183,23 +183,12 @@ 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
-
-               *(d++)=SSL3_MT_FINISHED;
-               l2n3(l,d);
-               s->init_num=(int)l+4;
-               s->init_off=0;
-
+               ssl_set_handshake_header(s, SSL3_MT_FINISHED, l);
                s->state=b;
                }
 
        /* SSL3_ST_SEND_xxxxxx_HELLO_B */
-       return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
+       return ssl_do_write(s);
        }
 
 #ifndef OPENSSL_NO_NEXTPROTONEG
@@ -208,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;
@@ -295,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
@@ -324,21 +318,17 @@ int ssl3_send_change_cipher_spec(SSL *s, int a, int b)
 unsigned long ssl3_output_cert_chain(SSL *s, CERT_PKEY *cpk)
        {
        unsigned char *p;
-       unsigned long l=7;
-       BUF_MEM *buf = s->init_buf;
+       unsigned long l = 3 + SSL_HM_HEADER_LENGTH(s);
 
        if (!ssl_add_cert_chain(s, cpk, &l))
                return 0;
 
-       l-=7;
-       p=(unsigned char *)&(buf->data[4]);
+       l -= 3 + SSL_HM_HEADER_LENGTH(s);
+       p = ssl_handshake_start(s);
        l2n3(l,p);
-       l+=3;
-       p=(unsigned char *)&(buf->data[0]);
-       *(p++)=SSL3_MT_CERTIFICATE;
-       l2n3(l,p);
-       l+=4;
-       return(l);
+       l += 3;
+       ssl_set_handshake_header(s, SSL3_MT_CERTIFICATE, l);
+       return l + SSL_HM_HEADER_LENGTH(s);
        }
 
 /* Obtain handshake message of message type 'mt' (any if mt == -1),
@@ -363,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;
@@ -415,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++);
 
@@ -602,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.
@@ -700,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)
@@ -737,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))
@@ -787,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);
+       }
+