TODO 15 KB

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