]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bearssl/tools/server.c
Add libbearssl
[FreeBSD/FreeBSD.git] / contrib / bearssl / tools / server.c
1 /*
2  * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining 
5  * a copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sublicense, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be 
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
18  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <stdint.h>
29 #include <errno.h>
30 #include <signal.h>
31
32 #ifdef _WIN32
33 #include <winsock2.h>
34 #include <ws2tcpip.h>
35 #else
36 #include <sys/types.h>
37 #include <sys/socket.h>
38 #include <netdb.h>
39 #include <netinet/in.h>
40 #include <arpa/inet.h>
41 #include <unistd.h>
42 #include <fcntl.h>
43
44 #define SOCKET             int
45 #define INVALID_SOCKET     (-1)
46 #define SOCKADDR_STORAGE   struct sockaddr_storage
47 #endif
48
49 #include "brssl.h"
50
51 static SOCKET
52 host_bind(const char *host, const char *port, int verbose)
53 {
54         struct addrinfo hints, *si, *p;
55         SOCKET fd;
56         int err;
57
58         memset(&hints, 0, sizeof hints);
59         hints.ai_family = PF_UNSPEC;
60         hints.ai_socktype = SOCK_STREAM;
61         err = getaddrinfo(host, port, &hints, &si);
62         if (err != 0) {
63                 fprintf(stderr, "ERROR: getaddrinfo(): %s\n",
64                         gai_strerror(err));
65                 return INVALID_SOCKET;
66         }
67         fd = INVALID_SOCKET;
68         for (p = si; p != NULL; p = p->ai_next) {
69                 struct sockaddr *sa;
70                 struct sockaddr_in sa4;
71                 struct sockaddr_in6 sa6;
72                 size_t sa_len;
73                 void *addr;
74                 int opt;
75
76                 sa = (struct sockaddr *)p->ai_addr;
77                 if (sa->sa_family == AF_INET) {
78                         memcpy(&sa4, sa, sizeof sa4);
79                         sa = (struct sockaddr *)&sa4;
80                         sa_len = sizeof sa4;
81                         addr = &sa4.sin_addr;
82                         if (host == NULL) {
83                                 sa4.sin_addr.s_addr = INADDR_ANY;
84                         }
85                 } else if (sa->sa_family == AF_INET6) {
86                         memcpy(&sa6, sa, sizeof sa6);
87                         sa = (struct sockaddr *)&sa6;
88                         sa_len = sizeof sa6;
89                         addr = &sa6.sin6_addr;
90                         if (host == NULL) {
91                                 sa6.sin6_addr = in6addr_any;
92                         }
93                 } else {
94                         addr = NULL;
95                         sa_len = p->ai_addrlen;
96                 }
97                 if (verbose) {
98                         char tmp[INET6_ADDRSTRLEN + 50];
99
100                         if (addr != NULL) {
101                                 if (!inet_ntop(p->ai_family, addr,
102                                         tmp, sizeof tmp))
103                                 {
104                                         strcpy(tmp, "<invalid>");
105                                 }
106                         } else {
107                                 sprintf(tmp, "<unknown family: %d>",
108                                         (int)sa->sa_family);
109                         }
110                         fprintf(stderr, "binding to: %s\n", tmp);
111                 }
112                 fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
113                 if (fd == INVALID_SOCKET) {
114                         if (verbose) {
115                                 perror("socket()");
116                         }
117                         continue;
118                 }
119                 opt = 1;
120                 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
121                         (void *)&opt, sizeof opt);
122 #ifdef IPV6_V6ONLY
123                 /*
124                  * We want to make sure that the server socket works for
125                  * both IPv4 and IPv6. But IPV6_V6ONLY is not defined on
126                  * some very old systems.
127                  */
128                 opt = 0;
129                 setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY,
130                         (void *)&opt, sizeof opt);
131 #endif
132                 if (bind(fd, sa, sa_len) < 0) {
133                         if (verbose) {
134                                 perror("bind()");
135                         }
136 #ifdef _WIN32
137                         closesocket(fd);
138 #else
139                         close(fd);
140 #endif
141                         continue;
142                 }
143                 break;
144         }
145         if (p == NULL) {
146                 freeaddrinfo(si);
147                 fprintf(stderr, "ERROR: failed to bind\n");
148                 return INVALID_SOCKET;
149         }
150         freeaddrinfo(si);
151         if (listen(fd, 5) < 0) {
152                 if (verbose) {
153                         perror("listen()");
154                 }
155 #ifdef _WIN32
156                 closesocket(fd);
157 #else
158                 close(fd);
159 #endif
160                 return INVALID_SOCKET;
161         }
162         if (verbose) {
163                 fprintf(stderr, "bound.\n");
164         }
165         return fd;
166 }
167
168 static SOCKET
169 accept_client(SOCKET server_fd, int verbose, int nonblock)
170 {
171         int fd;
172         SOCKADDR_STORAGE sa;
173         socklen_t sa_len;
174
175         sa_len = sizeof sa;
176         fd = accept(server_fd, (struct sockaddr *)&sa, &sa_len);
177         if (fd == INVALID_SOCKET) {
178                 if (verbose) {
179                         perror("accept()");
180                 }
181                 return INVALID_SOCKET;
182         }
183         if (verbose) {
184                 char tmp[INET6_ADDRSTRLEN + 50];
185                 const char *name;
186
187                 name = NULL;
188                 switch (((struct sockaddr *)&sa)->sa_family) {
189                 case AF_INET:
190                         name = inet_ntop(AF_INET,
191                                 &((struct sockaddr_in *)&sa)->sin_addr,
192                                 tmp, sizeof tmp);
193                         break;
194                 case AF_INET6:
195                         name = inet_ntop(AF_INET6,
196                                 &((struct sockaddr_in6 *)&sa)->sin6_addr,
197                                 tmp, sizeof tmp);
198                         break;
199                 }
200                 if (name == NULL) {
201                         sprintf(tmp, "<unknown: %lu>", (unsigned long)
202                                 ((struct sockaddr *)&sa)->sa_family);
203                         name = tmp;
204                 }
205                 fprintf(stderr, "accepting connection from: %s\n", name);
206         }
207
208         /*
209          * We make the socket non-blocking, since we are going to use
210          * poll() or select() to organise I/O.
211          */
212         if (nonblock) {
213 #ifdef _WIN32
214                 u_long arg;
215
216                 arg = 1;
217                 ioctlsocket(fd, FIONBIO, &arg);
218 #else
219                 fcntl(fd, F_SETFL, O_NONBLOCK);
220 #endif
221         }
222         return fd;
223 }
224
225 static void
226 usage_server(void)
227 {
228         fprintf(stderr,
229 "usage: brssl server [ options ]\n");
230         fprintf(stderr,
231 "options:\n");
232         fprintf(stderr,
233 "   -q              suppress verbose messages\n");
234         fprintf(stderr,
235 "   -trace          activate extra debug messages (dump of all packets)\n");
236         fprintf(stderr,
237 "   -b name         bind to a specific address or host name\n");
238         fprintf(stderr,
239 "   -p port         bind to a specific port (default: 4433)\n");
240         fprintf(stderr,
241 "   -mono           use monodirectional buffering\n");
242         fprintf(stderr,
243 "   -buf length     set the I/O buffer length (in bytes)\n");
244         fprintf(stderr,
245 "   -cache length   set the session cache storage length (in bytes)\n");
246         fprintf(stderr,
247 "   -cert fname     read certificate chain from file 'fname'\n");
248         fprintf(stderr,
249 "   -key fname      read private key from file 'fname'\n");
250         fprintf(stderr,
251 "   -CA file        add trust anchors from 'file' (for client auth)\n");
252         fprintf(stderr,
253 "   -anon_ok        request but do not require a client certificate\n");
254         fprintf(stderr,
255 "   -list           list supported names (protocols, algorithms...)\n");
256         fprintf(stderr,
257 "   -vmin name      set minimum supported version (default: TLS-1.0)\n");
258         fprintf(stderr,
259 "   -vmax name      set maximum supported version (default: TLS-1.2)\n");
260         fprintf(stderr,
261 "   -cs names       set list of supported cipher suites (comma-separated)\n");
262         fprintf(stderr,
263 "   -hf names       add support for some hash functions (comma-separated)\n");
264         fprintf(stderr,
265 "   -cbhash         test hashing in policy callback\n");
266         fprintf(stderr,
267 "   -serverpref     enforce server's preferences for cipher suites\n");
268         fprintf(stderr,
269 "   -noreneg        prohibit renegotiations\n");
270         fprintf(stderr,
271 "   -alpn name      add protocol name to list of protocols (ALPN extension)\n");
272         fprintf(stderr,
273 "   -strictalpn     fail on ALPN mismatch\n");
274         exit(EXIT_FAILURE);
275 }
276
277 typedef struct {
278         const br_ssl_server_policy_class *vtable;
279         int verbose;
280         br_x509_certificate *chain;
281         size_t chain_len;
282         int cert_signer_algo;
283         private_key *sk;
284         int cbhash;
285 } policy_context;
286
287 static void
288 print_hashes(unsigned chashes)
289 {
290         int i;
291
292         for (i = 2; i <= 6; i ++) {
293                 if ((chashes >> i) & 1) {
294                         int z;
295
296                         switch (i) {
297                         case 3: z = 224; break;
298                         case 4: z = 256; break;
299                         case 5: z = 384; break;
300                         case 6: z = 512; break;
301                         default:
302                                 z = 1;
303                                 break;
304                         }
305                         fprintf(stderr, " sha%d", z);
306                 }
307         }
308 }
309
310 static unsigned
311 choose_hash(unsigned chashes)
312 {
313         unsigned hash_id;
314
315         for (hash_id = 6; hash_id >= 2; hash_id --) {
316                 if (((chashes >> hash_id) & 1) != 0) {
317                         return hash_id;
318                 }
319         }
320         /*
321          * Normally unreachable.
322          */
323         return 0;
324 }
325
326 static int
327 sp_choose(const br_ssl_server_policy_class **pctx,
328         const br_ssl_server_context *cc,
329         br_ssl_server_choices *choices)
330 {
331         policy_context *pc;
332         const br_suite_translated *st;
333         size_t u, st_num;
334         unsigned chashes;
335
336         pc = (policy_context *)pctx;
337         st = br_ssl_server_get_client_suites(cc, &st_num);
338         chashes = br_ssl_server_get_client_hashes(cc);
339         if (pc->verbose) {
340                 fprintf(stderr, "Client parameters:\n");
341                 fprintf(stderr, "   Maximum version:      ");
342                 switch (cc->client_max_version) {
343                 case BR_SSL30:
344                         fprintf(stderr, "SSL 3.0");
345                         break;
346                 case BR_TLS10:
347                         fprintf(stderr, "TLS 1.0");
348                         break;
349                 case BR_TLS11:
350                         fprintf(stderr, "TLS 1.1");
351                         break;
352                 case BR_TLS12:
353                         fprintf(stderr, "TLS 1.2");
354                         break;
355                 default:
356                         fprintf(stderr, "unknown (0x%04X)",
357                                 (unsigned)cc->client_max_version);
358                         break;
359                 }
360                 fprintf(stderr, "\n");
361                 fprintf(stderr, "   Compatible cipher suites:\n");
362                 for (u = 0; u < st_num; u ++) {
363                         char csn[80];
364
365                         get_suite_name_ext(st[u][0], csn, sizeof csn);
366                         fprintf(stderr, "      %s\n", csn);
367                 }
368                 fprintf(stderr, "   Common sign+hash functions:\n");
369                 if ((chashes & 0xFF) != 0) {
370                         fprintf(stderr, "      with RSA:");
371                         print_hashes(chashes);
372                         fprintf(stderr, "\n");
373                 }
374                 if ((chashes >> 8) != 0) {
375                         fprintf(stderr, "      with ECDSA:");
376                         print_hashes(chashes >> 8);
377                         fprintf(stderr, "\n");
378                 }
379         }
380         for (u = 0; u < st_num; u ++) {
381                 unsigned tt;
382
383                 tt = st[u][1];
384                 switch (tt >> 12) {
385                 case BR_SSLKEYX_RSA:
386                         if (pc->sk->key_type == BR_KEYTYPE_RSA) {
387                                 choices->cipher_suite = st[u][0];
388                                 goto choose_ok;
389                         }
390                         break;
391                 case BR_SSLKEYX_ECDHE_RSA:
392                         if (pc->sk->key_type == BR_KEYTYPE_RSA) {
393                                 choices->cipher_suite = st[u][0];
394                                 if (br_ssl_engine_get_version(&cc->eng)
395                                         < BR_TLS12)
396                                 {
397                                         if (pc->cbhash) {
398                                                 choices->algo_id = 0x0001;
399                                         } else {
400                                                 choices->algo_id = 0xFF00;
401                                         }
402                                 } else {
403                                         unsigned id;
404
405                                         id = choose_hash(chashes);
406                                         if (pc->cbhash) {
407                                                 choices->algo_id =
408                                                         (id << 8) + 0x01;
409                                         } else {
410                                                 choices->algo_id = 0xFF00 + id;
411                                         }
412                                 }
413                                 goto choose_ok;
414                         }
415                         break;
416                 case BR_SSLKEYX_ECDHE_ECDSA:
417                         if (pc->sk->key_type == BR_KEYTYPE_EC) {
418                                 choices->cipher_suite = st[u][0];
419                                 if (br_ssl_engine_get_version(&cc->eng)
420                                         < BR_TLS12)
421                                 {
422                                         if (pc->cbhash) {
423                                                 choices->algo_id = 0x0203;
424                                         } else {
425                                                 choices->algo_id =
426                                                         0xFF00 + br_sha1_ID;
427                                         }
428                                 } else {
429                                         unsigned id;
430
431                                         id = choose_hash(chashes >> 8);
432                                         if (pc->cbhash) {
433                                                 choices->algo_id =
434                                                         (id << 8) + 0x03;
435                                         } else {
436                                                 choices->algo_id =
437                                                         0xFF00 + id;
438                                         }
439                                 }
440                                 goto choose_ok;
441                         }
442                         break;
443                 case BR_SSLKEYX_ECDH_RSA:
444                         if (pc->sk->key_type == BR_KEYTYPE_EC
445                                 && pc->cert_signer_algo == BR_KEYTYPE_RSA)
446                         {
447                                 choices->cipher_suite = st[u][0];
448                                 goto choose_ok;
449                         }
450                         break;
451                 case BR_SSLKEYX_ECDH_ECDSA:
452                         if (pc->sk->key_type == BR_KEYTYPE_EC
453                                 && pc->cert_signer_algo == BR_KEYTYPE_EC)
454                         {
455                                 choices->cipher_suite = st[u][0];
456                                 goto choose_ok;
457                         }
458                         break;
459                 }
460         }
461         return 0;
462
463 choose_ok:
464         choices->chain = pc->chain;
465         choices->chain_len = pc->chain_len;
466         if (pc->verbose) {
467                 char csn[80];
468
469                 get_suite_name_ext(choices->cipher_suite, csn, sizeof csn);
470                 fprintf(stderr, "Using: %s\n", csn);
471         }
472         return 1;
473 }
474
475 static uint32_t
476 sp_do_keyx(const br_ssl_server_policy_class **pctx,
477         unsigned char *data, size_t *len)
478 {
479         policy_context *pc;
480         uint32_t r;
481         size_t xoff, xlen;
482
483         pc = (policy_context *)pctx;
484         switch (pc->sk->key_type) {
485                 const br_ec_impl *iec;
486
487         case BR_KEYTYPE_RSA:
488                 return br_rsa_ssl_decrypt(
489                         br_rsa_private_get_default(),
490                         &pc->sk->key.rsa, data, *len);
491         case BR_KEYTYPE_EC:
492                 iec = br_ec_get_default();
493                 r = iec->mul(data, *len, pc->sk->key.ec.x,
494                         pc->sk->key.ec.xlen, pc->sk->key.ec.curve);
495                 xoff = iec->xoff(pc->sk->key.ec.curve, &xlen);
496                 memmove(data, data + xoff, xlen);
497                 *len = xlen;
498                 return r;
499         default:
500                 fprintf(stderr, "ERROR: unknown private key type (%d)\n",
501                         (int)pc->sk->key_type);
502                 return 0;
503         }
504 }
505
506 static size_t
507 sp_do_sign(const br_ssl_server_policy_class **pctx,
508         unsigned algo_id, unsigned char *data, size_t hv_len, size_t len)
509 {
510         policy_context *pc;
511         unsigned char hv[64];
512
513         pc = (policy_context *)pctx;
514         if (algo_id >= 0xFF00) {
515                 algo_id &= 0xFF;
516                 memcpy(hv, data, hv_len);
517         } else {
518                 const br_hash_class *hc;
519                 br_hash_compat_context zc;
520
521                 if (pc->verbose) {
522                         fprintf(stderr, "Callback hashing, algo = 0x%04X,"
523                                 " data_len = %lu\n",
524                                 algo_id, (unsigned long)hv_len);
525                 }
526                 algo_id >>= 8;
527                 hc = get_hash_impl(algo_id);
528                 if (hc == NULL) {
529                         if (pc->verbose) {
530                                 fprintf(stderr,
531                                         "ERROR: unsupported hash function %u\n",
532                                         algo_id);
533                         }
534                         return 0;
535                 }
536                 hc->init(&zc.vtable);
537                 hc->update(&zc.vtable, data, hv_len);
538                 hc->out(&zc.vtable, hv);
539                 hv_len = (hc->desc >> BR_HASHDESC_OUT_OFF)
540                         & BR_HASHDESC_OUT_MASK;
541         }
542         switch (pc->sk->key_type) {
543                 size_t sig_len;
544                 uint32_t x;
545                 const unsigned char *hash_oid;
546                 const br_hash_class *hc;
547
548         case BR_KEYTYPE_RSA:
549                 hash_oid = get_hash_oid(algo_id);
550                 if (hash_oid == NULL && algo_id != 0) {
551                         if (pc->verbose) {
552                                 fprintf(stderr, "ERROR: cannot RSA-sign with"
553                                         " unknown hash function: %u\n",
554                                         algo_id);
555                         }
556                         return 0;
557                 }
558                 sig_len = (pc->sk->key.rsa.n_bitlen + 7) >> 3;
559                 if (len < sig_len) {
560                         if (pc->verbose) {
561                                 fprintf(stderr, "ERROR: cannot RSA-sign,"
562                                         " buffer is too small"
563                                         " (sig=%lu, buf=%lu)\n",
564                                         (unsigned long)sig_len,
565                                         (unsigned long)len);
566                         }
567                         return 0;
568                 }
569                 x = br_rsa_pkcs1_sign_get_default()(
570                         hash_oid, hv, hv_len, &pc->sk->key.rsa, data);
571                 if (!x) {
572                         if (pc->verbose) {
573                                 fprintf(stderr, "ERROR: RSA-sign failure\n");
574                         }
575                         return 0;
576                 }
577                 return sig_len;
578
579         case BR_KEYTYPE_EC:
580                 hc = get_hash_impl(algo_id);
581                 if (hc == NULL) {
582                         if (pc->verbose) {
583                                 fprintf(stderr, "ERROR: cannot ECDSA-sign with"
584                                         " unknown hash function: %u\n",
585                                         algo_id);
586                         }
587                         return 0;
588                 }
589                 if (len < 139) {
590                         if (pc->verbose) {
591                                 fprintf(stderr, "ERROR: cannot ECDSA-sign"
592                                         " (output buffer = %lu)\n",
593                                         (unsigned long)len);
594                         }
595                         return 0;
596                 }
597                 sig_len = br_ecdsa_sign_asn1_get_default()(
598                         br_ec_get_default(), hc, hv, &pc->sk->key.ec, data);
599                 if (sig_len == 0) {
600                         if (pc->verbose) {
601                                 fprintf(stderr, "ERROR: ECDSA-sign failure\n");
602                         }
603                         return 0;
604                 }
605                 return sig_len;
606
607         default:
608                 return 0;
609         }
610 }
611
612 static const br_ssl_server_policy_class policy_vtable = {
613         sizeof(policy_context),
614         sp_choose,
615         sp_do_keyx,
616         sp_do_sign
617 };
618
619 void
620 free_alpn(void *alpn)
621 {
622         xfree(*(char **)alpn);
623 }
624
625 /* see brssl.h */
626 int
627 do_server(int argc, char *argv[])
628 {
629         int retcode;
630         int verbose;
631         int trace;
632         int i, bidi;
633         const char *bind_name;
634         const char *port;
635         unsigned vmin, vmax;
636         cipher_suite *suites;
637         size_t num_suites;
638         uint16_t *suite_ids;
639         unsigned hfuns;
640         int cbhash;
641         br_x509_certificate *chain;
642         size_t chain_len;
643         int cert_signer_algo;
644         private_key *sk;
645         anchor_list anchors = VEC_INIT;
646         VECTOR(char *) alpn_names = VEC_INIT;
647         br_x509_minimal_context xc;
648         const br_hash_class *dnhash;
649         size_t u;
650         br_ssl_server_context cc;
651         policy_context pc;
652         br_ssl_session_cache_lru lru;
653         unsigned char *iobuf, *cache;
654         size_t iobuf_len, cache_len;
655         uint32_t flags;
656         SOCKET server_fd, fd;
657
658         retcode = 0;
659         verbose = 1;
660         trace = 0;
661         bind_name = NULL;
662         port = NULL;
663         bidi = 1;
664         vmin = 0;
665         vmax = 0;
666         suites = NULL;
667         num_suites = 0;
668         hfuns = 0;
669         cbhash = 0;
670         suite_ids = NULL;
671         chain = NULL;
672         chain_len = 0;
673         sk = NULL;
674         iobuf = NULL;
675         iobuf_len = 0;
676         cache = NULL;
677         cache_len = (size_t)-1;
678         flags = 0;
679         server_fd = INVALID_SOCKET;
680         fd = INVALID_SOCKET;
681         for (i = 0; i < argc; i ++) {
682                 const char *arg;
683
684                 arg = argv[i];
685                 if (arg[0] != '-') {
686                         usage_server();
687                         goto server_exit_error;
688                 }
689                 if (eqstr(arg, "-v") || eqstr(arg, "-verbose")) {
690                         verbose = 1;
691                 } else if (eqstr(arg, "-q") || eqstr(arg, "-quiet")) {
692                         verbose = 0;
693                 } else if (eqstr(arg, "-trace")) {
694                         trace = 1;
695                 } else if (eqstr(arg, "-b")) {
696                         if (++ i >= argc) {
697                                 fprintf(stderr,
698                                         "ERROR: no argument for '-b'\n");
699                                 usage_server();
700                                 goto server_exit_error;
701                         }
702                         if (bind_name != NULL) {
703                                 fprintf(stderr, "ERROR: duplicate bind host\n");
704                                 usage_server();
705                                 goto server_exit_error;
706                         }
707                         bind_name = argv[i];
708                 } else if (eqstr(arg, "-p")) {
709                         if (++ i >= argc) {
710                                 fprintf(stderr,
711                                         "ERROR: no argument for '-p'\n");
712                                 usage_server();
713                                 goto server_exit_error;
714                         }
715                         if (port != NULL) {
716                                 fprintf(stderr, "ERROR: duplicate bind port\n");
717                                 usage_server();
718                                 goto server_exit_error;
719                         }
720                         port = argv[i];
721                 } else if (eqstr(arg, "-mono")) {
722                         bidi = 0;
723                 } else if (eqstr(arg, "-buf")) {
724                         if (++ i >= argc) {
725                                 fprintf(stderr,
726                                         "ERROR: no argument for '-buf'\n");
727                                 usage_server();
728                                 goto server_exit_error;
729                         }
730                         arg = argv[i];
731                         if (iobuf_len != 0) {
732                                 fprintf(stderr,
733                                         "ERROR: duplicate I/O buffer length\n");
734                                 usage_server();
735                                 goto server_exit_error;
736                         }
737                         iobuf_len = parse_size(arg);
738                         if (iobuf_len == (size_t)-1) {
739                                 usage_server();
740                                 goto server_exit_error;
741                         }
742                 } else if (eqstr(arg, "-cache")) {
743                         if (++ i >= argc) {
744                                 fprintf(stderr,
745                                         "ERROR: no argument for '-cache'\n");
746                                 usage_server();
747                                 goto server_exit_error;
748                         }
749                         arg = argv[i];
750                         if (cache_len != (size_t)-1) {
751                                 fprintf(stderr, "ERROR: duplicate session"
752                                         " cache length\n");
753                                 usage_server();
754                                 goto server_exit_error;
755                         }
756                         cache_len = parse_size(arg);
757                         if (cache_len == (size_t)-1) {
758                                 usage_server();
759                                 goto server_exit_error;
760                         }
761                 } else if (eqstr(arg, "-cert")) {
762                         if (++ i >= argc) {
763                                 fprintf(stderr,
764                                         "ERROR: no argument for '-cert'\n");
765                                 usage_server();
766                                 goto server_exit_error;
767                         }
768                         if (chain != NULL) {
769                                 fprintf(stderr,
770                                         "ERROR: duplicate certificate chain\n");
771                                 usage_server();
772                                 goto server_exit_error;
773                         }
774                         arg = argv[i];
775                         chain = read_certificates(arg, &chain_len);
776                         if (chain == NULL || chain_len == 0) {
777                                 goto server_exit_error;
778                         }
779                 } else if (eqstr(arg, "-key")) {
780                         if (++ i >= argc) {
781                                 fprintf(stderr,
782                                         "ERROR: no argument for '-key'\n");
783                                 usage_server();
784                                 goto server_exit_error;
785                         }
786                         if (sk != NULL) {
787                                 fprintf(stderr,
788                                         "ERROR: duplicate private key\n");
789                                 usage_server();
790                                 goto server_exit_error;
791                         }
792                         arg = argv[i];
793                         sk = read_private_key(arg);
794                         if (sk == NULL) {
795                                 goto server_exit_error;
796                         }
797                 } else if (eqstr(arg, "-CA")) {
798                         if (++ i >= argc) {
799                                 fprintf(stderr,
800                                         "ERROR: no argument for '-CA'\n");
801                                 usage_server();
802                                 goto server_exit_error;
803                         }
804                         arg = argv[i];
805                         if (read_trust_anchors(&anchors, arg) == 0) {
806                                 usage_server();
807                                 goto server_exit_error;
808                         }
809                 } else if (eqstr(arg, "-anon_ok")) {
810                         flags |= BR_OPT_TOLERATE_NO_CLIENT_AUTH;
811                 } else if (eqstr(arg, "-list")) {
812                         list_names();
813                         goto server_exit;
814                 } else if (eqstr(arg, "-vmin")) {
815                         if (++ i >= argc) {
816                                 fprintf(stderr,
817                                         "ERROR: no argument for '-vmin'\n");
818                                 usage_server();
819                                 goto server_exit_error;
820                         }
821                         arg = argv[i];
822                         if (vmin != 0) {
823                                 fprintf(stderr,
824                                         "ERROR: duplicate minimum version\n");
825                                 usage_server();
826                                 goto server_exit_error;
827                         }
828                         vmin = parse_version(arg, strlen(arg));
829                         if (vmin == 0) {
830                                 fprintf(stderr,
831                                         "ERROR: unrecognised version '%s'\n",
832                                         arg);
833                                 usage_server();
834                                 goto server_exit_error;
835                         }
836                 } else if (eqstr(arg, "-vmax")) {
837                         if (++ i >= argc) {
838                                 fprintf(stderr,
839                                         "ERROR: no argument for '-vmax'\n");
840                                 usage_server();
841                                 goto server_exit_error;
842                         }
843                         arg = argv[i];
844                         if (vmax != 0) {
845                                 fprintf(stderr,
846                                         "ERROR: duplicate maximum version\n");
847                                 usage_server();
848                                 goto server_exit_error;
849                         }
850                         vmax = parse_version(arg, strlen(arg));
851                         if (vmax == 0) {
852                                 fprintf(stderr,
853                                         "ERROR: unrecognised version '%s'\n",
854                                         arg);
855                                 usage_server();
856                                 goto server_exit_error;
857                         }
858                 } else if (eqstr(arg, "-cs")) {
859                         if (++ i >= argc) {
860                                 fprintf(stderr,
861                                         "ERROR: no argument for '-cs'\n");
862                                 usage_server();
863                                 goto server_exit_error;
864                         }
865                         arg = argv[i];
866                         if (suites != NULL) {
867                                 fprintf(stderr, "ERROR: duplicate list"
868                                         " of cipher suites\n");
869                                 usage_server();
870                                 goto server_exit_error;
871                         }
872                         suites = parse_suites(arg, &num_suites);
873                         if (suites == NULL) {
874                                 usage_server();
875                                 goto server_exit_error;
876                         }
877                 } else if (eqstr(arg, "-hf")) {
878                         unsigned x;
879
880                         if (++ i >= argc) {
881                                 fprintf(stderr,
882                                         "ERROR: no argument for '-hf'\n");
883                                 usage_server();
884                                 goto server_exit_error;
885                         }
886                         arg = argv[i];
887                         x = parse_hash_functions(arg);
888                         if (x == 0) {
889                                 usage_server();
890                                 goto server_exit_error;
891                         }
892                         hfuns |= x;
893                 } else if (eqstr(arg, "-cbhash")) {
894                         cbhash = 1;
895                 } else if (eqstr(arg, "-serverpref")) {
896                         flags |= BR_OPT_ENFORCE_SERVER_PREFERENCES;
897                 } else if (eqstr(arg, "-noreneg")) {
898                         flags |= BR_OPT_NO_RENEGOTIATION;
899                 } else if (eqstr(arg, "-alpn")) {
900                         if (++ i >= argc) {
901                                 fprintf(stderr,
902                                         "ERROR: no argument for '-alpn'\n");
903                                 usage_server();
904                                 goto server_exit_error;
905                         }
906                         VEC_ADD(alpn_names, xstrdup(argv[i]));
907                 } else if (eqstr(arg, "-strictalpn")) {
908                         flags |= BR_OPT_FAIL_ON_ALPN_MISMATCH;
909                 } else {
910                         fprintf(stderr, "ERROR: unknown option: '%s'\n", arg);
911                         usage_server();
912                         goto server_exit_error;
913                 }
914         }
915         if (port == NULL) {
916                 port = "4433";
917         }
918         if (vmin == 0) {
919                 vmin = BR_TLS10;
920         }
921         if (vmax == 0) {
922                 vmax = BR_TLS12;
923         }
924         if (vmax < vmin) {
925                 fprintf(stderr, "ERROR: impossible minimum/maximum protocol"
926                         " version combination\n");
927                 usage_server();
928                 goto server_exit_error;
929         }
930         if (suites == NULL) {
931                 num_suites = 0;
932
933                 for (u = 0; cipher_suites[u].name; u ++) {
934                         if ((cipher_suites[u].req & REQ_TLS12) == 0
935                                 || vmax >= BR_TLS12)
936                         {
937                                 num_suites ++;
938                         }
939                 }
940                 suites = xmalloc(num_suites * sizeof *suites);
941                 num_suites = 0;
942                 for (u = 0; cipher_suites[u].name; u ++) {
943                         if ((cipher_suites[u].req & REQ_TLS12) == 0
944                                 || vmax >= BR_TLS12)
945                         {
946                                 suites[num_suites ++] = cipher_suites[u];
947                         }
948                 }
949         }
950         if (hfuns == 0) {
951                 hfuns = (unsigned)-1;
952         }
953         if (chain == NULL || chain_len == 0) {
954                 fprintf(stderr, "ERROR: no certificate chain provided\n");
955                 goto server_exit_error;
956         }
957         if (sk == NULL) {
958                 fprintf(stderr, "ERROR: no private key provided\n");
959                 goto server_exit_error;
960         }
961         switch (sk->key_type) {
962                 int curve;
963                 uint32_t supp;
964
965         case BR_KEYTYPE_RSA:
966                 break;
967         case BR_KEYTYPE_EC:
968                 curve = sk->key.ec.curve;
969                 supp = br_ec_get_default()->supported_curves;
970                 if (curve > 31 || !((supp >> curve) & 1)) {
971                         fprintf(stderr, "ERROR: private key curve (%d)"
972                                 " is not supported\n", curve);
973                         goto server_exit_error;
974                 }
975                 break;
976         default:
977                 fprintf(stderr, "ERROR: unsupported private key type (%d)\n",
978                         sk->key_type);
979                 break;
980         }
981         cert_signer_algo = get_cert_signer_algo(chain);
982         if (cert_signer_algo == 0) {
983                 goto server_exit_error;
984         }
985         if (verbose) {
986                 const char *csas;
987
988                 switch (cert_signer_algo) {
989                 case BR_KEYTYPE_RSA: csas = "RSA"; break;
990                 case BR_KEYTYPE_EC:  csas = "EC"; break;
991                 default:
992                         csas = "unknown";
993                         break;
994                 }
995                 fprintf(stderr, "Issuing CA key type: %d (%s)\n",
996                         cert_signer_algo, csas);
997         }
998         if (iobuf_len == 0) {
999                 if (bidi) {
1000                         iobuf_len = BR_SSL_BUFSIZE_BIDI;
1001                 } else {
1002                         iobuf_len = BR_SSL_BUFSIZE_MONO;
1003                 }
1004         }
1005         iobuf = xmalloc(iobuf_len);
1006         if (cache_len == (size_t)-1) {
1007                 cache_len = 5000;
1008         }
1009         cache = xmalloc(cache_len);
1010
1011         /*
1012          * Compute implementation requirements and inject implementations.
1013          */
1014         suite_ids = xmalloc(num_suites * sizeof *suite_ids);
1015         br_ssl_server_zero(&cc);
1016         br_ssl_engine_set_versions(&cc.eng, vmin, vmax);
1017         br_ssl_engine_set_all_flags(&cc.eng, flags);
1018         if (vmin <= BR_TLS11) {
1019                 if (!(hfuns & (1 << br_md5_ID))) {
1020                         fprintf(stderr, "ERROR: TLS 1.0 and 1.1 need MD5\n");
1021                         goto server_exit_error;
1022                 }
1023                 if (!(hfuns & (1 << br_sha1_ID))) {
1024                         fprintf(stderr, "ERROR: TLS 1.0 and 1.1 need SHA-1\n");
1025                         goto server_exit_error;
1026                 }
1027         }
1028         for (u = 0; u < num_suites; u ++) {
1029                 unsigned req;
1030
1031                 req = suites[u].req;
1032                 suite_ids[u] = suites[u].suite;
1033                 if ((req & REQ_TLS12) != 0 && vmax < BR_TLS12) {
1034                         fprintf(stderr,
1035                                 "ERROR: cipher suite %s requires TLS 1.2\n",
1036                                 suites[u].name);
1037                         goto server_exit_error;
1038                 }
1039                 if ((req & REQ_SHA1) != 0 && !(hfuns & (1 << br_sha1_ID))) {
1040                         fprintf(stderr,
1041                                 "ERROR: cipher suite %s requires SHA-1\n",
1042                                 suites[u].name);
1043                         goto server_exit_error;
1044                 }
1045                 if ((req & REQ_SHA256) != 0 && !(hfuns & (1 << br_sha256_ID))) {
1046                         fprintf(stderr,
1047                                 "ERROR: cipher suite %s requires SHA-256\n",
1048                                 suites[u].name);
1049                         goto server_exit_error;
1050                 }
1051                 if ((req & REQ_SHA384) != 0 && !(hfuns & (1 << br_sha384_ID))) {
1052                         fprintf(stderr,
1053                                 "ERROR: cipher suite %s requires SHA-384\n",
1054                                 suites[u].name);
1055                         goto server_exit_error;
1056                 }
1057                 /* TODO: algorithm implementation selection */
1058                 if ((req & REQ_AESCBC) != 0) {
1059                         br_ssl_engine_set_default_aes_cbc(&cc.eng);
1060                 }
1061                 if ((req & REQ_AESCCM) != 0) {
1062                         br_ssl_engine_set_default_aes_ccm(&cc.eng);
1063                 }
1064                 if ((req & REQ_AESGCM) != 0) {
1065                         br_ssl_engine_set_default_aes_gcm(&cc.eng);
1066                 }
1067                 if ((req & REQ_CHAPOL) != 0) {
1068                         br_ssl_engine_set_default_chapol(&cc.eng);
1069                 }
1070                 if ((req & REQ_3DESCBC) != 0) {
1071                         br_ssl_engine_set_default_des_cbc(&cc.eng);
1072                 }
1073                 if ((req & (REQ_ECDHE_RSA | REQ_ECDHE_ECDSA)) != 0) {
1074                         br_ssl_engine_set_default_ec(&cc.eng);
1075                 }
1076         }
1077         br_ssl_engine_set_suites(&cc.eng, suite_ids, num_suites);
1078
1079         dnhash = NULL;
1080         for (u = 0; hash_functions[u].name; u ++) {
1081                 const br_hash_class *hc;
1082                 int id;
1083
1084                 hc = hash_functions[u].hclass;
1085                 id = (hc->desc >> BR_HASHDESC_ID_OFF) & BR_HASHDESC_ID_MASK;
1086                 if ((hfuns & ((unsigned)1 << id)) != 0) {
1087                         dnhash = hc;
1088                         br_ssl_engine_set_hash(&cc.eng, id, hc);
1089                 }
1090         }
1091         if (vmin <= BR_TLS11) {
1092                 br_ssl_engine_set_prf10(&cc.eng, &br_tls10_prf);
1093         }
1094         if (vmax >= BR_TLS12) {
1095                 if ((hfuns & ((unsigned)1 << br_sha256_ID)) != 0) {
1096                         br_ssl_engine_set_prf_sha256(&cc.eng,
1097                                 &br_tls12_sha256_prf);
1098                 }
1099                 if ((hfuns & ((unsigned)1 << br_sha384_ID)) != 0) {
1100                         br_ssl_engine_set_prf_sha384(&cc.eng,
1101                                 &br_tls12_sha384_prf);
1102                 }
1103         }
1104
1105         br_ssl_session_cache_lru_init(&lru, cache, cache_len);
1106         br_ssl_server_set_cache(&cc, &lru.vtable);
1107
1108         if (VEC_LEN(alpn_names) != 0) {
1109                 br_ssl_engine_set_protocol_names(&cc.eng,
1110                         (const char **)&VEC_ELT(alpn_names, 0),
1111                         VEC_LEN(alpn_names));
1112         }
1113
1114         /*
1115          * Set the policy handler (that chooses the actual cipher suite,
1116          * selects the certificate chain, and runs the private key
1117          * operations).
1118          */
1119         pc.vtable = &policy_vtable;
1120         pc.verbose = verbose;
1121         pc.chain = chain;
1122         pc.chain_len = chain_len;
1123         pc.cert_signer_algo = cert_signer_algo;
1124         pc.sk = sk;
1125         pc.cbhash = cbhash;
1126         br_ssl_server_set_policy(&cc, &pc.vtable);
1127
1128         /*
1129          * If trust anchors have been configured, then set an X.509
1130          * validation engine and activate client certificate
1131          * authentication.
1132          */
1133         if (VEC_LEN(anchors) != 0) {
1134                 br_x509_minimal_init(&xc, dnhash,
1135                         &VEC_ELT(anchors, 0), VEC_LEN(anchors));
1136                 for (u = 0; hash_functions[u].name; u ++) {
1137                         const br_hash_class *hc;
1138                         int id;
1139
1140                         hc = hash_functions[u].hclass;
1141                         id = (hc->desc >> BR_HASHDESC_ID_OFF)
1142                                 & BR_HASHDESC_ID_MASK;
1143                         if ((hfuns & ((unsigned)1 << id)) != 0) {
1144                                 br_x509_minimal_set_hash(&xc, id, hc);
1145                         }
1146                 }
1147                 br_ssl_engine_set_default_rsavrfy(&cc.eng);
1148                 br_ssl_engine_set_default_ecdsa(&cc.eng);
1149                 br_x509_minimal_set_rsa(&xc, br_rsa_pkcs1_vrfy_get_default());
1150                 br_x509_minimal_set_ecdsa(&xc,
1151                         br_ec_get_default(), br_ecdsa_vrfy_asn1_get_default());
1152                 br_ssl_engine_set_x509(&cc.eng, &xc.vtable);
1153                 br_ssl_server_set_trust_anchor_names_alt(&cc,
1154                         &VEC_ELT(anchors, 0), VEC_LEN(anchors));
1155         }
1156
1157         br_ssl_engine_set_buffer(&cc.eng, iobuf, iobuf_len, bidi);
1158
1159         /*
1160          * On Unix systems, we need to ignore SIGPIPE.
1161          */
1162 #ifndef _WIN32
1163         signal(SIGPIPE, SIG_IGN);
1164 #endif
1165
1166         /*
1167          * Open the server socket.
1168          */
1169         server_fd = host_bind(bind_name, port, verbose);
1170         if (server_fd == INVALID_SOCKET) {
1171                 goto server_exit_error;
1172         }
1173
1174         /*
1175          * Process incoming clients, one at a time. Note that we do not
1176          * accept any client until the previous connection has finished:
1177          * this is voluntary, since the tool uses stdin/stdout for
1178          * application data, and thus cannot really run two connections
1179          * simultaneously.
1180          */
1181         for (;;) {
1182                 int x;
1183                 unsigned run_flags;
1184
1185                 fd = accept_client(server_fd, verbose, 1);
1186                 if (fd == INVALID_SOCKET) {
1187                         goto server_exit_error;
1188                 }
1189                 br_ssl_server_reset(&cc);
1190                 run_flags = (verbose ? RUN_ENGINE_VERBOSE : 0)
1191                         | (trace ? RUN_ENGINE_TRACE : 0);
1192                 x = run_ssl_engine(&cc.eng, fd, run_flags);
1193 #ifdef _WIN32
1194                 closesocket(fd);
1195 #else
1196                 close(fd);
1197 #endif
1198                 fd = INVALID_SOCKET;
1199                 if (x < -1) {
1200                         goto server_exit_error;
1201                 }
1202         }
1203
1204         /*
1205          * Release allocated structures.
1206          */
1207 server_exit:
1208         xfree(suites);
1209         xfree(suite_ids);
1210         free_certificates(chain, chain_len);
1211         free_private_key(sk);
1212         VEC_CLEAREXT(anchors, &free_ta_contents);
1213         VEC_CLEAREXT(alpn_names, &free_alpn);
1214         xfree(iobuf);
1215         xfree(cache);
1216         if (fd != INVALID_SOCKET) {
1217 #ifdef _WIN32
1218                 closesocket(fd);
1219 #else
1220                 close(fd);
1221 #endif
1222         }
1223         if (server_fd != INVALID_SOCKET) {
1224 #ifdef _WIN32
1225                 closesocket(server_fd);
1226 #else
1227                 close(server_fd);
1228 #endif
1229         }
1230         return retcode;
1231
1232 server_exit_error:
1233         retcode = -1;
1234         goto server_exit;
1235 }