For the operating systems where it matters, it is sometimes good to
[openssl.git] / ssl / ssltest.c
index 76d1521399fb69204402b37690fa458ab50fcea6..4763f2a6d78f3a22d643fcd19dc241fb7705dea6 100644 (file)
@@ -88,6 +88,7 @@
 static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx);
 #ifndef NO_RSA
 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export,int keylength);
+static void free_tmp_rsa(void);
 #endif
 #ifndef NO_DH
 static DH *get_dh512(void);
@@ -139,9 +140,10 @@ static void sv_usage(void)
 #endif
        fprintf(stderr," -CApath arg   - PEM format directory of CA's\n");
        fprintf(stderr," -CAfile arg   - PEM format file of CA's\n");
-       fprintf(stderr," -cert arg     - Certificate file\n");
-       fprintf(stderr," -s_cert arg   - Just the server certificate file\n");
-       fprintf(stderr," -c_cert arg   - Just the client certificate file\n");
+       fprintf(stderr," -cert arg     - Server certificate file\n");
+       fprintf(stderr," -key arg      - Server key file (default: same as -cert)\n");
+       fprintf(stderr," -c_cert arg   - Client certificate file\n");
+       fprintf(stderr," -c_key arg    - Client key file (default: same as -c_cert)\n");
        fprintf(stderr," -cipher arg   - The cipher list\n");
        fprintf(stderr," -bio_pair     - Use BIO pairs\n");
        fprintf(stderr," -f            - Test even cases that can't work\n");
@@ -202,7 +204,9 @@ int main(int argc, char *argv[])
        int client_auth=0;
        int server_auth=0,i;
        char *server_cert=TEST_SERVER_CERT;
+       char *server_key=NULL;
        char *client_cert=TEST_CLIENT_CERT;
+       char *client_key=NULL;
        SSL_CTX *s_ctx=NULL;
        SSL_CTX *c_ctx=NULL;
        SSL_METHOD *meth=NULL;
@@ -282,11 +286,26 @@ int main(int argc, char *argv[])
                        if (--argc < 1) goto bad;
                        server_cert= *(++argv);
                        }
+               else if (strcmp(*argv,"-key") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       server_key= *(++argv);
+                       }
+               else if (strcmp(*argv,"-s_key") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       server_key= *(++argv);
+                       }
                else if (strcmp(*argv,"-c_cert") == 0)
                        {
                        if (--argc < 1) goto bad;
                        client_cert= *(++argv);
                        }
+               else if (strcmp(*argv,"-c_key") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       client_key= *(++argv);
+                       }
                else if (strcmp(*argv,"-cipher") == 0)
                        {
                        if (--argc < 1) goto bad;
@@ -416,8 +435,8 @@ bad:
                {
                ERR_print_errors(bio_err);
                }
-       else if (!SSL_CTX_use_PrivateKey_file(s_ctx,server_cert,
-               SSL_FILETYPE_PEM))
+       else if (!SSL_CTX_use_PrivateKey_file(s_ctx,
+               (server_key?server_key:server_cert), SSL_FILETYPE_PEM))
                {
                ERR_print_errors(bio_err);
                goto end;
@@ -427,7 +446,8 @@ bad:
                {
                SSL_CTX_use_certificate_file(c_ctx,client_cert,
                        SSL_FILETYPE_PEM);
-               SSL_CTX_use_PrivateKey_file(c_ctx,client_cert,
+               SSL_CTX_use_PrivateKey_file(c_ctx,
+                       (client_key?client_key:client_cert),
                        SSL_FILETYPE_PEM);
                }
 
@@ -480,10 +500,24 @@ bad:
                BIO_printf(bio_stdout, "%d handshakes of %ld bytes done\n",number,bytes);
        if (print_time)
                {
+#ifdef CLOCKS_PER_SEC
+               /* "To determine the time in seconds, the value returned
+                * by the clock function should be divided by the value
+                * of the macro CLOCKS_PER_SEC."
+                *                                       -- ISO/IEC 9899 */
                BIO_printf(bio_stdout, "Approximate total server time: %6.2f s\n"
                        "Approximate total client time: %6.2f s\n",
                        (double)s_time/CLOCKS_PER_SEC,
                        (double)c_time/CLOCKS_PER_SEC);
+#else
+               /* "`CLOCKS_PER_SEC' undeclared (first use this function)"
+                *                            -- cc on NeXTstep/OpenStep */
+               BIO_printf(bio_stdout,
+                       "Approximate total server time: %6.2f units\n"
+                       "Approximate total client time: %6.2f units\n",
+                       (double)s_time,
+                       (double)c_time);
+#endif
                }
 
        SSL_free(s_ssl);
@@ -495,6 +529,9 @@ end:
 
        if (bio_stdout != NULL) BIO_free(bio_stdout);
 
+#ifndef NO_RSA
+       free_tmp_rsa();
+#endif
        ERR_free_strings();
        ERR_remove_state(0);
        EVP_cleanup();
@@ -1156,7 +1193,7 @@ int doit(SSL *s_ssl, SSL *c_ssl, long count)
        ret=0;
 err:
        /* We have to set the BIO's to NULL otherwise they will be
-        * Free()ed twice.  Once when th s_ssl is SSL_free()ed and
+        * OPENSSL_free()ed twice.  Once when th s_ssl is SSL_free()ed and
         * again when c_ssl is SSL_free()ed.
         * This is a hack required because s_ssl and c_ssl are sharing the same
         * BIO structure and SSL_set_bio() and SSL_free() automatically
@@ -1209,10 +1246,10 @@ static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
        }
 
 #ifndef NO_RSA
+static RSA *rsa_tmp=NULL;
+
 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
        {
-       static RSA *rsa_tmp=NULL;
-
        if (rsa_tmp == NULL)
                {
                BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength);
@@ -1223,6 +1260,15 @@ static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
                }
        return(rsa_tmp);
        }
+
+static void free_tmp_rsa(void)
+       {
+       if (rsa_tmp != NULL)
+               {
+               RSA_free(rsa_tmp);
+               rsa_tmp = NULL;
+               }
+       }
 #endif
 
 #ifndef NO_DH
@@ -1232,7 +1278,7 @@ static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
  *    $ openssl dhparam -C -noout -dsaparam 1024
  * (The third function has been renamed to avoid name conflicts.)
  */
-DH *get_dh512()
+static DH *get_dh512()
        {
        static unsigned char dh512_p[]={
                0xCB,0xC8,0xE1,0x86,0xD0,0x1F,0x94,0x17,0xA6,0x99,0xF0,0xC6,
@@ -1255,7 +1301,7 @@ DH *get_dh512()
        return(dh);
        }
 
-DH *get_dh1024()
+static DH *get_dh1024()
        {
        static unsigned char dh1024_p[]={
                0xF8,0x81,0x89,0x7D,0x14,0x24,0xC5,0xD1,0xE6,0xF7,0xBF,0x3A,
@@ -1283,7 +1329,7 @@ DH *get_dh1024()
        return(dh);
        }
 
-DH *get_dh1024dsa()
+static DH *get_dh1024dsa()
        {
        static unsigned char dh1024_p[]={
                0xC8,0x00,0xF7,0x08,0x07,0x89,0x4D,0x90,0x53,0xF3,0xD5,0x00,