1 /* $OpenBSD: relayd.c,v 1.193 2025/01/30 17:00:31 martijn Exp $ */
2
3 /*
4 * Copyright (c) 2007 - 2016 Reyk Floeter <reyk@openbsd.org>
5 * Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20 #include <sys/types.h>
21 #include <sys/queue.h>
22 #include <sys/socket.h>
23 #include <sys/stat.h>
24 #include <sys/wait.h>
25 #include <sys/resource.h>
26
27 #include <netinet/in.h>
28 #include <arpa/inet.h>
29
30 #include <agentx.h>
31 #include <signal.h>
32 #include <string.h>
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <fcntl.h>
36 #include <getopt.h>
37 #include <fnmatch.h>
38 #include <syslog.h>
39 #include <err.h>
40 #include <errno.h>
41 #include <event.h>
42 #include <unistd.h>
43 #include <ctype.h>
44 #include <pwd.h>
45 #include <sha1.h>
46 #include <md5.h>
47
48 #include <tls.h>
49
50 #include "relayd.h"
51
52 #define MAXIMUM(a, b) (((a) > (b)) ? (a) : (b))
53
54 __dead void usage(void);
55
56 int parent_configure(struct relayd *);
57 void parent_configure_done(struct relayd *);
58 void parent_reload(struct relayd *, u_int, const char *);
59 void parent_sig_handler(int, short, void *);
60 void parent_shutdown(struct relayd *);
61 int parent_dispatch_pfe(int, struct privsep_proc *, struct imsg *);
62 int parent_dispatch_hce(int, struct privsep_proc *, struct imsg *);
63 int parent_dispatch_relay(int, struct privsep_proc *,
64 struct imsg *);
65 int parent_dispatch_ca(int, struct privsep_proc *,
66 struct imsg *);
67 int bindany(struct ctl_bindany *);
68 void parent_tls_ticket_rekey(int, short, void *);
69
70 struct relayd *relayd_env;
71
72 static struct privsep_proc procs[] = {
73 { "pfe", PROC_PFE, parent_dispatch_pfe, pfe },
74 { "hce", PROC_HCE, parent_dispatch_hce, hce },
75 { "relay", PROC_RELAY, parent_dispatch_relay, relay },
76 { "ca", PROC_CA, parent_dispatch_ca, ca }
77 };
78
79 enum privsep_procid privsep_process;
80
81 void
parent_sig_handler(int sig,short event,void * arg)82 parent_sig_handler(int sig, short event, void *arg)
83 {
84 struct privsep *ps = arg;
85
86 switch (sig) {
87 case SIGTERM:
88 case SIGINT:
89 parent_shutdown(ps->ps_env);
90 break;
91 case SIGHUP:
92 log_info("%s: reload requested with SIGHUP", __func__);
93
94 /*
95 * This is safe because libevent uses async signal handlers
96 * that run in the event loop and not in signal context.
97 */
98 parent_reload(ps->ps_env, CONFIG_RELOAD, NULL);
99 break;
100 case SIGPIPE:
101 case SIGUSR1:
102 /* ignore */
103 break;
104 default:
105 fatalx("unexpected signal");
106 }
107 }
108
109 __dead void
usage(void)110 usage(void)
111 {
112 extern char *__progname;
113
114 fprintf(stderr, "usage: %s [-dnv] [-D macro=value] [-f file]\n",
115 __progname);
116 exit(1);
117 }
118
119 int
main(int argc,char * argv[])120 main(int argc, char *argv[])
121 {
122 int c;
123 int debug = 0, verbose = 0;
124 u_int32_t opts = 0;
125 struct relayd *env;
126 struct privsep *ps;
127 const char *conffile = CONF_FILE;
128 enum privsep_procid proc_id = PROC_PARENT;
129 int proc_instance = 0;
130 const char *errp, *title = NULL;
131 int argc0 = argc;
132
133 while ((c = getopt(argc, argv, "dD:nI:P:f:v")) != -1) {
134 switch (c) {
135 case 'd':
136 debug = 2;
137 break;
138 case 'D':
139 if (cmdline_symset(optarg) < 0)
140 log_warnx("could not parse macro definition %s",
141 optarg);
142 break;
143 case 'n':
144 debug = 2;
145 opts |= RELAYD_OPT_NOACTION;
146 break;
147 case 'f':
148 conffile = optarg;
149 break;
150 case 'v':
151 verbose++;
152 opts |= RELAYD_OPT_VERBOSE;
153 break;
154 case 'P':
155 title = optarg;
156 proc_id = proc_getid(procs, nitems(procs), title);
157 if (proc_id == PROC_MAX)
158 fatalx("invalid process name");
159 break;
160 case 'I':
161 proc_instance = strtonum(optarg, 0,
162 PROC_MAX_INSTANCES, &errp);
163 if (errp)
164 fatalx("invalid process instance");
165 break;
166 default:
167 usage();
168 }
169 }
170
171 /* log to stderr until daemonized */
172 log_init(debug ? debug : 1, LOG_DAEMON);
173
174 argc -= optind;
175 if (argc > 0)
176 usage();
177
178 if ((env = calloc(1, sizeof(*env))) == NULL ||
179 (ps = calloc(1, sizeof(*ps))) == NULL)
180 exit(1);
181
182 relayd_env = env;
183 env->sc_ps = ps;
184 ps->ps_env = env;
185 TAILQ_INIT(&ps->ps_rcsocks);
186 env->sc_conffile = conffile;
187 env->sc_conf.opts = opts;
188 TAILQ_INIT(&env->sc_hosts);
189 TAILQ_INIT(&env->sc_sessions);
190 env->sc_rtable = getrtable();
191 /* initialize the TLS session id to a random key for all relay procs */
192 arc4random_buf(env->sc_conf.tls_sid, sizeof(env->sc_conf.tls_sid));
193
194 if (parse_config(env->sc_conffile, env) == -1)
195 exit(1);
196
197 if (debug)
198 env->sc_conf.opts |= RELAYD_OPT_LOGUPDATE;
199
200 if (geteuid())
201 errx(1, "need root privileges");
202
203 if ((ps->ps_pw = getpwnam(RELAYD_USER)) == NULL)
204 errx(1, "unknown user %s", RELAYD_USER);
205
206 log_init(debug, LOG_DAEMON);
207 log_setverbose(verbose);
208
209 if (env->sc_conf.opts & RELAYD_OPT_NOACTION)
210 ps->ps_noaction = 1;
211
212 ps->ps_instances[PROC_RELAY] = env->sc_conf.prefork_relay;
213 ps->ps_instances[PROC_CA] = env->sc_conf.prefork_relay;
214 ps->ps_instance = proc_instance;
215 if (title != NULL)
216 ps->ps_title[proc_id] = title;
217
218 /* only the parent returns */
219 proc_init(ps, procs, nitems(procs), debug, argc0, argv, proc_id);
220
221 log_procinit("parent");
222
223 if (ps->ps_noaction == 0)
224 log_info("startup");
225
226 if (unveil("/", "rx") == -1)
227 err(1, "unveil /");
228 if (env->sc_conf.flags & F_AGENTX) {
229 if (unveil(env->sc_conf.agentx_path, "w") == -1)
230 err(1, "unveil %s", env->sc_conf.agentx_path);
231 } else {
232 if (unveil(AGENTX_MASTER_PATH, "w") == -1)
233 err(1, "unveil %s", env->sc_conf.agentx_path);
234 }
235 if (unveil(NULL, NULL) == -1)
236 err(1, "unveil");
237
238 event_init();
239
240 signal_set(&ps->ps_evsigint, SIGINT, parent_sig_handler, ps);
241 signal_set(&ps->ps_evsigterm, SIGTERM, parent_sig_handler, ps);
242 signal_set(&ps->ps_evsighup, SIGHUP, parent_sig_handler, ps);
243 signal_set(&ps->ps_evsigpipe, SIGPIPE, parent_sig_handler, ps);
244 signal_set(&ps->ps_evsigusr1, SIGUSR1, parent_sig_handler, ps);
245
246 signal_add(&ps->ps_evsigint, NULL);
247 signal_add(&ps->ps_evsigterm, NULL);
248 signal_add(&ps->ps_evsighup, NULL);
249 signal_add(&ps->ps_evsigpipe, NULL);
250 signal_add(&ps->ps_evsigusr1, NULL);
251
252 proc_connect(ps);
253
254 relay_http(NULL);
255 if (load_config(env->sc_conffile, env) == -1) {
256 proc_kill(env->sc_ps);
257 exit(1);
258 }
259
260 if (env->sc_conf.opts & RELAYD_OPT_NOACTION) {
261 fprintf(stderr, "configuration OK\n");
262 proc_kill(env->sc_ps);
263 exit(0);
264 }
265
266 /* rekey the TLS tickets before pushing the config */
267 parent_tls_ticket_rekey(0, 0, env);
268 if (parent_configure(env) == -1)
269 fatalx("configuration failed");
270
271 init_routes(env);
272
273 event_dispatch();
274
275 parent_shutdown(env);
276 /* NOTREACHED */
277
278 return (0);
279 }
280
281 int
parent_configure(struct relayd * env)282 parent_configure(struct relayd *env)
283 {
284 struct table *tb;
285 struct rdr *rdr;
286 struct router *rt;
287 struct protocol *proto;
288 struct relay *rlay;
289 int id;
290 int ret = -1;
291
292 TAILQ_FOREACH(tb, env->sc_tables, entry)
293 config_settable(env, tb);
294 TAILQ_FOREACH(rdr, env->sc_rdrs, entry)
295 config_setrdr(env, rdr);
296 TAILQ_FOREACH(rt, env->sc_rts, rt_entry)
297 config_setrt(env, rt);
298 TAILQ_FOREACH(proto, env->sc_protos, entry)
299 config_setproto(env, proto);
300 TAILQ_FOREACH(proto, env->sc_protos, entry)
301 config_setrule(env, proto);
302 TAILQ_FOREACH(rlay, env->sc_relays, rl_entry) {
303 /* Check for TLS Inspection */
304 if ((rlay->rl_conf.flags & (F_TLS|F_TLSCLIENT)) ==
305 (F_TLS|F_TLSCLIENT) && rlay->rl_tls_cacert_fd != -1)
306 rlay->rl_conf.flags |= F_TLSINSPECT;
307
308 config_setrelay(env, rlay);
309 }
310
311 /* HCE, PFE, CA and the relays need to reload their config. */
312 env->sc_reload = 2 + (2 * env->sc_conf.prefork_relay);
313
314 for (id = 0; id < PROC_MAX; id++) {
315 if (id == privsep_process)
316 continue;
317 proc_compose_imsg(env->sc_ps, id, -1, IMSG_CFG_DONE, -1,
318 -1, &env->sc_conf, sizeof(env->sc_conf));
319 }
320
321 ret = 0;
322
323 config_purge(env, CONFIG_ALL & ~CONFIG_RELAYS);
324 return (ret);
325 }
326
327 void
parent_reload(struct relayd * env,u_int reset,const char * filename)328 parent_reload(struct relayd *env, u_int reset, const char *filename)
329 {
330 if (env->sc_reload) {
331 log_debug("%s: already in progress: %d pending",
332 __func__, env->sc_reload);
333 return;
334 }
335
336 /* Switch back to the default config file */
337 if (filename == NULL || *filename == '\0')
338 filename = env->sc_conffile;
339
340 log_debug("%s: level %d config file %s", __func__, reset, filename);
341
342 config_purge(env, CONFIG_ALL);
343
344 if (reset == CONFIG_RELOAD) {
345 if (load_config(filename, env) == -1) {
346 log_debug("%s: failed to load config file %s",
347 __func__, filename);
348 }
349
350 config_setreset(env, CONFIG_ALL);
351
352 if (parent_configure(env) == -1) {
353 log_debug("%s: failed to commit config from %s",
354 __func__, filename);
355 }
356 } else
357 config_setreset(env, reset);
358 }
359
360 void
parent_configure_done(struct relayd * env)361 parent_configure_done(struct relayd *env)
362 {
363 int id;
364
365 if (env->sc_reload == 0) {
366 log_warnx("%s: configuration already finished", __func__);
367 return;
368 }
369
370 env->sc_reload--;
371 if (env->sc_reload == 0) {
372 for (id = 0; id < PROC_MAX; id++) {
373 if (id == privsep_process)
374 continue;
375
376 proc_compose(env->sc_ps, id, IMSG_CTL_START, NULL, 0);
377 }
378 }
379 }
380
381 void
parent_shutdown(struct relayd * env)382 parent_shutdown(struct relayd *env)
383 {
384 config_purge(env, CONFIG_ALL);
385
386 proc_kill(env->sc_ps);
387 control_cleanup(&env->sc_ps->ps_csock);
388 carp_demote_shutdown();
389
390 free(env->sc_ps);
391 free(env);
392
393 log_info("parent terminating, pid %d", getpid());
394
395 exit(0);
396 }
397
398 int
parent_dispatch_pfe(int fd,struct privsep_proc * p,struct imsg * imsg)399 parent_dispatch_pfe(int fd, struct privsep_proc *p, struct imsg *imsg)
400 {
401 struct privsep *ps = p->p_ps;
402 struct relayd *env = ps->ps_env;
403 struct ctl_demote demote;
404 struct ctl_netroute crt;
405 u_int v;
406 char *str = NULL;
407
408 switch (imsg->hdr.type) {
409 case IMSG_DEMOTE:
410 IMSG_SIZE_CHECK(imsg, &demote);
411 memcpy(&demote, imsg->data, sizeof(demote));
412 carp_demote_set(demote.group, demote.level);
413 break;
414 case IMSG_RTMSG:
415 IMSG_SIZE_CHECK(imsg, &crt);
416 memcpy(&crt, imsg->data, sizeof(crt));
417 pfe_route(env, &crt);
418 break;
419 case IMSG_CTL_RESET:
420 IMSG_SIZE_CHECK(imsg, &v);
421 memcpy(&v, imsg->data, sizeof(v));
422 parent_reload(env, v, NULL);
423 break;
424 case IMSG_CTL_RELOAD:
425 if (IMSG_DATA_SIZE(imsg) > 0)
426 str = get_string(imsg->data, IMSG_DATA_SIZE(imsg));
427 parent_reload(env, CONFIG_RELOAD, str);
428 free(str);
429 break;
430 case IMSG_CTL_SHUTDOWN:
431 parent_shutdown(env);
432 break;
433 case IMSG_CFG_DONE:
434 parent_configure_done(env);
435 break;
436 case IMSG_AGENTXSOCK:
437 agentx_setsock(env, p->p_id);
438 break;
439 default:
440 return (-1);
441 }
442
443 return (0);
444 }
445
446 int
parent_dispatch_hce(int fd,struct privsep_proc * p,struct imsg * imsg)447 parent_dispatch_hce(int fd, struct privsep_proc *p, struct imsg *imsg)
448 {
449 struct privsep *ps = p->p_ps;
450 struct relayd *env = ps->ps_env;
451 struct ctl_script scr;
452
453 switch (imsg->hdr.type) {
454 case IMSG_SCRIPT:
455 IMSG_SIZE_CHECK(imsg, &scr);
456 bcopy(imsg->data, &scr, sizeof(scr));
457 scr.retval = script_exec(env, &scr);
458 proc_compose(ps, PROC_HCE, IMSG_SCRIPT, &scr, sizeof(scr));
459 break;
460 case IMSG_CFG_DONE:
461 parent_configure_done(env);
462 break;
463 default:
464 return (-1);
465 }
466
467 return (0);
468 }
469
470 int
parent_dispatch_relay(int fd,struct privsep_proc * p,struct imsg * imsg)471 parent_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
472 {
473 struct privsep *ps = p->p_ps;
474 struct relayd *env = ps->ps_env;
475 struct ctl_bindany bnd;
476 int s;
477
478 switch (imsg->hdr.type) {
479 case IMSG_BINDANY:
480 IMSG_SIZE_CHECK(imsg, &bnd);
481 bcopy(imsg->data, &bnd, sizeof(bnd));
482 if (bnd.bnd_proc > env->sc_conf.prefork_relay)
483 fatalx("%s: invalid relay proc", __func__);
484 switch (bnd.bnd_proto) {
485 case IPPROTO_TCP:
486 case IPPROTO_UDP:
487 break;
488 default:
489 fatalx("%s: requested socket "
490 "for invalid protocol", __func__);
491 /* NOTREACHED */
492 }
493 s = bindany(&bnd);
494 proc_compose_imsg(ps, PROC_RELAY, bnd.bnd_proc,
495 IMSG_BINDANY, -1, s, &bnd.bnd_id, sizeof(bnd.bnd_id));
496 break;
497 case IMSG_CFG_DONE:
498 parent_configure_done(env);
499 break;
500 default:
501 return (-1);
502 }
503
504 return (0);
505 }
506
507 int
parent_dispatch_ca(int fd,struct privsep_proc * p,struct imsg * imsg)508 parent_dispatch_ca(int fd, struct privsep_proc *p, struct imsg *imsg)
509 {
510 struct privsep *ps = p->p_ps;
511 struct relayd *env = ps->ps_env;
512
513 switch (imsg->hdr.type) {
514 case IMSG_CFG_DONE:
515 parent_configure_done(env);
516 break;
517 default:
518 return (-1);
519 }
520
521 return (0);
522 }
523
524 void
purge_table(struct relayd * env,struct tablelist * head,struct table * table)525 purge_table(struct relayd *env, struct tablelist *head, struct table *table)
526 {
527 struct host *host;
528
529 while ((host = TAILQ_FIRST(&table->hosts)) != NULL) {
530 TAILQ_REMOVE(&table->hosts, host, entry);
531 TAILQ_REMOVE(&env->sc_hosts, host, globalentry);
532 if (event_initialized(&host->cte.ev)) {
533 event_del(&host->cte.ev);
534 close(host->cte.s);
535 }
536 ibuf_free(host->cte.buf);
537 tls_free(host->cte.tls);
538 free(host);
539 }
540 free(table->sendbuf);
541 ibuf_free(table->sendbinbuf);
542 tls_config_free(table->tls_cfg);
543
544 if (head != NULL)
545 TAILQ_REMOVE(head, table, entry);
546 free(table);
547 }
548
549 void
purge_key(char ** key,off_t len)550 purge_key(char **key, off_t len)
551 {
552 freezero(*key, len);
553
554 *key = NULL;
555 }
556
557 void
purge_relay(struct relayd * env,struct relay * rlay)558 purge_relay(struct relayd *env, struct relay *rlay)
559 {
560 struct rsession *con;
561 struct relay_table *rlt;
562 struct relay_cert *cert, *tmpcert;
563
564 /* shutdown and remove relay */
565 if (event_initialized(&rlay->rl_ev))
566 event_del(&rlay->rl_ev);
567 close(rlay->rl_s);
568 TAILQ_REMOVE(env->sc_relays, rlay, rl_entry);
569
570 /* cleanup sessions */
571 while ((con =
572 SPLAY_ROOT(&rlay->rl_sessions)) != NULL)
573 relay_close(con, NULL, 0);
574
575 /* cleanup relay */
576 if (rlay->rl_bev != NULL)
577 bufferevent_free(rlay->rl_bev);
578 if (rlay->rl_dstbev != NULL)
579 bufferevent_free(rlay->rl_dstbev);
580
581 purge_key(&rlay->rl_tls_cakey, rlay->rl_conf.tls_cakey_len);
582
583 if (rlay->rl_tls_pkey != NULL) {
584 EVP_PKEY_free(rlay->rl_tls_pkey);
585 rlay->rl_tls_pkey = NULL;
586 }
587 if (rlay->rl_tls_cacertx509 != NULL) {
588 X509_free(rlay->rl_tls_cacertx509);
589 rlay->rl_tls_cacertx509 = NULL;
590 }
591 if (rlay->rl_tls_capkey != NULL) {
592 EVP_PKEY_free(rlay->rl_tls_capkey);
593 rlay->rl_tls_capkey = NULL;
594 }
595
596 tls_free(rlay->rl_tls_ctx);
597 tls_config_free(rlay->rl_tls_cfg);
598 tls_config_free(rlay->rl_tls_client_cfg);
599
600 while ((rlt = TAILQ_FIRST(&rlay->rl_tables))) {
601 TAILQ_REMOVE(&rlay->rl_tables, rlt, rlt_entry);
602 free(rlt);
603 }
604
605 TAILQ_FOREACH_SAFE(cert, env->sc_certs, cert_entry, tmpcert) {
606 if (rlay->rl_conf.id != cert->cert_relayid)
607 continue;
608 if (cert->cert_fd != -1)
609 close(cert->cert_fd);
610 if (cert->cert_key_fd != -1)
611 close(cert->cert_key_fd);
612 if (cert->cert_ocsp_fd != -1)
613 close(cert->cert_ocsp_fd);
614 if (cert->cert_pkey != NULL)
615 EVP_PKEY_free(cert->cert_pkey);
616 TAILQ_REMOVE(env->sc_certs, cert, cert_entry);
617 free(cert);
618 }
619
620 free(rlay);
621 }
622
623 struct kv *
kv_add(struct kvtree * keys,char * key,char * value,int unique)624 kv_add(struct kvtree *keys, char *key, char *value, int unique)
625 {
626 struct kv *kv, *oldkv;
627
628 if (key == NULL)
629 return (NULL);
630 if ((kv = calloc(1, sizeof(*kv))) == NULL)
631 return (NULL);
632 if ((kv->kv_key = strdup(key)) == NULL)
633 goto fail;
634 if (value != NULL &&
635 (kv->kv_value = strdup(value)) == NULL)
636 goto fail;
637 TAILQ_INIT(&kv->kv_children);
638
639 if ((oldkv = RB_INSERT(kvtree, keys, kv)) != NULL) {
640 /*
641 * return error if the key should occur only once,
642 * or add it to a list attached to the key's node.
643 */
644 if (unique)
645 goto fail;
646 TAILQ_INSERT_TAIL(&oldkv->kv_children, kv, kv_entry);
647 kv->kv_parent = oldkv;
648 }
649
650 return (kv);
651 fail:
652 free(kv->kv_key);
653 free(kv->kv_value);
654 free(kv);
655 return (NULL);
656 }
657
658 int
kv_set(struct kv * kv,char * fmt,...)659 kv_set(struct kv *kv, char *fmt, ...)
660 {
661 va_list ap;
662 char *value = NULL;
663 struct kv *ckv;
664 int ret;
665
666 va_start(ap, fmt);
667 ret = vasprintf(&value, fmt, ap);
668 va_end(ap);
669 if (ret == -1)
670 return (-1);
671
672 /* Remove all children */
673 while ((ckv = TAILQ_FIRST(&kv->kv_children)) != NULL) {
674 TAILQ_REMOVE(&kv->kv_children, ckv, kv_entry);
675 kv_free(ckv);
676 free(ckv);
677 }
678
679 /* Set the new value */
680 free(kv->kv_value);
681 kv->kv_value = value;
682
683 return (0);
684 }
685
686 int
kv_setkey(struct kv * kv,char * fmt,...)687 kv_setkey(struct kv *kv, char *fmt, ...)
688 {
689 va_list ap;
690 char *key = NULL;
691 int ret;
692
693 va_start(ap, fmt);
694 ret = vasprintf(&key, fmt, ap);
695 va_end(ap);
696 if (ret == -1)
697 return (-1);
698
699 free(kv->kv_key);
700 kv->kv_key = key;
701
702 return (0);
703 }
704
705 void
kv_delete(struct kvtree * keys,struct kv * kv)706 kv_delete(struct kvtree *keys, struct kv *kv)
707 {
708 struct kv *ckv;
709
710 RB_REMOVE(kvtree, keys, kv);
711
712 /* Remove all children */
713 while ((ckv = TAILQ_FIRST(&kv->kv_children)) != NULL) {
714 TAILQ_REMOVE(&kv->kv_children, ckv, kv_entry);
715 kv_free(ckv);
716 free(ckv);
717 }
718
719 kv_free(kv);
720 free(kv);
721 }
722
723 struct kv *
kv_extend(struct kvtree * keys,struct kv * kv,char * value)724 kv_extend(struct kvtree *keys, struct kv *kv, char *value)
725 {
726 char *newvalue;
727
728 if (kv == NULL) {
729 return (NULL);
730 } else if (kv->kv_value != NULL) {
731 if (asprintf(&newvalue, "%s%s", kv->kv_value, value) == -1)
732 return (NULL);
733
734 free(kv->kv_value);
735 kv->kv_value = newvalue;
736 } else if ((kv->kv_value = strdup(value)) == NULL)
737 return (NULL);
738
739 return (kv);
740 }
741
742 void
kv_purge(struct kvtree * keys)743 kv_purge(struct kvtree *keys)
744 {
745 struct kv *kv;
746
747 while ((kv = RB_MIN(kvtree, keys)) != NULL)
748 kv_delete(keys, kv);
749 }
750
751 void
kv_free(struct kv * kv)752 kv_free(struct kv *kv)
753 {
754 /*
755 * This function does not clear memory referenced by
756 * kv_children or stuff on the tailqs. Use kv_delete() instead.
757 */
758
759 free(kv->kv_key);
760 free(kv->kv_value);
761 memset(kv, 0, sizeof(*kv));
762 }
763
764 struct kv *
kv_inherit(struct kv * dst,struct kv * src)765 kv_inherit(struct kv *dst, struct kv *src)
766 {
767 memset(dst, 0, sizeof(*dst));
768 memcpy(dst, src, sizeof(*dst));
769 TAILQ_INIT(&dst->kv_children);
770
771 if (src->kv_key != NULL) {
772 if ((dst->kv_key = strdup(src->kv_key)) == NULL) {
773 kv_free(dst);
774 return (NULL);
775 }
776 }
777 if (src->kv_value != NULL) {
778 if ((dst->kv_value = strdup(src->kv_value)) == NULL) {
779 kv_free(dst);
780 return (NULL);
781 }
782 }
783
784 if (src->kv_match != NULL)
785 dst->kv_match = src->kv_match;
786 if (src->kv_matchtree != NULL)
787 dst->kv_matchtree = src->kv_matchtree;
788
789 return (dst);
790 }
791
792 int
kv_log(struct rsession * con,struct kv * kv,u_int16_t labelid,enum direction dir)793 kv_log(struct rsession *con, struct kv *kv, u_int16_t labelid,
794 enum direction dir)
795 {
796 char *msg;
797
798 if (con->se_log == NULL)
799 return (0);
800 if (asprintf(&msg, " %s%s%s%s%s%s%s",
801 dir == RELAY_DIR_REQUEST ? "[" : "{",
802 labelid == 0 ? "" : label_id2name(labelid),
803 labelid == 0 ? "" : ", ",
804 kv->kv_key == NULL ? "(unknown)" : kv->kv_key,
805 kv->kv_value == NULL ? "" : ": ",
806 kv->kv_value == NULL ? "" : kv->kv_value,
807 dir == RELAY_DIR_REQUEST ? "]" : "}") == -1)
808 return (-1);
809 if (evbuffer_add(con->se_log, msg, strlen(msg)) == -1) {
810 free(msg);
811 return (-1);
812 }
813 free(msg);
814 con->se_haslog = 1;
815 return (0);
816 }
817
818 struct kv *
kv_find(struct kvtree * keys,struct kv * kv)819 kv_find(struct kvtree *keys, struct kv *kv)
820 {
821 struct kv *match;
822 const char *key;
823
824 if (kv->kv_flags & KV_FLAG_GLOBBING) {
825 /* Test header key using shell globbing rules */
826 key = kv->kv_key == NULL ? "" : kv->kv_key;
827 RB_FOREACH(match, kvtree, keys) {
828 if (fnmatch(key, match->kv_key, FNM_CASEFOLD) == 0)
829 break;
830 }
831 } else {
832 /* Fast tree-based lookup only works without globbing */
833 match = RB_FIND(kvtree, keys, kv);
834 }
835
836 return (match);
837 }
838
839 struct kv *
kv_find_value(struct kvtree * keys,char * key,const char * value,const char * delim)840 kv_find_value(struct kvtree *keys, char *key, const char *value,
841 const char *delim)
842 {
843 struct kv *match, kv;
844 char *val = NULL, *next, *ptr;
845 size_t len;
846
847 kv.kv_key = key;
848 if ((match = RB_FIND(kvtree, keys, &kv)) == NULL)
849 return (NULL);
850
851 if (match->kv_value == NULL)
852 return (NULL);
853
854 if (delim == NULL) {
855 if (strcasecmp(match->kv_value, value) == 0)
856 goto done;
857 } else {
858 if ((val = strdup(match->kv_value)) == NULL)
859 return (NULL);
860 for (next = ptr = val; ptr != NULL;
861 ptr = strsep(&next, delim)) {
862 /* strip whitespace */
863 ptr += strspn(ptr, " \t");
864 len = strcspn(ptr, " \t");
865 if (strncasecmp(ptr, value, len) == 0)
866 goto done;
867 }
868 }
869
870 /* not matched */
871 match = NULL;
872 done:
873 #ifdef DEBUG
874 if (match != NULL)
875 DPRINTF("%s: matched %s: %s", __func__, key, value);
876 #endif
877 free(val);
878 return (match);
879 }
880
881 int
kv_cmp(struct kv * a,struct kv * b)882 kv_cmp(struct kv *a, struct kv *b)
883 {
884 return (strcasecmp(a->kv_key, b->kv_key));
885 }
886
887 RB_GENERATE(kvtree, kv, kv_node, kv_cmp);
888
889 int
rule_add(struct protocol * proto,struct relay_rule * rule,const char * rulefile)890 rule_add(struct protocol *proto, struct relay_rule *rule, const char *rulefile)
891 {
892 struct relay_rule *r = NULL;
893 struct kv *kv = NULL;
894 FILE *fp = NULL;
895 char buf[BUFSIZ];
896 int ret = -1;
897 u_int i;
898
899 for (i = 0; i < KEY_TYPE_MAX; i++) {
900 kv = &rule->rule_kv[i];
901 if (kv->kv_type != i)
902 continue;
903
904 switch (kv->kv_option) {
905 case KEY_OPTION_LOG:
906 /* log action needs a key or a file to be specified */
907 if (kv->kv_key == NULL && rulefile == NULL &&
908 (kv->kv_key = strdup("*")) == NULL)
909 goto fail;
910 break;
911 default:
912 break;
913 }
914
915 switch (kv->kv_type) {
916 case KEY_TYPE_QUERY:
917 case KEY_TYPE_PATH:
918 case KEY_TYPE_URL:
919 if (rule->rule_dir != RELAY_DIR_REQUEST)
920 goto fail;
921 break;
922 default:
923 break;
924 }
925
926 if (kv->kv_value != NULL && strchr(kv->kv_value, '$') != NULL)
927 kv->kv_flags |= KV_FLAG_MACRO;
928 if (kv->kv_key != NULL && strpbrk(kv->kv_key, "*?[") != NULL)
929 kv->kv_flags |= KV_FLAG_GLOBBING;
930 }
931
932 if (rulefile == NULL) {
933 TAILQ_INSERT_TAIL(&proto->rules, rule, rule_entry);
934 return (0);
935 }
936
937 if ((fp = fopen(rulefile, "r")) == NULL)
938 goto fail;
939
940 while (fgets(buf, sizeof(buf), fp) != NULL) {
941 /* strip whitespace and newline characters */
942 buf[strcspn(buf, "\r\n\t ")] = '\0';
943 if (!strlen(buf) || buf[0] == '#')
944 continue;
945
946 if ((r = rule_inherit(rule)) == NULL)
947 goto fail;
948
949 for (i = 0; i < KEY_TYPE_MAX; i++) {
950 kv = &r->rule_kv[i];
951 if (kv->kv_type != i)
952 continue;
953 free(kv->kv_key);
954 if ((kv->kv_key = strdup(buf)) == NULL) {
955 rule_free(r);
956 free(r);
957 goto fail;
958 }
959 }
960
961 TAILQ_INSERT_TAIL(&proto->rules, r, rule_entry);
962 }
963
964 ret = 0;
965 rule_free(rule);
966 free(rule);
967
968 fail:
969 if (fp != NULL)
970 fclose(fp);
971 return (ret);
972 }
973
974 struct relay_rule *
rule_inherit(struct relay_rule * rule)975 rule_inherit(struct relay_rule *rule)
976 {
977 struct relay_rule *r;
978 u_int i;
979 struct kv *kv;
980
981 if ((r = calloc(1, sizeof(*r))) == NULL)
982 return (NULL);
983 memcpy(r, rule, sizeof(*r));
984
985 for (i = 0; i < KEY_TYPE_MAX; i++) {
986 kv = &rule->rule_kv[i];
987 if (kv->kv_type != i)
988 continue;
989 if (kv_inherit(&r->rule_kv[i], kv) == NULL) {
990 free(r);
991 return (NULL);
992 }
993 }
994
995 if (r->rule_label > 0)
996 label_ref(r->rule_label);
997 if (r->rule_tag > 0)
998 tag_ref(r->rule_tag);
999 if (r->rule_tagged > 0)
1000 tag_ref(r->rule_tagged);
1001
1002 return (r);
1003 }
1004
1005 void
rule_free(struct relay_rule * rule)1006 rule_free(struct relay_rule *rule)
1007 {
1008 u_int i;
1009
1010 for (i = 0; i < KEY_TYPE_MAX; i++)
1011 kv_free(&rule->rule_kv[i]);
1012 if (rule->rule_label > 0)
1013 label_unref(rule->rule_label);
1014 if (rule->rule_tag > 0)
1015 tag_unref(rule->rule_tag);
1016 if (rule->rule_tagged > 0)
1017 tag_unref(rule->rule_tagged);
1018 }
1019
1020 void
rule_delete(struct relay_rules * rules,struct relay_rule * rule)1021 rule_delete(struct relay_rules *rules, struct relay_rule *rule)
1022 {
1023 TAILQ_REMOVE(rules, rule, rule_entry);
1024 rule_free(rule);
1025 free(rule);
1026 }
1027
1028 void
rule_settable(struct relay_rules * rules,struct relay_table * rlt)1029 rule_settable(struct relay_rules *rules, struct relay_table *rlt)
1030 {
1031 struct relay_rule *r;
1032 char pname[TABLE_NAME_SIZE];
1033
1034 if (rlt->rlt_table == NULL || strlcpy(pname, rlt->rlt_table->conf.name,
1035 sizeof(pname)) >= sizeof(pname))
1036 return;
1037
1038 pname[strcspn(pname, ":")] = '\0';
1039
1040 TAILQ_FOREACH(r, rules, rule_entry) {
1041 if (r->rule_tablename[0] &&
1042 strcmp(pname, r->rule_tablename) == 0)
1043 r->rule_table = rlt;
1044 }
1045 }
1046
1047 /*
1048 * Utility functions
1049 */
1050
1051 struct host *
host_find(struct relayd * env,objid_t id)1052 host_find(struct relayd *env, objid_t id)
1053 {
1054 struct table *table;
1055 struct host *host;
1056
1057 TAILQ_FOREACH(table, env->sc_tables, entry)
1058 TAILQ_FOREACH(host, &table->hosts, entry)
1059 if (host->conf.id == id)
1060 return (host);
1061 return (NULL);
1062 }
1063
1064 struct table *
table_find(struct relayd * env,objid_t id)1065 table_find(struct relayd *env, objid_t id)
1066 {
1067 struct table *table;
1068
1069 TAILQ_FOREACH(table, env->sc_tables, entry)
1070 if (table->conf.id == id)
1071 return (table);
1072 return (NULL);
1073 }
1074
1075 struct rdr *
rdr_find(struct relayd * env,objid_t id)1076 rdr_find(struct relayd *env, objid_t id)
1077 {
1078 struct rdr *rdr;
1079
1080 TAILQ_FOREACH(rdr, env->sc_rdrs, entry)
1081 if (rdr->conf.id == id)
1082 return (rdr);
1083 return (NULL);
1084 }
1085
1086 struct relay *
relay_find(struct relayd * env,objid_t id)1087 relay_find(struct relayd *env, objid_t id)
1088 {
1089 struct relay *rlay;
1090
1091 TAILQ_FOREACH(rlay, env->sc_relays, rl_entry)
1092 if (rlay->rl_conf.id == id)
1093 return (rlay);
1094 return (NULL);
1095 }
1096
1097 struct protocol *
proto_find(struct relayd * env,objid_t id)1098 proto_find(struct relayd *env, objid_t id)
1099 {
1100 struct protocol *p;
1101
1102 TAILQ_FOREACH(p, env->sc_protos, entry)
1103 if (p->id == id)
1104 return (p);
1105 return (NULL);
1106 }
1107
1108 struct rsession *
session_find(struct relayd * env,objid_t id)1109 session_find(struct relayd *env, objid_t id)
1110 {
1111 struct relay *rlay;
1112 struct rsession *con;
1113
1114 TAILQ_FOREACH(rlay, env->sc_relays, rl_entry)
1115 SPLAY_FOREACH(con, session_tree, &rlay->rl_sessions)
1116 if (con->se_id == id)
1117 return (con);
1118 return (NULL);
1119 }
1120
1121 struct netroute *
route_find(struct relayd * env,objid_t id)1122 route_find(struct relayd *env, objid_t id)
1123 {
1124 struct netroute *nr;
1125
1126 TAILQ_FOREACH(nr, env->sc_routes, nr_route)
1127 if (nr->nr_conf.id == id)
1128 return (nr);
1129 return (NULL);
1130 }
1131
1132 struct router *
router_find(struct relayd * env,objid_t id)1133 router_find(struct relayd *env, objid_t id)
1134 {
1135 struct router *rt;
1136
1137 TAILQ_FOREACH(rt, env->sc_rts, rt_entry)
1138 if (rt->rt_conf.id == id)
1139 return (rt);
1140 return (NULL);
1141 }
1142
1143 struct host *
host_findbyname(struct relayd * env,const char * name)1144 host_findbyname(struct relayd *env, const char *name)
1145 {
1146 struct table *table;
1147 struct host *host;
1148
1149 TAILQ_FOREACH(table, env->sc_tables, entry)
1150 TAILQ_FOREACH(host, &table->hosts, entry)
1151 if (strcmp(host->conf.name, name) == 0)
1152 return (host);
1153 return (NULL);
1154 }
1155
1156 struct table *
table_findbyname(struct relayd * env,const char * name)1157 table_findbyname(struct relayd *env, const char *name)
1158 {
1159 struct table *table;
1160
1161 TAILQ_FOREACH(table, env->sc_tables, entry)
1162 if (strcmp(table->conf.name, name) == 0)
1163 return (table);
1164 return (NULL);
1165 }
1166
1167 struct table *
table_findbyconf(struct relayd * env,struct table * tb)1168 table_findbyconf(struct relayd *env, struct table *tb)
1169 {
1170 struct table *table;
1171 struct table_config a, b;
1172
1173 bcopy(&tb->conf, &a, sizeof(a));
1174 a.id = a.rdrid = 0;
1175 a.flags &= ~(F_USED|F_BACKUP);
1176
1177 TAILQ_FOREACH(table, env->sc_tables, entry) {
1178 bcopy(&table->conf, &b, sizeof(b));
1179 b.id = b.rdrid = 0;
1180 b.flags &= ~(F_USED|F_BACKUP);
1181
1182 /*
1183 * Compare two tables and return the existing table if
1184 * the configuration seems to be the same.
1185 */
1186 if (bcmp(&a, &b, sizeof(b)) == 0 &&
1187 ((tb->sendbuf == NULL && table->sendbuf == NULL) ||
1188 (tb->sendbuf != NULL && table->sendbuf != NULL &&
1189 strcmp(tb->sendbuf, table->sendbuf) == 0)))
1190 return (table);
1191 }
1192 return (NULL);
1193 }
1194
1195 struct rdr *
rdr_findbyname(struct relayd * env,const char * name)1196 rdr_findbyname(struct relayd *env, const char *name)
1197 {
1198 struct rdr *rdr;
1199
1200 TAILQ_FOREACH(rdr, env->sc_rdrs, entry)
1201 if (strcmp(rdr->conf.name, name) == 0)
1202 return (rdr);
1203 return (NULL);
1204 }
1205
1206 struct relay *
relay_findbyname(struct relayd * env,const char * name)1207 relay_findbyname(struct relayd *env, const char *name)
1208 {
1209 struct relay *rlay;
1210
1211 TAILQ_FOREACH(rlay, env->sc_relays, rl_entry)
1212 if (strcmp(rlay->rl_conf.name, name) == 0)
1213 return (rlay);
1214 return (NULL);
1215 }
1216
1217 struct relay *
relay_findbyaddr(struct relayd * env,struct relay_config * rc)1218 relay_findbyaddr(struct relayd *env, struct relay_config *rc)
1219 {
1220 struct relay *rlay;
1221
1222 TAILQ_FOREACH(rlay, env->sc_relays, rl_entry)
1223 if (bcmp(&rlay->rl_conf.ss, &rc->ss, sizeof(rc->ss)) == 0 &&
1224 rlay->rl_conf.port == rc->port)
1225 return (rlay);
1226 return (NULL);
1227 }
1228
1229 EVP_PKEY *
pkey_find(struct relayd * env,char * hash)1230 pkey_find(struct relayd *env, char * hash)
1231 {
1232 struct ca_pkey *pkey;
1233
1234 TAILQ_FOREACH(pkey, env->sc_pkeys, pkey_entry)
1235 if (strcmp(hash, pkey->pkey_hash) == 0)
1236 return (pkey->pkey);
1237 return (NULL);
1238 }
1239
1240 struct ca_pkey *
pkey_add(struct relayd * env,EVP_PKEY * pkey,char * hash)1241 pkey_add(struct relayd *env, EVP_PKEY *pkey, char *hash)
1242 {
1243 struct ca_pkey *ca_pkey;
1244
1245 if (env->sc_pkeys == NULL)
1246 fatalx("pkeys");
1247
1248 if ((ca_pkey = calloc(1, sizeof(*ca_pkey))) == NULL)
1249 return (NULL);
1250
1251 ca_pkey->pkey = pkey;
1252 if (strlcpy(ca_pkey->pkey_hash, hash, sizeof(ca_pkey->pkey_hash)) >=
1253 sizeof(ca_pkey->pkey_hash)) {
1254 free(ca_pkey);
1255 return (NULL);
1256 }
1257
1258 TAILQ_INSERT_TAIL(env->sc_pkeys, ca_pkey, pkey_entry);
1259
1260 return (ca_pkey);
1261 }
1262
1263 struct relay_cert *
cert_add(struct relayd * env,objid_t id)1264 cert_add(struct relayd *env, objid_t id)
1265 {
1266 static objid_t last_cert_id = 0;
1267 struct relay_cert *cert;
1268
1269 if ((cert = calloc(1, sizeof(*cert))) == NULL)
1270 return (NULL);
1271
1272 if (id == 0)
1273 id = ++last_cert_id;
1274 if (id == INT_MAX) {
1275 log_warnx("too many tls keypairs defined");
1276 free(cert);
1277 return (NULL);
1278 }
1279
1280 cert->cert_id = id;
1281 cert->cert_fd = -1;
1282 cert->cert_key_fd = -1;
1283 cert->cert_ocsp_fd = -1;
1284
1285 TAILQ_INSERT_TAIL(env->sc_certs, cert, cert_entry);
1286
1287 return (cert);
1288 }
1289
1290 struct relay_cert *
cert_find(struct relayd * env,objid_t id)1291 cert_find(struct relayd *env, objid_t id)
1292 {
1293 struct relay_cert *cert;
1294
1295 TAILQ_FOREACH(cert, env->sc_certs, cert_entry)
1296 if (cert->cert_id == id)
1297 return (cert);
1298 return (NULL);
1299 }
1300
1301 char *
relay_load_fd(int fd,off_t * len)1302 relay_load_fd(int fd, off_t *len)
1303 {
1304 char *buf = NULL;
1305 struct stat st;
1306 off_t size;
1307 ssize_t rv;
1308 int err;
1309
1310 if (fstat(fd, &st) != 0)
1311 goto fail;
1312 size = st.st_size;
1313 if ((buf = calloc(1, size + 1)) == NULL)
1314 goto fail;
1315 if ((rv = pread(fd, buf, size, 0)) != size)
1316 goto fail;
1317
1318 close(fd);
1319
1320 *len = size;
1321 return (buf);
1322
1323 fail:
1324 err = errno;
1325 free(buf);
1326 close(fd);
1327 errno = err;
1328 return (NULL);
1329 }
1330
1331 int
relay_load_certfiles(struct relayd * env,struct relay * rlay,const char * name)1332 relay_load_certfiles(struct relayd *env, struct relay *rlay, const char *name)
1333 {
1334 char certfile[PATH_MAX];
1335 char hbuf[PATH_MAX];
1336 struct protocol *proto = rlay->rl_proto;
1337 struct relay_cert *cert;
1338 int useport = htons(rlay->rl_conf.port);
1339 int cert_fd = -1, key_fd = -1, ocsp_fd = -1;
1340
1341 if (rlay->rl_conf.flags & F_TLSCLIENT) {
1342 if (strlen(proto->tlsca) && rlay->rl_tls_ca_fd == -1) {
1343 if ((rlay->rl_tls_ca_fd =
1344 open(proto->tlsca, O_RDONLY)) == -1)
1345 return (-1);
1346 log_debug("%s: using ca %s", __func__, proto->tlsca);
1347 }
1348 if (strlen(proto->tlscacert) && rlay->rl_tls_cacert_fd == -1) {
1349 if ((rlay->rl_tls_cacert_fd =
1350 open(proto->tlscacert, O_RDONLY)) == -1)
1351 return (-1);
1352 log_debug("%s: using ca certificate %s", __func__,
1353 proto->tlscacert);
1354 }
1355 if (strlen(proto->tlscakey) && !rlay->rl_conf.tls_cakey_len &&
1356 proto->tlscapass != NULL) {
1357 if ((rlay->rl_tls_cakey =
1358 ssl_load_key(env, proto->tlscakey,
1359 &rlay->rl_conf.tls_cakey_len,
1360 proto->tlscapass)) == NULL)
1361 return (-1);
1362 log_debug("%s: using ca key %s", __func__,
1363 proto->tlscakey);
1364 }
1365 }
1366
1367 if ((rlay->rl_conf.flags & F_TLS) == 0)
1368 return (0);
1369
1370 if (strlen(proto->tlsclientca) && rlay->rl_tls_client_ca_fd == -1) {
1371 if ((rlay->rl_tls_client_ca_fd =
1372 open(proto->tlsclientca, O_RDONLY)) == -1)
1373 return (-1);
1374 log_debug("%s: using client ca %s", __func__,
1375 proto->tlsclientca);
1376 }
1377
1378 if (name == NULL &&
1379 print_host(&rlay->rl_conf.ss, hbuf, sizeof(hbuf)) == NULL)
1380 goto fail;
1381 else if (name != NULL &&
1382 strlcpy(hbuf, name, sizeof(hbuf)) >= sizeof(hbuf))
1383 goto fail;
1384
1385 if (snprintf(certfile, sizeof(certfile),
1386 "/etc/ssl/%s:%u.crt", hbuf, useport) == -1)
1387 goto fail;
1388 if ((cert_fd = open(certfile, O_RDONLY)) == -1) {
1389 if (snprintf(certfile, sizeof(certfile),
1390 "/etc/ssl/%s.crt", hbuf) == -1)
1391 goto fail;
1392 if ((cert_fd = open(certfile, O_RDONLY)) == -1)
1393 goto fail;
1394 useport = 0;
1395 }
1396 log_debug("%s: using certificate %s", __func__, certfile);
1397
1398 if (useport) {
1399 if (snprintf(certfile, sizeof(certfile),
1400 "/etc/ssl/private/%s:%u.key", hbuf, useport) == -1)
1401 goto fail;
1402 } else {
1403 if (snprintf(certfile, sizeof(certfile),
1404 "/etc/ssl/private/%s.key", hbuf) == -1)
1405 goto fail;
1406 }
1407 if ((key_fd = open(certfile, O_RDONLY)) == -1)
1408 goto fail;
1409 log_debug("%s: using private key %s", __func__, certfile);
1410
1411 if (useport) {
1412 if (snprintf(certfile, sizeof(certfile),
1413 "/etc/ssl/%s:%u.ocsp", hbuf, useport) == -1)
1414 goto fail;
1415 } else {
1416 if (snprintf(certfile, sizeof(certfile),
1417 "/etc/ssl/%s.ocsp", hbuf) == -1)
1418 goto fail;
1419 }
1420 if ((ocsp_fd = open(certfile, O_RDONLY)) != -1)
1421 log_debug("%s: using OCSP staple file %s", __func__, certfile);
1422
1423 if ((cert = cert_add(env, 0)) == NULL)
1424 goto fail;
1425
1426 cert->cert_relayid = rlay->rl_conf.id;
1427 cert->cert_fd = cert_fd;
1428 cert->cert_key_fd = key_fd;
1429 cert->cert_ocsp_fd = ocsp_fd;
1430
1431 return (0);
1432
1433 fail:
1434 if (cert_fd != -1)
1435 close(cert_fd);
1436 if (key_fd != -1)
1437 close(key_fd);
1438 if (ocsp_fd != -1)
1439 close(ocsp_fd);
1440
1441 return (-1);
1442 }
1443
1444 void
event_again(struct event * ev,int fd,short event,void (* fn)(int,short,void *),struct timeval * start,struct timeval * end,void * arg)1445 event_again(struct event *ev, int fd, short event,
1446 void (*fn)(int, short, void *),
1447 struct timeval *start, struct timeval *end, void *arg)
1448 {
1449 struct timeval tv_next, tv_now, tv;
1450
1451 getmonotime(&tv_now);
1452 bcopy(end, &tv_next, sizeof(tv_next));
1453 timersub(&tv_now, start, &tv_now);
1454 timersub(&tv_next, &tv_now, &tv_next);
1455
1456 bzero(&tv, sizeof(tv));
1457 if (timercmp(&tv_next, &tv, >))
1458 bcopy(&tv_next, &tv, sizeof(tv));
1459
1460 event_del(ev);
1461 event_set(ev, fd, event, fn, arg);
1462 event_add(ev, &tv);
1463 }
1464
1465 int
expand_string(char * label,size_t len,const char * srch,const char * repl)1466 expand_string(char *label, size_t len, const char *srch, const char *repl)
1467 {
1468 char *tmp;
1469 char *p, *q;
1470
1471 if ((tmp = calloc(1, len)) == NULL) {
1472 log_debug("%s: calloc", __func__);
1473 return (-1);
1474 }
1475 p = q = label;
1476 while ((q = strstr(p, srch)) != NULL) {
1477 *q = '\0';
1478 if ((strlcat(tmp, p, len) >= len) ||
1479 (strlcat(tmp, repl, len) >= len)) {
1480 log_debug("%s: string too long", __func__);
1481 free(tmp);
1482 return (-1);
1483 }
1484 q += strlen(srch);
1485 p = q;
1486 }
1487 if (strlcat(tmp, p, len) >= len) {
1488 log_debug("%s: string too long", __func__);
1489 free(tmp);
1490 return (-1);
1491 }
1492 (void)strlcpy(label, tmp, len); /* always fits */
1493 free(tmp);
1494
1495 return (0);
1496 }
1497
1498 void
translate_string(char * str)1499 translate_string(char *str)
1500 {
1501 char *reader;
1502 char *writer;
1503
1504 reader = writer = str;
1505
1506 while (*reader) {
1507 if (*reader == '\\') {
1508 reader++;
1509 switch (*reader) {
1510 case 'n':
1511 *writer++ = '\n';
1512 break;
1513 case 'r':
1514 *writer++ = '\r';
1515 break;
1516 default:
1517 *writer++ = *reader;
1518 }
1519 } else
1520 *writer++ = *reader;
1521 reader++;
1522 }
1523 *writer = '\0';
1524 }
1525
1526 char *
digeststr(enum digest_type type,const u_int8_t * data,size_t len,char * buf)1527 digeststr(enum digest_type type, const u_int8_t *data, size_t len, char *buf)
1528 {
1529 switch (type) {
1530 case DIGEST_SHA1:
1531 return (SHA1Data(data, len, buf));
1532 break;
1533 case DIGEST_MD5:
1534 return (MD5Data(data, len, buf));
1535 break;
1536 default:
1537 break;
1538 }
1539 return (NULL);
1540 }
1541
1542 const char *
canonicalize_host(const char * host,char * name,size_t len)1543 canonicalize_host(const char *host, char *name, size_t len)
1544 {
1545 struct sockaddr_in sin4;
1546 struct sockaddr_in6 sin6;
1547 size_t i, j;
1548 size_t plen;
1549 char c;
1550
1551 if (len < 2)
1552 goto fail;
1553
1554 /*
1555 * Canonicalize an IPv4/6 address
1556 */
1557 if (inet_pton(AF_INET, host, &sin4) == 1)
1558 return (inet_ntop(AF_INET, &sin4, name, len));
1559 if (inet_pton(AF_INET6, host, &sin6) == 1)
1560 return (inet_ntop(AF_INET6, &sin6, name, len));
1561
1562 /*
1563 * Canonicalize a hostname
1564 */
1565
1566 /* 1. remove repeated dots and convert upper case to lower case */
1567 plen = strlen(host);
1568 bzero(name, len);
1569 for (i = j = 0; i < plen; i++) {
1570 if (j >= (len - 1))
1571 goto fail;
1572 c = tolower((unsigned char)host[i]);
1573 if ((c == '.') && (j == 0 || name[j - 1] == '.'))
1574 continue;
1575 name[j++] = c;
1576 }
1577
1578 /* 2. remove trailing dots */
1579 for (i = j; i > 0; i--) {
1580 if (name[i - 1] != '.')
1581 break;
1582 name[i - 1] = '\0';
1583 j--;
1584 }
1585 if (j <= 0)
1586 goto fail;
1587
1588 return (name);
1589
1590 fail:
1591 errno = EINVAL;
1592 return (NULL);
1593 }
1594
1595 int
parse_url(const char * url,char ** protoptr,char ** hostptr,char ** pathptr)1596 parse_url(const char *url, char **protoptr, char **hostptr, char **pathptr)
1597 {
1598 char *p, *proto = NULL, *host = NULL, *path = NULL;
1599
1600 /* return error if it is not a URL */
1601 if ((p = strstr(url, ":/")) == NULL ||
1602 (strcspn(url, ":/") != (size_t)(p - url)))
1603 return (-1);
1604
1605 /* get protocol */
1606 if ((proto = strdup(url)) == NULL)
1607 goto fail;
1608 p = proto + (p - url);
1609
1610 /* get host */
1611 p += strspn(p, ":/");
1612 if (*p == '\0' || (host = strdup(p)) == NULL)
1613 goto fail;
1614 *p = '\0';
1615
1616 /* find and copy path or default to "/" */
1617 if ((p = strchr(host, '/')) == NULL)
1618 p = "/";
1619 if ((path = strdup(p)) == NULL)
1620 goto fail;
1621
1622 /* strip path after host */
1623 host[strcspn(host, "/")] = '\0';
1624
1625 DPRINTF("%s: %s proto %s, host %s, path %s", __func__,
1626 url, proto, host, path);
1627
1628 *protoptr = proto;
1629 *hostptr = host;
1630 *pathptr = path;
1631
1632 return (0);
1633
1634 fail:
1635 free(proto);
1636 free(host);
1637 free(path);
1638 return (-1);
1639 }
1640
1641 int
bindany(struct ctl_bindany * bnd)1642 bindany(struct ctl_bindany *bnd)
1643 {
1644 int s, v;
1645
1646 s = -1;
1647 v = 1;
1648
1649 if (relay_socket_af(&bnd->bnd_ss, bnd->bnd_port) == -1)
1650 goto fail;
1651 if ((s = socket(bnd->bnd_ss.ss_family,
1652 bnd->bnd_proto == IPPROTO_TCP ? SOCK_STREAM : SOCK_DGRAM,
1653 bnd->bnd_proto)) == -1)
1654 goto fail;
1655 if (setsockopt(s, SOL_SOCKET, SO_BINDANY,
1656 &v, sizeof(v)) == -1)
1657 goto fail;
1658 if (bind(s, (struct sockaddr *)&bnd->bnd_ss,
1659 bnd->bnd_ss.ss_len) == -1)
1660 goto fail;
1661
1662 return (s);
1663
1664 fail:
1665 if (s != -1)
1666 close(s);
1667 return (-1);
1668 }
1669
1670 int
map6to4(struct sockaddr_storage * in6)1671 map6to4(struct sockaddr_storage *in6)
1672 {
1673 struct sockaddr_storage out4;
1674 struct sockaddr_in *sin4 = (struct sockaddr_in *)&out4;
1675 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)in6;
1676
1677 bzero(sin4, sizeof(*sin4));
1678 sin4->sin_len = sizeof(*sin4);
1679 sin4->sin_family = AF_INET;
1680 sin4->sin_port = sin6->sin6_port;
1681
1682 bcopy(&sin6->sin6_addr.s6_addr[12], &sin4->sin_addr.s_addr,
1683 sizeof(sin4->sin_addr));
1684
1685 if (sin4->sin_addr.s_addr == INADDR_ANY ||
1686 sin4->sin_addr.s_addr == INADDR_BROADCAST ||
1687 IN_MULTICAST(ntohl(sin4->sin_addr.s_addr)))
1688 return (-1);
1689
1690 bcopy(&out4, in6, sizeof(*in6));
1691
1692 return (0);
1693 }
1694
1695 int
map4to6(struct sockaddr_storage * in4,struct sockaddr_storage * map)1696 map4to6(struct sockaddr_storage *in4, struct sockaddr_storage *map)
1697 {
1698 struct sockaddr_storage out6;
1699 struct sockaddr_in *sin4 = (struct sockaddr_in *)in4;
1700 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&out6;
1701 struct sockaddr_in6 *map6 = (struct sockaddr_in6 *)map;
1702
1703 if (sin4->sin_addr.s_addr == INADDR_ANY ||
1704 sin4->sin_addr.s_addr == INADDR_BROADCAST ||
1705 IN_MULTICAST(ntohl(sin4->sin_addr.s_addr)))
1706 return (-1);
1707
1708 bcopy(map6, sin6, sizeof(*sin6));
1709 sin6->sin6_len = sizeof(*sin6);
1710 sin6->sin6_family = AF_INET6;
1711 sin6->sin6_port = sin4->sin_port;
1712
1713 bcopy(&sin4->sin_addr.s_addr, &sin6->sin6_addr.s6_addr[12],
1714 sizeof(sin4->sin_addr));
1715
1716 bcopy(&out6, in4, sizeof(*in4));
1717
1718 return (0);
1719 }
1720
1721 void
socket_rlimit(int maxfd)1722 socket_rlimit(int maxfd)
1723 {
1724 struct rlimit rl;
1725
1726 if (getrlimit(RLIMIT_NOFILE, &rl) == -1)
1727 fatal("%s: failed to get resource limit", __func__);
1728 log_debug("%s: max open files %llu", __func__, rl.rlim_max);
1729
1730 /*
1731 * Allow the maximum number of open file descriptors for this
1732 * login class (which should be the class "daemon" by default).
1733 */
1734 if (maxfd == -1)
1735 rl.rlim_cur = rl.rlim_max;
1736 else
1737 rl.rlim_cur = MAXIMUM(rl.rlim_max, (rlim_t)maxfd);
1738 if (setrlimit(RLIMIT_NOFILE, &rl) == -1)
1739 fatal("%s: failed to set resource limit", __func__);
1740 }
1741
1742 char *
get_string(u_int8_t * ptr,size_t len)1743 get_string(u_int8_t *ptr, size_t len)
1744 {
1745 size_t i;
1746
1747 for (i = 0; i < len; i++)
1748 if (!(isprint((unsigned char)ptr[i]) ||
1749 isspace((unsigned char)ptr[i])))
1750 break;
1751
1752 return strndup(ptr, i);
1753 }
1754
1755 void *
get_data(u_int8_t * ptr,size_t len)1756 get_data(u_int8_t *ptr, size_t len)
1757 {
1758 u_int8_t *data;
1759
1760 if ((data = malloc(len)) == NULL)
1761 return (NULL);
1762 memcpy(data, ptr, len);
1763
1764 return (data);
1765 }
1766
1767 int
sockaddr_cmp(struct sockaddr * a,struct sockaddr * b,int prefixlen)1768 sockaddr_cmp(struct sockaddr *a, struct sockaddr *b, int prefixlen)
1769 {
1770 struct sockaddr_in *a4, *b4;
1771 struct sockaddr_in6 *a6, *b6;
1772 u_int32_t av[4], bv[4], mv[4];
1773
1774 if (a->sa_family == AF_UNSPEC || b->sa_family == AF_UNSPEC)
1775 return (0);
1776 else if (a->sa_family > b->sa_family)
1777 return (1);
1778 else if (a->sa_family < b->sa_family)
1779 return (-1);
1780
1781 if (prefixlen == -1)
1782 memset(&mv, 0xff, sizeof(mv));
1783
1784 switch (a->sa_family) {
1785 case AF_INET:
1786 a4 = (struct sockaddr_in *)a;
1787 b4 = (struct sockaddr_in *)b;
1788
1789 av[0] = a4->sin_addr.s_addr;
1790 bv[0] = b4->sin_addr.s_addr;
1791 if (prefixlen != -1)
1792 mv[0] = prefixlen2mask(prefixlen);
1793
1794 if ((av[0] & mv[0]) > (bv[0] & mv[0]))
1795 return (1);
1796 if ((av[0] & mv[0]) < (bv[0] & mv[0]))
1797 return (-1);
1798 break;
1799 case AF_INET6:
1800 a6 = (struct sockaddr_in6 *)a;
1801 b6 = (struct sockaddr_in6 *)b;
1802
1803 memcpy(&av, &a6->sin6_addr.s6_addr, 16);
1804 memcpy(&bv, &b6->sin6_addr.s6_addr, 16);
1805 if (prefixlen != -1)
1806 prefixlen2mask6(prefixlen, mv);
1807
1808 if ((av[3] & mv[3]) > (bv[3] & mv[3]))
1809 return (1);
1810 if ((av[3] & mv[3]) < (bv[3] & mv[3]))
1811 return (-1);
1812 if ((av[2] & mv[2]) > (bv[2] & mv[2]))
1813 return (1);
1814 if ((av[2] & mv[2]) < (bv[2] & mv[2]))
1815 return (-1);
1816 if ((av[1] & mv[1]) > (bv[1] & mv[1]))
1817 return (1);
1818 if ((av[1] & mv[1]) < (bv[1] & mv[1]))
1819 return (-1);
1820 if ((av[0] & mv[0]) > (bv[0] & mv[0]))
1821 return (1);
1822 if ((av[0] & mv[0]) < (bv[0] & mv[0]))
1823 return (-1);
1824 break;
1825 }
1826
1827 return (0);
1828 }
1829
1830 u_int32_t
prefixlen2mask(u_int8_t prefixlen)1831 prefixlen2mask(u_int8_t prefixlen)
1832 {
1833 if (prefixlen == 0)
1834 return (0);
1835
1836 if (prefixlen > 32)
1837 prefixlen = 32;
1838
1839 return (htonl(0xffffffff << (32 - prefixlen)));
1840 }
1841
1842 struct in6_addr *
prefixlen2mask6(u_int8_t prefixlen,u_int32_t * mask)1843 prefixlen2mask6(u_int8_t prefixlen, u_int32_t *mask)
1844 {
1845 static struct in6_addr s6;
1846 int i;
1847
1848 if (prefixlen > 128)
1849 prefixlen = 128;
1850
1851 bzero(&s6, sizeof(s6));
1852 for (i = 0; i < prefixlen / 8; i++)
1853 s6.s6_addr[i] = 0xff;
1854 i = prefixlen % 8;
1855 if (i)
1856 s6.s6_addr[prefixlen / 8] = 0xff00 >> i;
1857
1858 memcpy(mask, &s6, sizeof(s6));
1859
1860 return (&s6);
1861 }
1862
1863 int
accept_reserve(int sockfd,struct sockaddr * addr,socklen_t * addrlen,int reserve,volatile int * counter)1864 accept_reserve(int sockfd, struct sockaddr *addr, socklen_t *addrlen,
1865 int reserve, volatile int *counter)
1866 {
1867 int ret;
1868 if (getdtablecount() + reserve +
1869 *counter >= getdtablesize()) {
1870 errno = EMFILE;
1871 return (-1);
1872 }
1873
1874 if ((ret = accept4(sockfd, addr, addrlen, SOCK_NONBLOCK)) > -1) {
1875 (*counter)++;
1876 DPRINTF("%s: inflight incremented, now %d",__func__, *counter);
1877 }
1878 return (ret);
1879 }
1880
1881 void
parent_tls_ticket_rekey(int fd,short events,void * arg)1882 parent_tls_ticket_rekey(int fd, short events, void *arg)
1883 {
1884 static struct event rekeyev;
1885 struct relayd *env = arg;
1886 struct timeval tv;
1887 struct relay_ticket_key key;
1888
1889 log_debug("%s: rekeying tickets", __func__);
1890
1891 key.tt_keyrev = arc4random();
1892 arc4random_buf(key.tt_key, sizeof(key.tt_key));
1893
1894 proc_compose_imsg(env->sc_ps, PROC_RELAY, -1, IMSG_TLSTICKET_REKEY,
1895 -1, -1, &key, sizeof(key));
1896
1897 evtimer_set(&rekeyev, parent_tls_ticket_rekey, env);
1898 timerclear(&tv);
1899 tv.tv_sec = TLS_SESSION_LIFETIME / 4;
1900 evtimer_add(&rekeyev, &tv);
1901 }
1902