2 This file is part of GNUnet.
3 Copyright (C) 2002-2013 GNUnet e.V.
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
17 * @file util/test_crypto_ecdsa.c
18 * @brief testcase for ECC ECDSA public key crypto
19 * @author Christian Grothoff
22 #include "gnunet_util_lib.h"
23 #include "gnunet_signatures.h"
28 #define PERF GNUNET_YES
31 static struct GNUNET_CRYPTO_EcdsaPrivateKey *key;
37 struct GNUNET_CRYPTO_EcdsaSignature sig;
38 struct GNUNET_CRYPTO_EccSignaturePurpose purp;
39 struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
41 struct GNUNET_TIME_Absolute start;
44 FPRINTF (stderr, "%s", "W");
45 GNUNET_CRYPTO_ecdsa_key_get_public (key, &pkey);
46 start = GNUNET_TIME_absolute_get ();
47 purp.size = htonl (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose));
48 purp.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_TEST);
50 for (i = 0; i < ITER; i++)
52 FPRINTF (stderr, "%s", "."); fflush (stderr);
53 if (GNUNET_SYSERR == GNUNET_CRYPTO_ecdsa_sign (key, &purp, &sig))
57 "GNUNET_CRYPTO_ecdsa_sign returned SYSERR\n");
62 GNUNET_CRYPTO_ecdsa_verify (GNUNET_SIGNATURE_PURPOSE_TEST, &purp, &sig,
65 printf ("GNUNET_CRYPTO_ecdsa_verify failed!\n");
70 GNUNET_CRYPTO_ecdsa_verify (GNUNET_SIGNATURE_PURPOSE_TRANSPORT_PONG_OWN,
73 printf ("GNUNET_CRYPTO_ecdsa_verify failed to fail!\n");
78 printf ("%d ECDSA sign/verify operations %s\n", ITER,
79 GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (start), GNUNET_YES));
85 testDeriveSignVerify ()
87 struct GNUNET_CRYPTO_EcdsaSignature sig;
88 struct GNUNET_CRYPTO_EccSignaturePurpose purp;
89 struct GNUNET_CRYPTO_EcdsaPrivateKey *dpriv;
90 struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
91 struct GNUNET_CRYPTO_EcdsaPublicKey dpub;
93 dpriv = GNUNET_CRYPTO_ecdsa_private_key_derive (key, "test-derive", "test-CTX");
94 GNUNET_CRYPTO_ecdsa_key_get_public (key, &pkey);
95 GNUNET_CRYPTO_ecdsa_public_key_derive (&pkey, "test-derive", "test-CTX", &dpub);
96 purp.size = htonl (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose));
97 purp.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_TEST);
99 if (GNUNET_SYSERR == GNUNET_CRYPTO_ecdsa_sign (dpriv, &purp, &sig))
101 FPRINTF (stderr, "%s", "GNUNET_CRYPTO_ecdsa_sign returned SYSERR\n");
103 return GNUNET_SYSERR;
106 GNUNET_CRYPTO_ecdsa_verify (GNUNET_SIGNATURE_PURPOSE_TEST,
110 printf ("GNUNET_CRYPTO_ecdsa_verify failed!\n");
112 return GNUNET_SYSERR;
115 GNUNET_CRYPTO_ecdsa_verify (GNUNET_SIGNATURE_PURPOSE_TEST,
119 printf ("GNUNET_CRYPTO_ecdsa_verify failed to fail!\n");
121 return GNUNET_SYSERR;
124 GNUNET_CRYPTO_ecdsa_verify (GNUNET_SIGNATURE_PURPOSE_TRANSPORT_PONG_OWN,
127 printf ("GNUNET_CRYPTO_ecdsa_verify failed to fail!\n");
129 return GNUNET_SYSERR;
138 testSignPerformance ()
140 struct GNUNET_CRYPTO_EccSignaturePurpose purp;
141 struct GNUNET_CRYPTO_EcdsaSignature sig;
142 struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
144 struct GNUNET_TIME_Absolute start;
147 purp.size = htonl (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose));
148 purp.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_TEST);
149 FPRINTF (stderr, "%s", "W");
150 GNUNET_CRYPTO_ecdsa_key_get_public (key, &pkey);
151 start = GNUNET_TIME_absolute_get ();
152 for (i = 0; i < ITER; i++)
154 FPRINTF (stderr, "%s", "."); fflush (stderr);
155 if (GNUNET_SYSERR == GNUNET_CRYPTO_ecdsa_sign (key, &purp, &sig))
157 FPRINTF (stderr, "%s",
158 "GNUNET_CRYPTO_ecdsa_sign returned SYSERR\n");
163 printf ("%d ECC sign operations %s\n", ITER,
164 GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (start),
174 struct GNUNET_TIME_Absolute start;
175 struct GNUNET_CRYPTO_EcdsaPrivateKey *pk;
178 FPRINTF (stderr, "%s", "W");
179 start = GNUNET_TIME_absolute_get ();
182 fprintf (stderr, "."); fflush (stderr);
183 pk = GNUNET_CRYPTO_ecdsa_key_create ();
187 fprintf (stderr, ".");
189 printf ("10 ECDSA keys created in %s\n",
190 GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (start), GNUNET_YES));
195 main (int argc, char *argv[])
197 int failure_count = 0;
199 if (! gcry_check_version ("1.6.0"))
203 ("libgcrypt has not the expected version (version %s is required).\n"),
207 if (getenv ("GNUNET_GCRYPT_DEBUG"))
208 gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1u , 0);
209 GNUNET_log_setup ("test-crypto-ecc", "WARNING", NULL);
210 key = GNUNET_CRYPTO_ecdsa_key_create ();
211 if (GNUNET_OK != testDeriveSignVerify ())
215 "\n\n%d TESTS FAILED!\n\n", failure_count);
219 if (GNUNET_OK != testSignPerformance ())
222 if (GNUNET_OK != testSignVerify ())
227 if (0 != failure_count)
230 "\n\n%d TESTS FAILED!\n\n",
237 /* end of test_crypto_ecdsa.c */