<?xml version="1.0" encoding="utf-8"?>
<!-- 
     draft-rfcxml-general-template-standard-00
  
     This template includes examples of the most commonly used features of RFCXML with comments 
     explaining how to customise them. This template can be quickly turned into an I-D by editing 
     the examples provided. Look for [REPLACE], [REPLACE/DELETE], [CHECK] and edit accordingly.
     Note - 'DELETE' means delete the element or attribute, not just the contents.
     
     Documentation is at https://authors.ietf.org/en/templates-and-schemas
-->
<?xml-model href="rfc7991bis.rnc"?>  <!-- Required for schema validation and schema-aware editing -->
<!-- <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> -->
<!-- This third-party XSLT can be enabled for direct transformations in XML processors, including most browsers -->


<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>

<rfc
  xmlns:xi="http://www.w3.org/2001/XInclude"
  category="std"
  ipr="trust200902"
  obsoletes=""
  updates=""
  submissionType="IETF"
  xml:lang="en"
  version="3"
  tocInclude="true"
  tocDepth="5"
  symRefs="true"
  sortRefs="true"
  consensus="true"
  docName="draft-ietf-cdni-client-access-control-metadata-04"
  >
  
   <front>
      <title abbrev="CDNI Client Access Control Metadata">CDNI Client Access Control Metadata</title>
      <author fullname="Pankaj Chaudhari" initials="P." surname="Chaudhari">
         <organization>Disney</organization>
         <address>
            <postal>
               <street />
               <city />
               <region />
               <code />
               <country>US</country>
            </postal>
            <email>pankaj.chaudhari.pub@gmail.com</email>
         </address>
      </author>
      <author fullname="Glenn Goldstein" initials="G." surname="Goldstein">
         <organization>Lumen Technologies</organization>
         <address>
            <postal>
               <street />
               <city />
               <region />
               <code />
               <country>US</country>
            </postal>
            <email>glenng1215@gmail.com</email>
         </address>
      </author>
      <author initials="W." surname="Power" fullname="Will Power">
         <organization>Lumen Technologies</organization>
         <address>
            <postal>
               <street />
               <city />
               <region />
               <code />
               <country>US</country>
            </postal>
            <email>wrpower@gmail.com</email>
         </address>
      </author>
      <author fullname="Arnon Warshavsky" initials="A." surname="Warshavsky">
         <organization>Qwilt</organization>
         <address>
            <postal>
               <street />
               <city />
               <region />
               <code />
               <country>Israel</country>
            </postal>
            <email>arnon@qwilt.com</email>
         </address>
      </author>
      <date />
      <workgroup>Content Delivery Networks Interconnection</workgroup>
      <abstract>
         <t>
         This specification adds to the basic client access control metadata in RFC8006, providing content providers and upstream content delivery networks (uCDNs) extended capabilities in defining location and time window restrictions. Support is also provided to define required Transport Layer Security (TLS) certificates and encryption levels. The specification also defines configuration metadata for the Common Access Token (CAT), developed jointly by the Streaming Video Technology Alliance (SVTA) and Consumer Technology Association Web Application Video Ecosystem (CTA-WAVE).
         </t>
      </abstract>
   </front>
<middle>
<section anchor="h.3znysh7">
  <name>Introduction</name>
  <t>The <xref target="RFC8006"/> LocationACL and TimeWindowACL objects provide basic capabilities to gate a client's access to content. This specification details alternatives to these objects (using LocationACLExtended and TimeWindowACLExtended), that allow for the configuration of a Hypertext Transfer Protocol (HTTP) response in cases where requests are denied. Additional objects allow for the specification of metadata for required TLS certificates, encryption levels, and authentication tokens leveraging the CTA-WAVE Common Access Token standard <xref target="CTA-5007-B"/> The specification also introduces standardized names for HTTP2 and HTTP3 protocols.</t>
</section><section anchor="requirements" title="Requirements">
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in <xref target="RFC2119"/>.</t>
</section><section anchor="h.r5j500ymicyj">
  <name>MI.LocationACLExtended</name>
  <t>MI.LocationACLExtended is an alternative to the Content Delivery Network Interconnection (CDNI) standard MI.LocationACL object that defines the locations (footprints) a User Agent needs to be in, in order to be able to receive the associated content. MI.LocationACLExtended uses ACL rules of type MI.LocationRuleExtended, providing rules for handling denied requests.</t>
  <t>This object conforms to the specification defined for the behavior of MI.LocationACL and the two are mutually exclusive. Note that MI.LocationACLExtended instances that deny access are handled as terminating objects (as defined in <xref target="I-D.goldstein-processing-stages-metadata"/>) in that processing is terminated upon execution.</t>
  <t>Property: rules</t>
  <ul>
    <li>
      <t>Description: List of allow/deny rules per user location.</t>
    </li>
    <li>
      <t>Type: Array of MI.LocationRuleExtended objects.</t>
    </li>
    <li>
      <t>Mandatory-to-Specify: Yes</t>
    </li>
  </ul>
  <t>The following is an example of MI.LocationACLExtended with "allow/deny" rules:</t>
  <figure>
    <sourcecode><![CDATA[{
  "generic-metadata-type": "MI.LocationACLExtended",
  "generic-metadata-value": {
    "rules": [
      {
        "locations": [
          {
            "footprint-type": "ipv4cidr",
            "footprint-value": [
              "10.1.1.0/24"
            ]
          }
        ],
        "action": "allow",
        "comment": "Support team"
      },
      {
        "locations": [
          {
            "footprint-type": "asn",
            "footprint-value": [
              "as12345"
            ]
          }
        ],
        "action": "deny",
        "comment": "Viewers from Antarctica",
        "deny-response": {
          "response-status": "302",
          "headers": [
            {
              "name": "Location",
              "value": "https: //example.com"
            },
            {
              "name": "Content-Type",
              "value": "text/html"
            }
          ]
        }
      }
    ]
  }
}]]></sourcecode>
  </figure>
  <section anchor="h.pbyfxlwnga9">
    <name>MI.LocationRuleExtended</name>
    <t>MI.LocationRuleExtended is a subobject of MI.LocationACLExtended that defines pairs of user locations and allow/deny actions.</t>
    <t>Property: locations</t>
    <ul>
      <li>
        <t>Description: An array of client footprints to match against.        These         footprints, defined by pairs of MI_footprinttype_ex and         MI_footprintvalue_ex respectively, extend the CDNI MI_footprinttype         and MI_footprintvalue On top of the four footprint types defined by the CDNI in <xref target="RFC8006"/> (ipv4cidr,ipv6cidr,asn,countrycode), three new types are added:(ipv4range, ipv6range, subdivisioncode)         </t>
      </li>
      <li>
        <t>Type: Array of MI.Footprint objects</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes</t>
      </li>
    </ul>
    <t>Property: action</t>
    <ul>
      <li>
        <t>Description: The action to take place upon a location match.         </t>
      </li>
      <li>
        <t>Type: String, one of (allow | deny)</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: No. The default is "deny".</t>
      </li>
    </ul>
    <t>Property: comment</t>
    <ul>
      <li>
        <t>Description: An optional text comment for user readability and for   incorporating in logging.         </t>
      </li>
      <li>
        <t>Type: String         </t>
      </li>
      <li>
        <t>Mandatory-to-Specify: No</t>
      </li>
    </ul>
    <t>Property: deny-response</t>
    <ul>
      <li>
        <t>Description: The configuration of the entire response to the client in case of a   "Deny" action.         </t>
      </li>
      <li>
        <t>Type: MI.SyntheticResponse         </t>
      </li>
      <li>
        <t>Mandatory-to-Specify: No. The default is  { "response-status" : 403 }.</t>
      </li>
    </ul>
    <t>Property: match-all-locations</t>
    <ul>
      <li>
        <t>Description: The ACL rule match will take place only if all locations In          the rule are matched, e.g., both asn and subdivisioncode.         </t>
      </li>
      <li>
        <t>Type: Boolean         </t>
      </li>
      <li>
        <t>Mandatory-to-Specify: No. The default is "False".</t>
      </li>
    </ul>
  </section>
</section><section anchor="h.ewy1gcmzyk0i">
  <name>MI.TimeWindowACLExtended</name>
  <t>MI.TimeWindowACLExtended is an alternative to the CDNI standard MI.TimeWindow object for implementing time-based access restrictions. It uses ACL rules of type MI.TimeWindowRuleExtended to provide rules for handling denied requests.</t>
  <t>This object conforms to the specification defined for the behavior of MI.TimeWindowACL and the two are mutually exclusive. Note that MI.TimeWindowACLExtended instances that deny access are handled as terminating objects <xref target="I-D.goldstein-processing-stages-metadata"/> in that processing is terminated upon execution.</t>
  <t>Property: rules</t>
  <ul>
    <li>
      <t>Description: List of time window allow deny rules.</t>
    </li>
    <li>
      <t>Type: An array of MI.TimeWindowRuleExtended objects.         </t>
    </li>
    <li>
      <t>Mandatory-to-Specify:  Yes</t>
    </li>
  </ul>
  <t>The following is an example of MI.TimeWindowACLExtended with "allow" rules:</t>
  <figure>
    <sourcecode><![CDATA[{
  "generic-metadata-type": "MI.TimeWindowACLExtended",
  "generic-metadata-value": {
    "rules": [
      {
        "windows": [
          {
            "start": 1670976000,
            "end": 4294967295
          }
        ],
        "action": "allow",
        "comment": "episode 1 launch"
      }
    ]
  }
}]]></sourcecode>
  </figure>
  <section anchor="h.bs8cjhe0577y">
    <name>MI.TimeWindowRuleExtended</name>
    <t>Property: windows</t>
    <ul>
      <li>
        <t>Description: Array of time windows to which the rule applies.        </t>
      </li>
      <li>
        <t>Type: Array of MI.TimeWindow objects, as defined in RFC8006], using time values expressed in seconds since the UNIX epoch (i.e., zero hours, zero minutes, zero seconds, on January 1, 1970) Coordinated Universal Time (UTC).  </t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes</t>
      </li>
    </ul>
    <t>Property: action</t>
    <ul>
      <li>
        <t>Description: The action to take place upon a time window match.</t>
      </li>
      <li>
        <t>Type: String, one of (allow | deny)         </t>
      </li>
      <li>
        <t>Mandatory-to-Specify: No. The default is "deny".</t>
      </li>
    </ul>
    <t>Property: comment</t>
    <ul>
      <li>
        <t>Description: An OPTIONAL text comment for user readability and for incorporating in logging.         </t>
      </li>
      <li>
        <t>Type: String         </t>
      </li>
      <li>
        <t>Mandatory-to-Specify: No</t>
      </li>
    </ul>
    <t>Property: deny-response</t>
    <ul>
      <li>
        <t>Description: The configuration of the entire response to the client in case of a "Deny" action.         </t>
      </li>
      <li>
        <t>Type: MI.SyntheticResponse         </t>
      </li>
      <li>
        <t>Mandatory-to-Specify: No. The default is  { "response-status" : 403 }.</t>
      </li>
    </ul>
  </section>
</section><section anchor="h.1jlhe41flkh2">
  <name>MI.CertificateMetadata</name>
  <t>To allow for secure delivery of content, a downstream CDN (dCDN) MUST be configured to support Hypertext Transfer Protocol Secure (HTTPs). The MI.CertificateMetadata object is used to configure the dCDN's HTTPs attributes, such as TLS certificate credentials, encryption levels, protocols, and ciphers.</t>
  <t>Property: encryption-level</t>
  <ul>
    <li>
      <t>Description: A reference to an MI.EncryptionLevelMetadata object that specifies the TLS protocols and ciphers to use.  </t>
    </li>
    <li>
      <t>Type: MI.EncryptionLevelMetadata </t>
    </li>
    <li>
      <t>Mandatory-to-Specify: Yes</t>
    </li>
  </ul>
  <t>Property: delegated-credentials</t>
  <ul>
    <li>
      <t>Description: A reference to the certificate's delegated credentials to use when establishing a TLS session with the client. </t>
    </li>
    <li>
      <t>Type: MI.CertificateCredentialsMetadata</t>
    </li>
    <li>
      <t>Mandatory-to-Specify: Yes</t>
    </li>
  </ul>
  <t>Property:  ocsp-enabled</t>
  <ul>
    <li>
      <t>Description: When ocsp-enabled is set to "True", the dCDN will check the revocation status of the configured certificate and include that information with the response to the client.  See <xref target="RFC6066"/>, section 8</t>
    </li>
    <li>
      <t>Type: Boolean </t>
    </li>
    <li>
      <t>Mandatory-to-Specify: No. The default is "False".</t>
    </li>
  </ul>
  <t>Property: prefer-server-ciphers</t>
  <ul>
    <li>
      <t>Description: When prefer-server-ciphers is set to "False" (the default), the dCDN will prefer to use cipher suites in the order presented by the client when negotiating the TLS handshake. When prefer-server-ciphers is set to "True", cipher suites will be selected in the order preferred by the dCDN server.</t>
    </li>
    <li>
      <t>Type: Boolean </t>
    </li>
    <li>
      <t>Mandatory-to-Specify: No. The default is "False".</t>
    </li>
  </ul>
  <t>The following is an example of MI.CertificateMetadata:</t>
  <figure>
    <sourcecode><![CDATA[{
  "generic-metadata-type": "MI.CertificateMetadata",
  "generic-metadata-value": {
    "encryption-level": {
      "generic-metadata-type": "MI.EncryptionLevelMetadata",
      "generic-metadata-value": {
        "encryption-level-name": "modern",
        "protocols": [
          "TLSv1.2",
          "TLSv1.3"
        ],
        "ciphers": [
          "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
          "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
          "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384"
        ]
      }
    },
    "delegated-credentials": {
      "generic-metadata-type": "MI.CertificateCredentialsMetadata",
      "generic-metadata-value": {
        "delegated-credentials-type": "MI.ConfDelegatedCredentials",
        "delegated-credentials-value": {
          "credentials-location-uri":
                                "https://acme.example.com/cert-123"
        }
      }
    },
    "ocsp-enabled": "false",
    "prefer-server-ciphers": "false"
  }
}]]></sourcecode>
  </figure>
  <section anchor="h.q7pvor1gqx0l">
    <name>MI.EncryptionLevelMetadata</name>
    <t>MI.EncryptionLevelMetadata is a subobject of MI.CertificateMetadata to support HTTPS content delivery.  MI.EncryptionLevelMetadata specifies the protocols and ciphers to be used by the associated MI.CertificateMetadata object. Externalizing MI.EncryptionLevelMetadata from MI.CertificateMetadata allows security policy (TLS protocols and ciphers) to be defined once and referenced by many configurations.</t>
    <t>Property: encryption-level-name</t>
    <ul>
      <li>
        <t>Description: A descriptive name for the MI.EncryptionLevelMetadata object.  This name is expected to be used by operators to reference the MI.EncryptionLevelMetadata configuration.</t>
      </li>
      <li>
        <t>Type: String</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes</t>
      </li>
    </ul>
    <t>Property: protocols</t>
    <ul>
      <li>
        <t>Description: An array that lists the allowed protocols for the TLS session.  </t>
      </li>
      <li>
        <t>Type: Array of enumerated values. Must be one of:  "TLSv1.0", "TLSv1.1", "TLSv1.2" , "TLSv1.3", "SSLv3".</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes</t>
      </li>
    </ul>
    <t>Property: ciphers</t>
    <ul>
      <li>
        <t>Description: An array that lists the allowed ciphers for the TLS session, using cipher suite names defined in <xref target="RFC5289"/> For example,  TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 or TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384.</t>
      </li>
      <li>
        <t>Type: Array of strings</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes</t>
      </li>
    </ul>
    <t>The following is an example of MI.EncryptionLevelMetadata:</t>
    <figure>
      <sourcecode><![CDATA[{
  "generic-metadata-type": "MI.EncryptionLevelMetadata",
  "generic-metadata-value": {
    "encryption-level-name": "modern-version-1.2",
    "protocols": [
      "TLSv1.2",
      "TLSv1.3"
    ],
    "ciphers": [
      "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
      "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
      "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384"
    ]
  }
}]]></sourcecode>
    </figure>
  </section>
  <section anchor="h.iwgz46buzayg">
    <name>MI.CertificateCredentialsMetadata</name>
    <t>MI.CertificateCredentialsMetadata is a subobject of MI.CertificateMetadata  and defines the credentials to use when establishing a TLS session between a dCDN and a client.  </t>
    <t>Note: This document does not define any DelegatedCredentials methods. Individual DelegatedCredentials methods are defined separately, e.g.,  MI.DelegatedCredentials and Acme-Delegations (see CDNI Metadata for Delegated Credentials <xref target="RFC9677"/> and Delegation Using the Automated Certificate Management Environment <xref target="RFC9538"/>).</t>
    <t>Property: delegated-credentials-type</t>
    <ul>
      <li>
        <t>Description: The DelegatedCredentials type (the CDNI Payload Type <xref target="RFC7736"/>  of the GenericMetadata object contained in the delegated-credentials-value property).</t>
      </li>
      <li>
        <t>Type: String</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes</t>
      </li>
    </ul>
    <t>Property: delegated-credentials-value</t>
    <ul>
      <li>
        <t>Description: An object conforming to the specification associated with the DelegatedCredentials type.</t>
      </li>
      <li>
        <t>Type: GenericMetadata object</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes</t>
      </li>
    </ul>
    <t>The following is an example of MI.CertificateCredentialsMetadata:</t>
    <figure>
      <sourcecode><![CDATA[{
  "generic-metadata-type": "MI.CertificateCredentialsMetadata",
  "generic-metadata-value": {
    "delegated-credentials-type":
      <CDNI Payload Type of this DelegatedCredentials object>,
    "delegated-credentials-value": {
      <Properties of this DelegatedCredentials object>
    }
  }
}]]></sourcecode>
    </figure>
  </section>
</section><section anchor="h.leo1yk18gp3e">
  <name>MI.ClientAuthMetadata</name>
  <t>The MI.ClientAuthMetadata object defines how a dCDN authenticates client requests.</t>
  <t>Property: delivery-auth</t>
  <ul>
    <li>
      <t>Description: Authentication method to use when granting access to a resource requested by a client.</t>
    </li>
    <li>
      <t>Type: MI.Auth object, as defined in <xref target="RFC8006"/> section 4.2.7</t>
    </li>
    <li>
      <t>Mandatory-to-Specify: Yes</t>
    </li>
  </ul>
  <t>Following is a simple example:</t>
  <figure>
    <sourcecode><![CDATA[{
  "generic-metadata-type": "MI.ClientAuthMetadata",
  "generic-metadata-value": {
    "delivery-auth": {
      "generic-metadata-type": "MI.Auth",
      "generic-metadata-value": {
        "auth-type": <CDNI Payload Type of this Auth object>,
        "auth-value": {}
      }
    }
  }
}]]></sourcecode>
  </figure>
</section><section anchor="h.oi26eqn9qppi">
  <name>MI.CATAuth</name>
  <t>The MI.CATAuth object defines the configuration for a dCDN to authenticate client requests using the Common Access Token standard as documented in the CTA-WAVE Standard  <xref target="CTA-5007-B"/> The MI.CATAuth metadata object is used in the auth-value property of the MI.Auth object, as defined in <xref target="RFC8006"/> section 4.2.7, and MAY be applied to to client requests by including it under the MI.ClientAuthMetadata.delivery-auth property.</t>
  <t>Property: version  </t>
  <ul>
    <li>
      <t>Description: Specifies the version of the CAT token. dCDN must reject a token for an unsupported version number. A rejected token results in the client response being defined by the ‘verification-action' property.</t>
    </li>
    <li>
      <t>Type: Unsigned Integer. A value greater than 0</t>
    </li>
    <li>
      <t>Mandatory-to-Specify: No. The default value is 1</t>
    </li>
  </ul>
  <t>Property: token-object-name </t>
  <ul>
    <li>
      <t>Description: Specifies the name of the token object of type MI.CATTokenObject that captures the results of the token verification. The verification result is available for inspection in all processing stages <xref target="I-D.goldstein-processing-stages-metadata"/></t>
    </li>
    <li>
      <t>Type: string</t>
    </li>
    <li>
      <t>Mandatory-to-Specify: No</t>
    </li>
  </ul>
  <t>Property: tokens</t>
  <ul>
    <li>
      <t>Description: Specifies the location in the client request where one or more tokens are present and read for evaluation. When multiple tokens are present, the tokens are read and processed per section 4.4 of <xref target="CTA-5007-B"/></t>
    </li>
    <li>
      <t>Type: Array of MI.CATTokenLocator objects</t>
    </li>
    <li>
      <t>Mandatory-to-Specify: Yes</t>
    </li>
  </ul>
  <t>Property: configuration</t>
  <ul>
    <li>
      <t>Description: Specifies the configuration parameters needed to verify a token.</t>
    </li>
    <li>
      <t>Type: MI.CATTokenConfiguration object</t>
    </li>
    <li>
      <t>Mandatory-to-Specify: Yes</t>
    </li>
  </ul>
  <t>Property: verification-action</t>
  <ul>
    <li>
      <t>Description: Specifies how an invalid token OR a valid but rejected token defines the response returned to the client.</t>
    </li>
    <li>
      <t>Type: MI.CATTokenVerificationAction object</t>
    </li>
    <li>
      <t>Mandatory-to-Specify: Yes</t>
    </li>
  </ul>
  <section anchor="h.itqtg5yxy6vm">
    <name>MI.CATTokenLocator</name>
    <t>The MI.CATTokenLocator object defines the location to read one or more tokens from the client request.</t>
    <t>Property: location</t>
    <ul>
      <li>
        <t>Description: Specifies the location name to find one or more tokens in the client request. Valid location names are:</t>
        <ul>
          <li>
            <t>"authorization-header" for the Authorization request header, in a recognised and configured scheme format.</t>
          </li>
          <li>
            <t>"http-header" for any other HTTP Header locations.</t>
            <ul>
              <li>
                <t>"path-style-parameter" per <xref target="RFC6570"/>, section 3.2.7.</t>
              </li>
              <li>
                <t>"form-style-parameter" per <xref target="RFC6570"/>, section 3.2.8 and <xref target="RFC6570"/>, section 3.2.9</t>
              </li>
              <li>
                <t>"cookie" for HTTP Cookies</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Type: String</t>
          </li>
          <li>
            <t>Mandatory-to-Specify: Yes</t>
          </li>
        </ul>
      </li>
    </ul>
    <t>Property: scheme</t>
    <ul>
      <li>
        <t>Description: The scheme for the Authorization request header that contains the CAT token</t>
      </li>
      <li>
        <t>Type: String</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes, only  if the location property is authorization-header. Otherwise, his property is ignored.</t>
      </li>
    </ul>
    <t>Property: name</t>
    <ul>
      <li>
        <t>Description: The names of the url-path-style parameter, query parameter, HTTP Header Field or HTTP cookies that contain one or more CAT tokens.</t>
      </li>
      <li>
        <t>Type: String</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes, only  if the location property is either ‘path-style-parameter', ‘form-style-parameter', ‘cookie' or ‘http-header' and not using the default "CTA-Common-Access-Token" header field name. Otherwise, his property is ignored.</t>
      </li>
    </ul>
  </section>
  <section anchor="h.ea8o3iwwmb5d">
    <name>MI.CATTokenConfiguration</name>
    <t>The MI.TokenConfiguration object defines the configuration parameters for verifying a CAT token.</t>
    <t>Property: integrity-algo</t>
    <ul>
      <li>
        <t>Description: The hashing / signing algorithm used for integrity protection of the CAT token. The minimum set of values to support are "hs256" (HMAC 256/256) (kty number 5, [RFC 9053], Section 3.1), "ps256" (kty number -37, <xref target="RFC9053"/>, section 3.1) and "es256" (kty number -7, <xref target="RFC9053"/>, section 2.1)</t>
      </li>
      <li>
        <t>Type: String</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes</t>
      </li>
    </ul>
    <t>Property: integrity-algo-key</t>
    <ul>
      <li>
        <t>Description: The value of the key used for integrity protection of the CAT token.</t>
      </li>
      <li>
        <t>Type: MI.SecretValue object that can either contain the hex version of the key in the clear (not recommended) or as a reference in an external key store. See the Protected Secrets Metadata standard <xref target="I-D.ietf-cdni-protected-secrets-metadata"/> for more details.</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes.</t>
      </li>
    </ul>
    <t>Property: encryption-algo</t>
    <ul>
      <li>
        <t>Description: The algorithm used for encryption via the COSE standard (Ref. <xref target="RFC9052"/>) of the entire CAT token. The minimum value to support is "ecdh-ss+a128kw" (see <xref target="RFC9053"/>, section 6.4.1).</t>
      </li>
      <li>
        <t>Type: String</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes - IF using COSE Encrypted CAT tokens.</t>
      </li>
    </ul>
    <t>Property: encryption-algo-key</t>
    <ul>
      <li>
        <t>Description: The value of the key used for encryption of the CAT Token via the COSE standard.</t>
      </li>
      <li>
        <t>Type: MI.SecretValue object that can either contain the hex version of the key in the clear (not recommended) or as a reference in an external key store. See the Protected Secrets Metadata standard <xref target="I-D.ietf-cdni-protected-secrets-metadata"/> for more details.</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes - IF using COSE Encrypted CAT tokens.</t>
      </li>
    </ul>
  </section>
  <section anchor="h.ls0nkgb6riz7">
    <name>MI.CATTokenVerificationAction</name>
    <t>The MI.CATTokenVerificationAction object defines how a client response is created for an invalid OR missing OR valid but rejected token, potentially overriding any actions that may be defined by claims within the token.</t>
    <t>Property: rejected-token-action</t>
    <ul>
      <li>
        <t>Description: An enumeration of ways in which a client response is created. Valid values are:</t>
        <ul>
          <li>
            <t>"fail" for returning a standard HTTP 403 response.</t>
          </li>
          <li>
            <t>"allow" for ignoring the result of token validation, as if the token was not present. This typically would result in serving a HTTP 200 for the requested resource.</t>
          </li>
          <li>
            <t>"token-defined" for constructing the client response per the parameters defined within the token. For a valid but rejected CAT token, the ‘catif' claim is used to construct the client response.</t>
          </li>
        </ul>
      </li>
      <li>
        <t>Type: String</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes</t>
      </li>
    </ul>
    <t>Property: token-defined-response</t>
    <ul>
      <li>
        <t>Description: Specifies how the token values are used to create the client response for an invalid OR valid but rejected token. This property gets used when the value of ‘rejected-token-action' property is ‘token-defined'. Use of this property for any other value of ‘rejected-token-action' is an invalid configuration.</t>
      </li>
      <li>
        <t>Type: MI.CATTokenDefinedResponse object</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes, if ‘rejected-token-action' property is ‘token-defined'</t>
      </li>
    </ul>
  </section>
  <section anchor="h.byv8frkphv0c">
    <name>MI.CATTokenDefinedResponse</name>
    <t>The MI.CATTokenDefinedResponse object defines how a client response is constructed using the token's available ‘catif' claim or some fallback.</t>
    <t>Property: fallback-response</t>
    <ul>
      <li>
        <t>Description: An enumeration defining a fallback response when the token defined values are inapplicable. Valid values are:</t>
        <ul>
          <li>
            <t>"fail" for returning a HTTP 403 response.</t>
          </li>
          <li>
            <t>"allow" for ignoring the result of token validation, as if it was not present.</t>
            <ul>
              <li>
                <t>A missing token.</t>
              </li>
              <li>
                <t>An invalid CAT token.</t>
              </li>
              <li>
                <t>A valid but rejected CAT token with:</t>
              </li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
    <t>For CAT, this fallback-response will get used under the following conditions:</t>
    <ul>
      <li>
        <t>Type: String</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: No. Default value is ‘fail'.</t>
      </li>
    </ul>
    <t>Property: catif</t>
    <ul>
      <li>
        <t>Description: Specifies the configuration for processing the ‘catif' claim to construct the client response for a valid but rejected CAT token.</t>
      </li>
      <li>
        <t>Type: MI.CATIF object</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes, when the rejected-token-action property for the MI.CATTokenVerificationAction object is set to ‘token-defined'</t>
      </li>
    </ul>
  </section>
  <section anchor="h.c3g3y4u6pxyn">
    <name>MI.CATIF</name>
    <t>The  MI.CATIF object specifies the processing of the ‘catif' claim to construct the client response for a valid but rejected CAT token. See Section 4.9.1 of <xref target="CTA-5007-B"/></t>
    <t>Property: response-header-names-force-add</t>
    <ul>
      <li>
        <t>Description: For specific named headers of a rejected claim within the ‘catif' claim, these will be added to the client response, even if headers with same names were already going to be added to the response via other means.</t>
      </li>
      <li>
        <t>Type: Array of Strings</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: No. If not specified, header names of a rejected claim within ‘catif' claim will be skipped in the client response if similarly named headers were to be added via other means.</t>
      </li>
    </ul>
  </section>
  <section anchor="h.z01jiwj04i84">
    <name>MI.CATTokenObject</name>
    <t>The MI.CATTokenObject object defines a read-only object that captures the results of the token verification. The verification result is available for inspection in all processing stages <xref target="I-D.goldstein-processing-stages-metadata"/></t>
    <t>Property: status</t>
    <ul>
      <li>
        <t>Description: Captures the verification status of the CAT token via the following string values:</t>
        <ul>
          <li>
            <t>‘success'</t>
          </li>
          <li>
            <t>‘failure'</t>
          </li>
        </ul>
      </li>
      <li>
        <t>Type: String</t>
      </li>
    </ul>
    <t>Property: token</t>
    <ul>
      <li>
        <t>Description: The string literal of the token in the request.</t>
      </li>
      <li>
        <t>Type: String</t>
      </li>
    </ul>
    <t>Property: status_details</t>
    <ul>
      <li>
        <t>Description: Specifies details about the token verification result when the token verification ‘status' is ‘failure', else it is an empty string. This string contains one of the following values:</t>
        <ul>
          <li>
            <t>Empty string for a missing token.</t>
          </li>
          <li>
            <t>"Invalid CAT" when a token cannot be parsed, per <xref target="RFC8392"/>, Section 7.2</t>
          </li>
          <li>
            <t>"Invalid Claims: &lt;list of claim names that caused the CAT token to be rejected&gt;"</t>
          </li>
          <li>
            <t>Invalid Signature</t>
          </li>
        </ul>
      </li>
      <li>
        <t>Type: String</t>
      </li>
    </ul>
    <t>The following example shows use of the CAT scheme as the authentication mechanism for client requests at the dCDN. Some notable points are:</t>
    <figure>
      <sourcecode><![CDATA[[
  {
    "generic-metadata-type": "MI.CATAuth",
    "generic-metadata-value": {
      "version": "1",
      "token-object-name" : "CATAuthResult",
      "tokens": [
        {
          "location": "form-style-parameter",
          "name": "catv1"
        },
        {
          "location": "authorization-header",
          "scheme": "bearer"
        },
        {
          "location": "path-style-parameter",
          "name": "catv1"
        },
        {
           "location": "cookie",
           "name": "catv1"
        },
      ],
      "configuration": {
        "integrity-algo": "hs256",
        "integrity-algo-key": {
          "secret-store-id": "cat-key-vault",
          "secret-path": "/client-auth/cat/keys/integrity/examplevideoprovider"
        },
        "encryption-algo": "ecdh-ss+a128kw",
        "encryption-algo-key": {
          "secret-store-id": "cat-key-vault",
          "secret-path": "/client-auth/cat/keys/enc/examplevideoprovider"
        }
      },
      "verification-action": {
        "rejected-token-action": "token-defined",
        "token-defined-response": {
          "fallback-response": "fail",
          "catif": {
            "response-header-names-force-add": [
              "x-cat-reason",
              "x-uCDN-name"
            ]
          }
        }
      },
    },
  }
 
  {
    "generic-metadata-type": "MI.ProcessingStages",
    "generic-metadata-value": {
      "client-response": [
        {
          "match": "var.CATAuthResult and var.CATAuthResult.status == 'failure'",
          "stage-metadata": {
            "response-transform": {
              "header-transform": {
                "add": [
                  {
                    "name": "x-cat-auth-debug",
                    "value": "'Invalid token' . var.CATAuthResult.token . 'failed verification. Error:' . var.CATAuthResult.status_details",
                    "value-is-expression": true
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
]]]></sourcecode>
    </figure>
  </section>
</section><section anchor="Security" title="Security Considerations">
            <t>
            The FCI and MI objects defined in this document are transferred via the interfaces defined in CDNI <xref target="RFC8006"/> which describes how to secure these interfaces by protecting integrity and confidentiality while ensuring the authenticity of the dCDN and uCDN.
            </t>
        </section><section anchor="h.6ne5is9rymvp">
  <name>Iana Considerations</name>
  <section anchor="h.lyhyxbibjae4">
    <name>CDNI Payload Types</name>
    <t>This document requests the registration of the following entries under the "CDNI Payload Types" registry hosted by IANA:</t>
    <table>
      <thead>
        <tr>
          <th>Payload Type</th>
          <th>Specification</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>MI.LocationACLExtended</td>
          <td>RFCthis</td>
        </tr>
        <tr>
          <td>MI.LocationRuleExtended</td>
          <td>RFCthis</td>
        </tr>
        <tr>
          <td>MI.TimeWindowACLExtended</td>
          <td>RFCthis</td>
        </tr>
        <tr>
          <td>MI.TimeWindowRuleExtended</td>
          <td>RFCthis</td>
        </tr>
        <tr>
          <td>MI.CertificateMetadata</td>
          <td>RFCthis</td>
        </tr>
        <tr>
          <td>MI.EncryptionLevelMetadata</td>
          <td>RFCthis</td>
        </tr>
        <tr>
          <td>MI.CertificateCredentialsMetadata</td>
          <td>RFCthis</td>
        </tr>
        <tr>
          <td>MI.ClientAuthMetadata</td>
          <td>RFCthis</td>
        </tr>
        <tr>
          <td>MI.CATAuth</td>
          <td>RFCthis</td>
        </tr>
        <tr>
          <td>MI.CATTokenLocator</td>
          <td>RFCthis</td>
        </tr>
        <tr>
          <td>MI.CATTokenConfiguration</td>
          <td>RFCthis</td>
        </tr>
        <tr>
          <td>MI.CATTokenVerificationAction</td>
          <td>RFCthis</td>
        </tr>
        <tr>
          <td>MI.CATTokenDefinedResponse</td>
          <td>RFCthis</td>
        </tr>
        <tr>
          <td>MI.CATIF</td>
          <td>RFCthis</td>
        </tr>
        <tr>
          <td>MI.CATTokenObject</td>
          <td>RFCthis</td>
        </tr>
      </tbody>
    </table>
  </section>
  <section anchor="h.drlw26adn33l">
    <name>"CDNI Metadata Protocol Types" Registry</name>
    <t>The Internet Assigned Numbers Authority (IANA) "CDNI Metadata Protocol Types" registry in the "Content Delivery Network Interconnection Parameters" registry group defines the valid Protocol object values used by the ProtocolACL object defined in <xref target="RFC8006"/> </t>
    <t>The following table defines the new protocol values needed for the ProtocolACL object defined in <xref target="RFC8006"/> such that CDN delivery restrictions can be configured for these protocols.</t>
    <table>
      <thead>
        <tr>
          <th>Protocol Type</th>
          <th>Description</th>
          <th>Type Specification</th>
          <th>Protocol Specification</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>http/2</td>
          <td>Hypertext Transfer Protocol Version 2 (unencrypted) </td>
          <td>RFCthis</td>
          <td><xref target="RFC9113"/></td>
        </tr>
        <tr>
          <td>https/2</td>
          <td>Hypertext Transfer Protocol Version 2 (encrypted) </td>
          <td>RFCthis</td>
          <td><xref target="RFC9113"/></td>
        </tr>
        <tr>
          <td>h2</td>
          <td>Hypertext Transfer Protocol Version 2, alternate name</td>
          <td>RFCthis</td>
          <td><xref target="RFC9113"/></td>
        </tr>
        <tr>
          <td>https/3</td>
          <td>Hypertext Transfer Protocol Version 3</td>
          <td>RFCthis</td>
          <td><xref target="RFC9114"/></td>
        </tr>
        <tr>
          <td>h3</td>
          <td>Hypertext Transfer Protocol Version 3, alternate name</td>
          <td>RFCthis</td>
          <td><xref target="RFC9114"/></td>
        </tr>
      </tbody>
    </table>
  </section>
</section><section anchor="Acknowledgements" title="Acknowledgements">
            <t>
                The authors would like to express their gratitude to the members of the Streaming Video Technology Alliance <xref target="SVTA"/> Open Caching Working Group for their contributions and guidance.
            </t>
            <t>Particulary the following people contribute in one or other way to the content of this draft:</t>  
                <ul>
                    <li>Guillaume Bichot - Broadpeak</li>
                    <li>Christoph Neumann - Broadpeak</li>
                    <li>Chris Lemmons - Comcast</li>
                    <li>Rajeev RK - picoNETS</li>
                    <li>Shmuel Asafi - Qwilt</li>
                    <li>Yoav Gressel - Qwilt</li>
                    <li>Nir Sopher - Qwilt</li>
                    <li>Alfonso Siloniz - Telefonica</li>
                    <li>Ben Rosenblum - Vecima</li>
                </ul>
        </section>
   </middle>
   <back>
      <references title="Normative References">
         <reference anchor="CTA-5007-B" target="https://shop.cta.tech/collections/standards/products/cta-5007-B">
            <front>
               <title>Web Application Video Ecosystem - Common Access Token (CTA-5007-B)</title>
               <author><organization>CTA</organization></author>
               <date />
            </front>
         </reference>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5289.xml"/>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6066.xml"/>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6570.xml"/>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7736.xml"/>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8006.xml"/>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8392.xml"/>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9052.xml"/>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9053.xml"/>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9113.xml"/>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9114.xml"/>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-cdni-protected-secrets-metadata.xml"/>
      </references>
      <references title="Informative References">
         
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9538.xml"/>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9677.xml"/>

         <reference anchor="SVTA" target="https://www.svta.org">
            <front>
               <title>Streaming Video Technology Alliance Home Page</title>
               <author><organization>SVTA</organization></author>
               <date />
            </front>
         </reference>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.goldstein-processing-stages-metadata.xml"/>
       </references>
   </back>
</rfc>
