]> de.git.xonotic.org Git - xonotic/d0_blind_id.git/blob - main.c
license: LGPL 2.1
[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
26 void bench(double *b)
27 {
28         static struct timespec thistime, lasttime;
29         static double x = 0;
30         static double *lastclock = &x;
31         lasttime = thistime;
32         clock_gettime(CLOCK_MONOTONIC, &thistime);
33         *lastclock += (thistime.tv_sec - lasttime.tv_sec) + 0.000000001 * (thistime.tv_nsec - lasttime.tv_nsec);
34         lastclock = b;
35 }
36
37 #include <sys/signal.h>
38 volatile BOOL quit = 0;
39 void mysignal(int signo)
40 {
41         (void) signo;
42         quit = 1;
43 }
44
45 #include <err.h>
46 int main(int argc, char **argv)
47 {
48         char buf[65536]; size_t bufsize;
49         char buf2[65536]; size_t buf2size; ssize_t buf2ssize;
50         d0_blind_id_t *ctx_self, *ctx_other;
51
52         d0_blind_id_INITIALIZE();
53         ctx_self = d0_blind_id_new();
54         ctx_other = d0_blind_id_new();
55
56         if(!d0_blind_id_generate_private_keys(ctx_self, 1024))
57                 errx(1, "keygen fail");
58         bufsize = sizeof(buf); if(!d0_blind_id_write_public_keys(ctx_self, buf, &bufsize))
59                 errx(2, "writepub fail");
60         if(!d0_blind_id_read_public_keys(ctx_other, buf, bufsize))
61                 errx(3, "readpub fail");
62
63         signal(SIGINT, mysignal);
64
65         int n = 0;
66         double bench_gen = 0, bench_fp = 0, bench_stop = 0;
67         do
68         {
69                 bench(&bench_gen);
70                 bufsize = sizeof(buf); if(!d0_blind_id_generate_private_id_start(ctx_other))
71                         errx(4, "genid fail");
72                 bench(&bench_fp);
73                 buf2size = sizeof(buf2) - 1; if(!d0_blind_id_fingerprint64_public_id(ctx_other, buf2, &buf2size))
74                         errx(4, "fp64 fail");
75                 bench(&bench_stop);
76                 if(n % 1024 == 0)
77                         printf("gen=%f fp=%f\n", n/bench_gen, n/bench_fp);
78                 ++n;
79         }
80         while(!(quit || argc != 2 || (buf2size > strlen(argv[1]) && !memcmp(buf2, argv[1], strlen(argv[1])))));
81
82         buf2[buf2size] = 0;
83         printf("Generated key has ID: %s\n", buf2);
84
85         bufsize = sizeof(buf); if(!d0_blind_id_generate_private_id_request(ctx_other, buf, &bufsize))
86                 errx(4, "genreq fail");
87         buf2size = sizeof(buf2); if(!d0_blind_id_answer_private_id_request(ctx_self, buf, bufsize, buf2, &buf2size))
88                 errx(5, "ansreq fail");
89         if(!d0_blind_id_finish_private_id_request(ctx_other, buf2, buf2size))
90                 errx(6, "finishreq fail");
91
92         bufsize = sizeof(buf); if(!d0_blind_id_write_public_id(ctx_other, buf, &bufsize))
93                 errx(7, "writepub2 fail");
94         if(!d0_blind_id_read_public_id(ctx_self, buf, bufsize))
95                 errx(8, "readpub2 fail");
96
97         n = 0;
98         double bench_auth = 0, bench_chall = 0, bench_resp = 0, bench_verify = 0;
99         while(!quit)
100         {
101                 bench(&bench_auth);
102                 bufsize = sizeof(buf); if(!d0_blind_id_authenticate_with_private_id_start(ctx_other, 1, "hello world", 11, buf, &bufsize))
103                         errx(9, "start fail");
104                 bench(&bench_chall);
105                 buf2size = sizeof(buf2); if(!d0_blind_id_authenticate_with_private_id_challenge(ctx_self, 1, buf, bufsize, buf2, &buf2size))
106                         errx(10, "challenge fail");
107                 bench(&bench_resp);
108                 bufsize = sizeof(buf); if(!d0_blind_id_authenticate_with_private_id_response(ctx_other, buf2, buf2size, buf, &bufsize))
109                         errx(11, "response fail");
110                 bench(&bench_verify);
111                 buf2ssize = sizeof(buf2); if(!d0_blind_id_authenticate_with_private_id_verify(ctx_self, buf, bufsize, buf2, &buf2ssize))
112                         errx(12, "verify fail");
113                 if(buf2ssize != 11 || memcmp(buf2, "hello world", 11))
114                         errx(13, "hello fail");
115                 bench(&bench_stop);
116                 ++n;
117                 if(n % 1024 == 0)
118                         printf("auth=%f chall=%f resp=%f verify=%f\n", n/bench_auth, n/bench_chall, n/bench_resp, n/bench_verify);
119         }
120
121         return 0;
122 }