Added DSA.
[silc.git] / lib / silccrypt / tests / test_dsa.c
diff --git a/lib/silccrypt/tests/test_dsa.c b/lib/silccrypt/tests/test_dsa.c
new file mode 100644 (file)
index 0000000..d09a9d4
--- /dev/null
@@ -0,0 +1,67 @@
+#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;
+}