summaryrefslogtreecommitdiff
path: root/set6/task45.c
blob: ab6964ac6733485e375615bcb0ee7d2e95bf8ed7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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));
}