#include "../lib/lib.h" #include "../lib/lib2.h" #include "../lib/lib4.h" #include "../lib/lib5.h" #include "../lib/lib6.h" #include int main() { struct dsa_public_params dsa_pub; struct dsa_per_user_param dsa_user; struct dsa_per_user_param dsa_user2; char *message = "Hello World"; char *message2 = "Goodbye World"; BIGNUM *k = BN_new(); dsa_user.public = BN_new(); dsa_user.private = BN_new(); dsa_user.r = BN_new(); dsa_user.s = BN_new(); dsa_user2.public = BN_new(); dsa_user2.private = BN_new(); dsa_user2.r = BN_new(); dsa_user2.s = BN_new(); out = BIO_new(BIO_s_file()); BIO_set_fp(out, stdout, BIO_NOCLOSE); ctx = BN_CTX_new(); init_dsa_pub_param(&dsa_pub); dsa_compute_per_user_keys(&dsa_pub, &dsa_user); dsa_compute_per_user_keys(&dsa_pub, &dsa_user2); // set the pub params BN_zero(dsa_pub.g); printf("with g = 0\n"); BN_zero(k); dsa_sign(message, &dsa_pub, &dsa_user, k); printf("signature is:\n"); printf("r: "); BN_print(out, dsa_user.r); printf("\ns: "); BN_print(out, dsa_user.s); printf("\nverified?: %i\n", !dsa_verify(message, &dsa_pub, &dsa_user)); printf("checking signature for message which hasn't been signed\n"); printf("verified?: %i\n", !dsa_verify(message2, &dsa_pub, &dsa_user)); // for goodybye printf("sign message %s\n", message2); BN_zero(k); dsa_sign(message2, &dsa_pub, &dsa_user, k); printf("signature is:\n"); printf("r: "); BN_print(out, dsa_user.r); printf("\ns: "); BN_print(out, dsa_user.s); printf("\nverified?: %i\n", !dsa_verify(message2, &dsa_pub, &dsa_user)); printf("checking signature for message which hasn't been signed\n"); printf("verified?: %i\n", !dsa_verify(message, &dsa_pub, &dsa_user)); // set g to p+1 BIGNUM *tmp = BN_new(); BIGNUM *one = BN_new(); BN_set_word(one, 1); BN_add(tmp, dsa_pub.p, one); BN_copy(dsa_pub.g, tmp); BN_zero(dsa_user.r); BN_zero(dsa_user.s); printf("\nmaking magic signature for g = p + 1...\n"); // Generate hash of abitrary string char hash[20]; BIGNUM *hash_bn = BN_new(); SHA_CTX sha1; SHA1_Init(&sha1); SHA1_Update(&sha1, message, strlen(message)); SHA1_Final(hash, &sha1); BN_bin2bn(hash, 20, hash_bn); dsa_generate_magic_signature(&dsa_pub, &dsa_user, hash_bn); printf("signature is:\n"); printf("r: "); BN_print(out, dsa_user.r); printf("\ns: "); BN_print(out, dsa_user.s); printf("\nverified?: %i\n", !dsa_verify(message, &dsa_pub, &dsa_user)); printf("checking signature for message which hasn't been signed\n"); printf("verified?: %i\n", !dsa_verify(message2, &dsa_pub, &dsa_user)); // generate a signature for second message SHA1_Init(&sha1); SHA1_Update(&sha1, message2, strlen(message2)); SHA1_Final(hash, &sha1); BN_bin2bn(hash, 20, hash_bn); dsa_generate_magic_signature(&dsa_pub, &dsa_user, hash_bn); printf("signature is:\n"); printf("r: "); BN_print(out, dsa_user.r); printf("\ns: "); BN_print(out, dsa_user.s); printf("\nverified?: %i\n", !dsa_verify(message2, &dsa_pub, &dsa_user)); printf("checking signature for message which hasn't been signed\n"); printf("verified?: %i\n", !dsa_verify(message, &dsa_pub, &dsa_user)); }