TODO 14 KB

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