| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 | $Id: /tor/branches/eventdns/doc/dir-spec.txt 9469 2006-11-01T23:56:30.179423Z nickm  $                     Voting on the Tor Directory System0. Scope and preliminaries  This document describes a consensus voting scheme for Tor directories.  Once it's accepted, it should be merged with dir-spec.txt.  Some  preliminaries for authority and caching support should be done during  the 0.1.2.x series; the main deployment should come during the 0.1.3.x  series.0.1. Goals and motivation: voting.  The current directory system relies on clients downloading separate  network status statements from the caches signed by each directory.  Clients download a new statement every 30 minutes or so, choosing to  replace the oldest statement they currently have.  This creates a partitioning problem: different clients have different  "most recent" networkstatus sources, and different versions of each  (since authorities change their statements often).  Also, it is very  redundant: most of the downloaded networkstatus are probably quite  similar.  So if we have clients only download a single multiply signed consensus  network status statement, we can:       - Save bandwidth.       - Reduce client partitioning       - Reduce client-side and cache-side storage       - Simplify client-side voting code (by moving voting away from the         client)  We should try to do this without:       - Assuming that client-side or cache-side clocks are more correct         than we assume now.       - Assuming that authority clocks are perfectly correct.       - Degrading badly if an authority dies or is offline for a bit.  We do not have to perform well if:      - No clique of more than half the authorities can agree about who        the authorities are.1. The idea.  Instead of publishing a network status whenever something changes,  each authority instead publishes a fresh network status only once per  "period" (say, 60 minutes).  Authorities either upload this network  status (or "vote") to every other authority, or download every other  authority's "vote" (see 3.1 below for discussion on push vs pull).  After an authority has (or has become convinced that it won't be able to  get) every other authority's vote, it deterministically computes a  consensus networkstatus, and signs it.  Authorities download (or are  uploaded; see 3.1) one another's signatures, and form a multiply signed  consensus.  This multiply-signed consensus is what caches cache and what  clients download.  If an authority is down, authorities vote based on what they *can*  download/get uploaded.  If an authority is "a little" down and only some authorities can reach  it, authorities try to get its info from other authorities.  If an authority computes the vote wrong, its signature isn't included on  the consensus.  Clients use a consensus if it is signed by more than half the  authorities they recognize.  If they can't find any such consensus,  clients either use an older version, or beg the user to adapt the list  of authorities.2. Details.2.1. Vote specifications  Votes in v2.1 are just like v2 network status documents.  We add these  fields to the preamble:     "vote-status" -- the word "vote".     "valid-until" -- the time when this authority expects to publish its        next vote.     "known-flags" -- a space-separated list of flags that will sometimes        be included on "s" lines later in the vote.     "dir-source" -- as before, except the "hostname" part MUST be the        authority's nickname, which MUST be unique among authorities, and        MUST match the nickname in the "directory-signature" entry.  Authorities SHOULD cache their most recently generated votes so they  can persist them across restarts.  Authorities SHOULD NOT generate  another document until valid-until has passed.  Router entries in the vote MUST be sorted in ascending order by router  identity digest.  The flags in "s" lines MUST appear in alphabetical  order.  Votes SHOULD be synchronized to half-hour publication intervals (one  hour? XXX say more; be more precise.)  XXXX some way to request older networkstatus docs?2.2. Consensus directory specifications  Consensuses are like v2.1 votes, except for the following fields:     "vote-status" -- the word "consensus".     "published" is the latest of all the published times on the votes.     "valid-until" is the earliest of all the valid-until times on the       votes.     "dir-source" and "fingerprint" and "dir-signing-key" and "contact"       are included for each authority that contributed to the vote.     "vote-digest" for each authority that contributed to the vote,       calculated as for the digest in the signature on the vote. [XXX       re-English this sentence]     "client-versions" and "server-versions" are sorted in ascending       order.     "dir-options" and "known-flags" are not included.  The fields MUST occur in the following order:     "network-status-version"     "vote-status"     "published"     "valid-until"     For each authority, sorted in ascending order of nickname, case-     insensitively:         "dir-source", "fingerprint", "contact", "dir-signing-key",         "vote-digest".     "client-versions"     "server-versions"  The signatures at the end of the document appear as multiple instances  directory-signature, sorted in ascending order by nickname,  case-insensitively.  A router entry should be included in the result if it is included by  more than half of the authorities (total authorities, not just those  whose votes we have).  A router entry has a flag set if it is included  by more than half of the authorities who care about that flag.  [XXXX  this creates a DOS incentive.  Can we remember what flags people set the  last time we saw them?]  [What does the signature hash cover ? XXX]2.3. Agreement and timeline  [XXXX publish signed vote summaries.]  [XXXX URL list: vote, other people's votes, directory.]  [XXXX in-progress URL vs done URL]  [XXXX Store votes to disk.]2.4. Distributing routerdescs between authorities  Consensus will be more meaningful if authorities take steps to make sure  that they all have the same set of descriptors _before_ the voting  starts.  This is safe, since all descriptors are self-certified and  timestamped: it's always okay to replace a signed descriptor with a more  recent one signed by the same identity.  In the long run, we might want some kind of sophisticated process here.  For now, since authorities already download one another's networkstatus  documents and use them to determine what descriptors to download from one  another, we can rely on this existing mechanism to keep authorities up to  date.3. Questions and concerns3.1. Push or pull?  [XXXX]3.2. Dropping "opt".  The "opt" keyword in Tor's directory formats was originally intended to  mean, "it is okay to ignore this entry if you don't understand it"; the  default behavior has been "discard a routerdesc if it contains entries you  don't recognize."  But so far, every new flag we have added has been marked 'opt'.  It would  probably make sense to change the default behavior to "ignore unrecognized  fields", and add the statement that clients SHOULD ignore fields they don't  recognize.  As a meta-principle, we should say that clients and servers  MUST NOT have to understand new fields in order to use directory documents  correctly.  Of course, this will make it impossible to say, "The format has changed a  lot; discard this quietly if you don't understand it." We could do that by  adding a version field.3.3. Multilevel keys.  Replacing a directory authority's identity key in the event of a compromise  would be tremendously annoying.  We'd need to tell every client to switch  their configuration, or update to a new version with an uploaded list.  So  long as some weren't upgraded, they'd be at risk from whoever had  compromised the key.  With this in mind, it's a shame that our current protocol forces us to  store identity keys unencrypted in RAM.  We need some kind of signing key  stored unencrypted, since we need to generate new descriptors/directories  and rotate link and onion keys regularly.  (And since, of course, we can't  ask server operators to be on-hand to enter a passphrase every time we  want to rotate keys or sign a descriptor.)  The obvious solution seems to be to have a signing-only key that lives  indefinitely (months or longer) and signs descriptors and link keys, and a  separate identity key that's used to sign the signing key.  Tor servers  could run in one of several modes:    1. Identity key stored encrypted.  You need to pick a passphrase when       you enable this mode, and re-enter this passphrase every time you       rotate the signing key.    1'. Identity key stored separate.  You save your identity key to a       floppy, and use the floppy when you need to rotate the signing key.    2. All keys stored unencrypted.  In this case, we might not want to even       *have* a separate signing key.  (We'll need to support no-separate-       signing-key mode anyway to keep old servers working.)    3. All keys stored encrypted. You need to enter a passphrase to start       Tor.  (Of course, we might not want to implement all of these.)  Case 1 is probably most usable and secure, if we assume that people don't  forget their passphrases or lose their floppies.  We could mitigate this a  bit by encouraging people to PGP-encrypt their passphrases to themselves,  or keep a cleartext copy of their secret key secret-split into a few  pieces, or something like that.  Migration presents another difficulty, especially with the authorities.  If  we use the current set of identity keys as the new identity keys, we're in  the position of having sensitive keys that have been stored on  media-of-dubious-encryption up to now.  Also, we need to keep old clients  (who will expect descriptors to be signed by the identity keys they know  and love, and who will not understand signing keys) happy.  I'd enumerate designs here, but I'm hoping that somebody will come up with  a better one, so I'll try not to prejudice them with more ideas yet.  Oh, and of course, we'll want to make sure that the keys are  cross-certified. :)  Ideas? -NM3.4. Long and short descriptors  Some of the costliest fields in the current directory protocol are ones  that no client actually uses.  In particular, the "read-history" and  "write-history" fields are used only by the authorities for monitoring the  status of the network.  If we took them out, the size of a compressed list  of all the routers would fall by about 60%.  (No other disposable field  would save more than 2%.)  One possible solution here is that routers should generate and upload a  short-form and long-form descriptor.  Only the short-form descriptor should  ever be used by anybody for routing.  The long-form descriptor should be  used only for analytics and other tools.  (If we allowed people to route with  long descriptors, we'd have to ensure that they stayed in sync with the  short ones somehow.)  Another possible solution would be to drop these fields from descriptors,  and have them uploaded as a part of a separate "bandwidth report" to the  authorities.  This could help prevent the mistake of using long descriptors  in the place of short ones.  Thoughts? -NM4. Migration  For directory voting, ...caches need to start caching consensuses and accepting multisigned documents.
 |