Tor specifications: style and usage notes

Audience

The primary intended audiences are:

  • Programmers: implementors of the Tor Protocols. This includes both maintainers of existing implementations, and people writing new implementations.

  • Researchers: people analysing the security of the Tor Protocols, including both academic research and practical security investigation.

  • Expert users who wish to fully understand the operation of their Tor software. This includes users of clients and relays.

  • Directory authority operators, and others with a critical technical role in the integrity of the Tor network.

Scope and intentions

These notes apply to our specifications. When possible, they should also apply to proposals, to make proposals easier to merge into our specifications when they are done.

As of 2023, our existing specifications have been written without any real style guidelines, so you should not expect to find these guidelines to apply well to all of the documents as you read them. Instead, these guidelines are for documentation going forward.

These notes are not terribly well organized. We should improve them over time. They are meant to be a living document.

Other sources

There are a number of other style guides used in Tor. We should follow these as well. If they do not suit our needs, we should try to get them changed.

(Please add more if you know about them!)

As we refine the guidelines in this file, we should attempt to get them upstreamed to more project-wide guides, if they are suitable.

Line breaks

Begin each new thought, sentence, or subclause on its own line. Keep lines short enough to be readable on a terminal (~80 columns), but don't reflow text unnecessarily. This makes diffs easier to review, while still keeping the text fairly readable in its raw form. See semantic linefeeds for history and a more detailed explanation of why this is useful.

Vocabulary

We use these terms freely:

  • Channel
  • Circuit
  • Stream

We try not to say "connection" without qualification: There are too many things in Tor that can be called a "connection".

Similarly, don't say "session" without qualification except when it is clear from context what we mean.

Prefer "relay" to "node" or "server".

Prefer "service" and "client" when talking about onion services and their users.

Refer to arti as arti and the C tor implementation as "the C tor implementation" on first mention. Subsequently you can call it tor or "C tor".

Avoid "AP" and "OP" and "OR"; those are not in current usage.

The functions SHA-1, SHA-256, and SHA3-256 are called "hash functions". A "digest" is the output of a hash function.

Documenting keys

TODO: Explain our new key documentation conventions, as used here.

Documentating data encodings

We have two competing legacy schemes for documenting data encodings. One of them is an ad-hoc format the looks like this:

   * FIELD_1     [4 bytes]
   * FIELD_2     [1 byte]

The other is a somewhat C-like format based on the trunnel format. It looks like this:

struct message {
   u32 field_1;
   u8 field_2;
}

Neither of these is really great. We should find something better.

Writing explanations

When you are writing an explanation in the middle of a bunch of normative text, it is a good idea to put it in quoted text, like this.

We're in the early stages of this spec organization, but we should still be thinking about long term maintainability.

Please think about how to keep links working in the long term. If you are going to add a link to a file, make sure that the file's name is reasonable. Before you rename a file, consider adding a redirect from the file's old name. (See the mdbook documentation for more information about how.)

If you want to link to a specific section within a file, make sure that the section has a defined anchor that makes sense. The syntax to define heading ids in mdbook looks like this:

## Heading with a long title that you want shorter name for { #shortname }

If you need to change a heading, make sure that you keep its id the same as it was before, so that links will still work.

Finally, when you're looking for specific sections (e.g., to fix references that say "See section 5.2.3") you can look for the HTML anchors that our conversion process added. For example, if you want to find dir-spec.txt section 2.1.3, look for the anchor that says <a id="dir-spec.txt-2.1.3"></a>.

Specific Markdown syntax

To manually make an target for a #-prefixed link fragment, prefer <span id="fragment">Text</span>, to <a id=...>Text</a>. This works around mdbook mistakenly styling <a> without href as if it were a clickable link.

(Of course it is often better to make the referenced text a section and use the mdbook explicit anchor syntax.)

You may need to make sure you have some other text on the same line as the <span> to avoid mdbook thinking you were writing a whole paragraph of raw HTML.

Sometimes you may wish to use <div id="..."> and </div> (which must usually be placed as paragraphs of their own).

Example:

<span id="lemons-lemonade">LEMONS
are a sour fruit, sometimes used for making
lemonade</span>

(later)

Various fruit may be found, including [lemons](#lemons-lemonade).

It is OK to use an empty a element: <a id=....></a>. Many existing section anchors are done this way.