<?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-giles-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-giles-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 and communicate with each other privately when using end-to-end encryption messaging. 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 the 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-giles-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>
