fix typo
[openssl.git] / ssl / ssltest.c
index 7d6b53eed143662cae68def08bde71912ff07ec4..e9d339a8a3217c9c6f70cf3dfcb173786b81a6bf 100644 (file)
  * Hudson (tjh@cryptsoft.com).
  *
  */
+/* ====================================================================
+ * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
+ * ECC cipher suite support in OpenSSL originally developed by 
+ * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
+ */
 
 #define _XOPEN_SOURCE 600      /* Or gethostname won't be declared properly
                                   on Linux and GNU platforms. */
@@ -158,6 +163,10 @@ static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx);
 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export,int keylength);
 static void free_tmp_rsa(void);
 #endif
+static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg);
+#define APP_CALLBACK "Test Callback Argument"
+static char *app_verify_arg = APP_CALLBACK;
+
 #ifndef OPENSSL_NO_DH
 static DH *get_dh512(void);
 static DH *get_dh1024(void);
@@ -197,6 +206,9 @@ static void sv_usage(void)
        fprintf(stderr," -dhe1024dsa   - use 1024 bit key (with 160-bit subprime) for DHE\n");
        fprintf(stderr," -no_dhe       - disable DHE\n");
 #endif
+#ifndef OPENSSL_NO_ECDH
+       fprintf(stderr," -no_ecdhe     - disable ECDHE\n");
+#endif
 #ifndef OPENSSL_NO_SSL2
        fprintf(stderr," -ssl2         - use SSLv2\n");
 #endif
@@ -217,7 +229,12 @@ static void sv_usage(void)
        fprintf(stderr," -f            - Test even cases that can't work\n");
        fprintf(stderr," -time         - measure processor time used by client and server\n");
        fprintf(stderr," -zlib         - use zlib compression\n");
-       fprintf(stderr," -time         - use rle compression\n");
+       fprintf(stderr," -rle          - use rle compression\n");
+#ifndef OPENSSL_NO_ECDH
+       fprintf(stderr," -named_curve arg  - Elliptic curve name to use for ephemeral ECDH keys.\n" \
+                      "                 Use \"openssl ecparam -list_curves\" for all names\n"  \
+                      "                 (default is sect163r2).\n");
+#endif
        }
 
 static void print_details(SSL *c_ssl, const char *prefix)
@@ -336,10 +353,12 @@ int main(int argc, char *argv[])
        int tls1=0,ssl2=0,ssl3=0,ret=1;
        int client_auth=0;
        int server_auth=0,i;
+       int app_verify=0;
        char *server_cert=TEST_SERVER_CERT;
        char *server_key=NULL;
        char *client_cert=TEST_CLIENT_CERT;
        char *client_key=NULL;
+       char *named_curve = NULL;
        SSL_CTX *s_ctx=NULL;
        SSL_CTX *c_ctx=NULL;
        SSL_METHOD *meth=NULL;
@@ -349,8 +368,12 @@ int main(int argc, char *argv[])
 #ifndef OPENSSL_NO_DH
        DH *dh;
        int dhe1024 = 0, dhe1024dsa = 0;
+#endif
+#ifndef OPENSSL_NO_ECDH
+       EC_KEY *ecdh = NULL;
 #endif
        int no_dhe = 0;
+       int no_ecdhe = 0;
        int print_time = 0;
        clock_t s_time = 0, c_time = 0;
        int comp = 0;
@@ -395,14 +418,26 @@ int main(int argc, char *argv[])
                        debug=1;
                else if (strcmp(*argv,"-reuse") == 0)
                        reuse=1;
-#ifndef OPENSSL_NO_DH
                else if (strcmp(*argv,"-dhe1024") == 0)
+                       {
+#ifndef OPENSSL_NO_DH
                        dhe1024=1;
+#else
+                       fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n");
+#endif
+                       }
                else if (strcmp(*argv,"-dhe1024dsa") == 0)
+                       {
+#ifndef OPENSSL_NO_DH
                        dhe1024dsa=1;
+#else
+                       fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n");
 #endif
+                       }
                else if (strcmp(*argv,"-no_dhe") == 0)
                        no_dhe=1;
+               else if (strcmp(*argv,"-no_ecdhe") == 0)
+                       no_ecdhe=1;
                else if (strcmp(*argv,"-ssl2") == 0)
                        ssl2=1;
                else if (strcmp(*argv,"-tls1") == 0)
@@ -489,6 +524,20 @@ int main(int argc, char *argv[])
                        {
                        comp = COMP_RLE;
                        }
+               else if (strcmp(*argv,"-named_curve") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+#ifndef OPENSSL_NO_ECDH                
+                       named_curve = *(++argv);
+#else
+                       fprintf(stderr,"ignoring -named_curve, since I'm compiled without ECDH\n");
+                       ++argv;
+#endif
+                       }
+               else if (strcmp(*argv,"-app_verify") == 0)
+                       {
+                       app_verify = 1;
+                       }
                else
                        {
                        fprintf(stderr,"unknown option %s\n",*argv);
@@ -600,6 +649,44 @@ bad:
        (void)no_dhe;
 #endif
 
+#ifndef OPENSSL_NO_ECDH
+       if (!no_ecdhe)
+               {
+               ecdh = EC_KEY_new();
+               if (ecdh != NULL)
+                       {
+                       if (named_curve)
+                               {
+                               int nid = OBJ_sn2nid(named_curve);
+
+                               if (nid == 0)
+                                       {
+                                       BIO_printf(bio_err, "unknown curve name (%s)\n", named_curve);
+                                       EC_KEY_free(ecdh);
+                                       goto end;
+                                       }
+
+                               ecdh->group = EC_GROUP_new_by_nid(nid);
+                               if (ecdh->group == NULL)
+                                       {
+                                       BIO_printf(bio_err, "unable to create curve (%s)\n", named_curve);
+                                       EC_KEY_free(ecdh);
+                                       goto end;
+                                       }
+                               }
+                       
+                       if (ecdh->group == NULL)
+                               ecdh->group=EC_GROUP_new_by_nid(NID_sect163r2);
+
+                       SSL_CTX_set_tmp_ecdh(s_ctx, ecdh);
+                       SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_ECDH_USE);
+                       EC_KEY_free(ecdh);
+                       }
+               }
+#else
+       (void)no_ecdhe;
+#endif
+
 #ifndef OPENSSL_NO_RSA
        SSL_CTX_set_tmp_rsa_callback(s_ctx,tmp_rsa_cb);
 #endif
@@ -640,12 +727,20 @@ bad:
                SSL_CTX_set_verify(s_ctx,
                        SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
                        verify_callback);
+               if (app_verify) 
+                       {
+                       SSL_CTX_set_cert_verify_callback(s_ctx, app_verify_callback, app_verify_arg);
+                       }
                }
        if (server_auth)
                {
                BIO_printf(bio_err,"server authentication\n");
                SSL_CTX_set_verify(c_ctx,SSL_VERIFY_PEER,
                        verify_callback);
+               if (app_verify) 
+                       {
+                       SSL_CTX_set_cert_verify_callback(s_ctx, app_verify_callback, app_verify_arg);
+                       }
                }
        
        {
@@ -1036,10 +1131,10 @@ int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count,
                                        if (num > 1)
                                                --num; /* test restartability even more thoroughly */
                                        
-                                       r = BIO_nwrite(io1, &dataptr, (int)num);
+                                       r = BIO_nwrite0(io1, &dataptr);
                                        assert(r > 0);
-                                       assert(r <= (int)num);
-                                       num = r;
+                                       if (r < (int)num)
+                                               num = r;
                                        r = BIO_read(io2, dataptr, (int)num);
                                        if (r != (int)num) /* can't happen */
                                                {
@@ -1048,6 +1143,13 @@ int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count,
                                                goto err;
                                                }
                                        progress = 1;
+                                       r = BIO_nwrite(io1, &dataptr, (int)num);
+                                       if (r != (int)num) /* can't happen */
+                                               {
+                                               fprintf(stderr, "ERROR: BIO_nwrite() did not accept "
+                                                       "BIO_nwrite0() bytes");
+                                               goto err;
+                                               }
                                        
                                        if (debug)
                                                printf((io2 == client_io) ?
@@ -1433,6 +1535,25 @@ static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
        return(ok);
        }
 
+static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg)
+       {
+       char *s = NULL,buf[256];
+       int ok=1;
+
+       fprintf(stderr, "In app_verify_callback, allowing cert. ");
+       fprintf(stderr, "Arg is: %s\n", (char *)arg);
+       fprintf(stderr, "Finished printing do we have a context? 0x%x a cert? 0x%x\n",
+                       (unsigned int)ctx, (unsigned int)ctx->cert);
+       if (ctx->cert)
+               s=X509_NAME_oneline(X509_get_subject_name(ctx->cert),buf,256);
+       if (s != NULL)
+               {
+                       fprintf(stderr,"cert depth=%d %s\n",ctx->error_depth,buf);
+               }
+
+       return(ok);
+       }
+
 #ifndef OPENSSL_NO_RSA
 static RSA *rsa_tmp=NULL;