Remove a line that was causing redundant declarations.
[openssl.git] / apps / speed.c
index 8a2abf73d3093ac925c9e41abcea16f2650d79c9..5576f23feed47de431969289cc5ce3e63db0db93 100644 (file)
 #include <openssl/ecdh.h>
 #endif
 
+/*
+ * The following "HZ" timing stuff should be sync'd up with the code in
+ * crypto/tmdiff.[ch]. That appears to try to do the same job, though I think
+ * this code is more up to date than libcrypto's so there may be features to
+ * migrate over first. This is used in two places further down AFAICS. 
+ * The point is that nothing in openssl actually *uses* that tmdiff stuff, so
+ * either speed.c should be using it or it should go because it's obviously not
+ * useful enough. Anyone want to do a janitorial job on this?
+ */
+
 /* The following if from times(3) man page.  It may need to be changed */
 #ifndef HZ
 # if defined(_SC_CLK_TCK) \
      && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000)
-#  define HZ ((double)sysconf(_SC_CLK_TCK))
+#  define HZ sysconf(_SC_CLK_TCK)
 # else
 #  ifndef CLK_TCK
 #   ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
@@ -294,7 +304,7 @@ static double Time_F(int s)
 
 #ifdef USE_TOD
        if(usertime)
-           {
+               {
                static struct rusage tstart,tend;
 
                getrusage_used = 1;
@@ -349,7 +359,8 @@ static double Time_F(int s)
                else
                        {
                        times(&tend);
-                       ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
+                       ret = HZ;
+                       ret=(double)(tend.tms_utime-tstart.tms_utime) / ret;
                        return((ret < 1e-3)?1e-3:ret);
                        }
                }
@@ -396,6 +407,20 @@ static double Time_F(int s)
 #endif
        }
 
+
+static const int KDF1_SHA1_len = 20;
+static void *KDF1_SHA1(void *in, size_t inlen, void *out, size_t outlen)
+       {
+#ifndef OPENSSL_NO_SHA
+       if (outlen != SHA_DIGEST_LENGTH)
+               return NULL;
+       return SHA1(in, inlen, out);
+#else
+       return NULL;
+#endif
+       }
+
+
 int MAIN(int, char **);
 
 int MAIN(int argc, char **argv)
@@ -2065,12 +2090,28 @@ int MAIN(int argc, char **argv)
                                        }
                                else
                                        {
-                                       secret_size_a = ECDH_compute_key(secret_a, 
+                                       /* If field size is not more than 24 octets, then use SHA-1 hash of result;
+                                        * otherwise, use result (see section 4.8 of draft-ietf-tls-ecc-03.txt).
+                                        */
+                                       int field_size, outlen;
+                                       void *(*kdf)(void *in, size_t inlen, void *out, size_t xoutlen);
+                                       field_size = EC_GROUP_get_degree(ecdh_a[j]->group);
+                                       if (field_size <= 24 * 8)
+                                               {
+                                               outlen = KDF1_SHA1_len;
+                                               kdf = KDF1_SHA1;
+                                               }
+                                       else
+                                               {
+                                               outlen = (field_size+7)/8;
+                                               kdf = NULL;
+                                               }
+                                       secret_size_a = ECDH_compute_key(secret_a, outlen,
                                                ecdh_b[j]->pub_key,
-                                               ecdh_a[j]);
-                                       secret_size_b = ECDH_compute_key(secret_b, 
+                                               ecdh_a[j], kdf);
+                                       secret_size_b = ECDH_compute_key(secret_b, outlen,
                                                ecdh_a[j]->pub_key,
-                                               ecdh_b[j]);
+                                               ecdh_b[j], kdf);
                                        if (secret_size_a != secret_size_b) 
                                                ecdh_checks = 0;
                                        else
@@ -2099,9 +2140,9 @@ int MAIN(int argc, char **argv)
                                        Time_F(START);
                                        for (count=0,run=1; COND(ecdh_c[j][0]); count++)
                                                {
-                                               ECDH_compute_key(secret_a, 
+                                               ECDH_compute_key(secret_a, outlen,
                                                ecdh_b[j]->pub_key,
-                                               ecdh_a[j]);
+                                               ecdh_a[j], kdf);
                                                }
                                        d=Time_F(STOP);
                                        BIO_printf(bio_err, mr ? "+R7:%ld:%d:%.2f\n" :"%ld %d-bit ECDH ops in %.2fs\n",
@@ -2161,7 +2202,10 @@ show_res:
 #endif
 #ifdef HZ
 #define as_string(s) (#s)
-               printf("HZ=%g", (double)HZ);
+               {
+               double dbl = HZ;
+               printf("HZ=%g", dbl);
+               }
 # ifdef _SC_CLK_TCK
                printf(" [sysconf value]");
 # endif
@@ -2368,8 +2412,8 @@ static void pkey_print_message(char *str, char *str2, long num, int bits,
 
 static void print_result(int alg,int run_no,int count,double time_used)
        {
-       BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"
-                  : "%ld %s's in %.2fs\n",count,names[alg],time_used);
+       BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"
+                  : "%d %s's in %.2fs\n",count,names[alg],time_used);
        results[alg][run_no]=((double)count)/time_used*lengths[run_no];
        }