Implement msg_callback for SSL 2.0.
[openssl.git] / ssl / s23_clnt.c
index 067216b1a229cdc6b1527f91d136510da6e357cc..d74245384ad0f10197174d47179d6e9709e1679c 100644 (file)
@@ -68,7 +68,7 @@ static int ssl23_client_hello(SSL *s);
 static int ssl23_get_server_hello(SSL *s);
 static SSL_METHOD *ssl23_get_client_method(int ver)
        {
-#ifndef NO_SSL2
+#ifndef OPENSSL_NO_SSL2
        if (ver == SSL2_VERSION)
                return(SSLv2_client_method());
 #endif
@@ -113,8 +113,8 @@ int ssl23_connect(SSL *s)
        else if (s->ctx->info_callback != NULL)
                cb=s->ctx->info_callback;
        
-       if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); 
        s->in_handshake++;
+       if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); 
 
        for (;;)
                {
@@ -211,6 +211,7 @@ static int ssl23_client_hello(SSL *s)
        unsigned char *buf;
        unsigned char *p,*d;
        int i,ch_len;
+       int ret;
 
        buf=(unsigned char *)s->init_buf->data;
        if (s->state == SSL23_ST_CW_CLNT_HELLO_A)
@@ -224,7 +225,7 @@ static int ssl23_client_hello(SSL *s)
 #endif
 
                p=s->s3->client_random;
-               RAND_bytes(p,SSL3_RANDOM_SIZE);
+               RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE);
 
                /* Do the message type and length last */
                d= &(buf[2]);
@@ -285,7 +286,7 @@ static int ssl23_client_hello(SSL *s)
                        i=ch_len;
                s2n(i,d);
                memset(&(s->s3->client_random[0]),0,SSL3_RANDOM_SIZE);
-               RAND_bytes(&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i);
+               RAND_pseudo_bytes(&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i);
                memcpy(p,&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i);
                p+=i;
 
@@ -302,7 +303,11 @@ static int ssl23_client_hello(SSL *s)
                }
 
        /* SSL3_ST_CW_CLNT_HELLO_B */
-       return(ssl23_write_bytes(s));
+       ret = ssl23_write_bytes(s);
+       if (ret >= 2)
+               if (s->msg_callback)
+                       s->msg_callback(1, SSL2_VERSION, 0, s->init_buf->data+2, ret-2, s, s->msg_callback_arg); /* CLIENT-HELLO */
+       return ret;
        }
 
 static int ssl23_get_server_hello(SSL *s)
@@ -322,7 +327,7 @@ static int ssl23_get_server_hello(SSL *s)
        if ((p[0] & 0x80) && (p[2] == SSL2_MT_SERVER_HELLO) &&
                (p[5] == 0x00) && (p[6] == 0x02))
                {
-#ifdef NO_SSL2
+#ifdef OPENSSL_NO_SSL2
                SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
                goto err;
 #else
@@ -366,7 +371,9 @@ static int ssl23_get_server_hello(SSL *s)
                        }
 
                s->state=SSL2_ST_GET_SERVER_HELLO_A;
-               s->s2->ssl2_rollback=1;
+               if (!(s->client_version == SSL2_VERSION))
+                       /* use special padding (SSL 3.0 draft/RFC 2246, App. E.2) */
+                       s->s2->ssl2_rollback=1;
 
                /* setup the 5 bytes we have read so we get them from
                 * the sslv2 buffer */