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));
}
|