<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.0.40 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc docmapping="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-webpush-encryption-08" category="std">

  <front>
    <title abbrev="Web Push Encryption">Message Encryption for Web Push</title>

    <author initials="M." surname="Thomson" fullname="Martin Thomson">
      <organization>Mozilla</organization>
      <address>
        <email>martin.thomson@gmail.com</email>
      </address>
    </author>

    <date year="2017" month="February" day="14"/>

    
    
    

    <abstract>


<t>A message encryption scheme is described 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>

  <middle>


<section anchor="introduction" title="Introduction">

<t>The Web Push protocol <xref target="I-D.ietf-webpush-protocol"/> is an intermediated
protocol by necessity.  Messages from an Application Server are delivered to a
User Agent via a Push Service.</t>

<figure><artwork><![CDATA[
 +-------+           +--------------+       +-------------+
 |  UA   |           | Push Service |       | Application |
 +-------+           +--------------+       +-------------+
     |                      |                      |
     |        Setup         |                      |
     |<====================>|                      |
     |           Provide Subscription              |
     |-------------------------------------------->|
     |                      |                      |
     :                      :                      :
     |                      |     Push Message     |
     |    Push Message      |<---------------------|
     |<---------------------|                      |
     |                      |                      |
]]></artwork></figure>

<t>This document describes how messages sent using this protocol can be secured
against inspection, modification and falsification by a Push Service.</t>

<t>Web Push messages are the payload of an HTTP message <xref target="RFC7230"/>.  These
messages are encrypted using an encrypted content encoding
<xref target="I-D.ietf-httpbis-encryption-encoding"/>.  This document describes how this
content encoding is applied and describes a recommended key management scheme.</t>

<t>For efficiency reasons, multiple users of Web Push often share a central agent
that aggregates push functionality.  This agent can enforce the use of this
encryption scheme by applications that use push messaging.  An agent that only
delivers messages that are properly encrypted strongly encourages the end-to-end
protection of messages.</t>

<t>A web browser that implements the Web Push API <xref target="API"/> can enforce the use of
encryption by forwarding only those messages that were properly encrypted.</t>

<section anchor="notational-conventions" title="Notational Conventions">

<t>The words “MUST”, “MUST NOT”, “SHOULD”, and “MAY” are used in this document.
It’s not shouting, when they are capitalized, they have the special meaning
described in <xref target="RFC2119"/>.</t>

</section>
</section>
<section anchor="overview" title="Push Message Encryption Overview">

<t>Encrypting a push message uses elliptic-curve Diffie-Hellman (ECDH) <xref target="ECDH"/> on
the P-256 curve <xref target="FIPS186"/> to establish a shared secret (see <xref target="dh"/>) and a
symmetric secret for authentication (see <xref target="auth"/>).</t>

<t>A User Agent generates an ECDH key pair and authentication secret that it
associates with each subscription it creates.  The ECDH public key and the
authentication secret are sent to the Application Server with other details of
the push subscription.</t>

<t>When sending a message, an Application Server generates an ECDH key pair and a
random salt.  The ECDH public key is encoded into the <spanx style="verb">dh</spanx> parameter of the
Crypto-Key header field; the salt is encoded into message payload.  The ECDH key
pair can be discarded after encrypting the message.</t>

<t>The content of the push message is encrypted or decrypted using a content
encryption key and nonce that is derived using all of these inputs and the
process described in <xref target="encryption"/>.</t>

<section anchor="key-and-secret-distribution" title="Key and Secret Distribution">

<t>The application using the subscription distributes the subscription public key
and authentication secret to an authorized Application Server.  This could be
sent along with other subscription information that is provided by the User
Agent, such as the push subscription URI.</t>

<t>An application MUST use an authenticated, confidentiality protected
communications medium for this purpose.  In addition to the reasons described in
<xref target="I-D.ietf-webpush-protocol"/>, this ensures that the authentication secret is
not revealed to unauthorized entities, which can be used to generate push
messages that will be accepted by the User Agent.</t>

<t>Most applications that use push messaging have a pre-existing relationship with
an Application Server.  Any existing communication mechanism that is
authenticated and provides confidentiality and integrity, such as HTTPS
<xref target="RFC2818"/>, is sufficient.</t>

</section>
</section>
<section anchor="encryption" title="Push Message Encryption">

<t>Push message encryption happens in four phases:</t>

<t><list style="symbols">
  <t>A shared secret is derived using elliptic-curve Diffie-Hellman <xref target="ECDH"/>
(<xref target="dh"/>).</t>
  <t>The shared secret is then combined with the application secret to produce the
input keying material used in <xref target="I-D.ietf-httpbis-encryption-encoding"/>
(<xref target="combine"/>).</t>
  <t>A content encryption key and nonce are derived using the process in
<xref target="I-D.ietf-httpbis-encryption-encoding"/>.</t>
  <t>Encryption or decryption follows according to
<xref target="I-D.ietf-httpbis-encryption-encoding"/>.</t>
</list></t>

<t>The key derivation process is summarized in <xref target="summary"/>.  Restrictions on the
use of the encrypted content coding are described in <xref target="restrict"/>.</t>

<section anchor="dh" title="Diffie-Hellman Key Agreement">

<t>For each new subscription that the User Agent generates for an Application, it
also generates a P-256 <xref target="FIPS186"/> key pair for use in elliptic-curve
Diffie-Hellman (ECDH) <xref target="ECDH"/>.</t>

<t>When sending a push message, the Application Server also generates a new ECDH
key pair on the same P-256 curve.</t>

<t>The ECDH public key for the Application Server is included as the “keyid”
parameter in the encrypted content coding header (see Section 2.1 of
<xref target="I-D.ietf-httpbis-encryption-encoding"/>.</t>

<t>An Application combines its ECDH private key with the public key provided by the
User Agent using the process described in <xref target="ECDH"/>; on receipt of the push
message, a User Agent combines its private key with the public key provided by
the Application Server in the <spanx style="verb">dh</spanx> parameter in the same way.  These operations
produce the same value for the ECDH shared secret.</t>

</section>
<section anchor="auth" title="Push Message Authentication">

<t>To ensure that push messages are correctly authenticated, a symmetric
authentication secret is added to the information generated by a User Agent.
The authentication secret is mixed into the key derivation process shown in
<xref target="combine"/>.</t>

<t>A User Agent MUST generate and provide a hard to guess sequence of 16 octets that
is used for authentication of push messages.  This SHOULD be generated by a
cryptographically strong random number generator <xref target="RFC4086"/>.</t>

</section>
<section anchor="combine" title="Combining Shared and Authentication Secrets">

<t>The shared secret produced by ECDH is combined with the authentication secret
using HMAC-based key derivation function (HKDF) described in <xref target="RFC5869"/>.  This
produces the input keying material used by
<xref target="I-D.ietf-httpbis-encryption-encoding"/>.</t>

<t>The HKDF function uses SHA-256 hash algorithm <xref target="FIPS180-4"/> with the following
inputs:</t>

<t><list style="hanging">
  <t hangText='salt:'>
  the authentication secret</t>
  <t hangText='IKM:'>
  the shared secret derived using ECDH</t>
  <t hangText='info:'>
  the concatenation of the ASCII-encoded string “WebPush: info”, a zero octet,
the X9.62 encoding of the User Agent ECDH public key, and X9.62 encoding of the
Application Server ECDH public key; that is
      <figure><artwork><![CDATA[
key_info = "WebPush: info" || 0x00 || ua_public || as_public
]]></artwork></figure>
  </t>
  <t hangText='L:'>
  32 octets (i.e., the output is the length of the underlying SHA-256 HMAC
function output)</t>
</list></t>

</section>
<section anchor="summary" title="Encryption Summary">

<t>This results in a the final content encryption key and nonce generation using
the following sequence, which is shown here in pseudocode with HKDF expanded
into separate discrete steps using HMAC with SHA-256:</t>

<figure><artwork type="inline"><![CDATA[
   -- For a User Agent:
   ecdh_secret = ECDH(ua_private, as_public)
   auth_secret = random(16)

   -- For an Application Server:
   ecdh_secret = ECDH(as_private, ua_public)
   auth_secret = <from User Agent>

   -- For both:
   PRK_key = HMAC-SHA-256(auth_secret, ecdh_secret)
   key_info = "WebPush: info" || 0x00 || ua_public || as_public
   IKM = HMAC-SHA-256(PRK_cek, key_info || 0x01)

   salt = random(16)
   PRK = HMAC-SHA-256(salt, IKM)
   cek_info = "Content-Encoding: aes128gcm" || 0x00
   CEK = HMAC-SHA-256(PRK, cek_info || 0x01)[0..15]
   nonce_info = "Content-Encoding: nonce" || 0x00
   NONCE = HMAC-SHA-256(PRK, nonce_info || 0x01)[0..11]
]]></artwork></figure>

<t>Note that this omits the exclusive OR of the final nonce with the record
sequence number, since push messages contain only a single record (see
<xref target="restrict"/>) and the sequence number of the first record is zero.</t>

</section>
</section>
<section anchor="restrict" title="Restrictions on Use of “aes128gcm” Content Coding">

<t>An Application Server MUST encrypt a push message with a single record.  This
allows for a minimal receiver implementation that handles a single record.  An
application server MUST set the <spanx style="verb">rs</spanx> parameter in the <spanx style="verb">aes128gcm</spanx> content coding
header to a size that is greater than the some of the length of the plaintext,
the padding delimiter (1 octet), any padding, and the authentication tag (16
octets).</t>

<t>A push message MUST include the application server ECDH public key in the
<spanx style="verb">keyid</spanx> parameter of the encrypted content coding header.  The uncompressed
point form defined in <xref target="X9.62"/> (that is, a 65 octet sequence that starts with
a 0x04 octet) forms the entirety of the “keyid”.</t>

<t>A push service is not required to support more than 4096 octets of payload body
(see Section 7.2 of <xref target="I-D.ietf-webpush-protocol"/>).  Absent header (86 octets),
padding (minimum 2 octets), and expansion for AEAD_AES_128_GCM (16 octets), this
equates to at most 3992 octets of plaintext.</t>

<t>An Application Server MUST NOT use other content encodings for push messages.
In particular, content encodings that compress could result in leaking of push
message contents.  The Content-Encoding header field therefore has exactly one
value, which is <spanx style="verb">aes128gcm</spanx>.  Multiple <spanx style="verb">aes128gcm</spanx> values are not permitted.</t>

<t>A User Agent is not required to support multiple records.  A User Agent MAY
ignore the <spanx style="verb">rs</spanx> field.  If a record size is unchecked, decryption will fail with
high probability for all valid cases.  The padding delimiter octet MUST be
checked, values other than 0x02 MUST cause the message to be discarded.</t>

</section>
<section anchor="example" title="Push Message Encryption Example">

<t>The following example shows a push message being sent to a push service.</t>

<figure><artwork type="example"><![CDATA[
POST /push/JzLQ3raZJfFBR0aqvOMsLrt54w4rJUsV HTTP/1.1
Host: push.example.net
TTL: 10
Content-Length: 145
Content-Encoding: aes128gcm

DGv6ra1nlYgDCS1FRnbzlwAAEABBBP4z9KsN6nGRTbVYI_c7VJSPQTBtkgcy27ml
mlMoZIIgDll6e3vCYLocInmYWAmS6TlzAC8wEqKK6PBru3jl7A_yl95bQpu6cVPT
pK4Mqgkf1CXztLVBSt2Ks3oZwbuwXPXLWyouBWLVWGNWQexSgSxsj_Qulcy4a-fN
]]></artwork></figure>

<t>This example shows the ASCII encoded string, “When I grow up, I want to be a
watermelon”. The content body is shown here with line wrapping and URL-safe
base64url encoding to meet presentation constraints.</t>

<t>The keys used are shown below using the uncompressed form <xref target="X9.62"/> encoded
using base64url.</t>

<figure><artwork type="example"><![CDATA[
   Authentication Secret: BTBZMqHH6r4Tts7J_aSIgg
   Receiver:
      private key: q1dXpw3UpT5VOmu_cf_v6ih07Aems3njxI-JWgLcM94
      public key: BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcx
                  aOzi6-AYWXvTBHm4bjyPjs7Vd8pZGH6SRpkNtoIAiw4
   Sender:
      private key: yfWPiYE-n46HLnH0KqZOF1fJJU3MYrct3AELtAQ-oRw
      public key: <the value of the "dh" parameter>
]]></artwork></figure>

<t>Intermediate values for this example are included in <xref target="ex-intermediate"/>.</t>

</section>
<section anchor="iana" title="IANA Considerations">

<t>[[RFC EDITOR: please remote this section before publication.]]
This document makes no request of IANA.</t>

</section>
<section anchor="security-considerations" title="Security Considerations">

<t>The security considerations of <xref target="I-D.ietf-httpbis-encryption-encoding"/>
describe the limitations of the content encoding.  In particular, any HTTP
header fields are not protected by the content encoding scheme.  A User Agent
MUST consider HTTP header fields to have come from the Push Service.  An
application on the User Agent that uses information from header fields to alter
their processing of a push message is exposed to a risk of attack by the Push
Service.</t>

<t>The timing and length of communication cannot be hidden from the Push Service.
While an outside observer might see individual messages intermixed with each
other, the Push Service will see what Application Server is talking to which
User Agent, and the subscription that is used.  Additionally, the length of
messages could be revealed unless the padding provided by the content encoding
scheme is used to obscure length.</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>

<reference anchor="ECDH" target="http://www.secg.org/">
  <front>
    <title>Elliptic Curve Cryptography</title>
    <author >
      <organization>SECG</organization>
    </author>
    <date year="2000"/>
  </front>
  <seriesInfo name="SEC 1" value=""/>
</reference>
<reference anchor="FIPS186" >
  <front>
    <title>Digital Signature Standard (DSS)</title>
    <author >
      <organization>National Institute of Standards and Technology (NIST)</organization>
    </author>
    <date year="2013" month="July"/>
  </front>
  <seriesInfo name="NIST PUB 186-4" value=""/>
</reference>
<reference anchor="X9.62" >
  <front>
    <title>Public Key Cryptography For The Financial Services Industry: The Elliptic Curve Digital Signature Algorithm (ECDSA)</title>
    <author >
      <organization>ANSI</organization>
    </author>
    <date year="1998"/>
  </front>
  <seriesInfo name="ANSI X9.62" value=""/>
</reference>
<reference anchor="FIPS180-4" target="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf">
  <front>
    <title>NIST FIPS 180-4, Secure Hash Standard</title>
    <author initials="National Institute of Standards and Technology, U.S." surname="Department of Commerce" fullname="NIST">
      <organization></organization>
    </author>
    <date year="2012" month="March"/>
  </front>
</reference>




<reference anchor='I-D.ietf-webpush-protocol'>
<front>
<title>Generic Event Delivery Using HTTP Push</title>

<author initials='M' surname='Thomson' fullname='Martin Thomson'>
    <organization />
</author>

<author initials='E' surname='Damaggio' fullname='Elio Damaggio'>
    <organization />
</author>

<author initials='B' surname='Raymor' fullname='Brian Raymor'>
    <organization />
</author>

<date month='July' day='22' year='2016' />

<abstract><t>A simple protocol for the delivery of real-time events to user agents is described.  This scheme uses HTTP/2 server push.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-webpush-protocol-08' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-webpush-protocol-08.txt' />
<format type='PDF'
        target='http://www.ietf.org/internet-drafts/draft-ietf-webpush-protocol-08.pdf' />
</reference>



<reference anchor='I-D.ietf-httpbis-encryption-encoding'>
<front>
<title>Encrypted Content-Encoding for HTTP</title>

<author initials='M' surname='Thomson' fullname='Martin Thomson'>
    <organization />
</author>

<date month='June' day='29' year='2016' />

<abstract><t>This memo introduces a content-coding for HTTP that allows message payloads to be encrypted.  Note to Readers  Discussion of this draft takes place on the HTTP working group mailing list (ietf-http-wg@w3.org), which is archived at https://lists.w3.org/Archives/Public/ietf-http-wg/ .  Working Group information can be found at http://httpwg.github.io/ ; source code and issues list for this draft can be found at https://github.com/httpwg/http-extensions/labels/encryption .</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-httpbis-encryption-encoding-02' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-httpbis-encryption-encoding-02.txt' />
</reference>



<reference  anchor='RFC2119' target='http://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<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='RFC4086' target='http://www.rfc-editor.org/info/rfc4086'>
<front>
<title>Randomness Requirements for Security</title>
<author initials='D.' surname='Eastlake 3rd' fullname='D. Eastlake 3rd'><organization /></author>
<author initials='J.' surname='Schiller' fullname='J. Schiller'><organization /></author>
<author initials='S.' surname='Crocker' fullname='S. Crocker'><organization /></author>
<date year='2005' month='June' />
<abstract><t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts.  However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities.  The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t><t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult.  This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities.  It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications.  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='106'/>
<seriesInfo name='RFC' value='4086'/>
<seriesInfo name='DOI' value='10.17487/RFC4086'/>
</reference>



<reference  anchor='RFC5869' target='http://www.rfc-editor.org/info/rfc5869'>
<front>
<title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
<author initials='H.' surname='Krawczyk' fullname='H. Krawczyk'><organization /></author>
<author initials='P.' surname='Eronen' fullname='P. Eronen'><organization /></author>
<date year='2010' month='May' />
<abstract><t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications.  The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions.  This document is not an Internet  Standards Track specification; it is published for informational  purposes.</t></abstract>
</front>
<seriesInfo name='RFC' value='5869'/>
<seriesInfo name='DOI' value='10.17487/RFC5869'/>
</reference>




    </references>

    <references title='Informative References'>

<reference anchor="API" target="https://w3c.github.io/push-api/">
  <front>
    <title>Web Push API</title>
    <author initials="M." surname="van Ouwerkerk">
      <organization></organization>
    </author>
    <author initials="M." surname="Thomson">
      <organization></organization>
    </author>
    <date year="2015"/>
  </front>
</reference>




<reference  anchor='RFC7230' target='http://www.rfc-editor.org/info/rfc7230'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
<author initials='R.' surname='Fielding' fullname='R. Fielding' role='editor'><organization /></author>
<author initials='J.' surname='Reschke' fullname='J. Reschke' role='editor'><organization /></author>
<date year='2014' month='June' />
<abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems.  This document provides an overview of HTTP architecture and its associated terminology, defines the &quot;http&quot; and &quot;https&quot; Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</t></abstract>
</front>
<seriesInfo name='RFC' value='7230'/>
<seriesInfo name='DOI' value='10.17487/RFC7230'/>
</reference>



<reference  anchor='RFC2818' target='http://www.rfc-editor.org/info/rfc2818'>
<front>
<title>HTTP Over TLS</title>
<author initials='E.' surname='Rescorla' fullname='E. Rescorla'><organization /></author>
<date year='2000' month='May' />
<abstract><t>This memo describes how to use Transport Layer Security (TLS) to secure Hypertext Transfer Protocol (HTTP) connections over the Internet.  This memo provides information for the Internet community.</t></abstract>
</front>
<seriesInfo name='RFC' value='2818'/>
<seriesInfo name='DOI' value='10.17487/RFC2818'/>
</reference>




    </references>


<section anchor="ex-intermediate" title="Intermediate Values for Encryption">

<t>The intermediate values calculated for the example in <xref target="example"/> are shown
here.  The following are inputs to the calculation:</t>

<t><list style="hanging">
  <t hangText='Plaintext:'>
  V2hlbiBJIGdyb3cgdXAsIEkgd2FudCB0byBiZSBhIHdhdGVybWVsb24</t>
  <t hangText='Application Server public key (as_public):'>
  BP4z9KsN6nGRTbVYI_c7VJSPQTBtkgcy27mlmlMoZIIg
Dll6e3vCYLocInmYWAmS6TlzAC8wEqKK6PBru3jl7A8</t>
  <t hangText='Application Server private key (as_private):'>
  yfWPiYE-n46HLnH0KqZOF1fJJU3MYrct3AELtAQ-oRw</t>
  <t hangText='User Agent public key (ua_public):'>
  BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcx
aOzi6-AYWXvTBHm4bjyPjs7Vd8pZGH6SRpkNtoIAiw4</t>
  <t hangText='User Agent private key (ua_private):'>
  q1dXpw3UpT5VOmu_cf_v6ih07Aems3njxI-JWgLcM94</t>
  <t hangText='Salt:'>
  DGv6ra1nlYgDCS1FRnbzlw</t>
  <t hangText='Authentication secret (auth_secret):'>
  BTBZMqHH6r4Tts7J_aSIgg</t>
</list></t>

<t>Note that knowledge of just one of the private keys is necessary.  The
Application Server randomly generates the salt value, whereas salt is input to
the receiver.</t>

<t>This produces the following intermediate values:</t>

<t><list style="hanging">
  <t hangText='Shared ECDH secret (ecdh_secret):'>
  kyrL1jIIOHEzg3sM2ZWRHDRB62YACZhhSlknJ672kSs</t>
  <t hangText='Pseudo-random key for key combining (PRK_key):'>
  Snr3JMxaHVDXHWJn5wdC52WjpCtd2EIEGBykDcZW32k</t>
  <t hangText='Info for key combining (key_info):'>
  V2ViUHVzaDogaW5mbwAEJXGyvs3942BVGq8e0PTNNmwR
zr5VX4m8t7GGpTM5FzFo7OLr4BhZe9MEebhuPI-OztV3
ylkYfpJGmQ22ggCLDgT-M_SrDepxkU21WCP3O1SUj0Ew
bZIHMtu5pZpTKGSCIA5Zent7wmC6HCJ5mFgJkuk5cwAv
MBKiiujwa7t45ewP</t>
  <t hangText='Input keying material for content encryption key derivation (IKM):'>
  S4lYMb_L0FxCeq0WhDx813KgSYqU26kOyzWUdsXYyrg</t>
  <t hangText='PRK for content encryption (PRK):'>
  09_eUZGrsvxChDCGRCdkLiDXrReGOEVeSCdCcPBSJSc</t>
  <t hangText='Info for content encryption key derivation (cek_info):'>
  Q29udGVudC1FbmNvZGluZzogYWVzMTI4Z2NtAA</t>
  <t hangText='Content encryption key (CEK):'>
  oIhVW04MRdy2XN9CiKLxTg</t>
  <t hangText='Info for content encryption nonce derivation (nonce_info):'>
  Q29udGVudC1FbmNvZGluZzogbm9uY2UA</t>
  <t hangText='Nonce (NONCE):'>
  4h_95klXJ5E_qnoN</t>
</list></t>

<t>The salt, record size of 4096, and application server public key produce an 86
octet header of DGv6ra1nlYgDCS1FRnbzlwAAEABBBP4z
9KsN6nGRTbVYI_c7VJSPQTBtkgcy27ml mlMoZIIgDll6e3vCYLocInmYWAmS6Tlz
AC8wEqKK6PBru3jl7A8.</t>

<t>The push message plaintext has the padding delimiter octet (0x02) appended to
produce V2hlbiBJIGdyb3cgdXAsIEkgd2FudCB0 byBiZSBhIHdhdGVybWVsb24C.  The
plaintext is then encrypted with AES-GCM, which emits ciphertext of
8pfeW0KbunFT06SuDKoJH9Ql87S1QUrd irN6GcG7sFz1y1sqLgVi1VhjVkHsUoEs
bI_0LpXMuGvnzQ.</t>

<t>The header and cipher text are concatenated and produce the result shown in
<xref target="example"/>.</t>

</section>


  </back>

<!-- ##markdown-source:
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

-->

</rfc>

