Add a stand-alone "timing" program
Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com> Reviewed-by: Paul Dale <pauli@openssl.org> Reviewed-by: David von Oheimb <david.von.oheimb@siemens.com> (Merged from https://github.com/openssl/openssl/pull/18821)
This commit is contained in:
parent
6136408e6a
commit
6212fc6814
19
test/timing-cert.pem
Normal file
19
test/timing-cert.pem
Normal file
@ -0,0 +1,19 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdSb290
|
||||
IENBMCAXDTE2MDExNDIyMjk0NloYDzIxMTYwMTE1MjIyOTQ2WjAZMRcwFQYDVQQD
|
||||
DA5zZXJ2ZXIuZXhhbXBsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
||||
ANVdYGrf/GHuSKqMEUhDpW22Ul2qmEmxYZI1sfw6BCUMbXn/tNXJ6VwcO+Crs7h9
|
||||
o95tveDd11q/FEcRQl6mgtBhwX/dE0bmCYUHDvLU/Bpk0gqtIKsga5bwrczEGVNV
|
||||
3AEdpLPvirRJU12KBRzx3OFEv8XX4ncZV1yXC3XuiENxD8pswbSyUKd3RmxYDxG/
|
||||
8XYkWq45QrdRZynh0FUwbxfkkeqt+CjCQ2+iZKn7nZiSYkg+6w1PgkqK/z9y7pa1
|
||||
rqHBmLrvfZB1bf9aUp6r9cB+0IdD24UHBw99OHr90dPuZR3T6jlqhzfuStPgDW71
|
||||
cKzCvfFu85KVXqnwoWWVk40CAwEAAaN9MHswHQYDVR0OBBYEFMDnhL/oWSczELBS
|
||||
T1FSLwbWwHrNMB8GA1UdIwQYMBaAFHB/Lq6DaFmYBCMqzes+F80k3QFJMAkGA1Ud
|
||||
EwQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwGQYDVR0RBBIwEIIOc2VydmVyLmV4
|
||||
YW1wbGUwDQYJKoZIhvcNAQELBQADggEBAHvTBEN1ig8RrsT716Ginv4gGNX0LzGI
|
||||
RrZ1jO7lm5emuaPNYJpGw0iX5Zdo91qGNXPZaZ75X3S55pQTActq3OPEBOll2pyk
|
||||
iyjz+Zp/v5cfRZLlBbFW5gv2R94eibYr4U3fSn4B0yPcl4xH/l/HzJhGDsSDW8qK
|
||||
8VIJvmvsPwmL0JMCv+FR59F+NFYZdND/KCXet59WUpF9ICmFCoBEX3EyJXEPwhbi
|
||||
X2sdPzJbCjx0HLli8e0HUKNttLQxCsBTRGo6iISLLamwN47mGDa9miBADwGSiz2q
|
||||
YeeuLO02zToHhnQ6KbPXOrQAqcL1kngO4g+j/ru+4AZThFkdkGnltvk=
|
||||
-----END CERTIFICATE-----
|
29
test/timing-key.pem
Normal file
29
test/timing-key.pem
Normal file
@ -0,0 +1,29 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDVXWBq3/xh7kiq
|
||||
jBFIQ6VttlJdqphJsWGSNbH8OgQlDG15/7TVyelcHDvgq7O4faPebb3g3ddavxRH
|
||||
EUJepoLQYcF/3RNG5gmFBw7y1PwaZNIKrSCrIGuW8K3MxBlTVdwBHaSz74q0SVNd
|
||||
igUc8dzhRL/F1+J3GVdclwt17ohDcQ/KbMG0slCnd0ZsWA8Rv/F2JFquOUK3UWcp
|
||||
4dBVMG8X5JHqrfgowkNvomSp+52YkmJIPusNT4JKiv8/cu6Wta6hwZi6732QdW3/
|
||||
WlKeq/XAftCHQ9uFBwcPfTh6/dHT7mUd0+o5aoc37krT4A1u9XCswr3xbvOSlV6p
|
||||
8KFllZONAgMBAAECggEADLTt7A+A2Vg2jamf0dztejY0e42QWjstI2b9PZc67fXq
|
||||
gyx+WYkX07t+uWegYWliG/oPJ9guXiIpE/5sJHToL37S5kmFP2CtynVcJ4wVo4DD
|
||||
nY0n9+kLX0bgIuS+2V6wpoRcbbbjXM9NHrH8kfe5ftT4UtEDlLI2qLX6IcDd7p4u
|
||||
OYjILChR8GSGTw96yIy2Ws/1Uq9PMw64JoT4RcK5QqnkcPMDFRH1SeLOL+zXP2c4
|
||||
nEl9yOy3HauZKxwl/Ry/XK1s3DdjopIAU29ut+hAuMiTb06kzZnumL9NoplKoZtU
|
||||
otw/gVcCKhT+Ep+p6i8InLF0XEME8A0qUR0niWebgQKBgQD6vkxR49B8ZZQrzjw4
|
||||
XKs1lI9cP7cgPiuWlDHMNjYou3WbOaGrMeScvbB1Ldh9A8pjAhxlw8AaV/xs4qcA
|
||||
trmVmSISVMVyc1wSGlJXWi2nUzTNs9OE3vj22SyStihf8UUZtWwX2b5Y4JrYhA/V
|
||||
+ThGGqHR03oLNLShNLtJc2c7YQKBgQDZ1nkibEyrepexw/fnwkw61IJKq9wRIh1G
|
||||
PREakhbe9wU5ie0knuf9razt7awzQiwFmlixmWqsM7UEtLuXNnNPciwdrKhhbvrd
|
||||
vD/rkbIEHEPllIhFlDtOzn3hRBWTzWmXFjpou/2LvHTSbVis4IYVZymTp2jb1ZLs
|
||||
7VbiG9JTrQKBgQDc6n75g1szzpdehQT/r33U5j/syeJBUSU8NPMu9fB/sLHsgjlT
|
||||
SNEf2+y1QSBE/Or6kmiMrIv7advn30W+Vj9qc5HWTsPrk4HiHTjA553jl2alebN5
|
||||
lK4LZspjtIQcC8mS3goPdXPEgJdM/gWpwzr2YQ6DfOxBJT2j7n64NyoT4QKBgH7/
|
||||
yx+GhCx1DHtXBPDZFhg2TL+78lEK0oZgk9gp06up2CHzh44SFq6O0oLkTcCUk5Ww
|
||||
poTkLIy4mJBlzfgahp+KsK2cO46SZS9g0ONFzcMXt33hWpE2Gl2XhUwPpYTF/QlY
|
||||
rDTjZK5S8Mi9dzVSsNlJi7PJphiEK2R1+nFYRwcBAoGBANWoIG85jpXAOnq/Kcgx
|
||||
Rl3YivR0Ke6r1tFlP58rT7X3EkiboXyQl5vLIFCAwUte6RGrLl1dy3Qyh80B9ySL
|
||||
Jx6vj42CK7vgv6A96TuVYhnXTnEI6ZvwAQ2VGaw4BizhjALs/kdSE/og9aSCs3ws
|
||||
KQypwAFz0tbHxaNag/bSAN0J
|
||||
-----END PRIVATE KEY-----
|
||||
|
166
test/timing.c
Normal file
166
test/timing.c
Normal file
@ -0,0 +1,166 @@
|
||||
/*
|
||||
* Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*
|
||||
* I compiled this in the source tree this way:
|
||||
* gcc -g -Iinclude a.c libcrypto.a -ldl -lpthread
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <openssl/pem.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/bio.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
|
||||
static char *prog = "./a.out";
|
||||
|
||||
static void readx509(const char *contents, int size)
|
||||
{
|
||||
X509 *x = NULL;
|
||||
BIO *b = BIO_new_mem_buf(contents, size);
|
||||
|
||||
if (b == NULL)
|
||||
ERR_print_errors_fp(stderr), exit(1);
|
||||
PEM_read_bio_X509(b, &x, 0, NULL);
|
||||
if (x == NULL)
|
||||
ERR_print_errors_fp(stderr), exit(1);
|
||||
X509_free(x);
|
||||
BIO_free(b);
|
||||
}
|
||||
|
||||
static void readpkey(const char *contents, int size)
|
||||
{
|
||||
BIO *b = BIO_new_mem_buf(contents, size);
|
||||
EVP_PKEY *pkey;
|
||||
|
||||
if (b == NULL)
|
||||
ERR_print_errors_fp(stderr), exit(1);
|
||||
pkey = PEM_read_bio_PrivateKey(b, NULL, NULL, NULL);
|
||||
if (pkey == NULL)
|
||||
ERR_print_errors_fp(stderr), exit(1);
|
||||
|
||||
EVP_PKEY_free(pkey);
|
||||
BIO_free(b);
|
||||
}
|
||||
|
||||
|
||||
static void print(const char *what, struct timeval *tp)
|
||||
{
|
||||
printf("%s %ld sec %ld microsec\n", what, tp->tv_sec, tp->tv_usec);
|
||||
}
|
||||
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s [flags] pem-file\n", prog);
|
||||
fprintf(stderr, "Flags:\n");
|
||||
fprintf(stderr, " -c # Repeat count\n");
|
||||
fprintf(stderr, " -d Debugging output (minimal)\n");
|
||||
fprintf(stderr, " -w C What to load C is a single character:\n");
|
||||
fprintf(stderr, " c for cert (default)\n");
|
||||
fprintf(stderr, " p for private key\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int ac, char **av)
|
||||
{
|
||||
int i, debug = 0, count = 100, what = 'c';
|
||||
struct stat sb;
|
||||
FILE *fp;
|
||||
char *contents;
|
||||
struct rusage now, start, end, elapsed;
|
||||
struct timeval e_start, e_end, e_elapsed;
|
||||
|
||||
/* Parse JCL. */
|
||||
prog = av[0];
|
||||
while ((i = getopt(ac, av, "c:dw:")) != EOF) {
|
||||
switch (i) {
|
||||
default:
|
||||
usage();
|
||||
case 'c':
|
||||
if ((count = atoi(optarg)) < 0)
|
||||
usage();
|
||||
break;
|
||||
case 'd':
|
||||
debug = 1;
|
||||
break;
|
||||
case 'w':
|
||||
if (optarg[1] != '\0')
|
||||
usage;
|
||||
switch (*optarg) {
|
||||
default:
|
||||
usage();
|
||||
case 'c':
|
||||
case 'p':
|
||||
what = *optarg;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
ac -= optind;
|
||||
av += optind;
|
||||
|
||||
/* Read input file. */
|
||||
if (av[0] == NULL)
|
||||
usage();
|
||||
if (stat(av[0], &sb) < 0)
|
||||
perror(av[0]), exit(1);
|
||||
contents = malloc(sb.st_size + 1);
|
||||
if (contents == NULL)
|
||||
perror("malloc"), exit(1);
|
||||
fp = fopen(av[0], "r");
|
||||
if (fread(contents, 1, sb.st_size, fp) != sb.st_size)
|
||||
perror("fread"), exit(1);
|
||||
contents[sb.st_size] = '\0';
|
||||
fclose(fp);
|
||||
if (debug)
|
||||
printf(">%s<\n", contents);
|
||||
|
||||
/* Try to prep system cache, etc. */
|
||||
for (i = 10; --i >= 0; ) {
|
||||
switch (what) {
|
||||
case 'c':
|
||||
readx509(contents, (int)sb.st_size);
|
||||
break;
|
||||
case 'p':
|
||||
readpkey(contents, (int)sb.st_size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (gettimeofday(&e_start, NULL) < 0)
|
||||
perror("elapsed start"), exit(1);
|
||||
if (getrusage(RUSAGE_SELF, &start) < 0)
|
||||
perror("start"), exit(1);
|
||||
for (i = count; --i >= 0; ) {
|
||||
switch (what) {
|
||||
case 'c':
|
||||
readx509(contents, (int)sb.st_size);
|
||||
break;
|
||||
case 'p':
|
||||
readpkey(contents, (int)sb.st_size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (getrusage(RUSAGE_SELF, &end) < 0)
|
||||
perror("end"), exit(1);
|
||||
if (gettimeofday(&e_end, NULL) < 0)
|
||||
perror("end"), exit(1);
|
||||
|
||||
timersub(&end.ru_utime, &start.ru_stime, &elapsed.ru_stime);
|
||||
timersub(&end.ru_utime, &start.ru_utime, &elapsed.ru_utime);
|
||||
timersub(&e_end, &e_start, &e_elapsed);
|
||||
print("user ", &elapsed.ru_utime);
|
||||
print("sys ", &elapsed.ru_stime);
|
||||
if (debug)
|
||||
print("elapsed??", &e_elapsed);
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user