TODO 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. Legend:
  2. SPEC!! - Not specified
  3. SPEC - Spec not finalized
  4. NICK - nick claims
  5. ARMA - arma claims
  6. - Not done
  7. * Top priority
  8. . Partially done
  9. o Done
  10. D Deferred
  11. X Abandoned
  12. Bugs:
  13. - Sometimes it picks a middleman node as the exit for a circuit.
  14. - if you specify a non-dirserver as exitnode or entrynode, when it
  15. makes the first few circuits it hasn't yet fetched the directory,
  16. so it warns that it doesn't know the node.
  17. - make 'make test' exit(1) if a test fails.
  18. - fix buffer unit test so it passes
  19. Short-term:
  20. - when you hup, rewrite the router.desc file (and maybe others)
  21. - consider handling broken socks4 implementations
  22. - improve how it behaves when i remove a line from the approved-routers files
  23. - Make tls connections tls_close intentionally
  24. o Rename ACI to circID
  25. . integrate rep_ok functions, see what breaks
  26. - update tor faq
  27. o obey SocksBindAddress, ORBindAddress
  28. o warn if we're running as root
  29. o make connection_flush_buf() more obviously obsolete
  30. o let hup reread the config file, eg so we can get new exit
  31. policies without restarting
  32. o Put recommended_versions in a config entry
  33. X use times(2) rather than gettimeofday to measure how long it
  34. takes to process a cell
  35. o Separate trying to rebuild a circuit because you have none from trying
  36. to rebuild a circuit because the current one is stale
  37. X Continue reading from socks port even while waiting for connect.
  38. o Exit policies
  39. o Spec how to write the exit policies
  40. o Path selection algorithms
  41. o Choose path more incrementally
  42. o Let user request first/last node
  43. o And disallow certain nodes
  44. D Choose path by jurisdiction, etc?
  45. o Make relay end cells have failure status and payload attached
  46. X let non-approved routers handshake.
  47. - Dirserver shouldn't put you in running-routers list if you haven't
  48. uploaded a descriptor recently
  49. . migrate to using nickname rather than addr:port for routers
  50. o decide_aci_type
  51. - generate onion skins
  52. - circuit_send_next_onion_skin
  53. - circuit_extend
  54. - onion_generate_cpath
  55. - get_unique_aci_by_addr_port
  56. - circ->n_addr and circ->n_port
  57. - circuit_enumerate_by_naddr_nport
  58. - cpath layers
  59. - connection_or_connect
  60. - connection_exact_get_by_addr_port
  61. - connection_twin_get_by_addr_port
  62. - router_get_by_addr_port
  63. - connection_or_init_conn_from_router
  64. - tag_pack, tag_unpack, connection_cpu_process_inbuf
  65. - directory_initiate_command
  66. . Move from onions to ephemeral DH
  67. o incremental path building
  68. o transition circuit-level sendmes to hop-level sendmes
  69. o implement truncate, truncated
  70. o move from 192byte DH to 128byte DH, so it isn't so damn slow
  71. - exiting from not-last hop
  72. - OP logic to decide to extend/truncate a path
  73. - make sure exiting from the not-last hop works
  74. - logic to find last *open* hop, not last hop, in cpath
  75. o Remember address and port when beginning.
  76. - Extend by nickname/hostname/something, not by IP.
  77. - Need a relay teardown cell, separate from one-way ends.
  78. - remove per-connection rate limiting
  79. - Make it harder to circumvent bandwidth caps: look at number of bytes
  80. sent across sockets, not number sent inside TLS stream.
  81. On-going
  82. . Better comments for functions!
  83. . Go through log messages, reduce confusing error messages.
  84. . make the logs include more info (fd, etc)
  85. . Unit tests
  86. . Update the spec so it matches the code
  87. Mid-term:
  88. - Rotate tls-level connections -- make new ones, expire old ones.
  89. So we get actual key rotation, not just symmetric key rotation
  90. o Are there anonymity issues with sequential streamIDs? Sequential
  91. circIDs? Eg an attacker can learn how many there have been.
  92. The fix is to initialize them randomly rather than at 1.
  93. - Look at having smallcells and largecells
  94. . Redo scheduler
  95. o fix SSL_read bug for buffered records
  96. - make round-robining more fair
  97. - What happens when a circuit's length is 1? What breaks?
  98. . streams / circuits
  99. o Implement streams
  100. o Rotate circuits after N minutes?
  101. X Circuits should expire when circuit->expire triggers
  102. NICK . Handle half-open connections
  103. o openssh is an application that uses half-open connections
  104. o Figure out what causes connections to close, standardize
  105. when we mark a connection vs when we tear it down
  106. o Look at what ssl does to keep from mutating data streams
  107. o Put CPU workers in separate processes
  108. o Handle multiple cpu workers (one for each cpu, plus one)
  109. o Queue for pending tasks if all workers full
  110. o Support the 'process this onion' task
  111. D Merge dnsworkers and cpuworkers to some extent
  112. o Handle cpuworkers dying
  113. . Scrubbing proxies
  114. - Find an smtp proxy?
  115. - Check the old smtp proxy code
  116. o Find an ftp proxy? wget --passive
  117. D Wait until there are packet redirectors for Linux
  118. . Get socks4a support into Mozilla
  119. . Develop rendezvous points
  120. X Handle socks commands other than connect, eg, bind?
  121. o Design
  122. - Spec
  123. - Implement
  124. . Tests
  125. o Testing harness/infrastructure
  126. D System tests (how?)
  127. - Performance tests, so we know when we've improved
  128. . webload infrastructure (Bruce)
  129. . httperf infrastructure (easy to set up)
  130. . oprofile (installed in RH >8.0)
  131. NICK . Daemonize and package
  132. o Teach it to fork and background
  133. - Red Hat spec file
  134. - Debian spec file equivalent
  135. . Portability
  136. . Which .h files are we actually using?
  137. . Port to:
  138. o Linux
  139. o BSD
  140. . Solaris
  141. o Cygwin
  142. . Win32
  143. o OS X
  144. - deal with pollhup / reached_eof on all platforms
  145. o openssl randomness
  146. o inet_ntoa
  147. o stdint.h
  148. - Make a script to set up a local network on your machine
  149. o More flexibility in node addressing
  150. D Support IPv6 rather than just 4
  151. o Handle multihomed servers (config variable to set IP)
  152. In the distant future:
  153. D Load balancing between router twins
  154. D Keep track of load over links/nodes, to
  155. know who's hosed
  156. SPEC!! D Non-clique topologies
  157. D Implement our own memory management, at least for common structs
  158. (Not ever necessary?)
  159. D Advanced directory servers
  160. D Automated reputation management
  161. SPEC!! D Figure out how to do threshold directory servers
  162. D jurisdiction info in dirserver entries? other info?
  163. Older (done) todo stuff:
  164. For 0.0.2pre17:
  165. o Put a H(K | handshake) into the onionskin response
  166. o Make cells 512 bytes
  167. o Reduce streamid footprint from 7 bytes to 2 bytes
  168. X Check for collisions in streamid (now possible with
  169. just 2 bytes), and back up & replace with padding if so
  170. o Use the 4 reserved bytes in each cell header to keep 1/5
  171. of a sha1 of the ongoing relay payload (move into stream header)
  172. o Move length into the stream header too
  173. o Make length 2 bytes
  174. D increase DH key length
  175. D increase RSA key length
  176. D Spec the stream_id stuff. Clarify that nobody on the backward
  177. stream should look at stream_id.
  178. Cell:
  179. ACI (anonymous circuit identifier) [2 bytes]
  180. Command [1 byte]
  181. Payload (padded with 0 bytes) [509 bytes]
  182. Relay payload:
  183. Relay command [1 byte]
  184. Stream ID [7 bytes]
  185. Partial SHA-1 [4 bytes]
  186. Length [2 bytes]
  187. Relay payload [495 bytes]
  188. For 0.0.2pre15:
  189. o don't pick exit nodes which will certainly reject all things.
  190. o don't pick nodes that the directory says are down
  191. o choose randomly from running dirservers, not just first one
  192. o install the man page
  193. o warn when client-side tries an address/port which no router in the dir accepts.
  194. For 0.0.2pre14:
  195. o More flexible exit policies (18.*, 18.0.0.0/8)
  196. o Work to succeed in the precense of exit policy violation
  197. o Replace desired_path_len with opaque path-selection specifier
  198. o Client-side DNS caching
  199. o Add entries to client DNS cache based on END cells
  200. o Remove port from END_REASON_EXITPOLICY cells
  201. o Start building new circuits when we get an exit-policy
  202. failure. (Defer exiting from the middle of existing
  203. circuits or extending existing circuits for later.)
  204. o Implement function to check whether a routerinfo_t
  205. supports a given exit addr.
  206. o Choose the exit node of an in-progress circuit based on
  207. pending AP connections.
  208. o Choose the exit node _first_, then beginning, then
  209. middle nodes.
  210. Previous:
  211. o Get tor to act like a socks server
  212. o socks4, socks4a
  213. o socks5
  214. o routers have identity key, link key, onion key.
  215. o link key certs are
  216. D signed by identity key
  217. D not in descriptor
  218. o not in config
  219. D not on disk
  220. o identity and onion keys are in descriptor (and disk)
  221. o upon boot, if it doesn't find identity key, generate it and write it.
  222. o also write a file with the identity key fingerprint in it
  223. o router generates descriptor: flesh out router_get_my_descriptor()
  224. o Routers sign descriptors with identity key
  225. o routers put version number in descriptor
  226. o routers should maybe have `uname -a` in descriptor?
  227. o Give nicknames to routers
  228. o in config
  229. o in descriptors
  230. o router posts descriptor
  231. o when it boots
  232. o every DirFetchPostPeriod seconds
  233. D when it changes
  234. o change tls stuff so certs don't get written to disk, or read from disk
  235. o make directory.c 'thread'safe
  236. o dirserver parses descriptor
  237. o dirserver checks signature
  238. D client checks signature?
  239. o dirserver writes directory to file
  240. o reads that file upon boot
  241. o directory includes all routers, up and down
  242. o add "up" line to directory, listing nicknames
  243. o instruments ORs to report stats
  244. o average cell fullness
  245. o average bandwidth used
  246. o configure log files. separate log file, separate severities.
  247. o what assumptions break if we fclose(0) when we daemonize?
  248. o make buffer struct elements opaque outside buffers.c
  249. o add log convention to the HACKING file
  250. o make 'make install' do the right thing
  251. o change binary name to tor
  252. o change config files so you look at commandline, else look in
  253. /etc/torrc. no cascading.
  254. o have an absolute datadir with fixed names for files, and fixed-name
  255. keydir under that with fixed names
  256. o Move (most of) the router/directory code out of main.c
  257. o Simple directory servers
  258. o Include key in source; sign directories
  259. o Signed directory backend
  260. o Document
  261. o Integrate
  262. o Add versions to code
  263. o Have directories list recommended-versions
  264. o Include line in directories
  265. o Check for presence of line.
  266. o Quit if running the wrong version
  267. o Command-line option to override quit
  268. o Add more information to directory server entries
  269. o Exit policies
  270. o Clearer bandwidth management
  271. o Do we want to remove bandwidth from OR handshakes?
  272. o What about OP handshakes?
  273. X Move away from openssl
  274. o Abstract out crypto calls
  275. X Look at nss, others? Just include code?
  276. o Use a stronger cipher
  277. o aes now, by including the code ourselves
  278. X On the fly compression of each stream
  279. o Clean up the event loop (optimize and sanitize)
  280. o Remove that awful concept of 'roles'
  281. o Terminology
  282. o Circuits, topics, cells stay named that
  283. o 'Connection' gets divided, or renamed, or something?
  284. o DNS farm
  285. o Distribute queries onto the farm, get answers
  286. o Preemptively grow a new worker before he's needed
  287. o Prune workers when too many are idle
  288. o DNS cache
  289. o Clear DNS cache over time
  290. D Honor DNS TTL info (how??)
  291. o Have strategy when all workers are busy
  292. o Keep track of which connections are in dns_wait
  293. o Need to cache positives/negatives on the tor side
  294. o Keep track of which queries have been asked
  295. o Better error handling when
  296. o An address doesn't resolve
  297. o We have max workers running
  298. o Consider taking the master out of the loop?
  299. X Implement reply onions
  300. o Total rate limiting
  301. o Look at OR handshake in more detail
  302. o Spec it
  303. o Merge OR and OP handshakes
  304. o rearrange connection_or so it doesn't suck so much to read
  305. D Periodic link key rotation. Spec?
  306. o wrap malloc with something that explodes when it fails
  307. o Clean up the number of places that get to look at prkey