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

<!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-09" 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="September" day="04"/>

    
    
    

    <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="RFC8030"/> is an intermediated protocol by necessity.
Messages from an application server are delivered to a user agent (UA) 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 forgery 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="RFC8188"/>.  This
document describes how this content encoding is applied and describes a
recommended key management scheme.</t>

<t>Multiple users of Web Push at the same user agent 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 key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”,
“SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” 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>

<t>This document uses the terminology from <xref target="RFC8030"/>, primarily user agent, push
service, and application server.</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">keyid</spanx> parameter of the
encrypted content coding header, the salt in the <spanx style="verb">salt</spanx> parameter of that same
header (see Section 2.1 of <xref target="RFC8188"/>).  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="RFC8030"/>, this ensures that the authentication secret is not revealed to
unauthorized entities, which would allow those entities 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 that can be used for distribution of subscription data.
An authenticated communication mechanism that provides adequate confidentiality
and integrity protection, 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 authentication secret to produce
the input keying material used in <xref target="RFC8188"/> (<xref target="combine"/>).</t>
  <t>A content encryption key and nonce are derived using the process in
<xref target="RFC8188"/>.</t>
  <t>Encryption or decryption follows according to <xref target="RFC8188"/>.</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="RFC8188"/>.</t>

<t>An application server 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">keyid</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 the Hashed Message Authentication Code (HMAC)-based key derivation
function (HKDF) <xref target="RFC5869"/>.  This produces the input keying material used by
<xref target="RFC8188"/>.</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” (this string is
not NUL-terminated), a zero octet, and the user agent ECDH public key and the
application server ECDH public key, both in the uncompressed point form
defined in <xref target="X9.62"/>; 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)
   salt = <from content coding header>

   -- For an application server:
   ecdh_secret = ECDH(as_private, ua_public)
   auth_secret = <from user agent>
   salt = random(16)

   -- For both:

   ## Use HKDF to combine the ECDH and authentication secrets
   # HKDF-Extract(salt=auth_secret, IKM=ecdh_secret)
   PRK_key = HMAC-SHA-256(auth_secret, ecdh_secret)
   # HKDF-Expand(PRK_key, key_info, L_key=32)
   key_info = "WebPush: info" || 0x00 || ua_public || as_public
   IKM = HMAC-SHA-256(PRK_key, key_info || 0x01)

   ## HKDF calculations from RFC 8188
   # HKDF-Extract(salt, IKM)
   PRK = HMAC-SHA-256(salt, IKM)
   # HKDF-Expand(PRK, cek_info, L_cek=16)
   cek_info = "Content-Encoding: aes128gcm" || 0x00
   CEK = HMAC-SHA-256(PRK, cek_info || 0x01)[0..15]
   # HKDF-Expand(PRK, nonce_info, L_nonce=12)
   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 sum of the lengths 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 <spanx style="verb">keyid</spanx>.  Note that this means that the
<spanx style="verb">keyid</spanx> parameter will not be valid UTF-8 as recommended in <xref target="RFC8188"/>.</t>

<t>A push service is not required to support more than 4096 octets of payload body
(see Section 7.2 of <xref target="RFC8030"/>).  Absent header (86 octets), padding (minimum
1 octet), and expansion for AEAD_AES_128_GCM (16 octets), this equates to at
most 3993 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 <xref target="RFC4648"/> 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: BP4z9KsN6nGRTbVYI_c7VJSPQTBtkgcy27mlmlMoZIIg
                  Dll6e3vCYLocInmYWAmS6TlzAC8wEqKK6PBru3jl7A8
]]></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 remove this section before publication.]]
This document makes no request of IANA.</t>

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

<t>The privacy and security considerations of <xref target="RFC8030"/> all apply to the use of
this mechanism.</t>

<t>The security considerations of <xref target="RFC8188"/> describe the limitations of the
content encoding.  In particular, no HTTP header fields are protected by the
content encoding scheme.  A user agent MUST consider HTTP header fields to have
come from the push service.  Though header fields might be necessary for
processing an HTTP response correctly, they are not needed for correct
operation of the protocol.  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 which 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>

<t>The user agent and application MUST verify that the public key they receive is
on the P-256 curve.  Failure to validate a public key can allow an attacker to
extract a private key.   The appropriate validation procedures are defined in
Section 4.3.7 of <xref target="X9.62"/> and alternatively in Section 5.6.2.6 of
<xref target="KEYAGREEMENT"/>.  This process consists of three steps:</t>

<t><list style="numbers">
  <t>Verify that Y is not the point at infinity (O),</t>
  <t>Verify that for Y = (x, y) both integers are in the correct interval,</t>
  <t>Ensure that (x, y) is a correct solution to the elliptic curve equation.</t>
</list></t>

<t>For these curves, implementers do not need to verify membership in
the correct subgroup.</t>

<t>In the event that this encryption scheme would need to be replaced, a new
content coding scheme could be defined.  In order to manage progressive
deployment of the new scheme, the user agent can expose information on the
content coding schemes that it supports.  The supportedContentEncodings
parameter of the Push API <xref target="API"/> is an example of how this might be done.</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="RFC8030" target='https://www.rfc-editor.org/info/rfc8030'>
<front>
<title>Generic Event Delivery Using HTTP Push</title>
<author initials='M.' surname='Thomson' fullname='M. Thomson'><organization /></author>
<author initials='E.' surname='Damaggio' fullname='E. Damaggio'><organization /></author>
<author initials='B.' surname='Raymor' fullname='B. Raymor' role='editor'><organization /></author>
<date year='2016' month='December' />
<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="RFC8188" target='https://www.rfc-editor.org/info/rfc8188'>
<front>
<title>Encrypted Content-Encoding for HTTP</title>
<author initials='M.' surname='Thomson' fullname='M. Thomson'><organization /></author>
<date year='2017' month='June' />
<abstract><t>This memo introduces a content coding for HTTP that allows message payloads to be encrypted.</t></abstract>
</front>
<seriesInfo name='RFC' value='8188'/>
<seriesInfo name='DOI' value='10.17487/RFC8188'/>
</reference>



<reference  anchor="RFC2119" target='https://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="RFC8174" target='https://www.rfc-editor.org/info/rfc8174'>
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author initials='B.' surname='Leiba' fullname='B. Leiba'><organization /></author>
<date year='2017' month='May' />
<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="RFC4086" target='https://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='https://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="P." surname="Beverloo">
      <organization></organization>
    </author>
    <author initials="M." surname="Thomson">
      <organization></organization>
    </author>
    <date year="2015"/>
  </front>
</reference>
<reference anchor="KEYAGREEMENT" >
  <front>
    <title>Recommendation for Pair-Wise Key Establishment Schemes Using Discrete Logarithm Cryptography</title>
    <author initials="E." surname="Barker">
      <organization></organization>
    </author>
    <author initials="L." surname="Chen">
      <organization></organization>
    </author>
    <author initials="A." surname="Roginsky">
      <organization></organization>
    </author>
    <author initials="M." surname="Smid">
      <organization></organization>
    </author>
    <date year="2013" month="May"/>
  </front>
  <seriesInfo name="NIST" value="Special Publication 800-38D"/>
</reference>




<reference  anchor="RFC7230" target='https://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='https://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>



<reference  anchor="RFC4648" target='https://www.rfc-editor.org/info/rfc4648'>
<front>
<title>The Base16, Base32, and Base64 Data Encodings</title>
<author initials='S.' surname='Josefsson' fullname='S. Josefsson'><organization /></author>
<date year='2006' month='October' />
<abstract><t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes.  It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='4648'/>
<seriesInfo name='DOI' value='10.17487/RFC4648'/>
</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 base64url values in these examples include whitespace that can be
removed.</t>

<t>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='Pseudorandom key (PRK) 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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
tfNlxzcezscnR9dl43lx1Q06frhbW9b885tgSP2MT5VShZ2BEh3SqSV1TsmF
5How6BzySplpeeyQJ4FHtV32gyCMsePTRd03Kq5zPzlu9isn1+7o1Vk2QLmP
jo56tdeDi+Cy7p5eD0bD+/ajuTc87/e+DI7Cp4m5qu7NHDZzut5Duz05dpy6
2Fk07zue2XZn97eNWb8+cF4bzf1l6/niot478qOdr85e43HlHOyOvsyjujns
Ddj8otZ9njyNK82717AzPOqH1Ytgx3tYjqLlXe+uc7vyoqPbzvD29PL2i3jp
T/ovwdfHL5FjrmpGcXyZGnHLciYuEvBskaAAcTmWrNvgi70lj+YQ5fKlITmG
jTa2NGho1fHcDyWeblSjkc2lkuRiMOPjS1/+RoNs5c11pxgYY8GwxlOvRb6j
ulG1eg1bKfEcGdw5E1R7EkEcsMB9OD1so6GJGxqq7EYzDnT/SGA3MSk8ZUoL
5D4Tn6lIoMpUMVA5kYSwd2Ph7JAfDY4eus9nZ3W/NgiDvfNHo9+eTHDDtQq6
9Ix0qnJ8yJ8r1t18uXMzH+wOr2bRozl+XNTtaXmvIWbBjvv1pV08v510zO5B
TW+PQwu4tDl8Cfy9y0dxORlePy/OwuPy6+AhaJn14nBYPF90xMv0+eb16tp8
SSa04z/j6tWuFxv3t3eLwdHZrDb6uup9DfaG1v784fSs3r+eP12GXrthL+ny
PnrpzWisxrc9+75VdGv1s457Vr54frg6qYzPz292uve+Ge40Wp2w8aXoXS83
ofELeqTVaAMav65Z+1IX2qmZa20q4ya51hGDyiCqLSKnHF6K6WltVV/l7cZl
A/1cYFtxef7to224BljGf/35rz8xyWwdtwdX12CYwG8G6F9m3kLICwMVjoyk
J5wnE/Olv/7KDXTNjCeB7ou8F6QO6H7x/hICQj8WQQeSBUbqB7HLlAWiQC80
s1DngiFyQhhxrHSxXo3+qaBPNaWVAv78UNkj1Z0YGdCjG0sWYvSYD0TktEI6
VAH0afQ1HUoEemBSTkKoGYC1w/R8ad6vk19UcG86HPDHuQAcsBCycpCMcijf
hR7ai8CVZ3fOwLtT3CvH+bHEB2zWgzRqDpduBLs0BxBS3RU9+6ciGlcIS7UV
1JKkIxSnRMkvInLhomoXprDWExABSzdhCLs17A1H5mTC9nkKdhxEzo8lMQiD
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
nkNVzaHUnGUctpXY/wMFyT3XZkgAAA==

-->

</rfc>

