1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <tomcrypt_test.h>
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MDSA
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint dsa_test(void)
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned char msg[16], out[1024], out2[1024];
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long x, y;
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int stat1, stat2;
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   dsa_key key, key2;
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* make a random key */
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   DO(dsa_make_key(&yarrow_prng, find_prng("yarrow"), 20, 128, &key));
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* verify it */
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   DO(dsa_verify_key(&key, &stat1));
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (stat1 == 0) { fprintf(stderr, "dsa_verify_key "); return 1; }
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* encrypt a message */
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < 16; x++) { msg[x] = x; }
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   x = sizeof(out);
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   DO(dsa_encrypt_key(msg, 16, out, &x, &yarrow_prng, find_prng("yarrow"), find_hash("sha1"), &key));
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* decrypt */
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   y = sizeof(out2);
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   DO(dsa_decrypt_key(out, x, out2, &y, &key));
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (y != 16 || memcmp(out2, msg, 16)) {
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      fprintf(stderr, "dsa_decrypt failed, y == %lu\n", y);
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return 1;
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* sign the message */
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   x = sizeof(out);
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   DO(dsa_sign_hash(msg, sizeof(msg), out, &x, &yarrow_prng, find_prng("yarrow"), &key));
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* verify it once */
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   DO(dsa_verify_hash(out, x, msg, sizeof(msg), &stat1, &key));
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* Modify and verify again */
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   msg[0] ^= 1;
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   DO(dsa_verify_hash(out, x, msg, sizeof(msg), &stat2, &key));
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   msg[0] ^= 1;
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (!(stat1 == 1 && stat2 == 0)) { fprintf(stderr, "dsa_verify %d %d", stat1, stat2); return 1; }
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* test exporting it */
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   x = sizeof(out2);
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   DO(dsa_export(out2, &x, PK_PRIVATE, &key));
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   DO(dsa_import(out2, x, &key2));
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* verify a signature with it */
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   DO(dsa_verify_hash(out, x, msg, sizeof(msg), &stat1, &key2));
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (stat1 == 0) { fprintf(stderr, "dsa_verify (import private) %d ", stat1); return 1; }
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   dsa_free(&key2);
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* export as public now */
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   x = sizeof(out2);
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   DO(dsa_export(out2, &x, PK_PUBLIC, &key));
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   DO(dsa_import(out2, x, &key2));
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* verify a signature with it */
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   DO(dsa_verify_hash(out, x, msg, sizeof(msg), &stat1, &key2));
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (stat1 == 0) { fprintf(stderr, "dsa_verify (import public) %d ", stat1); return 1; }
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   dsa_free(&key2);
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   dsa_free(&key);
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return 0;
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint dsa_test(void)
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  fprintf(stderr, "NOP");
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  return 0;
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/testprof/dsa_test.c,v $ */
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.9 $ */
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2005/10/30 18:49:14 $ */
83