TODO 16 KB

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