<?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.21 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-gougeon-imap-webpush-00" category="info" submissionType="independent" version="3">
  <!-- xml2rfc v2v3 conversion 3.25.0 -->
  <front>
    <title>The IMAP WEBPUSH extension</title>
    <seriesInfo name="Internet-Draft" value="draft-gougeon-imap-webpush-00"/>
    <author fullname="Simon Gougeon">
      <organization/>
      <address>
        <email>ietf@sgougeon.fr</email>
      </address>
    </author>
    <date year="2025" month="January" day="24"/>
    <abstract>
      <?line 51?>

<t>This document defines a WEBPUSH extension of the Internet Message Access Protocol (IMAP) that permits IMAP servers to send WebPush notifications.</t>
    </abstract>
  </front>
  <middle>
    <?line 55?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>WebPush (defined by <xref target="RFC8030"/>, <xref target="RFC8291"/> and <xref target="RFC8292"/>) defines a way for applications to deliver real-time events in a timely fashion, with push notifications. Push notifications allows consolidating all real-time events into a single session which ensures more efficient use of network and radio resources. They are particularly used in mobile environments.</t>
      <t>Many use cases have led to a need for real-time events with email. IMAP support for real-time events has been added with the IDLE command (<xref target="RFC2177"/>, <xref target="RFC9051"/>) and the NOTIFY extension (<xref target="RFC5465"/>). These commands require using a persistent connection per account and contribute to unnecessary use of the device radio.</t>
      <t>JMAP (<xref target="RFC8620"/>) has responded to this need by supporting WebPush from the beginning.</t>
      <t>Therefore, this extension permits IMAP servers to send WebPush notifications.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>In examples, "C:" and "S:" indicate lines sent by the client and server, respectively. Lines ending in "\" are interrupted for presentation reasons, they would actually be joined to the next line. Note that each other line includes the terminating CRLF.</t>
      <t>User agent, is defined in <xref target="RFC8030"/> as a device and software that is the recipient of push messages. It describes here the mail client.</t>
      <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?>

</section>
    <section anchor="overview">
      <name>Overview</name>
      <t>This extension adds 3 commands: GETVAPID, WEBPUSH and LWEBPUSH. GETVAPID allows to get the server VAPID public key, WEBPUSH to subscribe a new push registration and LWEBPUSH to list current registrations. Every time a message is added to one of the subscribed mailbox (with the SUBSCRIBE command), the IMAP server sends a push message to the registered push endpoints.</t>
    </section>
    <section anchor="client-commands">
      <name>Client Commands</name>
      <section anchor="getvapid-command">
        <name>GETVAPID Command</name>
        <dl>
          <dt>Arguments:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Responses:</dt>
          <dd>
            <dl>
              <dt><bcp14>REQUIRED</bcp14> untagged response:</dt>
              <dd>
                <t>VAPID</t>
              </dd>
            </dl>
          </dd>
          <dt>Result:</dt>
          <dd>
            <dl>
              <dt>OK -</dt>
              <dd>
                <t>capability completed</t>
              </dd>
            </dl>
          </dd>
          <dt/>
          <dd>
            <dl>
              <dt>BAD -</dt>
              <dd>
                <t>arguments invalid</t>
              </dd>
            </dl>
          </dd>
        </dl>
        <t>The GETVAPID command requests the VAPID public key (<xref target="RFC8292"/>) of the server. the server <bcp14>MUST</bcp14> send a single untagged VAPID response before the tagged OK response. This is used by clients to request a push endpoint on their push server restricted to this mail server.</t>
        <t>Example:</t>
        <artwork><![CDATA[
C: a1 GETVAPID
S: * VAPID \
    "BOniQ9xHBPNY9gnQW4o-16vHqOb40pEIMifyUdFsxAgy\
    zVkFMguxw0QrdbZcq8hRjN2zpeInRvKVPlkzABvuTnI"
S: a1 OK GETVAPID completed
]]></artwork>
      </section>
      <section anchor="webpush-command">
        <name>WEBPUSH Command</name>
        <dl>
          <dt>Arguments (create/update):</dt>
          <dd>
            <t>registration ID</t>
          </dd>
          <dt/>
          <dd>
            <t>push endpoint</t>
          </dd>
          <dt/>
          <dd>
            <t>ECDH public key</t>
          </dd>
          <dt/>
          <dd>
            <t>authentication secret</t>
          </dd>
          <dt>Arguments (delete):</dt>
          <dd>
            <t>registration ID</t>
          </dd>
          <dt/>
          <dd>
            <t>NIL</t>
          </dd>
          <dt>Responses:</dt>
          <dd>
            <dl>
              <dt><bcp14>OPTIONAL</bcp14> untagged response:</dt>
              <dd>
                <t>WEBPUSH</t>
              </dd>
            </dl>
          </dd>
          <dt>Result:</dt>
          <dd>
            <dl>
              <dt>OK -</dt>
              <dd>
                <t>create completed</t>
              </dd>
            </dl>
          </dd>
          <dt/>
          <dd>
            <dl>
              <dt>NO -</dt>
              <dd>
                <t>create failure: can't create webpush registration with these arguments</t>
              </dd>
            </dl>
          </dd>
          <dt/>
          <dd>
            <dl>
              <dt>BAD -</dt>
              <dd>
                <t>command unknown or arguments invalid</t>
              </dd>
            </dl>
          </dd>
        </dl>
        <t>The VAPID command creates, updates or delete a push registration for the account. The server <bcp14>MAY</bcp14> return a single untagged VAPID response before the tagged OK response.</t>
        <t>The registration ID is uniq per account and identify the push registration. Sending a VAPID command with an existing registration ID updates the current registration. Sending a VAPID command with an existing registration ID following by NIL deletes the registration.</t>
        <t>The push endpoint <bcp14>MUST</bcp14> be the URI that the mail server sends push messages to. This is defined as the URI for push resource in <xref target="RFC8030"/>. This URI <bcp14>MUST</bcp14> use the "https" scheme.</t>
        <t>The ECDH public key is the user agent public key on the P-256 curve. It <bcp14>MUST</bcp14> be encoded in the uncompressed form <xref target="SEC_1"/> (section 2.3.3, replicated from X9.62), and base64url encoded as described in <xref target="RFC7515"/>. This is used to encrypt push notifications following <xref target="RFC8291"/>.</t>
        <t>The authentication secret is 16 random bytes. It <bcp14>MUST</bcp14> be base64url encoded as described in <xref target="RFC7515"/>. This is the salt used to encrypt push notifications following <xref target="RFC8291"/>.</t>
        <t>The client <bcp14>SHOULD</bcp14> register their push subscription from time to time, like when the client starts in order to restore registrations, in case the endpoint was removed.</t>
        <t>Example:</t>
        <artwork><![CDATA[
C: a1 LWEBPUSH "*"
S: a1 OK LWEBPUSH completed
C: a2 WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    https://push.example.net/push/random1 \
    BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcxaOzi6-AYWXvTBHm4bj\
    yPjs7Vd8pZGH6SRpkNtoIAiw4 \
    BTBZMqHH6r4Tts7J_aSIgg
S: * WEBPUSH "a8282bf9-6102-4e1b-bb61-d26d0e532e65" \
    "https://push.example.net/push/random1"
S: a2 OK WEBPUSH completed
C: a3 WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    https://push.example.net/push/JzLQ3raZJfFBR0aqvOMsLrt54w4rJUsV \
    BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcxaOzi6-AYWXvTBHm4bj\
    yPjs7Vd8pZGH6SRpkNtoIAiw4 \
    BTBZMqHH6r4Tts7J_aSIgg
S: * WEBPUSH "a8282bf9-6102-4e1b-bb61-d26d0e532e65" \
    "https://push.example.net/push/JzLQ3raZJfFBR0aqvOMsLrt54w4rJUsV"
S: a3 OK WEBPUSH completed
C: a4 LWEBPUSH "*"
S: * WEBPUSH "a8282bf9-6102-4e1b-bb61-d26d0e532e65" \
    "https://push.example.net/push/JzLQ3raZJfFBR0aqvOMsLrt54w4rJUsV"
S: a4 OK LWEBPUSH completed
C: a5 WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 NIL
S: a5 OK WEBPUSH completed
C: a6 LWEBPUSH "*"
S: a6 OK LWEBPUSH completed
]]></artwork>
      </section>
      <section anchor="lwebpush-command">
        <name>LWEBPUSH Command</name>
        <dl>
          <dt>Arguments:</dt>
          <dd>
            <t>registration ID with possible wildcards</t>
          </dd>
          <dt>Responses:</dt>
          <dd>
            <dl>
              <dt>untagged response:</dt>
              <dd>
                <t>WEBPUSH</t>
              </dd>
            </dl>
          </dd>
          <dt>Result:</dt>
          <dd>
            <dl>
              <dt>OK -</dt>
              <dd>
                <t>list completed</t>
              </dd>
            </dl>
          </dd>
          <dt/>
          <dd>
            <dl>
              <dt>NO -</dt>
              <dd>
                <t>list failure: can't list webpush records</t>
              </dd>
            </dl>
          </dd>
          <dt/>
          <dd>
            <dl>
              <dt>BAD -</dt>
              <dd>
                <t>arguments invalid</t>
              </dd>
            </dl>
          </dd>
        </dl>
        <t>The LWEBPUSH command returns a subset of webpush registrations from the complete set of all registrations available to the client. Zero or more untagged WEBPUSH responses are returned, containing information to identified the registrations. The server <bcp14>MUST</bcp14> return the WEBPUSH response for the exact registration ID if the account has a registration with this ID. It <bcp14>MUST</bcp14> return all the account's registrations if the argument is a wildcard "*".</t>
        <t>Example:</t>
        <artwork><![CDATA[
C: a1 LWEBPUSH "*"
S: * WEBPUSH "a8282bf9-6102-4e1b-bb61-d26d0e532e65" \
    "https://push.endpoint.tld/random1"
S: * WEBPUSH "80a3b492-bc9c-46a9-91ab-5866b27073bb" \
    "https://push.endpoint.tld/random2"
S: * WEBPUSH "28626e4e-37d1-456c-a667-5258b5528508" \
    "https://push.endpoint.tld/random3"
S: a1 OK LWEBPUSH completed
C: a2 LWEBPUSH "a8282bf9-6102-4e1b-bb61-d26d0e532e65"
S: * WEBPUSH "a8282bf9-6102-4e1b-bb61-d26d0e532e65" \
    "https://push.endpoint.tld/random1"
S: a2 OK LWEBPUSH completed
]]></artwork>
      </section>
    </section>
    <section anchor="server-responses">
      <name>Server Responses</name>
      <section anchor="vapid-response">
        <name>VAPID Response</name>
        <t>The VAPID response occurs as a result of a GETVAPID command. It returns the server VAPID public key (<xref target="RFC8292"/>). This is a public key on the P-256 curve. It <bcp14>MUST</bcp14> be encoded in the uncompressed form <xref target="SEC_1"/> (section 2.3.3, replicated from X9.62), and base64url encoded as described in <xref target="RFC7515"/>. The server <bcp14>MAY</bcp14> use a different key pair for each account.</t>
        <t>Example:</t>
        <artwork><![CDATA[
S: * VAPID "BOniQ9xHBPNY9gnQW4o-16vHqOb40pEIMifyUdFsxAgy\
    zVkFMguxw0QrdbZcq8hRjN2zpeInRvKVPlkzABvuTnI"
]]></artwork>
      </section>
      <section anchor="webpush-response">
        <name>WEBPUSH Response</name>
        <t>The WEBPUSH response occurs as a result of a LWEBPUSH command. It <bcp14>MAY</bcp14> be returned as a result of a WEBPUSH command too. It contains the registration ID and the push endpoint of the registration.</t>
        <t>Example:</t>
        <artwork><![CDATA[
S: * WEBPUSH "a8282bf9-6102-4e1b-bb61-d26d0e532e65" \
    "https://push.endpoint.tld/random1"
]]></artwork>
      </section>
      <section anchor="sync-response">
        <name>SYNC Response</name>
        <t>The SYNC response is sent with a push notification by the server when a response that should be pushed exceed the 3993 bytes limit. It is used to inform the client that it <bcp14>SHOULD</bcp14> send a command to retrieve the response. It contains the response name in question. For example, if a server has a lot of flags, and the list exceed the limit, the server sends a SYNC for FLAGS.</t>
        <t>Example:</t>
        <artwork><![CDATA[
S: * SYNC FLAGS
]]></artwork>
      </section>
    </section>
    <section anchor="push-notifications">
      <name>Push notifications</name>
      <t>Once an account has one or more push registration (registered with WEBPUSH command), the server sends a push message for each registration every time a change is recorded. This can be a change for the account (for example when a new permanent FLAG is added) or for the subscribed mailboxes (new mail, deletions, flag changes).</t>
      <t>The notification is encrypted following <xref target="RFC8291"/> specifications, send following <xref target="RFC8030"/> and authorized with <xref target="RFC8292"/>.</t>
      <section anchor="content">
        <name>Content</name>
        <t>The server can send EXISTS, EXPUNGE, FETCH, and other responses at any time. Every response relative to a mailbox <bcp14>MUST</bcp14> be preceded by the mailbox name. The server <bcp14>MAY</bcp14> send multiple responses in a single push notification.</t>
        <t>As stated in RFC8291, the cleartext content of push notifications <bcp14>MUST NOT</bcp14> be longer than 3993 bytes. If the server wants to inform the client about a response longer than that, it <bcp14>MAY</bcp14> send a SYNC message.</t>
        <t>If the server sends a FETCH response, it <bcp14>MUST</bcp14> include a UID FETCH item. Every EXISTS response <bcp14>MUST</bcp14> be followed by a FETCH response. The FETCH response <bcp14>SHOULD</bcp14> contain the UID, the ENVELOPE, and the BINARY if it fits in the message length limits, or <bcp14>SHOULD</bcp14> contain the UID and the ENVELOPE, if it fits in the limits.</t>
        <t>So, when a new mail comes in, the server sends:</t>
        <ul spacing="normal">
          <li>
            <t>EXISTS</t>
          </li>
          <li>
            <t>and FETCH (UID ENVELOPE BINARY)</t>
          </li>
          <li>
            <t>or FETCH (UID ENVELOPE)</t>
          </li>
          <li>
            <t>or FETCH (UID)</t>
          </li>
        </ul>
        <t>Example of a push notification containing multiple responses for the "INBOX" mailbox::</t>
        <artwork><![CDATA[
INBOX 2 FETCH (UID 2 FLAGS (\Deleted \Seen))
INBOX 2 EXPUNGE
]]></artwork>
        <t>Example of a push notification when a new mail arrives in the "New messages" mailbox:</t>
        <artwork><![CDATA[
"New Messages" 2 EXISTS
"New Messages" 2 FETCH (UID 3 ENVELOPE \
    ("Mon, 7 Feb 1994 21:52:25 -0800 (PST)" \
    "afternoon meeting" \
    (("Fred Foobar" NIL "foobar" "Blurdybloop.example")) \
    (("Fred Foobar" NIL "foobar" "Blurdybloop.example")) \
    (("Fred Foobar" NIL "foobar" "Blurdybloop.example")) \
    ((NIL NIL "mooch" "owatagu.siam.edu.example")) \
    NIL NIL NIL "<B27397-0100000@Blurdybloop.example>"))
]]></artwork>
        <t>Example of a push notification to inform about a response longer than 3993 bytes:</t>
        <artwork><![CDATA[
SYNC FLAGS
]]></artwork>
      </section>
      <section anchor="push-server-response">
        <name>Push server response</name>
        <t>When the push server returns a <tt>429 Too many requests</tt>, it should have send a <tt>Retry-After</tt> headers <xref target="RFC9110"/> to indicate how long the server has to wait before sending another request. If this header is present, the server <bcp14>MUST</bcp14> follow the period requested. If this header is not present, the mail server <bcp14>SHOULD</bcp14> wait 5 minutes before sending another request to this endpoint.</t>
        <t>When the push server returns another 4XX status code, the mail server <bcp14>MUST</bcp14> removes the registration.</t>
        <t>When the push server returns a 5XX status code, the mail server <bcp14>SHOULD</bcp14> wait 5 minutes before sending another request to the endpoint.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The privacy and security considerations of <xref target="RFC8030"/> <xref target="RFC8291"/> and <xref target="RFC8292"/> all apply to the use of this extension.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC8030" target="https://www.rfc-editor.org/info/rfc8030" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8030.xml">
          <front>
            <title>Generic Event Delivery Using HTTP Push</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="E. Damaggio" initials="E." surname="Damaggio"/>
            <author fullname="B. Raymor" initials="B." role="editor" surname="Raymor"/>
            <date month="December" year="2016"/>
            <abstract>
              <t>This document describes a simple protocol for the delivery of real- time events to user agents. This scheme uses HTTP/2 server push.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8030"/>
          <seriesInfo name="DOI" value="10.17487/RFC8030"/>
        </reference>
        <reference anchor="RFC8292" target="https://www.rfc-editor.org/info/rfc8292" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8292.xml">
          <front>
            <title>Voluntary Application Server Identification (VAPID) for Web Push</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="P. Beverloo" initials="P." surname="Beverloo"/>
            <date month="November" year="2017"/>
            <abstract>
              <t>An application server can use the Voluntary Application Server Identification (VAPID) method described in this document to voluntarily identify itself to a push service. The "vapid" authentication scheme allows a client to include its identity in a signed token with requests that it makes. The signature can be used by the push service to attribute requests that are made by the same application server to a single entity. The identification information can allow the operator of a push service to contact the operator of the application server. The signature can be used to restrict the use of a push message subscription to a single application server.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8292"/>
          <seriesInfo name="DOI" value="10.17487/RFC8292"/>
        </reference>
        <reference anchor="RFC8291" target="https://www.rfc-editor.org/info/rfc8291" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8291.xml">
          <front>
            <title>Message Encryption for Web Push</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <date month="November" year="2017"/>
            <abstract>
              <t>This document describes a message encryption scheme for the Web Push protocol. This scheme provides confidentiality and integrity for messages sent from an application server to a user agent.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8291"/>
          <seriesInfo name="DOI" value="10.17487/RFC8291"/>
        </reference>
        <reference anchor="RFC9051" target="https://www.rfc-editor.org/info/rfc9051" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9051.xml">
          <front>
            <title>Internet Message Access Protocol (IMAP) - Version 4rev2</title>
            <author fullname="A. Melnikov" initials="A." role="editor" surname="Melnikov"/>
            <author fullname="B. Leiba" initials="B." role="editor" surname="Leiba"/>
            <date month="August" year="2021"/>
            <abstract>
              <t>The Internet Message Access Protocol Version 4rev2 (IMAP4rev2) allows a client to access and manipulate electronic mail messages on a server. IMAP4rev2 permits manipulation of mailboxes (remote message folders) in a way that is functionally equivalent to local folders. IMAP4rev2 also provides the capability for an offline client to resynchronize with the server.</t>
              <t>IMAP4rev2 includes operations for creating, deleting, and renaming mailboxes; checking for new messages; removing messages permanently; setting and clearing flags; parsing per RFCs 5322, 2045, and 2231; searching; and selective fetching of message attributes, texts, and portions thereof. Messages in IMAP4rev2 are accessed by the use of numbers. These numbers are either message sequence numbers or unique identifiers.</t>
              <t>IMAP4rev2 does not specify a means of posting mail; this function is handled by a mail submission protocol such as the one specified in RFC 6409.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9051"/>
          <seriesInfo name="DOI" value="10.17487/RFC9051"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <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>
        <reference anchor="RFC9110" target="https://www.rfc-editor.org/info/rfc9110" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="SEC_1" target="https://www.secg.org/sec1-v2.pdf">
          <front>
            <title>SEC 1: Elliptic Curve Cryptography</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC7515" target="https://www.rfc-editor.org/info/rfc7515" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7515.xml">
          <front>
            <title>JSON Web Signature (JWS)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and an IANA registry defined by that specification. Related encryption capabilities are described in the separate JSON Web Encryption (JWE) specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7515"/>
          <seriesInfo name="DOI" value="10.17487/RFC7515"/>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC2177" target="https://www.rfc-editor.org/info/rfc2177" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2177.xml">
          <front>
            <title>IMAP4 IDLE command</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="June" year="1997"/>
            <abstract>
              <t>This document specifies the syntax of an IDLE command, which will allow a client to tell the server that it's ready to accept such real-time updates. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2177"/>
          <seriesInfo name="DOI" value="10.17487/RFC2177"/>
        </reference>
        <reference anchor="RFC8620" target="https://www.rfc-editor.org/info/rfc8620" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8620.xml">
          <front>
            <title>The JSON Meta Application Protocol (JMAP)</title>
            <author fullname="N. Jenkins" initials="N." surname="Jenkins"/>
            <author fullname="C. Newman" initials="C." surname="Newman"/>
            <date month="July" year="2019"/>
            <abstract>
              <t>This document specifies a protocol for clients to efficiently query, fetch, and modify JSON-based data objects, with support for push notification of changes and fast resynchronisation and for out-of- band binary data upload/download.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8620"/>
          <seriesInfo name="DOI" value="10.17487/RFC8620"/>
        </reference>
        <reference anchor="RFC5465" target="https://www.rfc-editor.org/info/rfc5465" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5465.xml">
          <front>
            <title>The IMAP NOTIFY Extension</title>
            <author fullname="A. Gulbrandsen" initials="A." surname="Gulbrandsen"/>
            <author fullname="C. King" initials="C." surname="King"/>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <date month="February" year="2009"/>
            <abstract>
              <t>This document defines an IMAP extension that allows a client to request specific kinds of unsolicited notifications for specified mailboxes, such as messages being added to or deleted from such mailboxes. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5465"/>
          <seriesInfo name="DOI" value="10.17487/RFC5465"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
