2 Blind-ID library for user identification using RSA blind signatures
3 Copyright (C) 2010 Rudolf Polzer
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.
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.
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
20 #include "d0_blind_id.h"
29 static struct timeval thistime, lasttime;
31 static double *lastclock = &x;
33 gettimeofday(&thistime, NULL);
34 *lastclock += (thistime.tv_sec - lasttime.tv_sec) + 0.000001 * (thistime.tv_usec - lasttime.tv_usec);
39 #include <sys/signal.h>
41 volatile BOOL quit = 0;
42 void mysignal(int signo)
50 static void errx(int status, const char *format, ...)
54 vfprintf(stderr, format, ap);
59 int main(int argc, char **argv)
61 char buf[65536]; size_t bufsize;
62 char buf2[65536]; size_t buf2size;
63 d0_blind_id_t *ctx_self, *ctx_other;
65 d0_blind_id_INITIALIZE();
66 ctx_self = d0_blind_id_new();
67 ctx_other = d0_blind_id_new();
69 printf("keygen RSA...\n");
70 if(!d0_blind_id_generate_private_key(ctx_self, 256))
71 errx(1, "keygen fail");
72 buf2size = sizeof(buf2) - 1;
73 if(!d0_blind_id_fingerprint64_public_key(ctx_self, buf2, &buf2size))
75 printf("key has fingerprint %s\n", buf2);
76 bufsize = sizeof(buf); if(!d0_blind_id_write_public_key(ctx_self, buf, &bufsize))
77 errx(2, "writepub fail");
78 if(!d0_blind_id_read_public_key(ctx_other, buf, bufsize))
79 errx(3, "readpub fail");
81 printf("keygen modulus...\n");
82 if(!d0_blind_id_generate_private_id_modulus(ctx_other))
83 errx(1, "keygen fail");
85 bufsize = sizeof(buf); if(!d0_blind_id_write_private_id_modulus(ctx_other, buf, &bufsize))
86 errx(2, "writepub fail");
87 if(!d0_blind_id_read_private_id_modulus(ctx_self, buf, bufsize))
88 errx(3, "readpub fail");
92 signal(SIGINT, mysignal);
96 double bench_gen = 0, bench_fp = 0, bench_stop = 0;
100 bufsize = sizeof(buf); if(!d0_blind_id_generate_private_id_start(ctx_other))
101 errx(4, "genid fail");
103 buf2size = sizeof(buf2) - 1; if(!d0_blind_id_fingerprint64_public_id(ctx_other, buf2, &buf2size))
104 errx(4, "fp64 fail");
107 printf("gen=%f fp=%f\n", n/bench_gen, n/bench_fp);
110 while(!(quit || argc != 2 || (buf2size > strlen(argv[1]) && !memcmp(buf2, argv[1], strlen(argv[1])))));
113 printf("Generated key has ID: %s\n", buf2);
115 bufsize = sizeof(buf); if(!d0_blind_id_generate_private_id_request(ctx_other, buf, &bufsize))
116 errx(4, "genreq fail");
117 buf2size = sizeof(buf2); if(!d0_blind_id_answer_private_id_request(ctx_self, buf, bufsize, buf2, &buf2size))
118 errx(5, "ansreq fail");
119 if(!d0_blind_id_finish_private_id_request(ctx_other, buf2, buf2size))
120 errx(6, "finishreq fail");
122 bufsize = sizeof(buf); if(!d0_blind_id_write_public_id(ctx_other, buf, &bufsize))
123 errx(7, "writepub2 fail");
124 if(!d0_blind_id_read_public_id(ctx_self, buf, bufsize))
125 errx(8, "readpub2 fail");
128 double bench_auth = 0, bench_chall = 0, bench_resp = 0, bench_verify = 0, bench_dhkey1 = 0, bench_dhkey2 = 0;
133 bufsize = sizeof(buf); if(!d0_blind_id_authenticate_with_private_id_start(ctx_other, 1, 1, "hello world", 11, buf, &bufsize))
134 errx(9, "start fail");
136 buf2size = sizeof(buf2); if(!d0_blind_id_authenticate_with_private_id_challenge(ctx_self, 1, 1, buf, bufsize, buf2, &buf2size, &status))
137 errx(10, "challenge fail");
139 errx(14, "signature prefail");
141 bufsize = sizeof(buf); if(!d0_blind_id_authenticate_with_private_id_response(ctx_other, buf2, buf2size, buf, &bufsize))
142 errx(11, "response fail");
143 bench(&bench_verify);
144 buf2size = sizeof(buf2); if(!d0_blind_id_authenticate_with_private_id_verify(ctx_self, buf, bufsize, buf2, &buf2size, &status))
145 errx(12, "verify fail");
146 if(buf2size != 11 || memcmp(buf2, "hello world", 11))
147 errx(13, "hello fail");
149 errx(14, "signature fail");
150 bench(&bench_dhkey1);
151 bufsize = 20; if(!d0_blind_id_sessionkey_public_id(ctx_self, buf, &bufsize))
152 errx(15, "dhkey1 fail");
153 bench(&bench_dhkey2);
154 buf2size = 20; if(!d0_blind_id_sessionkey_public_id(ctx_other, buf2, &buf2size))
155 errx(16, "dhkey2 fail");
157 if(bufsize != buf2size || memcmp(buf, buf2, bufsize))
158 errx(17, "dhkey match fail");
161 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);