1/* Copyright (c) 2013, Jacob Appelbaum
2 * Copyright (c) 2012, The Tor Project, Inc. */
3/* See LICENSE for licensing information */
4
5/**
6  * \file tlsdate.h
7  * \brief The main header for our clock helper.
8  **/
9
10#ifndef TLSDATE_H
11#define TLSDATE_H
12
13#include "src/configmake.h"
14#include <limits.h>
15#include <stdint.h>
16#include <stdio.h>
17#include <stdlib.h>
18#include <string.h>
19#include <getopt.h>
20#include <limits.h>
21#include <signal.h>
22#include <time.h>
23#include <unistd.h>
24
25#include "src/rtc.h"
26
27#define DEFAULT_HOST "google.com"
28#define DEFAULT_PORT "443"
29#define DEFAULT_PROXY "none"
30#define DEFAULT_PROTOCOL "tlsv1"
31#define DEFAULT_CERTDIR "/etc/ssl/certs"
32#define DEFAULT_CERTFILE TLSDATE_CERTFILE
33#define DEFAULT_DAEMON_CACHEDIR "/var/cache/tlsdated"
34#define DEFAULT_DAEMON_TMPSUFFIX ".new"
35#define DEFAULT_TLSDATE TLSDATE
36#define DEFAULT_RTC_DEVICE "/dev/rtc"
37#define DEFAULT_CONF_FILE TLSDATE_CONF_DIR "tlsdated.conf"
38
39/* tlsdated magic numbers */
40#define MAX_TRIES 10
41#define WAIT_BETWEEN_TRIES 10
42#define SUBPROCESS_TRIES 10
43#define SUBPROCESS_WAIT_BETWEEN_TRIES 10
44#define RESOLVER_TIMEOUT 30
45/* Invalidate the network sync once per day. */
46#define STEADY_STATE_INTERVAL (60*60*24)
47/* Check if the clock has jumped every four hours. */
48#define CONTINUITY_INTERVAL (60*60*4)
49#define DEFAULT_SYNC_HWCLOCK 1
50#define DEFAULT_LOAD_FROM_DISK 1
51#define DEFAULT_SAVE_TO_DISK 1
52#define DEFAULT_USE_NETLINK 1
53#define DEFAULT_DRY_RUN 0
54#define MAX_SANE_BACKOFF (10*60) /* exponential backoff should only go this far */
55
56#ifndef TLSDATED_MAX_DATE
57#define TLSDATED_MAX_DATE 1999991337L /* this'll be a great bug some day */
58#endif
59
60#define MAX_EVENT_PRIORITIES 2
61#define PRI_SAVE 0
62#define PRI_NET 1
63#define PRI_WAKE 1
64#define PRI_ANY 1
65
66/* Sync sources in order of "reliability" */
67#define SYNC_TYPE_NONE  (0)
68#define SYNC_TYPE_BUILD  (1 << 0)
69#define SYNC_TYPE_DISK  (1 << 1)
70#define SYNC_TYPE_RTC  (1 << 2)
71#define SYNC_TYPE_PLATFORM  (1 << 3)
72#define SYNC_TYPE_NET  (1 << 4)
73
74/* Simple time setter<>tlsdated protocol */
75#define SETTER_EXIT 0
76#define SETTER_BAD_TIME 1
77#define SETTER_NO_SAVE 2
78#define SETTER_READ_ERR 3
79#define SETTER_TIME_SET 4
80#define SETTER_SET_ERR 5
81#define SETTER_NO_SBOX 6
82#define SETTER_NO_RTC 7
83
84#define TEST_HOST 'w', 'w', 'w', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', \
85                  'c', 'o', 'm'
86#define TEST_HOST_SIZE 14
87static const char kTestHost[] = { TEST_HOST, 0 };
88#define TEST_PORT 80
89
90/** The current version of tlsdate. */
91#define tlsdate_version VERSION
92
93/** GNU/Hurd support requires that we declare this ourselves: */
94#ifndef PATH_MAX
95#define PATH_MAX 1024
96#endif
97#ifndef MAXPATHLEN
98#define MAXPATHLEN PATH_MAX
99#endif
100
101struct source
102{
103	struct source *next;
104	char *host;
105	char *port;
106	char *proxy;
107	int id;
108};
109
110struct opts
111{
112  const char *user;
113  const char *group;
114  char *supp_groups;
115  int max_tries;
116  int min_steady_state_interval;
117  int wait_between_tries;
118  int subprocess_tries;
119  int subprocess_wait_between_tries;
120  int steady_state_interval;
121  int continuity_interval;
122  const char *base_path;
123  char **base_argv;
124  char **argv;
125  int should_sync_hwclock;
126  int should_load_disk;
127  int should_save_disk;
128  int should_netlink;
129  int dry_run;
130  int jitter;
131  char *conf_file;
132  struct source *sources;
133  struct source *cur_source;
134  char *proxy;
135  int leap;
136  int should_dbus;
137};
138
139#define MAX_FQDN_LEN 255
140#define MAX_SCHEME_LEN 9
141#define MAX_PORT_LEN 6  /* incl. : */
142#define MAX_PROXY_URL (MAX_FQDN_LEN + MAX_SCHEME_LEN + MAX_PORT_LEN + 1)
143
144enum event_id_t
145{
146  E_RESOLVER = 0,
147  E_TLSDATE,
148  E_TLSDATE_STATUS,
149  E_TLSDATE_TIMEOUT,
150  E_SAVE,
151  E_SIGCHLD,
152  E_SIGTERM,
153  E_STEADYSTATE,
154  E_ROUTEUP,
155  E_MAX
156};
157
158struct event_base;
159
160/* This struct is used for passing tlsdated runtime state between
161 * events/ in its event loop.
162 */
163struct state
164{
165  struct opts opts;
166  struct event_base *base;
167  void *dbus;
168  char **envp;
169
170  time_t clock_delta;
171  int last_sync_type;
172  time_t last_time;
173
174  char timestamp_path[PATH_MAX];
175  struct rtc_handle hwclock;
176  char dynamic_proxy[MAX_PROXY_URL];
177  /* Event triggered events */
178
179  struct event *events[E_MAX];
180  int tlsdate_monitor_fd;
181  pid_t tlsdate_pid;
182  pid_t setter_pid;
183  int setter_save_fd;
184  int setter_notify_fd;
185  uint32_t backoff;
186  int tries;
187  int resolving;
188  int running;  /* tlsdate itself */
189  int exitting;
190};
191
192char timestamp_path[PATH_MAX];
193
194int is_sane_time (time_t ts);
195int load_disk_timestamp (const char *path, time_t * t);
196void save_disk_timestamp (const char *path, time_t t);
197int add_jitter (int base, int jitter);
198void time_setter_coprocess (int time_fd, int notify_fd, struct state *state);
199int tlsdate (struct state *state);
200
201int save_timestamp_to_fd (int fd, time_t t);
202void set_conf_defaults (struct opts *opts);
203int new_tlsdate_monitor_pipe (int fds[2]);
204int read_tlsdate_response (int fd, time_t *t);
205
206void invalidate_time (struct state *state);
207int check_continuity (time_t *delta);
208
209void action_check_continuity (int fd, short what, void *arg);
210void action_kickoff_time_sync (int fd, short what, void *arg);
211void action_invalidate_time (int fd, short what, void *arg);
212void action_stdin_wakeup (int fd, short what, void *arg);
213void action_netlink_ready (int fd, short what, void *arg);
214void action_run_tlsdate (int fd, short what, void *arg);
215void action_sigterm (int fd, short what, void *arg);
216void action_sync_and_save (int fd, short what, void *arg);
217void action_time_set (int fd, short what, void *arg);
218void action_tlsdate_status (int fd, short what, void *arg);
219
220int setup_event_timer_continuity (struct state *state);
221int setup_event_timer_sync (struct state *state);
222int setup_event_route_up (struct state *state);
223int setup_time_setter (struct state *state);
224int setup_tlsdate_status (struct state *state);
225int setup_sigchld_event (struct state *state, int persist);
226
227void report_setter_error (siginfo_t *info);
228
229void sync_and_save (void *hwclock_handle, int should_save);
230
231/** This is where we store parsed commandline options. */
232typedef struct
233{
234  int verbose;
235  int verbose_debug;
236  int ca_racket;
237  int help;
238  int showtime;
239  int setclock;
240  time_t manual_time;
241  char *host;
242  char *port;
243  char *protocol;
244} tlsdate_options_t;
245
246#endif /* TLSDATE_H */
247