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


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

]>


<rfc ipr="trust200902" docName="draft-tulshibagwale-oauth-transaction-tokens-02" category="info" submissionType="IETF" xml:lang="en">
  <front>
    <title abbrev="Txn-Tokens">Transaction Tokens</title>

    <author initials="A." surname="Tulshibagwale" fullname="Atul Tulshibagwale">
      <organization>SGNL</organization>
      <address>
        <email>atul@sgnl.ai</email>
      </address>
    </author>
    <author initials="G." surname="Fletcher" fullname="George Fletcher">
      <organization>Capital One</organization>
      <address>
        <email>george.fletcher@capitalone.com</email>
      </address>
    </author>
    <author initials="P." surname="Kasselman" fullname="Pieter Kasselman">
      <organization>Microsoft</organization>
      <address>
        <email>pieter.kasselman@microsoft.com</email>
      </address>
    </author>

    <date year="2023" month="August" day="04"/>

    <area>sec</area>
    <workgroup>oauth</workgroup>
    <keyword>Microservices</keyword> <keyword>OAuth</keyword> <keyword>JWT</keyword> <keyword>token exchange</keyword>

    <abstract>


<?line 101?>

<t>Transaction Tokens (Txn-Tokens) enable workloads in a trusted domain to ensure that user identity and authorization context of an external programmatic request, such as an API invocation, is preserved and available to all workloads that are invoked as part of processing such a request. Txn-Tokens also enable workloads within the trusted domain to optionally immutably assert to downstream workloads that they were invoked in the call chain of the request.</t>



    </abstract>



  </front>

  <middle>


<?line 105?>

<section anchor="introduction"><name>Introduction</name>

<t>Modern computing architectures often use multiple independently running components called workloads. In many cases, external invocations through externally visible interfaces such as APIs result in a number of internal workloads being invoked in order to process the external invocation. These workloads often run in virtually or physically isolated networks. These networks and the workloads running within their perimeter may be compromised by attackers through software supply chain, privileged user compromise or other attacks. Workloads compromised through external attacks, malicious insiders or software errors can cause any or all of the following unauthorized actions:</t>

<t><list style="symbols">
  <t>Invocations of workloads in the network without any external invocation being present</t>
  <t>Arbitrary user impersonation</t>
  <t>Parameter modification or augmentation</t>
</list></t>

<t>The results of these actions are unauthorised access to resources.</t>

</section>
<section anchor="overview"><name>Overview</name>
<t>Transaction Tokens (Txn-Token) are a means to mitigate damage from such attacks or spurious invocations. A valid Txn-Token indicates a valid external invocation.
They ensure that the identity of the user or a workload that made the external request is preserved throughout subsequent workload invocations.
They preserve any context such as:</t>

<t><list style="symbols">
  <t>Parameters of the original call</t>
  <t>Environmental factors, such as IP address of the original caller</t>
  <t>Any computed context that needs to be preserved in the call chain. This includes information that was not in the original request to the external endpoint.</t>
</list></t>

<t>Cryptographically protected Txn-Token ensure that downstream workloads cannot make unauthorized modifications to such information, and cannot make spurious calls without the presence of an external trigger.</t>

<section anchor="what-are-transaction-tokens"><name>What are Transaction Tokens?</name>
<t>Txn-Tokens are short-lived, signed JWTs <xref target="RFC7519"/> that assert the identity of a user or a workload and assert an authorization context. The authorization context provides information expected to remain constant during the execution of a call as it passes through multiple workloads.</t>

<t>When necessary, a Txn-Token may include embedded tokens, as described in <xref target="JWTEmbeddedTokens"/>. This is called Nested Txn-Token. This nesting enables workloads in a call chain to assert their invocation during the call chain to downstream workloads.</t>

</section>
<section anchor="creating-txn-tokens"><name>Creating Txn-Tokens</name>

<section anchor="leaf-txn-tokens"><name>Leaf Txn-Tokens</name>
<t>Txn-Tokens are typically created when a workload is invoked using an endpoint that is externally visible, and is authorized using a separate mechanism, such as an OAuth <xref target="RFC6749"/> token or an OpenID Connect <xref target="OpenIdConnect"/> token. We call this token "Leaf Txn-Token". This workload then performs an OAuth 2.0 Token Exchange <xref target="RFC8693"/> to obtain a Txn-Token. To do this, it invokes a special Token Service (the Txn-Token Service) and provides context that is sufficient for it to generate a Txn-Token. This context MAY include:</t>

<t><list style="symbols">
  <t>The external authorization token (e.g. the OAuth access token)</t>
  <t>A previously created Txn-Token (leaf or nested)</t>
  <t>Parameters that are required to be bound for the duration of this call</t>
  <t>Additional context, such as the incoming IP address, User Agent information, or other context that can help the Txn-Token Service to issue the Txn-Token</t>
</list></t>

<t>The Txn-Token Service responds to a successful invocation by generating a Txn-Token. The calling workload then uses the Txn-Token to authorize its calls to subsequent workloads. Subsequent workloads may obtain Txn-Tokens of their own.</t>

</section>
<section anchor="nested-txn-tokens"><name>Nested Txn-Tokens</name>
<t>A workload within the call chain of such an external call MAY generate a new Nested Txn-Token. To generate the Nested Txn-Token, it creates a self-signed JWT Embedded Token <xref target="JWTEmbeddedTokens"/> that includes the received Txn-Token by value. Subsequent workloads can therefore know that the signing workload was in the path of the call chain.</t>

</section>
</section>
<section anchor="txn-token-lifetime"><name>Txn-Token Lifetime</name>
<t>Txn-Tokens are expected to be short-lived (order of minutes, e.g. 5 minutes), and as a result MAY be used only for the expected duration of an external invocation. If a long-running process such as an batch or offline task is involved, it can use a separate mechanism to perform the external invocation, but the resulting Txn-Token SHALL still be short-lived.</t>

</section>
<section anchor="benefits-of-txn-tokens"><name>Benefits of Txn-Tokens</name>
<t>Txn-Tokens help prevent spurious invocations by ensuring that a workload receiving an invocation can independently verify the user or workload on whose behalf an external call was made and any context relevant to the processing of the call. Through the presence of additional signatures on the Txn-Token, a workload receiving an invocation can also independently verify that specific workloads were within the path of the call before it was invoked.</t>

</section>
<section anchor="txn-token-issuance-and-usage-flows"><name>Txn-Token Issuance and Usage Flows</name>

<section anchor="basic-flow"><name>Basic Flow</name>
<t><xref target="fig-arch-basic"/> shows the basic flow of how Txn-Tokens are used in an a multi-workload environment.</t>

<figure title="Basic Transaction Tokens Architecture" anchor="fig-arch-basic"><artwork type="ascii-art"><![CDATA[
                                                     
     1    ┌──────────────┐    2      ┌──────────────┐
─────────▶│              ├───────────▶              │
          │   External   │           │  Txn-Token   │
     7    │   Endpoint   │    3      │   Service    │
◀─────────┤              ◀───────────│              │
          └────┬───▲─────┘           └──────────────┘
               │   │                                 
             4 │   │ 6                               
          ┌────▼───┴─────┐                           
          │              │                           
          │   Internal   │                           
          │   µservice   │                           
          │              │                           
          └────┬───▲─────┘                           
               │   │                                 
               ▼   │                                 
                 o                                   
             5   o    6                              
                 o                                   
               │   ▲                                 
               │   │                                 
          ┌────▼───┴─────┐                           
          │              │                           
          │   Internal   │                           
          │   µservice   │                           
          │              │                           
          └──────────────┘                           
]]></artwork></figure>

<t><list style="numbers">
  <t>External endpoint is invoked using conventional authorization scheme such as access token</t>
  <t>External endpoint provides context and incoming authorization (e.g. access token) to the Txn-Token Service</t>
  <t>Txn-Token Service mints a Txn-Token that provides immutable context for the transaction and returns it to the requester</t>
  <t>The external endpoint initiates a call to an internal microservice and provides the Txn-Token as authorization</t>
  <t>Subsequent calls to other internal microservices use the same Txn-Token to authorize calls</t>
  <t>Responses are provided to callers based on successful authorization by the invoked microservices.</t>
  <t>External client is provided a response to the external invocation</t>
</list></t>

</section>
<section anchor="nested-txn-token-flow"><name>Nested Txn-Token Flow</name>

<t><xref target="fig-arch-nested"/> shows an internal microservice generating a Nested Txn-Token in the flow</t>

<figure title="Flow with Nested Txn-Token generating service" anchor="fig-arch-nested"><artwork type="ascii-art"><![CDATA[
                                                     
     1    ┌──────────────┐    2      ┌──────────────┐
─────────▶│              ├───────────▶              │
          │   External   │           │  Txn-Token   │
     9    │   Endpoint   │    3      │   Service    │
◀─────────┤              ◀───────────│              │
          └────┬───▲─────┘           └──────────────┘
               │   │                                 
             4 │   │ 8                               
          ┌────▼───┴─────┐                           
          │              │                           
          │   Internal   │                           
          │   µservice   │                           
          │              │                           
          └────┬───▲─────┘                           
               │   │                                 
               ▼   │                                 
                 o                                   
             5   o    8                              
               │ o ▲                                 
               │   │                                 
               │   │                                 
          ╔════▼═══╩═════╗                           
          ║              ╠──────┐                    
          ║   Internal   ║      │ 6                  
          ║   µservice   ║      │                    
          ║              ◀──────┘                    
          ╚════╦═══▲═════╝                           
               │   │                                 
               ▼   │                                 
                 o                                   
             7   o    8                              
                 o                                   
               │   ▲                                 
               │   │                                 
          ┌────▼───┴─────┐                           
          │              │                           
          │   Internal   │                           
          │   µservice   │                           
          │              │                           
          └──────────────┘                                              
]]></artwork></figure>

<t>In the diagram above, steps 1-5 are the same as in <xref target="basic-flow"/>.</t>

<t><list style="numbers" start="6">
  <t>An internal microservice determines it needs to generate a Nested Txn-Token. It uses its own private key to generate a Nested Txn-Token.</t>
  <t>The internal microservice uses the Nested Txn-Token to authorize calls to downstream services</t>
  <t>Responses are provided to callers based on successful authorization by the invoked microservices.</t>
  <t>External client is provided a response to the external invocation</t>
</list></t>

</section>
<section anchor="replacement-txn-token-flow"><name>Replacement Txn-Token Flow</name>

<t>An intermediate service may decide to obtain a replacement Txn-Token from the Txn-Token service. That flow is described below in <xref target="fig-arch-replacement"/></t>

<figure title="Replacement Txn-Token Flow" anchor="fig-arch-replacement"><artwork type="ascii-art"><![CDATA[
                                                     
     1    ┌──────────────┐    2      ┌──────────────┐
─────────▶│              ├───────────▶              │
          │   External   │           │              │
     10   │   Endpoint   │    3      │              │
◀─────────┤              ◀───────────│              │
          └────┬───▲─────┘           │              │
               │   │                 │              │
             4 │   │ 9               │              │
          ┌────▼───┴─────┐           │              │
          │              │           │              │
          │   Internal   │           │              │
          │   µservice   │           │              │
          │              │           │              │
          └────┬───▲─────┘           │  Txn-Token   │
               │   │                 │   Service    │
               ▼   │                 │              │
                 o                   │              │
             5   o    9              │              │
               │ o ▲                 │              │
               │   │                 │              │
               │   │                 │              │
          ┌────▼───┴─────┐    6      │              │
          │              ├───────────▶              │
          │   Internal   │           │              │
          │   µservice   │    7      │              │
          │              ◀───────────│              │
          └────┬───▲─────┘           │              │
               │   │                 │              │
               ▼   │                 └──────────────┘
                 o                                   
             8   o    9                              
                 o                                   
               │   ▲                                 
               │   │                                 
          ┌────▼───┴─────┐                           
          │              │                           
          │   Internal   │                           
          │   µservice   │                           
          │              │                           
          └──────────────┘                           
]]></artwork></figure>

<t>In the diagram above, steps 1-5 are the same as in <xref target="basic-flow"/></t>

<t><list style="numbers" start="6">
  <t>An intermediate service determines that it needs to obtain a Replacement Txn-Token. It requests a Replacement Txn-Token from the Txn-Token Service. It passes the incoming Txn-Token in the request, along with any additional context it needs to send the Txn-Token Service.</t>
  <t>The Txn-Token Service responds with a replacement Txn-Token</t>
  <t>The service that requested the Replacement Txn-Token uses that Txn-Token for downstream call authorization</t>
  <t>Responses are provided to callers based on successful authorization by the invoked microservices.</t>
  <t>External client is provided a response to the external invocation</t>
</list></t>

</section>
</section>
</section>
<section anchor="notational-conventions"><name>Notational Conventions</name>

<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 anchor="terminology"><name>Terminology</name>

<dl>
  <dt>Workload:</dt>
  <dd>
    <t>An independent computational unit that can autonomously receive and process invocations, and can generate invocations of other workloads. Examples of workloads include containerized microservices, monolithic services and infrastructure services such as managed databases.</t>
  </dd>
  <dt>Trust Domain:</dt>
  <dd>
    <t>A virtually or physically separated network, which contains two or more workloads. The workloads within an Trust Domain may be invoked only through published interfaces. A Trust Domain must have a name that is used as the <spanx style="verb">aud</spanx> (audience) value in Txn-Tokens.</t>
  </dd>
  <dt>External Endpoint:</dt>
  <dd>
    <t>A published interface to an Trust Domain that results in the invocation of a workload within the Trust Domain.</t>
  </dd>
  <dt>Call Chain:</dt>
  <dd>
    <t>A sequence of invocations that results from the invocation of an external endpoint.</t>
  </dd>
  <dt>Transaction Token (Txn-Token):</dt>
  <dd>
    <t>A signed JWT that has a short lifetime, which provides immutable information about the user or workload, certain parameters of the call and certain contextual attributes of the call. A Txn-Token may contain a nested Txn-Token.</t>
  </dd>
  <dt>Leaf Txn-Token:</dt>
  <dd>
    <t>A Txn-Token that does not contain a <spanx style="verb">txn_token</spanx> claim in its JWT body.</t>
  </dd>
  <dt>Nested Txn-Token:</dt>
  <dd>
    <t>A JWT Embedded Token <xref target="JWTEmbeddedTokens"/> that embeds a Txn-Token by value.</t>
  </dd>
  <dt>Authorization Context:</dt>
  <dd>
    <t>A JSON object containing a set of claims that represent the immutable context of a call chain.</t>
  </dd>
  <dt>Transaction Token Service (Txn-Token Service):</dt>
  <dd>
    <t>A special service within the Trust Domain, which issues Txn-Tokens to requesting workloads.</t>
  </dd>
</dl>

</section>
<section anchor="txn-token-format"><name>Txn-Token Format</name>
<t>A Txn-Token is a JSON Web Token <xref target="RFC7519"/> protected by a JSON Web Signature <xref target="RFC7515"/>. The following is true in a Txn-Token:</t>

<section anchor="txn-token-header"><name>JWT Header</name>
<t>In the JWT Header:</t>

<t><list style="symbols">
  <t>The <spanx style="verb">typ</spanx> claim MUST be present and MUST have the value <spanx style="verb">txn_token</spanx>.</t>
  <t>Key rotation of the signing key SHOULD be supported through the use of a <spanx style="verb">kid</spanx> claim.</t>
</list></t>

<t><xref target="figtxtokenheader"/> is a non-normative example of the JWT Header of a Txn-Token</t>

<figure title="Example: Txn-Token Header" anchor="figtxtokenheader"><sourcecode type="json"><![CDATA[
{
    "typ": "txn_token",
    "alg": "RS256",
    "kid": "identifier-to-key"
}
]]></sourcecode></figure>

</section>
<section anchor="txn-token-body"><name>JWT Body</name>

<section anchor="common-claims"><name>Common Claims</name>
<t>The JWT body MUST have the following claims regardless of whether the Txn-Token is a Leaf Txn-Token or a Nested Txn-Token:</t>

<t><list style="symbols">
  <t>An <spanx style="verb">iss</spanx> claim, whose value is a URN <xref target="RFC8141"/> that uniquely identifies the workload or the Txn-Token Service that created the Txn-Token.</t>
  <t>An <spanx style="verb">iat</spanx> claim, whose value is the time at which the Txn-Token was created.</t>
  <t>An <spanx style="verb">exp</spanx> claim, whose value is the time at which the Txn-Token expires. Note that if this claim is in a Nested Txn-Token, then this <spanx style="verb">exp</spanx> value MUST NOT exceed the <spanx style="verb">exp</spanx> value of the Txn-Token included in the JWT Body.</t>
</list></t>

</section>
<section anchor="leaf-txn-token-claims"><name>Leaf Txn-Token Claims</name>
<t>The following claims MUST be present in the JWT body of a Leaf Txn-Token:</t>

<t><list style="symbols">
  <t>A <spanx style="verb">tid</spanx> claim, whose value is the unique identifier of entire call chain.</t>
  <t>A <spanx style="verb">sub_id</spanx> claim, whose value is the unique identifier of the user or workload on whose behalf the call chain is being executed. The format of this claim MAY be a Subject Identifier as specified in <xref target="SubjectIdentifiers"/>.</t>
  <t>An <spanx style="verb">azc</spanx> claim, whose value is a JSON object that contains values that remain constant in the call chain.</t>
</list></t>

<t><xref target="figleaftxtokenbody"/> shows a non-normative example of the JWT body of a Leaf Txn-Token:</t>

<figure title="Example: Leaf Txn-Token Body" anchor="figleaftxtokenbody"><sourcecode type="json"><![CDATA[
{
    "iss": "https://trust-domain.example/txn-token-service",
    "iat": "1686536226000",
    "exp": "1686536526000",
    "tid": "97053963-771d-49cc-a4e3-20aad399c312",
    "sub_id": {
        "format": "email",
        "email": "user@trust-domain.example"
    },
    "azc": {
        "action": "BUY", // parameter of external call
        "ticker": "MSFT", // parameter of external call
        "quantity": "100", // parameter of external call
        "user_ip": "69.151.72.123", // env context of external call
        "user_level": "vip" // computed value not present in external call
    }
}
]]></sourcecode></figure>

</section>
<section anchor="nested-txn-token-claim"><name>Nested Txn-Token Claim</name>
<t>A Nested Txn-Token is a JWT Embedded Token <xref target="JWTEmbeddedTokens"/>, which embeds a Txn-Token by value. The following claims MUST be present in a Nested Txn-Token:</t>

<t><list style="symbols">
  <t>A <spanx style="verb">type</spanx> claim, whose value is <spanx style="verb">urn:ietf:params:oauth:token-type:txn_token</spanx>.</t>
  <t>A <spanx style="verb">token</spanx> claim, whose value is an encoded JWT representation of a Txn-Token.</t>
</list></t>

<t><xref target="fignestedtxtokenbody"/> shows a non-normative example the JWT body of a nested Txn-Token</t>

<figure title="Example: Nested Txn-Token Body" anchor="fignestedtxtokenbody"><sourcecode type="json"><![CDATA[
{
    "iss": "https://trust-domain.example/fraud-detection",
    "iat": "1686536236000",
    "exp": "1686536526000",
    "type": "urn:ietf:params:oauth:token-type:txn_token",
    "token": "eyJ0eXAiOiJ0cmF0Iiwi...thwd8"
}
]]></sourcecode></figure>

</section>
</section>
</section>
<section anchor="requesting-leaf-txn-tokens"><name>Requesting Leaf Txn-Tokens</name>
<t>A workload requests a Txn-Token from a Transaction Token Service using OAuth 2.0 Token Exchange <xref target="RFC8693"/>. The request to obtain a Txn-Token using this method is called a Txn-Token Request, and a success response is called a Txn-Token Response. A Txn-Token Request is a Token Exchange Request, as described in Section 2.1 of <xref target="RFC8693"/> with additional parameters. A Txn-Token Response is a OAuth 2.0 token endpoint response, as described in Section 5 of <xref target="RFC6749"/>, where the <spanx style="verb">token_type</spanx> in the response has the value <spanx style="verb">txn_token</spanx>.</t>

<t>The Transaction Token Service acts as an OAuth 2.0 <xref target="RFC6749"/> Authorization Server. The requesting workload acts as the OAuth 2.0 Client, which authenticates itself to the Transaction Token Service through mechanisms defined in OAuth 2.0.</t>

<section anchor="txn-token-request"><name>Txn-Token Request</name>
<t>A Txn-Token Request is an OAuth 2.0 Token Exchange Request, as described in Section 2.1 of <xref target="RFC8693"/>, with an additional parameter in the request. The following is true of the Txn-Token Request:</t>

<t><list style="symbols">
  <t>The <spanx style="verb">audience</spanx> value MUST be set to the Trust Domain name.</t>
  <t>The <spanx style="verb">requested_token_type</spanx> value MUST be <spanx style="verb">urn:ietf:params:oauth:token-type:txn_token</spanx>.</t>
  <t>The <spanx style="verb">subject_token</spanx> value MUST be the external token received by the workload that authorized the call.</t>
  <t>The <spanx style="verb">subject_token_type</spanx> value MUST be present and indicate the type of the authorization token present in the <spanx style="verb">subject_token</spanx> parameter.</t>
</list></t>

<t>The following additional parameter MUST be present in a Txn-Token Request:</t>

<t><list style="symbols">
  <t>A parameter named <spanx style="verb">azc</spanx> , whose value is a JSON object. This object contains any information the Transaction Token Service needs to understand the context of the incoming request.</t>
</list></t>

<t><xref target="figtxtokenrequest"/> shows a non-normative example of a Txn-Token Request.</t>

<figure title="Example: Txn-Token Request" anchor="figtxtokenrequest"><sourcecode type="http"><![CDATA[
POST /txn-token-service/token_endpoint HTTP 1.1
Host: txn-token-service.trust-domain.example
Content-Type: application/x-www-form-urlencoded

requested_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Atxn_token
&audience=http%3A%2F%2Ftrust-domain.example
&subject_token=eyJhbGciOiJFUzI1NiIsImtpZC...kdXjwhw
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token
&azc=%7B%22param1%22%3A%22value1%22%2C%22param2%22%3A%22value2%22%2C%22ip_address%22%3A%2269.151.72.123%22%7D
]]></sourcecode></figure>

</section>
<section anchor="txn-token-response"><name>Txn-Token Response</name>
<t>A successful response to a Txn-Token Request by a Transaction Token Service is called a Txn-Token Response. If the Transaction Token Service responds with an error, the error response is as described in Section 5.2 of <xref target="RFC6749"/>. The following is true of a Txn-Token Response:</t>

<t><list style="symbols">
  <t>The <spanx style="verb">token_type</spanx> value MUST be set to <spanx style="verb">txn_token</spanx>.</t>
  <t>The <spanx style="verb">access_token</spanx> value MUST be the Txn-Token.</t>
  <t>The response MUST NOT include the values <spanx style="verb">expires_in</spanx>, <spanx style="verb">refresh_token</spanx> and <spanx style="verb">scope</spanx>.</t>
</list></t>

<t><xref target="figtxtokenresponse"/> shows a non-normative example of a Txn-Token Response.</t>

<figure title="Example: Txn-Token Response" anchor="figtxtokenresponse"><sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: non-cache, no-store

{
  "issued_token_type": "urn:ietf:params:oauth:token-type:txn_token",
  "access_token": "eyJCI6IjllciJ9...Qedw6rx"
}
]]></sourcecode></figure>

</section>
<section anchor="creating-replacement-txn-tokens"><name>Creating Replacement Txn-Tokens</name>
<t>A workload within a call chain may request the Transaction Token Server to replace a Txn-Token. Replacement Txn-Tokens are Leaf Txn-Tokens.</t>

<t>Workloads MAY request replacement Txn-Tokens in order to change (add to, remove or modify) the asserted values within a Txn-Token, to remove nesting and / or reduce token bloat.</t>

<section anchor="transaction-token-server-responsibilities"><name>Transaction Token Server Responsibilities</name>
<t>A Transaction Token Server replacing a Txn-Token must consider that modifying previously asserted values from existing Txn-Tokens can completely negate the benefits of Txn-Tokens. When issuing replacement Txn-Tokens, a Transaction Token Server therefore:</t>

<t><list style="symbols">
  <t>MAY enable modifications to asserted values that reduce the scope of permitted actions</t>
  <t>MAY enable reduction of token bloat by removing nesting, and placing workload identifiers as asserted values instead</t>
  <t>MAY enable additional asserted values</t>
  <t>SHOULD NOT enable modification to asserted values that expand the scope of permitted actions</t>
</list></t>

</section>
<section anchor="replacement-txn-token-request"><name>Replacement Txn-Token Request</name>
<t>To request a replacement Txn-Token, the requester makes a Txn-Token Request <xref target="txn-token-request"/> but includes the Txn-Token to be replaced as the value of the <spanx style="verb">subject_token</spanx> parameter.</t>

</section>
<section anchor="replacement-txn-token-response"><name>Replacement Txn-Token Response</name>
<t>A successful response by the Transaction Token Server to a Replacement Txn-Token Request is a Txn-Token Response <xref target="txn-token-response"/></t>

</section>
<section anchor="removing-nesting"><name>Removing Nesting</name>
<t>A Replacement Txn-Token Request MAY include a Nested Txn-Token in its request. If the request is successful, the Transaction Token Server SHALL always respond with a Leaf Txn-Token.</t>

<t>If the Replacement Txn-Token Request has a Nested Txn-Token in the request's <spanx style="verb">subject_token</spanx> parameter, then the Transaction Token Server MAY include information about services that had signed the Nested Txn-Token that is requested to be replaced.</t>

<t>If the Transaction Token Server wishes to include information about any nested Txn-Token signers, then it SHALL include a field named <spanx style="verb">previous_signers</spanx> in the <spanx style="verb">azc</spanx> value of the Txn-Token that it issues. The value of this field MUST be an array of strings. Each string is the the value of the <spanx style="verb">iss</spanx> field of a Nested Txn-Tokens received in the Replacement Txn-Token Request. Note that</t>

<t><list style="symbols">
  <t>A Nested Txn-Token is a recursive structure, and the <spanx style="verb">iss</spanx> value is present at each level of nesting</t>
  <t>The Transaction Token Server MAY choose to include or exclude any <spanx style="verb">iss</spanx> value in the <spanx style="verb">previous_signers</spanx> field of the Txn-Token it generates.</t>
</list></t>

</section>
</section>
</section>
<section anchor="creating-nested-txn-tokens"><name>Creating Nested Txn-Tokens</name>
<t>A workload within a call chain MAY create a Nested Txn-Token. It does so by embedding the Txn-Token it receives by value in a JWT Embedded Token <xref target="JWTEmbeddedTokens"/>. Nested Txn-Tokens are self-signed and not requested from a separate service.</t>

<t>The expiration time of a enclosing Txn-Token MUST NOT exceed the expiration time of an embedded Txn-Token.</t>

</section>
<section anchor="IANA"><name>IANA Considerations</name>

<t>This memo includes no request to IANA.</t>

</section>
<section anchor="Security"><name>Security Considerations</name>

<section anchor="mutual-authentication-of-the-txn-token-request"><name>Mutual Authentication of the Txn-Token Request</name>
<t>A Transaction Token Service MUST ensure that it authenticates any workloads requesting Txn-Tokens. In order to do so:</t>

<t><list style="symbols">
  <t>It MUST name a limited, pre-configured set of workloads that MAY request Txn-Tokens.</t>
  <t>It MUST individually authenticate the requester as being one of the name requesters.</t>
  <t>It SHOULD rely on mechanisms, such as <xref target="Spiffe"/>, to securely authenticate the requester.</t>
  <t>It SHOULD NOT rely on insecure mechanisms, such as long-lived shared secrets to authenticate the requesters.</t>
</list></t>

<t>The requesting workload MUST have a pre-configured location for the Transaction Token Service. It SHOULD rely on mechanisms, such as <xref target="Spiffe"/>, to securely authenticate the Transaction Token Service before making a Txn-Token Request.</t>

</section>
<section anchor="sender-constrained-tokens"><name>Sender Constrained Tokens</name>
<t>Although Txn-Tokens are short-lived, they may be sender constrained as an additional layer of defence to prevent them from being re-used by a compromised or malicious workload under the control of a hostile actor.</t>

</section>
<section anchor="access-tokens"><name>Access Tokens</name>
<t>When creating Txn-Tokens, the Txn-Token MUST NOT contain the Access Token presented to the resource server. If an Access Token is included in a Txn-Token, an attacker may obtain a Txn-Token, extract the Access Token, and replay it to the Resource Server. Txn-Token expiry does not protect against this attack since the Access Token may remain valid even after the Txn-Token has expired.</t>

</section>
</section>


  </middle>

  <back>


    <references title='Normative References'>



<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <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="RFC6749">
  <front>
    <title>The OAuth 2.0 Authorization Framework</title>
    <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
    <date month="October" year="2012"/>
    <abstract>
      <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6749"/>
  <seriesInfo name="DOI" value="10.17487/RFC6749"/>
</reference>

<reference anchor="RFC7519">
  <front>
    <title>JSON Web Token (JWT)</title>
    <author fullname="M. Jones" initials="M." surname="Jones"/>
    <author fullname="J. Bradley" initials="J." surname="Bradley"/>
    <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
    <date month="May" year="2015"/>
    <abstract>
      <t>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7519"/>
  <seriesInfo name="DOI" value="10.17487/RFC7519"/>
</reference>

<reference anchor="RFC7515">
  <front>
    <title>JSON Web Signature (JWS)</title>
    <author fullname="M. Jones" initials="M." surname="Jones"/>
    <author fullname="J. Bradley" initials="J." surname="Bradley"/>
    <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
    <date month="May" year="2015"/>
    <abstract>
      <t>JSON Web Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and an IANA registry defined by that specification. Related encryption capabilities are described in the separate JSON Web Encryption (JWE) specification.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7515"/>
  <seriesInfo name="DOI" value="10.17487/RFC7515"/>
</reference>

<reference anchor="RFC8141">
  <front>
    <title>Uniform Resource Names (URNs)</title>
    <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <date month="April" year="2017"/>
    <abstract>
      <t>A Uniform Resource Name (URN) is a Uniform Resource Identifier (URI) that is assigned under the "urn" URI scheme and a particular URN namespace, with the intent that the URN will be a persistent, location-independent resource identifier. With regard to URN syntax, this document defines the canonical syntax for URNs (in a way that is consistent with URI syntax), specifies methods for determining URN-equivalence, and discusses URI conformance. With regard to URN namespaces, this document specifies a method for defining a URN namespace and associating it with a namespace identifier, and it describes procedures for registering namespace identifiers with the Internet Assigned Numbers Authority (IANA). This document obsoletes both RFCs 2141 and 3406.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8141"/>
  <seriesInfo name="DOI" value="10.17487/RFC8141"/>
</reference>

<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <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="RFC8693">
  <front>
    <title>OAuth 2.0 Token Exchange</title>
    <author fullname="M. Jones" initials="M." surname="Jones"/>
    <author fullname="A. Nadalin" initials="A." surname="Nadalin"/>
    <author fullname="B. Campbell" initials="B." role="editor" surname="Campbell"/>
    <author fullname="J. Bradley" initials="J." surname="Bradley"/>
    <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
    <date month="January" year="2020"/>
    <abstract>
      <t>This specification defines a protocol for an HTTP- and JSON-based Security Token Service (STS) by defining how to request and obtain security tokens from OAuth 2.0 authorization servers, including security tokens employing impersonation and delegation.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8693"/>
  <seriesInfo name="DOI" value="10.17487/RFC8693"/>
</reference>


<reference anchor="OpenIdConnect" target="https://openid.net/specs/openid-connect-core-1_0.html">
  <front>
    <title>OpenID Connect Core 1.0 incorporating errata set 1</title>
    <author initials="N." surname="Sakimura" fullname="Nat Sakimura">
      <organization>NRI</organization>
    </author>
    <author initials="J." surname="Bradley" fullname="John Bradley">
      <organization>Ping Identity</organization>
    </author>
    <author initials="M." surname="Jones" fullname="Mike Jones">
      <organization>Microsoft</organization>
    </author>
    <author initials="B. de" surname="Medeiros" fullname="B. de Medeiros">
      <organization>Google</organization>
    </author>
    <author initials="C." surname="Mortimore" fullname="Chuck Mortimore">
      <organization>Salesforce</organization>
    </author>
    <date year="2014" month="November"/>
  </front>
</reference>
<reference anchor="SubjectIdentifiers" target="https://datatracker.ietf.org/doc/html/draft-ietf-secevent-subject-identifiers">
  <front>
    <title>Subject Identifiers for Security Event Tokens</title>
    <author initials="A." surname="Backman" fullname="Annabelle Backman">
      <organization>Amazon</organization>
    </author>
    <author initials="M." surname="Scurtescu" fullname="Martin Scurtescu">
      <organization>Coinbase</organization>
    </author>
    <author initials="P." surname="Jain" fullname="Prachi Jain">
      <organization>Fastly</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="JWTEmbeddedTokens" target="https://www.ietf.org/archive/id/draft-yusef-oauth-nested-jwt-06.html">
  <front>
    <title>JSON Web Token (JWT) Embedded Tokens</title>
    <author initials="R." surname="Shekh-Yusef" fullname="Rifaat Shekh-Yusef">
      <organization>E&amp;Y</organization>
    </author>
    <author initials="D." surname="Hardt" fullname="Dick Hardt">
      <organization>Hellō</organization>
    </author>
    <author initials="G. D." surname="Marco" fullname="Giuseppe De Marco">
      <organization>Dipartimento per la trasformazione digitale della Presidenza del Consiglio dei Ministri Italy</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>

    <references title='Informative References'>

<reference anchor="Spiffe" target="https://spiffe.io/docs/latest/spiffe-about/overview/">
  <front>
    <title>Secure Production Identity Framework for Everyone</title>
    <author >
      <organization>Cloud Native Computing Foundation</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>


<?line 541?>

<section numbered="false" anchor="Acknowledgements"><name>Acknowledgements</name>

</section>

    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
        <name>Contributors</name>
    <contact initials="E." surname="Gilman" fullname="Evan Gilman">
      <organization>SPIRL</organization>
      <address>
        <email>evan@spirl.com</email>
      </address>
    </contact>
    <contact initials="H." surname="Tschofenig" fullname="Hannes Tschofenig">
      <organization>Arm Ltd.</organization>
      <address>
        <email>Hannes.Tschofenig@arm.com</email>
      </address>
    </contact>
    </section>

  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA+09224kN3bv9RWEBt7MBOrWZWY0lgAj7tHcZM9tJQ28zssM
u4rdTau6qreqWj2yoEWwzwmwAbzeRZAAeQgCBMjTItmnfQqQH/GX5FxIFllV
3br4gmwyxsDqriIPD8+N5xySp3u9XlRWMkveyjTP1J6oirmK9KygT2W1vbm5
u7kdxbLaEzob5eKW2J+o+CQq58OpLkudZ9XZDPodPD5+EslCyT1RqjhajPdE
LufVJIqSPM7kFJokhRxVvWqelhM9lOOFTFWP2vSqQmaljCuA1qvyE5WVPRg0
qnSVQr/j+q04preRHA4LdQqv3mc98yiVGYypsuhksRcJ0RMvdFzkpSpOdaxK
evJqgAjhp8++OKa/NJhQ7+MJ9FbRLZHICkbc3tzeBgzgn+j16JnQpRjpNFUJ
kEEA0vlUVjqWaXomhmfi/TTdLkax0COR5ZUY61NABKeWF3tRD7qUe2LQF8f+
3AEBpssASNJ6lRcwm6OnL5/DZzWVOt0TEtp9Wo6ztC81PLVwn/bFk1RV8UQV
DuRTBf2V/5zg7cuZrmQqXmWqBjumtv2RaftpzI1AGvpxPvUGet0Xn8uyVOlU
Zm6k11pVqghe0FBM/XxU1QPNqGn/xDb9dGrb2IFikKZCD4G6Ndke98VTHQz5
+FRm9TMm1OuDQ49SClp8Ws50kRJkC+oZcKCMJ/lIZXrswD2TWabK8A0BHRRT
8bxK+jVcbtqvm34qiykPkeUFSsSpQuE7fLK/vbW1uwfa8rk6W+RFUvLTnQf3
8KkVRHjy4D61Y4Hk7/fp+xF//3jr3hbCeXP40j54cA8fDKZDPZ7r6gwFMhzl
453du9iEhhHb/U1WG/HYyjmQWohXM5UdJPs5TCmuEGshjMLRm0fCvIK/hRJb
AEVncV7M8gLmmY2FKuCDBG2vxBb3liBHYCcmVTUr9zY2cgCjk36mqo1ypuLS
POjFDBf+Fqq39XazP6mmKUGwGoOfe4Y9L2UljuSJns4LSS8Md14eHgTtPssn
mXhYyCRVZ36714jrQaIymNxZ0OOFPlHQLSPr4Nr7glu3fdgXiRIvVKI0vPXb
P83zMWls3Xh/Mo9PxIu8qPQU5ui3PgLtLkd5EfNTa2627vW2tiJ4dDQffgW0
YXxHWhVlwBnzWnjvBUATRyqeFygLj8HwVNZKdjEFRpRgbuMT0ETQx1Ef0NoA
E72BTNhgE43Pe2DFFQLrlTxmT9djLmXWIMvkUIGZFA9hCFZQN/fBVH6dZyEL
JNAoE0eAfaXKeO433891NpRlSNrXgPpEi8+kDkA/kWWVWrbDH1Cnx9OhShKV
MC0CKn529Oql+EINjVrchtZ3hG2/iniLxaImmiwAk1O1oRNDtrN5qUZmRQOh
qlTS+2pR9TZ3Vgv4oR5JlPGJOpn0vkQY/swe/+zLoPUjDaL1TBZJ5bd6BjT/
778LGj7VAGo2U+KRQjLHud/+kZ4h5afA0VzMwH6nEtZ7iZIJTIKFVolEj3EZ
gA8AWwLhVYkS8LXEB2gbSj1OdQ7fNOhMpkuw3OIAeiAbIvQVPIN4NNOjkQpF
GUVWAdw8mfPabpVUPClgBmDPTki2QaSLszxTnRwpCXBf5yjD5UYK+lRW5mlP
DvN5tZGfog+gFhsdHGBBS/N5gnYGkIWJTWdzsm9P8nkG2gKYwQICboAclqg4
VRS1HRJxu/ZE7oATIodAOJxBmsukJJeB/SmQrwRcB3gAhIfGSIJqAuwHZhVC
WwqAQ2Yw1V8TCgKXRvW+EvkIXoLHAitpBiv5rMjHQC1yRkShfjmH6a+Lch5P
hCyx5eD1AQx/mscEZh39mBmwEkgCqNAwp7C0Eb6AEfgzHtqEGPh0BOAE20Nn
kBtEAgYGt6pEQvFodvS+55QBvDJvk2OhqwlSYKI6iJLPEFFyrPR0Oq+gL9AD
XAYYF14n+SIDPig5bSIK4M7EQnnomjHQSxOw8sFXQByfWFSZsVOdwKIRgfd3
AO6HFccoepEnQGSgvJUI0vgKbCFwrQRYFRgP4JuYztNKz1IcOFGwxiEXAeli
nmXYDQGA/GZVSagAYg7zPgwpwEyewZtSles1Y2ue4fSKfD6euJcA+1SXekgj
wqORBFY4pgPHS5hhCUix4GVzMG0Fzp1aI/SadEOFKHoUAzcCGqNZYA4TwTrQ
Aj5PQI48UEwQmDWCOdVFNSdUQYVnk7PSOMu6zFFJEwFuAXYtLRz7nYQSx6wB
W0LWcqMLtFpgv9D3nErwwRWRucghKAHg4JLLqqJVriYfLuoLFOdyPpsBKiQS
6zBPfapTNYZupIQ1HEQ9h9EKAwxw/cIh5Q/XZJBtvw64pTrW+RxtANpPQAeA
OkzAh8oLFAsQM4mihKIADVBijayO8jTNFzj9eWZNAqoiCSmsa9FfggzVsgK9
AruDIAxpiX5gEWmQDo4aWSDzkFUAd1AMNZi84sxYpynQvATdpMbw/rVEQ00s
yBPwDAwYxH8+xrXFWM9jUjkUyNLMCmfKEyD74mZW0sxY7HLsk8/BVSr7qJyv
jB1fbX7vEEAppkpmBGSqKz3GCC6RUwkx0QiYZnSFmUQMmYH7xFxypOyLgTgF
9iW1QUMFx1mCtknzrkszcMJngXVHLjjjbhhLNEVaOYZx26lMVKh0xlyFttvI
HPITPLQSm4Dn50D5E2F8bFdiv11OjNEgMXLstFwC7MAJQAxQd6HF4wzUOs+I
takAswOBWlkvNwevhUySArnXBQDiUJApGhwtKszBYkHzzpRKiGOgy/U0WzYc
7YVGRsXpPFGlcJ5GnjGcBWCCQbjp6VCwVIQRAuqCvZ6Bq4mrwX5xNqtwQZ1N
jLkCFUeDr3wh8BnbuRyBOiMCU3miQqX11YSmSpTzZrBO1s/v7yQT8SmdCuMM
WFFj1fQJwBEbj8G9B6W5Jb6wa3hba/4q8ldqtIuAZ9VLwQ1KgKl6nAHK4BuX
4vzcRKoXF8YpMOtxQ6xll1CTk8HtZdbt1dAasMThAQ6c6iaj1fsZc4WsBLkO
0B4TWcASIBiYMeYxOJlskxA5EiKQDg1QEaN6aXAreL0yR9EXE2A2RKogz2AD
gTWeDOCaY0RQKBs5cOpqHYcAhONCD1mAz89b8cjFhZVj5xS8pJChHsM0wEiC
wm3yosqmV+k5N+i/Ob7ACulZdo8mYYcu+WXB2YeHNLCXY4Pnt8RzJUf+w4YQ
VWczozsxQkBvB+noCYQunb8xJwcShdcoIYsXtGj7Oqwb8MpTKNNfQKQDxguM
/FRhikOX08AJ5kQISTFmYFCKiYsoqFkz3XF+HmRGbGNY+w3xKmQLA1gLibFm
eOYZdGgEqyZKrodJOyXDyGHihsYT+bCSxF9fHJBdNPo6ijDTEFcizK5oUHwG
ecQpT3EbuV1LrHl8h6jolCqwwBqdyBEYKI1LCcZemszlWGWKqCtb0mn7vxh8
afWB1pJj38KGis2Uu6364z4JJJPErfq4huM6gebtFC2fJ0n1bG6nSHjAkAPt
O+Hy5QIXtPm6YDsBy8oQQzqaGA4MSiGtcSCemlVukCSaYxA7vVqYyOJlsIBR
Vsmtd+viDRq+wRgJF9hz50IGlEaHb6LSmejkEWKry3KuwtfsSLVbAwIQX/Da
KRFTpORoHrp2Z5aLrDABH1muycMOBHfOJtIfE4ew6gfSYZclWspaTgi4UEcd
T8l4GgH3jAe7DGC3wCT12dQ0TWIZDWoUvSgyjPCYV96CSK9RQj1BztSiy+J6
wo6Amy1I8VgaSfFUOurVC2Ujh9Rt942qWfeFw9FY4aLr0Rn4Bf7lXC2hIMoP
SpUaYW72JMsXtZ+J+AS8RIfIEGomQdWMb+a5VGTw68Gf65HC5FDTtPur7jBw
F8RtDhsBNGgG+HYYyqKC37ff76wbR4AyBRScIkeG5AcnIs9Aza1iunF8DfUZ
6kehB7iyp3k27tkw0Qau3gIwlBV8Rl0cjUDQgbmyPLELUUr+jmatpCCsYz0R
nChDzV4WEa+LofHMeILB4imOng2ePxewlgPVQ+Ix+R+C3I00R0jdqysZDLSK
KAtdEQtKDTmnvNajDaylgIXMLLeeZYjpq5+3gDhLj86CGMVBgQ6LSQ40GqqJ
TEdtNUNhowiGuO1FGoVKcVvG+d9eAskTSDRH7JK1PNzaKqOES5OEyUIDtX7V
KVNmasm8ZcVLKqyEftYKU0ue0Wnp0pC1UVdG48jFaerWAdh1iVNC+rwpJe3S
5QvjWz2UJYyJD8T5rSF+6Y3gy0V0fj7S4x4moHr0GOwISNCC7Qc9EdgQ8YHH
oqG4pGLoTqBHQb5uzxFJ1TEd4PqrX/0KVCbWGsayGeZr/se9tvB/333zt999
8zdX/vcb7LPNUK7bNVr1+ts/fvfNr0Msv/vmHy8H++0fm51+HQXf4P+Prfjb
B8HrmvFe7wdeb+v3ut53feB2iTe9v/vdaoz/pYHuJc35X4sw4Ry/CVv/u0ed
P7Rg/V6s6Lr63++b0saYtfDr+C/sec/ruXP1nk2B+/ZP3tf/6JbVq0Btk/c6
PQ+yJdJ1ac//+s/SCc81u94M3RsLygqoHg7XFwTo8+2fbthTiPzSPs1e922v
S6TuhxjLUeXbP9y05/Wo8kE9vie61zOGq6DCGh2d74lboUfA+6qfrLEL0ZEj
H3i7V2sXUbTVr9cul35p5WbAfUN/kx2vMJAv44maqtrN9iL4aLsLeCvrQAkd
G02HwDk/EGQFrOfYioCju/2OsBiAVmWQtCPPrs4nmt1F5dCx8Yd3HI1QLBTQ
LCtNNsTbQFRFdK8f5jpqSmbgrpo4kdNGObuhpuHUO54W5mTCOcoypEx0P4gJ
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

-->

</rfc>

