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