<?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 comments="yes"?>
<?rfc sortrefs="yes"?>
<?rfc strict="yes"?>
<?rfc symrefs="yes"?>
<?rfc toc="yes"?>

<rfc ipr="trust200902" docName="draft-yasskin-dispatch-web-packaging-00" category="std">

  <front>
    <title>Web Packaging</title>

    <author initials="J." surname="Yasskin" fullname="Jeffrey Yasskin">
      <organization>Google</organization>
      <address>
        <email>jyasskin@chromium.org</email>
      </address>
    </author>

    <date year="2017" month="June" day="30"/>

    <area>gen</area>
    <workgroup>Dispatch</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>Web Packages provide a way to bundle up groups of web resources to
transmit them together. These bundles can then be signed to establish
their authenticity.</t>



    </abstract>


  </front>

  <middle>


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

<t>People would like to use content offline and in other situations where
there isn’t a direct connection to the server where the content
originates. However, it’s difficult to distribute and verify the
authenticity of applications and content without a connection to the
network. The W3C has addressed running applications offline with
Service Workers (<xref target="ServiceWorkers"/>), but not
the problem of distribution.</t>

<t>We’ve started work on this problem
in <eref target="https://github.com/WICG/webpackage"></eref>, but we suspect that the
IETF may be the right place to standardize the overall format. More
details can be found in that repository.</t>

<section anchor="use-cases" title="Use Cases">

<section anchor="offline-installation" title="Offline Installation">

<t>People with expensive or intermittent internet connections are used
to sharing files via P2P links and shared SD cards. They should be
able to install web applications they received this way. Installing a
web application requires a TLS-type guarantee that it came from and
can use data owned by a particular origin.</t>

</section>
<section anchor="snapshot-packages" title="Snapshot packages">

<t>Verification of the origin of the content isn’t always necessary.
For example, users currently share screenshots and MHTML documents
with their peers, with no guarantee that the shared content is
authentic. However, these formats have low fidelity (screenshots)
and/or aren’t interoperable (MHTML). We’d like an interoperable format
that lets both publishers and readers package such content for use in
an untrusted mode.</t>

</section>
<section anchor="cdns" title="CDNs">

<t>CDNs want to re-publish other origins’ content so readers can access
it more quickly or more privately. Currently, to attribute that
content to the original origin, they need the full ability to publish
arbitrary content under that origin’s name. There should be a way to
let them attribute only the exact content that the original origin
published.</t>

</section>
<section anchor="section" title="…">

</section>
</section>
<section anchor="not-zip" title="Why not ZIP?">

<t><eref target="https://github.com/WICG/webpackage/issues/45">WICG/webpackage#45</eref></t>

</section>
<section anchor="need" title="The Need for Standardization">

<t>Publishers and readers should be able to generate a package once, and have it
usable by all browsers.</t>

</section>
<section anchor="Terminology" title="Terminology">

<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>

</section>
</section>
<section anchor="format" title="Format">

<section anchor="mode" title="Mode of specification">

<t>This specification defines how conformant web package parsers convert a sequence
of bytes into the semantics of a web package. It does not constrain how web
package encoders produce such a package: although there are some guidelines in
<xref target="authoring-guidelines"/>, encoders MAY produce any sequence of bytes that a
conformant parser would parse into the intended semantics.</t>

<t>In places, this specification says the parser “MAY return” some data. This
indicates that the described data is complete enough that later parsing failures
do not need to discard it.</t>

<t>In places, this specification says the parser “MUST fail”. The parser MAY report
these failures to its caller in any way, but MUST NOT return any data it has
parsed so far that wasn’t mentioned in a “MAY return” statement.</t>

<t>This specification creates local variables with the phrase “Let <spanx style="emph">variable-name</spanx>
be …”. Use of a variable before it’s created is a defect in this
specification.</t>

</section>
<section anchor="top-level" title="Top-level structure">

<t>The package is roughly a CBOR item with the following CDDL schema, but package
parsers are required to successfully parse some byte strings that aren’t valid
CBOR. For example, sections may have padding between them, or even overlap, as
long as the embedded relative offsets cause the parsing algorithm in this
specification to return data.</t>

<figure><artwork type="cddl"><![CDATA[
webpackage = [
  magic1: h'F0 9F 8C 90 F0 9F 93 A6',  ; 🌐📦 in UTF-8.
  section-offsets: { * (($section-name .within tstr) => uint) },
  sections: [ *$section ],
  length: uint,                        ; Total number of bytes in the package.
  magic2: h'F0 9F 8C 90 F0 9F 93 A6',  ; 🌐📦 in UTF-8.
]
]]></artwork></figure>

<t>The parser MAY begin parsing at either the <xref target="from-start">beginning</xref>
or <xref target="from-end">end</xref> of the byte string representing the package. Parsing from
the end is useful when the package is embedded in another format such as a
self-extracting executable, while parsing from the beginning is useful when
loading from a stream.</t>

<section anchor="from-end" title="From the end">

<t>To parse from the end, the parser MUST load the last 18 bytes as the following
<xref target="CDDL"/> group in array context: 
  <cref anchor="ednote-loading-cddl" source="jyasskin">CDDL doesn’t actually define how to use it as a schema
to load CBOR data.</cref></t>

<figure><artwork type="cddl"><![CDATA[
tail = (
  length: uint,                        ; Total number of bytes in the package.
  magic2: h'F0 9F 8C 90 F0 9F 93 A6',  ; 🌐📦 in UTF-8.
)
]]></artwork></figure>

<t>If the bytes don’t match this group or these two CBOR items don’t occupy exactly
18 bytes, parsing MUST fail.</t>

<t>Otherwise, continue as if the byte <spanx style="verb">length</spanx> bytes before the end of the string
were the beginning of the package, and the parser were
a <xref target="from-start">from the beginning</xref> parser.</t>

</section>
<section anchor="from-start" title="From the beginning">

<t>If the first 10 bytes of the package are not “85 48 F0 9F 8C 90 F0 9F 93 A6”
(the CBOR encoding of the 5-item array header and 8-byte bytestring header,
followed by 🌐📦 in UTF-8), parsing MUST fail.</t>

<t>Parse one CBOR item starting at the 11th byte of the package. If this does not
match the CDDL</t>

<figure><artwork type="cddl"><![CDATA[
section-offsets = { * tstr => uint },
]]></artwork></figure>

<t>or it is not a Canonical CBOR item (Section 3.9 of <xref target="CBOR"/>), parsing MUST fail.</t>

<t>Let <spanx style="emph">sections-start</spanx> be the offset of the byte after the <spanx style="verb">section-offsets</spanx> item.
For example, if <spanx style="verb">section-offsets</spanx> were 52 bytes long, <spanx style="emph">sections-start</spanx> would be
63.</t>

<t>This specification defines two section names: “indexed-content” and “manifest”.</t>

<t>If <spanx style="verb">section-offsets</spanx>[“indexed-content”] is not present, parsing MUST fail.</t>

<t>The parser MUST ignore unknown keys in the <spanx style="verb">section-offsets</spanx> map because new
sections may be defined in future specifications.

  <cref anchor="ednote-critical-sections" source="jyasskin">Do we need to mark critical section names?</cref></t>

<t>Let <spanx style="emph">index</spanx> be the result of parsing the bytes starting at offset
<spanx style="emph">sections-start</spanx> + <spanx style="verb">section-offsets</spanx>[“indexed-content”] using the instructions in
<xref target="index"/>.</t>

<t>If <spanx style="verb">section-offsets</spanx>[“manifest”] is present, let <spanx style="emph">manifest</spanx> be the
result of parsing the bytes starting at offset <spanx style="emph">sections-start</spanx> +
<spanx style="verb">section-offsets</spanx>[“manifest”] using the instructions in <xref target="manifest"/>.</t>

<t>The parser MAY return a semantic package consisting of <spanx style="emph">index</spanx>, and,
if initialized, <spanx style="emph">manifest</spanx>.</t>

<t>To parse each resource described within <spanx style="emph">index</spanx>, the parser MUST follow the
instructions in <xref target="resource"/>.</t>

</section>
</section>
<section anchor="index" title="Parsing the index">

<t>The main content of a package is an index of HTTP requests pointing to HTTP
responses. These request/response pairs hold the manifests of sub-packages and
the resources in the package and all of its sub-packages. Both the requests and
responses can appear in any order, usually chosen to optimize loading while the
package is streamed.</t>

<t>To parse the index, starting at offset <spanx style="emph">index-start</spanx>, the parser MUST do the
following:</t>

<t>If the byte at <spanx style="emph">index-start</spanx> is not 0x82 (the <xref target="CBOR"/> header for a 2-element
array), the parser MUST fail.</t>

<t>Load a CBOR item starting at <spanx style="emph">index-start</spanx> + 1 as the <spanx style="verb">index</spanx> array in the following CDDL:</t>

<figure><artwork type="cddl"><![CDATA[
$section-name /= "indexed-content"
$section /= index

index = [* [resource-key: http-headers,
            offset: uint,
            ? length: uint] ]

; http-headers is a byte string in HPACK format (RFC7541).
; The dynamic table begins empty for each instance of
; http-headers.
http-headers = bstr
]]></artwork></figure>

<t>If the item doesn’t match this CDDL, or it is not a Canonical CBOR item (Section
3.9 of <xref target="CBOR"/>), the parser MUST fail.</t>

<t>Let <spanx style="emph">resources-start</spanx> be the offset immediately after the <spanx style="verb">index</spanx> item. For
example, if <spanx style="emph">index-start</spanx> were 75 and the <spanx style="verb">index</spanx> item were 105 bytes long,
<spanx style="emph">resources-start</spanx> would be 75+1+105=181. (1 for the 0x82 array header.)</t>

<t>Decode all of the <spanx style="verb">resource-key</spanx>s using <xref target="HPACK"/>, with an
initially-empty dynamic table for each one. 
  <cref anchor="ednote-compression" source="jyasskin">This spec has different security constraints from the
ones that drove HPACK, so we may be able to do better with another
compression format.</cref> The decoded <spanx style="verb">resource-key</spanx>s are header lists
(<xref target="HPACK"/>, Section 1.3), ordered lists of name-value pairs.</t>

<t>The parser MUST fail if any of the following is true:</t>

<t><list style="numbers">
  <t>HPACK decoding encountered an error.</t>
  <t>Any <spanx style="verb">resource-key</spanx>’s first three headers are not named “:scheme”,
“:authority”, and “:path”, in that order. Note that “:method” is
intentionally omitted because only the GET method is meaningful.</t>
  <t>Any of the pseudo-headers’ values violates a requirement in Section
8.1.2.3 of <xref target="HTTP2"/>.</t>
  <t>Any <spanx style="verb">resource-key</spanx> has a non-pseudo-header name that includes the
“:” character or is not lower-case ascii (<xref target="HTTP2"/>, Section
8.1.2).</t>
  <t>Any two decoded <spanx style="verb">resource-key</spanx>s are the same. Note that header
lists with the same header fields in a different order are not the
same.</t>
</list></t>

<t>Increment all <spanx style="verb">offset</spanx>s by <spanx style="emph">resources-start</spanx>.</t>

<t>Return the resulting <spanx style="verb">index</spanx>, an array of decoded-resource-key, adjusted-offset,
and optional-length triples.</t>

<t>The optional <spanx style="verb">length</spanx> field in the index entries is redundant with the length
prefixes on the <spanx style="verb">response-headers</spanx> and <spanx style="verb">body</spanx> in the content, but it can be used
to issue Range requests <xref target="RFC7233"/> for responses that appear late in the
content.</t>

</section>
<section anchor="manifest" title="Parsing the manifest">

<t>A package’s manifest contains some metadata for the package; hashes, used in
<xref target="hashing-resources"/>, for all resources included in that package; and
validity information for any <xref target="subpackages">sub-packages</xref> the package depends
on. The manifest is signed, so that UAs can trust that it comes from its claimed
origin. 
  <cref anchor="ednote-manifest-name" source="jyasskin">This section doesn’t describe a manifest
(https://www.merriam-webster.com/dictionary/manifest#h3), so consider
renaming it to something like “authenticity”.</cref></t>

<t>To parse a manifest starting at <spanx style="emph">manifest-start</spanx>, a parser MUST do the following:</t>

<t>Load one CBOR item starting at <spanx style="emph">manifest-start</spanx> as a <spanx style="verb">signed-manifest</spanx> from the
following CDDL:</t>

<figure><artwork type="cddl"><![CDATA[
$section-name /= "manifest"
$section /= signed-manifest

signed-manifest = {
  manifest: manifest,
  certificates: [+ certificate],
  signatures: [+ signature]
}

manifest = {
  metadata: manifest-metadata,
  resource-hashes: {* hash-algorithm => [hash-value]},
  ? subpackages: [* subpackage],
}

manifest-metadata = {
  date: time,
  origin: uri,
  * tstr => any,
}

; From https://www.w3.org/TR/CSP3/#grammardef-hash-algorithm.
hash-algorithm /= "sha256" / "sha384" / "sha512"
; Note that a hash value is not base64-encoded, unlike in CSP.
hash-value = bstr

; X.509 format; see https://tools.ietf.org/html/rfc5280
certificate = bstr

signature = {
  ; This is the index of the certificate within the certificates array to use
  ; to validate the signature.
  keyIndex: uint,
  signature: bstr,
}
]]></artwork></figure>

<t>If the item doesn’t match the CDDL or it’s not a Canonical CBOR item (Section
3.9 of <xref target="CBOR"/>), parsing MUST fail.</t>

<t>Parse the elements of <spanx style="verb">certificates</spanx> as X.509 certificates within the
<xref target="RFC5280"/> profile. If any certificate fails to parse, parsing MUST fail.</t>

<t>Let <spanx style="emph">message</spanx> be the concatenation of the following byte strings. This matches
the <xref target="TLS1.3"/> format to avoid cross-protocol attacks when
TLS certificates are used to sign manifests.</t>

<t><list style="numbers">
  <t>A string that consists of octet 32 (0x20) repeated 64 times.</t>
  <t>A context string: the ASCII encoding of “Web Package Manifest”.</t>
  <t>A single 0 byte which serves as a separator.</t>
  <t>The bytes of the <spanx style="verb">manifest</spanx> CBOR item.</t>
</list></t>

<t>Let <spanx style="emph">signing-certificates</spanx> be an empty array.</t>

<t>For each element <spanx style="emph">signature</spanx> of <spanx style="verb">signatures</spanx>:</t>

<t><list style="numbers">
  <t>Let <spanx style="emph">certificate</spanx> be <spanx style="verb">certificates</spanx>[<spanx style="emph">signature</spanx>[“keyIndex”]].</t>
  <t>The parser MUST define a partial function from public key types to signing
algorithms, with the following map as a subset:  <list style="hanging">
      <t hangText='RSA, 2048 bits:'>
      rsa_pss_sha256 as defined in Section 4.2.3 of <xref target="TLS1.3"/></t>
      <t hangText='EC, with the secp256r1 curve:'>
      ecdsa_secp256r1_sha256 as defined in Section 4.2.3 of <xref target="TLS1.3"/></t>
      <t hangText='EC, with the secp384r1 curve:'>
      ecdsa_secp384r1_sha384 as defined in Section 4.2.3 of <xref target="TLS1.3"/></t>
    </list>
Let <spanx style="emph">signing-alg</spanx> be the result of applying this function to the key type in
<spanx style="emph">certificate</spanx>’s Subject Public Key Info. If the function is undefined on this
input, the parser MUST continue to the next <spanx style="emph">signature</spanx>.</t>
  <t>Use <spanx style="emph">signing-alg</spanx> to verify that <spanx style="emph">signature</spanx>[“signature”] is <spanx style="emph">message</spanx>’s
signature by <spanx style="emph">certificate</spanx>’s public key. If it’s not, the parser MUST
continue to the next <spanx style="emph">signature</spanx>.</t>
  <t>Append <spanx style="emph">certificate</spanx> to <spanx style="emph">signing-certificates</spanx>. Note that failed signatures
simply cause their certificate to be ignored, so that packagers can give new
signature types to parsers that understand them.</t>
</list></t>

<t>Let <spanx style="emph">origin</spanx> be <spanx style="verb">manifest</spanx>[“metadata”][“origin”].</t>

<t>Try to find a certificate in <spanx style="emph">signing-certificates</spanx> that has an identity
(<xref target="RFC2818"/>, Section 3.1) matching <spanx style="emph">origin</spanx>’s hostname, and that is trusted
for serverAuth (<xref target="RFC5280"/>, Section 4.2.1.12) using paths built from elements
of <spanx style="verb">certificates</spanx> or any other certificates the parser is aware of. If no such
certificate is found, and the package is not already trusted as received from
<spanx style="emph">origin</spanx>’s hostname, for example because it was received over a TLS connection
to that host, then parsing MUST fail.</t>

<t><spanx style="strong">TODO:</spanx> Process the <spanx style="verb">subpackages</spanx> item by fetching those manifests via the index,
and checking their signatures and dates/hashes, recursively.</t>

<t>The parsed manifest consists of the set of <spanx style="emph">signing-certificates</spanx> and the
<spanx style="verb">manifest</spanx> CBOR item. The items in <spanx style="verb">manifest</spanx>[“metadata”] SHOULD be interpreted
as described in the <xref target="appmanifest"/> specification.</t>

<section anchor="subpackages" title="Sub-packages">

<t>A sub-package is represented by a <xref target="manifest"></xref> file looked up as
a <xref target="resource"></xref> within the <spanx style="verb">indexed-content</spanx> section. The sub-package’s
resources are not otherwise distinguished from the rest of the resources in the
package. Sub-packages can form an arbitrarily-deep tree.</t>

<t>There are three possible forms of dependencies on sub-packages, of which we
allow two. Because a sub-package’s manifest is protected by its own signature,
if the main package trusts the sub-package’s server, it could avoid specifying a
version of the sub-package at all. However, this opens the main package up to
downgrade attacks, where the sub-package is replaced by an older, vulnerable
version, so we don’t allow this option.</t>

<figure><artwork type="cddl"><![CDATA[
subpackage = [
  resource: resource-key,
  validation: {
    ? hash: {+ hash-algorithm => hash-value},
    ? notbefore: time,
  }
]
]]></artwork></figure>

<t>If the main package wants to load either the sub-package it was built with or
any upgrade, it can specify the date of the original sub-package:</t>

<figure><artwork type="cbor-diag"><![CDATA[
[32("https://example.com/loginsdk.package"), {"notbefore": 1(1486429554)}]
]]></artwork></figure>

<t>Constraining packages with their date makes it possible to link together
sub-packages with common dependencies, even if the sub-packages were built at
different times.</t>

<t>If the main package wants to be certain it’s loading the exact version
of a sub-package that it was built with, it can constrain sub-package
with a hash of its manifest:</t>

<figure><artwork type="cbor-diag"><![CDATA[
[32("https://example.com/loginsdk.package"),
 {"hash": {"sha256": b64'9qg0NGDuhsjeGwrcbaxMKZAvfzAHJ2d8L7NkDzXhgHk='}}]
]]></artwork></figure>

<t>Note that because the sub-package may include sub-sub-packages by date, the top
package may need to explicitly list those sub-sub-packages’ hashes in order to
be completely constrained.</t>

</section>
</section>
<section anchor="resource" title="Parsing a resource">

<t>To parse the resource from a <spanx style="emph">package</spanx> corresponding to a <spanx style="emph">header-list</spanx>, a
parser MUST do the following:</t>

<t>Find the (<spanx style="emph">resource-key</spanx>, <spanx style="emph">offset</spanx>, <spanx style="emph">length</spanx>) triple in <spanx style="emph">package</spanx>’s index where
<spanx style="emph">resource-key</spanx> is the same as <spanx style="emph">header-list</spanx>. If no such triple exists, the
parser MUST fail.</t>

<t>Parse one CBOR item starting at <spanx style="emph">offset</spanx> as the following CDDL:</t>

<figure><artwork type="cddl"><![CDATA[
response = [response-headers: http-headers, body: bstr]
]]></artwork></figure>

<t>If the item doesn’t match the CDDL or it’s not a Canonical CBOR item (Section
3.9 of <xref target="CBOR"/>), parsing MUST fail.</t>

<t>Decode the <spanx style="verb">response-headers</spanx> field using <xref target="HPACK"/>, with an
initially-empty dynamic table. The decoded <spanx style="verb">response-headers</spanx> is a
header list (<xref target="HPACK"/>, Section 1.3), an ordered list of name-value
pairs.</t>

<t>The parser MUST fail if any of the following is true:</t>

<t><list style="numbers">
  <t>HPACK decoding encountered an error.</t>
  <t>The first header name within <spanx style="verb">response-headers</spanx> is not “:status”,
or this pseudo-header’s value violates a requirement in Section
8.1.2.3 of <xref target="HTTP2"/>.</t>
  <t>Any other header name includes the “:” character or is not
lower-case ascii (<xref target="HTTP2"/>, Section 8.1.2).</t>
  <t>The <spanx style="emph">header-list</spanx> contains any header names other than “:scheme”,
“:authority”, “:path”, and either <spanx style="verb">response-headers</spanx> has no “vary”
header (Section 7.1.4 of <xref target="RFC7231"/>) or these header names aren’t
listed in it.</t>
</list></t>

<t>Let <spanx style="emph">origin</spanx> be the Web Origin <xref target="RFC6454"/> of <spanx style="emph">header-list</spanx>’s “:scheme” and
“:authority” headers.</t>

<t anchor="hashing-resources">Let <spanx style="emph">resource-bytes</spanx> be the result of encoding the array of
[<spanx style="emph">header-list</spanx>, <spanx style="verb">response-headers</spanx>, <spanx style="verb">body</spanx>] as Canonical CBOR in the
following CDDL schema: 
  <cref anchor="ednote-figure-in-list" source="jyasskin">This step would be inside the manifest-only block, but
then the code block is rendered out-of-order.</cref></t>

<figure><artwork type="cddl"><![CDATA[
resource-bytes = [
  request: [
    *(header-name: bstr, header-value: bstr)
  ],
  response-headers: [
    *(header-name: bstr, header-value: bstr)
  ],
  response-body: bstr
]
]]></artwork></figure>

<t>Note that this uses the decoded header fields, not the bytes originally included
in the package.</t>

<t>The hashed data differs from <xref target="SRI"/>, which only hashes the body. Including the
headers will usually prevent a package from relying on some of its contents
being transferred as normal network responses, unless its author can guarantee
the network won’t change or reorder the headers.</t>

<t>If the <spanx style="emph">package</spanx> contains a <spanx style="emph">manifest</spanx>:</t>

<t><list style="numbers">
  <t><spanx style="strong">TODO:</spanx> Let <spanx style="emph">origin-manifest</spanx> be the signed manifest for <spanx style="emph">origin</spanx>, found
by searching through <spanx style="emph">manifest</spanx>’s subpackages for a matching origin.</t>
  <t>Let <spanx style="emph">alg</spanx> be one of the <spanx style="verb">hash-algorithm</spanx>s within <spanx style="emph">origin-manifest</spanx>. The
parser SHOULD select the most collision-resistant hash algorithm. If the
parser also implements <xref target="SRI"/>, it SHOULD use the same order as its
<spanx style="verb">getPrioritizedHashFunction()</spanx> implementation.</t>
  <t>If the digest of <spanx style="emph">resource-bytes</spanx> using <spanx style="emph">alg</spanx> does not appear in the
<spanx style="emph">origin-manifest</spanx>’s <spanx style="verb">resource-hashes</spanx>[<spanx style="emph">alg</spanx>] array, the parser MUST fail.</t>
</list></t>

<t>Return the (decoded <spanx style="verb">response-headers</spanx>, <spanx style="verb">body</spanx>) pair.</t>

</section>
</section>
<section anchor="authoring-guidelines" title="Guidelines for package authors">

<t>Packages SHOULD consist of a single Canonical CBOR item matching the
<spanx style="verb">webpackage</spanx> CDDL rule in <xref target="top-level"/>.</t>

<t>Every resource’s hash SHOULD appear in every array within
<spanx style="verb">resource-hashes</spanx>: otherwise the set of valid resources will depend on
the parser’s choice of preferred hash algorithm.</t>

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

<t>Signature validation is difficult.</t>

<t>Packages with a valid signature need to be invalidated when either</t>

<t><list style="symbols">
  <t>the private key for any certificate in the signature’s validation
chain is leaked, or</t>
  <t>a vulnerability is discovered in the package’s contents.</t>
</list></t>

<t>Because packages are intended to be used offline, it’s impossible to
inject a revocation check into the critical path of using the package,
and even in online scenarios,
such
<eref target="https://www.imperialviolet.org/2012/02/05/crlsets.html">revocation checks don’t actually work</eref>.
Instead, package consumers must check for a sufficiently recent set of
validation files, consisting of OCSP responses <xref target="RFC6960"/> and signed
package version constraints, for example within the last 7-30 days.
<spanx style="strong">TODO:</spanx> These version constraints aren’t designed yet.</t>

<t>Relaxing the requirement to consult DNS when determining authority for an origin
means that an attacker who possesses a valid certificate no longer needs to be
on-path to redirect traffic to them; instead of modifying DNS, they need only
convince the user to visit another Web site, in order to serve packages signed
as the target.</t>

<t>All subpackages that mention a particular origin need to be validated
before loading resources from that origin. Otherwise, package A could
include package B and an old, vulnerable version of package C that B
also depends on. If B’s dependency isn’t checked before loading
resources from C, A could compromise B.</t>

</section>
<section anchor="iana-considerations" title="IANA considerations">

<section anchor="internet-media-type-registration" title="Internet Media Type Registration">

<t>IANA maintains the registry of Internet Media Types <xref target="RFC6838"/>
at <eref target="https://www.iana.org/assignments/media-types">https://www.iana.org/assignments/media-types</eref>.</t>

<t><list style="symbols">
  <t>Type name: application</t>
  <t>Subtype name: package+cbor 
      <cref anchor="ednote-mime-naming" source="jyasskin">I suspect the mime type will need to be a bit longer:
application/webpackage+cbor or similar.</cref></t>
  <t>Required parameters: N/A</t>
  <t>Optional parameters: N/A</t>
  <t>Encoding considerations: binary</t>
  <t>Security considerations: See <xref target="security"/> of this document.</t>
  <t>Interoperability considerations: N/A</t>
  <t>Published specification: This document</t>
  <t>Applications that use this media type: None yet, but it is expected that web
   browsers will use this format.</t>
  <t>Fragment identifier considerations: N/A</t>
  <t>Additional information:  <list style="symbols">
      <t>Deprecated alias names for this type: N/A</t>
      <t>Magic number(s): 85 48 F0 9F 8C 90 F0 9F 93 A6</t>
      <t>File extension(s): .wpk</t>
      <t>Macintosh file type code(s): N/A</t>
    </list></t>
  <t>Person &amp; email address to contact for further information:
See the Author’s Address section of this specification.</t>
  <t>Intended usage: COMMON</t>
  <t>Restrictions on usage: N/A</t>
  <t>Author:
See the Author’s Address section of this specification.</t>
  <t>Change controller:
The IESG <eref target="mailto:iesg@ietf.org">iesg@ietf.org</eref></t>
  <t>Provisional registration? (standards tree only): Not yet.</t>
</list></t>

</section>
</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference  anchor="CBOR" target='http://www.rfc-editor.org/info/rfc7049'>
<front>
<title>Concise Binary Object Representation (CBOR)</title>
<author initials='C.' surname='Bormann' fullname='C. Bormann'><organization /></author>
<author initials='P.' surname='Hoffman' fullname='P. Hoffman'><organization /></author>
<date year='2013' month='October' />
<abstract><t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation.  These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t></abstract>
</front>
<seriesInfo name='RFC' value='7049'/>
<seriesInfo name='DOI' value='10.17487/RFC7049'/>
</reference>



<reference anchor="CDDL">
<front>
<title>CBOR data definition language (CDDL): a notational convention to express CBOR data structures</title>

<author initials='H' surname='Birkholz' fullname='Henk Birkholz'>
    <organization />
</author>

<author initials='C' surname='Vigano' fullname='Christoph Vigano'>
    <organization />
</author>

<author initials='C' surname='Bormann' fullname='Carsten Bormann'>
    <organization />
</author>

<date month='March' day='13' year='2017' />

<abstract><t>This document proposes a notational convention to express CBOR data structures (RFC 7049).  Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-greevenbosch-appsawg-cbor-cddl-10' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-greevenbosch-appsawg-cbor-cddl-10.txt' />
</reference>



<reference anchor="appmanifest"
           target='https://www.w3.org/TR/2017/WD-appmanifest-20170608'>
<front>
<title>Web App Manifest</title>

<author initials='M.' surname='Caceres' fullname='Marcos Caceres'>
    <organization />
</author>

<author initials='K.' surname='Christiansen' fullname='Kenneth Christiansen'>
    <organization />
</author>

<author initials='M.' surname='Lamouri' fullname='Mounir Lamouri'>
    <organization />
</author>

<author initials='A.' surname='Kostiainen' fullname='Anssi Kostiainen'>
    <organization />
</author>

<date month='June' day='8' year='2017' />
</front>

<seriesInfo name='World Wide Web Consortium WD' value='WD-appmanifest-20170608' />
<format type='HTML' target='https://www.w3.org/TR/2017/WD-appmanifest-20170608' />
</reference>


<reference anchor="HTML" target="https://html.spec.whatwg.org/multipage/">
  <front>
    <title>HTML</title>
    <author >
      <organization>WHATWG</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>




<reference anchor="SRI"
           target='http://www.w3.org/TR/2016/REC-SRI-20160623'>
<front>
<title>Subresource Integrity</title>

<author initials='D.' surname='Akhawe' fullname='Devdatta Akhawe'>
    <organization />
</author>

<author initials='F.' surname='Braun' fullname='Frederik Braun'>
    <organization />
</author>

<author initials='F.' surname='Marier' fullname='Francois Marier'>
    <organization />
</author>

<author initials='J.' surname='Weinberger' fullname='Joel Weinberger'>
    <organization />
</author>

<date month='June' day='23' year='2016' />
</front>

<seriesInfo name='World Wide Web Consortium Recommendation' value='REC-SRI-20160623' />
<format type='HTML' target='http://www.w3.org/TR/2016/REC-SRI-20160623' />
</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="RFC8174" target='http://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="HPACK" target='http://www.rfc-editor.org/info/rfc7541'>
<front>
<title>HPACK: Header Compression for HTTP/2</title>
<author initials='R.' surname='Peon' fullname='R. Peon'><organization /></author>
<author initials='H.' surname='Ruellan' fullname='H. Ruellan'><organization /></author>
<date year='2015' month='May' />
<abstract><t>This specification defines HPACK, a compression format for efficiently representing HTTP header fields, to be used in HTTP/2.</t></abstract>
</front>
<seriesInfo name='RFC' value='7541'/>
<seriesInfo name='DOI' value='10.17487/RFC7541'/>
</reference>



<reference  anchor="HTTP2" target='http://www.rfc-editor.org/info/rfc7540'>
<front>
<title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
<author initials='M.' surname='Belshe' fullname='M. Belshe'><organization /></author>
<author initials='R.' surname='Peon' fullname='R. Peon'><organization /></author>
<author initials='M.' surname='Thomson' fullname='M. Thomson' role='editor'><organization /></author>
<date year='2015' month='May' />
<abstract><t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2).  HTTP/2 enables a more efficient use of network resources and a reduced perception of latency by introducing header field compression and allowing multiple concurrent exchanges on the same connection.  It also introduces unsolicited push of representations from servers to clients.</t><t>This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax.  HTTP's existing semantics remain unchanged.</t></abstract>
</front>
<seriesInfo name='RFC' value='7540'/>
<seriesInfo name='DOI' value='10.17487/RFC7540'/>
</reference>



<reference  anchor="RFC5280" target='http://www.rfc-editor.org/info/rfc5280'>
<front>
<title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
<author initials='D.' surname='Cooper' fullname='D. Cooper'><organization /></author>
<author initials='S.' surname='Santesson' fullname='S. Santesson'><organization /></author>
<author initials='S.' surname='Farrell' fullname='S. Farrell'><organization /></author>
<author initials='S.' surname='Boeyen' fullname='S. Boeyen'><organization /></author>
<author initials='R.' surname='Housley' fullname='R. Housley'><organization /></author>
<author initials='W.' surname='Polk' fullname='W. Polk'><organization /></author>
<date year='2008' month='May' />
<abstract><t>This memo profiles the X.509 v3 certificate and X.509 v2 certificate revocation list (CRL) for use in the Internet.  An overview of this approach and model is provided as an introduction.  The X.509 v3 certificate format is described in detail, with additional information regarding the format and semantics of Internet name forms.  Standard certificate extensions are described and two Internet-specific extensions are defined.  A set of required certificate extensions is specified.  The X.509 v2 CRL format is described in detail along with standard and Internet-specific extensions.  An algorithm for X.509 certification path validation is described.  An ASN.1 module and examples are provided in the appendices.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='5280'/>
<seriesInfo name='DOI' value='10.17487/RFC5280'/>
</reference>



<reference anchor="TLS1.3">
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.3</title>

<author initials='E' surname='Rescorla' fullname='Eric Rescorla'>
    <organization />
</author>

<date month='April' day='28' year='2017' />

<abstract><t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-tls-tls13-20' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-tls-tls13-20.txt' />
</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>



<reference  anchor="RFC7231" target='http://www.rfc-editor.org/info/rfc7231'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</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 defines the semantics of HTTP/1.1 messages, as expressed by request methods, request header fields, response status codes, and response header fields, along with the payload of messages (metadata and body content) and mechanisms for content negotiation.</t></abstract>
</front>
<seriesInfo name='RFC' value='7231'/>
<seriesInfo name='DOI' value='10.17487/RFC7231'/>
</reference>



<reference  anchor="RFC6454" target='http://www.rfc-editor.org/info/rfc6454'>
<front>
<title>The Web Origin Concept</title>
<author initials='A.' surname='Barth' fullname='A. Barth'><organization /></author>
<date year='2011' month='December' />
<abstract><t>This document defines the concept of an &quot;origin&quot;, which is often used as the scope of authority or privilege by user agents.  Typically, user agents isolate content retrieved from different origins to prevent malicious web site operators from interfering with the operation of benign web sites.  In addition to outlining the principles that underlie the concept of origin, this document details how to determine the origin of a URI and how to serialize an origin into a string.  It also defines an HTTP header field, named &quot;Origin&quot;, that indicates which origins are associated with an HTTP request.   [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6454'/>
<seriesInfo name='DOI' value='10.17487/RFC6454'/>
</reference>



<reference  anchor="RFC6960" target='http://www.rfc-editor.org/info/rfc6960'>
<front>
<title>X.509 Internet Public Key Infrastructure Online Certificate Status Protocol - OCSP</title>
<author initials='S.' surname='Santesson' fullname='S. Santesson'><organization /></author>
<author initials='M.' surname='Myers' fullname='M. Myers'><organization /></author>
<author initials='R.' surname='Ankney' fullname='R. Ankney'><organization /></author>
<author initials='A.' surname='Malpani' fullname='A. Malpani'><organization /></author>
<author initials='S.' surname='Galperin' fullname='S. Galperin'><organization /></author>
<author initials='C.' surname='Adams' fullname='C. Adams'><organization /></author>
<date year='2013' month='June' />
<abstract><t>This document specifies a protocol useful in determining the current status of a digital certificate without requiring Certificate Revocation Lists (CRLs). Additional mechanisms addressing PKIX operational requirements are specified in separate documents.  This document obsoletes RFCs 2560 and 6277.  It also updates RFC 5912.</t></abstract>
</front>
<seriesInfo name='RFC' value='6960'/>
<seriesInfo name='DOI' value='10.17487/RFC6960'/>
</reference>




    </references>

    <references title='Informative References'>





<reference anchor="ServiceWorkers"
           target='https://www.w3.org/TR/2016/WD-service-workers-1-20161011'>
<front>
<title>Service Workers 1</title>

<author initials='A.' surname='Russell' fullname='Alex Russell'>
    <organization />
</author>

<author initials='J.' surname='Song' fullname='Jungkee Song'>
    <organization />
</author>

<author initials='J.' surname='Archibald' fullname='Jake Archibald'>
    <organization />
</author>

<author initials='M.' surname='Kruisselbrink' fullname='Marijn Kruisselbrink'>
    <organization />
</author>

<date month='October' day='11' year='2016' />
</front>

<seriesInfo name='World Wide Web Consortium WD' value='WD-service-workers-1-20161011' />
<format type='HTML' target='https://www.w3.org/TR/2016/WD-service-workers-1-20161011' />
</reference>



<reference  anchor="RFC7233" target='http://www.rfc-editor.org/info/rfc7233'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Range Requests</title>
<author initials='R.' surname='Fielding' fullname='R. Fielding' role='editor'><organization /></author>
<author initials='Y.' surname='Lafon' fullname='Y. Lafon' 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 defines range requests and the rules for constructing and combining responses to those requests.</t></abstract>
</front>
<seriesInfo name='RFC' value='7233'/>
<seriesInfo name='DOI' value='10.17487/RFC7233'/>
</reference>



<reference  anchor="RFC6838" target='http://www.rfc-editor.org/info/rfc6838'>
<front>
<title>Media Type Specifications and Registration Procedures</title>
<author initials='N.' surname='Freed' fullname='N. Freed'><organization /></author>
<author initials='J.' surname='Klensin' fullname='J. Klensin'><organization /></author>
<author initials='T.' surname='Hansen' fullname='T. Hansen'><organization /></author>
<date year='2013' month='January' />
<abstract><t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols.  This memo documents an Internet Best Current Practice.</t></abstract>
</front>
<seriesInfo name='BCP' value='13'/>
<seriesInfo name='RFC' value='6838'/>
<seriesInfo name='DOI' value='10.17487/RFC6838'/>
</reference>




    </references>


<section anchor="acknowledgements" title="Acknowledgements">

<t>Thanks to Adam Langley and Ryan Sleevi for in-depth feedback about the security
impact of this proposal.</t>

</section>


  </back>

<!-- ##markdown-source:
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
EaKm/wU+gwg8tVoAAA==

-->

</rfc>

