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
87 static 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 
101 struct source
102 {
103 	struct source *next;
104 	char *host;
105 	char *port;
106 	char *proxy;
107 	int id;
108 };
109 
110 struct 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 
144 enum 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 
158 struct event_base;
159 
160 /* This struct is used for passing tlsdated runtime state between
161  * events/ in its event loop.
162  */
163 struct 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 
192 char timestamp_path[PATH_MAX];
193 
194 int is_sane_time (time_t ts);
195 int load_disk_timestamp (const char *path, time_t * t);
196 void save_disk_timestamp (const char *path, time_t t);
197 int add_jitter (int base, int jitter);
198 void time_setter_coprocess (int time_fd, int notify_fd, struct state *state);
199 int tlsdate (struct state *state);
200 
201 int save_timestamp_to_fd (int fd, time_t t);
202 void set_conf_defaults (struct opts *opts);
203 int new_tlsdate_monitor_pipe (int fds[2]);
204 int read_tlsdate_response (int fd, time_t *t);
205 
206 void invalidate_time (struct state *state);
207 int check_continuity (time_t *delta);
208 
209 void action_check_continuity (int fd, short what, void *arg);
210 void action_kickoff_time_sync (int fd, short what, void *arg);
211 void action_invalidate_time (int fd, short what, void *arg);
212 void action_stdin_wakeup (int fd, short what, void *arg);
213 void action_netlink_ready (int fd, short what, void *arg);
214 void action_run_tlsdate (int fd, short what, void *arg);
215 void action_sigterm (int fd, short what, void *arg);
216 void action_sync_and_save (int fd, short what, void *arg);
217 void action_time_set (int fd, short what, void *arg);
218 void action_tlsdate_status (int fd, short what, void *arg);
219 
220 int setup_event_timer_continuity (struct state *state);
221 int setup_event_timer_sync (struct state *state);
222 int setup_event_route_up (struct state *state);
223 int setup_time_setter (struct state *state);
224 int setup_tlsdate_status (struct state *state);
225 int setup_sigchld_event (struct state *state, int persist);
226 
227 void report_setter_error (siginfo_t *info);
228 
229 void sync_and_save (void *hwclock_handle, int should_save);
230 
231 /** This is where we store parsed commandline options. */
232 typedef 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