Continued multibyte character support.
[openssl.git] / ssl / s2_clnt.c
index 049ec6c8e1bd3d4773350d13240af868f5a02092..1fe8bd627dbe2e12ef98104ac5c4944376a1236a 100644 (file)
@@ -56,6 +56,7 @@
  * [including the GNU Public Licence.]
  */
 
+#ifndef NO_RSA
 #include <stdio.h>
 #include <openssl/rand.h>
 #include <openssl/buffer.h>
@@ -63,7 +64,6 @@
 #include "ssl_locl.h"
 #include <openssl/evp.h>
 
-#ifndef NOPROTO
 static SSL_METHOD *ssl2_get_client_method(int ver);
 static int get_server_finished(SSL *s);
 static int get_server_verify(SSL *s);
@@ -72,20 +72,8 @@ static int client_hello(SSL *s);
 static int client_master_key(SSL *s);
 static int client_finished(SSL *s);
 static int client_certificate(SSL *s);
-static int ssl_rsa_public_encrypt(CERT *c, int len, unsigned char *from,
+static int ssl_rsa_public_encrypt(SESS_CERT *sc, int len, unsigned char *from,
        unsigned char *to,int padding);
-#else
-static SSL_METHOD *ssl2_get_client_method();
-static int get_server_finished();
-static int get_server_verify();
-static int get_server_hello();
-static int client_hello(); 
-static int client_master_key();
-static int client_finished();
-static int client_certificate();
-static int ssl_rsa_public_encrypt();
-#endif
-
 #define BREAK  break
 
 static SSL_METHOD *ssl2_get_client_method(int ver)
@@ -443,15 +431,23 @@ static int get_server_hello(SSL *s)
                s->session->cipher=sk_SSL_CIPHER_value(cl,i);
                }
 
-       if ((s->session != NULL) && (s->session->peer != NULL))
+       if (s->session->peer != NULL)
                X509_free(s->session->peer);
 
+#if 0 /* What is all this meant to accomplish?? */
        /* hmmm, can we have the problem of the other session with this
         * cert, Free's it before we increment the reference count. */
        CRYPTO_w_lock(CRYPTO_LOCK_X509);
-       s->session->peer=s->session->cert->key->x509;
-       CRYPTO_add(&s->session->peer->references,1,CRYPTO_LOCK_X509);
+       s->session->peer=s->session->sess_cert->key->x509;
+       /* Shouldn't do this: already locked */
+       /*CRYPTO_add(&s->session->peer->references,1,CRYPTO_LOCK_X509);*/
+       s->session->peer->references++;
        CRYPTO_w_unlock(CRYPTO_LOCK_X509);
+#else
+       s->session->peer = s->session->sess_cert->peer_key->x509;
+    /* peer_key->x509 has been set by ssl2_set_certificate. */
+       CRYPTO_add(&s->session->peer->references, 1, CRYPTO_LOCK_X509);
+#endif
 
        s->s2->conn_id_length=s->s2->tmp.conn_id_length;
        memcpy(s->s2->conn_id,p,s->s2->tmp.conn_id_length);
@@ -580,7 +576,7 @@ static int client_master_key(SSL *s)
                memcpy(d,sess->master_key,(unsigned int)clear);
                d+=clear;
 
-               enc=ssl_rsa_public_encrypt(sess->cert,enc,
+               enc=ssl_rsa_public_encrypt(sess->sess_cert,enc,
                        &(sess->master_key[clear]),d,
                        (s->s2->ssl2_rollback)?RSA_SSLV23_PADDING:RSA_PKCS1_PADDING);
                if (enc <= 0)
@@ -743,7 +739,7 @@ static int client_certificate(SSL *s)
                EVP_SignUpdate(&ctx,s->s2->key_material,
                        (unsigned int)s->s2->key_material_length);
                EVP_SignUpdate(&ctx,cert_ch,(unsigned int)cert_ch_len);
-               n=i2d_X509(s->session->cert->key->x509,&p);
+               n=i2d_X509(s->session->sess_cert->peer_key->x509,&p);
                EVP_SignUpdate(&ctx,buf,(unsigned int)n);
 
                p=buf;
@@ -884,7 +880,7 @@ int ssl2_set_certificate(SSL *s, int type, int len, unsigned char *data)
        {
        STACK_OF(X509) *sk=NULL;
        EVP_PKEY *pkey=NULL;
-       CERT *c=NULL;
+       SESS_CERT *sc=NULL;
        int i;
        X509 *x509=NULL;
        int ret=0;
@@ -910,22 +906,18 @@ int ssl2_set_certificate(SSL *s, int type, int len, unsigned char *data)
                goto err;
                }
 
-       /* cert for ssl */
-       c=ssl_cert_new();
-       if (c == NULL)
+       /* server's cert for this session */
+       sc=ssl_sess_cert_new();
+       if (sc == NULL)
                {
                ret= -1;
                goto err;
                }
+       if (s->session->sess_cert) ssl_sess_cert_free(s->session->sess_cert);
+       s->session->sess_cert=sc;
 
-       /* cert for session */
-       if (s->session->cert) ssl_cert_free(s->session->cert);
-       s->session->cert=c;
-
-/*     c->cert_type=type; */
-
-       c->pkeys[SSL_PKEY_RSA_ENC].x509=x509;
-       c->key= &(c->pkeys[SSL_PKEY_RSA_ENC]);
+       sc->peer_pkeys[SSL_PKEY_RSA_ENC].x509=x509;
+       sc->peer_key= &(sc->peer_pkeys[SSL_PKEY_RSA_ENC]);
 
        pkey=X509_get_pubkey(x509);
        x509=NULL;
@@ -940,7 +932,7 @@ int ssl2_set_certificate(SSL *s, int type, int len, unsigned char *data)
                goto err;
                }
 
-       if (!ssl_set_cert_type(c,SSL2_CT_X509_CERTIFICATE))
+       if (!ssl_set_peer_cert_type(sc,SSL2_CT_X509_CERTIFICATE))
                goto err;
        ret=1;
 err:
@@ -950,14 +942,14 @@ err:
        return(ret);
        }
 
-static int ssl_rsa_public_encrypt(CERT *c, int len, unsigned char *from,
+static int ssl_rsa_public_encrypt(SESS_CERT *sc, int len, unsigned char *from,
             unsigned char *to, int padding)
        {
        EVP_PKEY *pkey=NULL;
        int i= -1;
 
-       if ((c == NULL) || (c->key->x509 == NULL) ||
-               ((pkey=X509_get_pubkey(c->key->x509)) == NULL))
+       if ((sc == NULL) || (sc->peer_key->x509 == NULL) ||
+               ((pkey=X509_get_pubkey(sc->peer_key->x509)) == NULL))
                {
                SSLerr(SSL_F_SSL_RSA_PUBLIC_ENCRYPT,SSL_R_NO_PUBLICKEY);
                return(-1);
@@ -976,4 +968,4 @@ end:
        EVP_PKEY_free(pkey);
        return(i);
        }
-
+#endif