|  | @@ -1,2440 +0,0 @@
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                      Tor directory protocol, version 3
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -0. Scope and preliminaries
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   This directory protocol is used by Tor version 0.2.0.x-alpha and later.
 | 
	
		
			
				|  |  | -   See dir-spec-v1.txt for information on the protocol used up to the
 | 
	
		
			
				|  |  | -   0.1.0.x series, and dir-spec-v2.txt for information on the protocol
 | 
	
		
			
				|  |  | -   used by the 0.1.1.x and 0.1.2.x series.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Caches and authorities must still support older versions of the
 | 
	
		
			
				|  |  | -   directory protocols, until the versions of Tor that require them are
 | 
	
		
			
				|  |  | -   finally out of commission.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   This document merges and supersedes the following proposals:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       101  Voting on the Tor Directory System
 | 
	
		
			
				|  |  | -       103  Splitting identity key from regularly used signing key
 | 
	
		
			
				|  |  | -       104  Long and Short Router Descriptors
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   XXX when to download certificates.
 | 
	
		
			
				|  |  | -   XXX timeline
 | 
	
		
			
				|  |  | -   XXX fill in XXXXs
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
 | 
	
		
			
				|  |  | -      NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED",  "MAY", and
 | 
	
		
			
				|  |  | -      "OPTIONAL" in this document are to be interpreted as described in
 | 
	
		
			
				|  |  | -      RFC 2119.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -0.1. History
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The earliest versions of Onion Routing shipped with a list of known
 | 
	
		
			
				|  |  | -   routers and their keys.  When the set of routers changed, users needed to
 | 
	
		
			
				|  |  | -   fetch a new list.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The Version 1 Directory protocol
 | 
	
		
			
				|  |  | -   --------------------------------
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Early versions of Tor (0.0.2) introduced "Directory authorities": servers
 | 
	
		
			
				|  |  | -   that served signed "directory" documents containing a list of signed
 | 
	
		
			
				|  |  | -   "router descriptors", along with short summary of the status of each
 | 
	
		
			
				|  |  | -   router.  Thus, clients could get up-to-date information on the state of
 | 
	
		
			
				|  |  | -   the network automatically, and be certain that the list they were getting
 | 
	
		
			
				|  |  | -   was attested by a trusted directory authority.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Later versions (0.0.8) added directory caches, which download
 | 
	
		
			
				|  |  | -   directories from the authorities and serve them to clients.  Non-caches
 | 
	
		
			
				|  |  | -   fetch from the caches in preference to fetching from the authorities, thus
 | 
	
		
			
				|  |  | -   distributing bandwidth requirements.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Also added during the version 1 directory protocol were "router status"
 | 
	
		
			
				|  |  | -   documents: short documents that listed only the up/down status of the
 | 
	
		
			
				|  |  | -   routers on the network, rather than a complete list of all the
 | 
	
		
			
				|  |  | -   descriptors.  Clients and caches would fetch these documents far more
 | 
	
		
			
				|  |  | -   frequently than they would fetch full directories.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The Version 2 Directory Protocol
 | 
	
		
			
				|  |  | -   --------------------------------
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   During the Tor 0.1.1.x series, Tor revised its handling of directory
 | 
	
		
			
				|  |  | -   documents in order to address two major problems:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      * Directories had grown quite large (over 1MB), and most directory
 | 
	
		
			
				|  |  | -        downloads consisted mainly of router descriptors that clients
 | 
	
		
			
				|  |  | -        already had.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      * Every directory authority was a trust bottleneck: if a single
 | 
	
		
			
				|  |  | -        directory authority lied, it could make clients believe for a time
 | 
	
		
			
				|  |  | -        an arbitrarily distorted view of the Tor network.  (Clients
 | 
	
		
			
				|  |  | -        trusted the most recent signed document they downloaded.) Thus,
 | 
	
		
			
				|  |  | -        adding more authorities would make the system less secure, not
 | 
	
		
			
				|  |  | -        more.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   To address these, we extended the directory protocol so that
 | 
	
		
			
				|  |  | -   authorities now published signed "network status" documents.  Each
 | 
	
		
			
				|  |  | -   network status listed, for every router in the network: a hash of its
 | 
	
		
			
				|  |  | -   identity key, a hash of its most recent descriptor, and a summary of
 | 
	
		
			
				|  |  | -   what the authority believed about its status.  Clients would download
 | 
	
		
			
				|  |  | -   the authorities' network status documents in turn, and believe
 | 
	
		
			
				|  |  | -   statements about routers iff they were attested to by more than half of
 | 
	
		
			
				|  |  | -   the authorities.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Instead of downloading all router descriptors at once, clients
 | 
	
		
			
				|  |  | -   downloaded only the descriptors that they did not have.  Descriptors
 | 
	
		
			
				|  |  | -   were indexed by their digests, in order to prevent malicious caches
 | 
	
		
			
				|  |  | -   from giving different versions of a router descriptor to different
 | 
	
		
			
				|  |  | -   clients.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Routers began working harder to upload new descriptors only when their
 | 
	
		
			
				|  |  | -   contents were substantially changed.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -0.2. Goals of the version 3 protocol
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Version 3 of the Tor directory protocol tries to solve the following
 | 
	
		
			
				|  |  | -   issues:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      * A great deal of bandwidth used to transmit router descriptors was
 | 
	
		
			
				|  |  | -        used by two fields that are not actually used by Tor routers
 | 
	
		
			
				|  |  | -        (namely read-history and write-history).  We save about 60% by
 | 
	
		
			
				|  |  | -        moving them into a separate document that most clients do not
 | 
	
		
			
				|  |  | -        fetch or use.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      * It was possible under certain perverse circumstances for clients
 | 
	
		
			
				|  |  | -        to download an unusual set of network status documents, thus
 | 
	
		
			
				|  |  | -        partitioning themselves from clients who have a more recent and/or
 | 
	
		
			
				|  |  | -        typical set of documents.  Even under the best of circumstances,
 | 
	
		
			
				|  |  | -        clients were sensitive to the ages of the network status documents
 | 
	
		
			
				|  |  | -        they downloaded.  Therefore, instead of having the clients
 | 
	
		
			
				|  |  | -        correlate multiple network status documents, we have the
 | 
	
		
			
				|  |  | -        authorities collectively vote on a single consensus network status
 | 
	
		
			
				|  |  | -        document.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      * The most sensitive data in the entire network (the identity keys
 | 
	
		
			
				|  |  | -        of the directory authorities) needed to be stored unencrypted so
 | 
	
		
			
				|  |  | -        that the authorities can sign network-status documents on the fly.
 | 
	
		
			
				|  |  | -        Now, the authorities' identity keys are stored offline, and used
 | 
	
		
			
				|  |  | -        to certify medium-term signing keys that can be rotated.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -0.3. Some Remaining questions
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Things we could solve on a v3 timeframe:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     The SHA-1 hash is showing its age.  We should do something about our
 | 
	
		
			
				|  |  | -     dependency on it.  We could probably future-proof ourselves here in
 | 
	
		
			
				|  |  | -     this revision, at least so far as documents from the authorities are
 | 
	
		
			
				|  |  | -     concerned.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     Too many things about the authorities are hardcoded by IP.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     Perhaps we should start accepting longer identity keys for routers
 | 
	
		
			
				|  |  | -     too.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Things to solve eventually:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     Requiring every client to know about every router won't scale forever.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     Requiring every directory cache to know every router won't scale
 | 
	
		
			
				|  |  | -     forever.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -1. Outline
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   There is a small set (say, around 5-10) of semi-trusted directory
 | 
	
		
			
				|  |  | -   authorities.  A default list of authorities is shipped with the Tor
 | 
	
		
			
				|  |  | -   software.  Users can change this list, but are encouraged not to do so,
 | 
	
		
			
				|  |  | -   in order to avoid partitioning attacks.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Every authority has a very-secret, long-term "Authority Identity Key".
 | 
	
		
			
				|  |  | -   This is stored encrypted and/or offline, and is used to sign "key
 | 
	
		
			
				|  |  | -   certificate" documents.  Every key certificate contains a medium-term
 | 
	
		
			
				|  |  | -   (3-12 months) "authority signing key", that is used by the authority to
 | 
	
		
			
				|  |  | -   sign other directory information.  (Note that the authority identity
 | 
	
		
			
				|  |  | -   key is distinct from the router identity key that the authority uses
 | 
	
		
			
				|  |  | -   in its role as an ordinary router.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Routers periodically upload signed "routers descriptors" to the
 | 
	
		
			
				|  |  | -   directory authorities describing their keys, capabilities, and other
 | 
	
		
			
				|  |  | -   information.  Routers may also upload signed "extra info documents"
 | 
	
		
			
				|  |  | -   containing information that is not required for the Tor protocol.
 | 
	
		
			
				|  |  | -   Directory authorities serve router descriptors indexed by router
 | 
	
		
			
				|  |  | -   identity, or by hash of the descriptor.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Routers may act as directory caches to reduce load on the directory
 | 
	
		
			
				|  |  | -   authorities.  They announce this in their descriptors.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Periodically, each directory authority generates a view of
 | 
	
		
			
				|  |  | -   the current descriptors and status for known routers.  They send a
 | 
	
		
			
				|  |  | -   signed summary of this view (a "status vote") to the other
 | 
	
		
			
				|  |  | -   authorities.  The authorities compute the result of this vote, and sign
 | 
	
		
			
				|  |  | -   a "consensus status" document containing the result of the vote.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Directory caches download, cache, and re-serve consensus documents.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Clients, directory caches, and directory authorities all use consensus
 | 
	
		
			
				|  |  | -   documents to find out when their list of routers is out-of-date.
 | 
	
		
			
				|  |  | -   (Directory authorities also use vote statuses.) If it is, they download
 | 
	
		
			
				|  |  | -   any missing router descriptors.  Clients download missing descriptors
 | 
	
		
			
				|  |  | -   from caches; caches and authorities download from authorities.
 | 
	
		
			
				|  |  | -   Descriptors are downloaded by the hash of the descriptor, not by the
 | 
	
		
			
				|  |  | -   server's identity key: this prevents servers from attacking clients by
 | 
	
		
			
				|  |  | -   giving them descriptors nobody else uses.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   All directory information is uploaded and downloaded with HTTP.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   [Authorities also generate and caches also cache documents produced and
 | 
	
		
			
				|  |  | -   used by earlier versions of this protocol; see dir-spec-v1.txt and
 | 
	
		
			
				|  |  | -   dir-spec-v2.txt for notes on those versions.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -1.1. What's different from version 2?
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Clients used to download multiple network status documents,
 | 
	
		
			
				|  |  | -   corresponding roughly to "status votes" above.  They would compute the
 | 
	
		
			
				|  |  | -   result of the vote on the client side.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Authorities used to sign documents using the same private keys they used
 | 
	
		
			
				|  |  | -   for their roles as routers.  This forced them to keep these extremely
 | 
	
		
			
				|  |  | -   sensitive keys in memory unencrypted.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   All of the information in extra-info documents used to be kept in the
 | 
	
		
			
				|  |  | -   main descriptors.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -1.2. Document meta-format
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Router descriptors, directories, and running-routers documents all obey the
 | 
	
		
			
				|  |  | -  following lightweight extensible information format.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  The highest level object is a Document, which consists of one or more
 | 
	
		
			
				|  |  | -  Items.  Every Item begins with a KeywordLine, followed by zero or more
 | 
	
		
			
				|  |  | -  Objects. A KeywordLine begins with a Keyword, optionally followed by
 | 
	
		
			
				|  |  | -  whitespace and more non-newline characters, and ends with a newline.  A
 | 
	
		
			
				|  |  | -  Keyword is a sequence of one or more characters in the set [A-Za-z0-9-].
 | 
	
		
			
				|  |  | -  An Object is a block of encoded data in pseudo-Open-PGP-style
 | 
	
		
			
				|  |  | -  armor. (cf. RFC 2440)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  More formally:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    NL = The ascii LF character (hex value 0x0a).
 | 
	
		
			
				|  |  | -    Document ::= (Item | NL)+
 | 
	
		
			
				|  |  | -    Item ::= KeywordLine Object*
 | 
	
		
			
				|  |  | -    KeywordLine ::= Keyword NL | Keyword WS ArgumentChar+ NL
 | 
	
		
			
				|  |  | -    Keyword = KeywordChar+
 | 
	
		
			
				|  |  | -    KeywordChar ::= 'A' ... 'Z' | 'a' ... 'z' | '0' ... '9' | '-'
 | 
	
		
			
				|  |  | -    ArgumentChar ::= any printing ASCII character except NL.
 | 
	
		
			
				|  |  | -    WS = (SP | TAB)+
 | 
	
		
			
				|  |  | -    Object ::= BeginLine Base-64-encoded-data EndLine
 | 
	
		
			
				|  |  | -    BeginLine ::= "-----BEGIN " Keyword "-----" NL
 | 
	
		
			
				|  |  | -    EndLine ::= "-----END " Keyword "-----" NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    The BeginLine and EndLine of an Object must use the same keyword.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  When interpreting a Document, software MUST ignore any KeywordLine that
 | 
	
		
			
				|  |  | -  starts with a keyword it doesn't recognize; future implementations MUST NOT
 | 
	
		
			
				|  |  | -  require current clients to understand any KeywordLine not currently
 | 
	
		
			
				|  |  | -  described.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  The "opt" keyword was used until Tor 0.1.2.5-alpha for non-critical future
 | 
	
		
			
				|  |  | -  extensions.  All implementations MUST ignore any item of the form "opt
 | 
	
		
			
				|  |  | -  keyword ....." when they would not recognize "keyword ....."; and MUST
 | 
	
		
			
				|  |  | -  treat "opt keyword ....."  as synonymous with "keyword ......" when keyword
 | 
	
		
			
				|  |  | -  is recognized.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Implementations before 0.1.2.5-alpha rejected any document with a
 | 
	
		
			
				|  |  | -  KeywordLine that started with a keyword that they didn't recognize.
 | 
	
		
			
				|  |  | -  When generating documents that need to be read by older versions of Tor,
 | 
	
		
			
				|  |  | -  implementations MUST prefix items not recognized by older versions of
 | 
	
		
			
				|  |  | -  Tor with an "opt" until those versions of Tor are obsolete.  [Note that
 | 
	
		
			
				|  |  | -  key certificates, status vote documents, extra info documents, and
 | 
	
		
			
				|  |  | -  status consensus documents will never be read by older versions of Tor.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Other implementations that want to extend Tor's directory format MAY
 | 
	
		
			
				|  |  | -  introduce their own items.  The keywords for extension items SHOULD start
 | 
	
		
			
				|  |  | -  with the characters "x-" or "X-", to guarantee that they will not conflict
 | 
	
		
			
				|  |  | -  with keywords used by future versions of Tor.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  In our document descriptions below, we tag Items with a multiplicity in
 | 
	
		
			
				|  |  | -  brackets.  Possible tags are:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "At start, exactly once": These items MUST occur in every instance of
 | 
	
		
			
				|  |  | -      the document type, and MUST appear exactly once, and MUST be the
 | 
	
		
			
				|  |  | -      first item in their documents.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "Exactly once": These items MUST occur exactly one time in every
 | 
	
		
			
				|  |  | -      instance of the document type.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "At end, exactly once": These items MUST occur in every instance of
 | 
	
		
			
				|  |  | -      the document type, and MUST appear exactly once, and MUST be the
 | 
	
		
			
				|  |  | -      last item in their documents.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "At most once": These items MAY occur zero or one times in any
 | 
	
		
			
				|  |  | -      instance of the document type, but MUST NOT occur more than once.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "Any number": These items MAY occur zero, one, or more times in any
 | 
	
		
			
				|  |  | -      instance of the document type.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "Once or more": These items MUST occur at least once in any instance
 | 
	
		
			
				|  |  | -      of the document type, and MAY occur more.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -1.3. Signing documents
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Every signable document below is signed in a similar manner, using a
 | 
	
		
			
				|  |  | -   given "Initial Item", a final "Signature Item", a digest algorithm, and
 | 
	
		
			
				|  |  | -   a signing key.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The Initial Item must be the first item in the document.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The Signature Item has the following format:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     <signature item keyword> [arguments] NL SIGNATURE NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The "SIGNATURE" Object contains a signature (using the signing key) of
 | 
	
		
			
				|  |  | -   the PKCS1-padded digest of the entire document, taken from the
 | 
	
		
			
				|  |  | -   beginning of the Initial item, through the newline after the Signature
 | 
	
		
			
				|  |  | -   Item's keyword and its arguments.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Unless otherwise, the digest algorithm is SHA-1.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   All documents are invalid unless signed with the correct signing key.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   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 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-VoteSeconds/2: The authorities try to download any
 | 
	
		
			
				|  |  | -   votes they don't have.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   VA-DistSeconds: The authorities calculate the consensus and exchange
 | 
	
		
			
				|  |  | -   signatures.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   VA-DistSeconds/2: The authorities try to download any signatures
 | 
	
		
			
				|  |  | -   they don't have.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   VA: All authorities have a multiply signed consensus.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   VA ... FU: Caches download the consensus.  (Note that since caches have
 | 
	
		
			
				|  |  | -        no way of telling what VA and FU are until they have downloaded
 | 
	
		
			
				|  |  | -        the consensus, they assume that the present consensus's VA is
 | 
	
		
			
				|  |  | -        equal to the previous one's FU, and that its FU is one interval after
 | 
	
		
			
				|  |  | -        that.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   FU: The consensus is no longer the freshest consensus.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   FU ... (the current consensus's VU): Clients download the consensus.
 | 
	
		
			
				|  |  | -        (See note above: clients guess that the next consensus's FU will be
 | 
	
		
			
				|  |  | -        two intervals after the current VA.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   VU: The consensus is no longer valid.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   VoteSeconds and DistSeconds MUST each be at least 20 seconds; FU-VA and
 | 
	
		
			
				|  |  | -   VU-FU MUST each be at least 5 minutes.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -2. Router operation and formats
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   ORs SHOULD generate a new router descriptor and a new extra-info
 | 
	
		
			
				|  |  | -   document whenever any of the following events have occurred:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      - A period of time (18 hrs by default) has passed since the last
 | 
	
		
			
				|  |  | -        time a descriptor was generated.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      - A descriptor field other than bandwidth or uptime has changed.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      - Bandwidth has changed by a factor of 2 from the last time a
 | 
	
		
			
				|  |  | -        descriptor was generated, and at least a given interval of time
 | 
	
		
			
				|  |  | -        (20 mins by default) has passed since then.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      - Its uptime has been reset (by restarting).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      [XXX this list is incomplete; see router_differences_are_cosmetic()
 | 
	
		
			
				|  |  | -       in routerlist.c for others]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   ORs SHOULD NOT publish a new router descriptor or extra-info document
 | 
	
		
			
				|  |  | -   if none of the above events have occurred and not much time has passed
 | 
	
		
			
				|  |  | -   (12 hours by default).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   After generating a descriptor, ORs upload them to every directory
 | 
	
		
			
				|  |  | -   authority they know, by posting them (in order) to the URL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      http://<hostname:port>/tor/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -2.1. Router descriptor format
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Router descriptors consist of the following items.  For backward
 | 
	
		
			
				|  |  | -   compatibility, there should be an extra NL at the end of each router
 | 
	
		
			
				|  |  | -   descriptor.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   In lines that take multiple arguments, extra arguments SHOULD be
 | 
	
		
			
				|  |  | -   accepted and ignored.  Many of the nonterminals below are defined in
 | 
	
		
			
				|  |  | -   section 2.3.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     "router" nickname address ORPort SOCKSPort DirPort NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [At start, exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       Indicates the beginning of a router descriptor.  "nickname" must be a
 | 
	
		
			
				|  |  | -       valid router nickname as specified in 2.3.  "address" must be an IPv4
 | 
	
		
			
				|  |  | -       address in dotted-quad format.  The last three numbers indicate the
 | 
	
		
			
				|  |  | -       TCP ports at which this OR exposes functionality. ORPort is a port at
 | 
	
		
			
				|  |  | -       which this OR accepts TLS connections for the main OR protocol;
 | 
	
		
			
				|  |  | -       SOCKSPort is deprecated and should always be 0; and DirPort is the
 | 
	
		
			
				|  |  | -       port at which this OR accepts directory-related HTTP connections.  If
 | 
	
		
			
				|  |  | -       any port is not supported, the value 0 is given instead of a port
 | 
	
		
			
				|  |  | -       number.  (At least one of DirPort and ORPort SHOULD be set;
 | 
	
		
			
				|  |  | -       authorities MAY reject any descriptor with both DirPort and ORPort of
 | 
	
		
			
				|  |  | -       0.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "bandwidth" bandwidth-avg bandwidth-burst bandwidth-observed NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [Exactly once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       Estimated bandwidth for this router, in bytes per second.  The
 | 
	
		
			
				|  |  | -       "average" bandwidth is the volume per second that the OR is willing to
 | 
	
		
			
				|  |  | -       sustain over long periods; the "burst" bandwidth is the volume that
 | 
	
		
			
				|  |  | -       the OR is willing to sustain in very short intervals.  The "observed"
 | 
	
		
			
				|  |  | -       value is an estimate of the capacity this server can handle.  The
 | 
	
		
			
				|  |  | -       server remembers the max bandwidth sustained output over any ten
 | 
	
		
			
				|  |  | -       second period in the past day, and another sustained input.  The
 | 
	
		
			
				|  |  | -       "observed" value is the lesser of these two numbers.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "platform" string NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [At most once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       A human-readable string describing the system on which this OR is
 | 
	
		
			
				|  |  | -       running.  This MAY include the operating system, and SHOULD include
 | 
	
		
			
				|  |  | -       the name and version of the software implementing the Tor protocol.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "published" YYYY-MM-DD HH:MM:SS NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [Exactly once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       The time, in GMT, when this descriptor (and its corresponding
 | 
	
		
			
				|  |  | -       extra-info document if any)  was generated.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "fingerprint" fingerprint NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [At most once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       A fingerprint (a HASH_LEN-byte of asn1 encoded public key, encoded in
 | 
	
		
			
				|  |  | -       hex, with a single space after every 4 characters) for this router's
 | 
	
		
			
				|  |  | -       identity key. A descriptor is considered invalid (and MUST be
 | 
	
		
			
				|  |  | -       rejected) if the fingerprint line does not match the public key.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [We didn't start parsing this line until Tor 0.1.0.6-rc; it should
 | 
	
		
			
				|  |  | -        be marked with "opt" until earlier versions of Tor are obsolete.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "hibernating" bool NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [At most once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       If the value is 1, then the Tor server was hibernating when the
 | 
	
		
			
				|  |  | -       descriptor was published, and shouldn't be used to build circuits.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [We didn't start parsing this line until Tor 0.1.0.6-rc; it should be
 | 
	
		
			
				|  |  | -        marked with "opt" until earlier versions of Tor are obsolete.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "uptime" number NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [At most once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       The number of seconds that this OR process has been running.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "onion-key" NL a public key in PEM format
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [Exactly once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       This key is used to encrypt EXTEND cells for this OR.  The key MUST be
 | 
	
		
			
				|  |  | -       accepted for at least 1 week after any new key is published in a
 | 
	
		
			
				|  |  | -       subsequent descriptor. It MUST be 1024 bits.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "signing-key" NL a public key in PEM format
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [Exactly once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       The OR's long-term identity key.  It MUST be 1024 bits.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "accept" exitpattern NL
 | 
	
		
			
				|  |  | -    "reject" exitpattern NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [Any number]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       These lines describe an "exit policy": the rules that an OR follows
 | 
	
		
			
				|  |  | -       when deciding whether to allow a new stream to a given address.  The
 | 
	
		
			
				|  |  | -       'exitpattern' syntax is described below.  There MUST be at least one
 | 
	
		
			
				|  |  | -       such entry.  The rules are considered in order; if no rule matches,
 | 
	
		
			
				|  |  | -       the address will be accepted.  For clarity, the last such entry SHOULD
 | 
	
		
			
				|  |  | -       be accept *:* or reject *:*.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "router-signature" NL Signature NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [At end, exactly once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       The "SIGNATURE" object contains a signature of the PKCS1-padded
 | 
	
		
			
				|  |  | -       hash of the entire router descriptor, taken from the beginning of the
 | 
	
		
			
				|  |  | -       "router" line, through the newline after the "router-signature" line.
 | 
	
		
			
				|  |  | -       The router descriptor is invalid unless the signature is performed
 | 
	
		
			
				|  |  | -       with the router's identity key.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "contact" info NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [At most once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       Describes a way to contact the server's administrator, preferably
 | 
	
		
			
				|  |  | -       including an email address and a PGP key fingerprint.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "family" names NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At most once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        'Names' is a space-separated list of server nicknames or
 | 
	
		
			
				|  |  | -        hexdigests. If two ORs list one another in their "family" entries,
 | 
	
		
			
				|  |  | -        then OPs should treat them as a single OR for the purpose of path
 | 
	
		
			
				|  |  | -        selection.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        For example, if node A's descriptor contains "family B", and node B's
 | 
	
		
			
				|  |  | -        descriptor contains "family A", then node A and node B should never
 | 
	
		
			
				|  |  | -        be used on the same circuit.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "read-history" YYYY-MM-DD HH:MM:SS (NSEC s) NUM,NUM,NUM,NUM,NUM... NL
 | 
	
		
			
				|  |  | -        [At most once]
 | 
	
		
			
				|  |  | -    "write-history" YYYY-MM-DD HH:MM:SS (NSEC s) NUM,NUM,NUM,NUM,NUM... NL
 | 
	
		
			
				|  |  | -        [At most once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Declare how much bandwidth the OR has used recently. Usage is divided
 | 
	
		
			
				|  |  | -        into intervals of NSEC seconds.  The YYYY-MM-DD HH:MM:SS field
 | 
	
		
			
				|  |  | -        defines the end of the most recent interval.  The numbers are the
 | 
	
		
			
				|  |  | -        number of bytes used in the most recent intervals, ordered from
 | 
	
		
			
				|  |  | -        oldest to newest.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [We didn't start parsing these lines until Tor 0.1.0.6-rc; they should
 | 
	
		
			
				|  |  | -         be marked with "opt" until earlier versions of Tor are obsolete.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [See also migration notes in section 2.2.1.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "eventdns" bool NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At most once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Declare whether this version of Tor is using the newer enhanced
 | 
	
		
			
				|  |  | -        dns logic.  Versions of Tor with this field set to false SHOULD NOT
 | 
	
		
			
				|  |  | -        be used for reverse hostname lookups.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [This option is obsolete.  All Tor current servers should be presumed
 | 
	
		
			
				|  |  | -         to have the evdns backend.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "caches-extra-info" NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       Present only if this router is a directory cache that provides
 | 
	
		
			
				|  |  | -       extra-info documents.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [Versions before 0.2.0.1-alpha don't recognize this, and versions
 | 
	
		
			
				|  |  | -        before 0.1.2.5-alpha will reject descriptors containing it unless
 | 
	
		
			
				|  |  | -        it is prefixed with "opt"; it should be so prefixed until these
 | 
	
		
			
				|  |  | -        versions are obsolete.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "extra-info-digest" digest NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [At most once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       "Digest" is a hex-encoded digest (using upper-case characters) of the
 | 
	
		
			
				|  |  | -       router's extra-info document, as signed in the router's extra-info
 | 
	
		
			
				|  |  | -       (that is, not including the signature).  (If this field is absent, the
 | 
	
		
			
				|  |  | -       router is not uploading a corresponding extra-info document.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [Versions before 0.2.0.1-alpha don't recognize this, and versions
 | 
	
		
			
				|  |  | -        before 0.1.2.5-alpha will reject descriptors containing it unless
 | 
	
		
			
				|  |  | -        it is prefixed with "opt"; it should be so prefixed until these
 | 
	
		
			
				|  |  | -        versions are obsolete.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "hidden-service-dir" *(SP VersionNum) NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       Present only if this router stores and serves hidden service
 | 
	
		
			
				|  |  | -       descriptors. If any VersionNum(s) are specified, this router
 | 
	
		
			
				|  |  | -       supports those descriptor versions. If none are specified, it
 | 
	
		
			
				|  |  | -       defaults to version 2 descriptors.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [Versions of Tor before 0.1.2.5-alpha rejected router descriptors
 | 
	
		
			
				|  |  | -        with unrecognized items; the protocols line should be preceded with
 | 
	
		
			
				|  |  | -        an "opt" until these Tors are obsolete.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "protocols" SP "Link" SP LINK-VERSION-LIST SP "Circuit" SP
 | 
	
		
			
				|  |  | -          CIRCUIT-VERSION-LIST NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       Both lists are space-separated sequences of numbers, to indicate which
 | 
	
		
			
				|  |  | -       protocols the server supports.  As of 30 Mar 2008, specified
 | 
	
		
			
				|  |  | -       protocols are "Link 1 2 Circuit 1".  See section 4.1 of tor-spec.txt
 | 
	
		
			
				|  |  | -       for more information about link protocol versions.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [Versions of Tor before 0.1.2.5-alpha rejected router descriptors
 | 
	
		
			
				|  |  | -        with unrecognized items; the protocols line should be preceded with
 | 
	
		
			
				|  |  | -        an "opt" until these Tors are obsolete.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "allow-single-hop-exits" NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       Present only if the router allows single-hop circuits to make exit
 | 
	
		
			
				|  |  | -       connections.  Most Tor servers do not support this: this is
 | 
	
		
			
				|  |  | -       included for specialized controllers designed to support perspective
 | 
	
		
			
				|  |  | -       access and such.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -2.2. Extra-info documents
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Extra-info documents consist of the following items:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "extra-info" Nickname Fingerprint NL
 | 
	
		
			
				|  |  | -        [At start, exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Identifies what router this is an extra info descriptor for.
 | 
	
		
			
				|  |  | -        Fingerprint is encoded in hex (using upper-case letters), with
 | 
	
		
			
				|  |  | -        no spaces.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "published" YYYY-MM-DD HH:MM:SS NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       [Exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       The time, in GMT, when this document (and its corresponding router
 | 
	
		
			
				|  |  | -       descriptor if any) was generated.  It MUST match the published time
 | 
	
		
			
				|  |  | -       in the corresponding router descriptor.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "read-history" YYYY-MM-DD HH:MM:SS (NSEC s) NUM,NUM,NUM,NUM,NUM... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -    "write-history" YYYY-MM-DD HH:MM:SS (NSEC s) NUM,NUM,NUM,NUM,NUM... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        As documented in 2.1 above.  See migration notes in section 2.2.1.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "geoip-db-digest" Digest NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        SHA1 digest of the GeoIP database file that is used to resolve IP
 | 
	
		
			
				|  |  | -        addresses to country codes.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    ("geoip-start" YYYY-MM-DD HH:MM:SS NL)
 | 
	
		
			
				|  |  | -    ("geoip-client-origins" CC=N,CC=N,... NL)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Only generated by bridge routers (see blocking.pdf), and only
 | 
	
		
			
				|  |  | -        when they have been configured with a geoip database.
 | 
	
		
			
				|  |  | -        Non-bridges SHOULD NOT generate these fields.  Contains a list
 | 
	
		
			
				|  |  | -        of mappings from two-letter country codes (CC) to the number
 | 
	
		
			
				|  |  | -        of clients that have connected to that bridge from that
 | 
	
		
			
				|  |  | -        country (approximate, and rounded up to the nearest multiple of 8
 | 
	
		
			
				|  |  | -        in order to hamper traffic analysis).  A country is included
 | 
	
		
			
				|  |  | -        only if it has at least one address.  The time in
 | 
	
		
			
				|  |  | -        "geoip-start" is the time at which we began collecting geoip
 | 
	
		
			
				|  |  | -        statistics.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        "geoip-start" and "geoip-client-origins" have been replaced by
 | 
	
		
			
				|  |  | -        "bridge-stats-end" and "bridge-stats-ips" in 0.2.2.4-alpha. The
 | 
	
		
			
				|  |  | -        reason is that the measurement interval with "geoip-stats" as
 | 
	
		
			
				|  |  | -        determined by subtracting "geoip-start" from "published" could
 | 
	
		
			
				|  |  | -        have had a variable length, whereas the measurement interval in
 | 
	
		
			
				|  |  | -        0.2.2.4-alpha and later is set to be exactly 24 hours long. In
 | 
	
		
			
				|  |  | -        order to clearly distinguish the new measurement intervals from
 | 
	
		
			
				|  |  | -        the old ones, the new keywords have been introduced.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "bridge-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        YYYY-MM-DD HH:MM:SS defines the end of the included measurement
 | 
	
		
			
				|  |  | -        interval of length NSEC seconds (86400 seconds by default).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        A "bridge-stats-end" line, as well as any other "bridge-*" line,
 | 
	
		
			
				|  |  | -        is only added when the relay has been running as a bridge for at
 | 
	
		
			
				|  |  | -        least 24 hours.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "bridge-ips" CC=N,CC=N,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        List of mappings from two-letter country codes to the number of
 | 
	
		
			
				|  |  | -        unique IP addresses that have connected from that country to the
 | 
	
		
			
				|  |  | -        bridge and which are no known relays, rounded up to the nearest
 | 
	
		
			
				|  |  | -        multiple of 8.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dirreq-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        YYYY-MM-DD HH:MM:SS defines the end of the included measurement
 | 
	
		
			
				|  |  | -        interval of length NSEC seconds (86400 seconds by default).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        A "dirreq-stats-end" line, as well as any other "dirreq-*" line,
 | 
	
		
			
				|  |  | -        is only added when the relay has opened its Dir port and after 24
 | 
	
		
			
				|  |  | -        hours of measuring directory requests.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dirreq-v2-ips" CC=N,CC=N,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -    "dirreq-v3-ips" CC=N,CC=N,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        List of mappings from two-letter country codes to the number of
 | 
	
		
			
				|  |  | -        unique IP addresses that have connected from that country to
 | 
	
		
			
				|  |  | -        request a v2/v3 network status, rounded up to the nearest multiple
 | 
	
		
			
				|  |  | -        of 8. Only those IP addresses are counted that the directory can
 | 
	
		
			
				|  |  | -        answer with a 200 OK status code.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dirreq-v2-reqs" CC=N,CC=N,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -    "dirreq-v3-reqs" CC=N,CC=N,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        List of mappings from two-letter country codes to the number of
 | 
	
		
			
				|  |  | -        requests for v2/v3 network statuses from that country, rounded up
 | 
	
		
			
				|  |  | -        to the nearest multiple of 8. Only those requests are counted that
 | 
	
		
			
				|  |  | -        the directory can answer with a 200 OK status code.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dirreq-v2-share" num% NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -    "dirreq-v3-share" num% NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        The share of v2/v3 network status requests that the directory
 | 
	
		
			
				|  |  | -        expects to receive from clients based on its advertised bandwidth
 | 
	
		
			
				|  |  | -        compared to the overall network bandwidth capacity. Shares are
 | 
	
		
			
				|  |  | -        formatted in percent with two decimal places. Shares are
 | 
	
		
			
				|  |  | -        calculated as means over the whole 24-hour interval.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dirreq-v2-resp" status=num,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -    "dirreq-v3-resp" status=nul,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        List of mappings from response statuses to the number of requests
 | 
	
		
			
				|  |  | -        for v2/v3 network statuses that were answered with that response
 | 
	
		
			
				|  |  | -        status, rounded up to the nearest multiple of 4. Only response
 | 
	
		
			
				|  |  | -        statuses with at least 1 response are reported. New response
 | 
	
		
			
				|  |  | -        statuses can be added at any time. The current list of response
 | 
	
		
			
				|  |  | -        statuses is as follows:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        "ok": a network status request is answered; this number
 | 
	
		
			
				|  |  | -           corresponds to the sum of all requests as reported in
 | 
	
		
			
				|  |  | -           "dirreq-v2-reqs" or "dirreq-v3-reqs", respectively, before
 | 
	
		
			
				|  |  | -           rounding up.
 | 
	
		
			
				|  |  | -        "not-enough-sigs: a version 3 network status is not signed by a
 | 
	
		
			
				|  |  | -           sufficient number of requested authorities.
 | 
	
		
			
				|  |  | -        "unavailable": a requested network status object is unavailable.
 | 
	
		
			
				|  |  | -        "not-found": a requested network status is not found.
 | 
	
		
			
				|  |  | -        "not-modified": a network status has not been modified since the
 | 
	
		
			
				|  |  | -           If-Modified-Since time that is included in the request.
 | 
	
		
			
				|  |  | -        "busy": the directory is busy.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dirreq-v2-direct-dl" key=val,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -    "dirreq-v3-direct-dl" key=val,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -    "dirreq-v2-tunneled-dl" key=val,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -    "dirreq-v3-tunneled-dl" key=val,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        List of statistics about possible failures in the download process
 | 
	
		
			
				|  |  | -        of v2/v3 network statuses. Requests are either "direct"
 | 
	
		
			
				|  |  | -        HTTP-encoded requests over the relay's directory port, or
 | 
	
		
			
				|  |  | -        "tunneled" requests using a BEGIN_DIR cell over the relay's OR
 | 
	
		
			
				|  |  | -        port. The list of possible statistics can change, and statistics
 | 
	
		
			
				|  |  | -        can be left out from reporting. The current list of statistics is
 | 
	
		
			
				|  |  | -        as follows:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Successful downloads and failures:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        "complete": a client has finished the download successfully.
 | 
	
		
			
				|  |  | -        "timeout": a download did not finish within 10 minutes after
 | 
	
		
			
				|  |  | -           starting to send the response.
 | 
	
		
			
				|  |  | -        "running": a download is still running at the end of the
 | 
	
		
			
				|  |  | -           measurement period for less than 10 minutes after starting to
 | 
	
		
			
				|  |  | -           send the response.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Download times:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        "min", "max": smallest and largest measured bandwidth in B/s.
 | 
	
		
			
				|  |  | -        "d[1-4,6-9]": 1st to 4th and 6th to 9th decile of measured
 | 
	
		
			
				|  |  | -           bandwidth in B/s. For a given decile i, i/10 of all downloads
 | 
	
		
			
				|  |  | -           had a smaller bandwidth than di, and (10-i)/10 of all downloads
 | 
	
		
			
				|  |  | -           had a larger bandwidth than di.
 | 
	
		
			
				|  |  | -        "q[1,3]": 1st and 3rd quartile of measured bandwidth in B/s. One
 | 
	
		
			
				|  |  | -           fourth of all downloads had a smaller bandwidth than q1, one
 | 
	
		
			
				|  |  | -           fourth of all downloads had a larger bandwidth than q3, and the
 | 
	
		
			
				|  |  | -           remaining half of all downloads had a bandwidth between q1 and
 | 
	
		
			
				|  |  | -           q3.
 | 
	
		
			
				|  |  | -        "md": median of measured bandwidth in B/s. Half of the downloads
 | 
	
		
			
				|  |  | -           had a smaller bandwidth than md, the other half had a larger
 | 
	
		
			
				|  |  | -           bandwidth than md.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dirreq-read-history" YYYY-MM-DD HH:MM:SS (NSEC s) NUM,NUM,NUM... NL
 | 
	
		
			
				|  |  | -        [At most once]
 | 
	
		
			
				|  |  | -    "dirreq-write-history" YYYY-MM-DD HH:MM:SS (NSEC s) NUM,NUM,NUM... NL
 | 
	
		
			
				|  |  | -        [At most once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Declare how much bandwidth the OR has spent on answering directory
 | 
	
		
			
				|  |  | -        requests.  Usage is divided into intervals of NSEC seconds.  The
 | 
	
		
			
				|  |  | -        YYYY-MM-DD HH:MM:SS field defines the end of the most recent
 | 
	
		
			
				|  |  | -        interval.  The numbers are the number of bytes used in the most
 | 
	
		
			
				|  |  | -        recent intervals, ordered from oldest to newest.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "entry-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        YYYY-MM-DD HH:MM:SS defines the end of the included measurement
 | 
	
		
			
				|  |  | -        interval of length NSEC seconds (86400 seconds by default).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        An "entry-stats-end" line, as well as any other "entry-*"
 | 
	
		
			
				|  |  | -        line, is first added after the relay has been running for at least
 | 
	
		
			
				|  |  | -        24 hours.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "entry-ips" CC=N,CC=N,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        List of mappings from two-letter country codes to the number of
 | 
	
		
			
				|  |  | -        unique IP addresses that have connected from that country to the
 | 
	
		
			
				|  |  | -        relay and which are no known other relays, rounded up to the
 | 
	
		
			
				|  |  | -        nearest multiple of 8.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "cell-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        YYYY-MM-DD HH:MM:SS defines the end of the included measurement
 | 
	
		
			
				|  |  | -        interval of length NSEC seconds (86400 seconds by default).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        A "cell-stats-end" line, as well as any other "cell-*" line,
 | 
	
		
			
				|  |  | -        is first added after the relay has been running for at least 24
 | 
	
		
			
				|  |  | -        hours.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "cell-processed-cells" num,...,num NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Mean number of processed cells per circuit, subdivided into
 | 
	
		
			
				|  |  | -        deciles of circuits by the number of cells they have processed in
 | 
	
		
			
				|  |  | -        descending order from loudest to quietest circuits.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "cell-queued-cells" num,...,num NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Mean number of cells contained in queues by circuit decile. These
 | 
	
		
			
				|  |  | -        means are calculated by 1) determining the mean number of cells in
 | 
	
		
			
				|  |  | -        a single circuit between its creation and its termination and 2)
 | 
	
		
			
				|  |  | -        calculating the mean for all circuits in a given decile as
 | 
	
		
			
				|  |  | -        determined in "cell-processed-cells". Numbers have a precision of
 | 
	
		
			
				|  |  | -        two decimal places.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "cell-time-in-queue" num,...,num NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Mean time cells spend in circuit queues in milliseconds. Times are
 | 
	
		
			
				|  |  | -        calculated by 1) determining the mean time cells spend in the
 | 
	
		
			
				|  |  | -        queue of a single circuit and 2) calculating the mean for all
 | 
	
		
			
				|  |  | -        circuits in a given decile as determined in
 | 
	
		
			
				|  |  | -        "cell-processed-cells".
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "cell-circuits-per-decile" num NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Mean number of circuits that are included in any of the deciles,
 | 
	
		
			
				|  |  | -        rounded up to the next integer.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "conn-bi-direct" YYYY-MM-DD HH:MM:SS (NSEC s) BELOW,READ,WRITE,BOTH NL
 | 
	
		
			
				|  |  | -        [At most once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Number of connections, split into 10-second intervals, that are
 | 
	
		
			
				|  |  | -        used uni-directionally or bi-directionally as observed in the NSEC
 | 
	
		
			
				|  |  | -        seconds (usually 86400 seconds) before YYYY-MM-DD HH:MM:SS.  Every
 | 
	
		
			
				|  |  | -        10 seconds, we determine for every connection whether we read and
 | 
	
		
			
				|  |  | -        wrote less than a threshold of 20 KiB (BELOW), read at least 10
 | 
	
		
			
				|  |  | -        times more than we wrote (READ), wrote at least 10 times more than
 | 
	
		
			
				|  |  | -        we read (WRITE), or read and wrote more than the threshold, but
 | 
	
		
			
				|  |  | -        not 10 times more in either direction (BOTH).  After classifying a
 | 
	
		
			
				|  |  | -        connection, read and write counters are reset for the next
 | 
	
		
			
				|  |  | -        10-second interval.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "exit-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        YYYY-MM-DD HH:MM:SS defines the end of the included measurement
 | 
	
		
			
				|  |  | -        interval of length NSEC seconds (86400 seconds by default).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        An "exit-stats-end" line, as well as any other "exit-*" line, is
 | 
	
		
			
				|  |  | -        first added after the relay has been running for at least 24 hours
 | 
	
		
			
				|  |  | -        and only if the relay permits exiting (where exiting to a single
 | 
	
		
			
				|  |  | -        port and IP address is sufficient).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "exit-kibibytes-written" port=N,port=N,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -    "exit-kibibytes-read" port=N,port=N,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        List of mappings from ports to the number of kibibytes that the
 | 
	
		
			
				|  |  | -        relay has written to or read from exit connections to that port,
 | 
	
		
			
				|  |  | -        rounded up to the next full kibibyte.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "exit-streams-opened" port=N,port=N,... NL
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        List of mappings from ports to the number of opened exit streams
 | 
	
		
			
				|  |  | -        to that port, rounded up to the nearest multiple of 4.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "router-signature" NL Signature NL
 | 
	
		
			
				|  |  | -        [At end, exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        A document signature as documented in section 1.3, using the
 | 
	
		
			
				|  |  | -        initial item "extra-info" and the final item "router-signature",
 | 
	
		
			
				|  |  | -        signed with the router's identity key.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -2.2.1. Moving history fields to extra-info documents.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Tools that want to use the read-history and write-history values SHOULD
 | 
	
		
			
				|  |  | -   download extra-info documents as well as router descriptors.  Such
 | 
	
		
			
				|  |  | -   tools SHOULD accept history values from both sources; if they appear in
 | 
	
		
			
				|  |  | -   both documents, the values in the extra-info documents are authoritative.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   New versions of Tor no longer generate router descriptors
 | 
	
		
			
				|  |  | -   containing read-history or write-history.  Tools should continue to
 | 
	
		
			
				|  |  | -   accept read-history and write-history values in router descriptors
 | 
	
		
			
				|  |  | -   produced by older versions of Tor until all Tor versions earlier
 | 
	
		
			
				|  |  | -   than 0.2.0.x are obsolete.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -2.3. Nonterminals in router descriptors
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   nickname ::= between 1 and 19 alphanumeric characters ([A-Za-z0-9]),
 | 
	
		
			
				|  |  | -      case-insensitive.
 | 
	
		
			
				|  |  | -   hexdigest ::= a '$', followed by 40 hexadecimal characters
 | 
	
		
			
				|  |  | -      ([A-Fa-f0-9]). [Represents a server by the digest of its identity
 | 
	
		
			
				|  |  | -      key.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   exitpattern ::= addrspec ":" portspec
 | 
	
		
			
				|  |  | -   portspec ::= "*" | port | port "-" port
 | 
	
		
			
				|  |  | -   port ::= an integer between 1 and 65535, inclusive.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      [Some implementations incorrectly generate ports with value 0.
 | 
	
		
			
				|  |  | -       Implementations SHOULD accept this, and SHOULD NOT generate it.
 | 
	
		
			
				|  |  | -       Connections to port 0 are never permitted.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   addrspec ::= "*" | ip4spec | ip6spec
 | 
	
		
			
				|  |  | -   ipv4spec ::= ip4 | ip4 "/" num_ip4_bits | ip4 "/" ip4mask
 | 
	
		
			
				|  |  | -   ip4 ::= an IPv4 address in dotted-quad format
 | 
	
		
			
				|  |  | -   ip4mask ::= an IPv4 mask in dotted-quad format
 | 
	
		
			
				|  |  | -   num_ip4_bits ::= an integer between 0 and 32
 | 
	
		
			
				|  |  | -   ip6spec ::= ip6 | ip6 "/" num_ip6_bits
 | 
	
		
			
				|  |  | -   ip6 ::= an IPv6 address, surrounded by square brackets.
 | 
	
		
			
				|  |  | -   num_ip6_bits ::= an integer between 0 and 128
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   bool ::= "0" | "1"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -3. Formats produced by directory authorities.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Every authority has two keys used in this protocol: a signing key, and
 | 
	
		
			
				|  |  | -   an authority identity key.  (Authorities also have a router identity
 | 
	
		
			
				|  |  | -   key used in their role as a router and by earlier versions of the
 | 
	
		
			
				|  |  | -   directory protocol.)  The identity key is used from time to time to
 | 
	
		
			
				|  |  | -   sign new key certificates using new signing keys; it is very sensitive.
 | 
	
		
			
				|  |  | -   The signing key is used to sign key certificates and status documents.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   There are three kinds of documents generated by directory authorities:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     Key certificates
 | 
	
		
			
				|  |  | -     Status votes
 | 
	
		
			
				|  |  | -     Status consensuses
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Each is discussed below.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -3.1. Key certificates
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Key certificates consist of the following items:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dir-key-certificate-version" version NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At start, exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Determines the version of the key certificate.  MUST be "3" for
 | 
	
		
			
				|  |  | -        the protocol described in this document.  Implementations MUST
 | 
	
		
			
				|  |  | -        reject formats they don't understand.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dir-address" IPPort NL
 | 
	
		
			
				|  |  | -        [At most once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        An IP:Port for this authority's directory port.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "fingerprint" fingerprint NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [Exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Hexadecimal encoding without spaces based on the authority's
 | 
	
		
			
				|  |  | -        identity key.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dir-identity-key" NL a public key in PEM format
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [Exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        The long-term authority identity key for this authority.  This key
 | 
	
		
			
				|  |  | -        SHOULD be at least 2048 bits long; it MUST NOT be shorter than
 | 
	
		
			
				|  |  | -        1024 bits.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dir-key-published" YYYY-MM-DD HH:MM:SS NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [Exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        The time (in GMT) when this document and corresponding key were
 | 
	
		
			
				|  |  | -        last generated.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dir-key-expires" YYYY-MM-DD HH:MM:SS NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [Exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        A time (in GMT) after which this key is no longer valid.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dir-signing-key" NL a key in PEM format
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [Exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        The directory server's public signing key.  This key MUST be at
 | 
	
		
			
				|  |  | -        least 1024 bits, and MAY be longer.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dir-key-crosscert" NL CrossSignature NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        NOTE: Authorities MUST include this field in all newly generated
 | 
	
		
			
				|  |  | -        certificates.  A future version of this specification will make
 | 
	
		
			
				|  |  | -        the field required.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        CrossSignature is a signature, made using the certificate's signing
 | 
	
		
			
				|  |  | -        key, of the digest of the PKCS1-padded hash of the certificate's
 | 
	
		
			
				|  |  | -        identity key.  For backward compatibility with broken versions of the
 | 
	
		
			
				|  |  | -        parser, we wrap the base64-encoded signature in -----BEGIN ID
 | 
	
		
			
				|  |  | -        SIGNATURE---- and -----END ID SIGNATURE----- tags.  Implementations
 | 
	
		
			
				|  |  | -        MUST allow the "ID " portion to be omitted, however.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        When encountering a certificate with a dir-key-crosscert entry,
 | 
	
		
			
				|  |  | -        implementations MUST verify that the signature is a correct signature
 | 
	
		
			
				|  |  | -        of the hash of the identity key using the signing key.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dir-key-certification" NL Signature NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At end, exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        A document signature as documented in section 1.3, using the
 | 
	
		
			
				|  |  | -        initial item "dir-key-certificate-version" and the final item
 | 
	
		
			
				|  |  | -        "dir-key-certification", signed with the authority identity key.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Authorities MUST generate a new signing key and corresponding
 | 
	
		
			
				|  |  | -   certificate before the key expires.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -3.2. Vote and consensus status documents
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Votes and consensuses are more strictly formatted then other documents
 | 
	
		
			
				|  |  | -   in this specification, since different authorities must be able to
 | 
	
		
			
				|  |  | -   generate exactly the same consensus given the same set of votes.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The procedure for deciding when to generate vote and consensus status
 | 
	
		
			
				|  |  | -   documents are described in section 1.4 on the voting timeline.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Status documents contain a preamble, an authority section, a list of
 | 
	
		
			
				|  |  | -   router status entries, and one or more footer signature, in that order.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Unlike other formats described above, a SP in these documents must be a
 | 
	
		
			
				|  |  | -   single space character (hex 20).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Some items appear only in votes, and some items appear only in
 | 
	
		
			
				|  |  | -   consensuses.  Unless specified, items occur in both.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The preamble contains the following items.  They MUST occur in the
 | 
	
		
			
				|  |  | -   order given here:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "network-status-version" SP version NL.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At start, exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        A document format version.  For this specification, the version is
 | 
	
		
			
				|  |  | -        "3".
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "vote-status" SP type NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [Exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        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.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "consensus-method" SP Integer NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [Exactly once for consensuses; does not occur in votes.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        See section 3.4.1 for details.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        (Only included when the vote is generated with consensus-method 2 or
 | 
	
		
			
				|  |  | -        later.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "published" SP YYYY-MM-DD SP HH:MM:SS NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [Exactly once for votes; does not occur in consensuses.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        The publication time for this status document (if a vote).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "valid-after" SP YYYY-MM-DD SP HH:MM:SS NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [Exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        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.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        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.  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.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        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
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        A comma-separated list of recommended client versions, in
 | 
	
		
			
				|  |  | -        ascending order.  If absent, no opinion is held about client
 | 
	
		
			
				|  |  | -        versions.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "server-versions" SP VersionList NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        A comma-separated list of recommended server versions, in
 | 
	
		
			
				|  |  | -        ascending order.  If absent, no opinion is held about server
 | 
	
		
			
				|  |  | -        versions.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "known-flags" SP FlagList NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [Exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        A space-separated list of all of the flags that this document
 | 
	
		
			
				|  |  | -        might contain.  A flag is "known" either because the authority
 | 
	
		
			
				|  |  | -        knows about them and might set them (if in a vote), or because
 | 
	
		
			
				|  |  | -        enough votes were counted for the consensus for an authoritative
 | 
	
		
			
				|  |  | -        opinion to have been formed about their status.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "params" SP [Parameters] NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At most once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Parameter ::= Keyword '=' Int32
 | 
	
		
			
				|  |  | -        Int32 ::= A decimal integer between -2147483648 and 2147483647.
 | 
	
		
			
				|  |  | -        Parameters ::= Parameter | Parameters SP Parameter
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        The parameters list, if present, contains a space-separated list of
 | 
	
		
			
				|  |  | -        case-sensitive key-value pairs, sorted in lexical order by
 | 
	
		
			
				|  |  | -        their keyword. Each parameter has its own meaning.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        (Only included when the vote is generated with consensus-method 7 or
 | 
	
		
			
				|  |  | -        later.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Commonly used "param" arguments at this point include:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        "circwindow" -- the default package window that circuits should
 | 
	
		
			
				|  |  | -        be established with. It started out at 1000 cells, but some
 | 
	
		
			
				|  |  | -        research indicates that a lower value would mean fewer cells in
 | 
	
		
			
				|  |  | -        transit in the network at any given time. Obeyed by Tor 0.2.1.20
 | 
	
		
			
				|  |  | -        and later.
 | 
	
		
			
				|  |  | -        Min: 100, Max: 1000
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        "CircuitPriorityHalflifeMsec" -- the halflife parameter used when
 | 
	
		
			
				|  |  | -        weighting which circuit will send the next cell. Obeyed by Tor
 | 
	
		
			
				|  |  | -        0.2.2.10-alpha and later.  (Versions of Tor between 0.2.2.7-alpha
 | 
	
		
			
				|  |  | -        and 0.2.2.10-alpha recognized a "CircPriorityHalflifeMsec" parameter,
 | 
	
		
			
				|  |  | -        but mishandled it badly.)
 | 
	
		
			
				|  |  | -        Min: -1, Max: 2147483647 (INT32_MAX)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        "perconnbwrate" and "perconnbwburst" -- if set, each relay sets
 | 
	
		
			
				|  |  | -        up a separate token bucket for every client OR connection,
 | 
	
		
			
				|  |  | -        and rate limits that connection indepedently. Typically left
 | 
	
		
			
				|  |  | -        unset, except when used for performance experiments around trac
 | 
	
		
			
				|  |  | -        entry 1750. Only honored by relays running Tor 0.2.2.16-alpha
 | 
	
		
			
				|  |  | -        and later. (Note that relays running 0.2.2.7-alpha through
 | 
	
		
			
				|  |  | -        0.2.2.14-alpha looked for bwconnrate and bwconnburst, but then
 | 
	
		
			
				|  |  | -        did the wrong thing with them; see bug 1830 for details.)
 | 
	
		
			
				|  |  | -        Min: 1, Max: 2147483647 (INT32_MAX)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        "refuseunknownexits" -- if set to one, exit relays look at
 | 
	
		
			
				|  |  | -        the previous hop of circuits that ask to open an exit stream,
 | 
	
		
			
				|  |  | -        and refuse to exit if they don't recognize it as a relay. The
 | 
	
		
			
				|  |  | -        goal is to make it harder for people to use them as one-hop
 | 
	
		
			
				|  |  | -        proxies. See trac entry 1751 for details.
 | 
	
		
			
				|  |  | -        Min: 0, Max: 1
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        "cbtdisabled", "cbtnummodes", "cbtrecentcount", "cbtmaxtimeouts",
 | 
	
		
			
				|  |  | -        "cbtmincircs", "cbtquantile", "cbtclosequantile", "cbttestfreq",
 | 
	
		
			
				|  |  | -        "cbtmintimeout", and "cbtinitialtimeout" -- see "2.4.5. Consensus
 | 
	
		
			
				|  |  | -        parameters governing behavior" in path-spec.txt for a series of
 | 
	
		
			
				|  |  | -        circuit build time related consensus params.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The authority section of a vote contains the following items, followed
 | 
	
		
			
				|  |  | -   in turn by the authority's current key certificate:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dir-source" SP nickname SP identity SP address SP IP SP dirport SP
 | 
	
		
			
				|  |  | -       orport NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [Exactly once, at start]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Describes this authority.  The nickname is a convenient identifier
 | 
	
		
			
				|  |  | -        for the authority.  The identity is an uppercase hex fingerprint of
 | 
	
		
			
				|  |  | -        the authority's current (v3 authority) identity key.  The address is
 | 
	
		
			
				|  |  | -        the server's hostname.  The IP is the server's current IP address,
 | 
	
		
			
				|  |  | -        and dirport is its current directory port. XXXXorport
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "contact" SP string NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        An arbitrary string describing how to contact the directory
 | 
	
		
			
				|  |  | -        server's administrator.  Administrators should include at least an
 | 
	
		
			
				|  |  | -        email address and a PGP fingerprint.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "legacy-key" SP FINGERPRINT NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At most once]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Lists a fingerprint for an obsolete _identity_ key still used
 | 
	
		
			
				|  |  | -        by this authority to keep older clients working.  This option
 | 
	
		
			
				|  |  | -        is used to keep key around for a little while in case the
 | 
	
		
			
				|  |  | -        authorities need to migrate many identity keys at once.
 | 
	
		
			
				|  |  | -        (Generally, this would only happen because of a security
 | 
	
		
			
				|  |  | -        vulnerability that affected multiple authorities, like the
 | 
	
		
			
				|  |  | -        Debian OpenSSL RNG bug of May 2008.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The authority section of a consensus contains groups the following items,
 | 
	
		
			
				|  |  | -   in the order given, with one group for each authority that contributed to
 | 
	
		
			
				|  |  | -   the consensus, with groups sorted by authority identity digest:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "dir-source" SP nickname SP identity SP address SP IP SP dirport SP
 | 
	
		
			
				|  |  | -       orport NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [Exactly once, at start]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        As in the authority section of a vote.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "contact" SP string NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        As in the authority section of a vote.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "vote-digest" SP digest NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [Exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        A digest of the vote from the authority that contributed to this
 | 
	
		
			
				|  |  | -        consensus, as signed (that is, not including the signature).
 | 
	
		
			
				|  |  | -        (Hex, upper-case.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Each router status entry contains the following items.  Router status
 | 
	
		
			
				|  |  | -   entries are sorted in ascending order by identity digest.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "r" SP nickname SP identity SP digest SP publication SP IP SP ORPort
 | 
	
		
			
				|  |  | -        SP DirPort NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At start, exactly once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        "Nickname" is the OR's nickname.  "Identity" is a hash of its
 | 
	
		
			
				|  |  | -        identity key, encoded in base64, with trailing equals sign(s)
 | 
	
		
			
				|  |  | -        removed.  "Digest" is a hash of its most recent descriptor as
 | 
	
		
			
				|  |  | -        signed (that is, not including the signature), encoded in base64.
 | 
	
		
			
				|  |  | -        "Publication" is the
 | 
	
		
			
				|  |  | -        publication time of its most recent descriptor, in the form
 | 
	
		
			
				|  |  | -        YYYY-MM-DD HH:MM:SS, in GMT.  "IP" is its current IP address;
 | 
	
		
			
				|  |  | -        ORPort is its current OR port, "DirPort" is it's current directory
 | 
	
		
			
				|  |  | -        port, or "0" for "none".
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "s" SP Flags NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        A series of space-separated status flags, in alphabetical order.
 | 
	
		
			
				|  |  | -        Currently documented flags are:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          "Authority" if the router is a directory authority.
 | 
	
		
			
				|  |  | -          "BadExit" if the router is believed to be useless as an exit node
 | 
	
		
			
				|  |  | -             (because its ISP censors it, because it is behind a restrictive
 | 
	
		
			
				|  |  | -             proxy, or for some similar reason).
 | 
	
		
			
				|  |  | -          "BadDirectory" if the router is believed to be useless as a
 | 
	
		
			
				|  |  | -             directory cache (because its directory port isn't working,
 | 
	
		
			
				|  |  | -             its bandwidth is always throttled, or for some similar
 | 
	
		
			
				|  |  | -             reason).
 | 
	
		
			
				|  |  | -          "Exit" if the router is more useful for building
 | 
	
		
			
				|  |  | -             general-purpose exit circuits than for relay circuits.  The
 | 
	
		
			
				|  |  | -             path building algorithm uses this flag; see path-spec.txt.
 | 
	
		
			
				|  |  | -          "Fast" if the router is suitable for high-bandwidth circuits.
 | 
	
		
			
				|  |  | -          "Guard" if the router is suitable for use as an entry guard.
 | 
	
		
			
				|  |  | -          "HSDir" if the router is considered a v2 hidden service directory.
 | 
	
		
			
				|  |  | -          "Named" if the router's identity-nickname mapping is canonical,
 | 
	
		
			
				|  |  | -             and this authority binds names.
 | 
	
		
			
				|  |  | -          "Stable" if the router is suitable for long-lived circuits.
 | 
	
		
			
				|  |  | -          "Running" if the router is currently usable.
 | 
	
		
			
				|  |  | -          "Unnamed" if another router has bound the name used by this
 | 
	
		
			
				|  |  | -             router, and this authority binds names.
 | 
	
		
			
				|  |  | -          "Valid" if the router has been 'validated'.
 | 
	
		
			
				|  |  | -          "V2Dir" if the router implements the v2 directory protocol.
 | 
	
		
			
				|  |  | -          "V3Dir" if the router implements this protocol.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "v" SP version NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        The version of the Tor protocol that this server is running.  If
 | 
	
		
			
				|  |  | -        the value begins with "Tor" SP, the rest of the string is a Tor
 | 
	
		
			
				|  |  | -        version number, and the protocol is "The Tor protocol as supported
 | 
	
		
			
				|  |  | -        by the given version of Tor."  Otherwise, if the value begins with
 | 
	
		
			
				|  |  | -        some other string, Tor has upgraded to a more sophisticated
 | 
	
		
			
				|  |  | -        protocol versioning system, and the protocol is "a version of the
 | 
	
		
			
				|  |  | -        Tor protocol more recent than any we recognize."
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Directory authorities SHOULD omit version strings they receive from
 | 
	
		
			
				|  |  | -        descriptors if they would cause "v" lines to be over 128 characters
 | 
	
		
			
				|  |  | -        long.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "w" SP "Bandwidth=" INT [SP "Measured=" INT] NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        An estimate of the bandwidth of this server, in an arbitrary
 | 
	
		
			
				|  |  | -        unit (currently kilobytes per second).  Used to weight router
 | 
	
		
			
				|  |  | -        selection. 
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Additionally, the Measured= keyword is present in votes by 
 | 
	
		
			
				|  |  | -        participating bandwidth measurement authorities to indicate
 | 
	
		
			
				|  |  | -        a measured bandwidth currently produced by measuring stream 
 | 
	
		
			
				|  |  | -        capacities. 
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Other weighting keywords may be added later.
 | 
	
		
			
				|  |  | -        Clients MUST ignore keywords they do not recognize.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "p" SP ("accept" / "reject") SP PortList NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        PortList = PortOrRange
 | 
	
		
			
				|  |  | -        PortList = PortList "," PortOrRange
 | 
	
		
			
				|  |  | -        PortOrRange = INT "-" INT / INT
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        A list of those ports that this router supports (if 'accept')
 | 
	
		
			
				|  |  | -        or does not support (if 'reject') for exit to "most
 | 
	
		
			
				|  |  | -        addresses".
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The footer section is delineated in all votes and consensuses supporting
 | 
	
		
			
				|  |  | -   consensus method 9 and above with the following:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "directory-footer" NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   It contains two subsections, a bandwidths-weights line and a
 | 
	
		
			
				|  |  | -   directory-signature.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The bandwidths-weights line appears At Most Once for a consensus. It does
 | 
	
		
			
				|  |  | -   not appear in votes.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "bandwidth-weights" SP
 | 
	
		
			
				|  |  | -       "Wbd=" INT SP "Wbe=" INT SP "Wbg=" INT SP "Wbm=" INT SP
 | 
	
		
			
				|  |  | -       "Wdb=" INT SP
 | 
	
		
			
				|  |  | -       "Web=" INT SP "Wed=" INT SP "Wee=" INT SP "Weg=" INT SP "Wem=" INT SP
 | 
	
		
			
				|  |  | -       "Wgb=" INT SP "Wgd=" INT SP "Wgg=" INT SP "Wgm=" INT SP
 | 
	
		
			
				|  |  | -       "Wmb=" INT SP "Wmd=" INT SP "Wme=" INT SP "Wmg=" INT SP "Wmm=" INT NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       These values represent the weights to apply to router bandwidths during
 | 
	
		
			
				|  |  | -       path selection. They are sorted in alphabetical order in the list. The
 | 
	
		
			
				|  |  | -       integer values are divided by BW_WEIGHT_SCALE=10000 or the consensus
 | 
	
		
			
				|  |  | -       param "bwweightscale". They are:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -         Wgg - Weight for Guard-flagged nodes in the guard position
 | 
	
		
			
				|  |  | -         Wgm - Weight for non-flagged nodes in the guard Position
 | 
	
		
			
				|  |  | -         Wgd - Weight for Guard+Exit-flagged nodes in the guard Position
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -         Wmg - Weight for Guard-flagged nodes in the middle Position
 | 
	
		
			
				|  |  | -         Wmm - Weight for non-flagged nodes in the middle Position
 | 
	
		
			
				|  |  | -         Wme - Weight for Exit-flagged nodes in the middle Position
 | 
	
		
			
				|  |  | -         Wmd - Weight for Guard+Exit flagged nodes in the middle Position
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -         Weg - Weight for Guard flagged nodes in the exit Position
 | 
	
		
			
				|  |  | -         Wem - Weight for non-flagged nodes in the exit Position
 | 
	
		
			
				|  |  | -         Wee - Weight for Exit-flagged nodes in the exit Position
 | 
	
		
			
				|  |  | -         Wed - Weight for Guard+Exit-flagged nodes in the exit Position
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -         Wgb - Weight for BEGIN_DIR-supporting Guard-flagged nodes
 | 
	
		
			
				|  |  | -         Wmb - Weight for BEGIN_DIR-supporting non-flagged nodes
 | 
	
		
			
				|  |  | -         Web - Weight for BEGIN_DIR-supporting Exit-flagged nodes
 | 
	
		
			
				|  |  | -         Wdb - Weight for BEGIN_DIR-supporting Guard+Exit-flagged nodes
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -         Wbg - Weight for Guard flagged nodes for BEGIN_DIR requests
 | 
	
		
			
				|  |  | -         Wbm - Weight for non-flagged nodes for BEGIN_DIR requests
 | 
	
		
			
				|  |  | -         Wbe - Weight for Exit-flagged nodes for BEGIN_DIR requests
 | 
	
		
			
				|  |  | -         Wbd - Weight for Guard+Exit-flagged nodes for BEGIN_DIR requests
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       These values are calculated as specified in Section 3.4.3.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The signature contains the following item, which appears Exactly Once
 | 
	
		
			
				|  |  | -   for a vote, and At Least Once for a consensus.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "directory-signature" SP identity SP signing-key-digest NL Signature
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        This is a signature of the status document, with the initial item
 | 
	
		
			
				|  |  | -        "network-status-version", and the signature item
 | 
	
		
			
				|  |  | -        "directory-signature", using the signing key.  (In this case, we take
 | 
	
		
			
				|  |  | -        the hash through the _space_ after directory-signature, not the
 | 
	
		
			
				|  |  | -        newline: this ensures that all authorities sign the same thing.)
 | 
	
		
			
				|  |  | -        "identity" is the hex-encoded digest of the authority identity key of
 | 
	
		
			
				|  |  | -        the signing authority, and "signing-key-digest" is the hex-encoded
 | 
	
		
			
				|  |  | -        digest of the current authority signing key of the signing authority.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -3.3. Assigning flags in a vote
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   (This section describes how directory authorities choose which status
 | 
	
		
			
				|  |  | -   flags to apply to routers, as of Tor 0.2.0.0-alpha-dev. Later directory
 | 
	
		
			
				|  |  | -   authorities MAY do things differently, so long as clients keep working
 | 
	
		
			
				|  |  | -   well.  Clients MUST NOT depend on the exact behaviors in this section.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   In the below definitions, a router is considered "active" if it is
 | 
	
		
			
				|  |  | -   running, valid, and not hibernating.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "Valid" -- a router is 'Valid' if it is running a version of Tor not
 | 
	
		
			
				|  |  | -   known to be broken, and the directory authority has not blacklisted
 | 
	
		
			
				|  |  | -   it as suspicious.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "Named" -- Directory authority administrators may decide to support name
 | 
	
		
			
				|  |  | -   binding.  If they do, then they must maintain a file of
 | 
	
		
			
				|  |  | -   nickname-to-identity-key mappings, and try to keep this file consistent
 | 
	
		
			
				|  |  | -   with other directory authorities.  If they don't, they act as clients, and
 | 
	
		
			
				|  |  | -   report bindings made by other directory authorities (name X is bound to
 | 
	
		
			
				|  |  | -   identity Y if at least one binding directory lists it, and no directory
 | 
	
		
			
				|  |  | -   binds X to some other Y'.)  A router is called 'Named' if the router
 | 
	
		
			
				|  |  | -   believes the given name should be bound to the given key.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Two strategies exist on the current network for deciding on
 | 
	
		
			
				|  |  | -        values for the Named flag.  In the original version, server
 | 
	
		
			
				|  |  | -        operators were asked to send nickname-identity pairs to a
 | 
	
		
			
				|  |  | -        mailing list of Naming directory authorities operators.  The
 | 
	
		
			
				|  |  | -        operators were then supposed to add the pairs to their
 | 
	
		
			
				|  |  | -        mapping files; in practice, they didn't get to this often.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Newer Naming authorities run a script that registers routers
 | 
	
		
			
				|  |  | -        in their mapping files once the routers have been online at
 | 
	
		
			
				|  |  | -        least two weeks, no other router has that nickname, and no
 | 
	
		
			
				|  |  | -        other router has wanted the nickname for a month.  If a router
 | 
	
		
			
				|  |  | -        has not been online for six months, the router is removed.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "Unnamed" -- Directory authorities that support naming should vote for a
 | 
	
		
			
				|  |  | -   router to be 'Unnamed' if its given nickname is mapped to a different
 | 
	
		
			
				|  |  | -   identity.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "Running" -- A router is 'Running' if the authority managed to connect to
 | 
	
		
			
				|  |  | -   it successfully within the last 30 minutes.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "Stable" -- A router is 'Stable' if it is active, and either its Weighted
 | 
	
		
			
				|  |  | -   MTBF is at least the median for known active routers or its Weighted MTBF
 | 
	
		
			
				|  |  | -   corresponds to at least 7 days. Routers are never called Stable if they are
 | 
	
		
			
				|  |  | -   running a version of Tor known to drop circuits stupidly.  (0.1.1.10-alpha
 | 
	
		
			
				|  |  | -   through 0.1.1.16-rc are stupid this way.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        To calculate weighted MTBF, compute the weighted mean of the lengths
 | 
	
		
			
				|  |  | -        of all intervals when the router was observed to be up, weighting
 | 
	
		
			
				|  |  | -        intervals by $\alpha^n$, where $n$ is the amount of time that has
 | 
	
		
			
				|  |  | -        passed since the interval ended, and $\alpha$ is chosen so that
 | 
	
		
			
				|  |  | -        measurements over approximately one month old no longer influence the
 | 
	
		
			
				|  |  | -        weighted MTBF much.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [XXXX what happens when we have less than 4 days of MTBF info.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "Exit" -- A router is called an 'Exit' iff it allows exits to at
 | 
	
		
			
				|  |  | -    least two of the ports 80, 443, and 6667 and allows exits to at
 | 
	
		
			
				|  |  | -    least one /8 address space.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "Fast" -- A router is 'Fast' if it is active, and its bandwidth is
 | 
	
		
			
				|  |  | -   either in the top 7/8ths for known active routers or at least 20KB/s.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "Guard" -- A router is a possible 'Guard' if its Weighted Fractional
 | 
	
		
			
				|  |  | -   Uptime is at least the median for "familiar" active routers, and if
 | 
	
		
			
				|  |  | -   its bandwidth is at least median or at least 250KB/s.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        To calculate weighted fractional uptime, compute the fraction
 | 
	
		
			
				|  |  | -        of time that the router is up in any given day, weighting so that
 | 
	
		
			
				|  |  | -        downtime and uptime in the past counts less.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        A node is 'familiar' if 1/8 of all active nodes have appeared more
 | 
	
		
			
				|  |  | -        recently than it, OR it has been around for a few weeks.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "Authority" -- A router is called an 'Authority' if the authority
 | 
	
		
			
				|  |  | -   generating the network-status document believes it is an authority.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "V2Dir" -- A router supports the v2 directory protocol if it has an open
 | 
	
		
			
				|  |  | -   directory port, and it is running a version of the directory protocol that
 | 
	
		
			
				|  |  | -   supports the functionality clients need.  (Currently, this is
 | 
	
		
			
				|  |  | -   0.1.1.9-alpha or later.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "V3Dir" -- A router supports the v3 directory protocol if it has an open
 | 
	
		
			
				|  |  | -   directory port, and it is running a version of the directory protocol that
 | 
	
		
			
				|  |  | -   supports the functionality clients need.  (Currently, this is
 | 
	
		
			
				|  |  | -   0.2.0.?????-alpha or later.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "HSDir" -- A router is a v2 hidden service directory if it stores and
 | 
	
		
			
				|  |  | -   serves v2 hidden service descriptors and the authority managed to connect
 | 
	
		
			
				|  |  | -   to it successfully within the last 24 hours.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Directory server administrators may label some servers or IPs as
 | 
	
		
			
				|  |  | -   blacklisted, and elect not to include them in their network-status lists.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Authorities SHOULD 'disable' any servers in excess of 3 on any single IP.
 | 
	
		
			
				|  |  | -   When there are more than 3 to choose from, authorities should first prefer
 | 
	
		
			
				|  |  | -   authorities to non-authorities, then prefer Running to non-Running, and
 | 
	
		
			
				|  |  | -   then prefer high-bandwidth to low-bandwidth.  To 'disable' a server, the
 | 
	
		
			
				|  |  | -   authority *should* advertise it without the Running or Valid flag.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Thus, the network-status vote includes all non-blacklisted,
 | 
	
		
			
				|  |  | -   non-expired, non-superseded descriptors.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The bandwidth in a "w" line should be taken as the best estimate
 | 
	
		
			
				|  |  | -   of the router's actual capacity that the authority has.  For now,
 | 
	
		
			
				|  |  | -   this should be the lesser of the observed bandwidth and bandwidth
 | 
	
		
			
				|  |  | -   rate limit from the router descriptor.  It is given in kilobytes
 | 
	
		
			
				|  |  | -   per second, and capped at some arbitrary value (currently 10 MB/s).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The Measured= keyword on a "w" line vote is currently computed
 | 
	
		
			
				|  |  | -   by multiplying the previous published consensus bandwidth by the
 | 
	
		
			
				|  |  | -   ratio of the measured average node stream capacity to the network
 | 
	
		
			
				|  |  | -   average. If 3 or more authorities provide a Measured= keyword for
 | 
	
		
			
				|  |  | -   a router, the authorities produce a consensus containing a "w"
 | 
	
		
			
				|  |  | -   Bandwidth= keyword equal to the median of the Measured= votes.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The ports listed in a "p" line should be taken as those ports for
 | 
	
		
			
				|  |  | -   which the router's exit policy permits 'most' addresses, ignoring any
 | 
	
		
			
				|  |  | -   accept not for all addresses, ignoring all rejects for private
 | 
	
		
			
				|  |  | -   netblocks.  "Most" addresses are permitted if no more than 2^25
 | 
	
		
			
				|  |  | -   IPv4 addresses (two /8 networks) were blocked.  The list is encoded
 | 
	
		
			
				|  |  | -   as described in 3.4.2.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -3.4. Computing a consensus from a set of votes
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Given a set of votes, authorities compute the contents of the consensus
 | 
	
		
			
				|  |  | -   document as follows:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     The "valid-after", "valid-until", and "fresh-until" times are taken as
 | 
	
		
			
				|  |  | -     the median of the respective values from all the votes.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     The times in the "voting-delay" line are taken as the median of the
 | 
	
		
			
				|  |  | -     VoteSeconds and DistSeconds times in the votes.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     Known-flags is the union of all flags known by any voter.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     Entries are given on the "params" line for every keyword on which any
 | 
	
		
			
				|  |  | -     authority voted.  The values given are the low-median of all votes on
 | 
	
		
			
				|  |  | -     that keyword.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "client-versions" and "server-versions" are sorted in ascending
 | 
	
		
			
				|  |  | -     order; A version is recommended in the consensus if it is recommended
 | 
	
		
			
				|  |  | -     by more than half of the voting authorities that included a
 | 
	
		
			
				|  |  | -     client-versions or server-versions lines in their votes.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     The authority item groups (dir-source, contact, fingerprint,
 | 
	
		
			
				|  |  | -     vote-digest) are taken from the votes of the voting
 | 
	
		
			
				|  |  | -     authorities. These groups are sorted by the digests of the
 | 
	
		
			
				|  |  | -     authorities identity keys, in ascending order.  If the consensus
 | 
	
		
			
				|  |  | -     method is 3 or later, a dir-source line must be included for
 | 
	
		
			
				|  |  | -     every vote with legacy-key entry, using the legacy-key's
 | 
	
		
			
				|  |  | -     fingerprint, the voter's ordinary nickname with the string
 | 
	
		
			
				|  |  | -     "-legacy" appended, and all other fields as from the original
 | 
	
		
			
				|  |  | -     vote's dir-source line.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     A router status entry:
 | 
	
		
			
				|  |  | -        * is included in the result if some router status entry with the same
 | 
	
		
			
				|  |  | -          identity is included by more than half of the authorities (total
 | 
	
		
			
				|  |  | -          authorities, not just those whose votes we have).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        * For any given identity, we include at most one router status entry.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        * A router entry has a flag set if that is included by more than half
 | 
	
		
			
				|  |  | -          of the authorities who care about that flag.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        * Two router entries are "the same" if they have the same
 | 
	
		
			
				|  |  | -          <descriptor digest, published time, nickname, IP, ports> tuple.
 | 
	
		
			
				|  |  | -          We choose the tuple for a given router as whichever tuple appears
 | 
	
		
			
				|  |  | -          for that router in the most votes.  We break ties first in favor of
 | 
	
		
			
				|  |  | -          the more recently published, then in favor of smaller server
 | 
	
		
			
				|  |  | -          descriptor digest.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        * The Named flag appears if it is included for this routerstatus by
 | 
	
		
			
				|  |  | -          _any_ authority, and if all authorities that list it list the same
 | 
	
		
			
				|  |  | -          nickname. However, if consensus-method 2 or later is in use, and
 | 
	
		
			
				|  |  | -          any authority calls this identity/nickname pair Unnamed, then
 | 
	
		
			
				|  |  | -          this routerstatus does not get the Named flag.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        * If consensus-method 2 or later is in use, the Unnamed flag is
 | 
	
		
			
				|  |  | -          set for a routerstatus if any authorities have voted for a different
 | 
	
		
			
				|  |  | -          identities to be Named with that nickname, or if any authority
 | 
	
		
			
				|  |  | -          lists that nickname/ID pair as Unnamed.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          (With consensus-method 1, Unnamed is set like any other flag.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        * The version is given as whichever version is listed by the most
 | 
	
		
			
				|  |  | -          voters, with ties decided in favor of more recent versions.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        * If consensus-method 4 or later is in use, then routers that
 | 
	
		
			
				|  |  | -          do not have the Running flag are not listed at all.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        * If consensus-method 5 or later is in use, then the "w" line
 | 
	
		
			
				|  |  | -          is generated using a low-median of the bandwidth values from
 | 
	
		
			
				|  |  | -          the votes that included "w" lines for this router.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        * If consensus-method 5 or later is in use, then the "p" line
 | 
	
		
			
				|  |  | -          is taken from the votes that have the same policy summary
 | 
	
		
			
				|  |  | -          for the descriptor we are listing.  (They should all be the
 | 
	
		
			
				|  |  | -          same.  If they are not, we pick the most commonly listed
 | 
	
		
			
				|  |  | -          one, breaking ties in favor of the lexicographically larger
 | 
	
		
			
				|  |  | -          vote.)  The port list is encoded as specified in 3.4.2.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        * If consensus-method 6 or later is in use and if 3 or more 
 | 
	
		
			
				|  |  | -          authorities provide a Measured= keyword in their votes for 
 | 
	
		
			
				|  |  | -          a router, the authorities produce a consensus containing a 
 | 
	
		
			
				|  |  | -          Bandwidth= keyword equal to the median of the Measured= votes.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        * If consensus-method 7 or later is in use, the params line is
 | 
	
		
			
				|  |  | -          included in the output.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        * If the consensus method is under 11, bad exits are considered as
 | 
	
		
			
				|  |  | -          possible exits when computing bandwidth weights.  Otherwise, if
 | 
	
		
			
				|  |  | -          method 11 or later is in use, any router that is determined to get
 | 
	
		
			
				|  |  | -          the BadExit flag doesn't count when we're calculating weights.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     The signatures at the end of a consensus document are sorted in
 | 
	
		
			
				|  |  | -     ascending order by identity digest.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   All ties in computing medians are broken in favor of the smaller or
 | 
	
		
			
				|  |  | -   earlier item.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -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.  Later methods will be assigned
 | 
	
		
			
				|  |  | -   higher numbers.  Currently recognized methods:
 | 
	
		
			
				|  |  | -     "1" -- The first implemented version.
 | 
	
		
			
				|  |  | -     "2" -- Added support for the Unnamed flag.
 | 
	
		
			
				|  |  | -     "3" -- Added legacy ID key support to aid in authority ID key rollovers
 | 
	
		
			
				|  |  | -     "4" -- No longer list routers that are not running in the consensus
 | 
	
		
			
				|  |  | -     "5" -- adds support for "w" and "p" lines.
 | 
	
		
			
				|  |  | -     "6" -- Prefers measured bandwidth values rather than advertised
 | 
	
		
			
				|  |  | -     "7" -- Provides keyword=integer pairs of consensus parameters
 | 
	
		
			
				|  |  | -     "8" -- Provides microdescriptor summaries
 | 
	
		
			
				|  |  | -     "9" -- Provides weights for selecting flagged routers in paths
 | 
	
		
			
				|  |  | -     "10" -- Fixes edge case bugs in router flag selection weights
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   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 voting.  If it supports this
 | 
	
		
			
				|  |  | -   method, then it uses it.  Otherwise, it falls back to method 1.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   (The consensuses generated by new methods must be parsable by
 | 
	
		
			
				|  |  | -   implementations that only understand the old methods, and must not cause
 | 
	
		
			
				|  |  | -   those implementations to compromise their anonymity.  This is a means for
 | 
	
		
			
				|  |  | -   making changes in the contents of consensus; not for making
 | 
	
		
			
				|  |  | -   backward-incompatible changes in their format.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -3.4.2. Encoding port lists
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Whether the summary shows the list of accepted ports or the list of
 | 
	
		
			
				|  |  | -  rejected ports depends on which list is shorter (has a shorter string
 | 
	
		
			
				|  |  | -  representation).  In case of ties we choose the list of accepted
 | 
	
		
			
				|  |  | -  ports.  As an exception to this rule an allow-all policy is
 | 
	
		
			
				|  |  | -  represented as "accept 1-65535" instead of "reject " and a reject-all
 | 
	
		
			
				|  |  | -  policy is similarly given as "reject 1-65535".
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Summary items are compressed, that is instead of "80-88,89-100" there
 | 
	
		
			
				|  |  | -  only is a single item of "80-100", similarly instead of "20,21" a
 | 
	
		
			
				|  |  | -  summary will say "20-21".
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Port lists are sorted in ascending order.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  The maximum allowed length of a policy summary (including the "accept "
 | 
	
		
			
				|  |  | -  or "reject ") is 1000 characters.  If a summary exceeds that length we
 | 
	
		
			
				|  |  | -  use an accept-style summary and list as much of the port list as is
 | 
	
		
			
				|  |  | -  possible within these 1000 bytes.  [XXXX be more specific.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -3.4.3. Computing Bandwidth Weights
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Let weight_scale = 10000
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Let G be the total bandwidth for Guard-flagged nodes.
 | 
	
		
			
				|  |  | -  Let M be the total bandwidth for non-flagged nodes.
 | 
	
		
			
				|  |  | -  Let E be the total bandwidth for Exit-flagged nodes.
 | 
	
		
			
				|  |  | -  Let D be the total bandwidth for Guard+Exit-flagged nodes.
 | 
	
		
			
				|  |  | -  Let T = G+M+E+D
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Let Wgd be the weight for choosing a Guard+Exit for the guard position.
 | 
	
		
			
				|  |  | -  Let Wmd be the weight for choosing a Guard+Exit for the middle position.
 | 
	
		
			
				|  |  | -  Let Wed be the weight for choosing a Guard+Exit for the exit position.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Let Wme be the weight for choosing an Exit for the middle position.
 | 
	
		
			
				|  |  | -  Let Wmg be the weight for choosing a Guard for the middle position.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Let Wgg be the weight for choosing a Guard for the guard position.
 | 
	
		
			
				|  |  | -  Let Wee be the weight for choosing an Exit for the exit position.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Balanced network conditions then arise from solutions to the following
 | 
	
		
			
				|  |  | -  system of equations:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      Wgg*G + Wgd*D == M + Wmd*D + Wme*E + Wmg*G  (guard bw = middle bw)
 | 
	
		
			
				|  |  | -      Wgg*G + Wgd*D == Wee*E + Wed*D              (guard bw = exit bw)
 | 
	
		
			
				|  |  | -      Wed*D + Wmd*D + Wgd*D == D                  (aka: Wed+Wmd+Wdg = 1)
 | 
	
		
			
				|  |  | -      Wmg*G + Wgg*G == G                          (aka: Wgg = 1-Wmg)
 | 
	
		
			
				|  |  | -      Wme*E + Wee*E == E                          (aka: Wee = 1-Wme)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  We are short 2 constraints with the above set. The remaining constraints
 | 
	
		
			
				|  |  | -  come from examining different cases of network load. The following
 | 
	
		
			
				|  |  | -  constraints are used in consensus method 10 and above. There are another
 | 
	
		
			
				|  |  | -  incorrect and obsolete set of constraints used for these same cases in
 | 
	
		
			
				|  |  | -  consensus method 9. For those, see dir-spec.txt in Tor 0.2.2.10-alpha
 | 
	
		
			
				|  |  | -  to 0.2.2.16-alpha.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Case 1: E >= T/3 && G >= T/3 (Neither Exit nor Guard Scarce)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    In this case, the additional two constraints are: Wmg == Wmd,
 | 
	
		
			
				|  |  | -    Wed == 1/3.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    This leads to the solution:
 | 
	
		
			
				|  |  | -        Wgd = weight_scale/3
 | 
	
		
			
				|  |  | -        Wed = weight_scale/3
 | 
	
		
			
				|  |  | -        Wmd = weight_scale/3
 | 
	
		
			
				|  |  | -        Wee = (weight_scale*(E+G+M))/(3*E)
 | 
	
		
			
				|  |  | -        Wme = weight_scale - Wee
 | 
	
		
			
				|  |  | -        Wmg = (weight_scale*(2*G-E-M))/(3*G)
 | 
	
		
			
				|  |  | -        Wgg = weight_scale - Wmg
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Case 2: E < T/3 && G < T/3 (Both are scarce)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Let R denote the more scarce class (Rare) between Guard vs Exit.
 | 
	
		
			
				|  |  | -    Let S denote the less scarce class.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Subcase a: R+D < S
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       In this subcase, we simply devote all of D bandwidth to the
 | 
	
		
			
				|  |  | -       scarce class.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       Wgg = Wee = weight_scale
 | 
	
		
			
				|  |  | -       Wmg = Wme = Wmd = 0;
 | 
	
		
			
				|  |  | -       if E < G:
 | 
	
		
			
				|  |  | -         Wed = weight_scale
 | 
	
		
			
				|  |  | -         Wgd = 0
 | 
	
		
			
				|  |  | -       else:
 | 
	
		
			
				|  |  | -         Wed = 0
 | 
	
		
			
				|  |  | -         Wgd = weight_scale
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Subcase b: R+D >= S
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      In this case, if M <= T/3, we have enough bandwidth to try to achieve
 | 
	
		
			
				|  |  | -      a balancing condition.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      Add constraints Wgg = 1, Wmd == Wgd to maximize bandwidth in the guard
 | 
	
		
			
				|  |  | -      position while still allowing exits to be used as middle nodes:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Wee = (weight_scale*(E - G + M))/E
 | 
	
		
			
				|  |  | -        Wed = (weight_scale*(D - 2*E + 4*G - 2*M))/(3*D)
 | 
	
		
			
				|  |  | -        Wme = (weight_scale*(G-M))/E
 | 
	
		
			
				|  |  | -        Wmg = 0
 | 
	
		
			
				|  |  | -        Wgg = weight_scale
 | 
	
		
			
				|  |  | -        Wmd = (weight_scale - Wed)/2
 | 
	
		
			
				|  |  | -        Wgd = (weight_scale - Wed)/2
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      If this system ends up with any values out of range (ie negative, or
 | 
	
		
			
				|  |  | -      above weight_scale), use the constraints Wgg == 1 and Wee == 1, since
 | 
	
		
			
				|  |  | -      both those positions are scarce:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -         Wgg = weight_scale
 | 
	
		
			
				|  |  | -         Wee = weight_scale
 | 
	
		
			
				|  |  | -         Wed = (weight_scale*(D - 2*E + G + M))/(3*D)
 | 
	
		
			
				|  |  | -         Wmd = (weight_Scale*(D - 2*M + G + E))/(3*D)
 | 
	
		
			
				|  |  | -         Wme = 0
 | 
	
		
			
				|  |  | -         Wmg = 0
 | 
	
		
			
				|  |  | -         Wgd = weight_scale - Wed - Wmd
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      If M > T/3, then the Wmd weight above will become negative. Set it to 0
 | 
	
		
			
				|  |  | -      in this case:
 | 
	
		
			
				|  |  | -         Wmd = 0
 | 
	
		
			
				|  |  | -         Wgd = weight_scale - Wed
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Case 3: One of E < T/3 or G < T/3
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Let S be the scarce class (of E or G).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Subcase a: (S+D) < T/3:
 | 
	
		
			
				|  |  | -      if G=S:
 | 
	
		
			
				|  |  | -        Wgg = Wgd = weight_scale;
 | 
	
		
			
				|  |  | -        Wmd = Wed = Wmg = 0;
 | 
	
		
			
				|  |  | -        // Minor subcase, if E is more scarce than M,
 | 
	
		
			
				|  |  | -        // keep its bandwidth in place.
 | 
	
		
			
				|  |  | -        if (E < M) Wme = 0;
 | 
	
		
			
				|  |  | -        else Wme = (weight_scale*(E-M))/(2*E);
 | 
	
		
			
				|  |  | -        Wee = weight_scale-Wme;
 | 
	
		
			
				|  |  | -      if E=S:
 | 
	
		
			
				|  |  | -        Wee = Wed = weight_scale;
 | 
	
		
			
				|  |  | -        Wmd = Wgd = Wme = 0;
 | 
	
		
			
				|  |  | -        // Minor subcase, if G is more scarce than M,
 | 
	
		
			
				|  |  | -        // keep its bandwidth in place.
 | 
	
		
			
				|  |  | -        if (G < M) Wmg = 0;
 | 
	
		
			
				|  |  | -        else Wmg = (weight_scale*(G-M))/(2*G);
 | 
	
		
			
				|  |  | -        Wgg = weight_scale-Wmg;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Subcase b: (S+D) >= T/3
 | 
	
		
			
				|  |  | -      if G=S:
 | 
	
		
			
				|  |  | -        Add constraints Wgg = 1, Wmd == Wed to maximize bandwidth
 | 
	
		
			
				|  |  | -        in the guard position, while still allowing exits to be
 | 
	
		
			
				|  |  | -        used as middle nodes:
 | 
	
		
			
				|  |  | -          Wgg = weight_scale
 | 
	
		
			
				|  |  | -          Wgd = (weight_scale*(D - 2*G + E + M))/(3*D)
 | 
	
		
			
				|  |  | -          Wmg = 0
 | 
	
		
			
				|  |  | -          Wee = (weight_scale*(E+M))/(2*E)
 | 
	
		
			
				|  |  | -          Wme = weight_scale - Wee
 | 
	
		
			
				|  |  | -          Wmd = (weight_scale - Wgd)/2
 | 
	
		
			
				|  |  | -          Wed = (weight_scale - Wgd)/2
 | 
	
		
			
				|  |  | -      if E=S:
 | 
	
		
			
				|  |  | -        Add constraints Wee == 1, Wmd == Wgd to maximize bandwidth
 | 
	
		
			
				|  |  | -        in the exit position:
 | 
	
		
			
				|  |  | -          Wee = weight_scale;
 | 
	
		
			
				|  |  | -          Wed = (weight_scale*(D - 2*E + G + M))/(3*D);
 | 
	
		
			
				|  |  | -          Wme = 0;
 | 
	
		
			
				|  |  | -          Wgg = (weight_scale*(G+M))/(2*G);
 | 
	
		
			
				|  |  | -          Wmg = weight_scale - Wgg;
 | 
	
		
			
				|  |  | -          Wmd = (weight_scale - Wed)/2;
 | 
	
		
			
				|  |  | -          Wgd = (weight_scale - Wed)/2;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  To ensure consensus, all calculations are performed using integer math
 | 
	
		
			
				|  |  | -  with a fixed precision determined by the bwweightscale consensus
 | 
	
		
			
				|  |  | -  parameter (defaults at 10000, Min: 1, Max: INT32_MAX).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  For future balancing improvements, Tor clients support 11 additional weights
 | 
	
		
			
				|  |  | -  for directory requests and middle weighting. These weights are currently
 | 
	
		
			
				|  |  | -  set at weight_scale, with the exception of the following groups of
 | 
	
		
			
				|  |  | -  assignments:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Directory requests use middle weights:
 | 
	
		
			
				|  |  | -     Wbd=Wmd, Wbg=Wmg, Wbe=Wme, Wbm=Wmm
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Handle bridges and strange exit policies:
 | 
	
		
			
				|  |  | -     Wgm=Wgg, Wem=Wee, Weg=Wed
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -3.5. Detached signatures
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Assuming full connectivity, every authority should compute and sign the
 | 
	
		
			
				|  |  | -   same consensus directory in each period.  Therefore, it isn't necessary to
 | 
	
		
			
				|  |  | -   download the consensus computed by each authority; instead, the
 | 
	
		
			
				|  |  | -   authorities only push/fetch each others' signatures.  A "detached
 | 
	
		
			
				|  |  | -   signature" document contains items as follows:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "consensus-digest" SP Digest NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [At start, at most once.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        The digest of the consensus being signed.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "valid-after" SP YYYY-MM-DD SP HH:MM:SS NL
 | 
	
		
			
				|  |  | -    "fresh-until" SP YYYY-MM-DD SP HH:MM:SS NL
 | 
	
		
			
				|  |  | -    "valid-until" SP YYYY-MM-DD SP HH:MM:SS NL
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [As in the consensus]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    "directory-signature"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [As in the consensus; the signature object is the same as in the
 | 
	
		
			
				|  |  | -        consensus document.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -4. Directory server operation
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   All directory authorities and directory caches ("directory servers")
 | 
	
		
			
				|  |  | -   implement this section, except as noted.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -4.1. Accepting uploads (authorities only)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   When a router posts a signed descriptor to a directory authority, the
 | 
	
		
			
				|  |  | -   authority first checks whether it is well-formed and correctly
 | 
	
		
			
				|  |  | -   self-signed.  If it is, the authority next verifies that the nickname
 | 
	
		
			
				|  |  | -   in question is not already assigned to a router with a different
 | 
	
		
			
				|  |  | -   public key.
 | 
	
		
			
				|  |  | -   Finally, the authority MAY check that the router is not blacklisted
 | 
	
		
			
				|  |  | -   because of its key, IP, or another reason.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   If the descriptor passes these tests, and the authority does not already
 | 
	
		
			
				|  |  | -   have a descriptor for a router with this public key, it accepts the
 | 
	
		
			
				|  |  | -   descriptor and remembers it.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   If the authority _does_ have a descriptor with the same public key, the
 | 
	
		
			
				|  |  | -   newly uploaded descriptor is remembered if its publication time is more
 | 
	
		
			
				|  |  | -   recent than the most recent old descriptor for that router, and either:
 | 
	
		
			
				|  |  | -      - There are non-cosmetic differences between the old descriptor and the
 | 
	
		
			
				|  |  | -        new one.
 | 
	
		
			
				|  |  | -      - Enough time has passed between the descriptors' publication times.
 | 
	
		
			
				|  |  | -        (Currently, 12 hours.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Differences between router descriptors are "non-cosmetic" if they would be
 | 
	
		
			
				|  |  | -   sufficient to force an upload as described in section 2 above.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Note that the "cosmetic difference" test only applies to uploaded
 | 
	
		
			
				|  |  | -   descriptors, not to descriptors that the authority downloads from other
 | 
	
		
			
				|  |  | -   authorities.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   When a router posts a signed extra-info document to a directory authority,
 | 
	
		
			
				|  |  | -   the authority again checks it for well-formedness and correct signature,
 | 
	
		
			
				|  |  | -   and checks that its matches the extra-info-digest in some router
 | 
	
		
			
				|  |  | -   descriptor that it believes is currently useful.  If so, it accepts it and
 | 
	
		
			
				|  |  | -   stores it and serves it as requested.  If not, it drops it.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -4.2. Voting (authorities only)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Authorities divide time into Intervals.  Authority administrators SHOULD
 | 
	
		
			
				|  |  | -   try to all pick the same interval length, and SHOULD pick intervals that
 | 
	
		
			
				|  |  | -   are commonly used divisions of time (e.g., 5 minutes, 15 minutes, 30
 | 
	
		
			
				|  |  | -   minutes, 60 minutes, 90 minutes).  Voting intervals SHOULD be chosen to
 | 
	
		
			
				|  |  | -   divide evenly into a 24-hour day.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Authorities SHOULD act according to interval and delays in the
 | 
	
		
			
				|  |  | -   latest consensus.  Lacking a latest consensus, they SHOULD default to a
 | 
	
		
			
				|  |  | -   30-minute Interval, a 5 minute VotingDelay, and a 5 minute DistDelay.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Authorities MUST take pains to ensure that their clocks remain accurate
 | 
	
		
			
				|  |  | -   within a few seconds.  (Running NTP is usually sufficient.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The first voting period of each day begins at 00:00 (midnight) GMT.  If
 | 
	
		
			
				|  |  | -   the last period of the day would be truncated by one-half or more, it is
 | 
	
		
			
				|  |  | -   merged with the second-to-last period.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   An authority SHOULD publish its vote immediately at the start of each voting
 | 
	
		
			
				|  |  | -   period (minus VoteSeconds+DistSeconds).  It does this by making it
 | 
	
		
			
				|  |  | -   available at
 | 
	
		
			
				|  |  | -     http://<hostname>/tor/status-vote/next/authority.z
 | 
	
		
			
				|  |  | -   and sending it in an HTTP POST request to each other authority at the URL
 | 
	
		
			
				|  |  | -     http://<hostname>/tor/post/vote
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   If, at the start of the voting period, minus DistSeconds, an authority
 | 
	
		
			
				|  |  | -   does not have a current statement from another authority, the first
 | 
	
		
			
				|  |  | -   authority downloads the other's statement.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Once an authority has a vote from another authority, it makes it available
 | 
	
		
			
				|  |  | -   at
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/status-vote/next/<fp>.z
 | 
	
		
			
				|  |  | -   where <fp> is the fingerprint of the other authority's identity key.
 | 
	
		
			
				|  |  | -   And at
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/status-vote/next/d/<d>.z
 | 
	
		
			
				|  |  | -   where <d> is the digest of the vote document.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The consensus status, along with as many signatures as the server
 | 
	
		
			
				|  |  | -   currently knows, should be available at
 | 
	
		
			
				|  |  | -      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
 | 
	
		
			
				|  |  | -   [XXX current/consensus-signatures is not currently implemented, as it
 | 
	
		
			
				|  |  | -    is not used in the voting protocol.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The other vote documents are analogously made available under
 | 
	
		
			
				|  |  | -     http://<hostname>/tor/status-vote/current/authority.z
 | 
	
		
			
				|  |  | -     http://<hostname>/tor/status-vote/current/<fp>.z
 | 
	
		
			
				|  |  | -     http://<hostname>/tor/status-vote/current/d/<d>.z
 | 
	
		
			
				|  |  | -   once the consensus is complete.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Once an authority has computed and signed a consensus network status, it
 | 
	
		
			
				|  |  | -   should send its detached signature to each other authority in an HTTP POST
 | 
	
		
			
				|  |  | -   request to the URL:
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/post/consensus-signature
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   [XXX Note why we support push-and-then-pull.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   [XXX possible future features include support for downloading old
 | 
	
		
			
				|  |  | -    consensuses.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -4.3. Downloading consensus status documents (caches only)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   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 in the first half-interval after its current consensus
 | 
	
		
			
				|  |  | -   stops being fresh.  (This time is chosen at random to avoid swarming
 | 
	
		
			
				|  |  | -   the authorities at the start of each period.  The interval size is
 | 
	
		
			
				|  |  | -   inferred from the difference between the valid-after time and the
 | 
	
		
			
				|  |  | -   fresh-until time on the consensus.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   [For example, if a cache has a consensus that became valid at 1:00,
 | 
	
		
			
				|  |  | -    and is fresh until 2:00, that cache will fetch a new consensus at
 | 
	
		
			
				|  |  | -    a random time between 2:00 and 2:30.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -4.4. Downloading and storing router descriptors (authorities and caches)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Periodically (currently, every 10 seconds), directory servers check
 | 
	
		
			
				|  |  | -   whether there are any specific descriptors that they do not have and that
 | 
	
		
			
				|  |  | -   they are not currently trying to download.  Caches identify these
 | 
	
		
			
				|  |  | -   descriptors by hash in the recent network-status consensus documents;
 | 
	
		
			
				|  |  | -   authorities identify them by hash in vote (if publication date is more
 | 
	
		
			
				|  |  | -   recent than the descriptor we currently have).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | - [XXXX need a way to fetch descriptors ahead of the vote?  v2 status docs can
 | 
	
		
			
				|  |  | - do that for now.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   If so, the directory server launches requests to the authorities for these
 | 
	
		
			
				|  |  | -   descriptors, such that each authority is only asked for descriptors listed
 | 
	
		
			
				|  |  | -   in its most recent vote (if the requester is an authority) or in the
 | 
	
		
			
				|  |  | -   consensus (if the requester is a cache).  If we're an authority, and more
 | 
	
		
			
				|  |  | -   than one authority lists the descriptor, we choose which to ask at random.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   If one of these downloads fails, we do not try to download that descriptor
 | 
	
		
			
				|  |  | -   from the authority that failed to serve it again unless we receive a newer
 | 
	
		
			
				|  |  | -   network-status (consensus or vote) from that authority that lists the same
 | 
	
		
			
				|  |  | -   descriptor.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Directory servers must potentially cache multiple descriptors for each
 | 
	
		
			
				|  |  | -   router. Servers must not discard any descriptor listed by any recent
 | 
	
		
			
				|  |  | -   consensus.  If there is enough space to store additional descriptors,
 | 
	
		
			
				|  |  | -   servers SHOULD try to hold those which clients are likely to download the
 | 
	
		
			
				|  |  | -   most.  (Currently, this is judged based on the interval for which each
 | 
	
		
			
				|  |  | -   descriptor seemed newest.)
 | 
	
		
			
				|  |  | -[XXXX define recent]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Authorities SHOULD NOT download descriptors for routers that they would
 | 
	
		
			
				|  |  | -   immediately reject for reasons listed in 3.1.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -4.5. Downloading and storing extra-info documents
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   All authorities, and any cache that chooses to cache extra-info documents,
 | 
	
		
			
				|  |  | -   and any client that uses extra-info documents, should implement this
 | 
	
		
			
				|  |  | -   section.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Note that generally, clients don't need extra-info documents.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Periodically, the Tor instance checks whether it is missing any extra-info
 | 
	
		
			
				|  |  | -   documents: in other words, if it has any router descriptors with an
 | 
	
		
			
				|  |  | -   extra-info-digest field that does not match any of the extra-info
 | 
	
		
			
				|  |  | -   documents currently held.  If so, it downloads whatever extra-info
 | 
	
		
			
				|  |  | -   documents are missing.  Caches download from authorities; non-caches try
 | 
	
		
			
				|  |  | -   to download from caches.  We follow the same splitting and back-off rules
 | 
	
		
			
				|  |  | -   as in 4.4 (if a cache) or 5.3 (if a client).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -4.6. General-use HTTP URLs
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   "Fingerprints" in these URLs are base-16-encoded SHA1 hashes.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The most recent v3 consensus should be available at:
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/status-vote/current/consensus.z
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Starting with Tor version 0.2.1.1-alpha is also available at:
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/status-vote/current/consensus/<F1>+<F2>+<F3>.z
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Where F1, F2, etc. are authority identity fingerprints the client trusts.
 | 
	
		
			
				|  |  | -   Servers will only return a consensus if more than half of the requested
 | 
	
		
			
				|  |  | -   authorities have signed the document, otherwise a 404 error will be sent
 | 
	
		
			
				|  |  | -   back.  The fingerprints can be shortened to a length of any multiple of
 | 
	
		
			
				|  |  | -   two, using only the leftmost part of the encoded fingerprint.  Tor uses
 | 
	
		
			
				|  |  | -   3 bytes (6 hex characters) of the fingerprint.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Clients SHOULD sort the fingerprints in ascending order.  Server MUST
 | 
	
		
			
				|  |  | -   accept any order.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Clients SHOULD use this format when requesting consensus documents from
 | 
	
		
			
				|  |  | -   directory authority servers and from caches running a version of Tor
 | 
	
		
			
				|  |  | -   that is known to support this URL format.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   A concatenated set of all the current key certificates should be available
 | 
	
		
			
				|  |  | -   at:
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/keys/all.z
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The key certificate for this server (if it is an authority) should be
 | 
	
		
			
				|  |  | -   available at:
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/keys/authority.z
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The key certificate for an authority whose authority identity fingerprint
 | 
	
		
			
				|  |  | -   is <F> should be available at:
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/keys/fp/<F>.z
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The key certificate whose signing key fingerprint is <F> should be
 | 
	
		
			
				|  |  | -   available at:
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/keys/sk/<F>.z
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The key certificate whose identity key fingerprint is <F> and whose signing
 | 
	
		
			
				|  |  | -   key fingerprint is <S> should be available at:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/keys/fp-sk/<F>-<S>.z
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   (As usual, clients may request multiple certificates using:
 | 
	
		
			
				|  |  | -       http://<hostname>/tor/keys/fp-sk/<F1>-<S1>+<F2>-<S2>.z  )
 | 
	
		
			
				|  |  | -   [The above fp-sk format was not supported before Tor 0.2.1.9-alpha.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The most recent descriptor for a server whose identity key has a
 | 
	
		
			
				|  |  | -   fingerprint of <F> should be available at:
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/server/fp/<F>.z
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The most recent descriptors for servers with identity fingerprints
 | 
	
		
			
				|  |  | -   <F1>,<F2>,<F3> should be available at:
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/server/fp/<F1>+<F2>+<F3>.z
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   (NOTE: Implementations SHOULD NOT download descriptors by identity key
 | 
	
		
			
				|  |  | -   fingerprint. This allows a corrupted server (in collusion with a cache) to
 | 
	
		
			
				|  |  | -   provide a unique descriptor to a client, and thereby partition that client
 | 
	
		
			
				|  |  | -   from the rest of the network.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The server descriptor with (descriptor) digest <D> (in hex) should be
 | 
	
		
			
				|  |  | -   available at:
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/server/d/<D>.z
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The most recent descriptors with digests <D1>,<D2>,<D3> should be
 | 
	
		
			
				|  |  | -   available at:
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/server/d/<D1>+<D2>+<D3>.z
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   The most recent descriptor for this server should be at:
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/server/authority.z
 | 
	
		
			
				|  |  | -    [Nothing in the Tor protocol uses this resource yet, but it is useful
 | 
	
		
			
				|  |  | -     for debugging purposes. Also, the official Tor implementations
 | 
	
		
			
				|  |  | -     (starting at 0.1.1.x) use this resource to test whether a server's
 | 
	
		
			
				|  |  | -     own DirPort is reachable.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   A concatenated set of the most recent descriptors for all known servers
 | 
	
		
			
				|  |  | -   should be available at:
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/server/all.z
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Extra-info documents are available at the URLS
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/extra/d/...
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/extra/fp/...
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/extra/all[.z]
 | 
	
		
			
				|  |  | -      http://<hostname>/tor/extra/authority[.z]
 | 
	
		
			
				|  |  | -         (As for /tor/server/ URLs: supports fetching extra-info
 | 
	
		
			
				|  |  | -         documents by their digest, by the fingerprint of their servers,
 | 
	
		
			
				|  |  | -         or all at once. When serving by fingerprint, we serve the
 | 
	
		
			
				|  |  | -         extra-info that corresponds to the descriptor we would serve by
 | 
	
		
			
				|  |  | -         that fingerprint. Only directory authorities of version
 | 
	
		
			
				|  |  | -         0.2.0.1-alpha or later are guaranteed to support the first
 | 
	
		
			
				|  |  | -         three classes of URLs.  Caches may support them, and MUST
 | 
	
		
			
				|  |  | -         support them if they have advertised "caches-extra-info".)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   For debugging, directories SHOULD expose non-compressed objects at URLs like
 | 
	
		
			
				|  |  | -   the above, but without the final ".z".
 | 
	
		
			
				|  |  | -   Clients MUST handle compressed concatenated information in two forms:
 | 
	
		
			
				|  |  | -     - A concatenated list of zlib-compressed objects.
 | 
	
		
			
				|  |  | -     - A zlib-compressed concatenated list of objects.
 | 
	
		
			
				|  |  | -   Directory servers MAY generate either format: the former requires less
 | 
	
		
			
				|  |  | -   CPU, but the latter requires less bandwidth.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Clients SHOULD use upper case letters (A-F) when base16-encoding
 | 
	
		
			
				|  |  | -   fingerprints.  Servers MUST accept both upper and lower case fingerprints
 | 
	
		
			
				|  |  | -   in requests.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -5. Client operation: downloading information
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Every Tor that is not a directory server (that is, those that do
 | 
	
		
			
				|  |  | -   not have a DirPort set) implements this section.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -5.1. Downloading network-status documents
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Each client maintains a list of directory authorities.  Insofar as
 | 
	
		
			
				|  |  | -   possible, clients SHOULD all use the same list.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Clients try to have a live consensus network-status document at all times.
 | 
	
		
			
				|  |  | -   A network-status document is "live" if the time in its valid-until field
 | 
	
		
			
				|  |  | -   has not passed.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   If a client is missing a live network-status document, it tries to fetch
 | 
	
		
			
				|  |  | -   it from a directory cache (or from an authority if it knows no caches).
 | 
	
		
			
				|  |  | -   On failure, the client waits briefly, then tries that network-status
 | 
	
		
			
				|  |  | -   document again from another cache.  The client does not build circuits
 | 
	
		
			
				|  |  | -   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.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   (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.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   To avoid swarming the caches whenever a consensus expires, the
 | 
	
		
			
				|  |  | -   clients download new consensuses at a randomly chosen time after the
 | 
	
		
			
				|  |  | -   caches are expected to have a fresh consensus, but before their
 | 
	
		
			
				|  |  | -   consensus will expire.  (This time is chosen uniformly at random from
 | 
	
		
			
				|  |  | -   the interval between the time 3/4 into the first interval after the
 | 
	
		
			
				|  |  | -   consensus is no longer fresh, and 7/8 of the time remaining after
 | 
	
		
			
				|  |  | -   that before the consensus is invalid.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   [For example, if a cache has a consensus that became valid at 1:00,
 | 
	
		
			
				|  |  | -    and is fresh until 2:00, and expires at 4:00, that cache will fetch
 | 
	
		
			
				|  |  | -    a new consensus at a random time between 2:45 and 3:50, since 3/4
 | 
	
		
			
				|  |  | -    of the one-hour interval is 45 minutes, and 7/8 of the remaining 75
 | 
	
		
			
				|  |  | -    minutes is 65 minutes.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -5.2. Downloading and storing router descriptors
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Clients try to have the best descriptor for each router.  A descriptor is
 | 
	
		
			
				|  |  | -   "best" if:
 | 
	
		
			
				|  |  | -      * It is listed in the consensus network-status document.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Periodically (currently every 10 seconds) clients check whether there are
 | 
	
		
			
				|  |  | -   any "downloadable" descriptors.  A descriptor is downloadable if:
 | 
	
		
			
				|  |  | -      - It is the "best" descriptor for some router.
 | 
	
		
			
				|  |  | -      - The descriptor was published at least 10 minutes in the past.
 | 
	
		
			
				|  |  | -        (This prevents clients from trying to fetch descriptors that the
 | 
	
		
			
				|  |  | -        mirrors have probably not yet retrieved and cached.)
 | 
	
		
			
				|  |  | -      - The client does not currently have it.
 | 
	
		
			
				|  |  | -      - The client is not currently trying to download it.
 | 
	
		
			
				|  |  | -      - The client would not discard it immediately upon receiving it.
 | 
	
		
			
				|  |  | -      - The client thinks it is running and valid (see 6.1 below).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   If at least 16 known routers have downloadable descriptors, or if
 | 
	
		
			
				|  |  | -   enough time (currently 10 minutes) has passed since the last time the
 | 
	
		
			
				|  |  | -   client tried to download descriptors, it launches requests for all
 | 
	
		
			
				|  |  | -   downloadable descriptors, as described in 5.3 below.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   When a descriptor download fails, the client notes it, and does not
 | 
	
		
			
				|  |  | -   consider the descriptor downloadable again until a certain amount of time
 | 
	
		
			
				|  |  | -   has passed. (Currently 0 seconds for the first failure, 60 seconds for the
 | 
	
		
			
				|  |  | -   second, 5 minutes for the third, 10 minutes for the fourth, and 1 day
 | 
	
		
			
				|  |  | -   thereafter.)  Periodically (currently once an hour) clients reset the
 | 
	
		
			
				|  |  | -   failure count.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Clients retain the most recent descriptor they have downloaded for each
 | 
	
		
			
				|  |  | -   router so long as it is not too old (currently, 48 hours), OR so long as
 | 
	
		
			
				|  |  | -   no better descriptor has been downloaded for the same router.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   [Versions of Tor before 0.1.2.3-alpha would discard descriptors simply for
 | 
	
		
			
				|  |  | -   being published too far in the past.]  [The code seems to discard
 | 
	
		
			
				|  |  | -   descriptors in all cases after they're 5 days old. True? -RD]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -5.3. Managing downloads
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   When a client has no consensus network-status document, it downloads it
 | 
	
		
			
				|  |  | -   from a randomly chosen authority.  In all other cases, the client
 | 
	
		
			
				|  |  | -   downloads from caches randomly chosen from among those believed to be V2
 | 
	
		
			
				|  |  | -   directory servers.  (This information comes from the network-status
 | 
	
		
			
				|  |  | -   documents; see 6 below.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   When downloading multiple router descriptors, the client chooses multiple
 | 
	
		
			
				|  |  | -   mirrors so that:
 | 
	
		
			
				|  |  | -     - At least 3 different mirrors are used, except when this would result
 | 
	
		
			
				|  |  | -       in more than one request for under 4 descriptors.
 | 
	
		
			
				|  |  | -     - No more than 128 descriptors are requested from a single mirror.
 | 
	
		
			
				|  |  | -     - Otherwise, as few mirrors as possible are used.
 | 
	
		
			
				|  |  | -   After choosing mirrors, the client divides the descriptors among them
 | 
	
		
			
				|  |  | -   randomly.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   After receiving any response client MUST discard any network-status
 | 
	
		
			
				|  |  | -   documents and descriptors that it did not request.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -6. Using directory information
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Everyone besides directory authorities uses the approaches in this section
 | 
	
		
			
				|  |  | -   to decide which servers to use and what their keys are likely to be.
 | 
	
		
			
				|  |  | -   (Directory authorities just believe their own opinions, as in 3.1 above.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -6.1. Choosing routers for circuits.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Circuits SHOULD NOT be built until the client has enough directory
 | 
	
		
			
				|  |  | -   information: a live consensus network status [XXXX fallback?]  and
 | 
	
		
			
				|  |  | -   descriptors for at least 1/4 of the servers believed to be running.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   A server is "listed" if it is included by the consensus network-status
 | 
	
		
			
				|  |  | -   document.  Clients SHOULD NOT use unlisted servers.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   These flags are used as follows:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     - Clients SHOULD NOT use non-'Valid' or non-'Running' routers unless
 | 
	
		
			
				|  |  | -       requested to do so.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     - Clients SHOULD NOT use non-'Fast' routers for any purpose other than
 | 
	
		
			
				|  |  | -       very-low-bandwidth circuits (such as introduction circuits).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     - Clients SHOULD NOT use non-'Stable' routers for circuits that are
 | 
	
		
			
				|  |  | -       likely to need to be open for a very long time (such as those used for
 | 
	
		
			
				|  |  | -       IRC or SSH connections).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     - Clients SHOULD NOT choose non-'Guard' nodes when picking entry guard
 | 
	
		
			
				|  |  | -       nodes.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -     - Clients SHOULD NOT download directory information from non-'V2Dir'
 | 
	
		
			
				|  |  | -       caches.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   See the "path-spec.txt" document for more details.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -6.2. Managing naming
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   In order to provide human-memorable names for individual server
 | 
	
		
			
				|  |  | -   identities, some directory servers bind names to IDs.  Clients handle
 | 
	
		
			
				|  |  | -   names in two ways:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   When a client encounters a name it has not mapped before:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      If the consensus lists any router with that name as "Named", or if
 | 
	
		
			
				|  |  | -      consensus-method 2 or later is in use and the consensus lists any
 | 
	
		
			
				|  |  | -      router with that name as having the "Unnamed" flag, then the name is
 | 
	
		
			
				|  |  | -      bound.  (It's bound to the ID listed in the entry with the Named,
 | 
	
		
			
				|  |  | -      or to an unknown ID if no name is found.)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   When the user refers to a bound name, the implementation SHOULD provide
 | 
	
		
			
				|  |  | -   only the router with ID bound to that name, and no other router, even
 | 
	
		
			
				|  |  | -   if the router with the right ID can't be found.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   When a user tries to refer to a non-bound name, the implementation SHOULD
 | 
	
		
			
				|  |  | -   warn the user. After warning the user, the implementation MAY use any
 | 
	
		
			
				|  |  | -   router that advertises the name.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Not every router needs a nickname.  When a router doesn't configure a
 | 
	
		
			
				|  |  | -   nickname, it publishes with the default nickname "Unnamed".  Authorities
 | 
	
		
			
				|  |  | -   SHOULD NOT ever mark a router with this nickname as Named; client software
 | 
	
		
			
				|  |  | -   SHOULD NOT ever use a router in response to a user request for a router
 | 
	
		
			
				|  |  | -   called "Unnamed".
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -6.3. Software versions
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   An implementation of Tor SHOULD warn when it has fetched a consensus
 | 
	
		
			
				|  |  | -   network-status, and it is running a software version not listed.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -6.4. Warning about a router's status.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   If a router tries to publish its descriptor to a Naming authority
 | 
	
		
			
				|  |  | -   that has its nickname mapped to another key, the router SHOULD
 | 
	
		
			
				|  |  | -   warn the operator that it is either using the wrong key or is using
 | 
	
		
			
				|  |  | -   an already claimed nickname.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   If a router has fetched a consensus document,, and the
 | 
	
		
			
				|  |  | -   authorities do not publish a binding for the router's nickname, the
 | 
	
		
			
				|  |  | -   router MAY remind the operator that the chosen nickname is not
 | 
	
		
			
				|  |  | -   bound to this key at the authorities, and suggest contacting the
 | 
	
		
			
				|  |  | -   authority operators.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   ...
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -6.5. Router protocol versions
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   A client should believe that a router supports a given feature if that
 | 
	
		
			
				|  |  | -   feature is supported by the router or protocol versions in more than half
 | 
	
		
			
				|  |  | -   of the live networkstatuses' "v" entries for that router.  In other words,
 | 
	
		
			
				|  |  | -   if the "v" entries for some router are:
 | 
	
		
			
				|  |  | -       v Tor 0.0.8pre1                (from authority 1)
 | 
	
		
			
				|  |  | -       v Tor 0.1.2.11                 (from authority 2)
 | 
	
		
			
				|  |  | -       v FutureProtocolDescription 99 (from authority 3)
 | 
	
		
			
				|  |  | -   then the client should believe that the router supports any feature
 | 
	
		
			
				|  |  | -   supported by 0.1.2.11.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   This is currently equivalent to believing the median declared version for
 | 
	
		
			
				|  |  | -   a router in all live networkstatuses.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -7. Standards compliance
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   All clients and servers MUST support HTTP 1.0.  Clients and servers MAY
 | 
	
		
			
				|  |  | -   support later versions of HTTP as well.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -7.1. HTTP headers
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Servers MAY set the Content-Length: header.  Servers SHOULD set
 | 
	
		
			
				|  |  | -  Content-Encoding to "deflate" or "identity".
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Servers MAY include an X-Your-Address-Is: header, whose value is the
 | 
	
		
			
				|  |  | -  apparent IP address of the client connecting to them (as a dotted quad).
 | 
	
		
			
				|  |  | -  For directory connections tunneled over a BEGIN_DIR stream, servers SHOULD
 | 
	
		
			
				|  |  | -  report the IP from which the circuit carrying the BEGIN_DIR stream reached
 | 
	
		
			
				|  |  | -  them.  [Servers before version 0.1.2.5-alpha reported 127.0.0.1 for all
 | 
	
		
			
				|  |  | -  BEGIN_DIR-tunneled connections.]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Servers SHOULD disable caching of multiple network statuses or multiple
 | 
	
		
			
				|  |  | -  router descriptors.  Servers MAY enable caching of single descriptors,
 | 
	
		
			
				|  |  | -  single network statuses, the list of all router descriptors, a v1
 | 
	
		
			
				|  |  | -  directory, or a v1 running routers document.  XXX mention times.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -7.2. HTTP status codes
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Tor delivers the following status codes.  Some were chosen without much
 | 
	
		
			
				|  |  | -  thought; other code SHOULD NOT rely on specific status codes yet.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  200 -- the operation completed successfully
 | 
	
		
			
				|  |  | -      -- the user requested statuses or serverdescs, and none of the ones we
 | 
	
		
			
				|  |  | -         requested were found (0.2.0.4-alpha and earlier).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  304 -- the client specified an if-modified-since time, and none of the
 | 
	
		
			
				|  |  | -         requested resources have changed since that time.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  400 -- the request is malformed, or
 | 
	
		
			
				|  |  | -      -- the URL is for a malformed variation of one of the URLs we support,
 | 
	
		
			
				|  |  | -          or
 | 
	
		
			
				|  |  | -      -- the client tried to post to a non-authority, or
 | 
	
		
			
				|  |  | -      -- the authority rejected a malformed posted document, or
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  404 -- the requested document was not found.
 | 
	
		
			
				|  |  | -      -- the user requested statuses or serverdescs, and none of the ones
 | 
	
		
			
				|  |  | -         requested were found (0.2.0.5-alpha and later).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  503 -- we are declining the request in order to save bandwidth
 | 
	
		
			
				|  |  | -      -- user requested some items that we ordinarily generate or store,
 | 
	
		
			
				|  |  | -         but we do not have any available.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -9. Backward compatibility and migration plans
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Until Tor versions before 0.1.1.x are completely obsolete, directory
 | 
	
		
			
				|  |  | -  authorities should generate, and mirrors should download and cache, v1
 | 
	
		
			
				|  |  | -  directories and running-routers lists, and allow old clients to download
 | 
	
		
			
				|  |  | -  them.  These documents and the rules for retrieving, serving, and caching
 | 
	
		
			
				|  |  | -  them are described in dir-spec-v1.txt.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  Until Tor versions before 0.2.0.x are completely obsolete, directory
 | 
	
		
			
				|  |  | -  authorities should generate, mirrors should download and cache, v2
 | 
	
		
			
				|  |  | -  network-status documents, and allow old clients to download them.
 | 
	
		
			
				|  |  | -  Additionally, all directory servers and caches should download, store, and
 | 
	
		
			
				|  |  | -  serve any router descriptor that is required because of v2 network-status
 | 
	
		
			
				|  |  | -  documents. These documents and the rules for retrieving, serving, and
 | 
	
		
			
				|  |  | -  caching them are described in dir-spec-v1.txt.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -A. Consensus-negotiation timeline.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Period begins: this is the Published time.
 | 
	
		
			
				|  |  | -     Everybody sends votes
 | 
	
		
			
				|  |  | -   Reconciliation: everybody tries to fetch missing votes.
 | 
	
		
			
				|  |  | -     consensus may exist at this point.
 | 
	
		
			
				|  |  | -   End of voting period:
 | 
	
		
			
				|  |  | -     everyone swaps signatures.
 | 
	
		
			
				|  |  | -   Now it's okay for caches to download
 | 
	
		
			
				|  |  | -     Now it's okay for clients to download.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   Valid-after/valid-until switchover
 | 
	
		
			
				|  |  | -
 |