|
@@ -1,200 +0,0 @@
|
|
|
- How to make rendezvous points work
|
|
|
-
|
|
|
-0. Overview
|
|
|
-
|
|
|
- Rendezvous points are an implementation of location-hidden services
|
|
|
- (server anonymity) in the onion routing network. Location-hidden
|
|
|
- services means Bob can offer a tcp service (say, a webserver) via the
|
|
|
- onion routing network, without revealing the IP of that service.
|
|
|
-
|
|
|
- The basic idea is to provide censorship resistance for Bob by allowing
|
|
|
- him to advertise a variety of onion routers as his public location
|
|
|
- (nodes known as his Introduction Points, see Section 1). Alice,
|
|
|
- the client, chooses a node known as a Meeting Point (see Section
|
|
|
- 2). This extra level of indirection is needed so Bob doesn't serve
|
|
|
- files directly from his public locations (so these nodes don't open
|
|
|
- themselves up to abuse, eg from serving Nazi propaganda in France). The
|
|
|
- extra level of indirection also allows Bob to choose which requests
|
|
|
- to respond to, and which to ignore.
|
|
|
-
|
|
|
- We provide the necessary glue code so that Alice can view webpages
|
|
|
- on a location-hidden webserver, and Bob can run a location-hidden
|
|
|
- server, with minimal invasive changes (see Section 3). Both Alice
|
|
|
- and Bob must run local onion proxies (OPs) -- software that knows
|
|
|
- how to talk to the onion routing network.
|
|
|
-
|
|
|
- The big picture follows. We direct the reader to the rest of the
|
|
|
- document for more details and explanation.
|
|
|
-
|
|
|
- 1) Bob chooses some Introduction Points, and advertises them on a
|
|
|
- Distributed Hash Table (DHT).
|
|
|
- 2) Bob establishes onion routing connections to each of his
|
|
|
- Introduction Points, and waits.
|
|
|
- 3) Alice learns about Bob's service out of band (perhaps Bob gave her
|
|
|
- a pointer, or she found it on a website). She looks up the details
|
|
|
- of Bob's service from the DHT.
|
|
|
- 4) Alice chooses and establishes a Meeting Point for this transaction.
|
|
|
- 5) Alice goes to one of Bob's Introduction Points, and gives it a blob
|
|
|
- (encrypted for Bob) which tells him about herself and the Meeting
|
|
|
- Point she chose. The Introduction Point sends the blob to Bob.
|
|
|
- 6) Bob chooses whether to ignore the blob, or to onion route to MP.
|
|
|
- Let's assume the latter.
|
|
|
- 7) MP plugs together Alice and Bob. Note that MP doesn't know (or care)
|
|
|
- who Alice is, or who Bob is; and it can't read anything they
|
|
|
- transmit either, because they share a session key.
|
|
|
- 8) Alice sends a 'begin' cell along the circuit. It makes its way
|
|
|
- to Bob's onion proxy. Bob's onion proxy connects to Bob's webserver.
|
|
|
- 9) Data goes back and forth as usual.
|
|
|
-
|
|
|
-1. Introduction service
|
|
|
-
|
|
|
- Bob wants to learn about client requests for communication, but
|
|
|
- wants to avoid responding unnecessarily to unauthorized clients.
|
|
|
- Bob's proxy opens a circuit, and tells some onion router on that
|
|
|
- circuit to expect incoming connections, and notify Bob of them.
|
|
|
-
|
|
|
- When establishing such an introduction point, Bob provides the onion
|
|
|
- router with a public "introduction" key. The hash of this public
|
|
|
- key identifies a unique Bob, and (since Bob is required to sign his
|
|
|
- messages) prevents anybody else from usurping Bob's introduction
|
|
|
- point in the future. Additionally, Bob can use the same public key
|
|
|
- to establish an introduction point on another onion router (OR),
|
|
|
- and Alice can still be confident that Bob is the same server.
|
|
|
-
|
|
|
- (The set-up-an-introduction-point command should come via a
|
|
|
- RELAY_BIND_INTRODUCTION cell. This cell creates a new stream on the
|
|
|
- circuit from Bob to the introduction point.)
|
|
|
-
|
|
|
- ORs that support introduction run an introduction service on a
|
|
|
- separate port. When Alice wants to notify Bob of a meeting point,
|
|
|
- she connects (directly or via Tor) to the introduction port, and
|
|
|
- sends the following:
|
|
|
-
|
|
|
- MEETING REQUEST
|
|
|
- RSA-OAEP encrypted with server's public key:
|
|
|
-[20 bytes] Hash of Bob's public key (identifies which Bob to notify)
|
|
|
-[ 0 bytes] Initial authentication [optional]
|
|
|
- RSA encrypted with Bob's public key:
|
|
|
-[16 bytes] Symmetric key for encrypting blob past RSA
|
|
|
-[ 6 bytes] Meeting point (IP/port)
|
|
|
-[ 8 bytes] Meeting cookie
|
|
|
-[ 0 bytes] End-to-end authentication [optional]
|
|
|
-[98 bytes] g^x part 1 (inside the RSA)
|
|
|
-[30 bytes] g^x part 2 (symmetrically encrypted)
|
|
|
-
|
|
|
- The meeting point and meeting cookie allow Bob to contact Alice and
|
|
|
- prove his identity; the end-to-end authentication enables Bob to
|
|
|
- decide whether to talk to Alice; the initial authentication enables
|
|
|
- the introduction point to pre-screen introduction requests before
|
|
|
- sending them to Bob. (See Section 2 for a discussion of meeting
|
|
|
- points; see Section 1.1 for an example authentication mechanism.)
|
|
|
-
|
|
|
- The authentication steps are the appropriate places for the
|
|
|
- introduction server or Bob to do replay prevention, if desired.
|
|
|
-
|
|
|
- When the introduction point receives a valid meeting request, it
|
|
|
- sends the portion intended for Bob along the stream
|
|
|
- created by Bob's RELAY_BIND_INTRODUCTION. Bob then, at his
|
|
|
- discretion, connects to Alice's meeting point.
|
|
|
-
|
|
|
-1.1. An example authentication scheme for introduction services
|
|
|
-
|
|
|
- Bob makes two short-term secrets SB and SN, and tells the
|
|
|
- introduction point about SN. Bob gives Alice a cookie consisting
|
|
|
- of A,B,C such that H(A|SB)=B and H(A|SN)=C. Alice's initial
|
|
|
- authentication is <A,C>; Alice's end-to-end authentication is <A,B>.
|
|
|
-
|
|
|
- [Maybe] Bob keeps a replay cache of A values, and doesn't allow any
|
|
|
- value to be used twice. Over time, Bob rotates SB and SN.
|
|
|
-
|
|
|
- [Maybe] Each 'A' has an expiration time built in to it.
|
|
|
-
|
|
|
- In reality, we'll want to pick a scheme that (a) wasn't invented from
|
|
|
- scratch in an evening, and (b) doesn't require Alice to remember this
|
|
|
- many bits (see section 3.2).
|
|
|
-
|
|
|
-2. Meeting points
|
|
|
-
|
|
|
- For Bob to actually reply to Alice, Alice first establishes a
|
|
|
- circuit to an onion router R, and sends a RELAY_BIND_MEETING cell
|
|
|
- to that onion router. The RELAY_BIND_MEETING cell contains a
|
|
|
- 'Meeting cookie' (MC) that Bob can use to authenticate to R. R
|
|
|
- remembers the cookie and associates it with Alice.
|
|
|
-
|
|
|
- Later, Bob also routes to R and sends R a RELAY_JOIN_MEETING cell with
|
|
|
- the meeting cookie MC. After this point, R routes all traffic from
|
|
|
- Bob's circuit or Alice's circuit as if the two circuits were joined:
|
|
|
- any RELAY cells that are not for a recognized topic are passed down
|
|
|
- Alice or Bob's circuit. Bob's first cell to Alice contains g^y.
|
|
|
-
|
|
|
- To prevent R from reading their traffic, Alice and Bob derive two
|
|
|
- end-to-end keys from g^{xy}, and they each treat R as just another
|
|
|
- hop on the circuit. (These keys are used in addition to the series
|
|
|
- of encryption keys already in use on Alice and Bob's circuits.)
|
|
|
-
|
|
|
- Bob's OP accepts RELAY_BEGIN, RELAY_DATA, RELAY_END, and
|
|
|
- RELAY_SENDME cells from Alice. Alice's OP accepts RELAY_DATA,
|
|
|
- RELAY_END, and RELAY_SENDME cells from Bob. All RELAY_BEGIN cells
|
|
|
- to Bob must have target IP and port of zero; Bob's OP will redirect
|
|
|
- them to the actual target IP and port of Bob's server.
|
|
|
-
|
|
|
- Alice and Bob's OPs disallow CREATE or RELAY_EXTEND cells as usual.
|
|
|
-
|
|
|
-3. Application interface
|
|
|
-
|
|
|
-3.1. Application interface: server side
|
|
|
-
|
|
|
- Bob has a service that he wants to offer to the world but keep its
|
|
|
- location hidden. He configures his local OP to know about this
|
|
|
- service, including the following data:
|
|
|
-
|
|
|
- Local IP and port of the service
|
|
|
- Strategy for choosing introduction points
|
|
|
- (for now, just randomly pick among the ORs offering it)
|
|
|
- Strategy for user authentication
|
|
|
- (for now, just accept all users)
|
|
|
- Public (RSA) key (one for each service Bob offers)
|
|
|
-
|
|
|
- Bob chooses a set of N Introduction servers on which to advertise
|
|
|
- his service.
|
|
|
-
|
|
|
- We assume the existence of a robust decentralized efficient lookup
|
|
|
- system (call it "DHT" for distributed hash table -- note that the
|
|
|
- onion routers can run nodes). Bob publishes
|
|
|
- * Bob's Public Key for that service
|
|
|
- * Expiration date ("don't use after")
|
|
|
- * Introduction server 0 ... Introduction server N
|
|
|
- (All signed by Bob's Public Key)
|
|
|
- into DHT, indexed by the hash of Bob's Public Key. Bob should
|
|
|
- periodically republish his introduction information with a new
|
|
|
- expiration date (and possibly with new/different introduction servers
|
|
|
- if he wants), so Alice can trust that DHT is giving her an up-to-date
|
|
|
- version. The Chord CFS paper describes a sample DHT that allows
|
|
|
- authenticated updating.
|
|
|
-
|
|
|
-3.2. Application interface: client side
|
|
|
-
|
|
|
- We require that the client interface remain a SOCKS proxy, and we
|
|
|
- require that Alice shouldn't have to modify her applications. Thus
|
|
|
- we encode all of the necessary information into the hostname (more
|
|
|
- correctly, fqdn) that Alice uses, eg when clicking on a url in her
|
|
|
- browser.
|
|
|
-
|
|
|
- To establish a connection to Bob, Alice needs to know an Introduction
|
|
|
- point, Bob's PK, and some authentication cookie. Because encoding this
|
|
|
- information into the hostname will be too long for a typical hostname,
|
|
|
- we instead use a layer of indirection. We encode a hash of Bob's PK
|
|
|
- (10 bytes is sufficient since we're not worrying about collisions),
|
|
|
- and also the authentication token (empty for now). Location-hidden
|
|
|
- services use the special top level domain called '.onion': thus
|
|
|
- hostnames take the form x.y.onion where x is the hash of PK, and y
|
|
|
- is the authentication cookie. If no cookie is required, the hostname
|
|
|
- can simply be of the form x.onion. Assuming only case insensitive
|
|
|
- alphanumeric and hyphen, we get a bit more than 6 bits encoded
|
|
|
- per character, meaning the x part of the hostname will be about
|
|
|
- 13 characters.
|
|
|
-
|
|
|
- Alice's onion proxy examines hostnames and recognizes when they're
|
|
|
- destined for a hidden server. If so, it decodes the PK and performs
|
|
|
- the steps in Section 0 above.
|
|
|
-
|