Disable RegQueryValueEx() call.
[openssl.git] / ssl / s2_srvr.c
index 9643af65b6c5f22d0c4bdd0b133e8bf24387aded..1ed02540aec4d7bdc6521c501801370fbf6a8bd3 100644 (file)
  * [including the GNU Public Licence.]
  */
 
+#include "ssl_locl.h"
+#ifndef NO_SSL2
 #include <stdio.h>
 #include <openssl/bio.h>
 #include <openssl/rand.h>
 #include <openssl/objects.h>
-#include "ssl_locl.h"
 #include <openssl/evp.h>
 
 static SSL_METHOD *ssl2_get_server_method(int ver);
@@ -108,7 +109,7 @@ int ssl2_accept(SSL *s)
        void (*cb)()=NULL;
        int new_state,state;
 
-       RAND_seed(&l,sizeof(l));
+       RAND_add(&l,sizeof(l),0);
        ERR_clear_error();
        clear_sys_error();
 
@@ -121,8 +122,7 @@ int ssl2_accept(SSL *s)
        if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
        s->in_handshake++;
 
-       if (((s->session == NULL) || (s->session->cert == NULL)) &&
-               (s->cert == NULL))
+       if (s->cert == NULL)
                {
                SSLerr(SSL_F_SSL2_ACCEPT,SSL_R_NO_CERTIFICATE_SET);
                return(-1);
@@ -321,7 +321,7 @@ end:
 
 static int get_client_master_key(SSL *s)
        {
-       int export,i,n,keya,ek;
+       int is_export,i,n,keya,ek;
        unsigned char *p;
        SSL_CIPHER *cp;
        const EVP_CIPHER *c;
@@ -375,7 +375,7 @@ static int get_client_master_key(SSL *s)
        memcpy(s->session->key_arg,&(p[s->s2->tmp.clear+s->s2->tmp.enc]),
                (unsigned int)keya);
 
-       if (s->session->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL)
+       if (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL)
                {
                ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
                SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_NO_PRIVATEKEY);
@@ -385,7 +385,7 @@ static int get_client_master_key(SSL *s)
                &(p[s->s2->tmp.clear]),&(p[s->s2->tmp.clear]),
                (s->s2->ssl2_rollback)?RSA_SSLV23_PADDING:RSA_PKCS1_PADDING);
 
-       export=SSL_C_IS_EXPORT(s->session->cipher);
+       is_export=SSL_C_IS_EXPORT(s->session->cipher);
        
        if (!ssl_cipher_get_evp(s->session,&c,&md,NULL))
                {
@@ -396,7 +396,7 @@ static int get_client_master_key(SSL *s)
 
        if (s->session->cipher->algorithm2 & SSL2_CF_8_BYTE_ENC)
                {
-               export=1;
+               is_export=1;
                ek=8;
                }
        else
@@ -407,15 +407,15 @@ static int get_client_master_key(SSL *s)
        /* If a bad decrypt, continue with protocol but with a
         * dud master secret */
        if ((i < 0) ||
-               ((!export && (i != EVP_CIPHER_key_length(c)))
-               || ( export && ((i != ek) || (s->s2->tmp.clear+i !=
+               ((!is_export && (i != EVP_CIPHER_key_length(c)))
+               || (is_export && ((i != ek) || (s->s2->tmp.clear+i !=
                        EVP_CIPHER_key_length(c))))))
                {
-               if (export)
+               if (is_export)
                        i=ek;
                else
                        i=EVP_CIPHER_key_length(c);
-               RAND_bytes(p,i);
+               RAND_pseudo_bytes(p,i);
                }
 #else
        if (i < 0)
@@ -424,8 +424,8 @@ static int get_client_master_key(SSL *s)
                SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_BAD_RSA_DECRYPT);
                }
        /* incorrect number of key bytes for non export cipher */
-       else if ((!export && (i != EVP_CIPHER_key_length(c)))
-               || ( export && ((i != ek) || (s->s2->tmp.clear+i !=
+       else if ((!is_export && (i != EVP_CIPHER_key_length(c)))
+               || (is_export && ((i != ek) || (s->s2->tmp.clear+i !=
                        EVP_CIPHER_key_length(c)))))
                {
                error=1;
@@ -438,7 +438,7 @@ static int get_client_master_key(SSL *s)
                }
 #endif
 
-       if (export) i+=s->s2->tmp.clear;
+       if (is_export) i+=s->s2->tmp.clear;
        s->session->master_key_length=i;
        memcpy(s->session->master_key,p,(unsigned int)i);
        return(1);
@@ -599,27 +599,52 @@ static int server_hello(SSL *s)
                *(p++)=SSL2_MT_SERVER_HELLO;            /* type */
                hit=s->hit;
                *(p++)=(unsigned char)hit;
+#if 1
+               if (!hit)
+                       {
+                       if (s->session->sess_cert != NULL)
+                               /* This can't really happen because get_client_hello
+                                * has called ssl_get_new_session, which does not set
+                                * sess_cert. */
+                               ssl_sess_cert_free(s->session->sess_cert);
+                       s->session->sess_cert = ssl_sess_cert_new();
+                       if (s->session->sess_cert == NULL)
+                               {
+                               SSLerr(SSL_F_SERVER_HELLO, ERR_R_MALLOC_FAILURE);
+                               return(-1);
+                               }
+                       }
+               /* If 'hit' is set, then s->sess_cert may be non-NULL or NULL,
+                * depending on whether it survived in the internal cache
+                * or was retrieved from an external cache.
+                * If it is NULL, we cannot put any useful data in it anyway,
+                * so we don't touch it.
+                */
+
+#else /* That's what used to be done when cert_st and sess_cert_st were
+          * the same. */
                if (!hit)
                        {                       /* else add cert to session */
                        CRYPTO_add(&s->cert->references,1,CRYPTO_LOCK_SSL_CERT);
-                       if (s->session->cert != NULL)
-                               ssl_cert_free(s->session->cert);
-                       s->session->cert=s->cert;               
+                       if (s->session->sess_cert != NULL)
+                               ssl_cert_free(s->session->sess_cert);
+                       s->session->sess_cert=s->cert;          
                        }
                else    /* We have a session id-cache hit, if the
                         * session-id has no certificate listed against
                         * the 'cert' structure, grab the 'old' one
                         * listed against the SSL connection */
                        {
-                       if (s->session->cert == NULL)
+                       if (s->session->sess_cert == NULL)
                                {
                                CRYPTO_add(&s->cert->references,1,
                                        CRYPTO_LOCK_SSL_CERT);
-                               s->session->cert=s->cert;
+                               s->session->sess_cert=s->cert;
                                }
                        }
+#endif
 
-               if (s->session->cert == NULL)
+               if (s->cert == NULL)
                        {
                        ssl2_return_error(s,SSL2_PE_NO_CERTIFICATE);
                        SSLerr(SSL_F_SERVER_HELLO,SSL_R_NO_CERTIFICATE_SPECIFIED);
@@ -655,7 +680,7 @@ static int server_hello(SSL *s)
                /* make and send conn_id */
                s2n(SSL2_CONNECTION_ID_LENGTH,p);       /* add conn_id length */
                s->s2->conn_id_length=SSL2_CONNECTION_ID_LENGTH;
-               RAND_bytes(s->s2->conn_id,(int)s->s2->conn_id_length);
+               RAND_pseudo_bytes(s->s2->conn_id,(int)s->s2->conn_id_length);
                memcpy(d,s->s2->conn_id,SSL2_CONNECTION_ID_LENGTH);
                d+=SSL2_CONNECTION_ID_LENGTH;
 
@@ -664,7 +689,7 @@ static int server_hello(SSL *s)
                s->init_off=0;
                }
        /* SSL2_ST_SEND_SERVER_HELLO_B */
-       /* If we are using TCP/IP, the performace is bad if we do 2
+       /* If we are using TCP/IP, the performance is bad if we do 2
         * writes without a read between them.  This occurs when
         * Session-id reuse is used, so I will put in a buffering module
         */
@@ -773,7 +798,7 @@ static int request_certificate(SSL *s)
                p=(unsigned char *)s->init_buf->data;
                *(p++)=SSL2_MT_REQUEST_CERTIFICATE;
                *(p++)=SSL2_AT_MD5_WITH_RSA_ENCRYPTION;
-               RAND_bytes(ccd,SSL2_MIN_CERT_CHALLENGE_LENGTH);
+               RAND_pseudo_bytes(ccd,SSL2_MIN_CERT_CHALLENGE_LENGTH);
                memcpy(p,ccd,SSL2_MIN_CERT_CHALLENGE_LENGTH);
 
                s->state=SSL2_ST_SEND_REQUEST_CERTIFICATE_B;
@@ -872,17 +897,17 @@ static int request_certificate(SSL *s)
                        (unsigned int)s->s2->key_material_length);
                EVP_VerifyUpdate(&ctx,ccd,SSL2_MIN_CERT_CHALLENGE_LENGTH);
 
-               i=i2d_X509(s->session->cert->pkeys[SSL_PKEY_RSA_ENC].x509,NULL);
-               buf2=(unsigned char *)Malloc((unsigned int)i);
+               i=i2d_X509(s->cert->pkeys[SSL_PKEY_RSA_ENC].x509,NULL);
+               buf2=OPENSSL_malloc((unsigned int)i);
                if (buf2 == NULL)
                        {
                        SSLerr(SSL_F_REQUEST_CERTIFICATE,ERR_R_MALLOC_FAILURE);
                        goto msg_end;
                        }
                p2=buf2;
-               i=i2d_X509(s->session->cert->pkeys[SSL_PKEY_RSA_ENC].x509,&p2);
+               i=i2d_X509(s->cert->pkeys[SSL_PKEY_RSA_ENC].x509,&p2);
                EVP_VerifyUpdate(&ctx,buf2,(unsigned int)i);
-               Free(buf2);
+               OPENSSL_free(buf2);
 
                pkey=X509_get_pubkey(x509);
                if (pkey == NULL) goto end;
@@ -896,6 +921,7 @@ static int request_certificate(SSL *s)
                                X509_free(s->session->peer);
                        s->session->peer=x509;
                        CRYPTO_add(&x509->references,1,CRYPTO_LOCK_X509);
+                       s->session->verify_result = s->verify_result;
                        ret=1;
                        goto end;
                        }
@@ -940,4 +966,10 @@ static int ssl_rsa_private_decrypt(CERT *c, int len, unsigned char *from,
                SSLerr(SSL_F_SSL_RSA_PRIVATE_DECRYPT,ERR_R_RSA_LIB);
        return(i);
        }
+#else /* !NO_SSL2 */
+
+# if PEDANTIC
+static void *dummy=&dummy;
+# endif
 
+#endif