<?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.7.2 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-party-mimi-user-private-discovery-03" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <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-03"/>
    <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="November" day="04"/>
    <area>ART</area>
    <workgroup>More Instant Messaging Interoperability (mimi)</workgroup>
    <keyword>interoperable E2EE messaging</keyword>
    <keyword>private user discovery</keyword>
    <abstract>
      <?line 59?>

<t>This document specifies how users can privately discover each other's Service Specific  Identifiers (SSIs) when using end-to-end encrypted messaging services across multiple providers. Users can retrieve SSIs without revealing their social graphs to service providers they are not delivering messages through, using their phone numbers, email, user IDs, or other Service Independent Identifiers (SIIs). Our specification can be based on private information retrieval or associative private sets membership schemes, both of which provide reasonable tradeoffs between privacy and cost.</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 64?>

<section anchor="definitions">
      <name>Definitions</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>A <strong>service specific identifier</strong> (SSI) is a unique identifier for a user within a single service provider's service, and encodes the service provider in the identifier. For example, a user's account handle and provider identifier is an SSI.</t>
      <t>A <strong>service independent identifier</strong> (SII) is a unique identifier for a user that is independent of any specific service provider. For example, a user's E.164 phone number or email address are SIIs, since they can be used to identify the user across multiple different services.</t>
    </section>
    <section anchor="problem-statement">
      <name>Problem statement</name>
      <t>The <strong>discovery problem</strong> is resolving a user's SII into one SSI for that user, while preserving user privacy in the process.</t>
    </section>
    <section anchor="threat-actors">
      <name>Threat actors</name>
      <ul spacing="normal">
        <li>
          <t>Alice, Bob, and Carol: Three  users within the interoperable E2EE messaging ecosystem.</t>
        </li>
        <li>
          <t>Sender Messaging Platform: A messaging service provider platform where a registered user has an account and has established a mapping of SII to SSI. Examples from Fig. is Platform 1 for Alice and Carol, and Platform 2 for Bob.</t>
        </li>
        <li>
          <t>Potential Recipient Messaging Platform: A messaging service provider platform where a discovered SSI is registered. An example from Fig. 1 is the role of Platform 2 when Alice resolves Bob's SSI using Bob's SII. This has three variants in the threat model:
          </t>
          <ol spacing="normal" type="1"><li>
              <t>Recipient platform with SSI - the sender sends a message (so this platform will learn the sender identity).</t>
            </li>
            <li>
              <t>Non-recipient platform with SSI that the recipient SII has an account with but does not send a message to.</t>
            </li>
            <li>
              <t>Non-recipient platform without SSI - potential recipient does not have an SSI registered with this platform.</t>
            </li>
          </ol>
        </li>
      </ul>
      <artset>
        <artwork type="svg"><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="403px" preserveAspectRatio="none" version="1.1" viewBox="0 0 849 403" width="849px">
            <defs/>
            <g>
              <!--MD5=[88a7a470f204059c5a1f7949c1e6498a]
cluster SMP-->
    <rect fill="white" height="349" width="234" x="92" y="43" stroke="#000000" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" font-weight="bold" x="113.5" y="59.9659">Sender Messaging Platform</text>
              <!--MD5=[7c9df01cb14152d89dc7e19af29f092e]
cluster TPP-->
    <rect fill="white" height="269" width="232" x="350" y="43" stroke="#000000" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" font-weight="bold" x="395" y="59.9659">Third Party Platform</text>
              <!--MD5=[e14d4ce7c6213aae0f872960412b7f46]
cluster PRMP-->
    <rect fill="white" height="368" width="232" x="606" y="24" stroke="#000000" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" font-weight="bold" x="656.5" y="40.9659">Potential Recipient</text>
              <text fill="black" font-family="sans-serif" font-size="14" font-weight="bold" x="652.5" y="60.0339">Messaging Platform</text>
              <!--MD5=[cfd67e69d07f13f5da929f70ef47a5b6]
entity fe1-->
    <polygon fill="white" points="156.5,91,166.5,81,261.5,81,261.5,120.0679,251.5,130.0679,156.5,130.0679,156.5,91" stroke="#000000" stroke-width="1.5"/>
              <line x1="251.5" x2="260.5" y1="91" y2="82" stroke="#000000" stroke-width="1.5"/>
              <line x1="156.5" x2="251.5" y1="91" y2="91" stroke="#000000" stroke-width="1.5"/>
              <line x1="251.5" x2="251.5" y1="91" y2="130.0679" stroke="#000000" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="171.5" y="115.9659">Front End</text>
              <!--MD5=[e52493e94bbb6a2f5e240fcf5f667212]
entity dp1-->
    <polygon fill="white" points="127,183,137,173,291,173,291,212.0679,281,222.0679,127,222.0679,127,183" stroke="#000000" stroke-width="1.5"/>
              <line x1="281" x2="290" y1="183" y2="174" stroke="#000000" stroke-width="1.5"/>
              <line x1="127" x2="281" y1="183" y2="183" stroke="#000000" stroke-width="1.5"/>
              <line x1="281" x2="281" y1="183" y2="222.0679" stroke="#000000" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="142" y="207.9659">Discovery Provider</text>
              <!--MD5=[60ed80a55e911c3bca3f7c2821e2991d]
entity kds1-->
    <polygon fill="white" points="109,257.5,119,247.5,309,247.5,309,286.5679,299,296.5679,109,296.5679,109,257.5" stroke="#000000" stroke-width="1.5"/>
              <line x1="299" x2="308" y1="257.5" y2="248.5" stroke="#000000" stroke-width="1.5"/>
              <line x1="109" x2="299" y1="257.5" y2="257.5" stroke="#000000" stroke-width="1.5"/>
              <line x1="299" x2="299" y1="257.5" y2="296.5679" stroke="#000000" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="124" y="282.4659">Key Distribution Service</text>
              <!--MD5=[7aa9c583cf047545838c264d3047b712]
entity db1-->
    <path d="M108,338 C108,328 209,328 209,328 C209,328 310,328 310,338 L310,366.0679 C310,376.0679 209,376.0679 209,376.0679 C209,376.0679 108,376.0679 108,366.0679 L108,338 " fill="white" stroke="#000000" stroke-width="1.5"/>
              <path d="M108,338 C108,348 209,348 209,348 C209,348 310,348 310,338 " fill="none" stroke="#000000" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="118" y="366.9659">Mappings DB Alice,Carol,...</text>
              <!--MD5=[2dded8101a8e00bfe04c3a41ecd782e9]
entity dp2-->
    <polygon fill="white" points="384,91,394,81,548,81,548,120.0679,538,130.0679,384,130.0679,384,91" stroke="#000000" stroke-width="1.5"/>
              <line x1="538" x2="547" y1="91" y2="82" stroke="#000000" stroke-width="1.5"/>
              <line x1="384" x2="538" y1="91" y2="91" stroke="#000000" stroke-width="1.5"/>
              <line x1="538" x2="538" y1="91" y2="130.0679" stroke="#000000" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="399" y="115.9659">Discovery Provider</text>
              <!--MD5=[0f83d95361d333895e39e79e13f0d3ff]
entity kds2-->
    <polygon fill="white" points="366,183,376,173,566,173,566,212.0679,556,222.0679,366,222.0679,366,183" stroke="#000000" stroke-width="1.5"/>
              <line x1="556" x2="565" y1="183" y2="174" stroke="#000000" stroke-width="1.5"/>
              <line x1="366" x2="556" y1="183" y2="183" stroke="#000000" stroke-width="1.5"/>
              <line x1="556" x2="556" y1="183" y2="222.0679" stroke="#000000" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="381" y="207.9659">Key Distribution Service</text>
              <!--MD5=[2331507006b4b8bee4c616015350b23c]
entity db2-->
    <path d="M387.5,258 C387.5,248 466,248 466,248 C466,248 544.5,248 544.5,258 L544.5,286.0679 C544.5,296.0679 466,296.0679 466,296.0679 C466,296.0679 387.5,296.0679 387.5,286.0679 L387.5,258 " fill="white" stroke="#000000" stroke-width="1.5"/>
              <path d="M387.5,258 C387.5,268 466,268 466,268 C466,268 544.5,268 544.5,258 " fill="none" stroke="#000000" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="397.5" y="286.9659">Mappings DB Bob,...</text>
              <!--MD5=[a9b1758aa0b42281d7ee6734e9e7dac6]
entity fe3-->
    <polygon fill="white" points="669.5,91,679.5,81,774.5,81,774.5,120.0679,764.5,130.0679,669.5,130.0679,669.5,91" stroke="#000000" stroke-width="1.5"/>
              <line x1="764.5" x2="773.5" y1="91" y2="82" stroke="#000000" stroke-width="1.5"/>
              <line x1="669.5" x2="764.5" y1="91" y2="91" stroke="#000000" stroke-width="1.5"/>
              <line x1="764.5" x2="764.5" y1="91" y2="130.0679" stroke="#000000" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="684.5" y="115.9659">Front End</text>
              <!--MD5=[9493e873400abb17d933657eb6d7e4cc]
entity dp3-->
    <polygon fill="white" points="640,183,650,173,804,173,804,212.0679,794,222.0679,640,222.0679,640,183" stroke="#000000" stroke-width="1.5"/>
              <line x1="794" x2="803" y1="183" y2="174" stroke="#000000" stroke-width="1.5"/>
              <line x1="640" x2="794" y1="183" y2="183" stroke="#000000" stroke-width="1.5"/>
              <line x1="794" x2="794" y1="183" y2="222.0679" stroke="#000000" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="655" y="207.9659">Discovery Provider</text>
              <!--MD5=[8dc480c14589a4063501232cd1b2424e]
entity kds3-->
    <polygon fill="white" points="622,257.5,632,247.5,822,247.5,822,286.5679,812,296.5679,622,296.5679,622,257.5" stroke="#000000" stroke-width="1.5"/>
              <line x1="812" x2="821" y1="257.5" y2="248.5" stroke="#000000" stroke-width="1.5"/>
              <line x1="622" x2="812" y1="257.5" y2="257.5" stroke="#000000" stroke-width="1.5"/>
              <line x1="812" x2="812" y1="257.5" y2="296.5679" stroke="#000000" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="637" y="282.4659">Key Distribution Service</text>
              <!--MD5=[7a84b64b0b7b7d5ec450ed14b904bacb]
entity db3-->
    <path d="M643.5,338 C643.5,328 722,328 722,328 C722,328 800.5,328 800.5,338 L800.5,366.0679 C800.5,376.0679 722,376.0679 722,376.0679 C722,376.0679 643.5,376.0679 643.5,366.0679 L643.5,338 " fill="white" stroke="#000000" stroke-width="1.5"/>
              <path d="M643.5,338 C643.5,348 722,348 722,348 C722,348 800.5,348 800.5,338 " fill="none" stroke="#000000" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="653.5" y="366.9659">Mappings DB Bob,...</text>
              <!--MD5=[2c779ae8328ac3f1086abb313344728d]
entity Alice-->
    <ellipse cx="22" cy="73" fill="white" rx="8" ry="8" stroke="black" stroke-width="1.5"/>
              <path d="M22,81 L22,108 M9,89 L35,89 M22,108 L9,123 M22,108 L35,123 " fill="none" stroke="black" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="6" y="143.4659">Alice</text>
              <!--MD5=[c7b555ef239d389d0d675cd9a0754097]
entity Carol-->
    <ellipse cx="58" cy="73" fill="white" rx="8" ry="8" stroke="black" stroke-width="1.5"/>
              <path d="M58,81 L58,108 M45,89 L71,89 M58,108 L45,123 M58,108 L71,123 " fill="none" stroke="black" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="40.5" y="143.4659">Carol</text>
              <!--MD5=[c88e65a0f892c31524c9bc6fd9ce900f]
entity Bob-->
    <ellipse cx="22" cy="165" fill="white" rx="8" ry="8" stroke="black" stroke-width="1.5"/>
              <path d="M22,173 L22,200 M9,181 L35,181 M22,200 L9,215 M22,200 L35,215 " fill="none" stroke="black" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="9" y="235.4659">Bob</text>
              <!--MD5=[b4abd927c12b35b2373c4b10a59a2d04]
link fe1 to dp1-->
    <!--MD5=[0b5c62acd3729a168489d13e219b0a81]
link dp1 to kds1-->
    <!--MD5=[6fe112875d659f3ecdba08127ae69604]
link kds1 to db1-->
    <!--MD5=[2ffa73bf99866d9af543039b1cc480d7]
link dp2 to kds2-->
    <!--MD5=[13bfe17d667997775958745140a3b961]
link kds2 to db2-->
    <!--MD5=[8a7a7137ef672f6a04b4eaa1d298ca38]
link fe3 to dp3-->
    <!--MD5=[690804d792639335b8b912dad14117bc]
link dp3 to kds3-->
    <!--MD5=[7c28b1aa1e222384d1ab744461108b5e]
link kds3 to db3-->
    <!--MD5=[78f82030de044bb72c37bb59db174ae5]
link Alice to Carol-->
    <!--MD5=[4f71f409538e0adb0acbb0c2b0e67ce9]
link Alice to Bob-->
    <!--MD5=[14b4b52f2a3c41f46a2fd0c83e787c82]
@startuml

skinparam ranksep 2
skinparam nodesep 2

actor Alice
actor Carol
rectangle "Sender Messaging Platform" as SMP {
  node "Front End" as fe1
  node "Discovery Provider" as dp1
  node "Key Distribution Service" as kds1
  database "Mappings DB Alice,Carol,..." as db1
}
fe1 - -[hidden]> dp1
dp1 - -[hidden]> kds1
kds1 - -[hidden]> db1

rectangle "Third Party Platform" as TPP {
  node "Discovery Provider" as dp2
  node "Key Distribution Service" as kds2
  database "Mappings DB Bob,..." as db2
}
dp2 - -[hidden]> kds2
kds2 - -[hidden]> db2

rectangle "Potential Recipient\nMessaging Platform" as PRMP {
  node "Front End" as fe3
  node "Discovery Provider" as dp3
  node "Key Distribution Service" as kds3
  database "Mappings DB Bob,..." as db3
}
fe3 - -[hidden]> dp3
dp3 - -[hidden]> kds3
kds3 - -[hidden]> db3

actor Bob


@enduml

PlantUML version 1.2020.02(Sun Mar 01 10:22:07 UTC 2020)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 17.0.8+7-Debian-1
Operating System: Linux
Default Encoding: UTF-8
Language: en
Country: US
-->
  </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[,-----.  ,-----.   ,---------.           ,------------------.           ,---------.       
|Alice|  |Carol|   |Front End|           |Discovery Provider|           |Front End|       
|-----|  |-----|   |---------|           |------------------|           |---------|       
|-----|--|-----|   |---------|           |------------------|           |---------|       
`-----'  `-----'   `---------'           `------------------'           `---------'       
   |                     |                         |                         |            
   |                     |                         |                         |            
 ,---.         ,------------------.   ,------------------------.   ,------------------.   
 |Bob|         |Discovery Provider|   |Key Distribution Service|   |Discovery Provider|   
 |---|         |------------------|   |------------------------|   |------------------|   
 |---|         |------------------|   |------------------------|   |------------------|   
 `---'         `------------------'   `------------------------'   `------------------'   
                         |                         |                         |            
            ,------------------------.   ,-------------------.  ,------------------------.
            |Key Distribution Service|   |Mappings DB Bob,...|  |Key Distribution Service|
            |------------------------|   |-------------------|  |------------------------|
            |------------------------|   |-------------------|  |------------------------|
            `------------------------'   `-------------------'  `------------------------'
                         |                                                   |            
                                                                                          
          ,---------------------------.                            ,-------------------.  
          |Mappings DB Alice,Carol,...|                            |Mappings DB Bob,...|  
          |---------------------------|                            |-------------------|  
          |---------------------------|                            |-------------------|  
          `---------------------------'                            `-------------------'  
]]></artwork>
      </artset>
      <t>Figure 1: Threat actors and systems</t>
      <ul spacing="normal">
        <li>
          <t>Third Party Platform: A platform that provides discovery services but is not a messaging service provider. Bob might register with such a service directly, or such a service may act as a proxy for Messaging Platform 2 through contractual business agreement.</t>
        </li>
        <li>
          <t>Front End: A service within a platform that receives users' requests and collaborates with other services to process them.</t>
        </li>
        <li>
          <t>Discovery Provider: Works to resolve SII to SSI.</t>
        </li>
        <li>
          <t>Key Distribution Service: Manages public key material of registered users.</t>
        </li>
      </ul>
    </section>
    <section anchor="privacy-requirements">
      <name>Privacy requirements</name>
      <ol spacing="normal" type="1"><li>
          <t><strong>Social graph</strong>: Discovery service providers should not learn the SII or SSI a user is querying for unless they are sending or receiving a message on to that user.</t>
        </li>
        <li>
          <t><strong>Querying user identity</strong>: A discovery service provider should not share the querying user identity with other discovery services when it requires their help for discovery.</t>
        </li>
        <li>
          <t><strong>Metadata</strong>: Discovery service should not learn the exact timing of when a message is sent (after discovery).</t>
        </li>
      </ol>
      <section anchor="requirements-by-threat-actor">
        <name>Requirements by threat actor</name>
        <t>The following table describes the requirements to protect the privacy of an intended recipient's SSI during discovery broken down by the various threat actors. The possible list of services that may resolve a discovery request based on their knowledge of the SSI is shown in the first column. The second and third columns are the minimum and possible privacy requirements. The optimal privacy requirements assume that the two devices in E2EE messaging endpoints are on different messaging service platforms.</t>
        <t>Note that current messaging systems segment a user's social graph across their contacts' messaging services. Without proper privacy mitigations, a discovery process for the new interoperable ecosystem can enable an attacker to aggregate these fragments of the user's social graph across different services, violating their privacy. Performing the discovery process for contacts that are never used is common so that it is very likely that most clients will perform discovery for SII’s that they never send a message to. This is why we propose hiding the SII from the sender platform unless a message is sent. We believe this is possible technically because:</t>
        <ol spacing="normal" type="1"><li>
            <t>Spam prevention requirements only apply to sent messages (standard IP based techniques can be used to prevent DDoS of the discovery service itself).</t>
          </li>
          <li>
            <t>Client costs for SII hiding mechanisms scale well enough with database size + number of services.</t>
          </li>
        </ol>
        <table>
          <thead>
            <tr>
              <th align="left">Service</th>
              <th align="left">Minimum privacy requirements</th>
              <th align="left">Optimal privacy  requirements</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Sender Platform</td>
              <td align="left">Do not hide SSI</td>
              <td align="left">Hide SSI</td>
            </tr>
            <tr>
              <td align="left">Recipient Platform with SSI</td>
              <td align="left">Do not hide SSI</td>
              <td align="left">Do not hide SSI</td>
            </tr>
            <tr>
              <td align="left">Non-recipient Platform with SSI</td>
              <td align="left">Hide SSI</td>
              <td align="left">Hide SSI</td>
            </tr>
            <tr>
              <td align="left">Non-recipient Platform without SSI</td>
              <td align="left">Hide SSI</td>
              <td align="left">Hide SSI</td>
            </tr>
            <tr>
              <td align="left">Third party service</td>
              <td align="left">Hide SSI</td>
              <td align="left">Hide SSI</td>
            </tr>
          </tbody>
        </table>
        <t>Table 1: Discovery privacy requirements by threat actors</t>
      </section>
    </section>
    <section anchor="privacy-non-requirements">
      <name>Privacy non-requirements</name>
      <ol spacing="normal" type="1"><li>
          <t><strong>Hiding SII &lt;&gt; service mapping</strong>: Hiding service reachability or the existence of a mapping between an SII and SSI for a service provider is an explicit non-goal. 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 privacy goal (and would not be feasible to implement). <strong>However it may be a business goal to prevent scraping of the full list of account-holders.</strong></t>
        </li>
        <li>
          <t><strong>Contact lookup by name</strong> or anything except an SII.</t>
        </li>
      </ol>
    </section>
    <section anchor="other-non-functional-requirements">
      <name>Other Non-functional Requirements</name>
      <ol spacing="normal" type="1"><li>
          <t>No single entity should be financially responsible for resolving all discovery queries (e.g. even within a geographical region).</t>
        </li>
        <li>
          <t>Costs for each participating entity of storing and resolving SII should be proportional to their number of participating users.</t>
        </li>
        <li>
          <t>Performance should support each client device resolving users' contact SIIs at least once every 24 hours.</t>
        </li>
      </ol>
    </section>
    <section anchor="ssi-discovery">
      <name>SSI Discovery</name>
      <t>SSI discovery means retrieving the SSI that an SII maps to. There are two alternative cryptographic techniques to achieve the privacy properties for the retrieval:</t>
      <ol spacing="normal" type="1"><li>
          <t>Private Information Retrieval (PIR)</t>
        </li>
        <li>
          <t>Private Set Membership (PSM)</t>
        </li>
      </ol>
      <t>The discovery process is illustrated in Figure 2. Optionally, Alice’s client may encrypt the SSI of interest using PIR or PSM before forwarding the SII query to the Discovery Provider of the Sender Messaging Platform.</t>
      <t>The DP for the Sender Messaging Platform may either look up or compute an encrypted response directly, or it may forward the request to the Potential Recipient or Third Party Discovery Provider indicated by the provider identifier included in the request. Regardless of which party processes the request, a DP will compute an encrypted response and forward it back to Alice. Alice can then decrypt the encrypted response (if applicable) to obtain the SSI.</t>
      <t>Alice’s client may also optionally send the discovery request directly to a potential recipient or 3p DPs.</t>
      <t>We assume a fixed list of DPs for each SMP so that the client does not have to specify in the query request which DPs to use.</t>
      <artset>
        <artwork type="svg"><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="479px" preserveAspectRatio="none" version="1.1" viewBox="0 0 657 479" width="657px">
            <defs/>
            <g>
              <line x1="33" x2="33" y1="60.1358" y2="417.49" stroke="black" stroke-width="1.0"/>
              <line x1="233.5" x2="233.5" y1="60.1358" y2="417.49" stroke="black" stroke-width="1.0"/>
              <line x1="449.5" x2="449.5" y1="60.1358" y2="417.49" stroke="black" stroke-width="1.0"/>
              <rect fill="white" height="33.0679" width="46" x="8" y="22.0679" stroke="black" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="15" y="44.0339">Alice</text>
              <rect fill="white" height="33.0679" width="46" x="8" y="416.49" stroke="black" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="15" y="438.4559">Alice</text>
              <rect fill="white" height="52.1358" width="201" x="131.5" y="3" stroke="black" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="138.5" y="24.9659">Sender Messaging Platform</text>
              <text fill="black" font-family="sans-serif" font-size="14" x="170" y="44.0339">Discovery Provider</text>
              <rect fill="white" height="52.1358" width="201" x="131.5" y="416.49" stroke="black" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="138.5" y="438.4559">Sender Messaging Platform</text>
              <text fill="black" font-family="sans-serif" font-size="14" x="170" y="457.5238">Discovery Provider</text>
              <rect fill="white" height="52.1358" width="202" x="346.5" y="3" stroke="black" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="353.5" y="24.9659">Potential Recipient or Third</text>
              <text fill="black" font-family="sans-serif" font-size="14" x="366.5" y="44.0339">Party Discovery Provider</text>
              <rect fill="white" height="52.1358" width="202" x="346.5" y="416.49" stroke="black" stroke-width="1.5"/>
              <text fill="black" font-family="sans-serif" font-size="14" x="353.5" y="438.4559">Potential Recipient or Third</text>
              <text fill="black" font-family="sans-serif" font-size="14" x="366.5" y="457.5238">Party Discovery Provider</text>
              <line x1="33" x2="75" y1="93.8419" y2="93.8419" stroke="black" stroke-width="1.0"/>
              <line x1="75" x2="75" y1="93.8419" y2="106.8419" stroke="black" stroke-width="1.0"/>
              <line x1="34" x2="75" y1="106.8419" y2="106.8419" stroke="black" stroke-width="1.0"/>
              <polygon fill="black" points="44,102.8419,34,106.8419,44,110.8419,40,106.8419" stroke="black" stroke-width="1.0"/>
              <text fill="black" font-family="sans-serif" font-size="13" x="40" y="88.0328">0. resolve SII</text>
              <polygon fill="black" points="222,134.5479,232,138.5479,222,142.5479,226,138.5479" stroke="black" stroke-width="1.0"/>
              <line x1="33" x2="228" y1="138.5479" y2="138.5479" stroke="black" stroke-width="1.0"/>
              <text fill="black" font-family="sans-serif" font-size="13" x="40" y="132.7389">1. SII | Encrypted(SII)</text>
              <polygon fill="black" points="437.5,166.2539,447.5,170.2539,437.5,174.2539,441.5,170.2539" stroke="black" stroke-width="1.0"/>
              <line x1="33" x2="443.5" y1="170.2539" y2="170.2539" stroke="black" stroke-width="1.0"/>
              <text fill="black" font-family="sans-serif" font-size="13" x="40" y="164.4449">1b. SII | Encrypted(SII)</text>
              <line x1="234" x2="276" y1="201.9599" y2="201.9599" stroke="black" stroke-width="1.0"/>
              <line x1="276" x2="276" y1="201.9599" y2="214.9599" stroke="black" stroke-width="1.0"/>
              <line x1="235" x2="276" y1="214.9599" y2="214.9599" stroke="black" stroke-width="1.0"/>
              <polygon fill="black" points="245,210.9599,235,214.9599,245,218.9599,241,214.9599" stroke="black" stroke-width="1.0"/>
              <text fill="black" font-family="sans-serif" font-size="13" x="241" y="196.1509">2. Lookup | Compute Response</text>
              <polygon fill="black" points="437.5,242.6659,447.5,246.6659,437.5,250.6659,441.5,246.6659" stroke="black" stroke-width="1.0"/>
              <line x1="234" x2="443.5" y1="246.6659" y2="246.6659" stroke="black" stroke-width="1.0"/>
              <text fill="black" font-family="sans-serif" font-size="13" x="241" y="240.8569">3. SII | Encrypted(SII)</text>
              <line x1="449.5" x2="491.5" y1="278.3719" y2="278.3719" stroke="black" stroke-width="1.0"/>
              <line x1="491.5" x2="491.5" y1="278.3719" y2="291.3719" stroke="black" stroke-width="1.0"/>
              <line x1="450.5" x2="491.5" y1="291.3719" y2="291.3719" stroke="black" stroke-width="1.0"/>
              <polygon fill="black" points="460.5,287.3719,450.5,291.3719,460.5,295.3719,456.5,291.3719" stroke="black" stroke-width="1.0"/>
              <text fill="black" font-family="sans-serif" font-size="13" x="456.5" y="272.5629">4. Lookup | Compute Response</text>
              <polygon fill="black" points="245,319.0779,235,323.0779,245,327.0779,241,323.0779" stroke="black" stroke-width="1.0"/>
              <line x1="239" x2="448.5" y1="323.0779" y2="323.0779" stroke="black" stroke-width="1.0"/>
              <text fill="black" font-family="sans-serif" font-size="13" x="251" y="317.2689">5. SSI | Encrypted(SSI)</text>
              <polygon fill="black" points="44,350.784,34,354.784,44,358.784,40,354.784" stroke="black" stroke-width="1.0"/>
              <line x1="38" x2="233" y1="354.784" y2="354.784" stroke="black" stroke-width="1.0"/>
              <text fill="black" font-family="sans-serif" font-size="13" x="50" y="348.975">6. SSI | Encrypted(SSI)</text>
              <line x1="33" x2="75" y1="386.49" y2="386.49" stroke="black" stroke-width="1.0"/>
              <line x1="75" x2="75" y1="386.49" y2="399.49" stroke="black" stroke-width="1.0"/>
              <line x1="34" x2="75" y1="399.49" y2="399.49" stroke="black" stroke-width="1.0"/>
              <polygon fill="black" points="44,395.49,34,399.49,44,403.49,40,399.49" stroke="black" stroke-width="1.0"/>
              <text fill="black" font-family="sans-serif" font-size="13" x="40" y="380.681">7. SSI | Decrypt Response =&gt;SSI</text>
              <!--MD5=[da3d87d7e7e4d21e2d1f9729b6716f6b]
@startuml

participant Alice as A
participant "Sender Messaging Platform\nDiscovery Provider" as B
participant "Potential Recipient or Third \nParty Discovery Provider" as C

A->A: 0. resolve SII
A->B: 1. SII | Encrypted(SII)
A- ->C: 1b. SII | Encrypted(SII)
B->B: 2. Lookup | Compute Response
B- ->C: 3. SII | Encrypted(SII)
C- ->C: 4. Lookup | Compute Response
C- ->B: 5. SSI | Encrypted(SSI)
B->A: 6. SSI | Encrypted(SSI)
A->A: 7. SSI | Decrypt Response =>SSI

@enduml

PlantUML version 1.2020.02(Sun Mar 01 10:22:07 UTC 2020)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 17.0.8+7-Debian-1
Operating System: Linux
Default Encoding: UTF-8
Language: en
Country: US
-->
  </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[                                ┌─────────────────────────┐          ┌─────────────────────────────┐                  
     ┌─────┐                    │Sender Messaging Platform│          │Potential Recipient or Third │                  
     │Alice│                    │Discovery Provider       │          │Party Discovery Provider     │                  
     └──┬──┘                    └────────────┬────────────┘          └──────────────┬──────────────┘                  
        ────┐                                │                                      │                                 
            │ 0. resolve SII                 │                                      │                                 
        <───┘                                │                                      │                                 
        │                                    │                                      │                                 
        │      1. SII | Encrypted(SII)       │                                      │                                 
        │───────────────────────────────────>│                                      │                                 
        │                                    │                                      │                                 
        │                         1b. SII | Encrypted(SII)                          │                                 
        │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─>│                                 
        │                                    │                                      │                                 
        │                                    ────┐                                  │                                 
        │                                        │ 2. Lookup | Compute Response     │                                 
        │                                    <───┘                                  │                                 
        │                                    │                                      │                                 
        │                                    │       3. SII | Encrypted(SII)        │                                 
        │                                    │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ >│                                 
        │                                    │                                      │                                 
        │                                    │                                      ─ ─ ┐                             
        │                                    │                                          | 4. Lookup | Compute Response
        │                                    │                                      < ─ ┘                             
        │                                    │                                      │                                 
        │                                    │       5. SSI | Encrypted(SSI)        │                                 
        │                                    │<─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─│                                 
        │                                    │                                      │                                 
        │      6. SSI | Encrypted(SSI)       │                                      │                                 
        │<───────────────────────────────────│                                      │                                 
        │                                    │                                      │                                 
        ────┐                                │                                      │                                 
            │ 7. SSI | Decrypt Response =>SSI│                                      │                                 
        <───┘                                │                                      │                                 
     ┌──┴──┐                    ┌────────────┴────────────┐          ┌──────────────┴──────────────┐                  
     │Alice│                    │Sender Messaging Platform│          │Potential Recipient or Third │                  
     └─────┘                    │Discovery Provider       │          │Party Discovery Provider     │                  
                                └─────────────────────────┘          └─────────────────────────────┘                  
]]></artwork>
      </artset>
      <t>Figure 2: Discovery with Sender Messaging Platform</t>
      <t><strong>Note:</strong>
* Note that the DPs should not learn that Alice is the author of the request.
* Alice is not required to hide discovery requests when the processor DP is within the Sender Messaging Platform.
* Alice’s client may, but is not required to hide discovery requests from Potential Recipient DPs. Both of these requests can be sent in the clear.</t>
      <section anchor="private-information-retrieval-pir">
        <name>Private Information Retrieval (PIR)</name>
        <t>A PIR 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 decode a response from the server. It also provides an algorithm for the server to compute a response.</t>
        <t>We proposed a lattice-based 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 a very large database with 10 billion records/mappings.</t>
        <section anchor="cost-estimates">
          <name>Cost estimates</name>
          <t>Use database shards each of ~1 million mappings. 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/Metric</th>
                <th align="left">Cost estimate</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Server Storage Per Device</td>
                <td align="left">14 MB</td>
              </tr>
              <tr>
                <td align="left">Client Device Storage (for 10 billion records)</td>
                <td align="left">5 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>
        </section>
      </section>
      <section anchor="private-set-membership-psm">
        <name>Private Set Membership (PSM)</name>
        <t>The discovery provider holds a set of SIIs that maps to an associated set of SSI. A PSM protocol enables a client with an SII to lean the associated SSI held by the server with the following privacy guarantees:</t>
        <ol spacing="normal" type="1"><li>
            <t>The discovery provider does not learn the SII held by the client.</t>
          </li>
          <li>
            <t>The discovery provider does not learn whether a matching SII was found or not.</t>
          </li>
          <li>
            <t>The client does not learn any information about the other SIIs and associated SSIs held by the discovery provider.</t>
          </li>
        </ol>
        <t>An open source implementation is available <eref target="https://github.com/google/private-membership">here</eref>.</t>
        <section anchor="cost-estimates-1">
          <name>Cost estimates</name>
          <t>For a database with 1.28 TB (10 billion associated records of SSI), using 1,000 shards each of size 10 million records, the cost estimate for each query is:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Parameter/Metric</th>
                <th align="left">Cost estimate</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Communication</td>
                <td align="left">2.8 MB</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">1-2s</td>
              </tr>
            </tbody>
          </table>
        </section>
      </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>
            <t>Alice messages Bob at Bob's preferred service (bob@Threema)</t>
          </li>
          <li>
            <t>Eve messages Alice impersonating Bob using bob@FooService</t>
          </li>
          <li>
            <t>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.</t>
          </li>
        </ul>
        <t>Options for solving this are:
1. Storing the supported services for a contact in Contacts and if a recipient 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="thoughts-on-open-questions-from-10102023-interim-meetingmimi20231010">
      <name>Thoughts on open questions from 10/10/2023 Interim Meeting<xref target="MIMI20231010"/></name>
      <section anchor="trusted-authorities-for-mapping-siis-to-ssis">
        <name>Trusted Authorities for Mapping SIIs to SSIs</name>
        <t><em>Which actors should be trusted authorities for mapping SIIs to SSIs?</em></t>
        <t>In general, this should be considered out of scope for this proposal, however we expect that by default, Messaging Service Providers (MSP) should be trusted authorities for creating these mapping. Users may "own" their SIIs, but messaging service providers own SSIs. MSP should verify ownership of SIIs (one time password code to phone via text or call, or to email).</t>
        <t>An MSP may share established mapping data with 3P discovery providers to facilitate lookups, or may delegate establishing new mappings to these providers under contractual agreements between them. Preferably, delegate discovery providers should be lookup providers only and should not create or update existing mappings unless the delegate is a reputable/trusted certification authority.</t>
        <t>If a 3p discovery service is used, it may also authenticate the mapping independently or it may act as a pass-through for a signed mapping by an MSP or another identity provider.</t>
        <t>SSL is sufficient to authenticate the mapping assertion.</t>
      </section>
      <section anchor="discovery-scaling">
        <name>Discovery Scaling</name>
        <t><em>Does discovery need to scale to accommodate 10s, 100s, or 1000s of service?</em></t>
        <t>A discovery request should be sent to a specific MSP or 3P discovery provider. It is up to those providers if they want to fan out the discovery to other providers or answer the discovery request from its own mapping only. It will be costly to fork out discovery requests to a large number of discovery providers while completely hiding the SSI from these providers.  We do not want forking to fit DDoS patterns on these services.</t>
        <t>However the protocols should be feasible (in terms of computation and communication cost) for 1000s of services.</t>
      </section>
      <section anchor="acceptable-leakage-for-discovery">
        <name>Acceptable leakage for discovery</name>
        <t><em>What is it acceptable for queries to reveal about the social graph, and to whom?</em></t>
        <t>A query should not reveal the SII in a user's query to discovery providers unless the discovery provider is also within the Sender's platform or the Recipient's platform with the SSI mapping. For an encrypted query and <strong>since discovery precedes E2EE messaging</strong>, a discovery provider won't be able to tell if the SSI maps to an SSI in its service. It is okay to take the no-leakage approach for all providers.</t>
        <t>Alice may use the different provider owning each SSI that her phone maps to. Bob may use different email addresses to map to multiple SSI with the same provider.</t>
        <t>Returning an SSI set of different cardinalities leaks information to a discovery provider about the likely sets of SSIs that are of interest for a query. A one-to-one mapping of SII to SSI does not leak such information. A discovery provider cannot tell when a privacy-preserving discovery returns an empty result or a single SII. However, it will be able to tell when a large number of SSIs are returned.</t>
      </section>
      <section anchor="rate-limiting">
        <name>Rate Limiting</name>
        <t><em>Is rate limiting useful to prevent scraping?</em></t>
        <t>It is up to a discovery provider to rate-limit given the potential computational cost of responding to batch queries from a single user. Nonetheless, we should require that a user should be able to look up no less than 50 SII per discovery provider for each messaging provider in a given 24 hours period. Third party discovery providers are under obligation to messaging service providers and are excluded from the minimum discovery load per user.</t>
      </section>
      <section anchor="sii-mappings">
        <name>SII Mappings</name>
        <t><em>An SII may map to multiple SSIs. Should the requestor learn all of them, and if so, how?</em></t>
        <ul spacing="normal">
          <li>
            <t><em>One service that returns all SSIs for an SII?</em></t>
          </li>
          <li>
            <t><em>Query each service provider independently?</em></t>
          </li>
          <li>
            <t><em>User figures out out-of-band what service provider to query?</em></t>
          </li>
        </ul>
        <t>SII mapping to multiple SSIs within a single provider</t>
        <ol spacing="normal" type="1"><li>
            <t>This is a choice that MSPs will have to make, if they want to allow it.</t>
          </li>
          <li>
            <t>Having multiple SSIs per SII makes preserving the privacy of discovery more challenging because of the side channel leakage of response size. The tradeoff is acceptable if on the average users have multiple SSI with a MSP.</t>
          </li>
          <li>
            <t>For privacy reasons (i.e., protecting the association of multiple SSIs), the user may not want to group multiple SSIs together.</t>
          </li>
          <li>
            <t>We may devise a scheme where an SII could be suffixed with an index during registration and discovery of the SSI to retrieve from the set. For example, given an SII +1234567890, a user may map +12345678900 to the first Whatsapp SSI, and +1234567891 to the second Whatsapp SSI and so on.</t>
          </li>
        </ol>
        <t>The user should figure out out-of-band what discovery provider to query, and discovery providers should not be required to fork out discovery requests to other providers given the computational cost impact.</t>
      </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 anchor="appendix">
        <name>Appendix</name>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-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="MIMI20231010">
        <front>
          <title>Discovery requirements</title>
          <author fullname="Tim Geoghegan">
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
        <seriesInfo name="MIMI Virtual interim October 10, 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 356?>

<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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
OxWsrkGdmmhOjcOTIC+c9pSgWebLyRMDqKWmlOkkenUyGLC361m4slFWucKe
N6QuRafnGce8UhvMCdBS3L0ohauTSQWQC6yO46FFIwdntlTr2nqb4mLVtHvO
e/LVRbGwvr8mOMtvfQFy//ry7QFtpxt2Yymz6yuP+9c3VweS0N/1c8jIp2lD
9elaSm6ajgA8sli0nxThc5qL/RPdETpzWkz2jMI+s89HfrzkaqkRADQBAwgJ
KwH8tYbJDx0VDuRUaHqibO/535cMHAtxF9eef/cOFbQTPqB0qg2ONXt6q6Kp
2R1tC+R69LbyHKpulAwfcxHJSkFfoh0Tw/xND5EJoukZ74GGWL3lLFa3sk/B
ypTWXgAbduva0jIvpRsdhIeYQL472MXe6MO005l3tCYUnc1uiU4Wh7Fm6slT
qynIjW0rDz2w9pM5u4KgE+rsgODk0zpSWrRI1ydnUQofO/fSKC5x1wF0e+D2
ig9bb54bW3FagHpSCfB3NXiLoHU/AFlnE/C+VYyUaHZePi3rlFInY07uLVf+
fDVL5NphJptCcDES6mvclzwfeD0J+Frcqcx55/H9WfG/ZPckQp93ATwooX/J
7pNRBvUCezR6dn5mjsdh0osePj+jCgud6E/mpdt+Lqji7ejZC7ye3vP+Oc+G
znktpvYTbJOI5VuVHgxhEKf3QHghr588BILGYJmnY9ZWHRA3ggTo+uqet0L1
r93bC5V1B9z87hlecELXZXRPQt9V3Or7dm4wODyk+P4MvsehaSN91ojXvTm7
yAmIVtOkAcopS6cZXNnUJX7VGeaQimOBnSOkObKgHAuoUBZJp7j6gDI+7DUW
wzD9/BgsOHztk1Q6uua5dtFInsBP0qCR40zFdEYMk9zaY+zo4JyNFuXN8lme
aqKComWlhbxE8Ya4+P/B7IM/2tt5IKlgbZBiDeXCSCignPNQpehDsYAudcCA
mGIqIq/yWnojKBlP2GjzkCgaSjs0mW9Wyskr/pCw/1BRLJBp10tneY5iJR1m
N77rCJ4vmQzniXDSw2UqtD3JssVp2zWoDYLwnFpmgrrmIpTk+4fxRjSlKEPN
basRhVrv6jBfHNOoaGx8XkA85JGu23KiLXO0iRXIQ5Qu4KnWyxXr2IXNLHk1
YKmsS+TDRFE5KGqtUpAmEYZf1mJw/BqUpHKQvYuhOGEdb0A9TLEsmpah5A3O
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

-->

</rfc>
