Annotation of embedaddon/curl/docs/ESNI.md, revision 1.1.1.1

1.1       misho       1: # TLS: ESNI support in curl and libcurl
                      2: 
                      3: ## Summary
                      4: 
                      5: **ESNI** means **Encrypted Server Name Indication**, a TLS 1.3
                      6: extension which is currently the subject of an
                      7: [IETF Draft][tlsesni].
                      8: 
                      9: This file is intended to show the latest current state of ESNI support
                     10: in **curl** and **libcurl**.
                     11: 
                     12: At end of August 2019, an [experimental fork of curl][niallorcurl],
                     13: built using an [experimental fork of OpenSSL][sftcdopenssl], which in
                     14: turn provided an implementation of ESNI, was demonstrated
                     15: interoperating with a server belonging to the [DEfO
                     16: Project][defoproj].
                     17: 
                     18: Further sections here describe
                     19: 
                     20: -   resources needed for building and demonstrating **curl** support
                     21:     for ESNI,
                     22: 
                     23: -   progress to date,
                     24: 
                     25: -   TODO items, and
                     26: 
                     27: -   additional details of specific stages of the progress.
                     28: 
                     29: ## Resources needed
                     30: 
                     31: To build and demonstrate ESNI support in **curl** and/or **libcurl**,
                     32: you will need
                     33: 
                     34: -   a TLS library, supported by **libcurl**, which implements ESNI;
                     35: 
                     36: -   an edition of **curl** and/or **libcurl** which supports the ESNI
                     37:     implementation of the chosen TLS library;
                     38: 
                     39: -   an environment for building and running **curl**, and at least
                     40:     building **OpenSSL**;
                     41: 
                     42: -   a server, supporting ESNI, against which to run a demonstration
                     43:     and perhaps a specific target URL;
                     44: 
                     45: -   some instructions.
                     46: 
                     47: The following set of resources is currently known to be available.
                     48: 
                     49: | Set  | Component    | Location                      | Remarks                                    |
                     50: |:-----|:-------------|:------------------------------|:-------------------------------------------|
                     51: | DEfO | TLS library  | [sftcd/openssl][sftcdopenssl] | Tag *esni-2019-08-30* avoids bleeding edge |
                     52: |      | curl fork    | [niallor/curl][niallorcurl]   | Tag *esni-2019-08-30* likewise             |
                     53: |      | instructions | [ESNI-README][niallorreadme]  |                                            |
                     54: 
                     55: ## Progress
                     56: 
                     57: ### PR 4011 (Jun 2019) expected in curl release 7.67.0 (Oct 2019)
                     58: 
                     59: -   Details [below](#pr4011);
                     60: 
                     61: -   New **curl** feature: `CURL_VERSION_ESNI`;
                     62: 
                     63: -   New configuration option: `--enable-esni`;
                     64: 
                     65: -   Build-time check for availability of resources needed for ESNI
                     66:     support;
                     67: 
                     68: -   Pre-processor symbol `USE_ESNI` for conditional compilation of
                     69:     ESNI support code, subject to configuration option and
                     70:     availability of needed resources.
                     71: 
                     72: ## TODO
                     73: 
                     74: -   (next PR) Add libcurl options to set ESNI parameters.
                     75: 
                     76: -   (next PR) Add curl tool command line options to set ESNI parameters.
                     77: 
                     78: -   (WIP) Extend DoH functions so that published ESNI parameters can be
                     79:     retrieved from DNS instead of being required as options.
                     80: 
                     81: -   (WIP) Work with OpenSSL community to finalize ESNI API.
                     82: 
                     83: -   Track OpenSSL ESNI API in libcurl
                     84: 
                     85: -   Identify and implement any changes needed for CMake.
                     86: 
                     87: -   Optimize build-time checking of available resources.
                     88: 
                     89: -   Encourage ESNI support work on other TLS/SSL backends.
                     90: 
                     91: ## Additional detail
                     92: 
                     93: ### PR 4011
                     94: 
                     95: **TLS: Provide ESNI support framework for curl and libcurl**
                     96: 
                     97: The proposed change provides a framework to facilitate work to
                     98: implement ESNI support in curl and libcurl. It is not intended
                     99: either to provide ESNI functionality or to favour any particular
                    100: TLS-providing backend. Specifically, the change reserves a
                    101: feature bit for ESNI support (symbol `CURL_VERSION_ESNI`),
                    102: implements setting and reporting of this bit, includes dummy
                    103: book-keeping for the symbol, adds a build-time configuration
                    104: option (`--enable-esni`), provides an extensible check for
                    105: resources available to provide ESNI support, and defines a
                    106: compiler pre-processor symbol (`USE_ESNI`) accordingly.
                    107: 
                    108: Proposed-by: @niallor (Niall O'Reilly)\
                    109: Encouraged-by: @sftcd (Stephen Farrell)\
                    110: See-also: [this message](https://curl.haxx.se/mail/lib-2019-05/0108.html)
                    111: 
                    112: Limitations:
                    113: -   Book-keeping (symbols-in-versions) needs real release number, not 'DUMMY'.
                    114: 
                    115: -   Framework is incomplete, as it covers autoconf, but not CMake.
                    116: 
                    117: -   Check for available resources, although extensible, refers only to
                    118:     specific work in progress ([described
                    119:     here](https://github.com/sftcd/openssl/tree/master/esnistuff)) to
                    120:     implement ESNI for OpenSSL, as this is the immediate motivation
                    121:     for the proposed change.
                    122: 
                    123: ## References
                    124: 
                    125: Cloudflare blog: [Encrypting SNI: Fixing One of the Core Internet Bugs][corebug]
                    126: 
                    127: Cloudflare blog: [Encrypt it or lose it: how encrypted SNI works][esniworks]
                    128: 
                    129: IETF Draft: [Encrypted Server Name Indication for TLS 1.3][tlsesni]
                    130: 
                    131: ---
                    132: 
                    133: [tlsesni]:             https://datatracker.ietf.org/doc/draft-ietf-tls-esni/
                    134: [esniworks]:   https://blog.cloudflare.com/encrypted-sni/
                    135: [corebug]:             https://blog.cloudflare.com/esni/
                    136: [defoproj]:            https://defo.ie/
                    137: [sftcdopenssl]: https://github.com/sftcd/openssl/
                    138: [niallorcurl]: https://github.com/niallor/curl/
                    139: [niallorreadme]: https://github.com/niallor/curl/blob/master/ESNI-README.md

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>