From 7e8ed345e50edd4253d9c409c10650b08a39fa87 Mon Sep 17 00:00:00 2001 From: Benedict Date: Sun, 18 Dec 2016 17:31:32 +0100 Subject: set6: challenge 45: completed --- set6/task45.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 set6/task45.c (limited to 'set6/task45.c') diff --git a/set6/task45.c b/set6/task45.c new file mode 100644 index 0000000..ab6964a --- /dev/null +++ b/set6/task45.c @@ -0,0 +1,105 @@ +#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)); +} -- cgit v1.2.3-70-g09d2