win32 build fixes
[xonotic/d0_blind_id.git] / main.c
1 /*
2 Blind-ID library for user identification using RSA blind signatures
3 Copyright (C) 2010  Rudolf Polzer
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18 */
19
20 #include "d0_blind_id.h"
21
22 #include <stdio.h>
23 #include <string.h>
24 #include <time.h>
25 #include <sys/time.h>
26
27 void bench(double *b)
28 {
29         static struct timeval thistime, lasttime;
30         static double x = 0;
31         static double *lastclock = &x;
32         lasttime = thistime;
33         gettimeofday(&thistime, NULL);
34         *lastclock += (thistime.tv_sec - lasttime.tv_sec) + 0.000001 * (thistime.tv_usec - lasttime.tv_usec);
35         lastclock = b;
36 }
37
38 #ifndef WIN32
39 #include <sys/signal.h>
40 #endif
41 volatile BOOL quit = 0;
42 void mysignal(int signo)
43 {
44         (void) signo;
45         quit = 1;
46 }
47
48 #include <stdarg.h>
49 #include <stdlib.h>
50 static void errx(int status, const char *format, ...)
51 {
52         va_list ap;
53         va_start(ap, format);
54         vfprintf(stderr, format, ap);
55         exit(status);
56 }
57
58 int main(int argc, char **argv)
59 {
60         char buf[65536]; size_t bufsize;
61         char buf2[65536]; size_t buf2size;
62         d0_blind_id_t *ctx_self, *ctx_other;
63
64         d0_blind_id_INITIALIZE();
65         ctx_self = d0_blind_id_new();
66         ctx_other = d0_blind_id_new();
67
68         printf("keygen RSA...\n");
69         if(!d0_blind_id_generate_private_key(ctx_self, 1024))
70                 errx(1, "keygen fail");
71         buf2size = sizeof(buf2) - 1;
72         if(!d0_blind_id_fingerprint64_public_key(ctx_self, buf2, &buf2size))
73                 errx(2, "fp64 fail");
74         printf("key has fingerprint %s\n", buf2);
75         bufsize = sizeof(buf); if(!d0_blind_id_write_public_key(ctx_self, buf, &bufsize))
76                 errx(2, "writepub fail");
77         if(!d0_blind_id_read_public_key(ctx_other, buf, bufsize))
78                 errx(3, "readpub fail");
79
80         printf("keygen modulus...\n");
81         if(!d0_blind_id_generate_private_id_modulus(ctx_other))
82                 errx(1, "keygen fail");
83         /*
84         bufsize = sizeof(buf); if(!d0_blind_id_write_private_id_modulus(ctx_other, buf, &bufsize))
85                 errx(2, "writepub fail");
86         if(!d0_blind_id_read_private_id_modulus(ctx_self, buf, bufsize))
87                 errx(3, "readpub fail");
88         */
89
90 #ifndef WIN32
91         signal(SIGINT, mysignal);
92 #endif
93
94         int n = 0;
95         double bench_gen = 0, bench_fp = 0, bench_stop = 0;
96         do
97         {
98                 bench(&bench_gen);
99                 bufsize = sizeof(buf); if(!d0_blind_id_generate_private_id_start(ctx_other))
100                         errx(4, "genid fail");
101                 bench(&bench_fp);
102                 buf2size = sizeof(buf2) - 1; if(!d0_blind_id_fingerprint64_public_id(ctx_other, buf2, &buf2size))
103                         errx(4, "fp64 fail");
104                 bench(&bench_stop);
105                 if(n % 1024 == 0)
106                         printf("gen=%f fp=%f\n", n/bench_gen, n/bench_fp);
107                 ++n;
108         }
109         while(!(quit || argc != 2 || (buf2size > strlen(argv[1]) && !memcmp(buf2, argv[1], strlen(argv[1])))));
110
111         buf2[buf2size] = 0;
112         printf("Generated key has ID: %s\n", buf2);
113
114         bufsize = sizeof(buf); if(!d0_blind_id_generate_private_id_request(ctx_other, buf, &bufsize))
115                 errx(4, "genreq fail");
116         buf2size = sizeof(buf2); if(!d0_blind_id_answer_private_id_request(ctx_self, buf, bufsize, buf2, &buf2size))
117                 errx(5, "ansreq fail");
118         if(!d0_blind_id_finish_private_id_request(ctx_other, buf2, buf2size))
119                 errx(6, "finishreq fail");
120
121         bufsize = sizeof(buf); if(!d0_blind_id_write_public_id(ctx_other, buf, &bufsize))
122                 errx(7, "writepub2 fail");
123         if(!d0_blind_id_read_public_id(ctx_self, buf, bufsize))
124                 errx(8, "readpub2 fail");
125
126         n = 0;
127         double bench_auth = 0, bench_chall = 0, bench_resp = 0, bench_verify = 0, bench_dhkey1 = 0, bench_dhkey2 = 0;
128         BOOL status;
129         while(!quit)
130         {
131                 bench(&bench_auth);
132                 bufsize = sizeof(buf); if(!d0_blind_id_authenticate_with_private_id_start(ctx_other, 1, 1, "hello world", 11, buf, &bufsize))
133                         errx(9, "start fail");
134                 bench(&bench_chall);
135                 buf2size = sizeof(buf2); if(!d0_blind_id_authenticate_with_private_id_challenge(ctx_self, 1, 1, buf, bufsize, buf2, &buf2size, &status))
136                         errx(10, "challenge fail");
137                 if(!status)
138                         errx(14, "signature prefail");
139                 bench(&bench_resp);
140                 bufsize = sizeof(buf); if(!d0_blind_id_authenticate_with_private_id_response(ctx_other, buf2, buf2size, buf, &bufsize))
141                         errx(11, "response fail");
142                 bench(&bench_verify);
143                 buf2size = sizeof(buf2); if(!d0_blind_id_authenticate_with_private_id_verify(ctx_self, buf, bufsize, buf2, &buf2size, &status))
144                         errx(12, "verify fail");
145                 if(buf2size != 11 || memcmp(buf2, "hello world", 11))
146                         errx(13, "hello fail");
147                 if(!status)
148                         errx(14, "signature fail");
149                 bench(&bench_dhkey1);
150                 bufsize = 20; if(!d0_blind_id_sessionkey_public_id(ctx_self, buf, &bufsize))
151                         errx(15, "dhkey1 fail");
152                 bench(&bench_dhkey2);
153                 buf2size = 20; if(!d0_blind_id_sessionkey_public_id(ctx_other, buf2, &buf2size))
154                         errx(16, "dhkey2 fail");
155                 bench(&bench_stop);
156                 if(bufsize != buf2size || memcmp(buf, buf2, bufsize))
157                         errx(17, "dhkey match fail");
158                 ++n;
159                 if(n % 1024 == 0)
160                         printf("auth=%f chall=%f resp=%f verify=%f dh1=%f dh2=%f\n", n/bench_auth, n/bench_chall, n/bench_resp, n/bench_verify, n/bench_dhkey1, n/bench_dhkey2);
161         }
162
163         return 0;
164 }