/* This file is part of TALER (C) 2020 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. TALER 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 General Public License for more details. You should have received a copy of the GNU General Public License along with TALER; see the file COPYING. If not, see */ /** * @file util/test_helper_eddsa.c * @brief Tests for EDDSA crypto helper * @author Christian Grothoff */ #include "platform.h" #include "taler_util.h" #include /** * Configuration has 1 minute duration and 5 minutes lookahead, so * we should never have more than 6 active keys, plus for during * key expiration / revocation. */ #define MAX_KEYS 7 /** * How many random key revocations should we test? */ #define NUM_REVOKES 3 /** * How many iterations of the successful signing test should we run * during the benchmark phase? */ #define NUM_SIGN_TESTS 3 /** * How many iterations of the successful signing test should we run * during the benchmark phase? */ #define NUM_SIGN_PERFS 100 /** * Number of keys currently in #keys. */ static unsigned int num_keys; /** * Keys currently managed by the helper. */ struct KeyData { /** * Validity start point. */ struct GNUNET_TIME_Absolute start_time; /** * Key expires for signing at @e start_time plus this value. */ struct GNUNET_TIME_Relative validity_duration; /** * Full public key. */ struct TALER_ExchangePublicKeyP exchange_pub; /** * Is this key currently valid? */ bool valid; /** * Did the test driver revoke this key? */ bool revoked; }; /** * Array of all the keys we got from the helper. */ static struct KeyData keys[MAX_KEYS]; /** * Function called with information about available keys for signing. Usually * only called once per key upon connect. Also called again in case a key is * being revoked, in that case with an @a end_time of zero. Stores the keys * status in #keys. * * @param cls closure, NULL * @param start_time when does the key become available for signing; * zero if the key has been revoked or purged * @param validity_duration how long does the key remain available for signing; * zero if the key has been revoked or purged * @param exchange_pub the public key itself * @param sm_pub public key of the security module, NULL if the key was revoked or purged * @param sm_sig signature from the security module, NULL if the key was revoked or purged * The signature was already verified against @a sm_pub. */ static void key_cb (void *cls, struct GNUNET_TIME_Absolute start_time, struct GNUNET_TIME_Relative validity_duration, const struct TALER_ExchangePublicKeyP *exchange_pub, const struct TALER_SecurityModulePublicKeyP *sm_pub, const struct TALER_SecurityModuleSignatureP *sm_sig) { (void) sm_pub; (void) sm_sig; if (0 == validity_duration.rel_value_us) { bool found = false; for (unsigned int i = 0; i 0); num_keys--; found = true; break; } if (! found) GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Error: helper announced expiration of unknown key!\n"); return; } for (unsigned int i = 0; i 0); num_keys--; } return ret; } int main (int argc, const char *const argv[]) { struct GNUNET_OS_Process *helper; char *libexec_dir; char *binary_name; int ret; enum GNUNET_OS_ProcessStatusType type; unsigned long code; (void) argc; (void) argv; GNUNET_log_setup ("test-helper-eddsa", "INFO", NULL); GNUNET_OS_init (TALER_project_data_default ()); libexec_dir = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_BINDIR); GNUNET_asprintf (&binary_name, "%s/%s", libexec_dir, "taler-exchange-secmod-eddsa"); GNUNET_free (libexec_dir); helper = GNUNET_OS_start_process (GNUNET_OS_INHERIT_STD_ERR, NULL, NULL, NULL, binary_name, binary_name, "-c", "test_helper_eddsa.conf", "-L", "INFO", NULL); if (NULL == helper) { GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "exec", binary_name); GNUNET_free (binary_name); return 77; } GNUNET_free (binary_name); ret = run_test (); GNUNET_OS_process_kill (helper, SIGTERM); if (GNUNET_OK != GNUNET_OS_process_wait_status (helper, &type, &code)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Helper process did not die voluntarily, killing hard\n"); GNUNET_OS_process_kill (helper, SIGKILL); ret = 4; } else if ( (GNUNET_OS_PROCESS_EXITED != type) || (0 != code) ) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Helper died with unexpected status %d/%d\n", (int) type, (int) code); ret = 5; } GNUNET_OS_process_destroy (helper); return ret; } /* end of test_helper_eddsa.c */