main.c: missing va_end(ap).
[xonotic/d0_blind_id.git] / main.c
1 /*
2  * FILE:        d0_iobuf.c
3  * AUTHOR:      Rudolf Polzer - divVerent@xonotic.org
4  * 
5  * Copyright (c) 2010, Rudolf Polzer
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the copyright holder nor the names of contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  * 
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  *
32  * $Format:commit %H$
33  * $Id$
34  */
35
36 #include "d0_blind_id.h"
37
38 #include <stdio.h>
39 #include <string.h>
40 #include <time.h>
41 #include <sys/time.h>
42
43 void bench(double *b)
44 {
45         static struct timeval thistime, lasttime;
46         static double x = 0;
47         static double *lastclock = &x;
48         lasttime = thistime;
49         gettimeofday(&thistime, NULL);
50         *lastclock += (thistime.tv_sec - lasttime.tv_sec) + 0.000001 * (thistime.tv_usec - lasttime.tv_usec);
51         lastclock = b;
52 }
53
54 #ifndef WIN32
55 #include <sys/signal.h>
56 #endif
57 volatile D0_BOOL quit = 0;
58 void mysignal(int signo)
59 {
60         (void) signo;
61         quit = 1;
62 }
63
64 #include <stdarg.h>
65 #include <stdlib.h>
66 static void errx(int status, const char *format, ...)
67 {
68         va_list ap;
69         va_start(ap, format);
70         vfprintf(stderr, format, ap);
71         va_end(ap);
72         fputs("\n", stderr);
73         exit(status);
74 }
75
76 int main(int argc, char **argv)
77 {
78         char buf[65536]; size_t bufsize;
79         char buf2[65536]; size_t buf2size;
80         d0_blind_id_t *ctx_self, *ctx_other;
81
82         d0_blind_id_INITIALIZE();
83         ctx_self = d0_blind_id_new();
84         ctx_other = d0_blind_id_new();
85
86         printf("keygen RSA...\n");
87         if(!d0_blind_id_generate_private_key(ctx_self, 1024))
88                 errx(1, "keygen fail");
89         buf2size = sizeof(buf2) - 1;
90         if(!d0_blind_id_fingerprint64_public_key(ctx_self, buf2, &buf2size))
91                 errx(2, "fp64 fail");
92         printf("key has fingerprint %s\n", buf2);
93         bufsize = sizeof(buf); if(!d0_blind_id_write_public_key(ctx_self, buf, &bufsize))
94                 errx(2, "writepub fail");
95         if(!d0_blind_id_read_public_key(ctx_other, buf, bufsize))
96                 errx(3, "readpub fail");
97
98         printf("keygen modulus...\n");
99         if(!d0_blind_id_generate_private_id_modulus(ctx_other))
100                 errx(1, "keygen fail");
101         /*
102         bufsize = sizeof(buf); if(!d0_blind_id_write_private_id_modulus(ctx_other, buf, &bufsize))
103                 errx(2, "writepub fail");
104         if(!d0_blind_id_read_private_id_modulus(ctx_self, buf, bufsize))
105                 errx(3, "readpub fail");
106         */
107
108 #ifndef WIN32
109         signal(SIGINT, mysignal);
110 #endif
111
112         int n = 0;
113         double bench_gen = 0, bench_fp = 0, bench_stop = 0;
114         do
115         {
116                 bench(&bench_gen);
117                 bufsize = sizeof(buf); if(!d0_blind_id_generate_private_id_start(ctx_other))
118                         errx(4, "genid fail");
119                 bench(&bench_fp);
120                 buf2size = sizeof(buf2) - 1; if(!d0_blind_id_fingerprint64_public_id(ctx_other, buf2, &buf2size))
121                         errx(4, "fp64 fail");
122                 bench(&bench_stop);
123                 ++n;
124                 if(n % 1024 == 0)
125                         printf("gen=%f fp=%f\n", n/bench_gen, n/bench_fp);
126         }
127         while(!(quit || argc != 2 || (buf2size > strlen(argv[1]) && !memcmp(buf2, argv[1], strlen(argv[1])))));
128
129         buf2[buf2size] = 0;
130         printf("Generated key has ID: %s\n", buf2);
131
132         bufsize = sizeof(buf); if(!d0_blind_id_generate_private_id_request(ctx_other, buf, &bufsize))
133                 errx(4, "genreq fail");
134         buf2size = sizeof(buf2); if(!d0_blind_id_answer_private_id_request(ctx_self, buf, bufsize, buf2, &buf2size))
135                 errx(5, "ansreq fail");
136         if(!d0_blind_id_finish_private_id_request(ctx_other, buf2, buf2size))
137                 errx(6, "finishreq fail");
138
139         bufsize = sizeof(buf); if(!d0_blind_id_write_public_id(ctx_other, buf, &bufsize))
140                 errx(7, "writepub2 fail");
141         if(!d0_blind_id_read_public_id(ctx_self, buf, bufsize))
142                 errx(8, "readpub2 fail");
143
144         n = 0;
145         double bench_auth = 0, bench_chall = 0, bench_resp = 0, bench_verify = 0, bench_dhkey1 = 0, bench_dhkey2 = 0, bench_sign = 0, bench_signverify = 0;
146         D0_BOOL status;
147         while(!quit)
148         {
149                 bench(&bench_sign);
150                 bufsize = sizeof(buf); if(!d0_blind_id_sign_with_private_id_sign(ctx_other, 1, 1, "hello world", 11, buf, &bufsize))
151                         errx(9, "sign fail");
152                 bench(&bench_signverify);
153                 buf2size = sizeof(buf2); if(!d0_blind_id_sign_with_private_id_verify(ctx_self, 1, 1, buf, bufsize, buf2, &buf2size, &status))
154                         errx(9, "signverify fail");
155                 bench(&bench_stop);
156                 if(buf2size != 11 || memcmp(buf2, "hello world", 11))
157                         errx(13, "signhello fail");
158                 if(!status)
159                         errx(14, "signsignature fail");
160                 bench(&bench_auth);
161                 bufsize = sizeof(buf); if(!d0_blind_id_authenticate_with_private_id_start(ctx_other, 1, 1, "hello world", 11, buf, &bufsize))
162                         errx(9, "start fail");
163                 bench(&bench_chall);
164                 buf2size = sizeof(buf2); if(!d0_blind_id_authenticate_with_private_id_challenge(ctx_self, 1, 1, buf, bufsize, buf2, &buf2size, &status))
165                         errx(10, "challenge fail");
166                 if(!status)
167                         errx(14, "signature prefail");
168                 bench(&bench_resp);
169                 bufsize = sizeof(buf); if(!d0_blind_id_authenticate_with_private_id_response(ctx_other, buf2, buf2size, buf, &bufsize))
170                         errx(11, "response fail");
171                 bench(&bench_verify);
172                 buf2size = sizeof(buf2); if(!d0_blind_id_authenticate_with_private_id_verify(ctx_self, buf, bufsize, buf2, &buf2size, &status))
173                         errx(12, "verify fail");
174                 if(buf2size != 11 || memcmp(buf2, "hello world", 11))
175                         errx(13, "hello fail");
176                 if(!status)
177                         errx(14, "signature fail");
178                 bench(&bench_dhkey1);
179                 bufsize = 20; if(!d0_blind_id_sessionkey_public_id(ctx_self, buf, &bufsize))
180                         errx(15, "dhkey1 fail");
181                 bench(&bench_dhkey2);
182                 buf2size = 20; if(!d0_blind_id_sessionkey_public_id(ctx_other, buf2, &buf2size))
183                         errx(16, "dhkey2 fail");
184                 bench(&bench_stop);
185                 if(bufsize != buf2size || memcmp(buf, buf2, bufsize))
186                         errx(17, "dhkey match fail");
187                 ++n;
188                 if(n % 1024 == 0)
189                         printf("sign=%f signverify=%f auth=%f chall=%f resp=%f verify=%f dh1=%f dh2=%f\n", n/bench_sign, n/bench_signverify, n/bench_auth, n/bench_chall, n/bench_resp, n/bench_verify, n/bench_dhkey1, n/bench_dhkey2);
190         }
191
192         return 0;
193 }