Support INSTALL_PREFIX for packagers.
[openssl.git] / ssl / s3_clnt.c
index 5cc0ff446df03f3254ff0ffeea40daad8bb26d26..e0871c47ef0e186334cc55695e6923f034c4f2f5 100644 (file)
  */
 
 #include <stdio.h>
-#include "buffer.h"
-#include "rand.h"
-#include "objects.h"
-#include "evp.h"
+#include <openssl/buffer.h>
+#include <openssl/rand.h>
+#include <openssl/objects.h>
+#include <openssl/md5.h>
+#include <openssl/sha.h>
+#include <openssl/evp.h>
 #include "ssl_locl.h"
 
-#define BREAK break
-/* SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,ERR_R_MALLOC_FAILURE);
- * SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);
- * SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,ERR_R_MALLOC_FAILURE);
- * SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
- * SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);
- * SSLerr(SSL_F_SSL3_GET_SERVER_DONE,ERR_R_MALLOC_FAILURE);
-SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SSL3_SESSION_ID_TOO_SHORT);
- */
-
-#ifndef NOPROTO
 static SSL_METHOD *ssl3_get_client_method(int ver);
 static int ssl3_client_hello(SSL *s);
 static int ssl3_get_server_hello(SSL *s);
@@ -86,23 +77,7 @@ static int ssl3_send_client_key_exchange(SSL *s);
 static int ssl3_get_key_exchange(SSL *s);
 static int ssl3_get_server_certificate(SSL *s);
 static int ssl3_check_cert_and_algorithm(SSL *s);
-#else
-static SSL_METHOD *ssl3_get_client_method();
-static int ssl3_client_hello();
-static int ssl3_get_server_hello();
-static int ssl3_get_certificate_request();
-static int ca_dn_cmp();
-static int ssl3_get_server_done();
-static int ssl3_send_client_verify();
-static int ssl3_send_client_certificate();
-static int ssl3_send_client_key_exchange();
-static int ssl3_get_key_exchange();
-static int ssl3_get_server_certificate();
-static int ssl3_check_cert_and_algorithm();
-#endif
-
-static SSL_METHOD *ssl3_get_client_method(ver)
-int ver;
+static SSL_METHOD *ssl3_get_client_method(int ver)
        {
        if (ver == SSL3_VERSION)
                return(SSLv3_client_method());
@@ -110,7 +85,7 @@ int ver;
                return(NULL);
        }
 
-SSL_METHOD *SSLv3_client_method()
+SSL_METHOD *SSLv3_client_method(void)
        {
        static int init=1;
        static SSL_METHOD SSLv3_client_data;
@@ -126,8 +101,7 @@ SSL_METHOD *SSLv3_client_method()
        return(&SSLv3_client_data);
        }
 
-int ssl3_connect(s)
-SSL *s;
+int ssl3_connect(SSL *s)
        {
        BUF_MEM *buf;
        unsigned long Time=time(NULL),l;
@@ -468,8 +442,7 @@ end:
        }
 
 
-static int ssl3_client_hello(s)
-SSL *s;
+static int ssl3_client_hello(SSL *s)
        {
        unsigned char *buf;
        unsigned char *p,*d;
@@ -531,11 +504,11 @@ SSL *s;
                if (s->ctx->comp_methods == NULL)
                        j=0;
                else
-                       j=sk_num(s->ctx->comp_methods);
+                       j=sk_SSL_COMP_num(s->ctx->comp_methods);
                *(p++)=1+j;
                for (i=0; i<j; i++)
                        {
-                       comp=(SSL_COMP *)sk_value(s->ctx->comp_methods,i);
+                       comp=sk_SSL_COMP_value(s->ctx->comp_methods,i);
                        *(p++)=comp->id;
                        }
                *(p++)=0; /* Add the NULL method */
@@ -557,10 +530,9 @@ err:
        return(-1);
        }
 
-static int ssl3_get_server_hello(s)
-SSL *s;
+static int ssl3_get_server_hello(SSL *s)
        {
-       STACK *sk;
+       STACK_OF(SSL_CIPHER) *sk;
        SSL_CIPHER *c;
        unsigned char *p,*d;
        int i,al,ok;
@@ -645,7 +617,7 @@ SSL *s;
        p+=ssl_put_cipher_by_char(s,NULL,NULL);
 
        sk=ssl_get_ciphers_by_id(s);
-       i=sk_find(sk,(char *)c);
+       i=sk_SSL_CIPHER_find(sk,c);
        if (i < 0)
                {
                /* we did not say we would use this cipher */
@@ -700,14 +672,13 @@ err:
        return(-1);
        }
 
-static int ssl3_get_server_certificate(s)
-SSL *s;
+static int ssl3_get_server_certificate(SSL *s)
        {
        int al,i,ok,ret= -1;
        unsigned long n,nc,llen,l;
        X509 *x=NULL;
        unsigned char *p,*d,*q;
-       STACK *sk=NULL;
+       STACK_OF(X509) *sk=NULL;
        CERT *c;
        EVP_PKEY *pkey=NULL;
 
@@ -738,7 +709,7 @@ SSL *s;
                }
        d=p=(unsigned char *)s->init_buf->data;
 
-       if ((sk=sk_new_null()) == NULL)
+       if ((sk=sk_X509_new_null()) == NULL)
                {
                SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);
                goto err;
@@ -775,7 +746,7 @@ SSL *s;
                        SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
                        goto f_err;
                        }
-               if (!sk_push(sk,(char *)x))
+               if (!sk_X509_push(sk,x))
                        {
                        SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);
                        goto err;
@@ -800,7 +771,7 @@ SSL *s;
        s->session->cert=c;
 
        c->cert_chain=sk;
-       x=(X509 *)sk_value(sk,0);
+       x=sk_X509_value(sk,0);
        sk=NULL;
 
        pkey=X509_get_pubkey(x);
@@ -845,12 +816,11 @@ f_err:
 err:
        EVP_PKEY_free(pkey);
        X509_free(x);
-       sk_pop_free(sk,X509_free);
+       sk_X509_pop_free(sk,X509_free);
        return(ret);
        }
 
-static int ssl3_get_key_exchange(s)
-SSL *s;
+static int ssl3_get_key_exchange(SSL *s)
        {
 #ifndef NO_RSA
        unsigned char *q,md_buf[EVP_MAX_MD_SIZE*2];
@@ -860,7 +830,9 @@ SSL *s;
        int al,i,j,param_len,ok;
        long n,alg;
        EVP_PKEY *pkey=NULL;
+#ifndef NO_RSA
        RSA *rsa=NULL;
+#endif
 #ifndef NO_DH
        DH *dh=NULL;
 #endif
@@ -1143,15 +1115,14 @@ err:
        return(-1);
        }
 
-static int ssl3_get_certificate_request(s)
-SSL *s;
+static int ssl3_get_certificate_request(SSL *s)
        {
        int ok,ret=0;
        unsigned long n,nc,l;
        unsigned int llen,ctype_num,i;
        X509_NAME *xn=NULL;
        unsigned char *p,*d,*q;
-       STACK *ca_sk=NULL;
+       STACK_OF(X509_NAME) *ca_sk=NULL;
 
        n=ssl3_get_message(s,
                SSL3_ST_CR_CERT_REQ_A,
@@ -1195,7 +1166,7 @@ SSL *s;
 
        d=p=(unsigned char *)s->init_buf->data;
 
-       if ((ca_sk=sk_new(ca_dn_cmp)) == NULL)
+       if ((ca_sk=sk_X509_NAME_new(ca_dn_cmp)) == NULL)
                {
                SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);
                goto err;
@@ -1260,7 +1231,7 @@ fclose(out);
                        SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_CA_DN_LENGTH_MISMATCH);
                        goto err;
                        }
-               if (!sk_push(ca_sk,(char *)xn))
+               if (!sk_X509_NAME_push(ca_sk,xn))
                        {
                        SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);
                        goto err;
@@ -1280,24 +1251,22 @@ cont:
        s->s3->tmp.cert_req=1;
        s->s3->tmp.ctype_num=ctype_num;
        if (s->s3->tmp.ca_names != NULL)
-               sk_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
+               sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
        s->s3->tmp.ca_names=ca_sk;
        ca_sk=NULL;
 
        ret=1;
 err:
-       if (ca_sk != NULL) sk_pop_free(ca_sk,X509_NAME_free);
+       if (ca_sk != NULL) sk_X509_NAME_pop_free(ca_sk,X509_NAME_free);
        return(ret);
        }
 
-static int ca_dn_cmp(a,b)
-X509_NAME **a,**b;
+static int ca_dn_cmp(X509_NAME **a, X509_NAME **b)
        {
        return(X509_NAME_cmp(*a,*b));
        }
 
-static int ssl3_get_server_done(s)
-SSL *s;
+static int ssl3_get_server_done(SSL *s)
        {
        int ok,ret=0;
        long n;
@@ -1320,13 +1289,15 @@ SSL *s;
        return(ret);
        }
 
-static int ssl3_send_client_key_exchange(s)
-SSL *s;
+static int ssl3_send_client_key_exchange(SSL *s)
        {
-       unsigned char *p,*q,*d;
+       unsigned char *p,*d;
        int n;
        unsigned long l;
+#ifndef NO_RSA
+       unsigned char *q;
        EVP_PKEY *pkey=NULL;
+#endif
 
        if (s->state == SSL3_ST_CW_KEY_EXCH_A)
                {
@@ -1471,13 +1442,14 @@ err:
        return(-1);
        }
 
-static int ssl3_send_client_verify(s)
-SSL *s;
+static int ssl3_send_client_verify(SSL *s)
        {
        unsigned char *p,*d;
        unsigned char data[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
        EVP_PKEY *pkey;
+#ifndef NO_RSA
        int i=0;
+#endif
        unsigned long n;
 #ifndef NO_DSA
        int j;
@@ -1542,8 +1514,7 @@ err:
        return(-1);
        }
 
-static int ssl3_send_client_certificate(s)
-SSL *s;
+static int ssl3_send_client_certificate(SSL *s)
        {
        X509 *x509=NULL;
        EVP_PKEY *pkey=NULL;
@@ -1622,15 +1593,18 @@ SSL *s;
 
 #define has_bits(i,m)  (((i)&(m)) == (m))
 
-static int ssl3_check_cert_and_algorithm(s)
-SSL *s;
+static int ssl3_check_cert_and_algorithm(SSL *s)
        {
        int i,idx;
        long algs;
        EVP_PKEY *pkey=NULL;
        CERT *c;
+#ifndef NO_RSA
        RSA *rsa;
+#endif
+#ifndef NO_DH
        DH *dh;
+#endif
 
        c=s->session->cert;
 
@@ -1646,8 +1620,12 @@ SSL *s;
        if (algs & (SSL_aDH|SSL_aNULL))
                return(1);
 
+#ifndef NO_RSA
        rsa=s->session->cert->rsa_tmp;
+#endif
+#ifndef NO_DH
        dh=s->session->cert->dh_tmp;
+#endif
 
        /* This is the passed certificate */
 
@@ -1670,15 +1648,16 @@ SSL *s;
                goto f_err;
                }
 #endif
-
+#ifndef NO_RSA
        if ((algs & SSL_kRSA) &&
                !(has_bits(i,EVP_PK_RSA|EVP_PKT_ENC) || (rsa != NULL)))
                {
                SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_RSA_ENCRYPTING_CERT);
                goto f_err;
                }
+#endif
 #ifndef NO_DH
-       else if ((algs & SSL_kEDH) &&
+       if ((algs & SSL_kEDH) &&
                !(has_bits(i,EVP_PK_DH|EVP_PKT_EXCH) || (dh != NULL)))
                {
                SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_KEY);