summaryrefslogtreecommitdiff
path: root/set6/task45.c
diff options
context:
space:
mode:
authorBenedict <benedict@0xb8000.de>2016-12-18 17:31:32 +0100
committerBenedict <benedict@0xb8000.de>2017-02-21 13:00:26 +0100
commit7e8ed345e50edd4253d9c409c10650b08a39fa87 (patch)
tree4c2bb0d14366f28b2e67d1d6364c41803d29f21c /set6/task45.c
parenta5b4baa713ed4ffeca70573193ecbc3c0d7421a4 (diff)
set6: challenge 45: completed
Diffstat (limited to 'set6/task45.c')
-rw-r--r--set6/task45.c105
1 files changed, 105 insertions, 0 deletions
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 <openssl/sha.h>
+
+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));
+}