routerlist.c 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196
  1. /* Copyright 2001-2003 Roger Dingledine, Matej Pfajfar. */
  2. /* See LICENSE for licensing information */
  3. /* $Id$ */
  4. #define OR_PUBLICKEY_BEGIN_TAG "-----BEGIN RSA PUBLIC KEY-----\n"
  5. #define OR_PUBLICKEY_END_TAG "-----END RSA PUBLIC KEY-----\n"
  6. #define OR_SIGNATURE_BEGIN_TAG "-----BEGIN SIGNATURE-----\n"
  7. #define OR_SIGNATURE_END_TAG "-----END SIGNATURE-----\n"
  8. #define _GNU_SOURCE
  9. /* XXX this is required on rh7 to make strptime not complain. how bad
  10. * is this for portability?
  11. */
  12. #include "or.h"
  13. /****************************************************************************/
  14. static routerlist_t *routerlist = NULL; /* router array */
  15. extern or_options_t options; /* command-line and config-file options */
  16. /****************************************************************************/
  17. struct directory_token_t;
  18. typedef struct directory_token_t directory_token_t;
  19. /* static function prototypes */
  20. static int router_set_routerlist_from_string(const char *s);
  21. static int
  22. router_get_list_from_string_impl(const char **s, routerlist_t **dest,
  23. int n_good_nicknames,
  24. const char **good_nickname_lst);
  25. static int
  26. router_get_routerlist_from_directory_impl(const char *s, routerlist_t **dest,
  27. crypto_pk_env_t *pkey);
  28. static int router_add_exit_policy(routerinfo_t *router,
  29. directory_token_t *tok);
  30. static int router_resolve_routerlist(routerlist_t *dir);
  31. /****************************************************************************/
  32. routerinfo_t *router_pick_directory_server(void) {
  33. /* pick a random running router with a positive dir_port */
  34. int i,j;
  35. routerinfo_t *router, *dirserver=NULL;
  36. int num_dirservers=0;
  37. if(!routerlist)
  38. return NULL;
  39. for(i=0;i<routerlist->n_routers;i++) {
  40. router = routerlist->routers[i];
  41. if(router->dir_port > 0 && router->is_running)
  42. num_dirservers++;
  43. }
  44. if(!num_dirservers) {
  45. log_fn(LOG_INFO,"No dirservers are reachable. Trying them all again.");
  46. /* no running dir servers found? go through and mark them all as up,
  47. * and we'll cycle through the list again. */
  48. for(i=0;i<routerlist->n_routers;i++) {
  49. router = routerlist->routers[i];
  50. if(router->dir_port > 0) {
  51. router->is_running = 1;
  52. dirserver = router;
  53. }
  54. }
  55. return dirserver;
  56. }
  57. j = crypto_pseudo_rand_int(num_dirservers);
  58. for (i=0;i<routerlist->n_routers;i++) {
  59. router = routerlist->routers[i];
  60. if (router->dir_port > 0 && router->is_running) {
  61. if (j)
  62. --j;
  63. else {
  64. log_fn(LOG_DEBUG, "Chose server '%s'", router->nickname);
  65. return router;
  66. }
  67. }
  68. }
  69. assert(0);
  70. return NULL;
  71. }
  72. routerinfo_t *router_pick_randomly_from_running(void) {
  73. int i,j;
  74. int num_running=0;
  75. if(!routerlist)
  76. return NULL;
  77. for(i=0;i<routerlist->n_routers;i++) {
  78. if(routerlist->routers[i]->is_running)
  79. num_running++;
  80. }
  81. if(!num_running) {
  82. log_fn(LOG_INFO,"No routers are running. Returning NULL.");
  83. return NULL;
  84. }
  85. j = crypto_pseudo_rand_int(num_running);
  86. for (i=0;i<routerlist->n_routers;i++) {
  87. if (routerlist->routers[i]->is_running) {
  88. if (j)
  89. --j;
  90. else {
  91. log_fn(LOG_DEBUG, "Chose server '%s'", routerlist->routers[i]->nickname);
  92. return routerlist->routers[i];
  93. }
  94. }
  95. }
  96. assert(0);
  97. return NULL;
  98. }
  99. routerinfo_t *router_get_by_addr_port(uint32_t addr, uint16_t port) {
  100. int i;
  101. routerinfo_t *router;
  102. assert(routerlist);
  103. for(i=0;i<routerlist->n_routers;i++) {
  104. router = routerlist->routers[i];
  105. if ((router->addr == addr) && (router->or_port == port))
  106. return router;
  107. }
  108. return NULL;
  109. }
  110. routerinfo_t *router_get_by_link_pk(crypto_pk_env_t *pk)
  111. {
  112. int i;
  113. routerinfo_t *router;
  114. assert(routerlist);
  115. for(i=0;i<routerlist->n_routers;i++) {
  116. router = routerlist->routers[i];
  117. if (0 == crypto_pk_cmp_keys(router->link_pkey, pk))
  118. return router;
  119. }
  120. return NULL;
  121. }
  122. routerinfo_t *router_get_by_nickname(char *nickname)
  123. {
  124. int i;
  125. routerinfo_t *router;
  126. assert(routerlist);
  127. for(i=0;i<routerlist->n_routers;i++) {
  128. router = routerlist->routers[i];
  129. if (0 == strcmp(router->nickname, nickname))
  130. return router;
  131. }
  132. return NULL;
  133. }
  134. /* a way to access routerlist outside this file */
  135. void router_get_routerlist(routerlist_t **prouterlist) {
  136. *prouterlist = routerlist;
  137. }
  138. /* delete a router from memory */
  139. void routerinfo_free(routerinfo_t *router)
  140. {
  141. struct exit_policy_t *e;
  142. if (!router)
  143. return;
  144. tor_free(router->address);
  145. tor_free(router->nickname);
  146. if (router->onion_pkey)
  147. crypto_free_pk_env(router->onion_pkey);
  148. if (router->link_pkey)
  149. crypto_free_pk_env(router->link_pkey);
  150. if (router->identity_pkey)
  151. crypto_free_pk_env(router->identity_pkey);
  152. while (router->exit_policy) {
  153. e = router->exit_policy;
  154. router->exit_policy = e->next;
  155. tor_free(e->string);
  156. free(e);
  157. }
  158. free(router);
  159. }
  160. static void routerlist_free(routerlist_t *rl)
  161. {
  162. int i;
  163. for (i = 0; i < rl->n_routers; ++i)
  164. routerinfo_free(rl->routers[i]);
  165. tor_free(rl->routers);
  166. tor_free(rl->software_versions);
  167. free(rl);
  168. }
  169. void router_mark_as_down(char *nickname) {
  170. routerinfo_t *router = router_get_by_nickname(nickname);
  171. if(!router) /* we don't seem to know about him in the first place */
  172. return;
  173. log_fn(LOG_DEBUG,"Marking %s as down.",router->nickname);
  174. router->is_running = 0;
  175. }
  176. /* load the router list */
  177. int router_set_routerlist_from_file(char *routerfile)
  178. {
  179. char *string;
  180. string = read_file_to_str(routerfile);
  181. if(!string) {
  182. log_fn(LOG_WARN,"Failed to load routerfile %s.",routerfile);
  183. return -1;
  184. }
  185. if(router_set_routerlist_from_string(string) < 0) {
  186. log_fn(LOG_WARN,"The routerfile itself was corrupt.");
  187. free(string);
  188. return -1;
  189. }
  190. free(string);
  191. return 0;
  192. }
  193. typedef enum {
  194. K_ACCEPT,
  195. K_DIRECTORY_SIGNATURE,
  196. K_RECOMMENDED_SOFTWARE,
  197. K_REJECT,
  198. K_ROUTER,
  199. K_SIGNED_DIRECTORY,
  200. K_SIGNING_KEY,
  201. K_ONION_KEY,
  202. K_LINK_KEY,
  203. K_ROUTER_SIGNATURE,
  204. K_PUBLISHED,
  205. K_RUNNING_ROUTERS,
  206. K_PLATFORM,
  207. _SIGNATURE,
  208. _PUBLIC_KEY,
  209. _ERR,
  210. _EOF,
  211. _NIL
  212. } directory_keyword;
  213. typedef enum {
  214. NO_ARGS,
  215. ARGS,
  216. CONCAT_ARGS,
  217. } arg_syntax;
  218. struct token_table_ent { char *t; int v; arg_syntax s; };
  219. static struct token_table_ent token_table[] = {
  220. { "accept", K_ACCEPT, ARGS },
  221. { "directory-signature", K_DIRECTORY_SIGNATURE, NO_ARGS },
  222. { "reject", K_REJECT, ARGS },
  223. { "router", K_ROUTER, ARGS },
  224. { "recommended-software", K_RECOMMENDED_SOFTWARE, ARGS },
  225. { "signed-directory", K_SIGNED_DIRECTORY, NO_ARGS },
  226. { "signing-key", K_SIGNING_KEY, NO_ARGS },
  227. { "onion-key", K_ONION_KEY, NO_ARGS },
  228. { "link-key", K_LINK_KEY, NO_ARGS },
  229. { "router-signature", K_ROUTER_SIGNATURE, NO_ARGS },
  230. { "published", K_PUBLISHED, CONCAT_ARGS },
  231. { "running-routers", K_RUNNING_ROUTERS, ARGS },
  232. { "platform", K_PLATFORM, ARGS },
  233. { NULL, -1 }
  234. };
  235. #define MAX_ARGS 1024
  236. struct directory_token_t {
  237. directory_keyword tp;
  238. union {
  239. struct {
  240. char *args[MAX_ARGS+1];
  241. int n_args;
  242. } cmd;
  243. char *signature;
  244. char *error;
  245. crypto_pk_env_t *public_key;
  246. } val;
  247. };
  248. /* Free any malloced resources allocated for a token. Don't call this if
  249. you inherit the reference to those resources.
  250. */
  251. static void
  252. router_release_token(directory_token_t *tok)
  253. {
  254. int i;
  255. switch (tok->tp)
  256. {
  257. case _SIGNATURE:
  258. free(tok->val.signature);
  259. break;
  260. case _PUBLIC_KEY:
  261. crypto_free_pk_env(tok->val.public_key);
  262. break;
  263. case _ERR:
  264. case _EOF:
  265. case _NIL:
  266. break;
  267. default:
  268. for (i = 0; i < tok->val.cmd.n_args; ++i) {
  269. tor_free(tok->val.cmd.args[i]);
  270. }
  271. }
  272. tok->tp = _NIL;
  273. }
  274. static int
  275. _router_get_next_token(const char **s, directory_token_t *tok) {
  276. const char *next;
  277. crypto_pk_env_t *pkey = NULL;
  278. char *signature = NULL;
  279. int i, done;
  280. tok->tp = _ERR;
  281. tok->val.error = "";
  282. router_release_token(tok);
  283. *s = eat_whitespace(*s);
  284. if (!**s) {
  285. tok->tp = _EOF;
  286. return 0;
  287. } else if (**s == '-') {
  288. next = strchr(*s, '\n');
  289. if (! next) { tok->val.error = "No newline at EOF"; return -1; }
  290. ++next;
  291. if (! strncmp(*s, OR_PUBLICKEY_BEGIN_TAG, next-*s)) {
  292. next = strstr(*s, OR_PUBLICKEY_END_TAG);
  293. if (!next) { tok->val.error = "No public key end tag found"; return -1; }
  294. next = strchr(next, '\n'); /* Part of OR_PUBLICKEY_END_TAG; can't fail.*/
  295. ++next;
  296. if (!(pkey = crypto_new_pk_env(CRYPTO_PK_RSA)))
  297. return -1;
  298. if (crypto_pk_read_public_key_from_string(pkey, *s, next-*s)) {
  299. crypto_free_pk_env(pkey);
  300. tok->val.error = "Couldn't parse public key.";
  301. return -1;
  302. }
  303. tok->tp = _PUBLIC_KEY;
  304. tok->val.public_key = pkey;
  305. *s = next;
  306. return 0;
  307. } else if (! strncmp(*s, OR_SIGNATURE_BEGIN_TAG, next-*s)) {
  308. /* Advance past newline; can't fail. */
  309. *s = strchr(*s, '\n');
  310. ++*s;
  311. /* Find end of base64'd data */
  312. next = strstr(*s, OR_SIGNATURE_END_TAG);
  313. if (!next) { tok->val.error = "No signature end tag found"; return -1; }
  314. signature = tor_malloc(256);
  315. i = base64_decode(signature, 256, *s, next-*s);
  316. if (i<0) {
  317. free(signature);
  318. tok->val.error = "Error decoding signature."; return -1;
  319. } else if (i != 128) {
  320. free(signature);
  321. tok->val.error = "Bad length on decoded signature."; return -1;
  322. }
  323. tok->tp = _SIGNATURE;
  324. tok->val.signature = signature;
  325. next = strchr(next, '\n'); /* Part of OR_SIGNATURE_END_TAG; can't fail.*/
  326. *s = next+1;
  327. return 0;
  328. } else {
  329. tok->val.error = "Unrecognized begin line"; return -1;
  330. }
  331. } else {
  332. next = find_whitespace(*s);
  333. if (!next) {
  334. tok->val.error = "Unexpected EOF"; return -1;
  335. }
  336. for (i = 0 ; token_table[i].t ; ++i) {
  337. if (!strncmp(token_table[i].t, *s, next-*s)) {
  338. tok->tp = token_table[i].v;
  339. if (token_table[i].s == ARGS) {
  340. i = 0;
  341. done = (*next == '\n');
  342. *s = eat_whitespace_no_nl(next);
  343. while (**s != '\n' && i < MAX_ARGS && !done) {
  344. next = find_whitespace(*s);
  345. if (*next == '\n')
  346. done = 1;
  347. tok->val.cmd.args[i++] = tor_strndup(*s,next-*s);
  348. *s = eat_whitespace_no_nl(next+1);
  349. }
  350. tok->val.cmd.n_args = i;
  351. if (i >= MAX_ARGS) {
  352. /* XXX free args[0..i] */
  353. tok->tp = _ERR;
  354. tok->val.error = "Too many arguments"; return -1;
  355. }
  356. } else if (token_table[i].s == CONCAT_ARGS) {
  357. *s = eat_whitespace_no_nl(next);
  358. next = strchr(*s, '\n');
  359. if (!next) {
  360. tok->tp = _ERR;
  361. tok->val.error = "Unexpected EOF"; return -1;
  362. }
  363. tok->val.cmd.args[0] = tor_strndup(*s,next-*s);
  364. tok->val.cmd.n_args = 1;
  365. *s = eat_whitespace_no_nl(next+1);
  366. } else {
  367. *s = eat_whitespace_no_nl(next);
  368. if (**s != '\n') {
  369. tok->tp = _ERR;
  370. tok->val.error = "Unexpected arguments"; return -1;
  371. }
  372. tok->val.cmd.n_args = 0;
  373. *s = eat_whitespace_no_nl(*s+1);
  374. }
  375. return 0;
  376. }
  377. }
  378. tok->val.error = "Unrecognized command"; return -1;
  379. }
  380. }
  381. #ifdef DEBUG_ROUTER_TOKENS
  382. static void
  383. router_dump_token(directory_token_t *tok) {
  384. int i;
  385. switch(tok->tp)
  386. {
  387. case _SIGNATURE:
  388. puts("(signature)");
  389. return;
  390. case _PUBLIC_KEY:
  391. puts("(public key)");
  392. return;
  393. case _ERR:
  394. printf("(Error: %s\n)", tok->val.error);
  395. return;
  396. case _EOF:
  397. puts("EOF");
  398. return;
  399. case K_ACCEPT: printf("Accept"); break;
  400. case K_DIRECTORY_SIGNATURE: printf("Directory-Signature"); break;
  401. case K_REJECT: printf("Reject"); break;
  402. case K_RECOMMENDED_SOFTWARE: printf("Server-Software"); break;
  403. case K_ROUTER: printf("Router"); break;
  404. case K_SIGNED_DIRECTORY: printf("Signed-Directory"); break;
  405. case K_SIGNING_KEY: printf("Signing-Key"); break;
  406. case K_ONION_KEY: printf("Onion-key"); break;
  407. case K_LINK_KEY: printf("Link-key"); break;
  408. case K_ROUTER_SIGNATURE: printf("Router-signature"); break;
  409. case K_PUBLISHED: printf("Published"); break;
  410. case K_RUNNING_ROUTERS: printf("Running-routers"); break;
  411. case K_PLATFORM: printf("Platform"); break;
  412. default:
  413. printf("?????? %d\n", tok->tp); return;
  414. }
  415. for (i = 0; i < tok->val.cmd.n_args; ++i) {
  416. printf(" \"%s\"", tok->val.cmd.args[i]);
  417. }
  418. printf("\n");
  419. return;
  420. }
  421. static int
  422. router_get_next_token(char **s, directory_token_t *tok) {
  423. int i;
  424. i = _router_get_next_token(s, tok);
  425. router_dump_token(tok);
  426. return i;
  427. }
  428. #else
  429. #define router_get_next_token _router_get_next_token
  430. #endif
  431. /* read routerinfo elements from s, and throw out the ones that
  432. * don't parse and resolve. */
  433. static int router_set_routerlist_from_string(const char *s)
  434. {
  435. if (router_get_list_from_string_impl(&s, &routerlist, -1, NULL)) {
  436. log(LOG_WARN, "Error parsing router file");
  437. return -1;
  438. }
  439. if (router_resolve_routerlist(routerlist)) {
  440. log(LOG_WARN, "Error resolving routerlist");
  441. return -1;
  442. }
  443. return 0;
  444. }
  445. static int router_get_hash_impl(const char *s, char *digest,
  446. const char *start_str,
  447. const char *end_str)
  448. {
  449. char *start, *end;
  450. start = strstr(s, start_str);
  451. if (!start) {
  452. log_fn(LOG_WARN,"couldn't find \"%s\"",start_str);
  453. return -1;
  454. }
  455. end = strstr(start+strlen(start_str), end_str);
  456. if (!end) {
  457. log_fn(LOG_WARN,"couldn't find \"%s\"",end_str);
  458. return -1;
  459. }
  460. end = strchr(end, '\n');
  461. if (!end) {
  462. log_fn(LOG_WARN,"couldn't find EOL");
  463. return -1;
  464. }
  465. ++end;
  466. if (crypto_SHA_digest(start, end-start, digest)) {
  467. log_fn(LOG_WARN,"couldn't compute digest");
  468. return -1;
  469. }
  470. return 0;
  471. }
  472. int router_get_dir_hash(const char *s, char *digest)
  473. {
  474. return router_get_hash_impl(s,digest,
  475. "signed-directory","directory-signature");
  476. }
  477. int router_get_router_hash(const char *s, char *digest)
  478. {
  479. return router_get_hash_impl(s,digest,
  480. "router ","router-signature");
  481. }
  482. /* return 0 if myversion is in start. Else return -1. */
  483. int compare_recommended_versions(const char *myversion, const char *start) {
  484. int len_myversion = strlen(myversion);
  485. char *comma;
  486. const char *end = start + strlen(start);
  487. log_fn(LOG_DEBUG,"checking '%s' in '%s'.", myversion, start);
  488. for(;;) {
  489. comma = strchr(start, ',');
  490. if( ((comma ? comma : end) - start == len_myversion) &&
  491. !strncmp(start, myversion, len_myversion))
  492. /* only do strncmp if the length matches */
  493. return 0; /* success, it's there */
  494. if(!comma)
  495. return -1; /* nope */
  496. start = comma+1;
  497. }
  498. }
  499. int router_set_routerlist_from_directory(const char *s, crypto_pk_env_t *pkey)
  500. {
  501. if (router_get_routerlist_from_directory_impl(s, &routerlist, pkey)) {
  502. log_fn(LOG_WARN, "Couldn't parse directory.");
  503. return -1;
  504. }
  505. if (router_resolve_routerlist(routerlist)) {
  506. log_fn(LOG_WARN, "Error resolving routerlist");
  507. return -1;
  508. }
  509. if (compare_recommended_versions(VERSION, routerlist->software_versions) < 0) {
  510. log(options.IgnoreVersion ? LOG_WARN : LOG_ERR,
  511. "You are running Tor version %s, which is not recommended.\n"
  512. "Please upgrade to one of %s.",
  513. VERSION, routerlist->software_versions);
  514. if(options.IgnoreVersion) {
  515. log(LOG_WARN, "IgnoreVersion is set. If it breaks, we told you so.");
  516. } else {
  517. fflush(0);
  518. exit(0);
  519. }
  520. }
  521. return 0;
  522. }
  523. static int
  524. router_get_routerlist_from_directory_impl(const char *s, routerlist_t **dest,
  525. crypto_pk_env_t *pkey)
  526. {
  527. directory_token_t tok;
  528. char digest[20];
  529. char signed_digest[128];
  530. routerlist_t *new_dir = NULL;
  531. char *versions = NULL;
  532. struct tm published;
  533. time_t published_on;
  534. char *good_nickname_lst[1024];
  535. int n_good_nicknames = 0;
  536. int i;
  537. #define NEXT_TOK() \
  538. do { \
  539. if (router_get_next_token(&s, &tok)) { \
  540. log_fn(LOG_WARN, "Error reading directory: %s", tok.val.error);\
  541. return -1; \
  542. } } while (0)
  543. #define TOK_IS(type,name) \
  544. do { \
  545. if (tok.tp != type) { \
  546. router_release_token(&tok); \
  547. log_fn(LOG_WARN, "Error reading directory: expected %s", name);\
  548. return -1; \
  549. } } while(0)
  550. #define N_ARGS tok.val.cmd.n_args
  551. #define ARGS tok.val.cmd.args
  552. tok.tp = _NIL;
  553. if (router_get_dir_hash(s, digest)) {
  554. log_fn(LOG_WARN, "Unable to compute digest of directory");
  555. goto err;
  556. }
  557. log(LOG_DEBUG,"Received directory hashes to %02x:%02x:%02x:%02x",
  558. ((int)digest[0])&0xff,((int)digest[1])&0xff,
  559. ((int)digest[2])&0xff,((int)digest[3])&0xff);
  560. NEXT_TOK();
  561. TOK_IS(K_SIGNED_DIRECTORY, "signed-directory");
  562. NEXT_TOK();
  563. TOK_IS(K_PUBLISHED, "published");
  564. assert(N_ARGS == 1);
  565. if (!strptime(ARGS[0], "%Y-%m-%d %H:%M:%S", &published)) {
  566. log_fn(LOG_WARN, "Published time was unparseable"); goto err;
  567. }
  568. published_on = tor_timegm(&published);
  569. NEXT_TOK();
  570. TOK_IS(K_RECOMMENDED_SOFTWARE, "recommended-software");
  571. if (N_ARGS != 1) {
  572. log_fn(LOG_WARN, "Invalid recommended-software line");
  573. goto err;
  574. }
  575. versions = ARGS[0];
  576. tok.val.cmd.n_args = 0; /* Don't let the versions string get freed. */
  577. NEXT_TOK();
  578. TOK_IS(K_RUNNING_ROUTERS, "running-routers");
  579. n_good_nicknames = N_ARGS;
  580. memcpy(good_nickname_lst, ARGS, n_good_nicknames*sizeof(char *));
  581. N_ARGS = 0; /* Don't free the strings in good_nickname_lst. */
  582. if (router_get_list_from_string_impl(&s, &new_dir,
  583. n_good_nicknames,
  584. (const char**)good_nickname_lst)) {
  585. log_fn(LOG_WARN, "Error reading routers from directory");
  586. goto err;
  587. }
  588. new_dir->software_versions = versions; versions = NULL;
  589. new_dir->published_on = published_on;
  590. NEXT_TOK();
  591. TOK_IS(K_DIRECTORY_SIGNATURE, "directory-signature");
  592. NEXT_TOK();
  593. TOK_IS(_SIGNATURE, "signature");
  594. if (pkey) {
  595. if (crypto_pk_public_checksig(pkey, tok.val.signature, 128, signed_digest)
  596. != 20) {
  597. log_fn(LOG_WARN, "Error reading directory: invalid signature.");
  598. goto err;
  599. }
  600. log(LOG_DEBUG,"Signed directory hash starts %02x:%02x:%02x:%02x",
  601. ((int)signed_digest[0])&0xff,((int)signed_digest[1])&0xff,
  602. ((int)signed_digest[2])&0xff,((int)signed_digest[3])&0xff);
  603. if (memcmp(digest, signed_digest, 20)) {
  604. log_fn(LOG_WARN, "Error reading directory: signature does not match.");
  605. goto err;
  606. }
  607. }
  608. NEXT_TOK();
  609. TOK_IS(_EOF, "end of directory");
  610. if (*dest)
  611. routerlist_free(*dest);
  612. *dest = new_dir;
  613. return 0;
  614. err:
  615. router_release_token(&tok);
  616. if (new_dir)
  617. routerlist_free(new_dir);
  618. if (versions)
  619. tor_free(versions);
  620. if (n_good_nicknames) {
  621. for (i = 0; i < n_good_nicknames; ++i) {
  622. tor_free(good_nickname_lst[i]);
  623. }
  624. }
  625. return -1;
  626. #undef NEXT_TOK
  627. #undef TOK_IS
  628. #undef ARGS
  629. #undef N_ARGS
  630. }
  631. static int
  632. router_get_list_from_string_impl(const char **s, routerlist_t **dest,
  633. int n_good_nicknames,
  634. const char **good_nickname_lst)
  635. {
  636. routerinfo_t *router;
  637. routerinfo_t **rarray;
  638. int rarray_len = 0;
  639. int i;
  640. assert(s && *s);
  641. rarray = (routerinfo_t **)tor_malloc((sizeof(routerinfo_t *))*MAX_ROUTERS_IN_DIR);
  642. while (1) {
  643. *s = eat_whitespace(*s);
  644. if (strncmp(*s, "router ", 7)!=0)
  645. break;
  646. router = router_get_entry_from_string(s);
  647. if (!router) {
  648. log_fn(LOG_WARN, "Error reading router");
  649. for(i=0;i<rarray_len;i++)
  650. routerinfo_free(rarray[i]);
  651. free(rarray);
  652. return -1;
  653. }
  654. if (rarray_len >= MAX_ROUTERS_IN_DIR) {
  655. log_fn(LOG_WARN, "too many routers");
  656. routerinfo_free(router);
  657. continue;
  658. }
  659. if (n_good_nicknames>=0) {
  660. router->is_running = 0;
  661. for (i = 0; i < n_good_nicknames; ++i) {
  662. if (0==strcasecmp(good_nickname_lst[i], router->nickname)) {
  663. router->is_running = 1;
  664. break;
  665. }
  666. }
  667. } else {
  668. router->is_running = 1; /* start out assuming all dirservers are up */
  669. }
  670. rarray[rarray_len++] = router;
  671. log_fn(LOG_DEBUG,"just added router #%d.",rarray_len);
  672. }
  673. if (*dest)
  674. routerlist_free(*dest);
  675. *dest = (routerlist_t *)tor_malloc(sizeof(routerlist_t));
  676. (*dest)->routers = rarray;
  677. (*dest)->n_routers = rarray_len;
  678. (*dest)->software_versions = NULL;
  679. return 0;
  680. }
  681. static int
  682. router_resolve(routerinfo_t *router)
  683. {
  684. struct hostent *rent;
  685. rent = (struct hostent *)gethostbyname(router->address);
  686. if (!rent) {
  687. log_fn(LOG_WARN,"Could not get address for router %s.",router->address);
  688. return -1;
  689. }
  690. assert(rent->h_length == 4);
  691. memcpy(&router->addr, rent->h_addr,rent->h_length);
  692. router->addr = ntohl(router->addr); /* get it back into host order */
  693. return 0;
  694. }
  695. static int
  696. router_resolve_routerlist(routerlist_t *rl)
  697. {
  698. int i, max, remove;
  699. if (!rl)
  700. rl = routerlist;
  701. max = rl->n_routers;
  702. for (i = 0; i < max; ++i) {
  703. remove = 0;
  704. if (router_resolve(rl->routers[i])) {
  705. log_fn(LOG_WARN, "Couldn't resolve router %s; not using",
  706. rl->routers[i]->address);
  707. remove = 1;
  708. } else if (options.Nickname &&
  709. !strcmp(rl->routers[i]->nickname, options.Nickname)) {
  710. remove = 1;
  711. }
  712. if (remove) {
  713. routerinfo_free(rl->routers[i]);
  714. rl->routers[i] = rl->routers[--max];
  715. --rl->n_routers;
  716. --i;
  717. }
  718. }
  719. return 0;
  720. }
  721. /* reads a single router entry from s.
  722. * updates s so it points to after the router it just read.
  723. * mallocs a new router and returns it if all goes well, else returns NULL.
  724. */
  725. routerinfo_t *router_get_entry_from_string(const char**s) {
  726. routerinfo_t *router = NULL;
  727. char signed_digest[128];
  728. char digest[128];
  729. directory_token_t _tok;
  730. directory_token_t *tok = &_tok;
  731. struct tm published;
  732. int t;
  733. #define NEXT_TOKEN() \
  734. do { if (router_get_next_token(s, tok)) { \
  735. log_fn(LOG_WARN, "Error reading directory: %s", tok->val.error);\
  736. goto err; \
  737. } } while(0)
  738. #define ARGS tok->val.cmd.args
  739. #define N_ARGS tok->val.cmd.n_args
  740. _tok.tp = _NIL;
  741. if (router_get_router_hash(*s, digest) < 0) {
  742. log_fn(LOG_WARN, "Couldn't compute router hash.");
  743. return NULL;
  744. }
  745. NEXT_TOKEN();
  746. if (tok->tp != K_ROUTER) {
  747. log_fn(LOG_WARN,"Entry does not start with \"router\"");
  748. goto err;
  749. }
  750. router = tor_malloc_zero(sizeof(routerinfo_t));
  751. router->onion_pkey = router->identity_pkey = router->link_pkey = NULL;
  752. if (N_ARGS != 6) {
  753. log_fn(LOG_WARN,"Wrong # of arguments to \"router\"");
  754. goto err;
  755. }
  756. router->nickname = tor_strdup(ARGS[0]);
  757. if (strlen(router->nickname) > MAX_NICKNAME_LEN) {
  758. log_fn(LOG_WARN,"Router nickname too long.");
  759. goto err;
  760. }
  761. if (strspn(router->nickname, LEGAL_NICKNAME_CHARACTERS) !=
  762. strlen(router->nickname)) {
  763. log_fn(LOG_WARN, "Router nickname contains illegal characters.");
  764. goto err;
  765. }
  766. /* read router.address */
  767. router->address = tor_strdup(ARGS[1]);
  768. router->addr = 0;
  769. /* Read router->or_port */
  770. router->or_port = atoi(ARGS[2]);
  771. if(!router->or_port) {
  772. log_fn(LOG_WARN,"or_port unreadable or 0. Failing.");
  773. goto err;
  774. }
  775. /* Router->socks_port */
  776. router->socks_port = atoi(ARGS[3]);
  777. /* Router->dir_port */
  778. router->dir_port = atoi(ARGS[4]);
  779. /* Router->bandwidth */
  780. router->bandwidth = atoi(ARGS[5]);
  781. if (!router->bandwidth) {
  782. log_fn(LOG_WARN,"bandwidth unreadable or 0. Failing.");
  783. goto err;
  784. }
  785. log_fn(LOG_DEBUG,"or_port %d, socks_port %d, dir_port %d, bandwidth %d.",
  786. router->or_port, router->socks_port, router->dir_port, router->bandwidth);
  787. /* XXX Later, require platform before published. */
  788. NEXT_TOKEN();
  789. if (tok->tp == K_PLATFORM) {
  790. NEXT_TOKEN();
  791. }
  792. if (tok->tp != K_PUBLISHED) {
  793. log_fn(LOG_WARN, "Missing published time"); goto err;
  794. }
  795. assert(N_ARGS == 1);
  796. if (!strptime(ARGS[0], "%Y-%m-%d %H:%M:%S", &published)) {
  797. log_fn(LOG_WARN, "Published time was unparseable"); goto err;
  798. }
  799. router->published_on = tor_timegm(&published);
  800. NEXT_TOKEN();
  801. if (tok->tp != K_ONION_KEY) {
  802. log_fn(LOG_WARN, "Missing onion-key"); goto err;
  803. }
  804. NEXT_TOKEN();
  805. if (tok->tp != _PUBLIC_KEY) {
  806. log_fn(LOG_WARN, "Missing onion key"); goto err;
  807. } /* XXX Check key length */
  808. router->onion_pkey = tok->val.public_key;
  809. NEXT_TOKEN();
  810. if (tok->tp != K_LINK_KEY) {
  811. log_fn(LOG_WARN, "Missing link-key"); goto err;
  812. }
  813. NEXT_TOKEN();
  814. if (tok->tp != _PUBLIC_KEY) {
  815. log_fn(LOG_WARN, "Missing link key"); goto err;
  816. } /* XXX Check key length */
  817. router->link_pkey = tok->val.public_key;
  818. NEXT_TOKEN();
  819. if (tok->tp != K_SIGNING_KEY) {
  820. log_fn(LOG_WARN, "Missing signing-key"); goto err;
  821. }
  822. NEXT_TOKEN();
  823. if (tok->tp != _PUBLIC_KEY) {
  824. log_fn(LOG_WARN, "Missing signing key"); goto err;
  825. }
  826. router->identity_pkey = tok->val.public_key;
  827. NEXT_TOKEN();
  828. while (tok->tp == K_ACCEPT || tok->tp == K_REJECT) {
  829. router_add_exit_policy(router, tok);
  830. NEXT_TOKEN();
  831. }
  832. if (tok->tp != K_ROUTER_SIGNATURE) {
  833. log_fn(LOG_WARN,"Missing router signature");
  834. goto err;
  835. }
  836. NEXT_TOKEN();
  837. if (tok->tp != _SIGNATURE) {
  838. log_fn(LOG_WARN,"Missing router signature");
  839. goto err;
  840. }
  841. assert (router->identity_pkey);
  842. if ((t=crypto_pk_public_checksig(router->identity_pkey, tok->val.signature,
  843. 128, signed_digest)) != 20) {
  844. log_fn(LOG_WARN, "Invalid signature %d",t);
  845. goto err;
  846. }
  847. if (memcmp(digest, signed_digest, 20)) {
  848. log_fn(LOG_WARN, "Mismatched signature");
  849. goto err;
  850. }
  851. router_release_token(tok); /* free the signature */
  852. return router;
  853. err:
  854. router_release_token(tok);
  855. routerinfo_free(router);
  856. return NULL;
  857. #undef ARGS
  858. #undef N_ARGS
  859. #undef NEXT_TOKEN
  860. }
  861. int
  862. router_add_exit_policy_from_string(routerinfo_t *router, const char *s)
  863. {
  864. directory_token_t tok;
  865. const char *cp;
  866. char *tmp;
  867. int r;
  868. int len, idx;
  869. tok.tp = _NIL;
  870. len = strlen(s);
  871. cp = tmp = tor_malloc(len+2);
  872. for (idx = 0; idx < len; ++idx) {
  873. tmp[idx] = tolower(s[idx]);
  874. }
  875. tmp[len]='\n';
  876. tmp[len+1]='\0';
  877. if (router_get_next_token(&cp, &tok)) {
  878. log_fn(LOG_WARN, "Error reading exit policy: %s", tok.val.error);
  879. free(tmp);
  880. return -1;
  881. }
  882. if (tok.tp != K_ACCEPT && tok.tp != K_REJECT) {
  883. log_fn(LOG_WARN, "Expected 'accept' or 'reject'.");
  884. free(tmp);
  885. return -1;
  886. }
  887. r = router_add_exit_policy(router, &tok);
  888. free(tmp);
  889. return r;
  890. }
  891. static int router_add_exit_policy(routerinfo_t *router,
  892. directory_token_t *tok) {
  893. struct exit_policy_t *tmpe, *newe;
  894. struct in_addr in;
  895. char *arg, *address, *mask, *port, *endptr;
  896. int bits;
  897. if (tok->val.cmd.n_args != 1)
  898. return -1;
  899. arg = tok->val.cmd.args[0];
  900. newe = tor_malloc_zero(sizeof(struct exit_policy_t));
  901. newe->string = tor_malloc(8+strlen(arg));
  902. if (tok->tp == K_REJECT) {
  903. strcpy(newe->string, "reject ");
  904. newe->policy_type = EXIT_POLICY_REJECT;
  905. } else {
  906. assert(tok->tp == K_ACCEPT);
  907. strcpy(newe->string, "accept ");
  908. newe->policy_type = EXIT_POLICY_ACCEPT;
  909. }
  910. strcat(newe->string, arg);
  911. address = arg;
  912. mask = strchr(arg,'/');
  913. port = strchr(mask?mask:arg,':');
  914. if(!port)
  915. goto policy_read_failed;
  916. if (mask)
  917. *mask++ = 0;
  918. *port++ = 0;
  919. if (strcmp(address, "*") == 0) {
  920. newe->addr = 0;
  921. } else if (inet_aton(address, &in) != 0) {
  922. newe->addr = ntohl(in.s_addr);
  923. } else {
  924. log_fn(LOG_WARN, "Malformed IP %s in exit policy; rejecting.",
  925. address);
  926. goto policy_read_failed;
  927. }
  928. if (!mask) {
  929. if (strcmp(address, "*") == 0)
  930. newe->msk = 0;
  931. else
  932. newe->msk = 0xFFFFFFFFu;
  933. } else {
  934. endptr = NULL;
  935. bits = (int) strtol(mask, &endptr, 10);
  936. if (!*endptr) {
  937. /* strtol handled the whole mask. */
  938. newe->msk = ~((1<<(32-bits))-1);
  939. } else if (inet_aton(mask, &in) != 0) {
  940. newe->msk = ntohl(in.s_addr);
  941. } else {
  942. log_fn(LOG_WARN, "Malformed mask %s on exit policy; rejecting.",
  943. mask);
  944. goto policy_read_failed;
  945. }
  946. }
  947. if (strcmp(port, "*") == 0) {
  948. newe->prt = 0;
  949. } else {
  950. endptr = NULL;
  951. newe->prt = strtol(port, &endptr, 10);
  952. if (*endptr) {
  953. log_fn(LOG_WARN, "Malformed port %s on exit policy; rejecting.",
  954. port);
  955. goto policy_read_failed;
  956. }
  957. }
  958. in.s_addr = htonl(newe->addr);
  959. address = tor_strdup(inet_ntoa(in));
  960. in.s_addr = htonl(newe->msk);
  961. log_fn(LOG_DEBUG,"%s %s/%s:%d",
  962. newe->policy_type == EXIT_POLICY_REJECT ? "reject" : "accept",
  963. address, inet_ntoa(in), newe->prt);
  964. tor_free(address);
  965. /* now link newe onto the end of exit_policy */
  966. if(!router->exit_policy) {
  967. router->exit_policy = newe;
  968. return 0;
  969. }
  970. for(tmpe=router->exit_policy; tmpe->next; tmpe=tmpe->next) ;
  971. tmpe->next = newe;
  972. return 0;
  973. policy_read_failed:
  974. assert(newe->string);
  975. log_fn(LOG_WARN,"Couldn't parse line '%s'. Dropping", newe->string);
  976. tor_free(newe->string);
  977. free(newe);
  978. return -1;
  979. }
  980. /* Addr is 0 for "IP unknown".
  981. *
  982. * Returns -1 for 'rejected', 0 for accepted, 1 for 'maybe' (since IP is
  983. * unknown.
  984. */
  985. int router_supports_exit_address(uint32_t addr, uint16_t port,
  986. routerinfo_t *router)
  987. {
  988. return router_compare_addr_to_exit_policy(addr, port, router->exit_policy);
  989. }
  990. /* Addr is 0 for "IP unknown".
  991. *
  992. * Returns -1 for 'rejected', 0 for accepted, 1 for 'maybe' (since IP is
  993. * unknown.
  994. */
  995. int router_compare_addr_to_exit_policy(uint32_t addr, uint16_t port,
  996. struct exit_policy_t *policy)
  997. {
  998. int maybe_reject = 0;
  999. int match = 0;
  1000. struct in_addr in;
  1001. struct exit_policy_t *tmpe;
  1002. for(tmpe=policy; tmpe; tmpe=tmpe->next) {
  1003. log_fn(LOG_DEBUG,"Considering exit policy %s", tmpe->string);
  1004. if (!addr) {
  1005. /* Address is unknown. */
  1006. if (tmpe->msk == 0 && (!tmpe || port == tmpe->prt)) {
  1007. /* The exit policy is accept/reject *:port */
  1008. match = 1;
  1009. } else if ((!tmpe->prt || port == tmpe->prt) &&
  1010. tmpe->policy_type == EXIT_POLICY_REJECT) {
  1011. /* The exit policy is reject ???:port */
  1012. maybe_reject = 1;
  1013. }
  1014. } else {
  1015. /* Address is known */
  1016. if ( (addr & tmpe->msk) == (tmpe->addr & tmpe->msk) &&
  1017. (!tmpe->prt || port == tmpe->prt) ) {
  1018. /* Exact match for the policy */
  1019. match = 1;
  1020. }
  1021. }
  1022. if (match) {
  1023. in.s_addr = htonl(addr);
  1024. log_fn(LOG_INFO,"Address %s:%d matches exit policy '%s'",
  1025. inet_ntoa(in), port, tmpe->string);
  1026. if(tmpe->policy_type == EXIT_POLICY_ACCEPT)
  1027. return 0;
  1028. else
  1029. return -1;
  1030. }
  1031. }
  1032. if (maybe_reject)
  1033. return 1;
  1034. else
  1035. return 0; /* accept all by default. */
  1036. }
  1037. /* return 1 if all running routers will reject addr:port, return 0 if
  1038. any might accept it. */
  1039. int router_exit_policy_all_routers_reject(uint32_t addr, uint16_t port) {
  1040. int i;
  1041. routerinfo_t *router;
  1042. for (i=0;i<routerlist->n_routers;i++) {
  1043. router = routerlist->routers[i];
  1044. if (router->is_running && router_compare_addr_to_exit_policy(addr,
  1045. port, router->exit_policy) >= 0)
  1046. return 0; /* this one could be ok. good enough. */
  1047. }
  1048. return 1; /* all will reject. */
  1049. }
  1050. int router_exit_policy_rejects_all(routerinfo_t *router) {
  1051. if (router_compare_addr_to_exit_policy(0, 0, router->exit_policy) < 0)
  1052. return 1; /* yes, rejects all */
  1053. else
  1054. return 0; /* no, might accept some */
  1055. }
  1056. /*
  1057. Local Variables:
  1058. mode:c
  1059. indent-tabs-mode:nil
  1060. c-basic-offset:2
  1061. End:
  1062. */