Added SILC Thread Queue API
[silc.git] / lib / silccrypt / tests / test_dsa.c
1 #include "silc.h"
2 #include "dsa.h"
3
4 unsigned char *signature = NULL;
5 SilcUInt32 signature_len;
6 SilcBool success = FALSE;
7
8 static void sign_cb(SilcBool success, const unsigned char *sig,
9                     SilcUInt32 sig_len, void *context)
10 {
11   SILC_LOG_HEXDUMP(("Signature"), sig, sig_len);
12   signature = silc_memdup(sig, sig_len);
13   signature_len = sig_len;
14 }
15
16 static void verify_cb(SilcBool s, void *context)
17 {
18   SILC_LOG_DEBUG(("Verify %s", s ? "success" : "failed"));
19   success = s;
20 }
21
22 int main(int argc, char **argv)
23 {
24   const SilcPKCSAlgorithm *alg;
25   SilcRng rng;
26   void *public_key, *private_key;
27   SilcHash hash;
28   unsigned char tmp[20];
29
30   if (argc > 1 && !strcmp(argv[1], "-d")) {
31     silc_log_debug(TRUE);
32     silc_log_debug_hexdump(TRUE);
33     silc_log_set_debug_string("*dsa*,*pkcs*");
34   }
35
36   silc_crypto_init(NULL);
37
38   rng = silc_rng_alloc();
39   silc_rng_init(rng);
40   silc_hash_alloc("sha1", &hash);
41
42   SILC_LOG_DEBUG(("Generate DSA keypair"));
43   alg = silc_pkcs_find_algorithm("dsa", "dss");
44   if (!silc_dsa_generate_key(alg, 2048, rng, &public_key, &private_key))
45     goto err;
46
47   SILC_LOG_DEBUG(("Key length: %d",
48                   silc_dsa_public_key_bitlen(alg, public_key)));
49
50   SILC_LOG_DEBUG(("Sign"));
51   memset(tmp, 0, sizeof(tmp));
52   silc_dsa_sign(alg, private_key, tmp, sizeof(tmp), TRUE, hash, rng,
53                 sign_cb, NULL);
54
55   SILC_LOG_DEBUG(("Verify"));
56   silc_dsa_verify(alg, public_key, signature, signature_len,
57                   tmp, sizeof(tmp), hash, rng, verify_cb, NULL);
58
59   silc_rng_free(rng);
60   silc_free(signature);
61
62  err:
63   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
64   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
65
66   return success;
67 }