| rfc9539xml2.original.xml | rfc9539.xml | |||
|---|---|---|---|---|
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
| <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | ||||
| <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.1 (Ruby 2.6 | ||||
| .10) --> | ||||
| <!DOCTYPE rfc [ | <!DOCTYPE rfc [ | |||
| <!ENTITY nbsp " "> | <!ENTITY nbsp " "> | |||
| <!ENTITY zwsp "​"> | <!ENTITY zwsp "​"> | |||
| <!ENTITY nbhy "‑"> | <!ENTITY nbhy "‑"> | |||
| <!ENTITY wj "⁠"> | <!ENTITY wj "⁠"> | |||
| ]> | ]> | |||
| <rfc ipr="trust200902" docName="draft-ietf-dprive-unilateral-probing-13" categor | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft | |||
| y="exp" submissionType="IETF"> | -ietf-dprive-unilateral-probing-13" number="9539" submissionType="IETF" category | |||
| ="exp" consensus="true" tocInclude="true" symRefs="true" updates="" obsoletes="" | ||||
| xml:lang="en" version="3"> | ||||
| <!-- xml2rfc v2v3 conversion 3.18.2 --> | ||||
| <front> | <front> | |||
| <title abbrev="Unilateral Encrypted Authoritative DNS">Unilateral Opportunis tic Deployment of Encrypted Recursive-to-Authoritative DNS</title> | <title abbrev="Unilateral Encrypted Authoritative DNS">Unilateral Opportunis tic Deployment of Encrypted Recursive-to-Authoritative DNS</title> | |||
| <seriesInfo name="RFC" value="9539"/> | ||||
| <author initials="D. K." surname="Gillmor" fullname="Daniel Kahn Gillmor" ro le="editor"> | <author initials="D. K." surname="Gillmor" fullname="Daniel Kahn Gillmor" ro le="editor"> | |||
| <organization abbrev="ACLU">American Civil Liberties Union</organization> | <organization abbrev="ACLU">American Civil Liberties Union</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street>125 Broad St.</street> | <street>125 Broad St.</street> | |||
| <city>New York, NY</city> | <city>New York</city> | |||
| <code>10004</code> | <region>NY</region> | |||
| <country>USA</country> | <code>10004</code> | |||
| <country>United States of America</country> | ||||
| </postal> | </postal> | |||
| <email>dkg@fifthhorseman.net</email> | <email>dkg@fifthhorseman.net</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author initials="J." surname="Salazar" fullname="Joey Salazar" role="editor "> | <author initials="J." surname="Salazar" fullname="Joey Salazar" role="editor "> | |||
| <organization></organization> | <organization/> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <city>Alajuela</city> | <city>Alajuela</city> | |||
| <code>20201</code> | <code>20201</code> | |||
| <country>CR</country> | <country>Costa Rica</country> | |||
| </postal> | </postal> | |||
| <email>joeygsal@gmail.com</email> | <email>joeygsal@gmail.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author initials="P." surname="Hoffman" fullname="Paul Hoffman" role="editor "> | <author initials="P." surname="Hoffman" fullname="Paul Hoffman" role="editor "> | |||
| <organization>ICANN</organization> | <organization>ICANN</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <country>USA</country> | <country>United States of America</country> | |||
| </postal> | </postal> | |||
| <email>paul.hoffman@icann.org</email> | <email>paul.hoffman@icann.org</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date year="2024" month="February"/> | ||||
| <date year="2023" month="October" day="23"/> | ||||
| <area>int</area> | <area>int</area> | |||
| <workgroup>dprive</workgroup> | <workgroup>dprive</workgroup> | |||
| <keyword>Internet-Draft</keyword> | ||||
| <abstract> | <keyword>DNS over TLS</keyword> | |||
| <keyword>DNS over QUIC</keyword> | ||||
| <keyword>DoT</keyword> | ||||
| <keyword>DoQ</keyword> | ||||
| <keyword>encryption</keyword> | ||||
| <keyword>unilateral</keyword> | ||||
| <keyword>recursive</keyword> | ||||
| <keyword>authoritative</keyword> | ||||
| <keyword>DNS</keyword> | ||||
| <?line 51?> | <abstract> | |||
| <t>This document sets out steps that DNS servers (recursive resolvers and author itative servers) can take unilaterally (without any coordination with other peer s) to defend DNS query privacy against a passive network monitor. | <t>This document sets out steps that DNS servers (recursive resolvers and author itative servers) can take unilaterally (without any coordination with other peer s) to defend DNS query privacy against a passive network monitor. | |||
| The steps in this document can be defeated by an active attacker, but should be | The protections provided by the guidance in this document can be defeated by an | |||
| simpler and less risky to deploy than more powerful defenses.</t> | active attacker, but they should be simpler and less risky to deploy than more p | |||
| owerful defenses.</t> | ||||
| <t>The goal of this document is to simplify and speed deployment of opportunisti | <t>The goal of this document is to simplify and speed up deployment of opp | |||
| c encrypted transport in the recursive-to-authoritative hop of the DNS ecosystem | ortunistic encrypted transport in the recursive-to-authoritative hop of the DNS | |||
| . | ecosystem. | |||
| Wider easy deployment of the underlying encrypted transport on an opportunistic | Wider easy deployment of the underlying encrypted transport on an opportunistic | |||
| basis may facilitate the future specification of stronger cryptographic protecti | basis may facilitate the future specification of stronger cryptographic protecti | |||
| ons against more powerful attacks.</t> | ons against more-powerful attacks.</t> | |||
| </abstract> | </abstract> | |||
| <note title="About This Document" removeInRFC="true"> | ||||
| <t> | ||||
| The latest revision of this draft can be found at <eref target="https:// | ||||
| dkg.gitlab.io/dprive-unilateral-probing/"/>. | ||||
| Status information for this document may be found at <eref target="https | ||||
| ://datatracker.ietf.org/doc/draft-ietf-dprive-unilateral-probing/"/>. | ||||
| </t> | ||||
| <t> | ||||
| Discussion of this document takes place on the | ||||
| DPRIVE Working Group mailing list (<eref target="mailto:dns-privacy@ietf | ||||
| .org"/>), | ||||
| which is archived at <eref target="https://mailarchive.ietf.org/arch/bro | ||||
| wse/dns-privacy/"/>. | ||||
| Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/dns-pri | ||||
| vacy/"/>. | ||||
| </t> | ||||
| <t>Source for this draft and an issue tracker can be found at | ||||
| <eref target="https://gitlab.com/dkg/dprive-unilateral-probing"/>.</t> | ||||
| </note> | ||||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <?line 59?> | <section anchor="introduction"> | |||
| <name>Introduction</name> | ||||
| <section anchor="introduction"><name>Introduction</name> | <t>This document aims to provide guidance to DNS implementers and operator | |||
| s who want to simply enable protection against passive network observers.</t> | ||||
| <t>This document aims to provide guidance to DNS implementers and operators who | <t>In particular, it focuses on mechanisms that can be adopted | |||
| want to simply enable protection against passive network observers.</t> | unilaterally by recursive resolvers and authoritative servers, without | |||
| any explicit coordination with the other parties. This guidance | ||||
| <t>In particular, it focuses on mechanisms that can be adopted unilaterally by r | provides opportunistic security (see <xref target="RFC7435"/>), that is, | |||
| ecursive resolvers and authoritative servers, without any explicit coordination | encrypting things that would otherwise be in the clear, without | |||
| with the other parties. | interfering with or weakening stronger forms of security.</t> | |||
| This guidance provides opportunistic security (see <xref target="RFC7435"/>) -- | <t>This document also briefly introduces (but does not try to specify) how | |||
| encrypting things that would otherwise be in the clear, without interfering with | a future protocol might permit defense against an active attacker in <xref targ | |||
| or weakening stronger forms of security.</t> | et="adding-auth"/>.</t> | |||
| <t>The protocol described here offers three concrete advantages to the DNS | ||||
| <t>The document also briefly introduces (but does not try to specify) how a futu | ecosystem:</t> | |||
| re protocol might permit defense against an active attacker in <xref target="add | <ul spacing="normal"> | |||
| ing-auth"/>.</t> | <li> | |||
| <t>Protection from passive attackers of DNS queries in transit between | ||||
| <t>The protocol described here offers three concrete advantages to the DNS ecosy | recursive and authoritative servers.</t> | |||
| stem:</t> | </li> | |||
| <li> | ||||
| <t><list style="symbols"> | <t>A road map for gaining real-world experience at scale with encrypte | |||
| <t>Protection from passive attackers of DNS queries in transit between recursi | d protections of this traffic.</t> | |||
| ve and authoritative servers.</t> | </li> | |||
| <t>A roadmap for gaining real-world experience at scale with encrypted protect | <li> | |||
| ions of this traffic.</t> | <t>A bridge to some possible future protection against a more powerful | |||
| <t>A bridge to some possible future protection against a more powerful attacke | attacker.</t> | |||
| r.</t> | </li> | |||
| </list></t> | </ul> | |||
| <section anchor="requirements-language"> | ||||
| <section anchor="requirements-language"><name>Requirements Language</name> | <name>Requirements Language</name> | |||
| <t> | ||||
| <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUI | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | |||
| RED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
| NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECO | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
| MMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
| "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be i | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | |||
| nterpreted as | be interpreted as | |||
| described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and | described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | |||
| only when, they | when, and only when, they appear in all capitals, as shown here. | |||
| appear in all capitals, as shown here.</t> | </t> | |||
| <?line -18?> | ||||
| </section> | ||||
| <section anchor="terminology"><name>Terminology</name> | ||||
| <dl> | ||||
| <dt>Unilateral:</dt> | ||||
| <dd> | ||||
| <t>capable of opportunistic probing without external coordination with any o | ||||
| f the other parties</t> | ||||
| </dd> | ||||
| <dt>Do53:</dt> | ||||
| <dd> | ||||
| <t>traditional cleartext DNS over port 53 (<xref target="RFC1035"/>)</t> | ||||
| </dd> | ||||
| <dt>DoQ:</dt> | ||||
| <dd> | ||||
| <t>DNS-over-QUIC (<xref target="RFC9250"/>)</t> | ||||
| </dd> | ||||
| <dt>DoT:</dt> | ||||
| <dd> | ||||
| <t>DNS-over-TLS (<xref target="RFC7858"/>)</t> | ||||
| </dd> | ||||
| <dt>Encrypted transports:</dt> | ||||
| <dd> | ||||
| <t>DoQ and DoT collectively</t> | ||||
| </dd> | ||||
| </dl> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="priorities"><name>Priorities</name> | ||||
| <t>This document aims to mitigate potential impacts of the described protocol an d to aid implementors in selecting between possible DNS protocol choices.</t> | </section> | |||
| <section anchor="minimizing-negative-impacts"><name>Minimizing Negative Impacts< | <section anchor="terminology"> | |||
| /name> | <name>Terminology</name> | |||
| <dl> | ||||
| <dt>Unilateral:</dt> | ||||
| <dd> | ||||
| <t>Capable of opportunistic probing without external coordination wi | ||||
| th any of the other parties.</t> | ||||
| </dd> | ||||
| <dt>Do53:</dt> | ||||
| <dd> | ||||
| <t>DNS over port 53 (<xref target="RFC1035"/>) for traditional clear | ||||
| text transport.</t> | ||||
| </dd> | ||||
| <dt>DoQ:</dt> | ||||
| <dd> | ||||
| <t>DNS over QUIC (<xref target="RFC9250"/>).</t> | ||||
| </dd> | ||||
| <dt>DoT:</dt> | ||||
| <dd> | ||||
| <t>DNS over TLS (<xref target="RFC7858"/>).</t> | ||||
| </dd> | ||||
| <dt>Encrypted transports:</dt> | ||||
| <dd> | ||||
| <t>DoQ and DoT, collectively.</t> | ||||
| </dd> | ||||
| </dl> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="priorities"> | ||||
| <t>The protocol described in this document aims to minimize potentially negative | <name>Priorities</name> | |||
| impacts caused by the probing of encrypted transports for the systems that adop | <t>The protocol described in this document was developed with two prioriti | |||
| t these guidelines, for the parties that they communicate with, and for uninvolv | es: minimizing negative impacts and retaining flexibility in the underlying encr | |||
| ed third parties. | ypted transport protocol.</t> | |||
| <section anchor="minimizing-negative-impacts"> | ||||
| <name>Minimizing Negative Impacts</name> | ||||
| <t>The protocol described in this document aims to minimize potentially | ||||
| negative impacts caused by the probing of encrypted transports for the systems t | ||||
| hat adopt the protocol, for the parties that those systems communicate with, and | ||||
| for uninvolved third parties. | ||||
| The negative impacts that this protocol specifically tries to minimize are:</t> | The negative impacts that this protocol specifically tries to minimize are:</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li> | |||
| <t>excessive bandwidth use</t> | <t>excessive bandwidth use,</t> | |||
| <t>excessive use of computational resources (CPU and memory in particular)</t> | </li> | |||
| <t>the potential for amplification attacks (where DNS resolution infrastructur | <li> | |||
| e is wielded as part of a DoS attack)</t> | <t>excessive use of computational resources (CPU and memory in parti | |||
| </list></t> | cular), and</t> | |||
| </li> | ||||
| </section> | <li> | |||
| <section anchor="protocol-choices"><name>Protocol Choices</name> | <t>the potential for amplification attacks (where DNS resolution inf | |||
| rastructure is wielded as part of a DoS attack).</t> | ||||
| <t>Although this document focuses specifically on strategies used by DNS servers | </li> | |||
| , it does not go into detail on the specific protocols used because those protoc | </ul> | |||
| ols, in particular DoT and DoQ, are described in other documents. | </section> | |||
| <section anchor="protocol-choices"> | ||||
| <name>Protocol Choices</name> | ||||
| <t>Although this document focuses specifically on strategies used by DNS | ||||
| servers, it does not go into detail on the specific protocols used because thos | ||||
| e protocols, in particular DoT and DoQ, are described in other documents. | ||||
| The DoT specification (<xref target="RFC7858"/>) says that it:</t> | The DoT specification (<xref target="RFC7858"/>) says that it:</t> | |||
| <ul empty="true"><li> | <blockquote>...focuses on securing stub-to-recursive traffic, as per the | |||
| <t>focuses on securing stub-to-recursive traffic, as per the charter of the DP | charter of the DPRIVE Working Group. It does not prevent future | |||
| RIVE Working Group. It does not prevent future applications of the protocol to | applications of the protocol to recursive-to-authoritative | |||
| recursive-to-authoritative traffic.</t> | traffic.</blockquote> | |||
| </li></ul> | ||||
| <t>It further says:</t> | ||||
| <ul empty="true"><li> | <t>It further says:</t> | |||
| <t>It might work equally between recursive clients and authoritative servers.< | ||||
| /t> | ||||
| </li></ul> | ||||
| <t>The DoQ specification (<xref target="RFC9250"/>) says:</t> | <blockquote>It might work equally between recursive clients and | |||
| authoritative servers...</blockquote> | ||||
| <ul empty="true"><li> | <t>The DoQ specification (<xref target="RFC9250"/>) says:</t> | |||
| <t>For the recursive to authoritative scenario, authentication requirements ar | ||||
| e unspecified at the time of writing and are the subject of ongoing work in the | ||||
| DPRIVE WG.</t> | ||||
| </li></ul> | ||||
| <t>The protocol described in this document specifies the use of DoT and DoQ with | <blockquote>For the recursive to authoritative scenario, | |||
| out authentication of the server.</t> | authentication requirements are unspecified at the time of writing and | |||
| are the subject of ongoing work in the DPRIVE WG.</blockquote> | ||||
| <t>This document does not pursue the use of DNS-over-HTTPS, commonly called DoH | <t>The protocol described in this document specifies the use of DoT and | |||
| (<xref target="RFC8484"/>), in this context because a DoH client needs to know t | DoQ without authentication of the server.</t> | |||
| he path part of a DoH endpoint URL, and there are currently no mechanisms for a | <t>This document does not pursue the use of DNS over HTTPS, commonly cal | |||
| DNS recursive resolver to predict the path on its own, in an opportunistic or un | led "DoH" (<xref target="RFC8484"/>), in this context because a DoH client needs | |||
| ilateral fashion, without incurring an excessive use of resources. | to know the path part of a DoH endpoint URL. Currently, there are no mechanisms | |||
| for a DNS recursive resolver to predict the path on its own, in an opportunisti | ||||
| c or unilateral fashion, without incurring an excessive use of resources. | ||||
| If such mechanisms are later defined, the protocol in this document can be updat ed to accommodate them.</t> | If such mechanisms are later defined, the protocol in this document can be updat ed to accommodate them.</t> | |||
| </section> | ||||
| </section> | ||||
| <section anchor="authoritative-guidance"> | ||||
| <name>Guidance for Authoritative Servers</name> | ||||
| <t>The protocol described in this document is <bcp14>OPTIONAL</bcp14> for | ||||
| authoritative servers. | ||||
| An authoritative server choosing to implement the protocol described in this doc | ||||
| ument <bcp14>MUST</bcp14> implement at least one of either | ||||
| DoT or DoQ on port 853.</t> | ||||
| <t>An authoritative server choosing to implement the protocol described in | ||||
| this document <bcp14>MAY</bcp14> require clients to use Application-Layer Proto | ||||
| col Negotiation (ALPN) (see <xref target="RFC7301"/>). | ||||
| The ALPN strings the client will use are given in <xref target="recursive- | ||||
| requirements"/>.</t> | ||||
| </section> | <t>An authoritative server implementing DoT or DoQ <bcp14>MUST</bcp14> pop | |||
| </section> | ulate the response from the same authoritative zone data as the unencrypted DNS | |||
| <section anchor="authoritative-guidance"><name>Guidance for Authoritative Server | transports. | |||
| s</name> | Encrypted transports have their own characteristic response size that might be d | |||
| ifferent from the unencrypted DNS transports, so response sizes and related opti | ||||
| <t>The protocol described in this document is <bcp14>OPTIONAL</bcp14> for author | ons (e.g., Extension Mechanisms for DNS (EDNS0)) and flags (e.g., the TrunCation | |||
| itative servers. | (TC) bit) might vary based on the transport. | |||
| An authoritative server choosing to implement the protocol described in this doc | ||||
| ument <bcp14>MUST</bcp14> implement at least one | ||||
| of DoT or DoQ on port 853.</t> | ||||
| <t>An authoritative server choosing to implement the protocol described in this | ||||
| document <bcp14>MAY</bcp14> require clients to use ALPN (Application-Layer Proto | ||||
| col Negotiation, <xref target="RFC7301"/>). | ||||
| The ALPN strings the client will use are given in <xref target="recursive-requir | ||||
| ements"/>.</t> | ||||
| <t>An authoritative server implementing DoT or DoQ <bcp14>MUST</bcp14> populate | ||||
| the response from the same authoritative zone data as the unencryped DNS transpo | ||||
| rts. | ||||
| Encrypted transports have their own characteristic response size that might be d | ||||
| ifferent from the unencrypted DNS transports, so response sizes and related opti | ||||
| ons (e.g., EDNS0) and flags (e.g., TC bit) might vary based on the transport. | ||||
| In other words, the content of the responses to a particular query <bcp14>MUST</ bcp14> be the same regardless of the type of transport.</t> | In other words, the content of the responses to a particular query <bcp14>MUST</ bcp14> be the same regardless of the type of transport.</t> | |||
| <section anchor="authoritative-pools"> | ||||
| <section anchor="authoritative-pools"><name>Pooled Authoritative Servers Behind | <name>Pooled Authoritative Servers behind a Load Balancer</name> | |||
| a Load Balancer</name> | <t>Some authoritative DNS servers are structured as a pool of authoritat | |||
| ives standing behind a load balancer that runs on a single IP address, forwardin | ||||
| <t>Some authoritative DNS servers are structured as a pool of authoritatives sta | g queries to members of the pool. | |||
| nding behind a load-balancer that runs on a single IP address, forwarding querie | ||||
| s to members of the pool. | ||||
| In such a deployment, individual members of the pool typically get updated indep endently from each other.</t> | In such a deployment, individual members of the pool typically get updated indep endently from each other.</t> | |||
| <t>A recursive resolver following the guidance in <xref target="recursiv | ||||
| <t>A recursive resolver following the guidance in <xref target="recursive-guidan | e-guidance"/> and interacting with such a pool likely does not know that it is a | |||
| ce"/> and interacting with such a pool likely does not know that it is a pool. | pool. | |||
| If some members of the pool follow the protocol specified in this document while others do not, the recursive client might see the pool as a single authoritativ e server that sometimes offers and sometimes refuses encrypted transport.</t> | If some members of the pool follow the protocol specified in this document while others do not, the recursive client might see the pool as a single authoritativ e server that sometimes offers and sometimes refuses encrypted transport.</t> | |||
| <t>To avoid incurring additional minor timeouts for such a recursive res | ||||
| <t>To avoid incurring additional minor timeouts for such a recursive resolver, t | olver, the pool operator <bcp14>SHOULD</bcp14>:</t> | |||
| he pool operator <bcp14>SHOULD</bcp14>:</t> | <ul spacing="normal"> | |||
| <li> | ||||
| <t><list style="symbols"> | <t>ensure that all members of the pool enable the same encrypted tra | |||
| <t>ensure that all members of the pool enable the same encrypted transport(s) | nsport(s) within the span of a few seconds (such as within 30 seconds), or</t> | |||
| within the span of a few seconds (such as within 30 seconds), or</t> | </li> | |||
| <t>ensure that the load balancer maps client requests to pool members based on | <li> | |||
| client IP addresses, or</t> | <t>ensure that the load balancer maps client requests to pool member | |||
| <t>use a load-balancer that forwards queries/connections on encrypted transpor | s based on client IP addresses, or</t> | |||
| ts to only those members of the pool known (e.g., via monitoring) to support the | </li> | |||
| given encrypted transport.</t> | <li> | |||
| </list></t> | <t>use a load balancer that forwards queries/connections on encrypte | |||
| d transports to only those members of the pool known (e.g., via monitoring) to s | ||||
| <t>Similar concerns apply to authoritative servers responding from an anycast IP | upport the given encrypted transport.</t> | |||
| address. | </li> | |||
| </ul> | ||||
| <t>Similar concerns apply to authoritative servers responding from an an | ||||
| ycast IP address. | ||||
| As long as the pool of servers is in a heterogeneous state, any flapping route t hat switches a given client IP address to a different responder risks incurring an additional timeout. | As long as the pool of servers is in a heterogeneous state, any flapping route t hat switches a given client IP address to a different responder risks incurring an additional timeout. | |||
| Frequent changes of routing for anycast listening IP addresses are also likely t o cause problems for TLS, TCP, or QUIC connection state as well, so stable route s are important to ensure that the service remains available and responsive. | Frequent changes of routing for anycast listening IP addresses are also likely t o cause problems for TLS, TCP, or QUIC connection state as well, so stable route s are important to ensure that the service remains available and responsive. | |||
| The servers in a pool can share session information to increase the likelihood o f successful resumptions.</t> | The servers in a pool can share session information to increase the likelihood o f successful resumptions.</t> | |||
| </section> | ||||
| </section> | <section anchor="authentication"> | |||
| <section anchor="authentication"><name>Authentication</name> | <name>Authentication</name> | |||
| <t>For unilateral deployment, an authoritative server does not need to o | ||||
| <t>For unilateral deployment, an authoritative server does not need to offer any | ffer any particular form of authentication.</t> | |||
| particular form of authentication.</t> | <t>One simple deployment approach would just be to provide a self-issued | |||
| , regularly updated X.509 certificate. | ||||
| <t>One simple deployment approach would just be to provide a self-issued, regula | ||||
| rly-updated X.509 certificate. | ||||
| Whether the certificates used are short-lived or long-lived is up to the deploym ent. | Whether the certificates used are short-lived or long-lived is up to the deploym ent. | |||
| This mechanism is supported by many TLS and QUIC clients, and will be acceptable for any opportunistic connection. | This mechanism is supported by many TLS and QUIC clients and will be acceptable for any opportunistic connection. | |||
| The server could provide a normal PKI-based certificate, but there is no advanta ge to doing so at this time.</t> | The server could provide a normal PKI-based certificate, but there is no advanta ge to doing so at this time.</t> | |||
| </section> | ||||
| </section> | <section anchor="authoritative-sni"> | |||
| <section anchor="authoritative-sni"><name>Server Name Indication</name> | <name>Server Name Indication</name> | |||
| <t>An authoritative DNS server that wants to handle unilateral queries < | ||||
| <t>An authoritative DNS server that wants to handle unilateral queries <bcp14>MA | bcp14>MAY</bcp14> rely on Server Name Indication (SNI) to select alternate serve | |||
| Y</bcp14> rely on Server Name Indication (SNI) to select alternate server creden | r credentials. | |||
| tials. | However, such a server <bcp14>MUST NOT</bcp14> serve resource records that diffe | |||
| However, such a server <bcp14>MUST NOT</bcp14> serve resource records that diffe | r based on SNI (or on the lack of an SNI) provided by the client because a probi | |||
| r based on SNI (or on the lack of SNI) provided by the client, because a probing | ng recursive resolver that offers SNI might or might not have used the right ser | |||
| recursive resolver that offers SNI might or might not have used the right serve | ver name to get the records it is looking for.</t> | |||
| r name to get the records it is looking for.</t> | </section> | |||
| <section anchor="authoritative-resource-exhaustion"> | ||||
| </section> | <name>Resource Exhaustion</name> | |||
| <section anchor="authoritative-resource-exhaustion"><name>Resource Exhaustion</n | <t>A well-behaved recursive resolver may keep an encrypted connection op | |||
| ame> | en to an authoritative server to amortize the costs of connection setup for both | |||
| parties.</t> | ||||
| <t>A well-behaved recursive resolver may keep an encrypted connection open to an | <t>However, some authoritative servers may have insufficient resources a | |||
| authoritative server, to amortize the costs of connection setup for both partie | vailable to keep many connections open concurrently.</t> | |||
| s.</t> | <t>To keep resources under control, authoritative servers should proacti | |||
| vely manage their encrypted connections. | ||||
| <t>However, some authoritative servers may have insufficient resources available | <xref section="5.5" sectionFormat="of" target="RFC9250"/> offers useful guidance | |||
| to keep many connections open concurrently.</t> | for servers managing DoQ connections. | |||
| <t>To keep resources under control, authoritative servers should proactively man | ||||
| age their encrypted connections. | ||||
| <xref section="5.5" sectionFormat="of" target="RFC9250"/> ("Connection Handling" | ||||
| ) offers useful guidance for servers managing DoQ connections. | ||||
| <xref section="3.4" sectionFormat="of" target="RFC7858"/> offers useful guidance for servers managing DoT connections.</t> | <xref section="3.4" sectionFormat="of" target="RFC7858"/> offers useful guidance for servers managing DoT connections.</t> | |||
| <t>An authoritative server facing unforeseen resource exhaustion <bcp14> | ||||
| <t>An authoritative server facing unforeseen resource exhaustion <bcp14>SHOULD</ | SHOULD</bcp14> cleanly close open connections from recursive resolvers based on | |||
| bcp14> cleanly close open connections from recursive resolvers based on the auth | the authoritative server's preferred prioritization.</t> | |||
| oritative's preferred prioritization.</t> | <t>In the case of unanticipated resource exhaustion, close connections u | |||
| ntil resources are back in control. | ||||
| <t>In the case of unanticipated resource exhaustion, close connections until res | ||||
| ources are back in control. | ||||
| A reasonable prioritization scheme would be to close connections with no outstan ding queries, ordered by idle time (longest idle time gets closed first), then c lose connections with outstanding queries, ordered by age of outstanding query ( oldest outstanding query gets closed first).</t> | A reasonable prioritization scheme would be to close connections with no outstan ding queries, ordered by idle time (longest idle time gets closed first), then c lose connections with outstanding queries, ordered by age of outstanding query ( oldest outstanding query gets closed first).</t> | |||
| <t>When resources are especially tight, the authoritative server may als | ||||
| <t>When resources are especially tight, the authoritative server may also declin | o decline to accept new connections over encrypted transport.</t> | |||
| e to accept new connections over encrypted transport.</t> | </section> | |||
| <section anchor="pad-responses-to-mitigate-traffic-analysis"> | ||||
| </section> | <name>Pad Responses to Mitigate Traffic Analysis</name> | |||
| <section anchor="pad-responses-to-mitigate-traffic-analysis"><name>Pad Responses | <t>To increase the anonymity set for each response, the authoritative se | |||
| to Mitigate Traffic Analysis</name> | rver <bcp14>SHOULD</bcp14> use a sensible padding mechanism for all responses it | |||
| sends when possible. | ||||
| <t>To increase the anonymity set for each response, the authoritative server <bc | The ability for the authoritative server to add padding might be limited, such a | |||
| p14>SHOULD</bcp14> use a sensible padding mechanism for all responses it sends w | s by not receiving an EDNS0 option in the query. | |||
| hen possible. | Specifically, a DoT server <bcp14>SHOULD</bcp14> use EDNS0 padding <xref target= | |||
| The ability for the authoritative server to add padding might be limited, such a | "RFC7830"/> if possible, and a DoQ server <bcp14>SHOULD</bcp14> follow the guida | |||
| s by not receiving an EDNS(0) option in the query. | nce in <xref section="5.4" sectionFormat="of" target="RFC9250"/>. | |||
| Specifically, a DoT server <bcp14>SHOULD</bcp14> use EDNS(0) padding <xref targe | ||||
| t="RFC7830"/> if possible, and a DoQ server <bcp14>SHOULD</bcp14> follow the gui | ||||
| dance in <xref section="5.4" sectionFormat="of" target="RFC9250"/>. | ||||
| How much to pad is out of scope of this document, but a reasonable suggestion ca n be found in <xref target="RFC8467"/>.</t> | How much to pad is out of scope of this document, but a reasonable suggestion ca n be found in <xref target="RFC8467"/>.</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | <section anchor="recursive-guidance"> | |||
| <section anchor="recursive-guidance"><name>Guidance for Recursive Resolvers</nam | <name>Guidance for Recursive Resolvers</name> | |||
| e> | <t>The protocol described in this document is <bcp14>OPTIONAL</bcp14> for | |||
| recursive resolvers. | ||||
| <t>The protocol described in this document is <bcp14>OPTIONAL</bcp14> for recurs | ||||
| ive resolvers. | ||||
| This section outlines a probing policy suitable for unilateral adoption by any r ecursive resolver. | This section outlines a probing policy suitable for unilateral adoption by any r ecursive resolver. | |||
| Following this policy should not result in failed resolutions or significant del ays.</t> | Following this policy should not result in failed resolutions or significant del ays.</t> | |||
| <section anchor="high-level-overview"> | ||||
| <name>High-Level Overview</name> | ||||
| <section anchor="high-level-overview"><name>High-level Overview</name> | <t>In addition to querying on Do53, the recursive resolver will try DoT, | |||
| DoQ, or both concurrently. | ||||
| <t>In addition to querying on Do53, the recursive resolver will try either or bo | ||||
| th of DoT and DoQ concurrently. | ||||
| The recursive resolver remembers what opportunistic encrypted transport protocol s have worked recently based on a (clientIP, serverIP, protocol) tuple.</t> | The recursive resolver remembers what opportunistic encrypted transport protocol s have worked recently based on a (clientIP, serverIP, protocol) tuple.</t> | |||
| <t>If a query needs to go to a given authoritative server, and the recur | ||||
| <t>If a query needs to go to a given authoritative server, and the recursive res | sive resolver remembers a recent successful encrypted transport to that server, | |||
| olver remembers a recent successful encrypted transport to that server, then it | then it doesn't send the query over Do53 at all. | |||
| doesn't send the query over Do53 at all. | ||||
| Rather, it only sends the query using the encrypted transport protocol that was recently shown to be good.</t> | Rather, it only sends the query using the encrypted transport protocol that was recently shown to be good.</t> | |||
| <t>If the encrypted transport protocol fails, the recursive resolver falls back to Do53 for that serverIP. | <t>If the encrypted transport protocol fails, the recursive resolver falls back to Do53 for that serverIP. | |||
| When any encrypted transport fails, the recursive resolver remembers that failur e for a reasonable amount of time to avoid flooding a non-compatible server with requests that it cannot accept. | When any encrypted transport fails, the recursive resolver remembers that failur e for a reasonable amount of time to avoid flooding an incompatible server with requests that it cannot accept. | |||
| The description of how an encrypted transport protocol fails is in <xref target= "establish-encrypted"/> and the sections following that.</t> | The description of how an encrypted transport protocol fails is in <xref target= "establish-encrypted"/> and the sections following that.</t> | |||
| <t>See the subsections below for a more detailed description of this pro | ||||
| <t>See the subsections below for a more detailed description of this protocol.</ | tocol.</t> | |||
| t> | </section> | |||
| <section anchor="maintaining-authoritative-state-by-ip-address"> | ||||
| </section> | <name>Maintaining Authoritative State by IP Address</name> | |||
| <section anchor="maintaining-authoritative-state-by-ip-address"><name>Maintainin | <t>In designing a probing strategy, the recursive resolver could record | |||
| g Authoritative State by IP Address</name> | its knowledge about any given authoritative server with different strategies, in | |||
| cluding at least:</t> | ||||
| <t>In designing a probing strategy, the recursive resolver could record its know | <ul spacing="normal"> | |||
| ledge about any given authoritative server with different strategies, including | <li> | |||
| at least:</t> | <t>the authoritative server's IP address,</t> | |||
| </li> | ||||
| <t><list style="symbols"> | <li> | |||
| <t>the authoritative server's IP address,</t> | <t>the authoritative server's name (the NS record used), or</t> | |||
| <t>the authoritative server's name (the NS record used), or</t> | </li> | |||
| <t>the zone that contains the record being looked up.</t> | <li> | |||
| </list></t> | <t>the zone that contains the record being looked up.</t> | |||
| </li> | ||||
| <t>This document encourages the first strategy, to minimize timeouts or accident | </ul> | |||
| al delays, | <t>This document encourages the first strategy, to minimize timeouts or | |||
| accidental delays, | ||||
| and does not describe the other two strategies.</t> | and does not describe the other two strategies.</t> | |||
| <t>A timeout (accidental delay) is most likely to happen when the recurs | ||||
| <t>A timeout (accidental delay) is most likely to happen when the recursive clie | ive client believes that the authoritative server offers encrypted transport, bu | |||
| nt believes that the authoritative server offers encrypted transport, but the ac | t the actual server reached declines encrypted transport (or worse, filters the | |||
| tual server reached declines encrypted transport (or worse, filters the incoming | incoming traffic and does not even respond with an ICMP destination port unreach | |||
| traffic and does not even respond with an ICMP destination port unreachable mes | able message, such as during rate limiting).</t> | |||
| sage, such as during rate limiting).</t> | <t>By associating the state with the authoritative IP address, the clien | |||
| t can minimize the number of accidental delays introduced (see also Sections <xr | ||||
| <t>By associating the state with the authoritative IP address, the client can mi | ef target="authoritative-pools" format="counter"/> and <xref target="conn-state" | |||
| nimize the number of accidental delays introduced (see also <xref target="author | format="counter"/>).</t> | |||
| itative-pools"/> and <xref target="conn-state"/>).</t> | <t>For example, consider an authoritative server named <tt>ns0.example.c | |||
| om</tt> that is served by two installations: one at <tt>2001:db8::7</tt> that fo | ||||
| <t>For example, consider an authoritative server named <spanx style="verb">ns0.e | llows this guidance and one at <tt>2001:db8::8</tt> that is a legacy (cleartext | |||
| xample.com</spanx> that is served by two installations, one at <spanx style="ver | port 53-only) deployment. | |||
| b">2001:db8::7</spanx> that follows this guidance, and one at <spanx style="verb | A recursive client who associates state with the NS name and reaches <tt>2001:db | |||
| ">2001:db8::8</spanx> that is a legacy (cleartext port 53-only) deployment. | 8::7</tt> first will "learn" that <tt>ns0.example.com</tt> supports encrypted tr | |||
| A recursive client who associates state with the <spanx style="verb">NS</spanx> | ansport. | |||
| name and reaches <spanx style="verb">2001:db8::7</spanx> first will "learn" that | A subsequent query over encrypted transport dispatched to <tt>2001:db8::8</tt> w | |||
| <spanx style="verb">ns0.example.com</spanx> supports encrypted transport. | ould fail, potentially delaying the response.</t> | |||
| A subsequent query over encrypted transport dispatched to <spanx style="verb">20 | </section> | |||
| 01:db8::8</spanx> would fail, potentially delaying the response.</t> | <section anchor="overall-recursive-resolver-settings"> | |||
| <name>Overall Recursive Resolver Settings</name> | ||||
| </section> | <t>A recursive resolver implementing the protocol in this document needs | |||
| <section anchor="overall-recursive-resolver-settings"><name>Overall Recursive Re | to set system-wide values for some default parameters. | |||
| solver Settings</name> | ||||
| <t>A recursive resolver implementing the protocol in this document needs to set | ||||
| system-wide values for some default parameters. | ||||
| These parameters may be set independently for each supported encrypted transport , though a simple implementation may keep the parameters constant across encrypt ed transports.</t> | These parameters may be set independently for each supported encrypted transport , though a simple implementation may keep the parameters constant across encrypt ed transports.</t> | |||
| <texttable title="Recursive resolver system parameters per encrypted transport"> | <table> | |||
| <ttcol align='left'>Name</ttcol> | <name>Recursive Resolver System Parameters per Encrypted Transport</na | |||
| <ttcol align='left'>Description</ttcol> | me> | |||
| <ttcol align='left'>Suggested Default</ttcol> | <thead> | |||
| <c><spanx style="verb">persistence</spanx></c> | <tr> | |||
| <c>How long should the recursive resolver remember successful encrypted tr | <th align="left">Name</th> | |||
| ansport connections?</c> | <th align="left">Description</th> | |||
| <c>3 days (259200 seconds)</c> | <th align="left">Suggested Default</th> | |||
| <c><spanx style="verb">damping</spanx></c> | </tr> | |||
| <c>How long should the recursive resolver remember unsuccessful encrypted | </thead> | |||
| transport connections?</c> | <tbody> | |||
| <c>1 day (86400 seconds)</c> | <tr> | |||
| <c><spanx style="verb">timeout</spanx></c> | <td align="left"> | |||
| <c>How long should the recursive resolver wait for an initiated encrypted | <tt>persistence</tt></td> | |||
| connection to complete?</c> | <td align="left">How long the recursive resolver remembers a succe | |||
| <c>4 seconds</c> | ssful encrypted transport connection</td> | |||
| </texttable> | <td align="left">3 days (259200 seconds)</td> | |||
| </tr> | ||||
| <t>This document uses the notation <spanx style="verb"><transport>-foo</sp | <tr> | |||
| anx> to refer to the <spanx style="verb">foo</spanx> parameter for the encrypted | <td align="left"> | |||
| transport <spanx style="verb"><transport></spanx>. | <tt>damping</tt></td> | |||
| For example, <spanx style="verb">DoT-persistence</spanx> would indicate the leng | <td align="left">How long the recursive resolver remembers an unsu | |||
| th of time that the recursive resolver will remember that an authoritative serve | ccessful encrypted transport connection</td> | |||
| r had a successful connection over <spanx style="verb">DoT</spanx>. | <td align="left">1 day (86400 seconds)</td> | |||
| Additionally, when describing an arbitrary encrypted transport, we use <spanx st | </tr> | |||
| yle="verb">E</spanx> in place of <spanx style="verb"><transport></spanx> t | <tr> | |||
| o generically mean whatever encrypted transport is in use. | <td align="left"> | |||
| For example, when handling a query sent over encrypted transport <spanx style="v | <tt>timeout</tt></td> | |||
| erb">E</spanx>, a reference to <spanx style="verb">E-timeout</spanx> should be u | <td align="left">How long the recursive resolver waits for an init | |||
| nderstood to mean <spanx style="verb">DoT-timeout</spanx> if the query is sent o | iated encrypted connection to complete</td> | |||
| ver <spanx style="verb">DoT</spanx>, and to mean <spanx style="verb">DoQ-timeout | <td align="left">4 seconds</td> | |||
| </spanx> if the query is sent over <spanx style="verb">DoQ</spanx>.</t> | </tr> | |||
| </tbody> | ||||
| <t>This document also assumes that the recursive resolver maintains a list of ou | </table> | |||
| tstanding cleartext queries destined for the authoritative server's IP address < | <t>This document uses the notation <tt><transport>-foo</tt> to ref | |||
| spanx style="verb">X</spanx>. | er to the <tt>foo</tt> parameter for the encrypted transport <tt><transport&g | |||
| This list is referred to as <spanx style="verb">Do53-queries[X]</spanx>. | t;</tt>. | |||
| For example, <tt>DoT-persistence</tt> would indicate the length of time that the | ||||
| recursive resolver will remember that an authoritative server had a successful | ||||
| connection over DoT. | ||||
| Additionally, when describing an arbitrary encrypted transport, we use <tt>E</tt | ||||
| > in place of <tt><transport></tt> to generically mean whatever encrypted | ||||
| transport is in use. | ||||
| For example, when handling a query sent over encrypted transport <tt>E</tt>, a r | ||||
| eference to <tt>E-timeout</tt> should be understood to mean <tt>DoT-timeout</tt> | ||||
| if the query is sent over DoT, and to mean <tt>DoQ-timeout</tt> if the query is | ||||
| sent over DoQ.</t> | ||||
| <t>This document also assumes that the recursive resolver maintains a li | ||||
| st of outstanding cleartext queries destined for the authoritative server's IP a | ||||
| ddress <tt>X</tt>. | ||||
| This list is referred to as "<tt>Do53-queries[X]</tt>" | ||||
| This document does not attempt to describe the specific operation of sending and receiving cleartext DNS queries (Do53) for a recursive resolver. | This document does not attempt to describe the specific operation of sending and receiving cleartext DNS queries (Do53) for a recursive resolver. | |||
| Instead it describes a "bolt-on" mechanism that extends the recursive resolver's operation on a few simple hooks into the recursive resolver's existing handling of Do53.</t> | Instead it describes a "bolt-on" mechanism that extends the recursive resolver's operation on a few simple hooks into the recursive resolver's existing handling of Do53.</t> | |||
| <t>Implementers or deployers of DNS recursive resolvers that follow the | ||||
| strategies in this document are encouraged to publish their preferred values of | ||||
| these parameters.</t> | ||||
| </section> | ||||
| <t>Implementers or deployers of DNS recursive resolvers that follow the strategi | <section anchor="recursive-requirements"> | |||
| es in this document are encouraged to publish their preferred values of these pa | <name>Recursive Resolver Requirements</name> | |||
| rameters.</t> | <t>To follow the strategies in this document, a recursive resolver <bcp1 | |||
| 4>MUST</bcp14> implement at least one of either DoT or DoQ in its capacity as a | ||||
| </section> | client of authoritative nameservers. | |||
| <section anchor="recursive-requirements"><name>Recursive Resolver Requirements</ | ||||
| name> | ||||
| <t>To follow this guidance, a recursive resolver <bcp14>MUST</bcp14> implement a | ||||
| t least one of either DoT or DoQ in its capacity as a client of authoritative na | ||||
| meservers. | ||||
| A recursive resolver <bcp14>SHOULD</bcp14> implement the client side of DoT. | A recursive resolver <bcp14>SHOULD</bcp14> implement the client side of DoT. | |||
| A recursive resolver <bcp14>SHOULD</bcp14> implement the client side of DoQ.</t> | A recursive resolver <bcp14>SHOULD</bcp14> implement the client side of DoQ.</t> | |||
| <t>DoT queries from the recursive resolver <bcp14>MUST</bcp14> target TC | ||||
| P port 853 using an ALPN of "<tt>dot</tt>". | ||||
| DoQ queries from the recursive resolver <bcp14>MUST</bcp14> target UDP port 853 | ||||
| using an ALPN of "<tt>doq</tt>".</t> | ||||
| <t>While this document focuses on the recursive-to-authoritative hop, a | ||||
| recursive resolver implementing the strategies in this document <bcp14>SHOULD</b | ||||
| cp14> also accept queries from its clients over some encrypted transport unless | ||||
| it only accepts queries from the localhost.</t> | ||||
| </section> | ||||
| <section anchor="conn-state"> | ||||
| <name>Authoritative Server Encrypted Transport Connection State</name> | ||||
| <t>The recursive resolver <bcp14>SHOULD</bcp14> keep a record of the sta | ||||
| te for each authoritative server it contacts, indexed by the IP address of the a | ||||
| uthoritative server and the encrypted transports supported by the recursive reso | ||||
| lver.</t> | ||||
| <t>DoT queries from the recursive resolver <bcp14>MUST</bcp14> target TCP port 8 | <t>Note that the recursive resolver might record this per-authoritative- | |||
| 53, using an ALPN of "<spanx style="verb">dot</spanx>". | IP state for each source IP address it uses as it sends its queries. | |||
| DoQ queries from the recursive resolver <bcp14>MUST</bcp14> target UDP port 853, | For example, if a recursive resolver can send a packet to authoritative servers | |||
| using an ALPN of "<spanx style="verb">doq</spanx>".</t> | from IP addresses <tt>2001:db8::100</tt> and <tt>2001:db8::200</tt>, it could ke | |||
| ep two distinct sets of per-authoritative-IP state: one for each source address | ||||
| <t>While this document focuses on the recursive-to-authoritative hop, a recursiv | it uses, if the recursive resolver knows the addresses in use. | |||
| e resolver implementing these strategies <bcp14>SHOULD</bcp14> also accept queri | ||||
| es from its clients over some encrypted transport unless it only accepts queries | ||||
| from localhost.</t> | ||||
| </section> | ||||
| <section anchor="conn-state"><name>Authoritative Server Encrypted Transport Conn | ||||
| ection State</name> | ||||
| <t>The recursive resolver <bcp14>SHOULD</bcp14> keep a record of the state for e | ||||
| ach authoritative server it contacts, indexed by the IP address of the authorita | ||||
| tive server and the encrypted transports supported by the recursive resolver.</t | ||||
| > | ||||
| <t>Note that the recursive resolver might record this per-authoritative-IP state | ||||
| for each source IP address it uses as it sends its queries. | ||||
| For example, if a recursive resolver can send a packet to authoritative servers | ||||
| from IP addresses <spanx style="verb">2001:db8::100</spanx> and <spanx style="ve | ||||
| rb">2001:db8::200</spanx>, it could keep two distinct sets of per-authoritative- | ||||
| IP state, one for each source address it uses, if the recursive resolver knows t | ||||
| he addresses in use. | ||||
| Keeping these state tables distinct for each source address makes it possible fo r a pooled authoritative server behind a load balancer to do a partial rollout w hile minimizing accidental timeouts (see <xref target="authoritative-pools"/>).< /t> | Keeping these state tables distinct for each source address makes it possible fo r a pooled authoritative server behind a load balancer to do a partial rollout w hile minimizing accidental timeouts (see <xref target="authoritative-pools"/>).< /t> | |||
| <t>In addition to tracking the state of connection attempts and outcomes, a recu rsive resolver <bcp14>SHOULD</bcp14> record the state of established sessions fo r encrypted protocols. | <t>In addition to tracking the state of connection attempts and outcomes, a recu rsive resolver <bcp14>SHOULD</bcp14> record the state of established sessions fo r encrypted protocols. | |||
| The details of how sessions are identified is dependent on the transport protoco l implementation (such as TLS session ticket or TLS session ID, QUIC connection ID, and so on). | The details of how sessions are identified are dependent on the transport protoc ol implementation (such as a TLS session ticket or TLS session ID, a QUIC connec tion ID, and so on). | |||
| The use of session resumption as recommended here is limited somewhat because th e tickets are only stored within the context defined by the (clientIP, serverIP, protocols) tuples used to track client-server interaction by the recursive reso lver in a table like the one below. | The use of session resumption as recommended here is limited somewhat because th e tickets are only stored within the context defined by the (clientIP, serverIP, protocols) tuples used to track client-server interaction by the recursive reso lver in a table like the one below. | |||
| However, session resumption still offers the ability to optimize the handshake i n some circumstances.</t> | However, session resumption still offers the ability to optimize the handshake i n some circumstances.</t> | |||
| <t>Each record should contain the following fields for each supported en | ||||
| crypted transport, each of which would initially be <tt>null</tt>:</t> | ||||
| <table> | ||||
| <name>Recursive Resolver State per-Authoritative-IP and per-Encrypted | ||||
| Transport</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align="left">Name</th> | ||||
| <th align="left">Description</th> | ||||
| <th align="left">Retain Across Restart</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="left"> | ||||
| <tt>session</tt></td> | ||||
| <td align="left">The associated state of any existing established | ||||
| session (the structure of this value is dependent on the encrypted transport imp | ||||
| lementation). If <tt>session</tt> is not <tt>null</tt>, it may be in one of two | ||||
| states: <tt>pending</tt> or <tt>established</tt>.</td> | ||||
| <td align="left">no</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"> | ||||
| <tt>initiated</tt></td> | ||||
| <td align="left">Timestamp of the most recent connection attempt</ | ||||
| td> | ||||
| <td align="left">yes</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"> | ||||
| <tt>completed</tt></td> | ||||
| <td align="left">Timestamp of the most recent completed handshake | ||||
| (which can include one where an existing session is resumed)</td> | ||||
| <td align="left">yes</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"> | ||||
| <tt>status</tt></td> | ||||
| <td align="left">Enumerated value of <tt>success</tt>, <tt>fail</t | ||||
| t>, or <tt>timeout</tt> associated with the <tt>completed</tt> handshake</td> | ||||
| <td align="left">yes</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"> | ||||
| <tt>last-response</tt></td> | ||||
| <td align="left">A timestamp of the most recent response received | ||||
| on the connection</td> | ||||
| <td align="left">yes</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"> | ||||
| <tt>resumptions</tt></td> | ||||
| <td align="left">A stack of resumption tickets (and associated par | ||||
| ameters) that could be used to resume a prior successful session</td> | ||||
| <td align="left">yes</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"> | ||||
| <tt>queries</tt></td> | ||||
| <td align="left">A queue of queries intended for this authoritativ | ||||
| e server, each of which has additional status of <tt>early</tt>, <tt>unsent</tt> | ||||
| , or <tt>sent</tt></td> | ||||
| <td align="left">no</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"> | ||||
| <tt>last-activity</tt></td> | ||||
| <td align="left">A timestamp of the most recent activity on the co | ||||
| nnection</td> | ||||
| <td align="left">no</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t>Note that the <tt>session</tt> fields in aggregate constitute a pool | ||||
| of open connections to different servers.</t> | ||||
| <t>With the exception of the <tt>session</tt>, <tt>queries</tt>, and <tt | ||||
| >last-activity</tt> fields, this cache information should be kept across restart | ||||
| of the server unless explicitly cleared by administrative action.</t> | ||||
| <t>This document uses the notation <tt>E-foo[X]</tt> to indicate the val | ||||
| ue of field <tt>foo</tt> for encrypted transport <tt>E</tt> to IP address <tt>X< | ||||
| /tt>.</t> | ||||
| <t>For example, <tt>DoT-initiated[192.0.2.4]</tt> represents the timesta | ||||
| mp when the most recent DoT connection packet was sent to IP address <tt>192.0.2 | ||||
| .4</tt>.</t> | ||||
| <t>This document uses the notation <tt>any-E-queries</tt> to indicate an | ||||
| y query on an encrypted transport.</t> | ||||
| </section> | ||||
| <section anchor="probing-policy"> | ||||
| <name>Probing Policy</name> | ||||
| <t>When a recursive resolver discovers the need for an authoritative loo | ||||
| kup to an authoritative DNS server using that server's IP address <tt>X</tt>, it | ||||
| retrieves the connection state records described in <xref target="conn-state"/> | ||||
| associated with <tt>X</tt> from its cache.</t> | ||||
| <t>Each record should contain the following fields for each supported encrypted | <t>Some of the subsections that follow offer pseudocode that corresponds | |||
| transport, each of which would initially be <spanx style="verb">null</spanx>:</t | roughly to an asynchronous programming model for a recursive resolver's interac | |||
| > | tions with authoritative servers. | |||
| All subsections also presume that the time of the discovery of the need for look | ||||
| <texttable title="Recursive resolver state per authoritative IP, per encrypted t | up is time <tt>T0</tt>.</t> | |||
| ransport"> | <t>If any of the records discussed here are absent, they are treated as <tt>null | |||
| <ttcol align='left'>Name</ttcol> | </tt>.</t> | |||
| <ttcol align='left'>Description</ttcol> | ||||
| <ttcol align='left'>Retain Across Restart</ttcol> | ||||
| <c><spanx style="verb">session</spanx></c> | ||||
| <c>The associated state of any existing, established session (the structur | ||||
| e of this value is dependent on the encrypted transport implementation). If <sp | ||||
| anx style="verb">session</spanx> is not <spanx style="verb">null</spanx>, it may | ||||
| be in one of two states: <spanx style="verb">pending</spanx> or <spanx style="v | ||||
| erb">established</spanx></c> | ||||
| <c>no</c> | ||||
| <c><spanx style="verb">initiated</spanx></c> | ||||
| <c>Timestamp of most recent connection attempt</c> | ||||
| <c>yes</c> | ||||
| <c><spanx style="verb">completed</spanx></c> | ||||
| <c>Timestamp of most recent completed handshake (which can include one whe | ||||
| re an existing session is resumed)</c> | ||||
| <c>yes</c> | ||||
| <c><spanx style="verb">status</spanx></c> | ||||
| <c>Enumerated value of <spanx style="verb">success</spanx> or <spanx style | ||||
| ="verb">fail</spanx> or <spanx style="verb">timeout</spanx>, associated with the | ||||
| <spanx style="verb">completed</spanx> handshake</c> | ||||
| <c>yes</c> | ||||
| <c><spanx style="verb">last-response</spanx></c> | ||||
| <c>A timestamp of the most recent response received on the connection</c> | ||||
| <c>yes</c> | ||||
| <c><spanx style="verb">resumptions</spanx></c> | ||||
| <c>A stack of resumption tickets (and associated parameters) that could be | ||||
| used to resume a prior successful session</c> | ||||
| <c>yes</c> | ||||
| <c><spanx style="verb">queries</spanx></c> | ||||
| <c>A queue of queries intended for this authoritative server, each of whic | ||||
| h has additional status <spanx style="verb">early</spanx>, <spanx style="verb">u | ||||
| nsent</spanx>, or <spanx style="verb">sent</spanx></c> | ||||
| <c>no</c> | ||||
| <c><spanx style="verb">last-activity</spanx></c> | ||||
| <c>A timestamp of the most recent activity on the connection</c> | ||||
| <c>no</c> | ||||
| </texttable> | ||||
| <t>Note that the <spanx style="verb">session</spanx> fields in aggregate constit | ||||
| ute a pool of open connections to different servers.</t> | ||||
| <t>With the exception of the <spanx style="verb">session</spanx>, <spanx style=" | ||||
| verb">queries</spanx>, and <spanx style="verb">last-activity</spanx> fields, thi | ||||
| s cache information should be kept across restart of the server unless explicitl | ||||
| y cleared by administrative action.</t> | ||||
| <t>This document uses the notation <spanx style="verb">E-foo[X]</spanx> to indic | ||||
| ate the value of field <spanx style="verb">foo</spanx> for encrypted transport < | ||||
| spanx style="verb">E</spanx> to IP address <spanx style="verb">X</spanx>.</t> | ||||
| <t>For example, <spanx style="verb">DoT-initiated[192.0.2.4]</spanx> represents | ||||
| the timestamp when the most recent DoT connection packet was sent to IP address | ||||
| 192.0.2.4.</t> | ||||
| <t>This document uses the notation <spanx style="verb">any-E-queries</spanx> to | ||||
| indicate any query on an encrypted transport.</t> | ||||
| </section> | ||||
| <section anchor="probing-policy"><name>Probing Policy</name> | ||||
| <t>When a recursive resolver discovers the need for an authoritative lookup to a | ||||
| n authoritative DNS server using that servers's IP address <spanx style="verb">X | ||||
| </spanx>, it retrieves the connection state records described in <xref target="c | ||||
| onn-state"/> associated with <spanx style="verb">X</spanx> from its cache.</t> | ||||
| <t>The subsections that follow offer pseudocode that corresponds roughly to an a | ||||
| synchronous programming model for a recursive resolver's interactions with autho | ||||
| ritative servers. | ||||
| The following subsections also presume that the time of the discovery of the nee | ||||
| d for lookup is time <spanx style="verb">T0</spanx>.</t> | ||||
| <t>If any of the records discussed here are absent, they are treated as <spanx s | ||||
| tyle="verb">null</spanx>.</t> | ||||
| <t>The recursive resolver must decide whether to initially send a query over Do5 | ||||
| 3, or over any of the supported encrypted transports (DoT or DoQ).</t> | ||||
| <t>Note that a recursive resolver might initiate this query via any or all of th | ||||
| e known transports. | ||||
| When multiple queries are sent, the initial packets for each connection can be s | ||||
| ent concurrently, similar to "Happy Eyeballs" (<xref target="RFC8305"/>). | ||||
| However, unlike Happy Eyeballs, when one transport succeeds, the other connectio | ||||
| ns do not need to be terminated, but can instead be continued to establish wheth | ||||
| er the IP address <spanx style="verb">X</spanx> is capable of communicating on t | ||||
| he relevant transport.</t> | ||||
| <section anchor="sending-a-query-over-do53"><name>Sending a Query over Do53</nam | ||||
| e> | ||||
| <t>For any of the supported encrypted transports <spanx style="verb">E</spanx>, | ||||
| if either of the following holds true, the recursive resolver <bcp14>SHOULD NOT< | ||||
| /bcp14> send a query to <spanx style="verb">X</spanx> over Do53:</t> | ||||
| <t><list style="symbols"> | ||||
| <t><spanx style="verb">E-session[X]</spanx> is in the <spanx style="verb">esta | ||||
| blished</spanx> state, or</t> | ||||
| <t><spanx style="verb">E-status[X]</spanx> is <spanx style="verb">success</spa | ||||
| nx>, and <spanx style="verb">(T0 - E-last-response[X]) < persistence</spanx>< | ||||
| /t> | ||||
| </list></t> | ||||
| <t>This indicates that one successful connection to a server that the client the | ||||
| n closed cleanly would result in the client not sending the next query over Do53 | ||||
| .</t> | ||||
| <t>Otherwise, if there is no outstanding session for any encrypted transport, an | ||||
| d the last successful encrypted transport connection was long ago, the recursive | ||||
| resolver sends a query to <spanx style="verb">X</spanx> over Do53. | ||||
| When it does so, it inserts a handle for the query in <spanx style="verb">Do53-q | ||||
| ueries[X]</spanx>.</t> | ||||
| </section> | ||||
| <section anchor="receiving-a-response-over-do53"><name>Receiving a Response over | ||||
| Do53</name> | ||||
| <t>When any response <spanx style="verb">R</spanx> (a well-formed DNS response, | ||||
| asynchronous timeout, asynchronous destination port unreachable, etc) for query | ||||
| <spanx style="verb">Q</spanx> arrives at the recursive resolver in cleartext sen | ||||
| t over Do53 from authoritative server with IP address <spanx style="verb">X</spa | ||||
| nx>, the recursive resolver should:</t> | ||||
| <t>If <spanx style="verb">Q</spanx> is not in <spanx style="verb">Do53-queries[X | ||||
| ]</spanx>:</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Process <spanx style="verb">R</spanx> no further (do not respond to a clear | ||||
| text response to a query that is not outstanding)</t> | ||||
| </list></t> | ||||
| <t>Otherwise, if <spanx style="verb">Q</spanx> was marked as already processed:< | ||||
| /t> | ||||
| <t><list style="symbols"> | ||||
| <t>Remove <spanx style="verb">Q</spanx> from <spanx style="verb">Do53-queries[ | ||||
| X]</spanx></t> | ||||
| <t>Discard any content from the response and process <spanx style="verb">R</sp | ||||
| anx> no further</t> | ||||
| </list></t> | ||||
| <t>If <spanx style="verb">R</spanx> is a well-formed DNS response:</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Remove <spanx style="verb">Q</spanx> from <spanx style="verb">Do53-queries[ | ||||
| X]</spanx></t> | ||||
| <t><spanx style="verb">R</spanx> is further processed by the recursive resolve | ||||
| r</t> | ||||
| <t>For each supported encrypted transport <spanx style="verb">E</spanx>: | ||||
| <list style="symbols"> | ||||
| <t>If <spanx style="verb">Q</spanx> is in <spanx style="verb">E-queries[X] | ||||
| </spanx>: | ||||
| <list style="symbols"> | ||||
| <t>Mark <spanx style="verb">Q</spanx> as already processed</t> | ||||
| </list></t> | ||||
| </list></t> | ||||
| </list></t> | ||||
| <t>But if <spanx style="verb">R</spanx> is malformed, or a failure (e.g., a time | ||||
| out or destination port unreachable):</t> | ||||
| <t><list style="symbols"> | ||||
| <t>if <spanx style="verb">Q</spanx> is not in any of <spanx style="verb">any-E | ||||
| -queries[X]</spanx>: | ||||
| <list style="symbols"> | ||||
| <t>Treat this as a failed query (i.e., follow the resolver's policy for un | ||||
| responsive or non-compliant authoritatives, such as falling back to another auth | ||||
| oritative server, returning <spanx style="verb">SERVFAIL</spanx> to the requesti | ||||
| ng client, and so on)</t> | ||||
| </list></t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="initiating-a-connection-over-encrypted-transport"><name>Initiat | ||||
| ing a Connection over Encrypted Transport</name> | ||||
| <t>If any <spanx style="verb">E-session[X]</spanx> is in the <spanx style="verb" | ||||
| >established</spanx> state, the recursive resolver <bcp14>SHOULD NOT</bcp14> ini | ||||
| tiate a new or resume a previous connection to <spanx style="verb">X</spanx> ove | ||||
| r Do53 or <spanx style="verb">E</spanx>, but should instead send queries to <spa | ||||
| nx style="verb">X</spanx> through the existing session (see <xref target="sendin | ||||
| g"/>).</t> | ||||
| <t>If the recursive resolver prefers one encrypted transport over another, but o | ||||
| nly the unpreferred encrypted transport is in the <spanx style="verb">establishe | ||||
| d</spanx> state, it <bcp14>MAY</bcp14> also initiate a new connection to <spanx | ||||
| style="verb">X</spanx> over its preferred encrypted transport while concurrently | ||||
| sending the query over the <spanx style="verb">established</spanx> encrypted tr | ||||
| ansport <spanx style="verb">E</spanx>.</t> | ||||
| <t>Before considering whether to initiate a new connection over an encrypted tra | ||||
| nsport, the timer should be examined, and its state possibly refreshed, for encr | ||||
| ypted transport <spanx style="verb">E</spanx> to authoritative IP address <spanx | ||||
| style="verb">X</spanx>:</t> | ||||
| <t><list style="symbols"> | ||||
| <t>if <spanx style="verb">E-session[X]</spanx> is in state <spanx style="verb" | ||||
| >pending</spanx>, and</t> | ||||
| <t><spanx style="verb">T0 - E-initiated[X] > E-timeout</spanx>, then | ||||
| <list style="symbols"> | ||||
| <t>set <spanx style="verb">E-session[X]</spanx> to <spanx style="verb">nul | ||||
| l</spanx> and</t> | ||||
| <t>set <spanx style="verb">E-status[X]</spanx> to <spanx style="verb">time | ||||
| out</spanx></t> | ||||
| </list></t> | ||||
| </list></t> | ||||
| <t>When resources are available to attempt a new encrypted transport, the recurs | ||||
| ive resolver should only initiate a new connection to <spanx style="verb">X</spa | ||||
| nx> over <spanx style="verb">E</spanx> as long as one of the following holds tru | ||||
| e:</t> | ||||
| <t><list style="symbols"> | ||||
| <t><spanx style="verb">E-status[X]</spanx> is <spanx style="verb">success</spa | ||||
| nx>, or</t> | ||||
| <t><spanx style="verb">E-status[X]</spanx> is either <spanx style="verb">fail< | ||||
| /spanx> or <spanx style="verb">timeout</spanx>, and <spanx style="verb">(T0 - E- | ||||
| completed[X]) > damping</spanx>, or</t> | ||||
| <t><spanx style="verb">E-status[X]</spanx> is <spanx style="verb">null</spanx> | ||||
| and <spanx style="verb">E-initiated[X]</spanx> is <spanx style="verb">null</spa | ||||
| nx></t> | ||||
| </list></t> | ||||
| <t>When initiating a session to <spanx style="verb">X</spanx> over encrypted tra | ||||
| nsport <spanx style="verb">E</spanx>, if <spanx style="verb">E-resumptions[X]</s | ||||
| panx> is not empty, one ticket should be popped off the stack and used to try to | ||||
| resume a previous session. | ||||
| Otherwise, the initial Client Hello handshake should not try to resume any sessi | ||||
| on.</t> | ||||
| <t>When initiating a connection, the recursive resolver should take the followin | ||||
| g steps:</t> | ||||
| <t><list style="symbols"> | ||||
| <t>set <spanx style="verb">E-initiated[X]</spanx> to <spanx style="verb">T0</s | ||||
| panx></t> | ||||
| <t>store a handle for the new session (which should have <spanx style="verb">p | ||||
| ending</spanx> state) in <spanx style="verb">E-session[X]</spanx></t> | ||||
| <t>insert a handle for the query that prompted this connection in <spanx style | ||||
| ="verb">E-queries[X]</spanx>, with status <spanx style="verb">unsent</spanx> or | ||||
| <spanx style="verb">early</spanx>, as appropriate (see below).</t> | ||||
| </list></t> | ||||
| <section anchor="early-data"><name>Early Data</name> | <t>The recursive resolver must decide whether to initially send a query | |||
| over Do53, or over either of the supported encrypted transports (DoT or DoQ).</t | ||||
| > | ||||
| <t>Note that a recursive resolver might initiate this query via any or a | ||||
| ll of the known transports. | ||||
| When multiple queries are sent, the initial packets for each connection can be s | ||||
| ent concurrently, similar to the method used in the document known as "Happy Eye | ||||
| balls" (<xref target="RFC8305"/>). | ||||
| However, unlike Happy Eyeballs, when one transport succeeds, the other connectio | ||||
| ns do not need to be terminated; instead they can be continued to establish whet | ||||
| her the IP address <tt>X</tt> is capable of communicating on the relevant transp | ||||
| ort.</t> | ||||
| <section anchor="sending-a-query-over-do53"> | ||||
| <name>Sending a Query over Do53</name> | ||||
| <t>For any of the supported encrypted transports <tt>E</tt>, the recur | ||||
| sive resolver <bcp14>SHOULD NOT</bcp14> send a query to <tt>X</tt> over Do53 if | ||||
| either of the following holds true:</t> | ||||
| <t>Modern encrypted transports like TLS 1.3 offer the chance to send "early data | <ul spacing="normal"> | |||
| " from the client in the initial Client Hello in some contexts. | <li> | |||
| <t><tt>E-session[X]</tt> is in the <tt>established</tt> state, or< | ||||
| /t> | ||||
| </li> | ||||
| <li> | ||||
| <t><tt>E-status[X]</tt> is <tt>success</tt> and <tt>(T0 - E-last-re | ||||
| sponse[X]) < persistence</tt>.</t> | ||||
| </li> | ||||
| </ul> | ||||
| <t>This indicates that one successful connection to a server that the | ||||
| client then closed cleanly would result in the client not sending the next query | ||||
| over Do53.</t> | ||||
| <t>Otherwise, if there is no outstanding session for any encrypted tra | ||||
| nsport, and the last successful encrypted transport connection was long ago, the | ||||
| recursive resolver sends a query to <tt>X</tt> over Do53. | ||||
| When it does so, it inserts a handle for the query in <tt>Do53-queries[X]</tt>.< | ||||
| /t> | ||||
| </section> | ||||
| <section anchor="receiving-a-response-over-do53"> | ||||
| <name>Receiving a Response over Do53</name> | ||||
| <t>When any response <tt>R</tt> (a well-formed DNS response, asynchron | ||||
| ous timeout, asynchronous destination port unreachable, etc.) for query <tt>Q</t | ||||
| t> arrives at the recursive resolver in cleartext sent over Do53 from an authori | ||||
| tative server with IP address <tt>X</tt>, the recursive resolver should perform | ||||
| the following.</t> | ||||
| <t>If <tt>Q</tt> is not in <tt>Do53-queries[X]</tt>:</t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>process <tt>R</tt> no further (do not respond to a cleartext re | ||||
| sponse to a query that is not outstanding).</t> | ||||
| </li> | ||||
| </ul> | ||||
| <t>Otherwise, if <tt>Q</tt> was marked as already processed:</t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>remove <tt>Q</tt> from <tt>Do53-queries[X]</tt>,</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>discard any content from the response, and process <tt>R</tt> n | ||||
| o further.</t> | ||||
| </li> | ||||
| </ul> | ||||
| <t>If <tt>R</tt> is a well-formed DNS response:</t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>remove <tt>Q</tt> from <tt>Do53-queries[X]</tt>,</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>process <tt>R</tt> further, and</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>for each supported encrypted transport <tt>E</tt>: | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>if <tt>Q</tt> is in <tt>E-queries[X]</tt>, then | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>mark <tt>Q</tt> as already processed.</t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| <t>However, if <tt>R</tt> is malformed or a failure (e.g., a timeout o | ||||
| r destination port unreachable), and</t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>if <tt>Q</tt> is not in any of <tt>any-E-queries[X]</tt>, then | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>treat this as a failed query (i.e., follow the resolver's p | ||||
| olicy for unresponsive or non-compliant authoritatives, such as falling back to | ||||
| another authoritative server, returning <tt>SERVFAIL</tt> to the requesting clie | ||||
| nt, and so on).</t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="initiating-a-connection-over-encrypted-transport"> | ||||
| <name>Initiating a Connection over Encrypted Transport</name> | ||||
| <t>If any <tt>E-session[X]</tt> is in the <tt>established</tt> state, | ||||
| the recursive resolver <bcp14>SHOULD NOT</bcp14> initiate a new connection or re | ||||
| sume a previous connection to <tt>X</tt> over Do53 or <tt>E</tt>, but should ins | ||||
| tead send queries to <tt>X</tt> through the existing session (see <xref target=" | ||||
| sending"/>).</t> | ||||
| <t>If the recursive resolver prefers one encrypted transport over anot | ||||
| her, but only the unpreferred encrypted transport is in the <tt>established</tt> | ||||
| state, it <bcp14>MAY</bcp14> also initiate a new connection to <tt>X</tt> over | ||||
| its preferred encrypted transport while concurrently sending the query over the | ||||
| <tt>established</tt> encrypted transport <tt>E</tt>.</t> | ||||
| <t>Before considering whether to initiate a new connection over an enc | ||||
| rypted transport, the timer should be examined, and its state possibly refreshed | ||||
| , for encrypted transport <tt>E</tt> to authoritative IP address <tt>X</tt>.</t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>If <tt>E-session[X]</tt> is in state <tt>pending</tt>, and</t> | ||||
| </li> | ||||
| <li> | ||||
| <t><tt>T0 - E-initiated[X] > E-timeout</tt>, then | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>set <tt>E-session[X]</tt> to <tt>null</tt>, and</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>set <tt>E-status[X]</tt> to <tt>timeout</tt>.</t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| <t>When resources are available to attempt a new encrypted transport, | ||||
| the recursive resolver should only initiate a new connection to <tt>X</tt> over | ||||
| <tt>E</tt> as long as one of the following holds true:</t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t><tt>E-status[X]</tt> is <tt>success</tt>, or</t> | ||||
| </li> | ||||
| <li> | ||||
| <t><tt>E-status[X]</tt> is either <tt>fail</tt> or <tt>timeout</tt | ||||
| > and <tt>(T0 - E-completed[X]) > damping</tt>, or</t> | ||||
| </li> | ||||
| <li> | ||||
| <t><tt>E-status[X]</tt> is <tt>null</tt> and <tt>E-initiated[X]</t | ||||
| t> is <tt>null</tt>.</t> | ||||
| </li> | ||||
| </ul> | ||||
| <t>When initiating a session to <tt>X</tt> over encrypted transport <t | ||||
| t>E</tt>, if <tt>E-resumptions[X]</tt> is not empty, one ticket should be popped | ||||
| off the stack and used to try to resume a previous session. | ||||
| Otherwise, the initial ClientHello handshake should not try to resume any sessio | ||||
| n.</t> | ||||
| <t>When initiating a connection, the recursive resolver should take th | ||||
| e following steps:</t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>set <tt>E-initiated[X]</tt> to <tt>T0</tt>,</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>store a handle for the new session (which should have <tt>pendi | ||||
| ng</tt> state) in <tt>E-session[X]</tt>, and</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>insert a handle for the query that prompted this connection in | ||||
| <tt>E-queries[X]</tt>, with status <tt>unsent</tt> or <tt>early</tt>, as appropr | ||||
| iate (see below).</t> | ||||
| </li> | ||||
| </ul> | ||||
| <section anchor="early-data"> | ||||
| <name>Early Data</name> | ||||
| <t>Modern encrypted transports like TLS 1.3 offer the chance to send | ||||
| "early data" from the client in the initial ClientHello in some contexts. | ||||
| A recursive resolver that initiates a connection over an encrypted transport acc ording to this guidance in a context where early data is possible <bcp14>SHOULD< /bcp14> send the DNS query that prompted the connection in the early data, accor ding to the sending guidance in <xref target="sending"/>.</t> | A recursive resolver that initiates a connection over an encrypted transport acc ording to this guidance in a context where early data is possible <bcp14>SHOULD< /bcp14> send the DNS query that prompted the connection in the early data, accor ding to the sending guidance in <xref target="sending"/>.</t> | |||
| <t>If it does so, the status of <tt>Q</tt> in <tt>E-queries[X]</tt> | ||||
| should be set to <tt>early</tt> instead of <tt>unsent</tt>.</t> | ||||
| </section> | ||||
| <section anchor="resumption"> | ||||
| <name>Resumption Tickets</name> | ||||
| <t>When initiating a new connection (whether by resuming an old sess | ||||
| ion or not), the recursive resolver <bcp14>SHOULD</bcp14> request a session resu | ||||
| mption ticket from the authoritative server. | ||||
| If the authoritative server supplies a resumption ticket, the recursive resolver | ||||
| pushes it into the stack at <tt>E-resumptions[X]</tt>.</t> | ||||
| </section> | ||||
| <section anchor="recursive-sni"> | ||||
| <name>Server Name Indication</name> | ||||
| <t>For modern encrypted transports like TLS 1.3, most client impleme | ||||
| ntations expect to send a Server Name Indication (SNI) in the ClientHello.</t> | ||||
| <t>There are two complications with selecting or sending an SNI in t | ||||
| his unilateral probing.</t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>Some authoritative servers are known by more than one name; s | ||||
| electing a single name to use for a given connection may be difficult or impossi | ||||
| ble.</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>In most configurations, the contents of the SNI field are exp | ||||
| osed on the wire to a passive adversary. | ||||
| This potentially reveals additional information about which query is being made | ||||
| based on the NS of the query itself.</t> | ||||
| </li> | ||||
| </ul> | ||||
| <t>To avoid additional leakage and complexity, a recursive resolver | ||||
| following this guidance <bcp14>SHOULD NOT</bcp14> send an SNI to the authoritati | ||||
| ve server when attempting encrypted transport.</t> | ||||
| <t>If the recursive resolver needs to send an SNI to the authoritati | ||||
| ve server for some reason not found in this document, using Encrypted ClientHell | ||||
| o (<xref target="I-D.ietf-tls-esni"/>) would reduce leakage.</t> | ||||
| </section> | ||||
| <section anchor="authoritative-server-authentication"> | ||||
| <name>Authoritative Server Authentication</name> | ||||
| <t>Because this probing policy is unilateral and opportunistic, the | ||||
| client connecting under this policy <bcp14>MUST</bcp14> accept any certificate p | ||||
| resented by the server. | ||||
| If the client cannot verify the server's identity, it <bcp14>MAY</bcp14> use tha | ||||
| t information for reporting, logging, or other analysis purposes; however, it <b | ||||
| cp14>MUST NOT</bcp14> reject the connection due to the authentication failure, a | ||||
| s the result would be falling back to cleartext, which would leak the content of | ||||
| the session to a passive network monitor.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="establish-encrypted"> | ||||
| <name>Establishing an Encrypted Transport Connection</name> | ||||
| <t>When an encrypted transport connection actually completes (e.g., th | ||||
| e TLS handshake completes) at time <tt>T1</tt>, the recursive resolver sets <tt> | ||||
| E-completed[X]</tt> to <tt>T1</tt> and does the following.</t> | ||||
| <t>If the handshake completed successfully, the recursive resolver:</t | ||||
| > | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>updates <tt>E-session[X]</tt> so that it is in state <tt>establ | ||||
| ished</tt>,</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>sets <tt>E-status[X]</tt> to <tt>success</tt>,</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>sets <tt>E-last-response[X]</tt> to <tt>T1</tt>,</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>sets <tt>E-completed[X]</tt> to <tt>T1</tt>, and</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>for each query <tt>Q</tt> in <tt>E-queries[X]</tt>: | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>if early data was accepted and <tt>Q</tt> is <tt>early</tt> | ||||
| , then | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>sets the status of <tt>Q</tt> to <tt>sent</tt>.</t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| <li> | ||||
| <t>Otherwise: | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>sends <tt>Q</tt> through the session (see <xref target= | ||||
| "sending"/>) and sets the status of <tt>Q</tt> to <tt>sent</tt>.</t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="failing-to-establish-an-encrypted-transport-connection" | ||||
| > | ||||
| <name>Failing to Establish an Encrypted Transport Connection</name> | ||||
| <t>If, at time <tt>T2</tt>, an encrypted transport handshake completes | ||||
| with a failure (e.g., a TLS alert):</t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>set <tt>E-session[X]</tt> to <tt>null</tt>,</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>set <tt>E-status[X]</tt> to <tt>fail</tt>,</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>set <tt>E-completed[X]</tt> to <tt>T2</tt>, and</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>for each query <tt>Q</tt> in <tt>E-queries[X]</tt>: | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>if <tt>Q</tt> is not present in any other <tt>any-E-queries | ||||
| [X]</tt> or in <tt>Do53-queries[X]</tt>, add <tt>Q</tt> to <tt>Do53-queries[X]</ | ||||
| tt> and send query <tt>Q</tt> to <tt>X</tt> over Do53.</t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| <t>Note that this failure will trigger the recursive resolver to fall | ||||
| back to cleartext queries to the authoritative server at IP address <tt>X</tt>. | ||||
| It will retry encrypted transport to <tt>X</tt> once the <tt>damping</tt> timer | ||||
| has elapsed.</t> | ||||
| </section> | ||||
| <section anchor="e-failure"> | ||||
| <name>Encrypted Transport Failure</name> | ||||
| <t>Once established, an encrypted transport might fail for a number of | ||||
| reasons (e.g., decryption failure or improper protocol sequence).</t> | ||||
| <t>If this happens:</t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>set <tt>E-session[X]</tt> to <tt>null</tt>,</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>set <tt>E-status[X]</tt> to <tt>fail</tt>, and</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>for each query <tt>Q</tt> in <tt>E-queries[X]</tt>: | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>if <tt>Q</tt> is not present in any other <tt>any-E-queries | ||||
| [X]</tt> or in <tt>Do53-queries[X]</tt>, add <tt>Q</tt> to <tt>Do53-queries[X]</ | ||||
| tt> and send query <tt>Q</tt> to <tt>X</tt> over Do53.</t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| <t>Note that this failure will trigger the recursive resolver to fall | ||||
| back to cleartext queries to the authoritative server at IP address <tt>X</tt>. | ||||
| It will retry encrypted transport to <tt>X</tt> once the <tt>damping</tt> timer | ||||
| has elapsed.</t> | ||||
| </section> | ||||
| <section anchor="e-shutdown"> | ||||
| <name>Handling Clean Shutdown of an Encrypted Transport Connection</na | ||||
| me> | ||||
| <t>At time <tt>T3</tt>, the recursive resolver may find that authorita | ||||
| tive server <tt>X</tt> cleanly closes an existing outstanding connection (most l | ||||
| ikely due to resource exhaustion, see <xref target="authoritative-resource-exhau | ||||
| stion"/>).</t> | ||||
| <t>When this happens:</t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>set <tt>E-session[X]</tt> to <tt>null</tt>, and</t> | ||||
| </li> | ||||
| <li> | ||||
| <t>for each query <tt>Q</tt> in <tt>E-queries[X]</tt>: | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| <t>if <tt>Q</tt> is not present in any other <tt>any-E-queries | ||||
| [X]</tt> or in <tt>Do53-queries[X]</tt>, add <tt>Q</tt> to <tt>Do53-queries[X]</ | ||||
| tt> and send query <tt>Q</tt> to <tt>X</tt> over Do53.</t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| <t>Note that this premature shutdown will trigger the recursive resolv | ||||
| er to fall back to cleartext queries to the authoritative server at IP address < | ||||
| tt>X</tt>. | ||||
| Any subsequent query to <tt>X</tt> will retry the encrypted connection promptly. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="sending"> | ||||
| <name>Sending a Query over Encrypted Transport</name> | ||||
| <t>If it does so, the status of <spanx style="verb">Q</spanx> in <spanx style="v | <t>When sending a query to an authoritative server over encrypted tran | |||
| erb">E-queries[X]</spanx> should be set to <spanx style="verb">early</spanx> ins | sport at time <tt>T4</tt>, the recursive resolver should take a few reasonable s | |||
| tead of <spanx style="verb">unsent</spanx>.</t> | teps to ensure privacy and efficiency. | |||
| After sending query <tt>Q</tt>, the recursive resolver should:</t> | ||||
| </section> | <ul> | |||
| <section anchor="resumption"><name>Resumption Tickets</name> | <li>Ensure that <tt>Q</tt>'s state in <tt>E-queries[X]</tt> is set to <tt>sent</ | |||
| tt>.</li> | ||||
| <t>When initiating a new connection (whether by resuming an old session or not), | <li>Set <tt>E-last-activity[X]</tt> to <tt>T4</tt>.</li> | |||
| the recursive resolver <bcp14>SHOULD</bcp14> request a session resumption ticke | </ul> | |||
| t from the authoritative server. | ||||
| If the authoritative server supplies a resumption ticket, the recursive resolver | ||||
| pushes it into the stack at <spanx style="verb">E-resumptions[X]</spanx>.</t> | ||||
| </section> | ||||
| <section anchor="recursive-sni"><name>Server Name Indication</name> | ||||
| <t>For modern encrypted transports like TLS 1.3, most client implementations exp | ||||
| ect to send a Server Name Indication (SNI) in the Client Hello.</t> | ||||
| <t>There are two complications with selecting or sending SNI in this unilateral | ||||
| probing:</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Some authoritative servers are known by more than one name; selecting a sin | ||||
| gle name to use for a given connection may be difficult or impossible.</t> | ||||
| <t>In most configurations, the contents of the SNI field is exposed on the wir | ||||
| e to a passive adversary. | ||||
| This potentially reveals additional information about which query is being made, | ||||
| based on the NS of the query itself.</t> | ||||
| </list></t> | ||||
| <t>To avoid additional leakage and complexity, a recursive resolver following th | ||||
| is guidance <bcp14>SHOULD NOT</bcp14> send SNI to the authoritative when attempt | ||||
| ing encrypted transport.</t> | ||||
| <t>If the recursive resolver needs to send SNI to the authoritative for some rea | ||||
| son not found in this document, using Encrypted Client Hello (<xref target="I-D. | ||||
| ietf-tls-esni"/>) would reduce leakage.</t> | ||||
| </section> | ||||
| <section anchor="authoritative-server-authentication"><name>Authoritative Server | ||||
| Authentication</name> | ||||
| <t>Because this probing policy is unilateral and opportunistic, the client conne | ||||
| cting under this policy <bcp14>MUST</bcp14> accept any certificate presented by | ||||
| the server. | ||||
| If the client cannot verify the server's identity, it <bcp14>MAY</bcp14> use tha | ||||
| t information for reporting, logging, or other analysis purposes. | ||||
| But it <bcp14>MUST NOT</bcp14> reject the connection due to the authentication f | ||||
| ailure, as the result would be falling back to cleartext, which would leak the c | ||||
| ontent of the session to a passive network monitor.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="establish-encrypted"><name>Establishing an Encrypted Transport | ||||
| Connection</name> | ||||
| <t>When an encrypted transport connection actually completes (e.g., the TLS hand | ||||
| shake completes) at time <spanx style="verb">T1</spanx>, the recursive resolver | ||||
| sets <spanx style="verb">E-completed[X]</spanx> to <spanx style="verb">T1</spanx | ||||
| > and does the following:</t> | ||||
| <t>If the handshake completed successfully:</t> | ||||
| <t><list style="symbols"> | ||||
| <t>update <spanx style="verb">E-session[X]</spanx> so that it is in state <spa | ||||
| nx style="verb">established</spanx></t> | ||||
| <t>set <spanx style="verb">E-status[X]</spanx> to <spanx style="verb">success< | ||||
| /spanx></t> | ||||
| <t>set <spanx style="verb">E-last-response[X]</spanx> to <spanx style="verb">T | ||||
| 1</spanx></t> | ||||
| <t>set <spanx style="verb">E-completed[X]</spanx> to <spanx style="verb">T1</s | ||||
| panx></t> | ||||
| <t>for each query <spanx style="verb">Q</spanx> in <spanx style="verb">E-queri | ||||
| es[X]</spanx>: | ||||
| <list style="symbols"> | ||||
| <t>if early data was accepted and <spanx style="verb">Q</spanx> is <spanx | ||||
| style="verb">early</spanx>, | ||||
| <list style="symbols"> | ||||
| <t>set the status of <spanx style="verb">Q</spanx> to <spanx style="ve | ||||
| rb">sent</spanx></t> | ||||
| </list></t> | ||||
| <t>otherwise: | ||||
| <list style="symbols"> | ||||
| <t>send <spanx style="verb">Q</spanx> through the session (see <xref t | ||||
| arget="sending"/>), and set the status of <spanx style="verb">Q</spanx> to <span | ||||
| x style="verb">sent</spanx></t> | ||||
| </list></t> | ||||
| </list></t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="failing-to-establish-an-encrypted-transport-connection"><name>F | ||||
| ailing to Establish an Encrypted Transport Connection</name> | ||||
| <t>If, at time <spanx style="verb">T2</spanx> an encrypted transport handshake c | ||||
| ompletes with a failure (e.g., a TLS alert),</t> | ||||
| <t><list style="symbols"> | ||||
| <t>set <spanx style="verb">E-session[X]</spanx> to <spanx style="verb">null</s | ||||
| panx></t> | ||||
| <t>set <spanx style="verb">E-status[X]</spanx> to <spanx style="verb">fail</sp | ||||
| anx></t> | ||||
| <t>set <spanx style="verb">E-completed[X]</spanx> to <spanx style="verb">T2</s | ||||
| panx></t> | ||||
| <t>for each query <spanx style="verb">Q</spanx> in <spanx style="verb">E-queri | ||||
| es[X]</spanx>: | ||||
| <list style="symbols"> | ||||
| <t>if <spanx style="verb">Q</spanx> is not present in any other <spanx sty | ||||
| le="verb">any-E-queries[X]</spanx> or in <spanx style="verb">Do53-queries[X]</sp | ||||
| anx>, add <spanx style="verb">Q</spanx> to <spanx style="verb">Do53-queries[X]</ | ||||
| spanx> and send query <spanx style="verb">Q</spanx> to <spanx style="verb">X</sp | ||||
| anx> over Do53.</t> | ||||
| </list></t> | ||||
| </list></t> | ||||
| <t>Note that this failure will trigger the recursive resolver to fall back to cl | ||||
| eartext queries to the authoritative server at IP address <spanx style="verb">X< | ||||
| /spanx>. | ||||
| It will retry encrypted transport to <spanx style="verb">X</spanx> once the <spa | ||||
| nx style="verb">damping</spanx> timer has elapsed.</t> | ||||
| </section> | ||||
| <section anchor="e-failure"><name>Encrypted Transport Failure</name> | ||||
| <t>Once established, an encrypted transport might fail for a number of reasons ( | ||||
| e.g., decryption failure, or improper protocol sequence).</t> | ||||
| <t>If this happens:</t> | ||||
| <t><list style="symbols"> | ||||
| <t>set <spanx style="verb">E-session[X]</spanx> to <spanx style="verb">null</s | ||||
| panx></t> | ||||
| <t>set <spanx style="verb">E-status[X]</spanx> to <spanx style="verb">fail</sp | ||||
| anx></t> | ||||
| <t>for each query <spanx style="verb">Q</spanx> in <spanx style="verb">E-queri | ||||
| es[X]</spanx>: | ||||
| <list style="symbols"> | ||||
| <t>if <spanx style="verb">Q</spanx> is not present in any other <spanx sty | ||||
| le="verb">any-E-queries[X]</spanx> or in <spanx style="verb">Do53-queries[X]</sp | ||||
| anx>, add <spanx style="verb">Q</spanx> to <spanx style="verb">Do53-queries[X]</ | ||||
| spanx> and send query <spanx style="verb">Q</spanx> to <spanx style="verb">X</sp | ||||
| anx> over Do53.</t> | ||||
| </list></t> | ||||
| </list></t> | ||||
| <t>Note that this failure will trigger the recursive resolver to fall back to cl | ||||
| eartext queries to the authoritative server at IP address <spanx style="verb">X< | ||||
| /spanx>. | ||||
| It will retry encrypted transport to <spanx style="verb">X</spanx> once the <spa | ||||
| nx style="verb">damping</spanx> timer has elapsed.</t> | ||||
| </section> | ||||
| <section anchor="e-shutdown"><name>Handling Clean Shutdown of an Encrypted Trans | ||||
| port Connection</name> | ||||
| <t>At time <spanx style="verb">T3</spanx>, the recursive resolver may find that | ||||
| authoritative server <spanx style="verb">X</spanx> cleanly closes an existing ou | ||||
| tstanding connection (most likely due to resource exhaustion, see <xref target=" | ||||
| authoritative-resource-exhaustion"/>).</t> | ||||
| <t>When this happens:</t> | ||||
| <t><list style="symbols"> | ||||
| <t>set <spanx style="verb">E-session[X]</spanx> to <spanx style="verb">null</s | ||||
| panx></t> | ||||
| <t>for each query <spanx style="verb">Q</spanx> in <spanx style="verb">E-queri | ||||
| es[X]</spanx>: | ||||
| <list style="symbols"> | ||||
| <t>if <spanx style="verb">Q</spanx> is not present in any other <spanx sty | ||||
| le="verb">any-E-queries[X]</spanx> or in <spanx style="verb">Do53-queries[X]</sp | ||||
| anx>, add <spanx style="verb">Q</spanx> to <spanx style="verb">Do53-queries[X]</ | ||||
| spanx> and send query <spanx style="verb">Q</spanx> to <spanx style="verb">X</sp | ||||
| anx> over Do53.</t> | ||||
| </list></t> | ||||
| </list></t> | ||||
| <t>Note that this premature shutdown will trigger the recursive resolver to fall | ||||
| back to cleartext queries to the authoritative server at IP address <spanx styl | ||||
| e="verb">X</spanx>. | ||||
| Any subsequent query to <spanx style="verb">X</spanx> will retry the encrypted c | ||||
| onnection promptly.</t> | ||||
| </section> | ||||
| <section anchor="sending"><name>Sending a Query over Encrypted Transport</name> | ||||
| <t>When sending a query to an authoritative server over encrypted transport at t | ||||
| ime <spanx style="verb">T4</spanx>, the recursive resolver should take a few rea | ||||
| sonable steps to ensure privacy and efficiency.</t> | ||||
| <t>After sending query <spanx style="verb">Q</spanx>, the recursive resolver sho | ||||
| uld ensure that <spanx style="verb">Q</spanx>'s state in <spanx style="verb">E-q | ||||
| ueries[X]</spanx> is set to <spanx style="verb">sent</spanx>.</t> | ||||
| <t>The recursive resolver also sets <spanx style="verb">E-last-activity[X]</span | ||||
| x> to <spanx style="verb">T4</spanx>.</t> | ||||
| <t>In addition, the recursive resolver should consider the guidance in the follo | ||||
| wing sections.</t> | ||||
| <section anchor="pad-queries-to-mitigate-traffic-analysis"><name>Pad Queries to | ||||
| Mitigate Traffic Analysis</name> | ||||
| <t>To increase the anonymity set for each query, the recursive resolver <bcp14>S | <t>The recursive resolver should also consider the guidance in the following sub | |||
| HOULD</bcp14> use a sensible padding mechanism for all queries it sends. | sections.</t> | |||
| Specifically, a DoT client <bcp14>SHOULD</bcp14> use EDNS(0) padding <xref targe | <section anchor="pad-queries-to-mitigate-traffic-analysis"> | |||
| t="RFC7830"/>, and a DoQ client <bcp14>SHOULD</bcp14> follow the guidance in <xr | <name>Pad Queries to Mitigate Traffic Analysis</name> | |||
| ef section="5.4" sectionFormat="of" target="RFC9250"/>. | <t>To increase the anonymity set for each query, the recursive resol | |||
| ver <bcp14>SHOULD</bcp14> use a sensible padding mechanism for all queries it se | ||||
| nds. | ||||
| Specifically, a DoT client <bcp14>SHOULD</bcp14> use EDNS0 padding <xref target= | ||||
| "RFC7830"/>, and a DoQ client <bcp14>SHOULD</bcp14> follow the guidance in <xref | ||||
| section="5.4" sectionFormat="of" target="RFC9250"/>. | ||||
| How much to pad is out of scope of this document, but a reasonable suggestion ca n be found in <xref target="RFC8467"/>.</t> | How much to pad is out of scope of this document, but a reasonable suggestion ca n be found in <xref target="RFC8467"/>.</t> | |||
| </section> | ||||
| </section> | <section anchor="send-queries-in-separate-channels"> | |||
| <section anchor="send-queries-in-separate-channels"><name>Send Queries in Separa | <name>Send Queries in Separate Channels</name> | |||
| te Channels</name> | <t>When multiple queries are multiplexed on a single encrypted trans | |||
| port to a single authoritative server, the recursive resolver <bcp14>SHOULD</bcp | ||||
| <t>When multiple queries are multiplexed on a single encrypted transport to a si | 14> pipeline queries and <bcp14>MUST</bcp14> be capable of receiving responses o | |||
| ngle authoritative server, the recursive resolver <bcp14>SHOULD</bcp14> pipeline | ut of order. | |||
| queries and <bcp14>MUST</bcp14> be capable of receiving responses out of order. | ||||
| For guidance on how to best achieve this on a given encrypted transport, see <xr ef section="6.2.1.1" sectionFormat="of" target="RFC7766"/> (for DoT) and <xref s ection="5.6" sectionFormat="of" target="RFC9250"/> (for DoQ).</t> | For guidance on how to best achieve this on a given encrypted transport, see <xr ef section="6.2.1.1" sectionFormat="of" target="RFC7766"/> (for DoT) and <xref s ection="5.6" sectionFormat="of" target="RFC9250"/> (for DoQ).</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | <section anchor="receiving-encrypted"> | |||
| <section anchor="receiving-encrypted"><name>Receiving a Response over Encrypted | <name>Receiving a Response over Encrypted Transport</name> | |||
| Transport</name> | <t>Even though session-level events on encrypted transports like clean | |||
| shutdown (see <xref target="e-shutdown"/>) or encrypted transport failure (see | ||||
| <t>Even though session-level events on encrypted transports like clean shutdown | <xref target="e-failure"/>) can happen, some events happen on encrypted transpor | |||
| (see <xref target="e-shutdown"/>) or encrypted transport failure (see <xref targ | ts that are specific to a query and are not session-wide. | |||
| et="e-failure"/>) can happen, some events happen on encrypted transport that are | ||||
| specific to a query, not session-wide. | ||||
| This subsection describes how the recursive resolver deals with events related t o a specific query.</t> | This subsection describes how the recursive resolver deals with events related t o a specific query.</t> | |||
| <t>When a query-specific response <tt>R</tt> (a well-formed DNS respon | ||||
| <t>When a query-specific response <spanx style="verb">R</spanx> (a well-formed D | se or an asynchronous timeout) associated with query <tt>Q</tt> arrives at the r | |||
| NS response or an asynchronous timeout) associated with query <spanx style="verb | ecursive resolver over encrypted transport <tt>E</tt> from an authoritative serv | |||
| ">Q</spanx> arrives at the recursive resolver over encrypted transport <spanx st | er with IP address <tt>X</tt> at time <tt>T5</tt>, the recursive resolver should | |||
| yle="verb">E</spanx> from authoritative server with IP address <spanx style="ver | perform the following.</t> | |||
| b">X</spanx> at time <spanx style="verb">T5</spanx>, the recursive resolver shou | <t>If <tt>Q</tt> is not in <tt>E-queries[X]</tt>:</t> | |||
| ld:</t> | <ul spacing="normal"> | |||
| <li> | ||||
| <t>If <spanx style="verb">Q</spanx> is not in <spanx style="verb">E-queries[X]</ | <t>discard the response and process <tt>R</tt> no further (do not | |||
| spanx>:</t> | respond to an encrypted response to a query that is not outstanding).</t> | |||
| </li> | ||||
| <t><list style="symbols"> | </ul> | |||
| <t>Discard the response and process <spanx style="verb">R</spanx> no further ( | <t>Otherwise:</t> | |||
| do not respond to an encrypted response to a query that is not outstanding)</t> | <ul spacing="normal"> | |||
| </list></t> | <li> | |||
| <t>remove <tt>Q</tt> from <tt>E-queries[X]</tt>,</t> | ||||
| <t>Otherwise:</t> | </li> | |||
| <li> | ||||
| <t><list style="symbols"> | <t>set <tt>E-last-activity[X]</tt> to <tt>T5</tt>, and</t> | |||
| <t>Remove <spanx style="verb">Q</spanx> from <spanx style="verb">E-queries[X]< | </li> | |||
| /spanx></t> | <li> | |||
| <t>Set <spanx style="verb">E-last-activity[X]</spanx> to <spanx style="verb">T | <t>set <tt>E-last-response[X]</tt> to <tt>T5</tt>.</t> | |||
| 5</spanx></t> | </li> | |||
| <t>Set <spanx style="verb">E-last-response[X]</spanx> to <spanx style="verb">T | </ul> | |||
| 5</spanx></t> | <t>If <tt>Q</tt> was marked as already processed:</t> | |||
| </list></t> | <ul spacing="normal"> | |||
| <li> | ||||
| <t>If <spanx style="verb">Q</spanx> was marked as already processed:</t> | <t>discard the response and process the response no further.</t> | |||
| </li> | ||||
| <t><list style="symbols"> | </ul> | |||
| <t>Discard the response and process the response no further</t> | <t>If <tt>R</tt> is a well-formed DNS response:</t> | |||
| </list></t> | <ul spacing="normal"> | |||
| <li> | ||||
| <t>If <spanx style="verb">R</spanx> is a well-formed DNS response:</t> | <t>process <tt>R</tt> further, and</t> | |||
| </li> | ||||
| <t><list style="symbols"> | <li> | |||
| <t><spanx style="verb">R</spanx> is further processed by the recursive resolve | <t>for each supported encrypted transport <tt>N</tt> other than <t | |||
| r</t> | t>E</tt>: | |||
| <t>For each supported encrypted transport <spanx style="verb">N</spanx> other | </t> | |||
| than <spanx style="verb">E</spanx>: | <ul spacing="normal"> | |||
| <list style="symbols"> | <li> | |||
| <t>If <spanx style="verb">Q</spanx> is in <spanx style="verb">N-queries[X] | <t>if <tt>Q</tt> is in <tt>N-queries[X]</tt>, then | |||
| </spanx>: | </t> | |||
| <list style="symbols"> | <ul spacing="normal"> | |||
| <t>Mark <spanx style="verb">Q</spanx> as already processed</t> | <li> | |||
| </list></t> | <t>mark <tt>Q</tt> as already processed.</t> | |||
| </list></t> | </li> | |||
| <t>If <spanx style="verb">Q</spanx> is in <spanx style="verb">Do53-queries[X]< | </ul> | |||
| /spanx>: | </li> | |||
| <list style="symbols"> | </ul> | |||
| <t>Mark <spanx style="verb">Q</spanx> as already processed</t> | </li> | |||
| </list></t> | <li> | |||
| </list></t> | <t>If <tt>Q</tt> is in <tt>Do53-queries[X]</tt>: | |||
| </t> | ||||
| <t>But if <spanx style="verb">R</spanx> is malformed, or a failure (e.g., timeou | <ul spacing="normal"> | |||
| t):</t> | <li> | |||
| <t>mark <tt>Q</tt> as already processed.</t> | ||||
| <t><list style="symbols"> | </li> | |||
| <t>If <spanx style="verb">Q</spanx> is not in <spanx style="verb">Do53-queries | </ul> | |||
| [X]</spanx> or in any of <spanx style="verb">any-E-queries[X]</spanx>: | </li> | |||
| <list style="symbols"> | </ul> | |||
| <t>Treat this as a failed query (i.e., follow the resolver's policy for un | <t>However, if <tt>R</tt> is malformed or a failure (e.g., timeout), a | |||
| responsive or non-compliant authoritatives, such as falling back to another auth | nd</t> | |||
| oritative server, returning <spanx style="verb">SERVFAIL</spanx> to the requesti | <ul spacing="normal"> | |||
| ng client, and so on)</t> | <li> | |||
| </list></t> | <t>if <tt>Q</tt> is not in <tt>Do53-queries[X]</tt> or in any of < | |||
| </list></t> | tt>any-E-queries[X]</tt>, then | |||
| </t> | ||||
| </section> | <ul spacing="normal"> | |||
| <section anchor="recursive-resource-exhaustion"><name>Resource Exhaustion</name> | <li> | |||
| <t>treat this as a failed query (i.e., follow the resolver's p | ||||
| <t>To keep resources under control, a recursive resolver should proactively mana | olicy for unresponsive or non-compliant authoritative servers, such as falling b | |||
| ge outstanding encrypted connections. | ack to another authoritative server, returning <tt>SERVFAIL</tt> to the requesti | |||
| ng client, and so on).</t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="recursive-resource-exhaustion"> | ||||
| <name>Resource Exhaustion</name> | ||||
| <t>To keep resources under control, a recursive resolver should proact | ||||
| ively manage outstanding encrypted connections. | ||||
| <xref section="5.5" sectionFormat="of" target="RFC9250"/> offers useful guidance for clients managing DoQ connections. | <xref section="5.5" sectionFormat="of" target="RFC9250"/> offers useful guidance for clients managing DoQ connections. | |||
| <xref section="3.4" sectionFormat="of" target="RFC7858"/> offers useful guidance for clients managing DoT connections.</t> | <xref section="3.4" sectionFormat="of" target="RFC7858"/> offers useful guidance for clients managing DoT connections.</t> | |||
| <t>Even with sensible connection management, a recursive resolver doin | ||||
| g unilateral probing may find resources unexpectedly scarce and may need to clos | ||||
| e some outstanding connections.</t> | ||||
| <t>In such a situation, the recursive resolver <bcp14>SHOULD</bcp14> u | ||||
| se a reasonable prioritization scheme to close outstanding connections.</t> | ||||
| <t>Even with sensible connection management, a recursive resolver doing unilater | <t>One reasonable prioritization scheme would be to close outstanding | |||
| al probing may find resources unexpectedly scarce, and may need to close some ou | <tt>established</tt> sessions based on <tt>E-last-activity[X]</tt> (i.e, the old | |||
| tstanding connections.</t> | est timestamp gets closed first).</t> | |||
| <t>Note that when resources are limited, a recursive resolver followin | ||||
| <t>In such a situation, the recursive resolver <bcp14>SHOULD</bcp14> use a reaso | g this guidance may also choose not to initiate new connections for encrypted tr | |||
| nable prioritization scheme to close outstanding connections.</t> | ansport.</t> | |||
| </section> | ||||
| <t>One reasonable prioritization scheme would be:</t> | <section anchor="maintaining-connections"> | |||
| <name>Maintaining Connections</name> | ||||
| <t><list style="symbols"> | <t>Some recursive resolvers looking to amortize connection costs and m | |||
| <t>close outstanding <spanx style="verb">established</spanx> sessions based on | inimize latency <bcp14>MAY</bcp14> choose to synthesize queries to a particular | |||
| <spanx style="verb">E-last-activity[X]</spanx> (oldest timestamp gets closed fi | authoritative server to keep an encrypted transport session active.</t> | |||
| rst)</t> | <t>A recursive resolver that adopts this approach should try to align | |||
| </list></t> | the synthesized queries with other optimizations. | |||
| <t>Note that when resources are limited, a recursive resolver following this gui | ||||
| dance may also choose not to initiate new connections for encrypted transport.</ | ||||
| t> | ||||
| </section> | ||||
| <section anchor="maintaining-connections"><name>Maintaining Connections</name> | ||||
| <t>Some recursive resolvers looking to amortize connection costs and to minimize | ||||
| latency <bcp14>MAY</bcp14> choose to synthesize queries to a particular authori | ||||
| tative server to keep an encrypted transport session active.</t> | ||||
| <t>A recursive resolver that adopts this approach should try to align the synthe | ||||
| sized queries with other optimizations. | ||||
| For example, a recursive resolver that "pre-fetches" a particular resource recor d to keep its cache "hot" can send that query over an established encrypted tran sport session.</t> | For example, a recursive resolver that "pre-fetches" a particular resource recor d to keep its cache "hot" can send that query over an established encrypted tran sport session.</t> | |||
| </section> | ||||
| </section> | <section anchor="additional-tuning"> | |||
| <section anchor="additional-tuning"><name>Additional Tuning</name> | <name>Additional Tuning</name> | |||
| <t>A recursive resolver's state table for an authoritative server can | ||||
| <t>A recursive resolver's state table for an authoritative server can contain ad | contain additional information beyond what is described above. | |||
| ditional information beyond what is described above. | ||||
| The recursive resolver might use that additional state to change the way it inte racts with the authoritative server in the future. | The recursive resolver might use that additional state to change the way it inte racts with the authoritative server in the future. | |||
| Some examples of additional state include:</t> | Some examples of additional states include the following.</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li> | |||
| <t>Whether the server accepts "early data" over a transport such as DoQ;</t> | <t>Whether the server accepts "early data" over a transport such a | |||
| <t>Whether the server fails to respond to queries after the handshake succeeds | s DoQ.</t> | |||
| ;</t> | </li> | |||
| <t>Tracking the round trip time of queries to the server;</t> | <li> | |||
| <t>Tracking the number of timeouts (compared to the number of successful queri | <t>Whether the server fails to respond to queries after the handsh | |||
| es).</t> | ake succeeds.</t> | |||
| </list></t> | </li> | |||
| <li> | ||||
| </section> | <t>Tracking the round-trip time of queries to the server.</t> | |||
| </section> | </li> | |||
| </section> | <li> | |||
| <section anchor="iana-considerations"><name>IANA Considerations</name> | <t>Tracking the number of timeouts (compared to the number of succ | |||
| essful queries).</t> | ||||
| <t>This document has no IANA considerations.</t> | </li> | |||
| </ul> | ||||
| </section> | </section> | |||
| <section anchor="privacy-considerations"><name>Privacy Considerations</name> | </section> | |||
| </section> | ||||
| <section anchor="sni-considerations"><name>Server Name Indication</name> | <section anchor="iana-considerations"> | |||
| <name>IANA Considerations</name> | ||||
| <t>A recursive resolver querying an authoritative server over DoT or DoQ that se | <t>This document has no IANA actions.</t> | |||
| nds Server Name Indication (SNI) in the clear in the cryptographic handshake lea | </section> | |||
| ks information about the intended query to a passive network observer.</t> | <section anchor="privacy-considerations"> | |||
| <name>Privacy Considerations</name> | ||||
| <t>In particular, if two different zones refer to the same nameserver IP address | <section anchor="sni-considerations"> | |||
| es via differently-named NS records, a passive network observer can distinguish | <name>Server Name Indication</name> | |||
| the queries to one zone from the queries to the other.</t> | <t>A recursive resolver querying an authoritative server over DoT or DoQ | |||
| that sends a Server Name Indication (SNI) in the clear in the cryptographic han | ||||
| <t>Omitting SNI entirely, or using Encrypted Client Hello to hide the intended S | dshake leaks information about the intended query to a passive network observer. | |||
| NI, avoids this additional leakage. | </t> | |||
| <t>In particular, if two different zones refer to the same nameserver IP | ||||
| addresses via differently named NS records, a passive network observer can dist | ||||
| inguish the queries to one zone from the queries to the other.</t> | ||||
| <t>Omitting SNI entirely, or using Encrypted ClientHello to hide the int | ||||
| ended SNI, avoids this additional leakage. | ||||
| However, a series of queries that leak this information is still an improvement over cleartext.</t> | However, a series of queries that leak this information is still an improvement over cleartext.</t> | |||
| </section> | ||||
| </section> | <section anchor="modeling-the-probability-of-encryption"> | |||
| <section anchor="modelling-the-probability-of-encryption"><name>Modelling the Pr | <name>Modeling the Probability of Encryption</name> | |||
| obability of Encryption</name> | <t>Given that there are many parameter choices that can be made by recur | |||
| sive resolvers and authoritative servers, it is reasonable to consider the proba | ||||
| <t>Given that there are many parameter choices that can be made by recursive res | bility that queries would be encrypted. | |||
| olvers and authoritative servers, it is reasonable to consider the probability t | Such a measurement would also certainly be affected by the types of queries bein | |||
| hat queries would be encrypted. | g sent by the recursive resolver, which, in turn, is also related to the types o | |||
| Such a measurement would also certainly be affected by the types of queries bein | f queries that are sent to the recursive resolver by the stub resolvers and forw | |||
| g sent by the recursive resolver, which in turn is also related to the types of | arders downstream. | |||
| queries that are sent to the recursive resolver by the stub resolvers and forwar | ||||
| ders downstream. | ||||
| Doing this type of research would be valuable to the DNS community after initial implementation by a variety of recursive resolvers and authoritative servers be cause it would help assess the overall DNS privacy value of implementing the pro tocol. | Doing this type of research would be valuable to the DNS community after initial implementation by a variety of recursive resolvers and authoritative servers be cause it would help assess the overall DNS privacy value of implementing the pro tocol. | |||
| Thus, it would be useful if recursive resolvers and authoritative servers report ed percentages of queries sent and received over the different transports.</t> | Thus, it would be useful if recursive resolvers and authoritative servers report ed percentages of queries sent and received over the different transports.</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | <section anchor="security-considerations"> | |||
| <section anchor="security-considerations"><name>Security Considerations</name> | <name>Security Considerations</name> | |||
| <t>The guidance in this document provides defense against passive network | ||||
| <t>The guidance in this document provides defense against passive network monito | monitors for most queries. | |||
| rs for most queries. | ||||
| It does not defend against active attackers. | It does not defend against active attackers. | |||
| It can also leak some queries and their responses due to "happy eyeballs" optimi | It can also leak some queries and their responses due to Happy Eyeballs optimiza | |||
| zations when the recursive resolver's cache is cold.</t> | tions (<xref target="RFC8305"/>) when the recursive resolver's cache is cold.</t | |||
| > | ||||
| <t>Implementation of the guidance in this document should increase deployment of | <t>Implementation of the guidance in this document should increase deploym | |||
| opportunistic encrypted DNS transport between recursive resolvers and authorita | ent of opportunistic encrypted DNS transport between recursive resolvers and aut | |||
| tive servers at little operational risk.</t> | horitative servers at little operational risk.</t> | |||
| <t>However, implementers cannot rely on the guidance in this document for | ||||
| <t>However, implementers cannot rely on the guidance in this document for robust | robust defense against active attackers: they should treat it as a stepping ston | |||
| defense against active attackers, but should treat it as a stepping stone en ro | e en route to stronger defense.</t> | |||
| ute to stronger defense.</t> | <t>In particular, a recursive resolver following the guidance in this docu | |||
| ment can easily be forced by an active attacker to fall back to cleartext DNS qu | ||||
| <t>In particular, a recursive resolver following this guidance can easily be for | eries. | |||
| ced by an active attacker to fall back to cleartext DNS queries. | ||||
| Or, an active attacker could position itself as a machine-in-the-middle, which t he recursive resolver would not defend against or detect due to lack of server a uthentication. | Or, an active attacker could position itself as a machine-in-the-middle, which t he recursive resolver would not defend against or detect due to lack of server a uthentication. | |||
| Defending against these attacks without risking additional unexpected protocol f ailures would require signaling and coordination that are out of scope for this document.</t> | Defending against these attacks without risking additional unexpected protocol f ailures would require signaling and coordination that are out of scope for this document.</t> | |||
| <t>This guidance is only one part of operating a privacy-preserving DNS ec | ||||
| <t>This guidance is only one part of operating a privacy-preserving DNS ecosyste | osystem. | |||
| m. | A privacy-preserving recursive resolver should adopt other practices as well, su | |||
| A privacy-preserving recursive resolver should adopt other practices as well, su | ch as QNAME minimization (<xref target="RFC9156"/>), local root zone (<xref targ | |||
| ch as QNAME minimization (<xref target="RFC9156"/>), local root zone (<xref targ | et="RFC8806"/>), etc., to reduce the overall leakage of query information that c | |||
| et="RFC8806"/>), etc, to reduce the overall leakage of query information that co | ould infringe on the client's privacy.</t> | |||
| uld infringe on the client's privacy.</t> | </section> | |||
| <section anchor="operational-considerations"> | ||||
| </section> | <name>Operational Considerations</name> | |||
| <section anchor="operational-considerations"><name>Operational Considerations</n | <t>As recursive resolvers implement this protocol, authoritative servers w | |||
| ame> | ill see more probing on port 853 of IP addresses that are associated with NS rec | |||
| ords. | ||||
| <t>As recursive resolvers implement this protocol, authoritative servers will se | Such probing of an authoritative server should generally not cause any significa | |||
| e more probing on port 853 of IP addresses that are associated with NS records. | nt problems. If the authoritative server is not supporting this protocol, it wi | |||
| Such probing of an authoritative server should generally not cause any significa | ll not respond on port 853; if it is supporting this protocol, it will act accor | |||
| nt problems: if the authoritative server is not supporting this protocol, it wil | dingly.</t> | |||
| l not respond on port 853, and if it is supporting this protocol, it will act ac | <t>However, a system that is a public recursive resolver that supports DoT | |||
| cordingly.</t> | and/or DoQ may also have an IP address that is associated with NS records. | |||
| <t>However, a system that is a public recursive resolver that supports DoT and/o | ||||
| r DoQ may also have an IP address that is associated with NS records. | ||||
| This could be accidental (such as a glue record with the wrong target address) o r intentional. | This could be accidental (such as a glue record with the wrong target address) o r intentional. | |||
| In such a case, a recursive resolver following this protocol will look for autho | In such a case, a recursive resolver following this protocol will look for autho | |||
| ritative answers to ports 53 and 853 on that IP address, and DNS server answerin | ritative answers to ports 53 and 853 on that IP address. Additionally, the DNS s | |||
| g on port 853 would need to be able to differentiate queries for recursive answe | erver answering on port 853 would need to be able to differentiate queries for r | |||
| rs from queries for authoritative answers, for example by having the authoritati | ecursive answers from queries for authoritative answers (e.g., by having the aut | |||
| ve server handle all queries that have the Recursion Desired (RD) flag unset.</t | horitative server handle all queries that have the Recursion Desired (RD) flag u | |||
| > | nset).</t> | |||
| <t>As discussed in <xref target="security-considerations"/>, the protocol | ||||
| <t>As discussed in <xref target="security-considerations"/>, the protocol descri | described in this document provides no defense against active attackers. | |||
| bed in this document provides no defense against active attackers. | On a network where a captive portal is operating, some communications may be act | |||
| On a network where a captive portal is operating, some communications may be act | ively intercepted (e.g., when the network tries to redirect a user to complete a | |||
| ively intercepted, e.g., when the network tries to redirect a user to complete a | n interaction with a captive portal server). | |||
| n interaction with a captive portal server. | ||||
| A recursive resolver operating on a node that performs captive portal detection and Internet connectivity checks <bcp14>SHOULD</bcp14> delay encrypted transport probes to authoritative servers until after the node's Internet connectivity ch eck policy has been satisfied.</t> | A recursive resolver operating on a node that performs captive portal detection and Internet connectivity checks <bcp14>SHOULD</bcp14> delay encrypted transport probes to authoritative servers until after the node's Internet connectivity ch eck policy has been satisfied.</t> | |||
| </section> | ||||
| </section> | ||||
| <section anchor="acknowledgements"><name>Acknowledgements</name> | ||||
| <t>Many people contributed to the development of this document beyond the author | ||||
| s, including | ||||
| Alexander Mayrhofer, | ||||
| Brian Dickson, | ||||
| Christian Huitema, | ||||
| Dhruv Dhody, | ||||
| Eric Nygren, | ||||
| Erik Kline, | ||||
| Florian Obser, | ||||
| Haoyu Song, | ||||
| Jim Reid, | ||||
| Kris Shrishak, | ||||
| Peter Thomassen, | ||||
| Peter van Dijk, | ||||
| Ralf Weber, | ||||
| Rich Salz, | ||||
| Robert Evans, | ||||
| Sara Dickinson, | ||||
| Scott Hollenbeck, | ||||
| Stephane Bortzmeyer, | ||||
| Yorgos Thessalonikefs, | ||||
| and the DPRIVE working group.</t> | ||||
| </section> | ||||
| </middle> | </middle> | |||
| <back> | <back> | |||
| <references title='Normative References' anchor="sec-normative-references"> | <displayreference target="I-D.ietf-dnsop-dns-error-reporting" to="DNS-ER"/> | |||
| <displayreference target="I-D.ietf-tls-esni" to="TLS-ECH"/> | ||||
| <reference anchor="RFC2119"> | ||||
| <front> | ||||
| <title>Key words for use in RFCs to Indicate Requirement Levels</title> | ||||
| <author fullname="S. Bradner" initials="S." surname="Bradner"/> | ||||
| <date month="March" year="1997"/> | ||||
| <abstract> | ||||
| <t>In many standards track documents several words are used to signify the | ||||
| requirements in the specification. These words are often capitalized. This docu | ||||
| ment defines these words as they should be interpreted in IETF documents. This d | ||||
| ocument specifies an Internet Best Current Practices for the Internet Community, | ||||
| and requests discussion and suggestions for improvements.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="BCP" value="14"/> | ||||
| <seriesInfo name="RFC" value="2119"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC2119"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8174"> | ||||
| <front> | ||||
| <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title> | ||||
| <author fullname="B. Leiba" initials="B." surname="Leiba"/> | ||||
| <date month="May" year="2017"/> | ||||
| <abstract> | ||||
| <t>RFC 2119 specifies common key words that may be used in protocol specif | ||||
| ications. This document aims to reduce the ambiguity by clarifying that only UPP | ||||
| ERCASE usage of the key words have the defined special meanings.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="BCP" value="14"/> | ||||
| <seriesInfo name="RFC" value="8174"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8174"/> | ||||
| </reference> | ||||
| <reference anchor="RFC9250"> | ||||
| <front> | ||||
| <title>DNS over Dedicated QUIC Connections</title> | ||||
| <author fullname="C. Huitema" initials="C." surname="Huitema"/> | ||||
| <author fullname="S. Dickinson" initials="S." surname="Dickinson"/> | ||||
| <author fullname="A. Mankin" initials="A." surname="Mankin"/> | ||||
| <date month="May" year="2022"/> | ||||
| <abstract> | ||||
| <t>This document describes the use of QUIC to provide transport confidenti | ||||
| ality for DNS. The encryption provided by QUIC has similar properties to those p | ||||
| rovided by TLS, while QUIC transport eliminates the head-of-line blocking issues | ||||
| inherent with TCP and provides more efficient packet-loss recovery than UDP. DN | ||||
| S over QUIC (DoQ) has privacy properties similar to DNS over TLS (DoT) specified | ||||
| in RFC 7858, and latency characteristics similar to classic DNS over UDP. This | ||||
| specification describes the use of DoQ as a general-purpose transport for DNS an | ||||
| d includes the use of DoQ for stub to recursive, recursive to authoritative, and | ||||
| zone transfer scenarios.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="9250"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC9250"/> | ||||
| </reference> | ||||
| <reference anchor="RFC7858"> | ||||
| <front> | ||||
| <title>Specification for DNS over Transport Layer Security (TLS)</title> | ||||
| <author fullname="Z. Hu" initials="Z." surname="Hu"/> | ||||
| <author fullname="L. Zhu" initials="L." surname="Zhu"/> | ||||
| <author fullname="J. Heidemann" initials="J." surname="Heidemann"/> | ||||
| <author fullname="A. Mankin" initials="A." surname="Mankin"/> | ||||
| <author fullname="D. Wessels" initials="D." surname="Wessels"/> | ||||
| <author fullname="P. Hoffman" initials="P." surname="Hoffman"/> | ||||
| <date month="May" year="2016"/> | ||||
| <abstract> | ||||
| <t>This document describes the use of Transport Layer Security (TLS) to pr | ||||
| ovide privacy for DNS. Encryption provided by TLS eliminates opportunities for e | ||||
| avesdropping and on-path tampering with DNS queries in the network, such as disc | ||||
| ussed in RFC 7626. In addition, this document specifies two usage profiles for D | ||||
| NS over TLS and provides advice on performance considerations to minimize overhe | ||||
| ad from using TCP and TLS with DNS.</t> | ||||
| <t>This document focuses on securing stub-to-recursive traffic, as per the | ||||
| charter of the DPRIVE Working Group. It does not prevent future applications of | ||||
| the protocol to recursive-to-authoritative traffic.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="7858"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC7858"/> | ||||
| </reference> | ||||
| <reference anchor="RFC7301"> | ||||
| <front> | ||||
| <title>Transport Layer Security (TLS) Application-Layer Protocol Negotiation | ||||
| Extension</title> | ||||
| <author fullname="S. Friedl" initials="S." surname="Friedl"/> | ||||
| <author fullname="A. Popov" initials="A." surname="Popov"/> | ||||
| <author fullname="A. Langley" initials="A." surname="Langley"/> | ||||
| <author fullname="E. Stephan" initials="E." surname="Stephan"/> | ||||
| <date month="July" year="2014"/> | ||||
| <abstract> | ||||
| <t>This document describes a Transport Layer Security (TLS) extension for | ||||
| application-layer protocol negotiation within the TLS handshake. For instances i | ||||
| n which multiple application protocols are supported on the same TCP or UDP port | ||||
| , this extension allows the application layer to negotiate which protocol will b | ||||
| e used within the TLS connection.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="7301"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC7301"/> | ||||
| </reference> | ||||
| </references> | ||||
| <references title='Informative References' anchor="sec-informative-reference | ||||
| s"> | ||||
| <reference anchor="RFC7435"> | ||||
| <front> | ||||
| <title>Opportunistic Security: Some Protection Most of the Time</title> | ||||
| <author fullname="V. Dukhovni" initials="V." surname="Dukhovni"/> | ||||
| <date month="December" year="2014"/> | ||||
| <abstract> | ||||
| <t>This document defines the concept "Opportunistic Security" in the conte | ||||
| xt of communications protocols. Protocol designs based on Opportunistic Security | ||||
| use encryption even when authentication is not available, and use authenticatio | ||||
| n when possible, thereby removing barriers to the widespread use of encryption o | ||||
| n the Internet.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="7435"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC7435"/> | ||||
| </reference> | ||||
| <reference anchor="RFC1035"> | ||||
| <front> | ||||
| <title>Domain names - implementation and specification</title> | ||||
| <author fullname="P. Mockapetris" initials="P." surname="Mockapetris"/> | ||||
| <date month="November" year="1987"/> | ||||
| <abstract> | ||||
| <t>This RFC is the revised specification of the protocol and format used i | ||||
| n the implementation of the Domain Name System. It obsoletes RFC-883. This memo | ||||
| documents the details of the domain name client - server communication.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="STD" value="13"/> | ||||
| <seriesInfo name="RFC" value="1035"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC1035"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8484"> | ||||
| <front> | ||||
| <title>DNS Queries over HTTPS (DoH)</title> | ||||
| <author fullname="P. Hoffman" initials="P." surname="Hoffman"/> | ||||
| <author fullname="P. McManus" initials="P." surname="McManus"/> | ||||
| <date month="October" year="2018"/> | ||||
| <abstract> | ||||
| <t>This document defines a protocol for sending DNS queries and getting DN | ||||
| S responses over HTTPS. Each DNS query-response pair is mapped into an HTTP exch | ||||
| ange.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8484"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8484"/> | ||||
| </reference> | ||||
| <reference anchor="RFC7830"> | ||||
| <front> | ||||
| <title>The EDNS(0) Padding Option</title> | ||||
| <author fullname="A. Mayrhofer" initials="A." surname="Mayrhofer"/> | ||||
| <date month="May" year="2016"/> | ||||
| <abstract> | ||||
| <t>This document specifies the EDNS(0) "Padding" option, which allows DNS | ||||
| clients and servers to pad request and response messages by a variable number of | ||||
| octets.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="7830"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC7830"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8467"> | ||||
| <front> | ||||
| <title>Padding Policies for Extension Mechanisms for DNS (EDNS(0))</title> | ||||
| <author fullname="A. Mayrhofer" initials="A." surname="Mayrhofer"/> | ||||
| <date month="October" year="2018"/> | ||||
| <abstract> | ||||
| <t>RFC 7830 specifies the "Padding" option for Extension Mechanisms for DN | ||||
| S (EDNS(0)) but does not specify the actual padding length for specific applicat | ||||
| ions. This memo lists the possible options ("padding policies"), discusses the i | ||||
| mplications of each option, and provides a recommended (experimental) option.</t | ||||
| > | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8467"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8467"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8305"> | ||||
| <front> | ||||
| <title>Happy Eyeballs Version 2: Better Connectivity Using Concurrency</titl | ||||
| e> | ||||
| <author fullname="D. Schinazi" initials="D." surname="Schinazi"/> | ||||
| <author fullname="T. Pauly" initials="T." surname="Pauly"/> | ||||
| <date month="December" year="2017"/> | ||||
| <abstract> | ||||
| <t>Many communication protocols operating over the modern Internet use hos | ||||
| tnames. These often resolve to multiple IP addresses, each of which may have dif | ||||
| ferent performance and connectivity characteristics. Since specific addresses or | ||||
| address families (IPv4 or IPv6) may be blocked, broken, or sub-optimal on a net | ||||
| work, clients that attempt multiple connections in parallel have a chance of est | ||||
| ablishing a connection more quickly. This document specifies requirements for al | ||||
| gorithms that reduce this user-visible delay and provides an example algorithm, | ||||
| referred to as "Happy Eyeballs". This document obsoletes the original algorithm | ||||
| description in RFC 6555.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8305"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8305"/> | ||||
| </reference> | ||||
| <reference anchor="I-D.ietf-tls-esni"> | ||||
| <front> | ||||
| <title>TLS Encrypted Client Hello</title> | ||||
| <author fullname="Eric Rescorla" initials="E." surname="Rescorla"> | ||||
| <organization>RTFM, Inc.</organization> | ||||
| </author> | ||||
| <author fullname="Kazuho Oku" initials="K." surname="Oku"> | ||||
| <organization>Fastly</organization> | ||||
| </author> | ||||
| <author fullname="Nick Sullivan" initials="N." surname="Sullivan"> | ||||
| <organization>Cloudflare</organization> | ||||
| </author> | ||||
| <author fullname="Christopher A. Wood" initials="C. A." surname="Wood"> | ||||
| <organization>Cloudflare</organization> | ||||
| </author> | ||||
| <date day="9" month="October" year="2023"/> | ||||
| <abstract> | ||||
| <t> This document describes a mechanism in Transport Layer Security (T | ||||
| LS) | ||||
| for encrypting a ClientHello message under a server public key. | ||||
| Discussion Venues | ||||
| This note is to be removed before publishing as an RFC. | ||||
| Source for this draft and an issue tracker can be found at | ||||
| https://github.com/tlswg/draft-ietf-tls-esni | ||||
| (https://github.com/tlswg/draft-ietf-tls-esni). | ||||
| </t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="Internet-Draft" value="draft-ietf-tls-esni-17"/> | ||||
| </reference> | ||||
| <reference anchor="RFC7766"> | ||||
| <front> | ||||
| <title>DNS Transport over TCP - Implementation Requirements</title> | ||||
| <author fullname="J. Dickinson" initials="J." surname="Dickinson"/> | ||||
| <author fullname="S. Dickinson" initials="S." surname="Dickinson"/> | ||||
| <author fullname="R. Bellis" initials="R." surname="Bellis"/> | ||||
| <author fullname="A. Mankin" initials="A." surname="Mankin"/> | ||||
| <author fullname="D. Wessels" initials="D." surname="Wessels"/> | ||||
| <date month="March" year="2016"/> | ||||
| <abstract> | ||||
| <t>This document specifies the requirement for support of TCP as a transpo | ||||
| rt protocol for DNS implementations and provides guidelines towards DNS-over-TCP | ||||
| performance on par with that of DNS-over-UDP. This document obsoletes RFC 5966 | ||||
| and therefore updates RFC 1035 and RFC 1123.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="7766"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC7766"/> | ||||
| </reference> | ||||
| <reference anchor="RFC9156"> | ||||
| <front> | ||||
| <title>DNS Query Name Minimisation to Improve Privacy</title> | ||||
| <author fullname="S. Bortzmeyer" initials="S." surname="Bortzmeyer"/> | ||||
| <author fullname="R. Dolmans" initials="R." surname="Dolmans"/> | ||||
| <author fullname="P. Hoffman" initials="P." surname="Hoffman"/> | ||||
| <date month="November" year="2021"/> | ||||
| <abstract> | ||||
| <t>This document describes a technique called "QNAME minimisation" to impr | ||||
| ove DNS privacy, where the DNS resolver no longer always sends the full original | ||||
| QNAME and original QTYPE to the upstream name server. This document obsoletes R | ||||
| FC 7816.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="9156"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC9156"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8806"> | ||||
| <front> | ||||
| <title>Running a Root Server Local to a Resolver</title> | ||||
| <author fullname="W. Kumari" initials="W." surname="Kumari"/> | ||||
| <author fullname="P. Hoffman" initials="P." surname="Hoffman"/> | ||||
| <date month="June" year="2020"/> | ||||
| <abstract> | ||||
| <t>Some DNS recursive resolvers have longer-than-desired round-trip times | ||||
| to the closest DNS root server; those resolvers may have difficulty getting resp | ||||
| onses from the root servers, such as during a network attack. Some DNS recursive | ||||
| resolver operators want to prevent snooping by third parties of requests sent t | ||||
| o DNS root servers. In both cases, resolvers can greatly decrease the round-trip | ||||
| time and prevent observation of requests by serving a copy of the full root zon | ||||
| e on the same server, such as on a loopback address or in the resolver software. | ||||
| This document shows how to start and maintain such a copy of the root zone that | ||||
| does not cause problems for other users of the DNS, at the cost of adding some | ||||
| operational fragility for the operator.</t> | ||||
| <t>This document obsoletes RFC 7706.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8806"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8806"/> | ||||
| </reference> | ||||
| <reference anchor="MTA-STS"> | ||||
| <front> | ||||
| <title>SMTP MTA Strict Transport Security (MTA-STS)</title> | ||||
| <author fullname="D. Margolis" initials="D." surname="Margolis"/> | ||||
| <author fullname="M. Risher" initials="M." surname="Risher"/> | ||||
| <author fullname="B. Ramakrishnan" initials="B." surname="Ramakrishnan"/> | ||||
| <author fullname="A. Brotman" initials="A." surname="Brotman"/> | ||||
| <author fullname="J. Jones" initials="J." surname="Jones"/> | ||||
| <date month="September" year="2018"/> | ||||
| <abstract> | ||||
| <t>SMTP MTA Strict Transport Security (MTA-STS) is a mechanism enabling ma | ||||
| il service providers (SPs) to declare their ability to receive Transport Layer S | ||||
| ecurity (TLS) secure SMTP connections and to specify whether sending SMTP server | ||||
| s should refuse to deliver to MX hosts that do not offer TLS with a trusted serv | ||||
| er certificate.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8461"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8461"/> | ||||
| </reference> | ||||
| <reference anchor="DANE-SMTP"> | ||||
| <front> | ||||
| <title>SMTP Security via Opportunistic DNS-Based Authentication of Named Ent | ||||
| ities (DANE) Transport Layer Security (TLS)</title> | ||||
| <author fullname="V. Dukhovni" initials="V." surname="Dukhovni"/> | ||||
| <author fullname="W. Hardaker" initials="W." surname="Hardaker"/> | ||||
| <date month="October" year="2015"/> | ||||
| <abstract> | ||||
| <t>This memo describes a downgrade-resistant protocol for SMTP transport s | ||||
| ecurity between Message Transfer Agents (MTAs), based on the DNS-Based Authentic | ||||
| ation of Named Entities (DANE) TLSA DNS record. Adoption of this protocol enable | ||||
| s an incremental transition of the Internet email backbone to one using encrypte | ||||
| d and authenticated Transport Layer Security (TLS).</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="7672"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC7672"/> | ||||
| </reference> | ||||
| <reference anchor="TLSRPT"> | ||||
| <front> | ||||
| <title>SMTP TLS Reporting</title> | ||||
| <author fullname="D. Margolis" initials="D." surname="Margolis"/> | ||||
| <author fullname="A. Brotman" initials="A." surname="Brotman"/> | ||||
| <author fullname="B. Ramakrishnan" initials="B." surname="Ramakrishnan"/> | ||||
| <author fullname="J. Jones" initials="J." surname="Jones"/> | ||||
| <author fullname="M. Risher" initials="M." surname="Risher"/> | ||||
| <date month="September" year="2018"/> | ||||
| <abstract> | ||||
| <t>A number of protocols exist for establishing encrypted channels between | ||||
| SMTP Mail Transfer Agents (MTAs), including STARTTLS, DNS- Based Authentication | ||||
| of Named Entities (DANE) TLSA, and MTA Strict Transport Security (MTA-STS). The | ||||
| se protocols can fail due to misconfiguration or active attack, leading to undel | ||||
| ivered messages or delivery over unencrypted or unauthenticated channels. This d | ||||
| ocument describes a reporting mechanism and format by which sending systems can | ||||
| share statistics and specific information about potential failures with recipien | ||||
| t domains. Recipient domains can then use this information to both detect potent | ||||
| ial attacks and diagnose unintentional misconfigurations.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8460"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8460"/> | ||||
| </reference> | ||||
| <reference anchor="DNS-Error-Reporting"> | ||||
| <front> | ||||
| <title>DNS Error Reporting</title> | ||||
| <author fullname="Roy Arends" initials="R." surname="Arends"> | ||||
| <organization>ICANN</organization> | ||||
| </author> | ||||
| <author fullname="Matt Larson" initials="M." surname="Larson"> | ||||
| <organization>ICANN</organization> | ||||
| </author> | ||||
| <date day="11" month="October" year="2023"/> | ||||
| <abstract> | ||||
| <t> DNS error reporting is a lightweight reporting mechanism that | ||||
| provides the operator of an authoritative server with reports on DNS | ||||
| resource records that fail to resolve or validate. A domain owner or | ||||
| DNS hosting organization can use these reports to improve domain | ||||
| hosting. The reports are based on extended DNS errors as described | ||||
| in RFC 8914. | ||||
| When a domain name fails to resolve or validate due to a | <references> | |||
| misconfiguration or an attack, the operator of the authoritative | <name>References</name> | |||
| server may be unaware of this. To mitigate this lack of feedback, | <references anchor="sec-normative-references"> | |||
| this document describes a method for a validating recursive resolver | <name>Normative References</name> | |||
| to automatically signal an error to a monitoring agent specified by | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | |||
| the authoritative server. | 119.xml"/> | |||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
| 301.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
| 858.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
| 174.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | ||||
| 250.xml"/> | ||||
| </t> | </references> | |||
| </abstract> | <references anchor="sec-informative-references"> | |||
| </front> | <name>Informative References</name> | |||
| <seriesInfo name="Internet-Draft" value="draft-ietf-dnsop-dns-error-reporting | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1 | |||
| -06"/> | 035.xml"/> | |||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
| 435.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
| 672.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
| 766.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
| 830.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
| 305.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
| 460.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
| 461.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
| 467.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
| 484.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
| 806.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | ||||
| 102.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | ||||
| 156.xml"/> | ||||
| </reference> | <!-- [I-D.ietf-tls-esni] IESG state I-D Exists --> | |||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.i | ||||
| etf-tls-esni.xml"/> | ||||
| <reference anchor="RFC9102"> | <!-- [I-D.ietf-dnsop-dns-error-reporting] IESG state Waiting for AD Go-Ahead --> | |||
| <front> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D. | |||
| <title>TLS DNSSEC Chain Extension</title> | ietf-dnsop-dns-error-reporting.xml"/> | |||
| <author fullname="V. Dukhovni" initials="V." surname="Dukhovni"/> | ||||
| <author fullname="S. Huque" initials="S." surname="Huque"/> | ||||
| <author fullname="W. Toorop" initials="W." surname="Toorop"/> | ||||
| <author fullname="P. Wouters" initials="P." surname="Wouters"/> | ||||
| <author fullname="M. Shore" initials="M." surname="Shore"/> | ||||
| <date month="August" year="2021"/> | ||||
| <abstract> | ||||
| <t>This document describes an experimental TLS extension for the in-band t | ||||
| ransport of the complete set of records that can be validated by DNSSEC and that | ||||
| are needed to perform DNS-Based Authentication of Named Entities (DANE) of a TL | ||||
| S server. This extension obviates the need to perform separate, out-of-band DNS | ||||
| lookups. When the requisite DNS records do not exist, the extension conveys a de | ||||
| nial-of-existence proof that can be validated.</t> | ||||
| <t>This experimental extension is developed outside the IETF and is publis | ||||
| hed here to guide implementation of the extension and to ensure interoperability | ||||
| among implementations.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="9102"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC9102"/> | ||||
| </reference> | ||||
| </references> | ||||
| </references> | </references> | |||
| <?line 671?> | <section anchor="assessing-the-experiment"> | |||
| <name>Assessing the Experiment</name> | ||||
| <section anchor="early-implementations"><name>Early Implementations</name> | <t>This document is an Experimental RFC. | |||
| <t>[ RFC Editor: please remove this section before publication ]</t> | ||||
| <t>This appendix lists some of the implementations of the protocol as it finishe | ||||
| d working group last call in the DPRIVE Working Group. | ||||
| This list reflects reporting from the DNS community.</t> | ||||
| <t><list style="symbols"> | ||||
| <t>The Unbound resolver has initial experimental code paths to probe over DoT< | ||||
| /t> | ||||
| <t>The Drink authoritative server supports DoT</t> | ||||
| <t>The check-soa tool can probe over DoT</t> | ||||
| <t>The Bleau tool can probe over DoT through RIPE Atlas probes</t> | ||||
| <t>The PowerDNS Recursor resolver can probe over DoT</t> | ||||
| <t>Nameservers for various DNS zones support DoT. These include the root zone | ||||
| (one of the 13 root server identifiers), a social media site, some DNS software | ||||
| developers, and others</t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="assessing-the-experiment"><name>Assessing the Experiment</name> | ||||
| <t>This document is published as an experimental RFC. | ||||
| In order to assess the success of the experiment, some key metrics could be coll ected by the technical community about the deployment of the protocol in this do cument. | In order to assess the success of the experiment, some key metrics could be coll ected by the technical community about the deployment of the protocol in this do cument. | |||
| These metrics will be collected in recursive resolvers, authoritative servers, a nd the networks containing them. | These metrics will be collected in recursive resolvers, authoritative servers, a nd the networks containing them. | |||
| Some key metrics include:</t> | Some key metrics include the following.</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li> | |||
| <t>Comparison of the CPU and memory use between Do53 and encrypted transports< | <t>Comparison of the CPU and memory use between Do53 and encrypted tra | |||
| /t> | nsports.</t> | |||
| <t>Comparison of the query response rates between Do53 and encrypted transport | </li> | |||
| s</t> | <li> | |||
| <t>Measurement of server authentication successes and failures</t> | <t>Comparison of the query response rates between Do53 and encrypted t | |||
| <t>Measurement and descriptions of observed attack traffic, if any</t> | ransports.</t> | |||
| <t>Comparison of transactional bandwidth (ingress/egress, packets per second, | </li> | |||
| bytes per second) between Do53 and encrypted transports</t> | <li> | |||
| </list></t> | <t>Measurement of server authentication successes and failures.</t> | |||
| </li> | ||||
| </section> | <li> | |||
| <section anchor="adding-auth"><name>Defense Against Active Attackers</name> | <t>Measurement and descriptions of observed attack traffic, if any.</t | |||
| > | ||||
| <t>The protocol described in this document provides no defense against active at | </li> | |||
| tackers. | <li> | |||
| <t>Comparison of transactional bandwidth (ingress/egress, packets per | ||||
| second, bytes per second) between Do53 and encrypted transports.</t> | ||||
| </li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="adding-auth"> | ||||
| <name>Defense against Active Attackers</name> | ||||
| <t>The protocol described in this document provides no defense against act | ||||
| ive attackers. | ||||
| A future protocol for recursive-to-authoritative DNS might want to provide such protection.</t> | A future protocol for recursive-to-authoritative DNS might want to provide such protection.</t> | |||
| <t>This appendix assumes that the use case for that future protocol is a r | ||||
| <t>This appendix assumes that the use case for that future protocol is a recursi | ecursive resolver that wants to prevent an active attack on communication betwee | |||
| ve resolver that wants to prevent an active attack on communication between it a | n it and an authoritative server that has committed to offering encrypted DNS tr | |||
| nd an authoritative server that has committed to offering encrypted DNS transpor | ansport. | |||
| t. | An inherent part of this use case is that the recursive resolver would want to r | |||
| An inherent part of this use case is that the recursive resolver would want to r | espond with a <tt>SERVFAIL</tt> response to its client if it cannot make an auth | |||
| espond with a <spanx style="verb">SERVFAIL</spanx> response to its client if it | enticated encrypted connection to any of the authoritative nameservers for a nam | |||
| cannot make an authenticated encrypted connection to any of the authoritative na | e.</t> | |||
| meservers for a name.</t> | <t>However, an authoritative server that merely offers encrypted transport | |||
| (for example, by following the guidance in <xref target="authoritative-guidance | ||||
| <t>However, an authoritative server that merely offers encrypted transport (for | "/>) has made no such commitment, and no recursive resolver that prioritizes del | |||
| example, by following the guidance in <xref target="authoritative-guidance"/>) h | ivery of DNS records to its clients would want to "fail closed" unilaterally.</t | |||
| as made no such commitment, and no recursive resolver that prioritizes delivery | > | |||
| of DNS records to its clients would want to "fail closed" unilaterally.</t> | <t>Therefore, such a future protocol would need at least three major disti | |||
| nctions from the protocol described in this document:</t> | ||||
| <t>So such a future protocol would need at least three major distinctions from t | <ul spacing="normal"> | |||
| he protocol described in this document:</t> | <li> | |||
| <t>A signaling mechanism that tells the recursive resolver that the au | ||||
| <t><list style="symbols"> | thoritative server intends to offer authenticated encryption.</t> | |||
| <t>A signaling mechanism that tells the recursive resolver that the authoritat | </li> | |||
| ive server intends to offer authenticated encryption</t> | <li> | |||
| <t>Authentication of the authoritative server</t> | <t>Authentication of the authoritative server.</t> | |||
| <t>A way to combine defense against an active attacker with the defenses descr | </li> | |||
| ibed in this document</t> | <li> | |||
| </list></t> | <t>A way to combine defense against an active attacker with the defens | |||
| es described in this document.</t> | ||||
| <t>This can be thought of as a DNS analog to <xref target="MTA-STS"/> or <xref t | </li> | |||
| arget="DANE-SMTP"/>.</t> | </ul> | |||
| <t>This can be thought of as a DNS analog to <xref target="RFC8461"/> or < | ||||
| <section anchor="signaling-mechanism-properties"><name>Signaling Mechanism Prope | xref target="RFC7672"/>.</t> | |||
| rties</name> | <section anchor="signaling-mechanism-properties"> | |||
| <name>Signaling Mechanism Properties</name> | ||||
| <t>To defend against an active attacker, the signaling mechanism needs to be abl | <t>To defend against an active attacker, the signaling mechanism needs t | |||
| e to indicate that the recursive resolver should "fail closed" if it cannot auth | o be able to indicate that the recursive resolver should fail closed if it canno | |||
| enticate the server for a particular query.</t> | t authenticate the server for a particular query.</t> | |||
| <t>The signaling mechanism itself would have to be resistant to downgrad | ||||
| <t>The signaling mechanism itself would have to be resistant to downgrade attack | e attacks from active attackers.</t> | |||
| s from active attackers.</t> | <t>One open question is how such a signal should be scoped. | |||
| While this document scopes opportunistic state about encrypted transport based o | ||||
| <t>One open question is how such a signal should be scoped. | n the IP addresses of the client and server, signaled intent to offer encrypted | |||
| While this document scopes opportunistic state about encrypted transport based o | transport is more likely to be scoped by the queried zone in the DNS or by the n | |||
| n the IP addresses of the client and server, signaled intent to offer encrypted | ameserver name than by the IP address.</t> | |||
| transport is more likely to be scoped by queried zone in the DNS, or by nameserv | <t>A reasonable authoritative server operator or zone administrator prob | |||
| er name than by IP address.</t> | ably doesn't want to risk breaking anything when they first enable the signal. | |||
| <t>A reasonable authoritative server operator or zone administrator probably doe | ||||
| sn't want to risk breaking anything when they first enable the signal. | ||||
| Therefore, a signaling mechanism should probably also offer a means to report pr oblems to the authoritative server operator without the client failing closed. | Therefore, a signaling mechanism should probably also offer a means to report pr oblems to the authoritative server operator without the client failing closed. | |||
| Such a mechanism is likely to be similar to <xref target="TLSRPT"/> or <xref tar | Such a mechanism is likely to be similar to those described in <xref target="RFC | |||
| get="DNS-Error-Reporting"/>.</t> | 8460"/> or <xref target="I-D.ietf-dnsop-dns-error-reporting"/>.</t> | |||
| </section> | ||||
| </section> | <section anchor="authentication-of-authoritative-server"> | |||
| <section anchor="authentication-of-authoritative-server"><name>Authentication of | <name>Authentication of Authoritative Servers</name> | |||
| Authoritative Server</name> | <t>Forms of server authentication might include:</t> | |||
| <ul spacing="normal"> | ||||
| <t>Forms of server authentication might include:</t> | <li> | |||
| <t>An X.509 certificate issued by a widely known certification autho | ||||
| <t><list style="symbols"> | rity associated with the common NS names used for this authoritative server.</t> | |||
| <t>an X.509 Certificate issued by a widely-known certification authority assoc | </li> | |||
| iated with the common NS names used for this authoritative server</t> | <li> | |||
| <t>DANE authentication (to avoid infinite recursion, the DNS records necessary | <t>DNS-Based Authentication of Named Entities (DANE) (to avoid infin | |||
| to authenticate could be transmitted in the TLS handshake using the DNSSEC Chai | ite recursion, the DNS records necessary to authenticate could be transmitted in | |||
| n Extension (see <xref target="RFC9102"/>))</t> | the TLS handshake using the DNSSEC chain extension (see <xref target="RFC9102"/ | |||
| </list></t> | >)).</t> | |||
| </li> | ||||
| <t>A recursive resolver would have to verify the server's identity. | </ul> | |||
| <t>A recursive resolver would have to verify the server's identity. | ||||
| When doing so, the identity would presumably be based on the NS name used for a given query or the IP address of the server.</t> | When doing so, the identity would presumably be based on the NS name used for a given query or the IP address of the server.</t> | |||
| </section> | ||||
| </section> | <section anchor="combining-protocols"> | |||
| <section anchor="combining-protocols"><name>Combining Protocols</name> | <name>Combining Protocols</name> | |||
| <t>If this protocol gains reasonable adoption, and a newer protocol that | ||||
| <t>If this protocol gains reasonable adoption, and a newer protocol that can off | can offer defense against an active attacker were available, deployment is like | |||
| er defense against an active attacker were available, deployment is likely to be | ly to be staggered and incomplete. | |||
| staggered and incomplete. | This means that an operator that wants to maximize confidentiality for their use | |||
| This means that an operator that want to maximize confidentiality for their user | rs will want to use both protocols together.</t> | |||
| s will want to use both protocols together.</t> | <t>Any new stronger protocol should consider how it interacts with the o | |||
| pportunistic protocol defined here, so that operators are not faced with the cho | ||||
| <t>Any new stronger protocol should consider how it interacts with the opportuni | ice between widespread opportunistic protection against passive attackers (this | |||
| stic protocol defined here, so that operators are not faced with the choice betw | document) and more narrowly targeted protection against active attackers.</t> | |||
| een widespread opportunistic protection against passive attackers (this document | </section> | |||
| ) and more narrowly-targeted protection against active attackers.</t> | </section> | |||
| <section anchor="acknowledgements" numbered="false"> | ||||
| </section> | <name>Acknowledgements</name> | |||
| </section> | <t>Many people contributed to the development of this document beyond the | |||
| <section anchor="document-considerations"><name>Document Considerations</name> | authors, including | |||
| <contact fullname="Alexander Mayrhofer"/>, | ||||
| <t>[ RFC Editor: please remove this section before publication ]</t> | <contact fullname="Brian Dickson"/>, | |||
| <contact fullname="Christian Huitema"/>, | ||||
| <section anchor="document-history"><name>Document History</name> | <contact fullname="Dhruv Dhody"/>, | |||
| <contact fullname="Eric Nygren"/>, | ||||
| <section anchor="substantive-changes-from-12-to-13"><name>Substantive Changes fr | <contact fullname="Erik Kline"/>, | |||
| om -12 to -13</name> | <contact fullname="Florian Obser"/>, | |||
| <contact fullname="Haoyu Song"/>, | ||||
| <t><list style="symbols"> | <contact fullname="Jim Reid"/>, | |||
| <t>Changes based on IESG review</t> | <contact fullname="Kris Shrishak"/>, | |||
| </list></t> | <contact fullname="Peter Thomassen"/>, | |||
| <contact fullname="Peter van Dijk"/>, | ||||
| </section> | <contact fullname="Ralf Weber"/>, | |||
| <section anchor="substantive-changes-from-11-to-12"><name>Substantive Changes fr | <contact fullname="Rich Salz"/>, | |||
| om -11 to -12</name> | <contact fullname="Robert Evans"/>, | |||
| <contact fullname="Sara Dickinson"/>, | ||||
| <t><list style="symbols"> | <contact fullname="Scott Hollenbeck"/>, | |||
| <t>Editorial changes received during IETF Last Call</t> | <contact fullname="Stephane Bortzmeyer"/>, | |||
| </list></t> | <contact fullname="Yorgos Thessalonikefs"/>, | |||
| and the DPRIVE Working Group.</t> | ||||
| </section> | </section> | |||
| <section anchor="substantive-changes-from-10-to-11"><name>Substantive Changes fr | ||||
| om -10 to -11</name> | ||||
| <t><list style="symbols"> | ||||
| <t>Editorial changes to prepare for IETF Last Call</t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="substantive-changes-from-09-to-10"><name>Substantive Changes fr | ||||
| om -09 to -10</name> | ||||
| <t><list style="symbols"> | ||||
| <t>Responded to AD review from Eric Vyncke</t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="substantive-changes-from-08-to-09"><name>Substantive Changes fr | ||||
| om -08 to -09</name> | ||||
| <t><list style="symbols"> | ||||
| <t>Added section with metrics for assessing the experiment</t> | ||||
| <t>Updated the definition of unsuccessful responses to encrypted queries</t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="substantive-changes-from-07-to-08"><name>Substantive Changes fr | ||||
| om -07 to -08</name> | ||||
| <t><list style="symbols"> | ||||
| <t>Changed status to Experimental</t> | ||||
| <t>Added operational considerations section</t> | ||||
| <t>Many many editorial updates</t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="substantive-changes-from-06-to-07"><name>Substantive Changes fr | ||||
| om -06 to -07</name> | ||||
| <t><list style="symbols"> | ||||
| <t>Updated how to handle responses from encrypted transports that are slower t | ||||
| hat Do53</t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="substantive-changes-from-05-to-06"><name>Substantive Changes fr | ||||
| om -05 to -06</name> | ||||
| <t><list style="symbols"> | ||||
| <t>Clarified the optinality of the protocol</t> | ||||
| <t>Spelled out the current scope of DoT and DoQ</t> | ||||
| <t>Clarified that responses must be the same on all transports</t> | ||||
| <t>Loosened requirement for the resolver to know all its addresses</t> | ||||
| <t>Changed examples of unsuccessful responses to timeouts and connection faile | ||||
| d</t> | ||||
| <t>Expanded acknowledgements</t> | ||||
| <t>Added preliminary implementation status</t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="substantive-changes-from-03-to-04"><name>Substantive Changes fr | ||||
| om -03 to -04</name> | ||||
| <t><list style="symbols"> | ||||
| <t>Clarified that "completed handshake" in Table 2 also includes resumed sessi | ||||
| ons.</t> | ||||
| <t>In Section 4.6.1, specified not to use Do53 even when the last successful c | ||||
| onnection is far in the past.</t> | ||||
| <t>In Section 4.6.3, clarified that an established connection in the establish | ||||
| ed state should not be resumed prematurely.</t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="substantive-changes-from-02-to-03"><name>Substantive Changes fr | ||||
| om -02 to -03</name> | ||||
| <t><list style="symbols"> | ||||
| <t>Added an Additional Tuning section on recursive resolvers recording other d | ||||
| ata about an authoritative server's capabilities for future interactions (thank | ||||
| you again Sara Dickinson!). | ||||
| Feedback from operators on how the extra information would be used by a recursiv | ||||
| e resolver that retains such an expanded state table is particularly welcome.</t | ||||
| > | ||||
| <t>Added more text about sharing session state information.</t> | ||||
| <t>Added section on modelling the probability of encryption as a future task.< | ||||
| /t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="substantive-changes-from-01-to-02"><name>Substantive Changes fr | ||||
| om -01 to -02</name> | ||||
| <t><list style="symbols"> | ||||
| <t>Removed EDNS Client Subnet recommendations from the probing policy: recursi | ||||
| ve resolvers implementing the guidance provided in this draft intend to enhance | ||||
| privacy for their users' queries, and although ECS is a valuable feature, it rep | ||||
| resents a privacy risk. Therefore, a future document encompassing a "how to add | ||||
| privacy" approach could serve for better discussion on this discrepancy (thank y | ||||
| ou Puneet Sood!).</t> | ||||
| <t>Added text on padding queries and responses to mitigate traffic analysis (t | ||||
| hank you Sara Dickinson!).</t> | ||||
| <t>Put draft on standards track</t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="substantive-changes-from-00-to-01"><name>Substantive Changes fr | ||||
| om -00 to -01</name> | ||||
| <t><list style="symbols"> | ||||
| <t>Moved discussion of non-opportunistic encryption to an appendix</t> | ||||
| <t>Clarify state transitions when sending over encrypted transport</t> | ||||
| <t>Introduced new field <spanx style="verb">E-last-response[X]</spanx> for com | ||||
| parison with persistence</t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="substantive-changes-from-01-to-02-now-draft-ietf-dprive-unilate | ||||
| ral-probing-00"><name>Substantive Changes from -01 to -02 (now draft-ietf-dprive | ||||
| -unilateral-probing-00)</name> | ||||
| <t><list style="symbols"> | ||||
| <t>Clarify that deployment to a pool does not need to be strictly simultaneous | ||||
| </t> | ||||
| <t>Explain why authoritatives need to serve the same records regardless of SNI | ||||
| </t> | ||||
| <t>Defer to external, protocol-specific references for resource management</t> | ||||
| <t>Clarify that probed connections must not fail due to authentication failure | ||||
| </t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section anchor="draft-dkgjsal-dprive-unilateral-probing-substantive-changes-fro | ||||
| m-00-to-01"><name>draft-dkgjsal-dprive-unilateral-probing Substantive Changes fr | ||||
| om -00 to -01</name> | ||||
| <t><list style="symbols"> | ||||
| <t>Fallback to cleartext when encrypted transport fails.</t> | ||||
| <t>Reduce default <spanx style="verb">timeout</spanx> to 4s</t> | ||||
| <t>Clarify SNI guidance: OK for selecting server credentials, not OK for chang | ||||
| ing answers</t> | ||||
| <t>Document ALPN and port numbers</t> | ||||
| <t>Justify sorting recursive resolver state by authoritative IP address</t> | ||||
| </list></t> | ||||
| </section> | ||||
| </section> | ||||
| </section> | ||||
| </back> | </back> | |||
| <!-- ##markdown-source: | ||||
| H4sIAAAAAAAAA+196XLjVrLmfz4FrvzD0gRJS7XYZd3eZEnlUrsWVUlut6On | ||||
| YwQRhyRcIMAGQLHo6nqXeZZ5sskvM88CEKBU7ntjbkzc/uFWgcBZ8+Ty5XJG | ||||
| o9GgTuvMHEc/5mkW16aMs+jNclmU9SpPqzqdRGdmmRWbhcnrqJhG5/mk3Cxr | ||||
| k0TvzGRVVumdGdXF6GRVz4syreOaHkRnr68G8e1tae4a7fpvt19PikkeL2gc | ||||
| SRlP61Fq6ukoWZZofuVaGC3L4jbNZ6Ojx4MJPZoV5eY4Mh+Wg0G6LI+julxV | ||||
| 9aPDw28PHw3i0sTHUZrXg3VRvp+VxWpJjXOLg/dmQw+T4+gip3ZzU4/O0Oug | ||||
| Wt0u0qpKi/x6s6SxXJxfPx/cmXxljgdRpG3snV2+u/jL+R49qfmtvZ+oAxpV | ||||
| 9D1ewPNFnGb0PMmrETqMJ5s/YULjopzh57iczOnneV0vq+OvvsLbeEQjG9vX | ||||
| vsKDr27LYl2Zr4J2vsL3pVkWwfcz2sD4djwpFl8l72df9a4aPsWjqg4+pi/G | ||||
| 2kBa9H9L/Q6qOs6T/xVnRU6T3phqMIh5G7E2o4j+E9FyV8fR2Tj6YRx9n2bZ | ||||
| oij5sezsWZynJot+iOd541ea7nF0sjBlOonz6DS9S7PoZXpryjo1FeinyPm9 | ||||
| qi6NobEfPXoafVcWcRJd1WP+ZZLWRAevzTr6mbZiGL3+WR4XCXV7dHh4+ET/ | ||||
| vcprUMyPVyf8wNLoyenLH/mBkZ2jRfnTNJ3Wc5pdRc/yMdEIv1AWOCsmSWse | ||||
| /MjP+s/j6CrO4l/jcMp/Lsym8VhGepLFv6xMFgejfHT46PCoOcrTd+GYfqGm | ||||
| ZlWc/WmGf2O37xnQ5Th6UUynNPpgQJfxKms85sW/OD15/bp7ibT3JX03nst3 | ||||
| f8I+5aDS7RGk+bQoF3ysjwe5/3M0GtFq0w7Gk3owuJ6nVUQnfsVcpTJ1FRUr | ||||
| +qM2yyqq53ENlkDPyztTVtF+aTkNUX5VZPyQSDGKG1xEXz+IQEV1/N5Enoyz | ||||
| TbS/Tult6iXONzRNOv5pTh8WeYQfoqKemzJaGm6hLqLETA11gXH8Y2XKTaQH | ||||
| MIpnMS0vNUNrUvGgiDbAYqJFkWMNxjQ9o3NJaSSNuWJst4Zbj8EIb6nBPKJF | ||||
| QUNxXceT96YcRrdYDRptluDtKl0sMxod5pyZqorKtHq/kVGCN2PJcuq+NNGy | ||||
| WJtySnvM469MNR7wcGYF8V9i383R0N/UCDefTjfcfkVLkGi7lucXDXlgHBen | ||||
| 3cwr/CTzxPYEIqG5O/NiKf0zu4/MpKg2tEaL8eCnNKG5mbjatLrFu6ucfsw2 | ||||
| 4K5d/dLu0cyb47uNK5rXIt5E03iSZhiA4bamq3pFS0QznKRTomHefOqHqLLI | ||||
| ZzQGbr+YlfFyTu0Q56vNBC9VbtObayz7hSUGeS/SJMnMYPAFpEpZJCv+tk3s | ||||
| cbrgRafW72ji0WyVJnE+MXiGheGtxpuWyIslETCRVRWt50W0jqkNu2cbWpP4 | ||||
| NjPBUN1I28RZ3Or5oNFe5PQzcdfJiuTOMErraErDI2LBei7MhKgprRZ6EpVi | ||||
| 46TgtW+cKaLezzqbwyg8hCS3s5QYYsdpxHbpiYxZDIxlGd1q6fJVrb2vMBpi | ||||
| sdF+ZUz08eMf3z0//ebJ46efPh1EtEVKQqAmOgj5TKe45oPG/a3TymC6StCT | ||||
| zGCF7KhTbMuUBBU1IFyjjNaGWE2OJ46OwAIrpiwdjh5CTwRZVUS3ZWqmtIip | ||||
| UgtNZh/nPinor7ygbS75jAu9bg7oCK2J6ygVY8uLSZER2c3mtN2mXNBK6qn3 | ||||
| TGqLt2BmHz/GSQI1Cpv06ZOOzrVIyzopSf4mES0I7cN0ik2t5yR9aatoCU0N | ||||
| ergjUoxnhql561gf05mILj1ZTsti4WjSjoXXyHJYyHqsOs42zeSW6NaYPKCv | ||||
| XqoaU1cnERSCRbzE4keYPXaEVMBsRORPu0vEhj5AO7Tj1SSmY8Nb6NlKeOAt | ||||
| q6ThTIlXSBe0Y8mMT2pVLMAHaDo4fsGWtE5h3MkxDMmIwRdfkAb9j1Va8mmv | ||||
| opdxPlvRespmkIYaQUWtor1XP15d7w3l/6PXb/jvd+dvf7x4d36Gv69enLx8 | ||||
| 6f4Y6BtXL978+PLM/+W/PH3z6tX56zP5mJ5GjUeDvVcnP9MvWO29N5fXF29e | ||||
| n7zc2xZkpF5jIfio0KFYgihof6qBpx765rvTy//zv4+eEMX9G53ER0dH3376 | ||||
| pP94dvTNE/rHem5y6a3I6TDIP4mcNoN4uaTDh1aI1xAbWtK2Z8RC4gqicZ0z | ||||
| ddJC/o+/YWX+fhz97nayPHryB32ACTce2jVrPOQ1236y9bEsYsejjm7cajae | ||||
| t1a6Od6Tnxv/tusePPzdH7M0N9Ho6Nkf/zBg6rnGkc+LrJhtBgNvZR0PjrFY | ||||
| LBe2ZLdq846hmQ+wf0g12GbB4NAqhBuceDA4K54+Ri90Nkjpow/wPRhlTc3x | ||||
| eS7u8D4E9NPH0b6w4aNDZsP4/C2+pvdGeG9Eu3KKl0AU3z56eqgvXTdeun55 | ||||
| Zd/55tnTZ/zO+bZCUPFHxVsmKGqD5pVlhjlgtoFovixT8A+eR7dgJjaazqAy | ||||
| LOk053VKkyNZS1y0ssvhKdyxTHRH38Zp4gU4RDYRb2V4ALTolqU5voGlck1M | ||||
| 5kU6YX2N9vYV8a9F+iu+em1mwu0uZBS9zHr7iLoZcWPBjOig5bZZO7lJTBoA | ||||
| K6S1tM+EQlPu0Lsq5rJ4T7i9ylHWEfC4Er3GgGTpxNqXlYLkZZxx2p7FgmgT | ||||
| tjxTnXACvE9P8zvoEwlmVSahImC2R69N0vTdyjg9D9OtWb6Ei0EMjIWU+UCr | ||||
| zgLmlvpepwnRPq1E8yd6gKWg4S5Xdaw0D4VnVbLcPr38kUe+MMTvIdIDBesA | ||||
| TfH0HUFhgjEr3VYNVVWSrBSWuaAM1qdW/CtZVWVM6gWplBA0NMs1WdIJM1zu | ||||
| CYOLieCvtKEDpqJLuxSnQluDwUmGcz+btyjFqn+NJaN+Ya/VZoals8QRGGas | ||||
| OTptZVZAEsAkqclixNdMH9qi2xbbkmF6o3eKylMzmgyXjo+wHOW3QxY5DXIX | ||||
| vmRnoaSBT5oqfpNvRFW8UXpJa6KAPwS6r+hrrMqtbmHDeO1DFQEWP6RJiHY4 | ||||
| B88rnV3DuFDUQIPGUXQRLBKJyTtecNEYSMRlOkrHXRz90lrusKecYjK4QHMl | ||||
| LwWmhinRI1ELWfUnLUO09S2VapKlrHvsUK10Td92r6nya9fxcz3pwboV7ZYn | ||||
| ZLQQFx7ycxwIbbIMtSHs9SrXPkHnzDCiOl3wQVyDh9Ma88BLMe+q1e0vxGlZ | ||||
| 6OWzgsUcpq+qvN2d7/vV3S0OavuvxBYVJhDQpDdnmlPRrZRFHLcljacGWqOV | ||||
| abRt5d2L6+vLqyHzR9aLcCQN+nxh5emzJ89IfzoYulGTas4C2B6tmN+WLSaG | ||||
| aRLmf+9zsiKEGROjC3nHC+L0yZLWrY5+fPdSOHHN3AgrTPtZUkOQHEVoIzIr | ||||
| U37VtgTFzjVJOql9l2BnkKXrnIe+Zb4L77eQ8TSu5rSioQmGkcjebzNox5LH | ||||
| gwsyv1aTeThWzIMbhp1EoikZNk9cH1qzWiYM1oCWJ7wliWIKC4jr6HtrlWIx | ||||
| mtD2lWJYH79onIKRNWQ/PZwY6W+rF8qqdx/Yk7zzF+gXRcWWb+F1lOb8d3TO | ||||
| GrX/jI4jKXwVABgz0DNRlHwkilw0v2dPH9Pi/CeN5uRnyy4cD6OGQAQnLy9f | ||||
| R/snnrGOXsYb6tDJQtKnChLCNVOV2iLfPD48orMkAoRbIMmn+IDtgSiQzBA+ | ||||
| WNTrjOaSiy3tmXTIwdis7pu9mzFWIFg7XuVlsVxlFrMigl4WsOjZgGamEhML | ||||
| bLb6K+1CRCQZQzgJaiZKmxEA0+tt406lOZrHd9xdWuJcslwjrYrsZT6RbgwV | ||||
| 9CaWnCJdAGSmQAdYpNkB2s7rrd6HZDc3WxPRU5qMzxdpjywJ9814Nh5G5/T1 | ||||
| 4YFohFk8c8+vT6PbtD7QQdzFpHDdxlAqVOdwHY6BdImSwLa0HHfmkx5htONh | ||||
| CopD5UNwX96TW+PXviTds0wYh9Um4Abiv33HrH4VRbbl67IM4TszTyG8opdw | ||||
| ZHwXZ+AG5RafWFIbFTGJq2Jr10OIHCTp9EPWCmkm9Cnz9vAr0vHgxRFzREeQ | ||||
| 0QhGt3YEvL/lKmeFKI5wSMlUubgk7T6htRJ1fh2X3IYFbqBYm8WtQjqi7BYZ | ||||
| rz8z4TiAdsH2k/QuTUgr6foKy6kq6MzUjvnSR2ZJEkqEEFObiScK3OOsdQmg | ||||
| KZl/xVrwvgBrbZ1bx4w/MbExoBGLzcamsE6BB5el78mU9DJc5Slrk2DRsZ35 | ||||
| VECirgnKqJrczqs6W9xuPU8zNcLxFN0OW1qWsig5EYA+XV9MCrqJnbyIx46h | ||||
| QreqLNrHrgD3sDRTVpE7TEFoN3Ru7gqYvl42Jw4ZAEZRsuJG4lv0BV3P7f0a | ||||
| +nFb2DsSmEVMtbxalcqBgAl1ra0i4u60dgx5vzrgfU2tiRLnogNNzRomQJGT | ||||
| qrQvg6zsm48P7U+kchVlazRoB8cocsdoES8ruy2QC6YSGcWDtAN3bEtf9KcM | ||||
| ZjP3IppcxxHVU1jZM/gVDS538GXebbbTAFidFLOra/1Az7nltHdpbL1atKvs | ||||
| F6tWrK3JeWIh2E0UV2Rlg4kCMDYlXChLOCy2zQHlYMKGmanw2QZynW8m0DH8 | ||||
| qpB2U9FagMCqgFSmrpWUIZc4mhs6wsXM5ER0zPJqM2REiwTJcsnQMFGjbl5F | ||||
| WzyZQxbpjLZ2Q0SDl3U6WNoKeOKqplIa0L5S/XjwnEkAGiXpojM+ZjwCni50 | ||||
| OZ1qRhJXnAkhKTB7Z5+Bch8ajuj4gGkyo2r49csrCMdLUE7EqJonCVkDpmeT | ||||
| ZSyI6QlOCi+EdEFqCW2eepja5I0lTic4qwtg23TkEbaAFkSEsxRFCIO4P+2G | ||||
| 5JZxQpeu5iyoDIdYRM5XDLkN9GBSkk4pZ5cnmpKSmPD2riZQ9IGgU0erhegJ | ||||
| ImVPGqbXYPC8aUCEcifuUcccM4eVxGcEG830EqgDGKyVp75DGsSb3LpoQwcm | ||||
| 0VlZQECJd+mXVcUKU+D6i4ENTkdpRUYgmSKkV6CfbDOyIu+v46eH30YTBEKw | ||||
| 4U1r+xNR9tzCD/4HRVV4dWl+9ShLgZzRUuC06L/ocKyW1lvjR6quNWcn4T09 | ||||
| 5QL5LLAQAGCx0UJXonOLjch6MTyEtEdLoSkl6ZZl56kxpBGEHGRJsCgcNZBF | ||||
| lz9cjIQ/BvMUz7hYpSn2zPuh2B3OVj/RtgUDcQCFTETvil5DJlwQn1FLva1v | ||||
| VXn6qUNv97qWegxjNTloyUgVDAnOqkRiowiO1tP5/tXrC2GqjBHTEWc0vvZL | ||||
| Q8qcQIZE7C+KtWEZqeJT37G+Dvm3s4AhXdl/xOMV1uXlDXUc7dMmqcacxZP3 | ||||
| IG0ej+6Eg4Jls4cBrmDB4S6LH72pDoFORCOhnuQPHDI2NphcWYdRlYXnghgV | ||||
| rAf0PlVweA6iWmVF8V4ZpvWf6VzPP8xpaJ0batdjZNw72GBmgyNSgWOcjI6J | ||||
| IH7gvTFLhhmchAsYKikozLZ6mMqQf1sQ+YvRBLujEh9CyJVNvRKX5W2hcAxj | ||||
| 3MFmbyv+lrdiiLyYxI5XAANV2bCotOfQwH0wl4XEvgR6AiYBEW3RHVHn+GXf | ||||
| EAdhsN1UFtmwZzQarsJMT/wt6I4PJhuWXYtIM/348UrX4un4KVbHw4rR/t6p | ||||
| X6oXOGmIYjuw9EU0BIkwC9EXvzbUtVjXb/s6fDx+YjsUbPgzG75uNtxr7SMM | ||||
| hT5YQdyZShBYJVxPlKrnsiONAb8MGprdH7dhrBt1xVw0LODGML6ET8TQxEr2 | ||||
| WIn/61crvC400CEWAG2VxxBt6ZIFUMc4hzqycFAr+iR0h0AM3YKlpLmlmjHb | ||||
| Z3FV2ICVcBhRReoXkfnaBjxBv9nqhU0x4vgwI6wNq8wWGg+RqPCsFAyZgeJ9 | ||||
| CD9SvINHM8SacdtJNE3Lqj5gmyPv6+++zkDfAJxbr22Iu2YJut7+ZXsItA0/ | ||||
| zQOykBU0bBKK9wpMcri9tZbCwAlYP0zMhN3EglSSOCaVZt088Xi/W2UHZBEj | ||||
| rjcARF5Zb+i1+BuiE9JrN1VaMZ9oqGxxXuSbBYJviKvxmWH73OIrO4avpC/C | ||||
| pSLFk72jSwlSCRQTViuyLIBsUogOmGuIG3COVVEv4lsEf22c97Hb+oUGkfi+ | ||||
| LK6VkflSQyuzZuDthoUXHT2T3qmmD4Bq//BAcSvraOBdHg+uAl/akAH26475 | ||||
| 2ibsADRk6dlj8L906qYkqlYsnphGKwGY0MQ3PF990uSrrEpEC0wM2mjMmiGw | ||||
| dWjak0KxrBCCELUrDk9wtZrhaKEDRcmnxYrBk8j6J77+hkHQFj7uwsZZfGeK | ||||
| jneAMb8dGe/gj6rkVlZ4r2r2TQfKzLLI0gnR7ir1Omyg1rFvG59yxGZX3BtZ | ||||
| eQHaBE+0tiiCUainWmUcLTkl0awMVny8FZSkKp3lTDPwEpks3qiN84LIcpSR | ||||
| QpBFb+5gh5k1c25ramIfmezYZZ9HiNBoQ0ROs2F9HbFlJmVTwiofLddWUyu4 | ||||
| 7m4LYLdgCGtW/O4NFPVuYNZc4KAT/UtgPSfF4mhf9M4LMmeF4PGX/Zy05tUS | ||||
| Bx04W6yM1fm4ZoUY7GLNd2tn6t3aPalYRxYaoF2zYpsqrr3qB26kzvH8S+FR | ||||
| njcID8YeRQJkjQfvYmwFO9QZnxGm5r9YVRbD3LWo1jap/IJKpJQEas3ImpYV | ||||
| u7chkGfVS0FTGnMlEh5Rq5iIMFm3BBeXYxFpHOfZ0dPuDvwOCNRFLwOLEF9j | ||||
| wIRIv14pkp+K5SBA5JRMBWansCbzEcI2aPeZbQnvZNnuYTmFbxHWTqdUJKfQ | ||||
| vHCdpfXqcghmJ+TVWjtFoj5+NAyzpNV85D5SmFlAFavXBawjZvzMOK+2e+nW | ||||
| gNPLKnBcocRacLx2Y5iNQBiNKIpTMpMlLLLlkWBkiNjaxWV0IpATMxdqE+yI | ||||
| V9EySQ0I2fTunBjzYrexnxd4Io1wBnlsA3/7z6VsjAfafAAKvAaTbCW7qt7H | ||||
| YxtZ09UUqb2B02L3i2x37uMF8WNj8LBQLdSLX9jJJhHRBa9kFZiotDUYGCxU | ||||
| xEgvt3z+tPmk2km4LELRofeFqxkEJjmoHPs8maRAABjIgjwYDkA6DrCyQjHy | ||||
| YXr1ugiWjR0j2mK0327uAGS6KBh4tMDiHHGXuShUnU4GosLU3AVhXN07qbZU | ||||
| x1FxIA5ik+EE0i9K6ItMzBMRzl3HDKjFGlk5Q1rErBYeAY2HDjkfH9VTG8uE | ||||
| oBsL2troxuji9NUlFrC2YY/c/irnYTB7WRDl0JZ5JTCR6CAsrmiIQMVpib8j | ||||
| naCqigncysqnBW91wezNJQq9aYGHGYqUJwOEua3ABRl0bBOCDxtPJNid9f+P | ||||
| H7vch8JvPn6EHTDigbGzm6FS8wGBaAahJqR3Jwx7dm8oDkkS3eTV4Vg/QhLS | ||||
| jXLPSl4T1GgN04A6yjKJbRoiTgDH9ubR4eHRcXL77Pj4mxvrxwDnq4RnWeXP | ||||
| RgS3P3rmu4uJB8yQkLPvY0815HQEGXrQgDhPtukY6RR210zV3rCb11c3whcE | ||||
| 3o7ZQ9Acv5xi1qf2MIZ8T0a3vUaKp/Z40E6Ey4uHIFARuug/SSuSZXxO6LA2 | ||||
| l0bsZ8ifYSPWkynGEqY1nkQsQJ2ESbWtlUdXpgY1Vz2u1UYMw+4wGqeYwTCU | ||||
| iNHRGmDvXZyRBBZ8BThXYqYxFORlXNLK16q3I5zUP2FjF0lRpm77hK3J6dHr | ||||
| Tu6jIZCxBe3dTIQNOORPQ1Ztvzgg7ByJJyVZZZ0ONlrUj8cRZ9T+fu/d9qLJ | ||||
| 5MNWl937vPdpwGjxP6OzQLT/M7oSswuhFbJWSD3652ik/x3cUHsVO5Em5obe | ||||
| h6XHDjO1Qu5RuO5TdAMk4Y/U+uMoASvaf/T0WyJE5yAd3CRE+0QXv2UEq/zz | ||||
| xnCEMUT7z75+0hiByrzPGME6Tmv1XBBhpYgRalBQANsCnypANbXBEJ7YfttS | ||||
| n53mzMgLJa6b37mJ/GE0LYobCfOcChTBjIefOgpx8EXXUoSt3Yyb/PyGjLlR | ||||
| gxqEPaTif1A3m8lnYvqJAm0lep/Z6HZJfPA9kmIeA6oItjGEzfECxkbjPXGe | ||||
| UkAkrHGoQmNdqeVtSjMsO20I+kLi/m7ObzhsOIsnDF00VkXcCTknF4MXLkyc | ||||
| s7Fq+jisaO4rcMjGgvL45opCO6Oz4lCivrZoaEM2WViflSy/m/ORI06f48kY | ||||
| e1XD4cnBNDRK3kH3ajoN7EEWt7ZjXs2hzUGwn7594Kdvb7aUVVYlSDSuFqGW | ||||
| 1+kkSVUVjtl13YZCvWS2XjHRt0yyE5VrqO7RzV9vFL3hLtIqcmg2DL4KkyCZ | ||||
| rz387a9/t69vB9zGNXHfZS2Zs4Hm7KLUJerE5oUamYUoABb3a2a62HntYwwH | ||||
| zkLdxoYuSHgYQG1eaceq7d0WWU36yl4Ac/KKIzPHYgDb7X1ZhUPNbeyKyLM5 | ||||
| WSGVBOP3fm0+AKOh6TiCZviHYzYvwhTUolQ9KkjX6/I/BLqc6r8udaAzd8wZ | ||||
| RLyLyxXbyOoq8u4KVRAkQKWhBlgP4Jba0kiqC4HFRnQmw9duuE3Ns4vSd8S/ | ||||
| co6MQGlBKGcqYc7IxELOv8RhqebZDspjPdMH8Hb1r2BvM1RWm4Parujdv/T1 | ||||
| 2zHnXTmadhGdfetRxyU8tdenly7kd6hQFfEgjqOlhvdukqK+2Rsj8euz2/7x | ||||
| 7N62/4G2Bz9xkFx3WkvxkOz0no1vq7lVg7R1YYVhisOlMUMmAQ1QZobLam6X | ||||
| pFjlHFFqAUBprGq2lhUkw+ZkrvvIl3ZgaVBj5dq1HXhRBez5+EVgCg76wF2d | ||||
| nHjBLdBhUxu4Hadxd0c5K1QyqRm9ScwHH1QQ8HdtsbMJi5N1BrM1glS6aYkW | ||||
| 6nVR71ZsxOej0xPkzJRN+hjRcFszVsdoMI9U9b04cEulfgtb2kQ67aY3DpMy | ||||
| 7OtZIlW47g+ZY5poxIkF5uDR4eENL1/wjP66Gcq2QOsQI4ds9YRlwcRW4pju | ||||
| WACx5Nur0FqCodU4OuYHPFCkmh+2Vbd+oAGFx4y1VCAxlR9iX9eL+L34A31W | ||||
| NsvipQRhd1JXIwLah25yIJENBUeeH8TEysbhLnxqZgDKONBOCw90wjAH4y2v | ||||
| DQqivG9iRs0IEVVZtBbEqia7AwvcSTt6YB0pBy06GJrWQuPvxO5upr+za8Yi | ||||
| 3zUD2Yp6u484UJCjkiRaGTqd2uBbAfgBJtC0sV10LcLKbDxgnTK9SySje3px | ||||
| NtwKZsQziVCmLjVtQzOA7Gc+TjASf0ixWGCUWtSAtUl28TJLZu+Vz0k0OhaZ | ||||
| rXhk6gIKSRA3bPOtNJfIMqGdfqtKHVcar2cJQGXEyDJOG4Au7saek8ShleKr | ||||
| BHorEHBuxEsQhottrwidpSzzhR28rxyxj/SKAyChHVZz1NJBJjNk1yQtSbpC | ||||
| w5dk5XPx8TPFqTWj+LgA3c6vMUXGavVgkEZi+6c4dC6GUqxySWWMbvJVlt0c | ||||
| 3we48AEAyNJGYIefC728MzyrE0F/3uFElQH80vifPBrc6NoDheCQBAs3Jv5k | ||||
| SiUU0caHXedUHBM++9f6d1g37jx/nVZt4wAeIC+VLGU3vlQMJFlUlhEKsyHN | ||||
| VnRccSwAKz2ObpZiG93gtN4Eg8ZM82Jw4wAUnjqSCGoSfGiG3Q3qVt3mc/Q2 | ||||
| KovdWHjlvu/1rYBQ94ViJoziwGMkp0LyqjlnUC0fF4ZcydEwyYHtHdNcVej6 | ||||
| PKcfSt4xWW/gC4psyOQBt8pf1t4ehvvsAeVgSn602mFGtsTIIrPoV5w2btJo | ||||
| IJy4S6ISu9RHfgUrqk0HAdPScFVrtGfAECy72+coEz96b28dWN+XxSuUf8nS | ||||
| sYswLRr4oV1fHYeqQTIG+oespa/8Ugt3FlwA+H6n277JFuawqny4vWwb0SOi | ||||
| qGkbblY5oI4bDoi/4T+VPHm9OU6RuN4D1tu+2rnM1GBLy/TnSrkeePVshsyx | ||||
| 2giQnNbIP/BZWluRftBCvB/UpWP/ZOkJua+BwzfolCZuF1vEZHu6MqihrPME | ||||
| no1GLL4Hpd7DoFG4uxSG18xttmaLLeXEgYu0/Bocl0BZYnOJC/ho7Pf9IOk5 | ||||
| oFEgOZIXEACW7hDyHBQsbeoxDfQNDbSxpA6c1LGrvx19+2h8OH40fkKdl2aJ | ||||
| gE0O9Z6bgEKcczSkkWZAqNXeEY3BeFtzIK6bhywHiYjR+cgdoHBNID3UY5T3 | ||||
| RCaMbS0IRlUvJSjp4xe2lKZEKX3SEMROvZKU70lxZ3UFTpJQnLx5SOH+lgyD | ||||
| rZ+CAHoby+KCRaotvI8FUGlQtONOV2MrlcXGhjfiwpo+zi0+TE0HdjkIX4sB | ||||
| hFEWIZIliSDLyqxof4rEBQCU6kyukD4zm2tiE1TNTT6Zl0WOtCNa4RmxT3ZL | ||||
| L+jjrBce/LIKdT4NPe3J775uaFXhwBmFWCpDdrzIlkzgpA/dSFfZx+2lbp2m | ||||
| TEQ314c3GlzlywC5FadWVlVlVWlOTrqtOEywRlEXLshQSn1DwLOsU4x7YYYF | ||||
| MmMSA1MKB0uCGIpA2VNzuBU7xUy9uNM8HcuVdimVjNJagO6gAQ10kr0AA5Y1 | ||||
| CLeUQSAvjnuVeFTtXFLnQmcgH6nFKqtT4LJW1kkOlC6Xnafyi0BBDiheIywr | ||||
| 1ZlcXN4QkC+n2dGC7b2Il8tNdL4xt4jP2nOFIh4fPmXb01kExLRhMDTfVwcH | ||||
| R7k4Dsri3NjMaQkwCYWUZKO6vCnA6VyVKubYWYR5iB4m2PetGE1pvpLXnd7o | ||||
| 970JDeG8plVYzsoXDNJQRyHMzNxx2lqD5yHpRxH86G2TeEQGPJxw2I+TOpxX | ||||
| P/LHcF5AypOKbnojo3y5sCZBwyNE03RD46AmkoAqzVkKppUNLm7q2haSKfUT | ||||
| 1n/sF05NVSVg//owGkXno4auSS8fRL+LQj+hCiQrYpQhgi66PXocahkmRwXg | ||||
| cu1C6xOX2bDWEDEbChu8DlqyXhdhTx/q9rlHwl2tlRot0OSywULnk9U/bTJa | ||||
| p5lpAUYsysOd3yzVJQ91VvTuuECAffus3MGWUKoKFnp0VAwILraZZdZPps67 | ||||
| vMvbxbT+zkemuxD+kOBdOKazHW7e3ZDCL5lQ0P60XoMP2G9IM7VuWk93xU+R | ||||
| tl5PxCcmo795e0PMr+QyBP14LJJGnI/NuyolzJRTg3sDB9taRN/GsIJ7zPIN | ||||
| Y1Ljt2txbR3LCbdJC0ZEZqst7Sv3s4FlfBD80N0683MlAg1ewmcBrR60aRqj | ||||
| Ao0tYo6PhpmT0bomKEPMYzEJj+ydWdDi8Ou8NFvjp3fOSFzHZaJ1j6X2ReB+ | ||||
| 0UHiICw75ynL9O5Ggq76qOXBw9GW7CK6+fQjXfTR8wehRmDTUozcb2zK5kRj | ||||
| R1G0ehS9oqUViuxY3MHgO9QacvNexJnMmbWO2EUka5587EIs2V3afyQOeJnS | ||||
| NtmpIGoq+nawo+gaypRaxZX2TvPWRKN0bMbD0PUaaJWagiC5DD5HG8O0gdFZ | ||||
| yjFNjSIhPuIRod5cLESDveNclIBu65xU9lXJIcM3V+fv/vL85OLlTeTc0Bxt | ||||
| LS70VPOxLYQrLOxCVC3hYaetmJEOx5ZTUD9PXN4voJ3OF3P+FKeUOJjD3KXg | ||||
| fE0J2GDtDDdAYwjKeFsdiGV/UDYFH9bzUovymW14Sh0KKhbVidDrXhHXecXi | ||||
| urNgtijMvIkyPq0HgQgU73fvj4vpXdVUyjKxEdJav56lghG2u0vxuIQab0M9 | ||||
| CDSD7WH18AdE6xokYrqAVy7z0rY7usaua9cXVCimVhnAJ8AYpMwYl5WpbZCp | ||||
| uqggiqe0c3O8cQ+G0Rc/jNV0PKXrFEiPDq/loYALqzLogY+//j36Q+RDkySJ | ||||
| hdkPIi1bbWMb2azj5sKXvAqKd2xrnQmOjfxki//Kqvcuca80Fzp+GOFhTWNf | ||||
| SMTi2z0avVPI+7TrbvVbTYVufDjUxx0uzLr4HyIbO9mr17uFx2/hBgY/64Kn | ||||
| IUd1frZgKXqD1oSeAvDYts/x9PRsI65gddp5ol8WS9QdK6YuUIAkBwbrPV6b | ||||
| FnCsHFXHNw51odBCPhUj4QVpIEUAoQf5da2m841vs2tBPHncR1x8nUSTQPiC | ||||
| B6YNJf3mTmCRrw+h8LDncFuhz83a83iBs7UzzozzHhY+wQeRajLBKcSpZ3Oh | ||||
| z1pgbZN0moVssBaJtCdiSzMaarUrRdEVPBcPjyLqcSV1TZYlnzKWTexvPBAr | ||||
| 5IvoHG9GZ3EdDwavCmKvPZWIGIGAn/do/FhhNjYE5/YyBBaUe9wx17bb80qr | ||||
| WosqjTrJw7krxUnbF1Yl+rhuXNUgiV3snstASgU01m7CmwnYLWt9w+J18pOI | ||||
| OC1UAxRU4XDJgf6ukfbGmda+saLgGh22h2OclGxmBDsdQlSI0PS0wQIrdviz | ||||
| dtomj/BCEglLUbJwug2+VKqx5PDO+5iu1ceEmDz78FPXsWxx7n0rnPm2CfpS | ||||
| Y8CIQbsDxPqs5vLvjIxgHTTghVs+ME9lXSru2KpenTYojJOMEb7tdnuHtlxV | ||||
| c4lccRGbyjPrDg5s17W3nI0PcpNSNrCcFg88h0PxZ9jj1fAYs48HRWrs0Yx3 | ||||
| V7VRKg0PpUDAihjDmyzmh61/LMzHVUsvSkfFKCRjg0iDlGz1YDAP7qiPGNZG | ||||
| FGgWtYwKqWklQCfiLv896NNVyrOFaBAOIqC9VgbzZKn+cfjoUCCKTT8U0LIl | ||||
| CGhQF7kuaJFP09mqtMlQLnok90XlMUfxaaW81EVQzmOdlsZWp9QbNBJMLUad | ||||
| gSi6lmRzn++DItOkh4eu0dC/J4mYInJcTLgkMC7iBDWWwloiKOffiB+vUbUq | ||||
| LPsXdJOZ+D1KYkDei17zIa03PeFK02a6vONVbaQUS6Mno7nDDFir4thzQ9BO | ||||
| YynIS9rVjUtPksxj1jRcsYNWnQRxbnlbtSGUAMhfjM74krdRnVUjgzP66cBB | ||||
| okjns2toT3pnlGe76Nl3LnRJEn/DigbNQyNXCgVp+s0MRKVvLleTGHXFa0Mc | ||||
| l6tRrgwm+bpckTpKPYzT4pc+wxGrR7/gvin/HhxgHFMGYlFLUubD8tnTrpR3 | ||||
| wPA5XCYrZjP+A74gASa0PgmKa+MQkeRnKKf2hbJKw3XCW2I1WZlw+4Nq3gr2 | ||||
| DG3RQYWuXbWaNkbiIMBhI3oJ+xoefe9Jd2r5jjvFGCA5twauLUCyO9j34xdd | ||||
| 2ecOCr4P5Jbs3GzjwmxcBV4MGzLDK+HulQNGdsWHeLQDgjXsVWkYP6o0H934 | ||||
| 5N2Gyn3szvJ2v0kA3mcbFglSRa9tuVZaqiGtmwZyiB0M+sxZa/P5F9rOFDcH | ||||
| /0rnFOln5+jz4HgnWMm2faBCAheWUwhkGFagYIlWSWd8Uy3ybbWOpwENjVt2 | ||||
| d14d+6+0xRCU6sWiFMO7pyem3ed0ilRDdWR8Pw1jy4cBST266SPcDlpUP/o2 | ||||
| WsvFDDNiXzSBwILrRDh6iYEN+53b/OiztzmAhZWjOnhY0IQthJjVjg7HxZDr | ||||
| Gtl9aP+q25Ynwai2HVSNqCZg9rqOWkEmnc1M+7oHb1kVzBe3mWIIfvZq0nG9 | ||||
| FbVzUdsUxLo7H9BNgA1I4IEuC1WAOUSLmSxeknJj+WkH7T3XSRLzHOmEP6HG | ||||
| J6qgeR4x7CNDCRrAh6o4+hx+UR8cE02MXEYXShjRIUvkdgWloTkzfGIc8ptW | ||||
| WqWhgT/8Nur9b/L8r0uetuQhaZFI6ryar+oEdgxHDT9A+I8q/QIVLx0Lfdwv | ||||
| lfnSzJThiLjunjqm0KhRWDWCahvZn4ENHxYZUU2rs7hgV/aEfTEs4fnJFc37 | ||||
| 3OPw/xHBL1GLWe40taTx/4T2TwC0titY6PCDQ1E3QtPDUElGurj4aG/UThe1 | ||||
| f/zCaiJKCy5j14+hL0e9F/32usaT+yIIBBaW3NuwNJ5cY+xKaLubg2l7jdZp | ||||
| nWCyJ9PaeJTD7fx9vYaVuen1L61baRux41zv2mti/UF47LazSnkjXNirM09u | ||||
| mvlL943TVZTBayES2QLSfQVVNnhRg/KtJ8R/vQIlL+x90OCDi0+6iHXN8euu | ||||
| 9Kj27gMrPYbVHZtf/tev7mhPrNuzFPWukThAe3ZKi5ebrBrsCIW0Dz/Yyn+K | ||||
| wfXI0J23Wdy3y8t0yZcS+gHQwO0NL0GYoU/3L12tUV1DLv4qyZxuR2jYyJHj | ||||
| CEjAy5M5ApdllXlKvTclWIlnt/Pr8aPx0fgIHTF5fPP11yiEPOWg1esDLeTk | ||||
| N//rdsnkqQ9v3R0V1s1Q3cQbgMH5HQtatgdVrmo5Sr7Orv++CUaXWV3wIkqN | ||||
| yEA7+XQQ9Xi/neVmv7Ea+Se55l3kvlbJ1rFoAbPuIalmE1wDHoRnDTUAUSaI | ||||
| CkW2bKiLsg6KN8xduM12wDzDr3K9sAzKXnEkBGy71lKxNvSe/zlyvz40UC/S | ||||
| WPyOaL2DrRD4z4nE2+Uh/rxQvECqPv1NcXnnW0F5NqztgVFsndF6IYn8xnC9 | ||||
| 7ri381bQ21WAFm0L1qftV7YBJXrFrspD4gLvXZzGD78p1u8/NY7v9Y2tZghX | ||||
| TU9Y3+vPD+trN7Ed7vkfHRpoDyKv2f3xpmo+/HdAoEqvrgsewpIuXZc7XN97 | ||||
| gcEOpbXj/oLQpv0NtxjsuFTAlgb5D7+toKPh9m0FLNPV56pKb8O7ianrtTmd | ||||
| Iq4QJ1HbG+sxhHD5xXdsEgTwEWOyBR7xrs0dkQL8LMi7QYRKrA97+0lar+Kd | ||||
| VkhDsb/37gE3gv7Occ/Pg+8w4PO+3WIrdNIWVXAe104hYe8S8AmI23cIhODA | ||||
| ejvWztWz/yxPrLtXgK/rNBJjFYRIti8X6AliVF00LEHsgapKLzfsKiplb3yp | ||||
| g6tUwrQovlHF1j2zhVNBkDnclSc/23HDxbvJiU74BssA5Wjc99h3QcD2NTBB | ||||
| gpR6RoRn9F1D6G9H1zqn7nIoCyQoWJGlM72Uzg3XRwvLhRTMbbVIQ6yk2Uho | ||||
| 7dxhHsHesiQN2vBlZ3vNuTswzhYP0Wm7RMlob17Ue748DTcYBOBifYLaBTvW | ||||
| SqnBF/+LrnHZ+6x77Ry6Ed4s1XOnbJy72hM9oQ+3ZsMlgFWv87mj8W1hry7r | ||||
| zQR0DulWyrkwD77YTcI14o2G83BGZ9VXBdhV+xBAhK8EH8th0M1kX9pWb1rW | ||||
| gDlMeB+YBei0dFQjdk72qJnZx/KcJM6/9zQkhcxre2UrE4Wzmxm6avpibbIg | ||||
| t3cdFrYpGTyoy3Tp0lFbUKN0uf2l9574Cjtczl3L/zXfCRK4tH22g6OLk9cn | ||||
| YDkMR8XKdZpp10DfSQ/mNyeNN7mFS8Xw2o3sCsWq8nTUbOpTD39wdzfsRCuD | ||||
| 6nKaPY38sodEYTHC6/6Bg4nM5OWcjEy/fYhPqDoChSTGUsszeFx1K1ShuHX3 | ||||
| nV/kAW+RJL11WM4AtdS1jKMjAIzf18Fr1rVCvq37OtuMpBS1q9XO9ZD6hsNs | ||||
| QcpHkVyTGoMh9SEOjGu7u8C/FmnaC2bfkAStbTgawkNwuxsr/TuDfqiVeZqY | ||||
| 5jJSE0OJnrICYSuGKsjX5fTKVLiBG9xcahC+l+/DbQNgwQV+kHoLb+KdFP1j | ||||
| InJgv14LgLz0zJ42FAmwpYCoL50Ru+G/TwUDiu31ewzd6RWJWqqWpG06sWNT | ||||
| 3BARZRK5uS3eGfTsitkbanhGoG2BxYZ48jIYqpNFLCVd9oXdD+KpojMuqLmV | ||||
| VIDU10S5MSVkhpQVionKJkEcE+52biy8BMqxK6jX0rWBPzhxZP+wNZ3x3dcO | ||||
| Beps24NTWjGiR7W1MVb16ra1nHorrNwUvM4r5OEvUHrRKXf2smq4s0gTn/sF | ||||
| Q20Nu9Y2HlnzrVHAkjm+DbZu1fNCsQ/cxJ0aoZzP2m1XeCu12zI32RLIlUUq | ||||
| QLnA3jEi601xlUB6C5FDnK+EltZB2RpIh/RzhygxZ6iIY0pU+4hnzZ3jDfOF | ||||
| YqHM27Qkz/YadcIhOGgEWNptydT2l4SSSu9nhPYyNYzrzFCCt+6LHRO1nB2w | ||||
| rhThRR3eITHleF5tRTRZhFWiIEEpL+MwywW04DhspIUIes1lWz1Urh7evTlX | ||||
| GDCuIkFDbe26YiLQ+rQuDVIWsiSsSuvq8267lcJlcnl36iAKrmblcjvdNxU1 | ||||
| LqwngqnXcl/f59AKGDOJisz4Gr2oIphW78OLHdOwyq7GRdr7QnfPjGMgi1sp | ||||
| m9EkgfbmNVIQuSYHToPcCV4buQm5qiVZ0F6JzNeH4OK80ja/LdE/y4oE8dAW | ||||
| pMJgafQTLQ+Ut8e7wzUdFFseD96Uw66v9SbZopLyihKpLLNdwCeTm1Gaj2hx | ||||
| R4s0SaSmN9h0D5ddu7yi1hHhJN8aMaRK6Pb+VKuBt24IPuPPWb/TFmqucCkD | ||||
| F/sAmhZIhN/yyoCHTpoXDJEYq1zYMNc15svD4swWrJ4UnBGitytbudLwA7pS | ||||
| W5aybC0iT3qVpNWBQJZa/ElpWq8FYl484tiIkt1M2CdSyuSiA2TddLzTj76x | ||||
| jaw27pLL4UykoqreWq1Gy9vXJ6/OrcWv+q74Jb89evo1xyVyrVwi6UK0TVcM | ||||
| 5dmh/E5W8FBsGw66DqWMDWJX9r5pXlTtq6DRYySPGlcUjNU+vm6TpzyOwOXf | ||||
| BDygzehPqk7WEtZpDi5y6rt5lUMs4CDj5AaLw9ns82fIR5429WlHD23vkFep | ||||
| VWlyrU17bRPdOi6yz+HCODF6VTACQ4I77ex15ce2QGy3QSxySV0Ejp/4ZUg1 | ||||
| 1ip05wTT1XTbqSqR97cTT4KMLg5DCVVvubLDXzvDtconvSCLu+pFL9P7Sk02 | ||||
| h6Vxeh/uHwqul7eN79iOa0nfUz0mKD3raqnG0QwqkSI4DnRYg5nbetra44H4 | ||||
| GThlBJQ5DpBVXAX7MA7vOBKvIsA6wWcam0qydM2lw4pI1gXX3tH+MF3qeQrv | ||||
| Q+L7B321MPm8TdDKmn3ZIau3OmWL8UlXPbtxKaQdERt84SudA9fUbAFkILZo | ||||
| /6ym2XP7BadihrEiPEned3ylZUpxT6OpUgAZ++/ODqJpFgNQrwz48ElYZkuT | ||||
| 90RbbEMKn4YNpXfXPZlOc8yLezUHErI55+KJLqnlMxEjwe9hJ2AGVF4eDG3G | ||||
| pavQBCVP06ScT4VRMQleJybMLjKnB9rOamt+09rQ+uB0QnEvxQiUMGu5pcXX | ||||
| ydVQ79b4LCLRibp4ScYxGrmr70bPwfCrdmsi9BkZISK9QO80ZIdIc4FIUloh | ||||
| 0tX5wDcv9V0XeKsYdCdTlzuVPcyG0aFOXn+n1rcHJOsWWmtFLVYo0szWxsnE | ||||
| XcXHVyAMBq/YejfFUlw/tOqkLHrrNEGAR7G0GnOTlBRI9YcgvKBvcJLReWGf | ||||
| 26t4U84LOpLDwXdlSnt2ltLyFPlwcDovoXzToxerlDhsPByczcvVXXQ2L5LN | ||||
| cHBeEpN9vZnRYeZ/vI9+QOTOcPA8K7ilNwB4hoMXcbFZRVfE44aDP6cLOl1p | ||||
| Mhz8QI1HV+hiHr8fDi4Zn7ieFwtYlbl9cMcD+oVeeBeTpviTuUWL76ATXsXZ | ||||
| r/QnbRJt1jm9WA0HV3EZ8wToxGAKV5OirqMXxBRNTjYsNXNFSjWdfxN9R3v8 | ||||
| 64IsH2rv56KcFRUKAFdVnJFR9t5M9SI/NrMv31385ZyvQuWUXVLDcX/gaDRi | ||||
| NRh7J0nVTQuINvB//i0ilSY6T2DmHUfLjA2dUoIR6vC+21speSGiSxSZv6uy | ||||
| x9EySfqBb1ep1AEn0rmdAaqPHauRSvdT1PgE5t+YgVTUQkycxR11nj/pW9/L | ||||
| PP3FLqWZIg/T2tpcM9pCcg0ognMrYSP/mN8ysOxONEjfIhTQm8t0ITKSazcu | ||||
| 43oucghnz2Gq2tgZCZn3/Xm9VqTr23ziRlURU3u0EjBxOlv9jvZk1fdOZHNs | ||||
| 3l1cnkcnNS2Z8gX9+pLUkBJzF5EhdWj8PQFbPb7294iw1AIig2ggNCGYq06F | ||||
| 7wphinTuBAXqnb4cVMU4eiw/WP3MVn8vqwPWkKCzZNGCmDX7ZY1KApbixbRe | ||||
| x6XjJixQOQcROn7FjIlxHitSz922tRF6zumz/qVYw86DPaajwGoMB+gxY/UA | ||||
| kjoG7IT8dzrU9wY3QxEHnAQ61gQHu4EFmskcki0LYTGHkTcBhsZBaUtie6ud | ||||
| 7ZL1p0aPaSfo0GMB+DJ2KkEr6wfTVV2oWymcZuhFOmWPSlp5XOX08kfx0BMz | ||||
| 4fuHjQND5OLivLtSYmdjYkW5cKOSay08tLlXAWjbZ2Lb/VU4yhrIra85q9CX | ||||
| dGdqUC9BooqPvT5U7ufIN9vTwdBE5YgBU+TJOk1I89inlYb++pWZiRpry3ku | ||||
| OcIbt8MNiYwwcf/k4IGLQIfkTNW1E1XXTkRdO7HqWvTxC4kr5ns7PuPu9M/T | ||||
| CU/UTRmAEaFqvX2xDniAeE/XsUDa2qFYG2jGNMpCO3G0df8YaBC2ib9ruj2W | ||||
| tNrh/Eb/yv05JnMLQIo4oiBQXt3upEI7fQawavcVf53WqkJxdE4zZKgBLiJt | ||||
| grZjLtDw0pXWTis/03T39WtiBdmFLRv324YBV2Foo7+RSC1khR4XnMqQhwfL | ||||
| 9N9+GFRO7b3Jyua/0ZOGRb1rFRdGINDeu4MlwNnFOtxuGjZpO0i+mUdkf0Pw | ||||
| 8JyDKBOOfWRKlL1buDC0vOilJBf4wxh8Ri9IQeUzb643V7pq7dQepwdK+M5e | ||||
| EEPF0MNVYQ3xNnkHRq+7f4w0CAA/8S9F6e7IkVAcqzo9gAmwDDgJAMTWXXS1 | ||||
| wX3vfdlEO2+BFo9n5Q5EN33BwzhqFTXYdS8UDxdhFmIQ3iKif4t5bePDDhLR | ||||
| d6sda6LsSL2YEvsuN7eByWCrUWmg4Nikjx//+Or6ZHR1ffV7SY04QnReiedn | ||||
| J6/PR1evri/xyzdff/NIkyaiK7fYr9xiX3LiZ03GLwcxth0zWxPSsj0d2+Yq | ||||
| WwTQSFBHv5+lKJjXpNAGowg3sBEtItct+ZAiG9x+3TNGhefXvuaVjJfGkspF | ||||
| u8BzijUJVhxUC5ZL3PmWZOLoPL5EQaJKxQ/ONxfZgMEZh9D4IkYAwZNx581x | ||||
| /FvV8hJJ9I0ofF2sqVE2pYG3Fo0iGJLrJwGyMiqmv1p9vnJOeiowMsTrL2t3 | ||||
| 0wAnFLQpEf3dGl2vrzhEgX4OgiukvA1Cq+m5H6mGrzmfe3coCqMmqLdRSk/B | ||||
| LQ9FqX55xB0Vpsq/9HIfzo3olloXF0e+qedaeZFHutHbtI26+x3RjKVoEOzX | ||||
| odvGJiX50F3pmmFWZTd8H6qCSQ54AQa9M8nRTdK6ZoLtm2ohAzkdQXCBI+yq | ||||
| tUO+RjtxhOuXV+8ur5VRHHpG8fpqdF6WRTl6Z83f37taMUleFUv8d2T4FWch | ||||
| W26yzTq7ysZwNahF1a9G24r33jIgEvnr+Onht9FpUOwlJdVMXXgRsmSyzUgK | ||||
| LPmKMAyS6RA2nffhQODSS8RImTClPODO21+Q10DstD3o/doWIkpzYBG1Y2w2 | ||||
| ODgUzKTEAIbRIKaQlzm7jw+cKnJ6jJrFTlbOWqWWr85PkeZGL57jytawToY4 | ||||
| pA6J5x8c9ER+Nbnfrro4Wi9c4q5tyTb7o7Yjlz/wGaB5tMs48al3y2yT0jSG | ||||
| c6v2fuOeF6GyUxa16P/S3mfmKxI4PYPFVYONwKnHmyFZjrlZh+UNXLSQnNiH | ||||
| yHETVg8dhpb31tmrY6RCa6UUomyFjxV4Uuagl1m7U+8MBg4sjj9IYDGX8Uqk | ||||
| yhbWXIstpiWD02rF26/YYi7qub/6jZ7OjMaSIWOaC0BaT7sv9tDKnYUE6w4m | ||||
| bQqnQM2T6+jANIeu3I2dmkSDcwWreNI4jhy75UweHOtqWXJVv61+LAjeijtx | ||||
| 0hg3lgXSVLIWWXLlMfGvNfELcUepV7vVXodwJwPYiua2D/VfBUG/CNp+kaJY | ||||
| 50bT0Fe3rIZgLKcc3avKx+joEXZ4dPSYsRP9yZ22i/Or7yPUNDXrexs6koYe | ||||
| oSGZAZC0ib7kYomSFVuSF+fXz6OXUPtPyVi4t/FDafyou3GxhBFIy4T8eW2T | ||||
| QOC2DyX7jQ1PMXtPznTu8iaj+H/Z5LSR97b5jNs8/JatkQTt2Z1jKrXAFTOv | ||||
| Bmbo4Tz68kcu+5RYPZ/hYBGJqzyID/bBSpyob5Ut9djdO9ZvZKzPPAUktvwR | ||||
| ChwFuKSbTBgM1PTh2XkCr4JlzWGVxu2YFLK6f0xfy5i+GQSroGnJ6pP0k+ZP | ||||
| OlN2fQxiBvRZ/i1XSNzT/1Pp/2teE1J45IJQYVWoiG/DSkOrFImPSzIvDV9u | ||||
| KpxIan37ZHV1pMOL3mo5roMp8T1C9kJ3iDqwFK6GEaCJL5EPkhsXNeMCqup5 | ||||
| aNMWXDGSP4cZ7zT5YLfDEP1+ynJR6xKT4zAUydjDwfywjPnsxG3/nKUbOqXI | ||||
| 3smhs7TCLoXi7t2Yx7IxT9obg5SQjisU96D1XLPofmTrubNG6C5KdIlLY6ly | ||||
| aXPUnoy/Hh8NbX6zSWzCEIQhQ5yGk86sv7d96UpY5BaZhi5knSRM3dHV4yEp | ||||
| 4Y3ptLJQOqrmhvdrsj0XlI8W45Mn6Eqr+Kok/esr4uDwsWdcuKK8nd/iuFnR | ||||
| HVAoGiq7ozn+iYu9ibXZg5l9qVcjIQraxjAoaNS4Tmwfpt77aFOsRMZGTUfm | ||||
| vx2MB8+NSTjojqfktQVb2YC5LJ2kRixUGFWr5kAfQFTy5amVGuPsuRGyD5N7 | ||||
| oEU6/AA3BZkM1x2P3bJK9VaEA8q6ELmW4V0JNj/GDXG8JUpg5TRi3pfNmHeP | ||||
| SGlqraxnHXP05j2EIOL88JHPCU+47ofNCKBP4bt3txHH21hdULnzeHdw2Bbk | ||||
| qch6gGWV8bRWCE7E3FxflBDqlgL7pZV+qqhnWvHh/PRKoHUXID41fDb0mj53 | ||||
| SaILCJRg16hhuOtCOojFsC4eixSPkV7GkgpVkrSVPZ8mJ7YZUz2PmtRU+O81 | ||||
| REb3VeZMj6DWIAMwoPvLVW5o5a+KIgG5W6pgWkJgkRZlCYOaG3x8YavQqIPI | ||||
| 1xkNOtk+ViPquNZ9EPqkTWd8uBTX/m56Eg3ukDW4V0xN4YynnLLdGcnsYHrn | ||||
| T3Gsf2OPHMRiGkRi2zpEfVUfmP+SvYJ4yYStF72Ds6toASche88ZK3DBJWMP | ||||
| PknRPuQwL+BIoBAQhxl50HxkL7I8PDwYBLNkthNYhpKzBEe8i3wP4scq6JZ8 | ||||
| v0iKejRxTlK7EvGcgWOu55tWSrz7WqjSaR0WaMBlr2WSqSl99foC8IXNeCKy | ||||
| MyVRkL8ZPCz7wRFsExe3ppmZPiW7PUuOA2hkpIsyJGZemtkw5e66trIXssTJ | ||||
| +9kvFa1p7yo/lFqfk+q0HcTNdNZX54WViXcSjkuKe4wau+7ODLTzpAomjiQs | ||||
| y/mOozc/SJVmV8nb5n6R5S8GeyXFXfRFNoIEh+QgP+yNZUwnLy9fS60MjEyS | ||||
| C/HCn1FgAMdHg1O60HM+WbctUglQlcH/BWi9pFdxyQAA | ||||
| </rfc> | </rfc> | |||
| End of changes. 83 change blocks. | ||||
| 2213 lines changed or deleted | 1276 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||