|  | @@ -297,6 +297,29 @@ $Id$
 | 
	
		
			
				|  |  |     The "Digest" of a document, unless stated otherwise, is its digest *as
 | 
	
		
			
				|  |  |     signed by this signature scheme*.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +1.4. Voting timeline
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   Every consensus document has a "valid-after" (VA) time, a "fresh-until"
 | 
	
		
			
				|  |  | +   (FU) time and a "valid-until" (VU) time.  VA MUST precede FU, which MUST
 | 
	
		
			
				|  |  | +   in turn precede VU.  Times are chosen so that every consensus will be
 | 
	
		
			
				|  |  | +   "fresh" until the next consensus becomes valid, and "valid" for a while
 | 
	
		
			
				|  |  | +   after.  At least 2 or 3 consensuses should be valid at any given time.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   The timeline for a given consensus is as follows:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   VA-DistSeconds-VoteSeconds: The authorities exchange votes.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   VA-DistSeconds: The authorities calculate the consensus and exchange
 | 
	
		
			
				|  |  | +   signatures.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   VA: All authorities have a multiply signed consensus.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   VA ... FU: Caches download the consensus.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   FU: The consensus is no long the freshest consensus.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   VU: The consensus is no longer valid.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  2. Router operation and formats
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     ORs SHOULD generate a new router descriptor and a new extra-info
 | 
	
	
		
			
				|  | @@ -696,6 +719,14 @@ $Id$
 | 
	
		
			
				|  |  |          The status MUST be "vote" or "consensus", depending on the type of
 | 
	
		
			
				|  |  |          the document.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    "consensus-methods" SP IntegerList NL
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [Exactly once for votes; does not occur in consensuses.]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        A space-separated list of supported methods for generating
 | 
	
		
			
				|  |  | +        consensuses from votes.  See section 3.4.1 for details.  Method "1"
 | 
	
		
			
				|  |  | +        MUST be included.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      "published" SP YYYY-MM-DD SP HH:MM:SS NL
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          [Exactly once for votes; does not occur in consensuses.]
 | 
	
	
		
			
				|  | @@ -706,25 +737,34 @@ $Id$
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          [Exactly once.]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        The start of the Interval for this vote. XXXX
 | 
	
		
			
				|  |  | +        The start of the Interval for this vote.  Before this time, the
 | 
	
		
			
				|  |  | +        consensus document produced from this vote should not be used.
 | 
	
		
			
				|  |  | +        See 1.4 for voting timeline information.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      "fresh-until" SP YYYY-MM-DD SP HH:MM:SS NL
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          [Exactly once.]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        XXXX
 | 
	
		
			
				|  |  | +        The time at which the next consensus should be produced; before this
 | 
	
		
			
				|  |  | +        time, there is no point in downloading another consensus, since there
 | 
	
		
			
				|  |  | +        won't be a new one.  See 1.4 for voting timeline information.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      "valid-until" SP YYYY-MM-DD SP HH:MM:SS NL
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          [Exactly once.]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        The end of the Interval for this vote. XXXX
 | 
	
		
			
				|  |  | +        The end of the Interval for this vote.  After this time, the
 | 
	
		
			
				|  |  | +        consensus produced by this vote should not be used.  See 1.4 for
 | 
	
		
			
				|  |  | +        voting timeline information.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      "voting-delay" SP VoteSeconds SP DistSeconds NL
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          [Exactly once.]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        XXXX
 | 
	
		
			
				|  |  | +        VoteSeconds is the number of seconds that we will allow to collect
 | 
	
		
			
				|  |  | +        votes from all authorities; DistSeconds is the number of seconds
 | 
	
		
			
				|  |  | +        we'll allow to collect signatures from all authorities. See 1.4 for
 | 
	
		
			
				|  |  | +        voting timeline information.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      "client-versions" SP VersionList NL
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -980,6 +1020,22 @@ $Id$
 | 
	
		
			
				|  |  |       The signatures at the end of a consensus document are sorted in
 | 
	
		
			
				|  |  |       ascending order by identity digest.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +3.4.1. Forward compatibility
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   Future versions of Tor will need to include new information in the
 | 
	
		
			
				|  |  | +   consensus documents, but it is important that all authorities (or at least
 | 
	
		
			
				|  |  | +   half) generate and sign the same signed consensus.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   To achieve this, authorities list in their votes their supported methods
 | 
	
		
			
				|  |  | +   for generating consensuses from votes.  The method described above and
 | 
	
		
			
				|  |  | +   implemented in Tor 0.2.0.x is "1".  Later methods will be assigned higher
 | 
	
		
			
				|  |  | +   numbers.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   Before generating a consensus, an authority must decide which consensus
 | 
	
		
			
				|  |  | +   method to use.  To do this, it looks for the highest version number
 | 
	
		
			
				|  |  | +   supported by more than 2/3 of the authorities.  If it supports this
 | 
	
		
			
				|  |  | +   method, then it uses it.  Otherwise, it falls back to method 1.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  3.5. Detached signatures
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     Assuming full connectivity, every authority should compute and sign the
 | 
	
	
		
			
				|  | @@ -1061,17 +1117,15 @@ $Id$
 | 
	
		
			
				|  |  |     merged with the second-to-last period.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     An authority SHOULD publish its vote immediately at the start of each voting
 | 
	
		
			
				|  |  | -   period.  It does this by making it available at
 | 
	
		
			
				|  |  | +   period (minus VoteSeconds+DistSeconds).  It does this by making it
 | 
	
		
			
				|  |  | +   available at
 | 
	
		
			
				|  |  |       http://<hostname>/tor/status-vote/current/authority.z
 | 
	
		
			
				|  |  |     and sending it in an HTTP POST request to each other authority at the URL
 | 
	
		
			
				|  |  |       http://<hostname>/tor/post/vote
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -   (Note that this requires the authority to settle upon and finalize its
 | 
	
		
			
				|  |  | -   vote slightly before the start of the voting period.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   If, VOTING_DELAY minutes after the voting period has begun, an authority
 | 
	
		
			
				|  |  | +   If, at the start of the voting period, minus DistSeconds, an authority
 | 
	
		
			
				|  |  |     does not have a current statement from another authority, the first
 | 
	
		
			
				|  |  | -   authority retrieves the other's statement.
 | 
	
		
			
				|  |  | +   authority downloads the other's statement.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     Once an authority has a vote from another authority, it makes it available
 | 
	
		
			
				|  |  |     at
 | 
	
	
		
			
				|  | @@ -1080,9 +1134,15 @@ $Id$
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     The consensus status, along with as many signatures as the server
 | 
	
		
			
				|  |  |     currently knows, should be available at
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/status-vote/current/consensus.z
 | 
	
		
			
				|  |  | +      http://<hostname>/tor/status-vote/next/consensus.z
 | 
	
		
			
				|  |  |     All of the detached signatures it knows for consensus status should be
 | 
	
		
			
				|  |  |     available at:
 | 
	
		
			
				|  |  | +      http://<hostname>/tor/status-vote/next/consensus-signatures.z
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   Once there are enough signatures, or once the voting period starts,
 | 
	
		
			
				|  |  | +   these documents are available at
 | 
	
		
			
				|  |  | +      http://<hostname>/tor/status-vote/current/consensus.z
 | 
	
		
			
				|  |  | +   and
 | 
	
		
			
				|  |  |        http://<hostname>/tor/status-vote/current/consensus-signatures.z
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     Once an authority has computed and signed a consensus network status, it
 | 
	
	
		
			
				|  | @@ -1095,17 +1155,17 @@ $Id$
 | 
	
		
			
				|  |  |     [XXX possible future features include support for downloading old
 | 
	
		
			
				|  |  |      consensuses.]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -   [XXX Constants: VOTING_DELAY, CONSENSUS_DELAY]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  4.3. Downloading consensus status documents (caches only)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -   All directory servers (authorities and caches) try to keep a fresh
 | 
	
		
			
				|  |  | -   set of network-status consensus documents to serve to clients.  Every
 | 
	
		
			
				|  |  | -   15 minutes, or whenever the valid-until field on its most current
 | 
	
		
			
				|  |  | -   consensus is about to expire
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -[XXXX finish this section]
 | 
	
		
			
				|  |  | +   All directory servers (authorities and caches) try to keep a recent
 | 
	
		
			
				|  |  | +   network-status consensus document to serve to clients.  A cache ALWAYS
 | 
	
		
			
				|  |  | +   downloads a network-status consensus if any of the following are true:
 | 
	
		
			
				|  |  | +     - The cache has no consensus document.
 | 
	
		
			
				|  |  | +     - The cache's consensus document is no longer valid.
 | 
	
		
			
				|  |  | +   Otherwise, the cache downloads a new consensus document at a randomly
 | 
	
		
			
				|  |  | +   chosen time after its current consensus stops being fresh.  (This time is
 | 
	
		
			
				|  |  | +   chosen at random to avoid swarming the authorities at the start of each
 | 
	
		
			
				|  |  | +   period.)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  4.4. Downloading and storing router descriptors (authorities and caches)
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1251,14 +1311,12 @@ $Id$
 | 
	
		
			
				|  |  |     until it has a live network-status consensus document, and it has
 | 
	
		
			
				|  |  |     descriptors for more than 1/4 of the routers that it believes are running.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | - [XXXX handling clock skew at client side?]
 | 
	
		
			
				|  |  | - [XXXX fall-back to most recent?]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |     (Note: clients can and should pick caches based on the network-status
 | 
	
		
			
				|  |  |     information they have: once they have first fetched network-status info
 | 
	
		
			
				|  |  |     from an authority, they should not need to go to the authority directly
 | 
	
		
			
				|  |  |     again.)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  5.2. Downloading and storing router descriptors
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     Clients try to have the best descriptor for each router.  A descriptor is
 |