diff options
Diffstat (limited to 'plugins/MirOTR/libgcrypt-1.4.6/tests/pkbench.c')
-rw-r--r-- | plugins/MirOTR/libgcrypt-1.4.6/tests/pkbench.c | 514 |
1 files changed, 0 insertions, 514 deletions
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/tests/pkbench.c b/plugins/MirOTR/libgcrypt-1.4.6/tests/pkbench.c deleted file mode 100644 index 67b94dc9a6..0000000000 --- a/plugins/MirOTR/libgcrypt-1.4.6/tests/pkbench.c +++ /dev/null @@ -1,514 +0,0 @@ -/* pkbench.c - Pubkey menchmarking - * Copyright (C) 2004, 2005, 2008 Free Software Foundation, Inc. - * - * This file is part of Libgcrypt. - * - * Libgcrypt is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * Libgcrypt is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include <stdio.h> -#include <gcrypt.h> -#include <assert.h> -#include <stdlib.h> -#include <ctype.h> -#include <sys/stat.h> -#ifndef HAVE_W32_SYSTEM -# include <sys/times.h> -#endif /*HAVE_W32_SYSTEM*/ -#include <unistd.h> -#include <fcntl.h> -#include <time.h> -#include <errno.h> - -#define PGM "pkbench" - - -static int verbose; -static int debug; -static int error_count; - - -typedef struct context -{ - gcry_sexp_t key_secret; - gcry_sexp_t key_public; - gcry_sexp_t data; - gcry_sexp_t data_encrypted; - gcry_sexp_t data_signed; -} *context_t; - -typedef int (*work_t) (context_t context, unsigned int final); - - -static void -fail (const char *format, ...) -{ - va_list arg_ptr; - - fputs ( PGM ": ", stderr); - va_start (arg_ptr, format); - vfprintf (stderr, format, arg_ptr); - va_end (arg_ptr); - error_count++; -} - -static void -die (const char *format, ...) -{ - va_list arg_ptr; - - putchar ('\n'); - fputs ( PGM ": ", stderr); - va_start (arg_ptr, format); - vfprintf (stderr, format, arg_ptr); - va_end (arg_ptr); - exit (1); -} - -static void -show_sexp (const char *prefix, gcry_sexp_t a) -{ - char *buf; - size_t size; - - fputs (prefix, stderr); - size = gcry_sexp_sprint (a, GCRYSEXP_FMT_ADVANCED, NULL, 0); - buf = gcry_xmalloc (size); - - gcry_sexp_sprint (a, GCRYSEXP_FMT_ADVANCED, buf, size); - fprintf (stderr, "%.*s", (int)size, buf); - gcry_free (buf); -} - - -static void * -read_file (const char *fname, size_t *r_length) -{ - FILE *fp; - struct stat st; - char *buf; - size_t buflen; - - fp = fopen (fname, "rb"); - if (!fp) - { - fail ("can't open `%s': %s\n", fname, strerror (errno)); - return NULL; - } - - if (fstat (fileno(fp), &st)) - { - fail ("can't stat `%s': %s\n", fname, strerror (errno)); - fclose (fp); - return NULL; - } - - buflen = st.st_size; - buf = gcry_xmalloc (buflen+1); - if (fread (buf, buflen, 1, fp) != 1) - { - fail ("error reading `%s': %s\n", fname, strerror (errno)); - fclose (fp); - gcry_free (buf); - return NULL; - } - fclose (fp); - - if (r_length) - *r_length = buflen; - return buf; -} - - - -static void -benchmark (work_t worker, context_t context) -{ - clock_t timer_start, timer_stop; - unsigned int loop = 10; - unsigned int i = 0; - struct tms timer; - int ret = 0; - -#ifdef HAVE_W32_SYSTEM - timer_start = clock (); -#else - times (&timer); - timer_start = timer.tms_utime; -#endif - for (i = 0; i < loop; i++) - { - ret = (*worker) (context, (i + 1) == loop); - if (! ret) - break; - } -#ifdef HAVE_W32_SYSTEM - timer_stop = clock (); -#else - times (&timer); - timer_stop = timer.tms_utime; -#endif - - if (ret) - printf ("%.0f ms\n", - (((double) ((timer_stop - timer_start) / loop)) / CLOCKS_PER_SEC) - * 10000000); - else - printf ("[skipped]\n"); -} - -static int -work_encrypt (context_t context, unsigned int final) -{ - gcry_error_t err = GPG_ERR_NO_ERROR; - gcry_sexp_t data_encrypted = NULL; - int ret = 1; - - err = gcry_pk_encrypt (&data_encrypted, - context->data, context->key_public); - if (gpg_err_code (err) == GPG_ERR_NOT_IMPLEMENTED) - { - err = GPG_ERR_NO_ERROR; - ret = 0; - } - else - { - assert (! err); - - if (final) - context->data_encrypted = data_encrypted; - else - gcry_sexp_release (data_encrypted); - } - - return ret; -} - -static int -work_decrypt (context_t context, unsigned int final) -{ - gcry_error_t err = GPG_ERR_NO_ERROR; - int ret = 1; - - if (! context->data_encrypted) - ret = 0; - else - { - gcry_sexp_t data_decrypted = NULL; - - err = gcry_pk_decrypt (&data_decrypted, - context->data_encrypted, - context->key_secret); - assert (! err); - if (final) - { - gcry_sexp_release (context->data_encrypted); - context->data_encrypted = NULL; - } - gcry_sexp_release (data_decrypted); - } - - return ret; -} - -static int -work_sign (context_t context, unsigned int final) -{ - gcry_error_t err = GPG_ERR_NO_ERROR; - gcry_sexp_t data_signed = NULL; - int ret = 1; - - err = gcry_pk_sign (&data_signed, - context->data, context->key_secret); - if (gpg_err_code (err) == GPG_ERR_NOT_IMPLEMENTED) - { - err = GPG_ERR_NO_ERROR; - ret = 0; - } - else if (err) - { - fail ("pk_sign failed: %s\n", gpg_strerror (err)); - ret = 0; - } - else - { - if (final) - context->data_signed = data_signed; - else - gcry_sexp_release (data_signed); - } - - return ret; -} - -static int -work_verify (context_t context, unsigned int final) -{ - gcry_error_t err = GPG_ERR_NO_ERROR; - int ret = 1; - - if (!context->data_signed) - return 0; - - err = gcry_pk_verify (context->data_signed, - context->data, - context->key_public); - if (err) - { - show_sexp ("data_signed:\n", context->data_signed); - show_sexp ("data:\n", context->data); - fail ("pk_verify failed: %s\n", gpg_strerror (err)); - ret = 0; - } - else if (final) - { - gcry_sexp_release (context->data_signed); - context->data_signed = NULL; - } - - return ret; -} - -static void -process_key_pair (context_t context) -{ - struct - { - work_t worker; - const char *identifier; - } worker_functions[] = { { work_encrypt, "encrypt" }, - { work_decrypt, "decrypt" }, - { work_sign, "sign" }, - { work_verify, "verify" } }; - unsigned int i = 0; - - for (i = 0; i < (sizeof (worker_functions) / sizeof (*worker_functions)); i++) - { - printf ("%s: ", worker_functions[i].identifier); - benchmark (worker_functions[i].worker, context); - } -} - -static void -context_init (context_t context, gcry_sexp_t key_secret, gcry_sexp_t key_public) -{ - gcry_error_t err = GPG_ERR_NO_ERROR; - unsigned int key_size = 0; - gcry_mpi_t data = NULL; - gcry_sexp_t data_sexp = NULL; - - key_size = gcry_pk_get_nbits (key_secret); - assert (key_size); - - data = gcry_mpi_new (key_size); - assert (data); - - gcry_mpi_randomize (data, key_size, GCRY_STRONG_RANDOM); - gcry_mpi_clear_bit (data, key_size - 1); - err = gcry_sexp_build (&data_sexp, NULL, - "(data (flags raw) (value %m))", - data); - assert (! err); - gcry_mpi_release (data); - - context->key_secret = key_secret; - context->key_public = key_public; - context->data = data_sexp; - context->data_encrypted = NULL; - context->data_signed = NULL; -} - -static void -context_destroy (context_t context) -{ - gcry_sexp_release (context->key_secret); - gcry_sexp_release (context->key_public); - gcry_sexp_release (context->data); -} - -static void -process_key_pair_file (const char *key_pair_file) -{ - gcry_error_t err = GPG_ERR_NO_ERROR; - void *key_pair_buffer = NULL; - gcry_sexp_t key_pair_sexp = NULL; - gcry_sexp_t key_secret_sexp = NULL; - gcry_sexp_t key_public_sexp = NULL; - struct context context = { NULL }; - size_t file_length; - - key_pair_buffer = read_file (key_pair_file, &file_length); - if (!key_pair_buffer) - die ("failed to open `%s'\n", key_pair_file); - - err = gcry_sexp_sscan (&key_pair_sexp, NULL, - key_pair_buffer, file_length); - if (err) - die ("gcry_sexp_sscan failed\n"); - - key_secret_sexp = gcry_sexp_find_token (key_pair_sexp, "private-key", 0); - assert (key_secret_sexp); - key_public_sexp = gcry_sexp_find_token (key_pair_sexp, "public-key", 0); - assert (key_public_sexp); - - gcry_sexp_release (key_pair_sexp); - - context_init (&context, key_secret_sexp, key_public_sexp); - - printf ("Key file: %s\n", key_pair_file); - process_key_pair (&context); - printf ("\n"); - - context_destroy (&context); - gcry_free (key_pair_buffer); -} - - -static void -generate_key (const char *algorithm, const char *key_size) -{ - gcry_error_t err = GPG_ERR_NO_ERROR; - size_t key_pair_buffer_size = 0; - char *key_pair_buffer = NULL; - gcry_sexp_t key_spec = NULL; - gcry_sexp_t key_pair = NULL; - - if (isdigit ((unsigned int)*key_size)) - err = gcry_sexp_build (&key_spec, NULL, - "(genkey (%s (nbits %s)))", - algorithm, key_size); - else - err = gcry_sexp_build (&key_spec, NULL, - "(genkey (%s (curve %s)))", - algorithm, key_size); - if (err) - die ("sexp_build failed: %s\n", gpg_strerror (err)); - - err = gcry_pk_genkey (&key_pair, key_spec); - if (err) - { - show_sexp ("request:\n", key_spec); - die ("pk_genkey failed: %s\n", gpg_strerror (err)); - } - - key_pair_buffer_size = gcry_sexp_sprint (key_pair, GCRYSEXP_FMT_ADVANCED, - NULL, 0); - key_pair_buffer = gcry_xmalloc (key_pair_buffer_size); - - gcry_sexp_sprint (key_pair, GCRYSEXP_FMT_ADVANCED, - key_pair_buffer, key_pair_buffer_size); - - printf ("%.*s", (int)key_pair_buffer_size, key_pair_buffer); - gcry_free (key_pair_buffer); -} - - - -int -main (int argc, char **argv) -{ - int last_argc = -1; - int genkey_mode = 0; - int fips_mode = 0; - - if (argc) - { argc--; argv++; } - - while (argc && last_argc != argc ) - { - last_argc = argc; - if (!strcmp (*argv, "--")) - { - argc--; argv++; - break; - } - else if (!strcmp (*argv, "--help")) - { - puts ("Usage: " PGM " [OPTIONS] [FILES]\n" - "Various public key tests:\n\n" - " Default is to process all given key files\n\n" - " --genkey ALGONAME SIZE Generate a public key\n" - "\n" - " --verbose enable extra informational output\n" - " --debug enable additional debug output\n" - " --help display this help and exit\n\n"); - exit (0); - } - else if (!strcmp (*argv, "--verbose")) - { - verbose++; - argc--; argv++; - } - else if (!strcmp (*argv, "--debug")) - { - verbose = debug = 1; - argc--; argv++; - } - else if (!strcmp (*argv, "--genkey")) - { - genkey_mode = 1; - argc--; argv++; - } - else if (!strcmp (*argv, "--fips")) - { - fips_mode = 1; - argc--; argv++; - } - } - - gcry_control (GCRYCTL_SET_VERBOSITY, (int)verbose); - - if (fips_mode) - gcry_control (GCRYCTL_FORCE_FIPS_MODE, 0); - - gcry_control (GCRYCTL_DISABLE_SECMEM); - if (!gcry_check_version (GCRYPT_VERSION)) - { - fprintf (stderr, PGM ": version mismatch\n"); - exit (1); - } - - if (genkey_mode) - { - /* No valuable keys are create, so we can speed up our RNG. */ - gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0); - } - if (debug) - gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1u, 0); - gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); - - - if (genkey_mode && argc == 2) - { - generate_key (argv[0], argv[1]); - } - else if (!genkey_mode && argc) - { - int i; - - for (i = 0; i < argc; i++) - process_key_pair_file (argv[i]); - } - else - { - fprintf (stderr, "usage: " PGM - " [OPTIONS] [FILES] (try --help for more information)\n"); - exit (1); - } - - return error_count ? 1 : 0; -} |