--- /dev/null
+#include "silc.h"
+#include "dsa.h"
+
+unsigned char *signature = NULL;
+SilcUInt32 signature_len;
+SilcBool success = FALSE;
+
+static void sign_cb(SilcBool success, const unsigned char *sig,
+ SilcUInt32 sig_len, void *context)
+{
+ SILC_LOG_HEXDUMP(("Signature"), sig, sig_len);
+ signature = silc_memdup(sig, sig_len);
+ signature_len = sig_len;
+}
+
+static void verify_cb(SilcBool s, void *context)
+{
+ SILC_LOG_DEBUG(("Verify %s", s ? "success" : "failed"));
+ success = s;
+}
+
+int main(int argc, char **argv)
+{
+ const SilcPKCSAlgorithm *alg;
+ SilcRng rng;
+ void *public_key, *private_key;
+ SilcHash hash;
+ unsigned char tmp[20];
+
+ if (argc > 1 && !strcmp(argv[1], "-d")) {
+ silc_log_debug(TRUE);
+ silc_log_debug_hexdump(TRUE);
+ silc_log_set_debug_string("*dsa*,*pkcs*");
+ }
+
+ silc_crypto_init(NULL);
+
+ rng = silc_rng_alloc();
+ silc_rng_init(rng);
+ silc_hash_alloc("sha1", &hash);
+
+ SILC_LOG_DEBUG(("Generate DSA keypair"));
+ alg = silc_pkcs_find_algorithm("dsa", "dss");
+ if (!silc_dsa_generate_key(alg, 2048, rng, &public_key, &private_key))
+ goto err;
+
+ SILC_LOG_DEBUG(("Key length: %d",
+ silc_dsa_public_key_bitlen(alg, public_key)));
+
+ SILC_LOG_DEBUG(("Sign"));
+ memset(tmp, 0, sizeof(tmp));
+ silc_dsa_sign(alg, private_key, tmp, sizeof(tmp), TRUE, hash, rng,
+ sign_cb, NULL);
+
+ SILC_LOG_DEBUG(("Verify"));
+ silc_dsa_verify(alg, public_key, signature, signature_len,
+ tmp, sizeof(tmp), hash, rng, verify_cb, NULL);
+
+ silc_rng_free(rng);
+ silc_free(signature);
+
+ err:
+ SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
+ fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
+
+ return success;
+}