<?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.36 -->

<!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-05" 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="2016"/>

    
    
    

    <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 in the <spanx style="verb">dh</spanx> parameter
of the Crypto-Key header field (see <xref target="iana"/>).  The uncompressed point form
defined in <xref target="X9.62"/> (that is, a 65 octet sequence that starts with a 0x04
octet) is encoded using base64url <xref target="RFC7515"/> to produce the <spanx style="verb">dh</spanx> parameter
value.</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 length of the plaintext, plus any
padding (which is at least 2 octets).</t>

<t>A push message MUST include a zero length <spanx style="verb">keyid</spanx> parameter in the content
coding header.  This allows implementations to ignore the first 21 octets of a
push message.</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"/>), which equates to at most
4059 octets of cleartext.</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>An Application Server MUST include exactly one <spanx style="verb">aes128gcm</spanx> content coding, and
at most one entry in the Crypto-Key field. This allows the <spanx style="verb">keyid</spanx> parameter to
be omitted.</t>

<t>An Application Server MUST NOT include an <spanx style="verb">aes128gcm</spanx> parameter in the
Crypto-Key header field.</t>

<t>A User Agent is not required to support multiple records.  A User Agent MAY
ignore the <spanx style="verb">rs</spanx> field and assume that the <spanx style="verb">keyid</spanx> field is empty.  If a record
size is unchecked, decryption will fail with high probability for all valid
cases.  However, decryption will also succeed if the push message contains a
single record from a longer truncated message.  Given that an Application Server
is prohibited from generating such a message, this is not considered a serious
risk.</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: 33
Content-Encoding: aes128gcm
Crypto-Key: dh=BP4z9KsN6nGRTbVYI_c7VJSPQTBtkgcy27mlmlMoZIIg
               Dll6e3vCYLocInmYWAmS6TlzAC8wEqKK6PBru3jl7A8

DGv6ra1nlYgDCS1FRnbzlwAAxowAIg1VvoJvrVBFhclGlx4G2FuProCVzJY04Lg5
vUP2LeswtWoBGHGoYXUzAwuxQGRGxoNbh8BROK3gmJ0
]]></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.  Similarly, the “dh”
parameter wrapped to meet line length constraints.</t>

<t>Since there is no ambiguity about which keys are being used, the “keyid”
parameter is omitted from both the Encryption and Crypto-Key header fields.  The
keys shown below use uncompressed points <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>This document defines the “dh” parameter for the Crypto-Key header field in the
“Hypertext Transfer Protocol (HTTP) Crypto-Key Parameters” registry defined in
<xref target="I-D.ietf-httpbis-encryption-encoding"/>.</t>

<t><list style="symbols">
  <t>Parameter Name: dh</t>
  <t>Purpose: The “dh” parameter contains a Diffie-Hellman share which is used to
derive the input keying material used in <spanx style="verb">aes128gcm</spanx> content coding.</t>
  <t>Reference: this document.</t>
</list></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='October' day='21' 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-12' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-webpush-protocol-12.txt' />
<format type='PDF'
        target='http://www.ietf.org/internet-drafts/draft-ietf-webpush-protocol-12.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='October' day='9' 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-03' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-httpbis-encryption-encoding-03.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='RFC7515' target='http://www.rfc-editor.org/info/rfc7515'>
<front>
<title>JSON Web Signature (JWS)</title>
<author initials='M.' surname='Jones' fullname='M. Jones'><organization /></author>
<author initials='J.' surname='Bradley' fullname='J. Bradley'><organization /></author>
<author initials='N.' surname='Sakimura' fullname='N. Sakimura'><organization /></author>
<date year='2015' month='May' />
<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='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):'>
  V2ViUHVzaDogaW5mbwAE_jP0qw3qcZFNtVgj9ztUlI9
BMG2SBzLbuaWaUyhkgiAOWXp7e8JguhwieZhYCZLpOX
MALzASooro8Gu7eOXsDwQlcbK-zf3jYFUarx7Q9M02b
BHOvlVfiby3sYalMzkXMWjs4uvgGFl70wR5uG48j47O
1XfKWRh-kkaZDbaCAIsO</t>
  <t hangText='Input keying material for content encryption key derivation (IKM):'>
  dTQXtQpktdp6UQb29SUBcO5igFtC9WsXlhlNr2jRkkY</t>
  <t hangText='PRK for content encryption (PRK):'>
  BEhmz5JYdOXMsFJf_WDU8fJlOURaExoUoFuaGU86Fuc</t>
  <t hangText='Info for content encryption key derivation (cek_info):'>
  Q29udGVudC1FbmNvZGluZzogYWVzZ2NtMTI4AA</t>
  <t hangText='Content encryption key (CEK):'>
  wgJKGPLNgnI3CKy09z19Qw</t>
  <t hangText='Info for content encryption nonce derivation (nonce_info):'>
  Q29udGVudC1FbmNvZGluZzogbm9uY2UA</t>
  <t hangText='Nonce (NONCE):'>
  w5SniqvyjVui9OoV</t>
</list></t>

<t>The salt and a record size of 4096 produce a 21 octet header of
DGv6ra1nlYgDCS1FRnbzlwAAxowA.</t>

<t>The push message plaintext is padded to produce
AABXaGVuIEkgZ3JvdyB1cCwgSSB3YW50IHRvIGJl IGEgd2F0ZXJtZWxvbg.  The plaintext is
then encrypted with AES-GCM, which emits ciphertext of
Ig1VvoJvrVBFhclGlx4G2FuProCVzJY04Lg5vUP2
LeswtWoBGHGoYXUzAwuxQGRGxoNbh8BROK3gmJ0.</t>

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

</section>


  </back>
</rfc>

