V3 onion services: client-and-service side implementation

This is the ticket for tracking our progress implementing the client side of V3 onion service support in arti. We will need at least the following:

  1. Descriptor Encoding
  1. Directory Support
  1. Circuits #688 (closed), #691 (closed)
  • Introduction (ESTABLISH_INTRO, INTRO_ESTABLISHED and INTRODUCE) (est 8h)
  • Rendezvous (ESTABLISH_RENDEZVOUS, RENDEZVOUS, RENDEZVOUS_ESTABLISHED) (est 8h)
  • HSDir (upload and fetch) (est 12h)
  1. Client #690 (closed), #692 (closed), #693 (closed), #694 (closed)
  • Introduction (INTRODUCE, INTRODUCE_ACK) (est 20h)
  • Rendezvous circuit crypto (ntor handshake) (est 30h)
  • Descriptor fetch/cache (est 30h) #689 (closed)
  • HSDir cache (est 30h)
  • Intro point state cache (est 24h) #695 (closed)
  • Client authorization (est 36h) #696 (closed)
  • Rate limiting
    • Introduction attempts per intro point
  1. Service #698 (closed)
  • Ephemeral (ADD/DEL_ONION) #700 (closed)
  • Cryptography (key blinding and derivation) (est 8h more; mostly done)
  • Configuration (est 24h) #699 (closed)
  • Building descriptor (with client auth) (est 36h)
  • Events logic (est 30h) #697 (closed)
    • Establishing intro points
    • Expiring/Rotating intro points
    • Descriptor rotation
  • Responding to an INTRODUCTION (establish rendezvous) (est 16h) #697 (closed)
  • Rate limiting
    • Introduction circuit retries (in C: get_max_intro_circ_per_period()) #723 (closed)
Edited by Nick Mathewson