<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.39 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-party-mimi-user-private-discovery-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.5 -->
  <front>
    <title abbrev="E2EE Messaging Private User Discovery">Interoperable Private Identity Discovery for E2EE Messaging</title>
    <seriesInfo name="Internet-Draft" value="draft-party-mimi-user-private-discovery-00"/>
    <author fullname="Giles Hogben">
      <organization>Google</organization>
      <address>
        <email>gih@google.com</email>
      </address>
    </author>
    <author fullname="Femi Olumofin">
      <organization>Google</organization>
      <address>
        <email>fgolu@google.com</email>
      </address>
    </author>
    <date year="2023" month="August" day="16"/>
    <area>ART</area>
    <workgroup>More Instant Messaging Interoperability (mimi)</workgroup>
    <keyword>interoperable E2EE messaging</keyword>
    <keyword>private user discovery</keyword>
    <abstract>
      <?line 52?>

<t>This document specifies how users can find each other privately when using end-to-end encrypted messaging services. Users can retrieve the key materials and message delivery endpoints of other users without revealing their social graphs to the key material service hosts. Users can search for phone numbers or user IDs, either individually or in batches, using private information retrieval (PIR). Our specification is based on a state-of-the-art lattice-based homomorphic PIR scheme, which provides a reasonable tradeoff between privacy and cost in a keyword-based sparse PIR setting.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://datatracker.ietf.org/doc/giles-interop-user-private-discovery/"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-party-mimi-user-private-discovery/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        mimi Working Group mailing list (<eref target="mailto:mimi@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/mimi/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/mimi/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/femigolu/giles-interop-user-private-discovery"/>.</t>
    </note>
  </front>
  <middle>
    <?line 57?>

<section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>Glossary of terms:</t>
      <ul spacing="normal">
        <li>Authoritative Name Server: Final holder of the IP addresses for a specific domain or set of domains.</li>
        <li>Client: A software application running on a user's device or computer.</li>
        <li>Database: A collection of records all of equal sizes (i.e., padded as appropriate).</li>
        <li>Dense PIR: A type of PIR scheme that is used to retrieve information from a database using the index or position of each record as key. This is equivalent to the standard PIR schemes from the literature.</li>
        <li>DNS: See Domain Name Service.</li>
        <li>​​Domain Name Service: A system that accepts domain names and returns their IP addresses.</li>
        <li>FHE: See Fully Homomorphic Encryption.</li>
        <li>Fully Homomorphic Encryption: A type of encryption that allows arithmetic operations to be performed on encrypted data without decrypting it first.</li>
        <li>KDS Resolver: A service that helps clients find and download the public keys of other users.</li>
        <li>KDS: See Key Distribution Server.</li>
        <li>Key Distribution Server: A server holding the public key material that enables a user to securely communicate with other users.</li>
        <li>Name Server: Stores DNS records that map a domain name to an IP address.</li>
        <li>Partition: A smaller division of a shard that is used to facilitate recursion with PIR.</li>
        <li>PIR: See Private Information Retrieval</li>
        <li>Preferred Service: A messaging service that a user has chosen as the default.</li>
        <li>Private Information Retrieval: A cryptographic technique that allows a client to query a database server without the server being able to learn anything about the query or the record retrieved.</li>
        <li>Public Key Bundle: Cryptographic key and other metadata that are used to encrypt and decrypt messages.</li>
        <li>Public Key PIR: A type of PIR scheme that uses a small amount of client storage to gain communication and computation efficiencies over multiple queries.</li>
        <li>Resolver: A service that helps clients find the IP address for a domain through recursive queries over Name Servers hierarchy.</li>
        <li>Shard: A subset of a large database that is divided into smaller, more manageable pieces.</li>
        <li>Sparse PIR: A type of PIR scheme that is used to retrieve information from a database of key-value pairs. This is the same as Keyword PIR in the literature.</li>
        <li>Transform: A process of converting the partitions in a shard into a format that is suitable for homomorphic encryption computations.</li>
      </ul>
    </section>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Outline of design for message delivery bridge and key distribution server discovery mechanisms for interoperable E2EE messaging clients. A DNS-like resolver service stores UserID &lt;-&gt; service pairs that map to key distribution and message delivery endpoints (e.g. Platform1 Bridges).  Each service is responsible for an "authoritative name server" that covers its own users and this can be replicated/cached by other providers and retrieved by sender clients using a privacy preserving protocol to prevent social graph leakage.</t>
      <section anchor="functional-requirements">
        <name>Functional Requirements</name>
        <t>For a given messaging service identity handle (Phone number or alphanumeric UserID):</t>
        <ol spacing="normal" type="1"><li>P0 Return receiver service ID to send message payload: can be mapped to endpoints for message delivery and key distribution using standard mechanism -&gt; e.g. <eref target="matrix.org/send/">Platform1.org/send/</eref>, <eref target="matrix.org/kds">Platform1.org/kds</eref></li>
          <li>P0 Return optional default receiver service ID user preference for a given PN/UserID (e.g. default:Platform1.org)</li>
        </ol>
      </section>
      <section anchor="privacy-requirements">
        <name>Privacy Requirements</name>
        <ol spacing="normal" type="1"><li>P0 Resolver service should not learn the PN/UserID a client is querying for (i.e. who is sending a message to who)</li>
          <li>P0 Resolver service should not learn the public identity of the querying client.</li>
          <li>P0 Resolver service should not learn the exact timing of when a message is sent</li>
        </ol>
      </section>
      <section anchor="privacy-non-requirement">
        <name>Privacy Non-requirement</name>
        <t>Hiding service reachability. All major E2EE messaging services already publish unACL'd reachability information without opt-out i.e. +16501234567, reachable on Messages, Whatsapp, Telegram (not including name or any other info). Therefore this should not be a goal (and would not be feasible to implement).</t>
      </section>
    </section>
    <section anchor="proposed-solution">
      <name>Proposed solution</name>
      <section anchor="key-distribution">
        <name>Key distribution</name>
        <artset>
          <artwork type="svg"><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="616px" preserveAspectRatio="none" version="1.1" viewBox="0 0 617 616" width="617px">
              <defs/>
              <g>
                <line x1="34" x2="34" y1="54.0293" y2="563.0156" stroke="black" stroke-width="0.5"/>
                <line x1="160.5" x2="160.5" y1="54.0293" y2="563.0156" stroke="black" stroke-width="0.5"/>
                <line x1="296.5" x2="296.5" y1="54.0293" y2="563.0156" stroke="black" stroke-width="0.5"/>
                <line x1="424.5" x2="424.5" y1="54.0293" y2="563.0156" stroke="black" stroke-width="0.5"/>
                <line x1="523.5" x2="523.5" y1="54.0293" y2="563.0156" stroke="black" stroke-width="0.5"/>
                <line x1="584.5" x2="584.5" y1="54.0293" y2="563.0156" stroke="black" stroke-width="0.5"/>
                <rect fill="white" height="48.0293" rx="2.5" ry="2.5" width="58" x="5" y="5" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="25.5" y="26.0752">P1</text>
                <text fill="black" font-family="sans-serif" font-size="14" x="17" y="43.0898">Client</text>
                <rect fill="white" height="48.0293" rx="2.5" ry="2.5" width="58" x="5" y="562.0156" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="25.5" y="583.0908">P1</text>
                <text fill="black" font-family="sans-serif" font-size="14" x="17" y="600.1055">Client</text>
                <rect fill="white" height="48.0293" rx="2.5" ry="2.5" width="89" x="116.5" y="5" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="152.5" y="26.0752">P1</text>
                <text fill="black" font-family="sans-serif" font-size="14" x="128.5" y="43.0898">Front End</text>
                <rect fill="white" height="48.0293" rx="2.5" ry="2.5" width="89" x="116.5" y="562.0156" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="152.5" y="583.0908">P1</text>
                <text fill="black" font-family="sans-serif" font-size="14" x="128.5" y="600.1055">Front End</text>
                <rect fill="white" height="48.0293" rx="2.5" ry="2.5" width="109" x="242.5" y="5" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="288.5" y="26.0752">P1</text>
                <text fill="black" font-family="sans-serif" font-size="14" x="254.5" y="43.0898">Name Server</text>
                <rect fill="white" height="48.0293" rx="2.5" ry="2.5" width="109" x="242.5" y="562.0156" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="288.5" y="583.0908">P1</text>
                <text fill="black" font-family="sans-serif" font-size="14" x="254.5" y="600.1055">Name Server</text>
                <rect fill="white" height="48.0293" rx="2.5" ry="2.5" width="127" x="361.5" y="5" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="368.5" y="26.0752">Authoritative P2</text>
                <text fill="black" font-family="sans-serif" font-size="14" x="380" y="43.0898">Name Server</text>
                <rect fill="white" height="48.0293" rx="2.5" ry="2.5" width="127" x="361.5" y="562.0156" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="368.5" y="583.0908">Authoritative P2</text>
                <text fill="black" font-family="sans-serif" font-size="14" x="380" y="600.1055">Name Server</text>
                <rect fill="white" height="48.0293" rx="2.5" ry="2.5" width="50" x="498.5" y="5" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="515" y="26.0752">P2</text>
                <text fill="black" font-family="sans-serif" font-size="14" x="510.5" y="43.0898">KDS</text>
                <rect fill="white" height="48.0293" rx="2.5" ry="2.5" width="50" x="498.5" y="562.0156" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="515" y="583.0908">P2</text>
                <text fill="black" font-family="sans-serif" font-size="14" x="510.5" y="600.1055">KDS</text>
                <rect fill="white" height="48.0293" rx="2.5" ry="2.5" width="53" x="558.5" y="5" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="576.5" y="26.0752">P2</text>
                <text fill="black" font-family="sans-serif" font-size="14" x="565.5" y="43.0898">Client</text>
                <rect fill="white" height="48.0293" rx="2.5" ry="2.5" width="53" x="558.5" y="562.0156" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="576.5" y="583.0908">P2</text>
                <text fill="black" font-family="sans-serif" font-size="14" x="565.5" y="600.1055">Client</text>
                <polygon fill="black" points="413,97.6279,423,101.6279,413,105.6279,417,101.6279" stroke="black" stroke-width="1.0"/>
                <line x1="297" x2="419" y1="101.6279" y2="101.6279" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="304" y="81.0991">Request P2</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="304" y="96.8984">Name Records</text>
                <polygon fill="black" points="308,143.2266,298,147.2266,308,151.2266,304,147.2266" stroke="black" stroke-width="1.0"/>
                <line x1="302" x2="424" y1="147.2266" y2="147.2266" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="314" y="126.6978">Replicate P2</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="314" y="142.4971">Name Records</text>
                <polygon fill="black" points="149,188.8252,159,192.8252,149,196.8252,153,192.8252" stroke="black" stroke-width="1.0"/>
                <line x1="34" x2="155" y1="192.8252" y2="192.8252" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="41" y="172.2964">PIR Query</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="41" y="188.0957">PN/UserID</text>
                <polygon fill="black" points="285,234.4238,295,238.4238,285,242.4238,289,238.4238" stroke="black" stroke-width="1.0"/>
                <line x1="161" x2="291" y1="238.4238" y2="238.4238" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="168" y="217.895">PIR Query</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="168" y="233.6943">PN/UserID</text>
                <path d="M114,251.4238 L114,292.4238 L344,292.4238 L344,261.4238 L334,251.4238 L114,251.4238 " fill="white" stroke="black" stroke-width="0.5"/>
                <path d="M334,251.4238 L334,261.4238 L344,261.4238 L334,251.4238 " fill="white" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="151.5" y="269.4937">Supported service IDs</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="156.5" y="285.293">+ default service</text>
                <polygon fill="black" points="172,331.6211,162,335.6211,172,339.6211,168,335.6211" stroke="black" stroke-width="1.0"/>
                <line x1="166" x2="296" y1="335.6211" y2="335.6211" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="178" y="315.0923">Service IDs</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="178" y="330.8916">&amp; default service</text>
                <polygon fill="black" points="511.5,377.2197,521.5,381.2197,511.5,385.2197,515.5,381.2197" stroke="black" stroke-width="1.0"/>
                <line x1="161" x2="517.5" y1="381.2197" y2="381.2197" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="168" y="360.6909">Query</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="168" y="376.4902">PN/UserID</text>
                <polygon fill="black" points="172,422.8184,162,426.8184,172,430.8184,168,426.8184" stroke="black" stroke-width="1.0"/>
                <line x1="166" x2="522.5" y1="426.8184" y2="426.8184" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="178" y="406.2896">Return Public</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="178" y="422.0889">Key Bundle</text>
                <polygon fill="black" points="45,468.417,35,472.417,45,476.417,41,472.417" stroke="black" stroke-width="1.0"/>
                <line x1="39" x2="160" y1="472.417" y2="472.417" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="51" y="451.8882">Return Public</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="51" y="467.6875">Key Bundle</text>
                <line x1="34" x2="76" y1="502.2163" y2="502.2163" stroke="black" stroke-width="1.0"/>
                <line x1="76" x2="76" y1="502.2163" y2="515.2163" stroke="black" stroke-width="1.0"/>
                <line x1="35" x2="76" y1="515.2163" y2="515.2163" stroke="black" stroke-width="1.0"/>
                <polygon fill="black" points="45,511.2163,35,515.2163,45,519.2163,41,515.2163" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="41" y="497.4868">Encrypt Message</text>
                <polygon fill="black" points="573,541.0156,583,545.0156,573,549.0156,577,545.0156" stroke="black" stroke-width="1.0"/>
                <line x1="34" x2="579" y1="545.0156" y2="545.0156" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="41" y="540.2861">Send Encrypted Message via messaging providers</text>
                <!--SRC=[VP0zQyCm48Pt_OeZGvSsb7RC4F1N88G6rwQR5zMwfWBdf9uaG_vzPP6IDWxTX9xdFRqdAzdhNbj97XRrKqTG31h9Bq0wo8ITuGsRUAv89IE_OUpb4Q557f6JK_nrik0_3MillHuHwkUEhWFbrT2emAvi4wlcx5VXZH35SbskeC6lWCvVnZVO6rPEbCjrCM4xw5vwd0lPSfsleDusy1gGJntL-yStXxmjHPwoDn6PECl41Q1uY9y2q0Ph3NjK48LHzmZRqiLxk0U57p8C_WS890LJVgeUdsulVaTtCpkMg5Rp0bNADkW34zJXFQxNqGvFa0TIGufb__4iyOfwFbaFB-YSFAJRpTGeDZoZkD0PmgWb7DDPqm4icr4hP2U-0G00]-->
  </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[     ┌───────┐          ┌──────────┐          ┌────────────┐          ┌────────────────┐          ┌────┐          ┌──────┐
     │P1     │          │P1        │          │P1          │          │Authoritative P2│          │P2  │          │P2    │
     │ Client│          │ Front End│          │ Name Server│          │Name Server     │          │ KDS│          │Client│
     └───┬───┘          └────┬─────┘          └─────┬──────┘          └───────┬────────┘          └─┬──┘          └──┬───┘
         │                   │                      │       Request P2        │                     │                │    
         │                   │                      │       Name Records      │                     │                │    
         │                   │                      │ ────────────────────────>                     │                │    
         │                   │                      │                         │                     │                │    
         │                   │                      │       Replicate P2      │                     │                │    
         │                   │                      │       Name Records      │                     │                │    
         │                   │                      │ <────────────────────────                     │                │    
         │                   │                      │                         │                     │                │    
         │     PIR Query     │                      │                         │                     │                │    
         │     PN/UserID     │                      │                         │                     │                │    
         │───────────────────>                      │                         │                     │                │    
         │                   │                      │                         │                     │                │    
         │                   │       PIR Query      │                         │                     │                │    
         │                   │       PN/UserID      │                         │                     │                │    
         │                   │ ─────────────────────>                         │                     │                │    
         │                   │                      │                         │                     │                │    
         │             ╔═════╧══════════════════════╧═══════╗                 │                     │                │    
         │             ║Supported service IDs              ░║                 │                     │                │    
         │             ║ + default service                  ║                 │                     │                │    
         │             ╚═════╤══════════════════════╤═══════╝                 │                     │                │    
         │                   │   Service IDs        │                         │                     │                │    
         │                   │   & default service  │                         │                     │                │    
         │                   │ <─────────────────────                         │                     │                │    
         │                   │                      │                         │                     │                │    
         │                   │                      │        Query            │                     │                │    
         │                   │                      │        PN/UserID        │                     │                │    
         │                   │ ─────────────────────────────────────────────────────────────────────>                │    
         │                   │                      │                         │                     │                │    
         │                   │                      │      Return Public      │                     │                │    
         │                   │                      │      Key Bundle         │                     │                │    
         │                   │ <─────────────────────────────────────────────────────────────────────                │    
         │                   │                      │                         │                     │                │    
         │   Return Public   │                      │                         │                     │                │    
         │   Key Bundle      │                      │                         │                     │                │    
         │<───────────────────                      │                         │                     │                │    
         │                   │                      │                         │                     │                │    
         ────┐                                      │                         │                     │                │    
             │ Encrypt Message                      │                         │                     │                │    
         <───┘                                      │                         │                     │                │    
         │                   │                      │                         │                     │                │    
         │                   │          Send Encrypted Message via messaging providers              │                │    
         │───────────────────────────────────────────────────────────────────────────────────────────────────────────>    
     ┌───┴───┐          ┌────┴─────┐          ┌─────┴──────┐          ┌───────┴────────┐          ┌─┴──┐          ┌──┴───┐
     │P1     │          │P1        │          │P1          │          │Authoritative P2│          │P2  │          │P2    │
     │ Client│          │ Front End│          │ Name Server│          │Name Server     │          │ KDS│          │Client│
     └───────┘          └──────────┘          └────────────┘          └────────────────┘          └────┘          └──────┘
]]></artwork>
        </artset>
        <t>Taking Platform1 client sending to a Platform2 user as an example:</t>
        <ol spacing="normal" type="1"><li>Platform1 name server replicates authoritative Platform2 NS records. There will need to be a shared list of participating services and name server endpoints.</li>
          <li>Platform1 client sends key bundle request to Platform1 front end (PIR encrypted PN/UserID)</li>
          <li>Platform1 FE gets supported key distribution service IDs, version number + default service=Platform2 via PIR protocol from its own name server.</li>
          <li>Platform1 FE queries Platform2 KDS to retrieve public keys.</li>
        </ol>
        <ul spacing="normal">
          <li>4.1 Platform1 Client first sends (query and session key) encrypted with Platform2 public key to Platform1 FE.</li>
          <li>4.2 Platform1 FE sends encrypted query to Platform2 KDS</li>
          <li>4.3 Platform2 KDS decrypts query and session key, encrypts response with session key</li>
          <li>4.4 Platform2 KDS sends encrypted response to Platform1 FE</li>
          <li>4.5 Platform1 FE forwards to Platform1 client</li>
        </ul>
        <ol spacing="normal" type="1" start="5"><li>Platform 1 Client and Platform 2 Client exchange messages through their respective messaging providers.</li>
        </ol>
        <t>This provides E2EE interop while only disclosing to gateway service which services a phone number is registered to. In all other respects, gateway services learn no more information than in the non-interop case.</t>
      </section>
      <section anchor="resolver-registration">
        <name>Resolver registration</name>
        <t>Each service is responsible for registering user enrollments with the resolver.</t>
      </section>
      <section anchor="preferred-service-integrity">
        <name>Preferred service integrity</name>
        <t>While the preferred service is public, the user should control its value/integrity. As well as ensuring user control, it also prevents spoofing attacks where an attacker A could create an account on a new service that B does not have an account on, and then set it to B's preferred service (see cross-service identity spoofing below). Therefore to prevent anyone but the user modifying the default service value, records must be signed with the user's private key and verified by the sender against their public key. For multiple key pairs across different services, the last key pair to sign the default service bit must be used to change the default.</t>
        <artset>
          <artwork type="svg"><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="225px" preserveAspectRatio="none" version="1.1" viewBox="0 0 604 225" width="604px">
              <defs/>
              <g>
                <line x1="31" x2="31" y1="37.0146" y2="189.2119" stroke="black" stroke-width="0.5"/>
                <line x1="283.5" x2="283.5" y1="37.0146" y2="189.2119" stroke="black" stroke-width="0.5"/>
                <line x1="561.5" x2="561.5" y1="37.0146" y2="189.2119" stroke="black" stroke-width="0.5"/>
                <rect fill="white" height="31.0146" rx="2.5" ry="2.5" width="53" x="5" y="5" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="12" y="26.0752">Client</text>
                <rect fill="white" height="31.0146" rx="2.5" ry="2.5" width="53" x="5" y="188.2119" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="12" y="209.2871">Client</text>
                <rect fill="white" height="31.0146" rx="2.5" ry="2.5" width="84" x="241.5" y="5" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="248.5" y="26.0752">Service UI</text>
                <rect fill="white" height="31.0146" rx="2.5" ry="2.5" width="84" x="241.5" y="188.2119" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="248.5" y="209.2871">Service UI</text>
                <rect fill="white" height="31.0146" rx="2.5" ry="2.5" width="74" x="524.5" y="5" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="531.5" y="26.0752">Resolver</text>
                <rect fill="white" height="31.0146" rx="2.5" ry="2.5" width="74" x="524.5" y="188.2119" stroke="black" stroke-width="0.5"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="531.5" y="209.2871">Resolver</text>
                <polygon fill="black" points="549.5,64.814,559.5,68.814,549.5,72.814,553.5,68.814" stroke="black" stroke-width="1.0"/>
                <line x1="283.5" x2="555.5" y1="68.814" y2="68.814" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="290.5" y="64.0845">Register Preferred Service + Signature</text>
                <polygon fill="black" points="549.5,94.6133,559.5,98.6133,549.5,102.6133,553.5,98.6133" stroke="black" stroke-width="1.0"/>
                <line x1="31.5" x2="555.5" y1="98.6133" y2="98.6133" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="38.5" y="93.8838">Query PN/UserID</text>
                <polygon fill="black" points="42.5,124.4126,32.5,128.4126,42.5,132.4126,38.5,128.4126" stroke="black" stroke-width="1.0"/>
                <line x1="36.5" x2="560.5" y1="128.4126" y2="128.4126" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="48.5" y="123.6831">Return supported service IDs + default service preference + signature</text>
                <line x1="31.5" x2="73.5" y1="158.2119" y2="158.2119" stroke="black" stroke-width="1.0"/>
                <line x1="73.5" x2="73.5" y1="158.2119" y2="171.2119" stroke="black" stroke-width="1.0"/>
                <line x1="32.5" x2="73.5" y1="171.2119" y2="171.2119" stroke="black" stroke-width="1.0"/>
                <polygon fill="black" points="42.5,167.2119,32.5,171.2119,42.5,175.2119,38.5,171.2119" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="38.5" y="153.4824">Verify default service pref signature</text>
                <!--SRC=[ROqn2uCm48Nt_8h3jKZt3eB6nQLenUv1Jmb837U9uB_lAMsnqEdWU- - -vmq5srjlN00zMvHZ67BbJpnfaLRR8tHLigV5J_f0NkOLQK-qKaMQwPl0oN8GM1EEI8G3V2GNQEtaJ8Y4AZ_AJKJQeBvVEqQgIgNJBDyLKd70qVk5WWZuBQXA5ic0eubp-59_3A4x5lYy8AudaXstlp-dxWi0]-->
  </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[     ┌──────┐                                 ┌──────────┐                             ┌────────┐
     │Client│                                 │Service UI│                             │Resolver│
     └──┬───┘                                 └────┬─────┘                             └───┬────┘
        │                                          │ Register Preferred Service + Signature│     
        │                                          │ ──────────────────────────────────────>     
        │                                          │                                       │     
        │                                  Query PN/UserID                                 │     
        │ ─────────────────────────────────────────────────────────────────────────────────>     
        │                                          │                                       │     
        │       Return supported service IDs + default service preference + signature      │     
        │ <─────────────────────────────────────────────────────────────────────────────────     
        │                                          │                                       │     
        │────┐                                                                             │     
        │    │ Verify default service pref signature                                       │     
        │<───┘                                                                             │     
     ┌──┴───┐                                 ┌────┴─────┐                             ┌───┴────┐
     │Client│                                 │Service UI│                             │Resolver│
     └──────┘                                 └──────────┘                             └────────┘
]]></artwork>
        </artset>
      </section>
      <section anchor="cross-service-identity-spoofing">
        <name>Cross-service identity spoofing</name>
        <t>Today, a messaging service may support one or more ways of identifying a user including email address, phone number, or service specific user name.</t>
        <t>Messaging interoperability introduces a new problem that traditionally has been resolvable at the service level: cross-service identity spoofing, where a user on a given E2EE may or may not be addressable at the same ID on another service due to a lack of global uniqueness constraints across providers.</t>
        <t>As a result, a user may be registered at multiple services with the same handles, e.g. if Bob's email is <eref target="mailto:bob@example.com">bob@example.com</eref> and his phone number is 555-111-2222 and he is registered with Signal and iMessage, he would be addressable at <eref target="mailto:bob@example.com">bob@example.com</eref>:iMessage, 555-111-2222:iMessage, and 555-111-2222:Signal. In this case, the same userId on iMessage and Signal is acceptable as the phone number can map to only one individual who proves their identity by validating ownership of the SIM card.</t>
        <t>On services where a user can log in with a username <em>alone</em>, however e.g. Threema and FooService, the challenge becomes:</t>
        <ul spacing="normal">
          <li>Alice messages Bob at Bob's preferred service (bob@Threema)</li>
          <li>Eve messages Alice impersonating Bob using bob@FooService</li>
          <li>Alice needs some indicator or UI to know that bob@Threema isn't bob@FooSercice and that when bob@FooService messages, it should not be assumed that bob@FooService is bob@Threema.</li>
        </ul>
        <t>Options for solving this are:
1. Storing the supported services for a contact in Contacts and if a receipt receives a message from an unknown sender, to treat it as spam or otherwise untrusted from the start.
2. Requiring the fully qualified username for services that rely on usernames only - e.g. bob@threema.com vs bob.</t>
      </section>
    </section>
    <section anchor="privacy-of-resolver-lookup-queries">
      <name>Privacy of resolver lookup queries</name>
      <t>Resolver lookup queries leak the user's social graph - i.e. who is communicating with whom, since the IP address of the querying client can be tied to user identity, especially when operating over a mobile data network. Therefore we propose to use Private Information Retrieval (PIR) to perform the resolver queries. We have evaluated multiple alternative schemes. The proposed solution is based on the Public Key PIR framework by Patel et al<xref target="PIRFramework"/> with sharded databases. This framework is applicable with any standard PIR scheme such as the open source implementation <eref target="https://github.com/google/private-retrieval">here</eref>. Cost estimates suggest this is feasible even for very large resolver databases (10 billion records).</t>
      <section anchor="proposed-protocols">
        <name>Proposed protocols</name>
        <t>A private information retrieval protocol enables a client holding an index (or keyword) to retrieve the database record corresponding to that index from a remote server. PIR schemes have communication complexities sublinear in the database size and they provide access privacy for clients which precludes the server from being able to learn any information about either the query index or the record retrieved. A standard single-server PIR scheme provides clients with algorithms to generate a query and decrypt a response from the server. It also provides an algorithm for the server to compute a response.</t>
        <t>The Public Key PIR framework <xref target="PIRFramework"/> can be wrapped around any standard lattice-based PIR scheme. This framework consists of server database setup, client key initialization, client query generation, server response computation, and client response decryption sub-protocols. All operations are over a set of integers with a plaintext modulus.</t>
        <section anchor="server-database-setup">
          <name>Server database setup</name>
          <ul spacing="normal">
            <li>
              <t><strong>Sharding</strong>: If the database is over 2<sup>20</sup> records, sub-divide it into  shards of ~1 million unique records each, which is a good balance for privacy and costs. Performing PIR over the databases gives stronger privacy but is more costly. Similarly, running PIR queries over the shards is less costly but gives weaker privacy.
              </t>
              <ul spacing="normal">
                <li>Sample a hash key <strong>K<sub>s</sub></strong> for sharding.</li>
                <li>Using <strong>K<sub>s</sub></strong>, shard the large database of <strong>r</strong> records into <strong>&amp;#8968;r/2<sup>20</sup>&amp;#8969;</strong> shards based on the hash prefix of the record's unique identifier.</li>
                <li>
                  <strong>N.B.</strong> The hash key will be provided to clients to determine the shard to query.</li>
              </ul>
            </li>
            <li>
              <t><strong>Set partitioning boundaries for each shard D</strong>: Given a <strong>n</strong> key-value pairs shard <strong>D = {(k<sub>1</sub>,v<sub>1</sub>),...,(k<sub>n</sub>,v<sub>n</sub>)}</strong>, then
              </t>
              <ul spacing="normal">
                <li>Compute the number of database partitions as <strong>b = n/d<sub>1</sub></strong>. Where <strong>d<sub>1</sub></strong> is the desired size for each partition. A value of 128 for <strong>d<sub>1</sub></strong> works well.</li>
                <li>Sample a partitioning boundary hash key <strong>K<sub>1 </sub></strong> to generate a target partition for each shard key.</li>
                <li>Compute the hash <strong>F<sub>1</sub>(K<sub>1</sub>,k<sub>i</sub>)</strong> for each record identifier <strong>k<sub>i</sub></strong>.</li>
                <li>Sort the hash values alphanumerically and then divide the list into <strong>b</strong> partitions <strong>P<sub>1</sub>,...,P<sub>b</sub></strong>.</li>
                <li>Store the b partition boundaries beginning hash values <strong>B<sub>0</sub>, ..., B<sub>b</sub></strong>. Note that <strong>B<sub>0</sub> = 0</strong>, and <strong>B<sub>b</sub> = |U|-1</strong> where U is the rage for <strong>F<sub>1</sub>(K<sub>1</sub>,k<sub>i</sub>)</strong>.</li>
                <li>
                  <strong>N.B.</strong> The partition boundaries will be provided to clients and can be stored efficiently (e.g., ~11KB for <strong>n</strong> = 2<sup><strong>20</strong></sup>, <strong>d<sub>1</sub></strong> = 128, <strong>|U|</strong> = 2<sup><strong>64</strong></sup>).</li>
              </ul>
            </li>
            <li>
              <strong>Transform each shard</strong>: Sample two hash keys <strong>K<sub>2</sub></strong> and <strong>K<sub>r</sub></strong> where <strong>K<sub>2</sub></strong> will be used to generate a row vector within each partition, and <strong>K<sub>r</sub></strong> is used to generate a representation for the transformed database as <strong>F(K<sub>r</sub>,k<sub>i</sub>)||v</strong>.</li>
            <li>
              <strong>N.B.</strong> <strong>F(K,k)</strong> is the output value from hashing <strong>k</strong> with key <strong>K</strong> and <strong>||</strong> is a concatenation.</li>
            <li>
              <t>For each partition <strong>P<sub>i</sub></strong>
              </t>
              <ul spacing="normal">
                <li>Construct a <strong>|P<sub>i</sub>| x d<sub>1</sub></strong> Platform1 <strong>M<sub>i</sub></strong> by appending a random row vector from the bit vector derived from <strong>(F<sub>2</sub>(K<sub>2</sub>,k||1),...,F<sub>2</sub>(K<sub>2</sub>,k||d<sub>1</sub>))</strong>.</li>
                <li>Construct a <strong>|P<sub>i</sub>|</strong> vector <strong>y<sub>i</sub></strong> by appending <strong>F<sub>r</sub>(K<sub>r</sub>,k)||v</strong> for each <strong>(k,v)</strong> in <strong>P<sub>i</sub></strong>.</li>
                <li>Solve for <strong>e<sub>i</sub></strong> that satisfies <strong>M<sub>i</sub>e<sub>i</sub> = y<sub>i</sub></strong>.</li>
              </ul>
            </li>
            <li>Construct the transformed <strong>d<sub>1</sub> x b</strong> Platform1 as <strong>E = [e<sub>1</sub> ... e<sub>b</sub>]</strong>.</li>
            <li>The Platform1 <strong>E</strong> is the transformed Platform1 for shard <strong>D</strong>.</li>
            <li>The clients must download parameters <strong>(K<sub>1</sub>,K<sub>2</sub>,K<sub>r</sub>)</strong> to query each shard, plus <strong>K<sub>s</sub></strong> to inform the server of the target shard for a query.</li>
          </ul>
          <t>This protocol is completed by the server without any client participation and before answering any client query. Note that a shard must be re-transformed after an update. Shard transform only takes a few minutes.</t>
        </section>
        <section anchor="client-key-initialization">
          <name>Client key initialization</name>
          <ul spacing="normal">
            <li>The client generates a per-key unique identifier (<strong>UID</strong>),  <strong>private key</strong> and <strong>public key</strong> using a fully homomorphic encryption (FHE) scheme relying on hardness assumptions similar to Ring Learning with Errors problem.</li>
            <li>The client persists the <strong>UID</strong> and <strong>private key</strong> into its local key store, and uploads query-independent parameters <strong>UID</strong> and <strong>public key</strong> to the server. These later parameters will enable the server to perform cryptographic operations (i.e., FHE) efficiently.</li>
            <li>The server needs to maintain an up-to-date mapping of <strong>UID</strong> to <strong>public key</strong> for all clients.</li>
            <li>Each client completes this offline initialization protocol before running any query. It also needs to perform it periodically (e.g., weekly or monthly) to prevent server linkability of private queries to the user over an extended period.</li>
            <li>
              <t>The client downloads query parameters from the server:
              </t>
              <ul spacing="normal">
                <li>Sharding hash key <strong>K<sub>s</sub></strong> to inform the server of the target shard for a query.</li>
              </ul>
            </li>
            <li>Sets of parameters (<strong>K<sub>1</sub>,K<sub>2</sub>,K<sub>r</sub>,B<sub>0</sub>, ..., B<sub>b</sub></strong>) for each shard.</li>
          </ul>
        </section>
        <section anchor="client-query-generation">
          <name>Client query generation</name>
          <ul spacing="normal">
            <li>The client creates a query to retrieve the value corresponding to a database key <strong>k</strong> as follows:</li>
            <li>Select a standard PIR algorithm with server-supported implementation as the underlying PIR scheme.</li>
            <li>Compute <strong>d = F<sub>s</sub>(K<sub>s</sub>,k)</strong> to identify the shard to query.</li>
            <li>Compute <strong>j = F<sub>1</sub>(K<sub>1</sub>,k)</strong> to learn which partition contains the desired entry from the downloaded partition boundaries for the shard.</li>
            <li>Generate <strong>z</strong> vector <strong>v</strong> of length <strong>d<sub>1</sub> , ... , d<sub>z</sub></strong> . Compute a <strong>d<sub>1</sub></strong>-length random bit vector <strong>v<sub>1</sub></strong> from <strong>(F<sub>2</sub>(K<sub>2</sub>,k||1),...,F<sub>2</sub>(K<sub>2</sub>,k||d<sub>1</sub>))</strong>. Compute <strong>v<sub>2</sub></strong> as a zero bit vector of <strong>d<sub>2</sub></strong> length with only the bit set at <strong>&amp;#8970;j/&amp;#8968;n/d<sub>1</sub>d<sub>2</sub>&amp;#8969;&amp;#8971;</strong>. Similarly compute <strong>v<sub>3</sub> , ... , v<sub>z</sub></strong>.</li>
            <li>Finally use the underlying PIR scheme and the private key to encrypt the <strong>z</strong> vector <strong>v.</strong></li>
            <li>Send <strong>v, d</strong> and the <strong>UID</strong> to the server.</li>
            <li>
              <strong>N.B.</strong> The dimension <strong>d<sub>z</sub></strong> is typically small; a size of 2 or 4 works well.</li>
          </ul>
        </section>
        <section anchor="server-response-computation">
          <name>Server response computation</name>
          <ul spacing="normal">
            <li>The server retrieves the public key for the client's <strong>UID</strong>, and computes the ciphertext of the value corresponding to the key of interest for the shard <strong>d</strong>, as follows.</li>
            <li>Take the transformed shard <strong>E</strong> as a <strong>d<sub>1 </sub>x &amp;#8968;n/d<sub>1</sub>&amp;#8969;</strong> Platform1 <strong>E<sub>1</sub></strong>, use the underlying PIR response answering algorithm to compute <strong>v<sub>1</sub>.E<sub>1</sub></strong>, and rearrange the resulting <strong>&amp;#8968;n/d<sub>1</sub>&amp;#8969;</strong> vector as a <strong>d<sub>2 </sub>x &amp;#8968;n/d<sub>1</sub>d<sub>2</sub>&amp;#8969;</strong> Platform1 <strong>E<sub>2</sub></strong>.</li>
            <li>Next, compute <strong>v<sub>2</sub>.E<sub>2</sub></strong>, and rearrange the resulting <strong>&amp;#8968;n/d<sub>1</sub>d<sub>2</sub>&amp;#8969;</strong> vector as a <strong>d<sub>3 </sub>x &amp;#8968;n/d<sub>1</sub>d<sub>2</sub>d<sub>3</sub>&amp;#8969;</strong> Platform1 <strong>E<sub>3</sub></strong>.</li>
            <li>The server similarly repeats the computation for the remaining dimensions <strong>v<sub>3</sub> ,... , v<sub>z</sub></strong>.</li>
            <li>The end result is a ciphertext <strong>r</strong> of the database value corresponding to <strong>k</strong>. The server sends <strong>r</strong> back to the client.</li>
          </ul>
        </section>
        <section anchor="client-response-decryption">
          <name>Client response decryption</name>
          <ul spacing="normal">
            <li>The client uses the underlying PIR response decryption algorithm and <strong>private key</strong> to decrypt the response <strong>r</strong> as <strong>k<sub>r</sub>||v</strong>. If <strong>F<sub>r</sub>(K<sub>r</sub>,k) == k<sub>r</sub></strong> then returns <strong>v</strong> otherwise returns <strong>null</strong> (key not found).</li>
          </ul>
        </section>
      </section>
      <section anchor="fhe-key-requirements">
        <name>FHE key requirements</name>
        <ul spacing="normal">
          <li>
            <t>At least 128-bit of security
            </t>
            <ul spacing="normal">
              <li>ElGamal, NIST P-224r1 curve and a 4 bytes plaintext size for fast decryption.</li>
              <li>Gentry-Ramzan, used a 2048-bit modulus</li>
              <li>Damgaerd-Jurik, used 1160-bit primes</li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="cost-estimates">
        <name>Cost estimates</name>
        <t>In these estimates, we propose using shards of size ~1 million of identifiers. For 1.28 TB (10 billion records), breaking this down into 10,000 shards each of size 1 million records gives a cost estimate for each query as below:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Parameter</th>
              <th align="left">Cost estimate</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">PIR Public Key Size Per Device, including metadata (storage required)</td>
              <td align="left">14 MB</td>
            </tr>
            <tr>
              <td align="left">Upload Bandwidth Per Query</td>
              <td align="left">14 KB</td>
            </tr>
            <tr>
              <td align="left">Download Bandwidth Per Query</td>
              <td align="left">21 KB</td>
            </tr>
            <tr>
              <td align="left">Client Time Per Query</td>
              <td align="left">0.1s</td>
            </tr>
            <tr>
              <td align="left">Server Time Per Query (Single Thread)</td>
              <td align="left">0.8-1s</td>
            </tr>
          </tbody>
        </table>
        <t>Note on some assumptions for feasibility:</t>
        <ol spacing="normal" type="1"><li>Resolver queries will be cached (vs requiring a roundtrip for every message) and asynchronous with message sending, therefore 1s latency is acceptable.</li>
          <li>It is acceptable for key changes to be communicated reactively on decrypt failure.</li>
          <li>Group messaging E2EE is bootstrapped using individual users' public keys and for V1, group state will be stored by the initiating user's service provider. Therefore no additional discovery mechanism is required.</li>
        </ol>
      </section>
      <section anchor="notes">
        <name>Notes</name>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="PIRFramework">
        <front>
          <title>Don't be Dense: Efficient Keyword PIR for Sparse Databases</title>
          <author fullname="Sarvar Patel">
            <organization/>
          </author>
          <author fullname="Joon Young Seo">
            <organization/>
          </author>
          <author fullname="Kevin Yeo">
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
        <seriesInfo name="32nd USENIX Security Symposium, USENIX Security 2023" value=""/>
      </reference>
      <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 document defines these words as they should be interpreted in IETF documents. This document 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 specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE 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>
    </references>
    <?line 346?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The technical description of the private information retrieval framework is based on Sarvar Patel, Joon Young Seo and Kevin Yeo's USENIX Security '23 paper titled <eref target="https://www.usenix.org/conference/usenixsecurity23/presentation/patel">"Don't be Dense: Efficient Keyword PIR for Sparse Databases
"</eref>.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
