<?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.7.43 (Ruby 3.2.11) -->


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

]>


<rfc ipr="trust200902" docName="draft-ietf-ocm-integration-protocol-00" category="std" consensus="true" submissionType="IETF">
  <front>
    <title>Open Cloud Mesh Integration Protocol</title>

    <author initials="M." surname="Nordin" fullname="Micke Nordin">
      <organization>SUNET</organization>
      <address>
        <email>kano@sunet.se</email>
        <uri>https://code.smolnet.org/micke</uri>
      </address>
    </author>
    <author initials="G." surname="Lo Presti" fullname="Giuseppe Lo Presti">
      <organization>CERN</organization>
      <address>
        <email>giuseppe.lopresti@cern.ch</email>
        <uri>https://cern.ch/lopresti</uri>
      </address>
    </author>
    <author initials="M." surname="Baghbani" fullname="Mahdi Baghbani">
      <organization>Ponder Source</organization>
      <address>
        <email>mahdi@pondersource.org</email>
        <uri>https://pondersource.com</uri>
      </address>
    </author>

    <date year="2026" month="September" day="11"/>

    <area>Applications and Real-Time</area>
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 33?>

<t>The Open Cloud Mesh Integration Protocol (OCM-IP) defines how an Open
Cloud Mesh (OCM) Server can integrate supporting servers, such as
SSH/SFTP servers, web application platforms, or stand-alone WebDAV
servers, to perform protocol-specific work on its behalf.</t>

<t>OCM-IP makes it possible for existing OCM Servers to offload protocol
specific interactions to stand-alone servers, or even implement OCM as a
lightweight server that handles only the OCM parts of a deployment:
discovery, share creation, token issuance and signing.  Anything
protocol-specific, such as serving files over WebDAV, providing SSH
access, or running an interactive web application, can be handed off to
one or more Protocol Servers running elsewhere, possibly operated with
different software and on different infrastructure.</t>

<t>OCM-IP defines three integration modes: a provisioned mode, in which the
OCM Server pushes Share information to the Protocol Server over a signed
back channel; a self-contained mode, in which the Share information is
embedded in the signed access token itself, so that the Protocol Server
needs no per-share state and no inbound API at all; and an introspected
mode, in which the Protocol Server validates presented credentials
through a token introspection endpoint, restoring compatibility with
Receiving Servers that do not support token exchange.</t>

<t>OCM-IP is a protocol between the Sending OCM Server and its Protocol
Servers only.  The Receiving Server is not involved in, and does not
need to be aware of, this protocol: everything it observes is
indistinguishable from the Sending Server serving the access protocols
itself.  For this reason, an OCM Sending Server MAY adopt a
different strategy to interoperate with Protocol Servers, including
e.g. establishing trust via shared keys, without compromising
compliance with the OCM protocol.</t>



    </abstract>



  </front>

  <middle>


<?line 67?>

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

<t>Open Cloud Mesh [OCM] is a server federation protocol used to notify a
Receiving Party that they have been granted access to some Resource.
OCM deliberately handles interactions only up to the point where the
Receiving Party is informed of their access; actual Resource access is
subsequently managed by other protocols, such as WebDAV [RFC4918], SSH,
or application-specific web protocols.</t>

<t>In existing deployments, the Sending Server typically implements both
the OCM endpoints and all of the access protocols it offers.  This
couples the federation logic to the storage and application logic, and
makes it hard to:</t>

<t><list style="symbols">
  <t>implement OCM as a small, auditable component in front of existing
infrastructure,</t>
  <t>reuse a protocol implementation (for example a WebDAV server, an SFTP
server, or a computational notebook platform) across multiple OCM
deployments and vendors,</t>
  <t>operate the access protocol on separate infrastructure from the OCM
Server, for example running a web application platform in a different
security domain than the file sync and share system.</t>
</list></t>

<t>This document defines the Open Cloud Mesh Integration Protocol (OCM-IP),
which decouples the two concerns.  An OCM Server delegates the serving
of one or more access protocols to one or more Protocol Servers.  The
OCM Server remains the single party that the rest of the federation
interacts with: it performs OCM API Discovery, receives and sends Share
Creation Notifications.  The Protocol Server serves the actual Resource
access protocol, authorizing requests by independently verifying the
access tokens issued by the OCM Server.</t>

<t>Two properties of [OCM] make this delegation possible without
provisioning the Share's <spanx style="verb">sharedSecret</spanx> to the Protocol Server:</t>

<t><list style="numbers" type="1">
  <t>The OCM Server publishes its public keys as a JWK Set [RFC7517] at
the URL advertised in the <spanx style="verb">jwksUri</spanx> field of its OCM API Discovery
response, and signs its server-to-server requests using HTTP Message
Signatures [RFC9421].</t>
  <t>The Code Flow lets the Receiving Server exchange the <spanx style="verb">sharedSecret</spanx>
for an access token whose format [OCM] leaves entirely at the issuer's
discretion.</t>
</list></t>

<t>OCM-IP uses that freedom: it requires the OCM Server to issue these
access tokens as JWTs conforming to the JWT Profile for OAuth 2.0 Access
Tokens [RFC9068], signed with the OCM Server's published key.  Any
party, including a third-party service, can then verify such a token
without contacting the OCM Server on a per-request basis.</t>

<t>OCM-IP defines three integration modes that share a common authorization
core:</t>

<t><list style="symbols">
  <t>Provisioned integration: a small back-channel API through which the
OCM Server provisions and revokes Share records on the Protocol Server,
ahead of any Resource access.</t>
  <t>Self-contained integration: the OCM Server embeds the Share
information in the access token itself, as an additional JWT claim.  The
Protocol Server keeps no per-share state and exposes no inbound API;
everything it needs arrives inside the signed token.</t>
  <t>Introspected integration: the Protocol Server validates each presented
credential through a token introspection endpoint [RFC7662] at the OCM
Server.  This is the compatibility mode: it is the only one that can
serve Receiving Servers that directly presents the legacy <spanx style="verb">sharedSecret</spanx>
instead of performing the token exchange.</t>
</list></t>

<t>In all modes, normative rules define how the Protocol Server authorizes
front-channel Resource access using the OCM credentials.</t>

<t>This document is intended to be useful to anyone who wants to write a
reusable server component for use with OCM, such that one implementation
of, say, a notebook platform integration can be used unchanged behind
OCM Servers from different vendors.</t>

</section>
<section anchor="terms"><name>Terms</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
[RFC2119] [RFC8174] when, and only when, they appear in all capitals, as
shown here.</t>

<t>This document reuses the following terms as defined in [OCM]:
<em>Resource</em>, <em>Share</em>, <em>Share Creation Notification</em>, <em>Sending Server</em>,
<em>Receiving Server</em>, <em>Sending Party</em>, <em>Receiving Party</em>, <em>OCM Address</em>,
<em>OCM Server</em>, and <em>Code Flow</em>.</t>

<t>In addition, we define:</t>

<t><list style="symbols">
  <t><strong>Protocol Server</strong> - A server that serves one or more access
protocols (e.g., WebDAV, SSH, a web application) for Resources shared
through an OCM Server, on that OCM Server's behalf.</t>
  <t><strong>Integration API</strong> - The back-channel HTTP API exposed by a Protocol
Server, through which a paired OCM Server provisions and revokes Share
records.</t>
  <t><strong>Pairing</strong> - The out-of-band configuration step by which an OCM
Server and a Protocol Server are introduced to each other, establishing
mutual trust (see Pairing section).</t>
  <t><strong>Share Provisioning Request</strong> - A signed back-channel request from
the OCM Server to the Protocol Server, transferring the information the
Protocol Server needs in order to serve a Share.</t>
  <t><strong>Share Revocation Request</strong> - A signed back-channel request from the
OCM Server to the Protocol Server, instructing it to stop serving a
Share and release any associated resources.</t>
  <t><strong>Share Record</strong> - The Protocol Server's stored representation of a
provisioned Share, keyed by the pair (sender domain, providerId).</t>
  <t><strong>Provisioned Integration</strong> - The integration mode in which the OCM
Server transfers Share information to the Protocol Server over the back
channel, before any Resource access takes place.</t>
  <t><strong>Self-Contained Integration</strong> - The integration mode in which the
Share information travels inside the access token, in the <spanx style="verb">ocm_ip</spanx>
claim, and no back channel is used.</t>
  <t><strong>Introspected Integration</strong> - The integration mode in which the
Protocol Server validates a presented credential by querying a token
introspection endpoint [RFC7662] hosted by the OCM Server (or its
delegated Token Server).  Defined for backwards compatibility with
Receiving Servers that do not support the Code Flow.</t>
  <t><strong>ocm_ip Claim</strong> - A JWT claim, defined by this document, whose value
is an object carrying the Share information a Protocol Server needs in
order to serve a Share in Self-Contained Integration.</t>
  <t><strong>Front Channel</strong> - The path through which Resource access requests
reach the Protocol Server, originating from the Receiving Server or from
the Receiving Party's user agent, carrying a credential issued by the
OCM Server: an access token or, in Introspected Integration, possibly
the legacy <spanx style="verb">sharedSecret</spanx>.</t>
  <t><strong>Back Channel</strong> - The direct, signed, server-to-server path between
the OCM Server and the Protocol Server, carrying the Integration API
requests.</t>
</list></t>

</section>
<section anchor="architecture"><name>Architecture</name>

<section anchor="integration-modes"><name>Integration Modes</name>

<t>An OCM Server that delegates protocol work takes on the Sending Server
role of [OCM] towards the federation.  Towards its Protocol Servers it
uses one of three integration modes, chosen per pairing and per Share:</t>

<t><list style="symbols">
  <t>In <strong>Provisioned Integration</strong>, the OCM Server acts as a client of the
Protocol Server's Integration API: it pushes a Share Record over the
signed back channel before the Share is created, and revokes it when the
Share ends.  This mode supports the full Share lifecycle, including
prompt revocation and the release of per-share resources, and is the
only mode that supports SSH.</t>
  <t>In <strong>Self-Contained Integration</strong>, there is no back channel at all:
the OCM Server embeds the Share information in the access token, in the
<spanx style="verb">ocm_ip</spanx> claim.  The Protocol Server is stateless with respect to
Shares, which makes this mode attractive for simple gateways (for
example a token-verifying WebDAV front end to an existing storage
system), at the cost of revocation latency bounded only by token
lifetime (see Lifecycle).</t>
  <t>In <strong>Introspected Integration</strong>, the Protocol Server validates each
presented credential by querying a token introspection endpoint
[RFC7662] at the OCM Server (or its delegated Token Server).  This is a
compatibility mode: it is the only mode that can serve Receiving Servers
that do not support the <spanx style="verb">exchange-token</spanx> capability and therefore
present the legacy <spanx style="verb">sharedSecret</spanx> directly on the front channel.  It
reintroduces a per-request dependency on the OCM Server, which the other
two modes avoid.</t>
</list></t>

<t>A Protocol Server MAY support any combination of the modes.  Protocols
that allocate per-share resources or sessions (for example a notebook
platform that starts a computational session per Share) SHOULD use
Provisioned Integration, since Self-Contained Integration provides no
signal to release such resources.  Introspected Integration SHOULD be
used only where it is needed, namely for Shares towards Receiving
Servers that cannot perform the token exchange; where the Code Flow is
available, the other two modes avoid the per-request coupling.</t>

</section>
<section anchor="provisioned-integration-flow"><name>Provisioned Integration Flow</name>

<figure><artwork><![CDATA[
 Sending    OCM Server      Protocol     Receiving    Receiving
  Party   (Sending Server)    Server        Server       Party
    |            |              |             |            |
    | 1. Sending |              |             |            |
    |    Gesture |              |             |            |
    |----------->|              |             |            |
    |            | 2. Share     |             |            |
    |            | Provisioning |             |            |
    |            | Request      |             |            |
    |            |------------->|             |            |
    |            | 3. 201       |             |            |
    |            |<-------------|             |            |
    |            | 4. Share Creation          |            |
    |            |    Notification            |            |
    |            |--------------------------->|            |
    |            |              |             | 5. notify  |
    |            |              |             |----------->|
    |            | 6. Token Request           |            |
    |            |    (Code Flow)             |            |
    |            |<---------------------------|            |
    |            | 7. access_token (JWT)      |            |
    |            |--------------------------->|            |
    |            |              | 8. Resource access       |
    |            |              |    with access_token     |
    |            |              |<------------+------------|
    |            |              | 9. verify token against  |
    |            |              |    OCM Server's JWKS,    |
    |            |              |    look up Share Record, |
    |            |              |    serve the protocol    |
]]></artwork></figure>

<t>The numbered steps are:</t>

<t><list style="numbers" type="1">
  <t>The Sending Party makes a Sending Gesture to the OCM Server, as
described in [OCM].</t>
  <t>The OCM Server sends a Share Provisioning Request over the back
channel to the Protocol Server responsible for (one or more of) the
protocols offered in the Share.</t>
  <t>The Protocol Server verifies the request signature, stores the Share
Record and acknowledges.</t>
  <t>The OCM Server sends the Share Creation Notification to the Receiving
Server, exactly as specified in [OCM].  The protocol endpoints
advertised in the notification point (directly or via a reverse proxy)
at the Protocol Server.</t>
  <t>The Receiving Server notifies the Receiving Party as usual.</t>
  <t>The Receiving Server exchanges the <spanx style="verb">sharedSecret</spanx> for an access token
at the OCM Server's <spanx style="verb">tokenEndPoint</spanx>, using the Code Flow of [OCM].</t>
  <t>The OCM Server issues a signed JWT access token whose <spanx style="verb">client_id</spanx>
claim equals the <spanx style="verb">providerId</spanx> of the Share provisioned in step 2.</t>
  <t>The Receiving Server (or the Receiving Party's user agent, depending
on the access protocol) presents the access token to the Protocol
Server.</t>
  <t>The Protocol Server verifies the token against the OCM Server's
published keys, looks up the Share Record by (issuer domain,
<spanx style="verb">client_id</spanx>), cross-checks the identities bound into the token, and
serves the protocol-specific Resource access.</t>
</list></t>

</section>
<section anchor="self-contained-integration-flow"><name>Self-Contained Integration Flow</name>

<figure><artwork><![CDATA[
 Sending    OCM Server      Protocol     Receiving    Receiving
  Party   (Sending Server)    Server        Server       Party
    |            |              |             |            |
    | 1. Sending |              |             |            |
    |    Gesture |              |             |            |
    |----------->|              |             |            |
    |            | 2. Share Creation          |            |
    |            |    Notification            |            |
    |            |--------------------------->|            |
    |            |              |             | 3. notify  |
    |            |              |             |----------->|
    |            | 4. Token Request           |            |
    |            |    (Code Flow)             |            |
    |            |<---------------------------|            |
    |            | 5. access_token (JWT       |            |
    |            |    with ocm_ip claim)      |            |
    |            |--------------------------->|            |
    |            |              | 6. Resource access       |
    |            |              |    with access_token     |
    |            |              |<------------+------------|
    |            |              | 7. verify token against  |
    |            |              |    OCM Server's JWKS,    |
    |            |              |    check issuer pairing, |
    |            |              |    serve per the ocm_ip  |
    |            |              |    claim                 |
]]></artwork></figure>

<t>The flow is the OCM flow unchanged, except that the token issued in step
5 carries the <spanx style="verb">ocm_ip</spanx> claim, and that the protocol endpoints advertised
in step 2 point at the Protocol Server.  The Protocol Server is not
contacted before Resource access, holds no Share Records, and learns of
each Share only when the first request for it arrives.</t>

</section>
<section anchor="introspected-integration-flow"><name>Introspected Integration Flow</name>

<figure><artwork><![CDATA[
 Sending    OCM Server      Protocol     Receiving    Receiving
  Party   (Sending Server)    Server        Server       Party
    |            |              |             |            |
    | 1. Sending |              |             |            |
    |    Gesture |              |             |            |
    |----------->|              |             |            |
    |            | 2. Share Creation          |            |
    |            |    Notification            |            |
    |            |    (legacy sharedSecret)   |            |
    |            |--------------------------->|            |
    |            |              |             | 3. notify  |
    |            |              |             |----------->|
    |            |              | 4. Resource access       |
    |            |              |    with sharedSecret     |
    |            |              |<------------+------------|
    |            | 5. Token Introspection     |            |
    |            |    Request (signed)        |            |
    |            |<-------------|             |            |
    |            | 6. active + Share          |            |
    |            |    information             |            |
    |            |------------->|             |            |
    |            |              | 7. serve per the         |
    |            |              |    introspection         |
    |            |              |    response              |
]]></artwork></figure>

<t>The Share Creation Notification in step 2 is a legacy [OCM] share: it
carries the <spanx style="verb">sharedSecret</spanx> and does not include <spanx style="verb">must-exchange-token</spanx>,
because the Receiving Server cannot honor it.  The Protocol Server
validates the presented credential by introspecting it at the OCM Server
(steps 5 and 6) and authorizes the request from the introspection
response.</t>

<t>Introspected Integration composes with Provisioned Integration for the
same Share: in that case the introspection response identifies the
provisioned Share Record via <spanx style="verb">client_id</spanx>, and introspection replaces
only the credential validation, not the lifecycle handling.</t>

</section>
<section anchor="relationship-to-open-cloud-mesh"><name>Relationship to Open Cloud Mesh</name>

<t>OCM-IP is layered strictly behind the Sending Server role of [OCM]:</t>

<t><list style="symbols">
  <t>The OCM Server remains the Discoverable Server.  Protocol Servers MUST
NOT be required to expose <spanx style="verb">/.well-known/ocm</spanx>.</t>
  <t>The OCM Server remains the recipient of Invite Acceptance Requests,
Share Acceptance Notifications and all other OCM endpoints.</t>
  <t>The OCM Server remains the OAuth Authorization Server towards the
federation: access tokens are issued under its identity and verified
against the keys it publishes.  The hosting of the <spanx style="verb">tokenEndPoint</spanx>
itself MAY however be delegated as well; see the note below.</t>
  <t>The Protocol Server takes on (part of) the OAuth Resource Server
function: it is the party that ultimately accepts access tokens in
exchange for Resource access.</t>
</list></t>

<t>Shares whose protocols are served by a Protocol Server MUST use the Code
Flow of [OCM] unless the Share uses Introspected Integration: the OCM
Server MUST include <spanx style="verb">must-exchange-token</spanx> in the requirements of every
protocol entry that a Protocol Server serves in Provisioned or
Self-Contained Integration.  A Protocol Server cannot validate a legacy
<spanx style="verb">sharedSecret</spanx> on its own.  Introspected Integration allows the Protocol
Server to receive that credential on the front channel and validate it
through a per-request callback to the OCM Server.  After successful
introspection, the Protocol Server may also use the credential as
described in Security Considerations.</t>

<section anchor="note-delegating-the-token-endpoint"><name>Note: Delegating the Token Endpoint</name>

<t>This note is non-normative.</t>

<t>The <spanx style="verb">tokenEndPoint</spanx> is advertised as an absolute URL in the OCM Server's
discovery document, and nothing in [OCM] requires it to be served from
the OCM Server's own host.  Token issuance can therefore, in principle,
be delegated to a separate Token Server, in the same spirit as the rest
of this document:</t>

<t><list style="symbols">
  <t>The Token Server holds its own signing keypair, and the OCM Server
publishes the public key in its own JWK Set, advertised via the
<spanx style="verb">jwksUri</spanx> field of its Discovery response, under a <spanx style="verb">kid</spanx> in its own
domain.  The <spanx style="verb">iss</spanx> and <spanx style="verb">kid</spanx> rules of this document
(see Token Issuance by the OCM Server) are then satisfied without any
private key leaving the Token Server, and token
verification by Receiving Servers and Protocol Servers is unchanged.</t>
  <t>The Token Server learns about Shares through a special case of the
back channel: a share preparation request, by which the OCM Server sends
the information needed for issuance (the parties, the <spanx style="verb">providerId</spanx> or
the <spanx style="verb">ocm_ip</spanx> contents, the expiration) and receives in response a
<spanx style="verb">sharedSecret</spanx> minted by the Token Server.  The OCM Server forwards that
secret to the Receiving Server in the Share Creation Notification,
without needing to retain it.  The code presented in the Code Flow is
thereby validated by the very server that minted it, and the secret is
never stored outside the Token Server.</t>
</list></t>

<t>In such a deployment the OCM Server is reduced to pure federation logic:
discovery, Share bookkeeping, notifications and invites, with both token
issuance and Resource access served elsewhere.  The share preparation
request is identical to a request sent over the normal back channel, the
only difference being that the response from the Token Server includes
the <spanx style="verb">sharedSecret</spanx>.</t>

</section>
</section>
<section anchor="the-transparency-requirement"><name>The Transparency Requirement</name>

<t>OCM-IP is purely a protocol between the Sending Server and the Protocol
Server.  The Receiving Server MUST NOT be required to implement, or even
be aware of, OCM-IP.</t>

<t>Concretely, everything observable by the Receiving Server and the
Receiving Party MUST be indistinguishable from a deployment in which the
Sending Server serves the access protocols itself:</t>

<t><list style="symbols">
  <t>The protocol endpoints advertised in OCM API Discovery and in Share
Creation Notifications are ordinary URIs (or <spanx style="verb">host:port</spanx> addresses for
SSH); whether they are served by the OCM Server, by a reverse proxy in
front of a Protocol Server, or by a Protocol Server on a different
hostname is invisible at the OCM layer.</t>
  <t>Access tokens are obtained from the OCM Server's <spanx style="verb">tokenEndPoint</spanx> and
presented to the advertised protocol endpoint, exactly as specified in
[OCM].</t>
  <t>Errors returned by the Protocol Server on the front channel use the
semantics of the access protocol concerned.</t>
</list></t>

<t>A consequence of this requirement is that no OCM capability or criterium
is defined for OCM-IP: there is nothing for a remote peer to discover.</t>

</section>
<section anchor="topologies"><name>Topologies</name>

<t>The mapping between OCM Servers and Protocol Servers is many-to-many:</t>

<t><list style="symbols">
  <t>An OCM Server MAY pair with multiple Protocol Servers, for example one
serving WebDAV and another serving a web application platform, and MAY
provision the same Share to more than one of them when the Share offers
multiple protocols.</t>
  <t>A Protocol Server MAY be paired with multiple OCM Servers.  Share
Records are keyed by the pair (sender domain, providerId), so records
provisioned by different OCM Servers cannot collide and access tokens
issued by one OCM Server cannot address records provisioned by another.
In Self-Contained Integration the same isolation holds trivially: a
token is honored only if its issuer is paired, and grants only what its
own claims describe.</t>
</list></t>

</section>
</section>
<section anchor="pairing"><name>Pairing</name>

<t>Before a Protocol Server serves any Share, the OCM Server and the
Protocol Server MUST be paired.  Pairing is performed out of band,
typically by the operators of the two systems, and consists of at least:</t>

<t><list style="symbols">
  <t>On the OCM Server: which protocols and resource types the Protocol
Server is responsible for, which integration mode(s) to use, and, for
Provisioned Integration, the base URL of the Integration API of the
Protocol Server (referred to as <spanx style="verb">{integrationAPI}</spanx> below).  For
Introspected Integration, additionally the Protocol Server's JWKS URL
(referred to as <spanx style="verb">{protocolServerJwksUri}</spanx> below) and domain, used to
verify its introspection requests.</t>
  <t>On the Protocol Server: the domain(s) of the paired OCM Server(s) and
the integration mode(s) permitted for each.  The Protocol Server MUST
maintain an allowlist of paired OCM Server domains, MUST reject
Integration API requests whose sender is not on that allowlist, and MUST
NOT honor the <spanx style="verb">ocm_ip</spanx> claim of tokens whose issuer is not paired for
Self-Contained Integration.  For Introspected Integration, additionally
the URL of the introspection endpoint (referred to as
<spanx style="verb">{introspectionEndPoint}</spanx> below).</t>
</list></t>

<t>No shared secret is exchanged during pairing.  All trust on the back
channel derives from HTTP Message Signatures [RFC9421] made with the OCM
Server's signatory key, verified against the keys the OCM Server
publishes at the URL advertised in the <spanx style="verb">jwksUri</spanx> field of its OCM API
Discovery response [RFC7517], as specified in [OCM].  All trust on the
front channel derives from the JWT signatures on the access tokens,
verified against the same published keys.  Trust in introspection
requests derives, symmetrically, from HTTP Message Signatures made with
the Protocol Server's key, published at the JWKS URL exchanged during
pairing (see above).</t>

<t>The Protocol Server consequently does not need a signing keypair of its
own to implement this protocol, unless it uses Introspected Integration,
which requires it to sign its introspection requests (see Token
Introspection).</t>

</section>
<section anchor="integration-api"><name>Integration API</name>

<t>The Integration API is the back channel of Provisioned Integration.  A
Protocol Server that supports only Self-Contained Integration does not
expose it, and an OCM Server never calls it for self-contained Shares.</t>

<section anchor="general-requirements"><name>General Requirements</name>

<t>All Integration API requests:</t>

<t><list style="symbols">
  <t>MUST be made over TLS (implementations MAY fall back to plain HTTP in
testing setups only),</t>
  <t>MUST use the HTTP POST method with <spanx style="verb">application/json</spanx> as the
<spanx style="verb">Content-Type</spanx> request header,</t>
  <t>MUST be signed with an HTTP Message Signature [RFC9421] carrying the
label <spanx style="verb">ocm</spanx>, following the same rules as server-to-server requests in
[OCM]: the signature MUST cover at least <spanx style="verb">@method</spanx>, <spanx style="verb">@target-uri</spanx>,
<spanx style="verb">content-digest</spanx>, <spanx style="verb">content-length</spanx> and <spanx style="verb">date</spanx>, MUST include the
<spanx style="verb">created</spanx> parameter, and MUST be made with an asymmetric algorithm using
a key advertised in the OCM Server's JWK Set, located via the <spanx style="verb">jwksUri</spanx>
field of its Discovery response.</t>
</list></t>

<t>On receipt of an Integration API request, the Protocol Server:</t>

<t><list style="numbers" type="1">
  <t>MUST parse the <spanx style="verb">sender</spanx> field from the request body and derive the
sender domain from the part after the last <spanx style="verb">@</spanx> sign.</t>
  <t>MUST verify that the sender domain is on its allowlist of paired OCM
Servers, and reject the request with HTTP status 401 otherwise.</t>
  <t>MUST verify the <spanx style="verb">ocm</spanx>-labeled signature against the JWKS of the
sender domain, following the verification rules of [OCM] (single <spanx style="verb">ocm</spanx>
label, required covered components, content-digest match [RFC9530],
<spanx style="verb">created</spanx>
within a freshness window, <spanx style="verb">keyid</spanx> domain equal to the sender domain),
and reject the request with HTTP status 401 on any failure.</t>
</list></t>

<t>Note that, unlike the Share Creation Notification of [OCM], where the
verification key is discovered from the <spanx style="verb">sender</spanx> field of an arbitrary
remote server, the allowlist check in step 2 happens before any key
fetching: a Protocol Server never fetches keys from, or processes
payloads of, servers it is not paired with.</t>

<t>If the Protocol Server is deployed behind a TLS-terminating reverse
proxy, it MUST reconstruct the <spanx style="verb">@target-uri</spanx> that the OCM Server signed
(i.e., the public URL) when verifying signatures, for example from
forwarding headers set by the proxy.</t>

</section>
<section anchor="share-provisioning-request"><name>Share Provisioning Request</name>

<t>To provision a Share, the OCM Server MUST send a Share Provisioning
Request:</t>

<t><list style="symbols">
  <t>to <spanx style="verb">{integrationAPI}/shares</spanx>,</t>
  <t>before sending the corresponding Share Creation Notification to the
Receiving Server (see Lifecycle below),</t>
  <t>with a request body containing a JSON document as described below.</t>
</list></t>

<section anchor="fields"><name>Fields</name>

<t>The request body is the Share Creation Notification object of [OCM] that
the OCM Server intends to send to the Receiving Server, with one
transformation applied: every <spanx style="verb">sharedSecret</spanx> field, in every protocol
entry, MUST be removed.  The Integration API therefore never transfers a
<spanx style="verb">sharedSecret</spanx> to the Protocol Server.  Introspected Integration is
different: a <spanx style="verb">sharedSecret</spanx> may reach the Protocol Server as a
front-channel credential, independently of provisioning.</t>

<t>The fields used by the Protocol Server are thus:</t>

<t><list style="symbols">
  <t>REQUIRED <spanx style="verb">sender</spanx> (string) - OCM Address of the user that creates the
Share.  The domain part identifies the paired OCM Server and selects the
verification keys, as described above.</t>
  <t>REQUIRED <spanx style="verb">owner</spanx> (string) - OCM Address of the user that owns the
Resource.  Used for identity binding on the front channel.</t>
  <t>REQUIRED <spanx style="verb">shareWith</spanx> (string) - OCM Address of the Receiving Party.
Used for identity binding on the front channel.</t>
  <t>REQUIRED <spanx style="verb">providerId</spanx> (string) - as in [OCM]; opaque identifier of the
Share at the OCM Server, unique per Share.  It keys the Share Record and
links the back channel to the front channel (see below).</t>
  <t>REQUIRED <spanx style="verb">shareType</spanx> (string) - as in [OCM].</t>
  <t>REQUIRED <spanx style="verb">resourceType</spanx> (string) - as in [OCM].</t>
  <t>REQUIRED <spanx style="verb">protocol</spanx> (object) - as in [OCM], transformed as described
above.  The protocol entries carry the protocol-specific information the
Protocol Server needs to serve the Share (for example the <spanx style="verb">webdav</spanx>
entry's <spanx style="verb">uri</spanx> and <spanx style="verb">permissions</spanx>, or the <spanx style="verb">webapp</spanx> entry's <spanx style="verb">viewMode</spanx>).</t>
  <t>OPTIONAL <spanx style="verb">name</spanx>, <spanx style="verb">description</spanx>, <spanx style="verb">ownerDisplayName</spanx>,
<spanx style="verb">senderDisplayName</spanx>, <spanx style="verb">expiration</spanx> - as in [OCM]; informational, except
<spanx style="verb">expiration</spanx>, which the Protocol Server SHOULD honor (see Lifecycle).</t>
</list></t>

<t>Additional fields from the Share Creation Notification MAY be present
and MUST be ignored if not understood.</t>

</section>
<section anchor="the-providerid"><name>The providerId</name>

<t>The <spanx style="verb">providerId</spanx> is the link between the back channel and the front
channel, and the following rules apply:</t>

<t><list style="symbols">
  <t>[OCM] guarantees that the <spanx style="verb">providerId</spanx> is unique per Share, so the
pair (sender domain, providerId) identifies exactly one Share Record.</t>
  <t>The OCM Server MUST set the <spanx style="verb">client_id</spanx> claim of every access token it
issues for this Share (via its <spanx style="verb">tokenEndPoint</spanx>) to exactly the
<spanx style="verb">providerId</spanx>.  This constrains a value that the token profile of this
document (see Token Issuance by the OCM Server) otherwise leaves at the
OCM Server's discretion.</t>
  <t>The <spanx style="verb">providerId</spanx> is an identifier, not a credential: the Receiving
Server learns it from the Share Creation Notification anyway.
Possession of a <spanx style="verb">providerId</spanx> MUST NOT grant any access by itself; all
front channel authorization derives from the verified access token.
Consequently, the <spanx style="verb">providerId</spanx> does not need to be unguessable, and it
MAY appear in URLs and logs.</t>
</list></t>

</section>
<section anchor="response"><name>Response</name>

<t>On success the Protocol Server MUST respond with HTTP status 201 and a
JSON object with the following fields:</t>

<t><list style="symbols">
  <t>OPTIONAL <spanx style="verb">status</spanx> (string) - e.g. <spanx style="verb">"stored"</spanx>.</t>
  <t>OPTIONAL <spanx style="verb">protocol</spanx> (object) - protocol details allocated by the
Protocol Server for this Share, in the same format as the <spanx style="verb">protocol</spanx>
object of [OCM].</t>
</list></t>

<t>When the response contains a <spanx style="verb">protocol</spanx> object, the OCM Server SHOULD
use its field values (for example, a per-share <spanx style="verb">uri</spanx> allocated by the
Protocol Server) when constructing the corresponding protocol entries of
the outbound Share Creation Notification, in place of statically
configured values from the pairing.  This allows a Protocol Server to
allocate endpoints dynamically, per Share.</t>

<t>Two restrictions apply to the response <spanx style="verb">protocol</spanx> object:</t>

<t><list style="symbols">
  <t>It MUST NOT contain <spanx style="verb">sharedSecret</spanx> fields, and an OCM Server MUST
ignore any <spanx style="verb">sharedSecret</spanx> found in a Share Provisioning Response.
(Delegated token issuance is the exception: the share preparation
request is this same request sent to a Token Server, whose response
legitimately carries the <spanx style="verb">sharedSecret</spanx> it minted; see the note on
delegating the token endpoint.)</t>
  <t>The OCM Server MUST NOT take permissions from the response: the
Share's permissions are decided by the Sending Party and the OCM Server,
never by the Protocol Server.</t>
</list></t>

<t>Fields in the response <spanx style="verb">protocol</spanx> object that the OCM Server does not
understand MUST be ignored.</t>

<t>A Share Provisioning Request for a (sender domain, providerId) pair that
already has a Share Record MUST replace the existing record and respond
with HTTP status 201.  This makes provisioning idempotent and gives the
OCM Server a way to update a Share (for example after a permissions
change) by re-provisioning it.</t>

<t>Error responses:</t>

<t><list style="symbols">
  <t>400 - the request body is not valid JSON, or a required field is
missing or malformed.</t>
  <t>401 - the signature is missing, malformed, stale or invalid, or the
sender domain is not on the allowlist of paired OCM Servers.</t>
  <t>503 - the Protocol Server is temporarily unable to provision the
Share.</t>
</list></t>

</section>
</section>
<section anchor="share-revocation-request"><name>Share Revocation Request</name>

<t>When a Share is deleted, expires, is declined by the Receiving Party, or
access is otherwise withdrawn, the OCM Server SHOULD send a Share
Revocation Request:</t>

<t><list style="symbols">
  <t>to <spanx style="verb">{integrationAPI}/revoke</spanx>,</t>
  <t>with a request body containing a JSON document with the following
fields:</t>
  <t>REQUIRED <spanx style="verb">sender</spanx> (string) - an OCM Address whose domain part
identifies the paired OCM Server, subject to the same allowlist and
signature checks as all Integration API requests.</t>
  <t>REQUIRED <spanx style="verb">providerId</spanx> (string) - the <spanx style="verb">providerId</spanx> of the Share to
revoke.</t>
</list></t>

<t>On receipt of a valid Share Revocation Request, the Protocol Server MUST
stop serving the identified Share, MUST delete the Share Record, and
SHOULD release any resources associated with it (for example, stopping a
computational session that was started for the Share, or invalidating
local sessions derived from its access tokens).</t>

<section anchor="response-1"><name>Response</name>

<t>Revocation MUST be idempotent: if no Share Record exists for the given
(sender domain, providerId), the Protocol Server MUST respond with HTTP
status 200, so that the OCM Server can treat revocation as
fire-and-forget.  This document defines one OPTIONAL response field:</t>

<t><list style="symbols">
  <t>OPTIONAL <spanx style="verb">status</spanx> (string) - e.g. <spanx style="verb">"revoked"</spanx> when a record was found
and revoked, <spanx style="verb">"gone"</spanx> when there was nothing to revoke.</t>
</list></t>

<t>Error responses are as for Share Provisioning.</t>

</section>
</section>
<section anchor="liveness"><name>Liveness</name>

<t>A Protocol Server SHOULD respond to a GET request to <spanx style="verb">{integrationAPI}</spanx>
(or <spanx style="verb">{integrationAPI}/</spanx>) with HTTP status 200 and a JSON object, so that
operators and OCM Servers can verify reachability of the Integration
API.  The contents of the object are not specified.</t>

</section>
</section>
<section anchor="token-introspection"><name>Token Introspection</name>

<t>Token introspection is the credential validation path of Introspected
Integration.  The introspection endpoint is hosted by the OCM Server or,
when token issuance is delegated, by its Token Server; its URL,
<spanx style="verb">{introspectionEndPoint}</spanx>, is exchanged during pairing.  It is not
advertised in the OCM discovery document: like the Integration API, it
is invisible to the federation.</t>

<t>Note that a legacy credential is opaque and carries no issuer
information, so the Protocol Server has no way to determine which paired
OCM Server to introspect against; Introspected Integration therefore
cannot work in multi-tenant deployments, where one Protocol Server
serves more than one OCM Server through the same protocol endpoint.</t>

<section anchor="request"><name>Request</name>

<t>To validate a presented credential, the Protocol Server sends an HTTP
POST request to <spanx style="verb">{introspectionEndPoint}</spanx> as specified by [RFC7662]: the
request body is <spanx style="verb">application/x-www-form-urlencoded</spanx> with a <spanx style="verb">token</spanx>
parameter carrying the credential exactly as presented on the front
channel.  The credential MAY be a legacy <spanx style="verb">sharedSecret</spanx> or a JWT access
token; the endpoint MUST accept any credential that is valid for a Share
at this OCM Server.</t>

<t>The request MUST be made over TLS and MUST be signed with an HTTP
Message Signature [RFC9421] carrying the label <spanx style="verb">ocm</spanx>, with the same
covered components and <spanx style="verb">created</spanx> rules as Integration API requests.  The
<spanx style="verb">keyid</spanx> MUST identify a key in the Protocol Server's own JWKS,
published at the JWKS URL exchanged during pairing
(<spanx style="verb">{protocolServerJwksUri}</spanx>) [RFC7517].
The introspection endpoint MUST verify that the <spanx style="verb">keyid</spanx> domain belongs
to a paired Protocol Server and MUST verify the signature against that
domain's JWKS before evaluating the credential; unauthenticated or
unpaired requests MUST be rejected without revealing whether the
presented credential is valid.  This authentication requirement is what
keeps the endpoint from acting as a credential-validity oracle (Section
4 of [RFC7662]).</t>

</section>
<section anchor="response-2"><name>Response</name>

<t>The response is an [RFC7662] introspection response.  For an unknown,
expired or revoked credential the endpoint MUST respond with <spanx style="verb">{"active":
false}</spanx> and no other members.  For a valid credential the response
object MUST contain:</t>

<t><list style="symbols">
  <t><spanx style="verb">active</spanx> (boolean) - <spanx style="verb">true</spanx>.</t>
  <t><spanx style="verb">iss</spanx>, <spanx style="verb">sub</spanx>, <spanx style="verb">aud</spanx> (strings) - with the claim semantics this document
defines for access tokens (see Token Issuance by the OCM Server).</t>
  <t><spanx style="verb">exp</spanx> (integer) - for a JWT, the token's own <spanx style="verb">exp</spanx>; for a legacy
<spanx style="verb">sharedSecret</spanx>, the time until which the Protocol Server may rely on
this response.  The endpoint MUST set a short horizon (on the order of
minutes), since <spanx style="verb">exp</spanx> also bounds revocation latency.</t>
  <t><spanx style="verb">client_id</spanx> (string) - the Share's <spanx style="verb">providerId</spanx>, when the Share is
provisioned to the calling Protocol Server.</t>
  <t><spanx style="verb">ocm_ip</spanx> (object) - the Share information as defined for the <spanx style="verb">ocm_ip</spanx>
claim, when the Share is not provisioned to the calling Protocol Server.</t>
</list></t>

<t>The Protocol Server uses exactly one of these: a <spanx style="verb">client_id</spanx> naming a
Share Record, or the <spanx style="verb">ocm_ip</spanx> member, as described in Token
Verification.</t>

<t>The Protocol Server MAY cache a positive response until its <spanx style="verb">exp</spanx> and
MUST NOT rely on it beyond that.  Negative responses SHOULD NOT be
cached for more than a brief interval.</t>

</section>
</section>
<section anchor="front-channel-resource-access"><name>Front Channel: Resource Access</name>

<section anchor="token-issuance-by-the-ocm-server"><name>Token Issuance by the OCM Server</name>

<t>Token issuance follows the Code Flow of [OCM]: the Receiving Server
exchanges the <spanx style="verb">sharedSecret</spanx> from the Share Creation Notification for an
access token at the OCM Server's <spanx style="verb">tokenEndPoint</spanx>.  [OCM] treats the
issued <spanx style="verb">access_token</spanx> as an opaque bearer credential and leaves its
format at the issuer's discretion.  This document profiles that format.</t>

<t>For every Share in Provisioned or Self-Contained Integration, the
<spanx style="verb">access_token</spanx> MUST be a JWT conforming to the JWT Profile for OAuth 2.0
Access Tokens [RFC9068].  The JOSE header MUST include <spanx style="verb">typ</spanx> with the
value set to <spanx style="verb">at+jwt</spanx> and MUST include a <spanx style="verb">kid</spanx> parameter identifying
the OCM Server's signatory key, advertised in the JWK Set located via
the <spanx style="verb">jwksUri</spanx> field of its Discovery response, and
MUST NOT use <spanx style="verb">none</spanx> as the <spanx style="verb">alg</spanx>.  The JWT MUST be signed with the
private key corresponding to that signatory key, allowing anyone with
access to the corresponding public key, including a Protocol Server, to
verify the token independently.  The <spanx style="verb">expires_in</spanx> value of the token
response MUST agree with the <spanx style="verb">exp</spanx> claim.  Receiving Servers are
unaffected: they continue to treat the token as opaque, per [OCM].</t>

<t>The JWT Claims Set MUST include the claims required by [RFC9068], with
the following OCM-specific semantics, on which the Protocol Server
relies:</t>

<t><list style="symbols">
  <t><spanx style="verb">iss</spanx> - the Sending Server identifier, derived from the scheme and
authority of the signatory keyId.</t>
  <t><spanx style="verb">sub</spanx> - the Share owner on the Sending Server.</t>
  <t><spanx style="verb">aud</spanx> - the OCM principal authorized by the token, i.e. the
<spanx style="verb">shareWith</spanx> value of the Share.  Per Section 4.1.3 of [RFC7519] the
interpretation of audience values is application-specific, and this
document defines that interpretation.</t>
  <t><spanx style="verb">client_id</spanx> - as defined in Section 4.3 of [RFC8693], which forwards
to Section 2.2 of [RFC6749].  Verifiers MUST NOT assume a particular
size or format beyond what this document specifies per integration
mode.</t>
  <t><spanx style="verb">iat</spanx>, <spanx style="verb">exp</spanx>, <spanx style="verb">jti</spanx> - as in [RFC9068].</t>
</list></t>

<t>Further requirements apply per integration mode.</t>

<t>For a Share in Provisioned Integration:</t>

<t><list style="symbols">
  <t>The <spanx style="verb">client_id</spanx> claim MUST equal the <spanx style="verb">providerId</spanx> of the Share.</t>
  <t>The token MUST NOT carry the <spanx style="verb">ocm_ip</spanx> claim.  Mixing the modes for a
single Share would allow a self-contained token to outlive the
revocation of the Share Record (see Security Considerations).</t>
</list></t>

<t>For a Share in Self-Contained Integration:</t>

<t><list style="symbols">
  <t>The token MUST carry the <spanx style="verb">ocm_ip</spanx> claim described in the next section.</t>
  <t>The <spanx style="verb">exp</spanx> claim MUST NOT be later than the Share's <spanx style="verb">expiration</spanx>, when
the Share has one.</t>
  <t>The token SHOULD be short-lived: the RECOMMENDED lifetime is on the
order of minutes or for special use-cases, hours, relying on the
Receiving Server to re-exchange the <spanx style="verb">sharedSecret</spanx> for a fresh token per
[OCM].  Because no revocation signal exists in this mode, the remaining
lifetime of the longest-lived valid token is exactly how long access
survives the end of the Share.</t>
  <t>Once the Share ends, the OCM Server MUST NOT issue further tokens for
it.  This holds in all modes, but in Self-Contained Integration it is
the only revocation mechanism.</t>
</list></t>

<t>For a Share in Introspected Integration, no additional issuance
requirements apply.  Typically no token is issued at all, since this
mode serves Receiving Servers that present the legacy <spanx style="verb">sharedSecret</spanx>
directly.  Should such a Share nevertheless be exchanged for tokens, the
Protocol Server can validate those tokens through the same introspection
endpoint.</t>

</section>
<section anchor="the-ocmip-claim"><name>The ocm_ip Claim</name>

<t>The value of the <spanx style="verb">ocm_ip</spanx> claim is a JSON object carrying the Share
information that the Share Provisioning Request carries in Provisioned
Integration.  The Share's parties are deliberately not part of the
claim: the owner and the Receiving Party are already bound by the <spanx style="verb">sub</spanx>,
<spanx style="verb">iss</spanx> and <spanx style="verb">aud</spanx> claims of the enclosing token.</t>

<t>Fields:</t>

<t><list style="symbols">
  <t>REQUIRED <spanx style="verb">protocol</spanx> (object) - as the <spanx style="verb">protocol</spanx> object of [OCM],
restricted to the protocol entries this token grants access to.  It MUST
NOT contain <spanx style="verb">sharedSecret</spanx> fields.</t>
  <t>REQUIRED <spanx style="verb">providerId</spanx> (string) - as in [OCM]; opaque identifier of the
Share at the OCM Server, useful for logging and correlation.</t>
  <t>REQUIRED <spanx style="verb">resourceType</spanx> (string) - as in [OCM].</t>
  <t>OPTIONAL <spanx style="verb">name</spanx> (string) - as in [OCM].</t>
  <t>OPTIONAL <spanx style="verb">shareType</spanx> (string) - as in [OCM].</t>
  <t>OPTIONAL <spanx style="verb">expiration</spanx> (integer) - as in [OCM].</t>
</list></t>

<t>Fields in the <spanx style="verb">ocm_ip</spanx> claim that the Protocol Server does not
understand MUST be ignored.</t>

</section>
<section anchor="token-verification-by-the-protocol-server"><name>Token Verification by the Protocol Server</name>

<t>When a front-channel request presents a credential, the Protocol Server
MUST authorize it as follows:</t>

<t><list style="numbers" type="1">
  <t>If the credential parses as a JWT, extract the <spanx style="verb">iss</spanx> claim without
trusting it; reject the credential if <spanx style="verb">iss</spanx> is missing or is not an
<spanx style="verb">https</spanx> URL, and continue with step 2.  If it does not parse as a JWT,
or when the Protocol Server prefers introspection over local
verification, validate the credential through Token Introspection
instead: an <spanx style="verb">active</spanx> response supplies the fields (<spanx style="verb">iss</spanx>, <spanx style="verb">sub</spanx>, <spanx style="verb">aud</spanx>,
<spanx style="verb">exp</spanx>, <spanx style="verb">client_id</spanx>, <spanx style="verb">ocm_ip</spanx>) used in steps 4 to 6, and steps 2 and 3
are skipped; an inactive response means the request is rejected.</t>
  <t>Resolve the signing key: fetch (or use a cached copy of) the OCM
Server's Discovery document at <spanx style="verb">https://&lt;iss-host&gt;/.well-known/ocm</spanx>,
read its <spanx style="verb">jwksUri</spanx> field, fetch the JWK Set from that URL, and select
the key matching the token's <spanx style="verb">kid</spanx> header parameter.</t>
  <t>Verify the token signature and validity per [RFC9068]: the algorithm
MUST be an asymmetric algorithm matching the key, MUST NOT be <spanx style="verb">none</spanx>,
and the <spanx style="verb">exp</spanx> claim MUST be in the future.  The claims <spanx style="verb">iss</spanx>, <spanx style="verb">sub</spanx>,
<spanx style="verb">aud</spanx>, <spanx style="verb">exp</spanx> and <spanx style="verb">client_id</spanx> MUST all be present.</t>
  <t>Determine the integration mode:
  <list style="symbols">
      <t>If a Share Record exists for the pair (host part of <spanx style="verb">iss</spanx>,
<spanx style="verb">client_id</spanx> claim), the token is authorized against that record
(Provisioned Integration).  Any <spanx style="verb">ocm_ip</spanx> claim in the token MUST be
ignored.</t>
      <t>Otherwise, if the verified token carries an <spanx style="verb">ocm_ip</spanx> claim and the
host part of <spanx style="verb">iss</spanx> is paired for Self-Contained Integration, or the
introspection response carries an <spanx style="verb">ocm_ip</spanx> member, the credential is
authorized against those claims.</t>
      <t>Otherwise, reject the request.  Because Share Records only come
into existence through signed back-channel requests from paired OCM
Servers, the <spanx style="verb">ocm_ip</spanx> claim is only honored for paired issuers, and
introspection only ever consults paired endpoints, credentials from
unrelated issuers, however validly signed, grant nothing.</t>
    </list></t>
  <t>Perform identity binding (next section).</t>
  <t>Serve the request according to the protocol entry of the Share Record
or of the <spanx style="verb">ocm_ip</spanx> claim or member, honoring its permissions (e.g.
<spanx style="verb">protocol.webdav.permissions</spanx>), its <spanx style="verb">expiration</spanx> if present, and any
protocol-specific restrictions.</t>
</list></t>

<t>The token's <spanx style="verb">exp</spanx> claim is authoritative for token lifetime.  Any expiry
hint delivered alongside the token on the front channel (such as the
<spanx style="verb">access_token_ttl</spanx> form field used by WOPI-style web applications) MUST
agree with the <spanx style="verb">exp</spanx> claim, otherwise the access MUST be rejected.</t>

<t>The Protocol Server MAY cache JWKS documents.  It SHOULD bound the cache
lifetime so that key rotation and key revocation at the OCM Server take
effect within a reasonable time.</t>

</section>
<section anchor="identity-binding"><name>Identity Binding</name>

<t>In Provisioned Integration, a valid signature and a matching Share
Record are not sufficient: the token MUST also be bound to the
identities stored in the record.  The Protocol Server MUST verify that:</t>

<t><list style="symbols">
  <t>the OCM Address formed as <spanx style="verb">&lt;sub&gt;@&lt;iss-host&gt;</spanx> equals the Share Record's
<spanx style="verb">owner</spanx>, and</t>
  <t>the <spanx style="verb">aud</spanx> claim equals the Share Record's <spanx style="verb">shareWith</spanx>.</t>
</list></t>

<t>Comparison of OCM Addresses SHOULD be performed after canonicalising the
host part (lowercasing, removing any stray scheme prefix or trailing
slash); the identifier part is opaque and MUST be compared byte for
byte.</t>

<t>These checks ensure that an access token can only be used for the exact
Share it was issued for: a token legitimately issued to one Receiving
Party for one Resource cannot be replayed against a Share Record
involving any other party or Resource, even at the same Protocol Server
and from the same OCM Server.  The same checks apply when the fields
come from an introspection response that names a Share Record via
<spanx style="verb">client_id</spanx>.</t>

<t>In Self-Contained Integration, and when serving from the <spanx style="verb">ocm_ip</spanx> member
of an introspection response, there is no stored record to compare
against: the credential itself is the authority, and the owner and the
Receiving Party are read directly from <spanx style="verb">&lt;sub&gt;@&lt;iss-host&gt;</spanx> and <spanx style="verb">aud</spanx>.
The cross-checks above therefore do not apply; what remains is to
enforce the scope of the <spanx style="verb">ocm_ip</spanx> claim (protocol entries, permissions,
expiration) and, where the protocol concerned authenticates the
Receiving Party, to derive that identity from <spanx style="verb">aud</spanx> using the same
canonicalisation rules.</t>

</section>
<section anchor="token-presentation-per-protocol"><name>Token Presentation per Protocol</name>

<t>How the access token reaches the Protocol Server depends on the access
protocol, and follows [OCM] and its protocol-specific companion
specifications.  Non-normative summary:</t>

<t><list style="symbols">
  <t><spanx style="verb">webdav</spanx> - the Receiving Server acts as the API client and presents
the token in the <spanx style="verb">Authorization: Bearer</spanx> header of its WebDAV requests
to the advertised <spanx style="verb">webdav</spanx> endpoint.</t>
  <t><spanx style="verb">webapp</spanx> - the Receiving Server delivers the token to the Receiving
Party's user agent, which presents it to the advertised <spanx style="verb">webapp</spanx>
endpoint via a form POST (<spanx style="verb">access_token</spanx> field), keeping the token out
of URLs.  The Protocol Server typically responds by establishing a
session (e.g. a cookie scoped to the application) and serving the
application.</t>
  <t><spanx style="verb">ssh</spanx> - SSH access is authenticated with the recipient's public key
per [OCM] rather than with a bearer token.  An SSH/SFTP Protocol Server
uses the Share Provisioning Request to learn which key material and
paths to authorize, and the Share Revocation Request to withdraw that
authorization.  The token verification rules of this section do not
apply to the SSH data channel itself, and Self-Contained Integration is
consequently not applicable to <spanx style="verb">ssh</spanx>: there is no token presentation
through which an <spanx style="verb">ocm_ip</spanx> claim could travel.</t>
</list></t>

</section>
</section>
<section anchor="lifecycle"><name>Lifecycle</name>

<section anchor="ordering"><name>Ordering</name>

<t>In Provisioned Integration, the OCM Server MUST send the Share
Provisioning Request, and receive a success response, before sending the
Share Creation Notification to the Receiving Server.  If provisioning
fails, the OCM Server MUST NOT create the Share: otherwise the Receiving
Party would be notified of a Share whose Resource access cannot work.</t>

</section>
<section anchor="revocation-and-expiration"><name>Revocation and Expiration</name>

<t>The OCM Server SHOULD send a Share Revocation Request whenever a Share
ends, whatever the cause: unshared by the Sending Party, declined by the
Receiving Party (e.g. on receipt of a <spanx style="verb">SHARE_DECLINED</spanx> notification), or
administratively removed.</t>

<t>Revocation is deliberately fire-and-forget: because it is idempotent on
the Protocol Server side, the OCM Server MAY retry it at any time, and a
failure to deliver it MUST NOT block the unshare operation on the OCM
Server.</t>

<t>The Protocol Server SHOULD apply its own bounds on Share Record lifetime
as a backstop against missed revocations:</t>

<t><list style="symbols">
  <t>If the provisioned Share carries an <spanx style="verb">expiration</spanx>, the Protocol Server
SHOULD stop serving the Share at that time.</t>
  <t>The Protocol Server MAY additionally expire Share Records after an
implementation-defined maximum lifetime; an OCM Server can always
re-provision (idempotently) to extend it.</t>
</list></t>

<t>Note that token expiry alone already limits the damage of a missed
revocation on bearer-token protocols: once the OCM Server stops issuing
fresh tokens for a Share, access ends when the last issued token
expires.</t>

</section>
<section anchor="lifecycle-in-self-contained-integration"><name>Lifecycle in Self-Contained Integration</name>

<t>Self-Contained Integration has no provisioning step and no revocation
push.  The Share's lifecycle is enforced entirely at token issuance:</t>

<t><list style="symbols">
  <t>The OCM Server MUST stop issuing tokens for a Share when it ends,
whatever the cause: unshared by the Sending Party, declined by the
Receiving Party, expired, or administratively removed.</t>
  <t>Until the last issued token expires, the Protocol Server will continue
to honor it.  Revocation latency is therefore bounded by the maximum
token lifetime, which is why the issuance rules require short-lived
tokens in this mode.</t>
</list></t>

<t>Because the Protocol Server keeps no per-share state, there is nothing
for it to expire or reap.  Protocols that do allocate per-share state
are steered to Provisioned Integration (see Integration Modes); a
Protocol Server that nevertheless creates transient state in this mode
(such as login sessions) SHOULD bound its lifetime independently of the
tokens that created it.</t>

</section>
<section anchor="lifecycle-in-introspected-integration"><name>Lifecycle in Introspected Integration</name>

<t>Introspected Integration needs neither provisioning nor a revocation
push for credential validity: every authorization consults the OCM
Server, modulo response caching, so a revoked or expired Share stops
being served as soon as cached introspection responses expire.
Revocation latency is bounded by the <spanx style="verb">exp</spanx> horizon of the responses,
which the introspection endpoint MUST keep short (see Token
Introspection).</t>

<t>Note that introspection only validates credentials.  If the Protocol
Server allocates per-share resources, it still needs the Share
Revocation Request of Provisioned Integration to release them, which is
one reason the two modes compose.</t>

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

<section anchor="threat-model"><name>Threat Model</name>

<t>The threat model follows the Internet threat model described in
[RFC3552] and inherits the trust assumptions of [OCM].  It assumes that
the Sending and Receiving OCM Servers, paired Protocol Servers, and any
delegated Token Server have not been compromised and correctly enforce
the protocol and their local authorization policies.  Their
administrative interfaces, host operating systems, private keys,
credentials, and underlying storage are part of the trusted endpoints.
Compromise of an endpoint or its trusted infrastructure is outside the
scope of this specification.</t>

<t>An attacker is assumed to have extensive control of the communication
channel and may observe, block, replay, insert, modify, delay, or
reorder traffic.  TLS, HTTP Message Signatures, JWT signatures, and
authenticated introspection provide the protections described in this
specification against such an attacker.</t>

<t>An attacker may operate an OCM Server or Protocol Server of their own,
control a remote user, steal a bearer credential, or submit malformed
back-channel or front-channel requests.  An unpaired server can make
assertions under its own identity, but must not thereby gain access to a
pairing, a Share Record, or a Resource.  Implementations are expected to
verify pairing, authentication, identity binding, permissions, and
Resource scope independently.</t>

<t>Pairing creates an explicit administrative trust relationship.  A
paired OCM Server is trusted to provision authorized Shares, issue
tokens for valid grants, and provide truthful Share information.  A
Protocol Server is part of the Sending Server's trusted computing base
for every protocol it serves and is trusted to enforce identity
bindings, permissions, and protocol restrictions.  A delegated Token
Server is trusted with token-signing authority and with the Share and
identity information needed to issue credentials.</t>

<t>Provisioned and Introspected Integration disclose the full Share
Creation Notification payload to the Protocol Server with every
<spanx style="verb">sharedSecret</spanx> removed.  Depending on the Share, this can include the
sender, owner, Receiving Party, display names, Resource name and
description, Resource and Share types, protocol endpoints, permissions,
expiration, and extension metadata.  Provisioned Integration transfers
this information over the signed back channel before Resource access
and normally stores it as a Share Record.  Introspected Integration
transfers it through the additional introspection exchange and permits
the resulting response to be cached until its stated expiration.  In
addition to the Share information returned by introspection, the
Protocol Server receives the presented <spanx style="verb">sharedSecret</spanx> itself and may use
or retain it as permitted under Secret Handling.</t>

<t>Self-Contained Integration discloses slightly less information.  The
JWT presented to the Protocol Server contains the <spanx style="verb">ocm_ip</spanx> claim with
the protocol details, <spanx style="verb">providerId</spanx>, Resource type, and selected optional
Share metadata, while the enclosing JWT claims identify the issuer,
owner, and Receiving Party.  The same JWT form is used by Introspected
Integration, but Self-Contained Integration performs no additional
introspection request.  The <spanx style="verb">ocm_ip</spanx> contents are visible to the
Protocol Server and to every other holder of the JWT, including a
Receiving Party's user agent for applicable protocols.</t>

<t>Bearer tokens grant access to their holder until they expire or cease
to be accepted and therefore need to remain confidential.  The
cryptographic mechanisms authenticate assertions and protect exchanges
in transit; they do not establish that Resource content is safe.</t>

<t>The three modes make different availability and revocation trade-offs.
Provisioned Integration depends on delivery of lifecycle requests.
Self-Contained Integration cannot revoke an issued token before expiry.
Introspected Integration depends on availability of the introspection
endpoint and permits revocation only after cached positive responses
expire.  No mode prevents a required OCM Server or Protocol Server from
selectively or completely denying service.</t>

</section>
<section anchor="secret-handling"><name>Secret Handling</name>

<t>Provisioned and Self-Contained Integration avoid transferring the
Share's <spanx style="verb">sharedSecret</spanx> to the Protocol Server.  Introspected Integration
necessarily exposes the presented credential to the Protocol Server and
therefore has different secret-handling requirements:</t>

<t><list style="symbols">
  <t>The Integration API strips every <spanx style="verb">sharedSecret</spanx> from the provisioning
payload, and the <spanx style="verb">ocm_ip</spanx> claim does not contain one.  A Protocol Server
therefore receives no <spanx style="verb">sharedSecret</spanx> through either of those mechanisms.</t>
  <t>In Introspected Integration, the Receiving Server may present a legacy
<spanx style="verb">sharedSecret</spanx> on the front channel.  The Protocol Server MUST
successfully introspect the credential before relying on it.</t>
  <t>After successful introspection, the Protocol Server MAY use the
presented <spanx style="verb">sharedSecret</spanx> to access another protocol entry of the same
Share when this is necessary to serve the requested protocol.  For
example, a web application Protocol Server may use it to access a WebDAV
entry in the same multi-protocol Share, whether that entry is served by
another Protocol Server or by the OCM Server.</t>
  <t>Such use MUST remain within the Resource, protocols, permissions, and
parties identified by the successful introspection response.  The
credential MUST NOT be used for another Share or retained beyond the
period during which the introspection response may be relied upon.
Continued use after that period requires a new successful introspection.</t>
  <t>A Protocol Server that retains a <spanx style="verb">sharedSecret</spanx> for this purpose MUST
protect it as a bearer credential.  It MUST NOT place it in URLs or logs
and MUST delete it when it is no longer needed.</t>
  <t>No pairing secret exists; the back channel is authenticated by HTTP
Message Signatures against published keys, the front channel by JWT
signatures against the same keys, and introspection requests by HTTP
Message Signatures against the Protocol Server's published keys.</t>
  <t>The Protocol Server holds no signing keys for this protocol, with two
exceptions: a Protocol Server using Introspected Integration holds a
request-signing key, published at the JWKS URL exchanged during
pairing, and
a delegated Token Server (sketched in the note on delegating the token
endpoint) holds its own token-signing key, whose public part is
published through the OCM Server's JWKS.</t>
</list></t>

<t>The Protocol Server does handle bearer access tokens on the front
channel.  These MUST be treated as confidential, MUST NOT be placed in
URLs, and SHOULD NOT be logged or persisted beyond their lifetime,
consistent with the Code Flow considerations of [OCM].</t>

</section>
<section anchor="legacy-shared-secret-access-requires-introspection"><name>Legacy Shared-Secret Access Requires Introspection</name>

<t>Without the Code Flow, the only credential is the long-lived
<spanx style="verb">sharedSecret</spanx> itself, which the Receiving Server presents directly on
the front channel.  The Protocol Server cannot validate it on its own.
A Protocol Server MUST NOT accept a front-channel credential other than
a verifiable access token or a credential validated through Token
Introspection, except for the SSH public-key mechanism of [OCM].</t>

<t>Successful introspection authorizes the Protocol Server to rely on the
credential until the <spanx style="verb">exp</spanx> horizon of the introspection response.  This
includes using the credential for another protocol entry of the same
Share as described under Secret Handling.</t>

<t>Introspected Integration therefore reintroduces, deliberately and only
for compatibility, the per-request coupling to the OCM Server that the
other modes remove.  Deployments that do not need to serve legacy
Receiving Servers SHOULD NOT enable it.</t>

<t>The introspection endpoint is a sensitive interface: left
unauthenticated, it would let anyone test guessed or stolen credentials
for validity (Section 4 of [RFC7662]).  The signature and pairing
requirements of the Token Introspection section are therefore mandatory,
and the endpoint SHOULD additionally rate-limit failed introspections
per caller.</t>

</section>
<section anchor="trust-granted-to-the-paired-ocm-server"><name>Trust Granted to the Paired OCM Server</name>

<t>Pairing grants the OCM Server significant power over the Protocol
Server: every accepted Share Provisioning Request may consume resources
(storage, compute sessions) and instructs the Protocol Server to serve
content to third parties.  The allowlist is therefore REQUIRED, and an
empty allowlist means the Integration API rejects all requests.</t>

<t>The Protocol Server SHOULD apply resource limits per paired OCM Server
(number of Share Records, concurrent sessions, storage) so that requests
from one pairing, including excessive requests caused by malfunction or
an unexpectedly large workload, cannot exhaust it.</t>

<t>Conversely, the OCM Server places trust in the Protocol Server to
enforce the permissions and identity bindings of this document.
Operators SHOULD treat the Protocol Server as part of the Sending
Server's trusted computing base for the protocols it serves.</t>

</section>
<section anchor="self-contained-tokens"><name>Self-Contained Tokens</name>

<t>Self-Contained Integration shifts all authority into the token, with
three major consequences:</t>

<t><list style="symbols">
  <t>Revocation latency.  An issued token cannot be withdrawn; it can only
expire.  The normative cap on token lifetime in the issuance rules is
what keeps "unshare" meaningful in this mode, and implementations MUST
NOT relax it by issuing long-lived self-contained tokens for
convenience.</t>
  <t>Metadata exposure.  The <spanx style="verb">ocm_ip</spanx> claim is readable by anyone who holds
the token.  For <spanx style="verb">webapp</spanx> Shares in particular, the token transits the
Receiving Party's user agent, so the embedded Share metadata is visible
to the Receiving Party.  The OCM Server MUST NOT place information in
the <spanx style="verb">ocm_ip</spanx> claim that the Receiving Party is not entitled to see, and
SHOULD keep the claim minimal.</t>
  <t>Allowlist is mandatory.  In Provisioned Integration, pairing is
implicitly enforced by the existence of the Share Record.  In
Self-Contained Integration the issuer allowlist is the only thing
standing between any internet-hosted JWKS and Resource access; the
requirement to check the token's issuer against the pairing allowlist
before honoring an <spanx style="verb">ocm_ip</spanx> MUST be enforced.</t>
</list></t>

<t>Provisioned and Self-Contained Integration MUST NOT be mixed for a
single Share.  If a provisioned Share's tokens also carried <spanx style="verb">ocm_ip</spanx>
claims, a token issued before a Share Revocation Request would continue
to grant access through the self-contained path until it expired,
silently surviving the revocation.  This is why the issuance rules
forbid the <spanx style="verb">ocm_ip</spanx> claim on tokens for provisioned Shares, and why
verification gives an existing Share Record precedence over the claim.
Introspected Integration, by contrast, composes safely with Provisioned
Integration: the introspection response names the Share Record via
<spanx style="verb">client_id</spanx>, and revocation of the record takes effect immediately.</t>

</section>
<section anchor="signature-and-token-verification-considerations"><name>Signature and Token Verification Considerations</name>

<t>All the verification rules of [OCM] for HTTP Message Signatures apply to
the back channel, in particular: exactly one <spanx style="verb">ocm</spanx>-labeled signature,
required covered components, <spanx style="verb">created</spanx> freshness, <spanx style="verb">keyid</spanx> domain
matching the sender domain, and rejection of symmetric algorithms.  Two
considerations deserve emphasis in the Protocol Server context:</t>

<t><list style="symbols">
  <t>Reverse proxies: when TLS terminates in front of the Protocol Server,
the internally observed URI differs from the signed <spanx style="verb">@target-uri</spanx>.  The
Protocol Server MUST reconstruct the public URL for verification, and
MUST only trust forwarding headers set by its own proxy.</t>
  <t>Issuer/key binding: on the front channel, the key used to verify a
token MUST be fetched from the JWKS of the token's own <spanx style="verb">iss</spanx> host, and
the Share Record lookup MUST use that same host.  An implementation that
verifies against one domain's keys but looks up records under another's
would allow cross-tenant confusion on multi-tenant Protocol Servers.</t>
</list></t>

</section>
<section anchor="denial-of-service"><name>Denial of Service</name>

<t>The Integration API performs the allowlist check before fetching any
keys, so unsolicited requests from arbitrary servers are rejected
without outbound traffic.  Front-channel token verification does fetch
JWKS documents from token-asserted issuers; implementations SHOULD
rate-limit verification failures and SHOULD restrict JWKS fetching to
the domains of paired OCM Servers, since no unpaired issuer's credential
can ever be honored in any integration mode.  In Introspected
Integration the Protocol Server additionally generates one introspection
request per uncached front-channel credential; implementations SHOULD
apply negative caching with a short lifetime so that a flood of invalid
credentials does not translate into a flood of introspection traffic
towards the OCM Server.</t>

</section>
<section anchor="underlying-security-specifications"><name>Underlying Security Specifications</name>

<t>This specification relies on the base Open Cloud Mesh protocol [OCM],
HTTP Message Signatures [RFC9421], JSON Web Keys and JWK Sets [RFC7517],
Digest Fields [RFC9530], JSON Web Tokens [RFC7519], OAuth 2.0 Token
Introspection [RFC7662], and the JWT Profile for OAuth 2.0 Access Tokens
[RFC9068].  All security considerations in those specifications apply
to implementations of OCM-IP.</t>

<t>These specifications need to be considered together.  A signature or
token is only as trustworthy as the provenance and protection of its
key, a signed <spanx style="verb">Content-Digest</spanx> provides content integrity only when both
the signature and digest are validated, and an active introspection
response grants authority only within the authenticated pairing and
until its stated expiration.</t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<section anchor="json-web-token-claims-registry"><name>JSON Web Token Claims Registry</name>

<t>The following claim is to be registered in the "JSON Web Token Claims"
registry (using the template from [RFC7519]): Claim Name: ocm_ip Claim
Description: Open Cloud Mesh Share information for self-contained
Protocol Server integration Change Controller: IETF Specification
Document(s): the present Draft, once in RFC form</t>

</section>
<section anchor="oauth-token-introspection-response-registry"><name>OAuth Token Introspection Response Registry</name>

<t>The following member is to be registered in the "OAuth Token
Introspection Response" registry established by [RFC7662]: Name: ocm_ip
Description: Open Cloud Mesh Share information for Protocol Server
integration Change Controller: IETF Specification Document(s): the
present Draft, once in RFC form</t>

<t>No other IANA actions are required.  Neither the Integration API nor the
introspection endpoint is exposed at a Well-Known URI; their locations
are exchanged during pairing.</t>

</section>
</section>
<section anchor="copying-conditions"><name>Copying conditions</name>

<t>The author(s) agree to grant third parties the irrevocable right to
copy, use and distribute the work, with or without modification, in any
medium, without royalty, provided that, unless separate permission is
granted, redistributed modified works do not contain misleading author,
version, name of work, or endorsement information.</t>

</section>
<section anchor="references"><name>References</name>

<section anchor="normative-references"><name>Normative References</name>

<t>[OCM] Lo Presti, G., de Jong, M.B., Baghbani, M. and Nordin, M.  "<eref target="https://datatracker.ietf.org/doc/draft-ietf-ocm-open-cloud-mesh/">Open
Cloud Mesh</eref>", Work
in Progress.</t>

<t>[RFC2119] Bradner, S. "<eref target="https://datatracker.ietf.org/doc/html/rfc2119">Key words for use in RFCs to Indicate
Requirement Levels</eref>",
March 1997.</t>

<t>[RFC7517] Jones, M., "<eref target="https://datatracker.ietf.org/doc/html/rfc7517">JSON Web Key (JWK)</eref>", May 2015.</t>

<t>[RFC7519] Jones, M., Bradley, J., Sakimura, N., "<eref target="https://datatracker.ietf.org/doc/html/rfc7519">JSON Web Token
(JWT)</eref>", May 2015.</t>

<t>[RFC7662] Richer, J. (ed), "<eref target="https://datatracker.ietf.org/doc/html/rfc7662">OAuth 2.0 Token Introspection</eref>", October 2015.</t>

<t>[RFC8174] Leiba, B. "<eref target="https://datatracker.ietf.org/html/rfc8174">Ambiguity of Uppercase vs Lowercase in RFC 2119
Key Words</eref>", May 2017.</t>

<t>[RFC8615] Nottingham, M. "<eref target="https://datatracker.ietf.org/doc/html/rfc8615">Well-Known Uniform Resource Identifiers
(URIs)</eref>", May 2019.</t>

<t>[RFC9068] Bertocci, V., "<eref target="https://datatracker.ietf.org/doc/html/rfc9068">JSON Web Token (JWT) Profile for OAuth 2.0
Access Tokens</eref>", October
2021.</t>

<t>[RFC9421] Backman, A., Richer, J. and Sporny, M. "<eref target="https://tools.ietf.org/html/rfc9421">HTTP Message
Signatures</eref>", February 2024.</t>

<t>[RFC9530] Polli, R., Marwood, D., "<eref target="https://datatracker.ietf.org/doc/html/rfc9530">Digest Fields</eref>", February 2024.</t>

</section>
<section anchor="informative-references"><name>Informative References</name>

<t>[RFC3552] Rescorla, E. and Korver, B.  "<eref target="https://datatracker.ietf.org/doc/html/rfc3552">Guidelines for Writing RFC Text
on Security
Considerations</eref>", BCP 72,
July 2003.</t>

<t>[RFC4918] Dusseault, L. M. "<eref target="https://datatracker.ietf.org/html/rfc4918/">HTTP Extensions for Web Distributed
Authoring and Versioning</eref>",
June 2007.</t>

<t>[RFC6749] Hardt, D. (ed), "<eref target="https://datatracker.ietf.org/html/rfc6749">The OAuth 2.0 Authorization Framework</eref>", October 2012.</t>

<t>[RFC8693] Jones, M., Nadalin, A., Campbell, B., Bradley, J. and
Mortimore, C., "<eref target="https://datatracker.ietf.org/doc/html/rfc8693">OAuth 2.0 Token Exchange</eref>", January 2020.</t>

</section>
</section>
<section anchor="appendix-a-examples"><name>Appendix A: Examples</name>

<t>The first set of examples shows Provisioned Integration:
<spanx style="verb">cloud.example.org</spanx> is the OCM Server and <spanx style="verb">hub.example.org</spanx> is a
Protocol Server running a computational notebook platform, paired with
<spanx style="verb">cloud.example.org</spanx> and serving the <spanx style="verb">webapp</spanx> protocol.  Alice
(<spanx style="verb">alice@cloud.example.org</spanx>) shares a notebook with Bob
(<spanx style="verb">bob@receiver.example.org</spanx>).  Self-Contained and Introspected
Integration examples follow at the end.</t>

<section anchor="share-provisioning-request-1"><name>Share Provisioning Request</name>

<t>The OCM Server pushes the Share to the Protocol Server before notifying
the Receiving Server.  The body is the Share Creation Notification with
every <spanx style="verb">sharedSecret</spanx> removed (line breaks in the signature headers for
display purposes only):</t>

<sourcecode type="http">
POST /services/ocm/shares HTTP/1.1
Host: hub.example.org
Date: Wed, 10 Jun 2026 14:00:00 GMT
Content-Type: application/json
Content-Digest: sha-256=:hj3LWOIuryd4XbzFhoHa6YMUbhtzMdMT3e9Bxpu2Lm0=:
Content-Length: 542
"@signature-params": ("@method" "@target-uri" "content-digest" \
  "content-length");created=1781186400;\
  keyid="cloud.example.org#key1";alg="ed25519";tag="ocm"
Signature: ocm=:[signature-value]:

{
  "shareWith": "bob@receiver.example.org",
  "name": "analysis.ipynb",
  "providerId": "7c084226-d9a1-11e6-bf26-cec0c932ce01",
  "owner": "alice@cloud.example.org",
  "sender": "alice@cloud.example.org",
  "shareType": "user",
  "resourceType": "file",
  "protocol": {
    "name": "multi",
    "webdav": {
      "uri": "7c084226-d9a1-11e6-bf26-cec0c932ce01",
      "permissions": [
        "read",
        "write"
      ]
    },
    "webapp": {
      "uri": "https://hub.example.org/services/ocm/open",
      "viewMode": "write"
    }
  }
}
</sourcecode>

<t>The Protocol Server stores the Share Record under (<spanx style="verb">cloud.example.org</spanx>,
<spanx style="verb">7c084226-d9a1-11e6-bf26-cec0c932ce01</spanx>) and responds:</t>

<figure type="http"><artwork><![CDATA[
HTTP/1.1 201 Created
Content-Type: application/json

{ "status": "stored" }
]]></artwork></figure>

<t>The OCM Server then sends the Share Creation Notification to
<spanx style="verb">receiver.example.org</spanx> per [OCM], with <spanx style="verb">must-exchange-token</spanx> in the
protocol requirements and with the <spanx style="verb">webapp</spanx> entry pointing at the
Protocol Server (and a fresh <spanx style="verb">sharedSecret</spanx>, which only the Receiving
Server learns).</t>

</section>
<section anchor="access-token"><name>Access Token</name>

<t>When the Receiving Server performs the Code Flow at
<spanx style="verb">https://cloud.example.org/ocm/token</spanx>, the issued JWT carries the JOSE
header:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "typ": "at+jwt",
  "alg": "EdDSA",
  "kid": "cloud.example.org#key1"
}
]]></sourcecode></figure>

<t>and the Claims Set:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "iss": "https://cloud.example.org",
  "sub": "alice",
  "aud": "bob@receiver.example.org",
  "client_id": "7c084226-d9a1-11e6-bf26-cec0c932ce01",
  "iat": 1781186460,
  "exp": 1781190060,
  "jti": "f3b9c0aa-2f6e-4d57-9d24-6f0a1f6d9b11"
}
]]></sourcecode></figure>

</section>
<section anchor="front-channel-access"><name>Front-Channel Access</name>

<t>Bob's user agent form-POSTs the token to the advertised <spanx style="verb">webapp</spanx>
endpoint:</t>

<figure type="http"><artwork><![CDATA[
POST /services/ocm/open HTTP/1.1
Host: hub.example.org
Content-Type: application/x-www-form-urlencoded

access_token=eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFZERTQSIs...
]]></artwork></figure>

<t>The Protocol Server verifies the JWT against the JWK Set advertised
at the <spanx style="verb">jwksUri</spanx> of <spanx style="verb">https://cloud.example.org/.well-known/ocm</spanx>, looks
up the Share Record by (<spanx style="verb">cloud.example.org</spanx>,
<spanx style="verb">7c084226-d9a1-11e6-bf26-cec0c932ce01</spanx>), checks that
<spanx style="verb">alice@cloud.example.org</spanx> equals the stored <spanx style="verb">owner</spanx> and that
<spanx style="verb">bob@receiver.example.org</spanx> equals the stored <spanx style="verb">shareWith</spanx>, and then
starts (or resumes) the notebook session for the Share.</t>

</section>
<section anchor="share-revocation-request-1"><name>Share Revocation Request</name>

<t>When Alice unshares the notebook (body shown without the signature
headers, which are as in the provisioning example):</t>

<figure type="http"><artwork><![CDATA[
POST /services/ocm/revoke HTTP/1.1
Host: hub.example.org
Content-Type: application/json

{
  "sender": "alice@cloud.example.org",
  "providerId": "7c084226-d9a1-11e6-bf26-cec0c932ce01"
}
]]></artwork></figure>

<figure type="http"><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{ "status": "revoked" }
]]></artwork></figure>

<t>A repeated revocation for the same <spanx style="verb">providerId</spanx> returns <spanx style="verb">{ "status":
"gone" }</spanx> with HTTP status 200.</t>

</section>
<section anchor="self-contained-integration"><name>Self-Contained Integration</name>

<t><spanx style="verb">dav.example.org</spanx> is a stateless WebDAV gateway in front of an existing
storage system, paired with <spanx style="verb">cloud.example.org</spanx> for Self-Contained
Integration.  No provisioning takes place; the gateway exposes no
Integration API and keeps no Share Records.  Alice shares a folder with
Bob, and the OCM Server advertises a <spanx style="verb">webdav</spanx> endpoint at the gateway in
the Share Creation Notification.</t>

<t>When the Receiving Server performs the Code Flow at
<spanx style="verb">https://cloud.example.org/ocm/token</spanx>, the issued JWT carries:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "iss": "https://cloud.example.org",
  "sub": "alice",
  "aud": "bob@receiver.example.org",
  "client_id": "receiver.example.org",
  "iat": 1781186460,
  "exp": 1781186760,
  "jti": "0d9e3c4b-5a6f-4e21-8c37-2b1a9f8e7d65",
  "ocm_ip": {
    "providerId": "9b2e41d7-aa31-4a02-9f0d-3c5e8b7a6f10",
    "resourceType": "folder",
    "name": "dataset-2026",
    "protocol": {
      "webdav": {
        "uri": "9b2e41d7-aa31-4a02-9f0d-3c5e8b7a6f10",
        "permissions": ["read"]
      }
    }
  }
}
]]></sourcecode></figure>

<t>Note the short lifetime (300 seconds): the Receiving Server re-exchanges
the <spanx style="verb">sharedSecret</spanx> at the <spanx style="verb">tokenEndPoint</spanx> for a fresh token before each
expiry, per [OCM], and unsharing takes effect within at most that
lifetime.</t>

<t>The Receiving Server accesses the Resource directly:</t>

<figure type="http"><artwork><![CDATA[
PROPFIND /dav/9b2e41d7-aa31-4a02-9f0d-3c5e8b7a6f10 HTTP/1.1
Host: dav.example.org
Authorization: Bearer eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFZERTQSIs...
Depth: 1
]]></artwork></figure>

<t>The gateway verifies the JWT against the JWK Set advertised at the
<spanx style="verb">jwksUri</spanx> of <spanx style="verb">https://cloud.example.org/.well-known/ocm</spanx>, finds no
Share Record for (<spanx style="verb">cloud.example.org</spanx>, <spanx style="verb">receiver.example.org</spanx>),
confirms that
<spanx style="verb">cloud.example.org</spanx> is paired for Self-Contained Integration, and serves
the PROPFIND read-only, scoped to the <spanx style="verb">uri</spanx> in the <spanx style="verb">ocm_ip</spanx> claim.</t>

</section>
<section anchor="introspected-integration"><name>Introspected Integration</name>

<t><spanx style="verb">legacy.example.com</spanx> is a Receiving Server that does not support the
<spanx style="verb">exchange-token</spanx> capability.  Alice shares the same kind of folder with
Carol (<spanx style="verb">carol@legacy.example.com</spanx>).  The Share Creation Notification is
a legacy [OCM] share: the <spanx style="verb">webdav</spanx> entry points at <spanx style="verb">dav.example.org</spanx> and
carries a <spanx style="verb">sharedSecret</spanx>, with no <spanx style="verb">must-exchange-token</spanx> requirement.
<spanx style="verb">dav.example.org</spanx> is paired with <spanx style="verb">cloud.example.org</spanx> for Introspected
Integration and holds a request-signing key published at the JWKS URL
exchanged during pairing (<spanx style="verb">https://dav.example.org/jwks</spanx>).</t>

<t>The Receiving Server presents the secret directly, per the legacy
resource access flow of [OCM]:</t>

<figure type="http"><artwork><![CDATA[
PROPFIND /dav/4f6a2c81-77b0-4c0e-9e64-1d2f3a5b6c7d HTTP/1.1
Host: dav.example.org
Authorization: Bearer shr-9wq4xkz7vmd2
Depth: 1
]]></artwork></figure>

<t>The credential does not parse as a JWT, so the gateway introspects it
(signature headers as in the provisioning example, but signed by the
gateway with keyid="dav.example.org#key1"):</t>

<figure type="http"><artwork><![CDATA[
POST /ocm/introspect HTTP/1.1
Host: cloud.example.org
Content-Type: application/x-www-form-urlencoded

token=shr-9wq4xkz7vmd2
]]></artwork></figure>

<figure type="http"><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
  "active": true,
  "iss": "https://cloud.example.org",
  "sub": "alice",
  "aud": "carol@legacy.example.com",
  "exp": 1781186760,
  "ocm_ip": {
    "providerId": "4f6a2c81-77b0-4c0e-9e64-1d2f3a5b6c7d",
    "resourceType": "folder",
    "name": "dataset-2026",
    "protocol": {
      "webdav": {
        "uri": "4f6a2c81-77b0-4c0e-9e64-1d2f3a5b6c7d",
        "permissions": [
          "read"
        ]
      }
    }
  }
}
]]></artwork></figure>

<t>The gateway serves the PROPFIND read-only and MAY cache this response
until <spanx style="verb">exp</spanx>.  When Alice unshares the folder, introspection starts
returning <spanx style="verb">{"active": false}</spanx>, and Carol's access ends as soon as the
cached response expires.</t>

</section>
</section>
<section anchor="changes"><name>Changes</name>

<t>This section collects the changes with respect to the previous version
in the IETF datatracker.  It is meant to ease the review process and it
shall be removed when going to RFC last call.</t>

<section anchor="working-group-version-00"><name>Working Group Version 00</name>

<t><list style="symbols">
  <t>First Working Group version, adopted by the OCM Working Group.</t>
</list></t>

</section>
<section anchor="individual-submission-version-01"><name>Individual Submission Version 01</name>

<t><list style="symbols">
  <t>Added the threat model.</t>
</list></t>

</section>
<section anchor="individual-submission-version-00"><name>Individual Submission Version 00</name>

<t><list style="symbols">
  <t>Initial version.</t>
</list></t>

</section>
</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>This protocol generalizes a working integration between Nextcloud and
JupyterHub developed at SUNET, and builds directly on the Code Flow, JWT
access token, and HTTP Message Signature work in the Open Cloud Mesh
specification.  Thanks to the OCM community for the discussions that
shaped the webapp sharing design this document extends, and in
particular to Enrique Pérez Arnaud and Matthias Kraus who helped shape
the format of this protocol.</t>

<t>Work on this document has been funded by [Sovereign Tech Agency][sta]
through the <eref target="https://www.sovereign.tech/programs/fund">Tech Fund</eref>, with a specific <eref target="https://www.sovereign.tech/tech/open-cloud-mesh">project</eref>.</t>

</section>


  </middle>

  <back>








  </back>

<!-- ##markdown-source:
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
pKlntnELg32GTEbpDbShpQjCMS+FZoth6qXhEZEVoDARPcWCgIf1ko2kXanO
ehYQt5oS1LVNp7ni+iDk1KPDx/cnj0SDhPwSA0fehp0Y+Bc0Uye2CH4Pgt0t
a/aFcZUecwpIu3lRhMjkGJyTWDC4UtuxQN9hHGNKfXUu2DPXzMNjyRpgUveR
d3k7NB0pQ50b2ynJmjU8KyTIdipbBOfpZI7HaeZHSd6x6SAIeFgMS5Zsvq8v
fV3JJ5cQ/BGvsg3QUPo6ohm1tgivuoJUGPvB1eOOPtPZK7S1KvT19SNpooTN
Vb12SKCVNpusYUYGZeWQ9Gq/7wIS2kg4EcGsfKBoFBrrMZ4jJOGpoLPbGZji
iECxLqzAFoTOXS1r02fzt4NzAebfO1qQkRGLZdV6Cjdmb2I5+VXLbDrZBRmC
yowtAazC1nxFA8Jn24g3sRpmbHoROvwwQrCQKAMbVBqc+DbejtouYeH/iF53
VOCClyA6A5irjCDADArT0igyhTHYUdefCjmFrkOCM/yOJOxg67yM9yWn59s1
Tu75+feJqxEMwbXWXrStBDGAbpEcxkIdEjjNa03vCYJd8Egc1UbLGB915/wF
kn9GaoQwctcE+uEViVJCFlCiKHDoGehksEaFsCfWrXTCdKxMDn+utZAJF/D6
O1rWi9fx8yABIpd4i25g+WmCmnec3mXWZda8Z8nPY9uX7UK96HHwqmCGEUhx
CS1g0AXC0oY4wWWbwPGs9cMDC8osgcn0OWf8nWWuIVH4FlOm11rNQ7lA5lOz
eZ2hNVWyS+5xl1nuC6dj+6x15nqeup6s4KCtX7lskNxxTxKT0f5u+GeRkxSb
Ypzgn+fS1yhn2kbN/lNQI+5c5JXPKMDb+TswLc+tjmTPa3+R7tDmRiMn59Jv
XgNO3KJeZx45csh2iETdVcJDPlS0n8Z1xj1zhIVSHZWozs6/f/L++S/Pnj99
9fLN82ezoOnTERcnLzdFVaAdjxqLJCAz4QVFmVwM5jJ1UZXjWaK9fAvt76TV
8HU1xJydoBveX3xwZZsc4xfcoxctY3QjJXZghA+UbQ3SPZaNkkKkZY2MyOtc
J1M6OnCQJwpGj3jTsrAsQLRvnkCu6yq0e9WJNpR6wCAWVfaqwY/GVr70nGhO
KEquxUc181396F0AyRjK6egGjEuJvbwd/g/54MN9UYkVx+/HwGi+KIondASV
CWmoJwqW2mRfis1uY+ficUQKsqA+BpfZVWt86oLk0G2R8krImpAIkgkNXJGe
sGZQPIcCOC7RWxabgrG5IN43WHVEe56nPYDvVKIJJ5bUiXtygExRXIVPUwpz
yp4hiSmHG2n9CqpUpQhZldahIm5i6zQiClJAklojq0yde5EWZk/jBK0vDGgg
KDUm5R/uzc12166j5Ltr0ox4FPYmMNLZFdzNTKdc4RhDnZVZu+DWk1kamB+e
EjieJPLMP1/kKQ8DA/THxdjvkx8JUD+4Oo7LYUhIXRZlaXOQaDV73cjf9+ov
xJUUT45khns3OScmDFfa1i64g/iHFjHPBo6AYXyglbG9hhOLSppiTx3XTT1+
ES6Lwk1jqZOwcDp0oSk2bYhdsuMDSfKAqpOyrdcuW/AzYGtZYqLovpx17PJc
enGMmC0MovM/QM7B9giEyDCtf4C4sWyiSMVIvhI9O5gXY0O52HKrsgQFR2Fg
FOWIQ6vFnKm4+Sw8x9KYiqiKD/UY3GlPV3hmdqzygoNA/rmuhJwlONF0zOIy
cfC1lQI3JFuzSY1Q/6U4P7uy9rNHFF+luubMVqQRawTXqZ3LAoN4NNxzkQBW
FOpsay7xkQzwcMSmlVtNzfDpic4Mh8i1RkriHPZe2qRCMpGjxZS496Xcal+D
CqdyBrJDCgNo/TwQ27T+cVPiPT0WrXcuLDkHMWi3HYoWofS0FvqABTne/IKR
j8z+AbfYOFliUEtyJJ694MtagLFUUttyM64R7KoAywhcj6exlHwMf4K3KYNi
HhxRUxGdo/cLH6dqMB1+9/79UwmpVLDLVXFzvxgCRW+ZrsxSylH6guHS0hDW
1xHciVQVgsfokI5UxLYuAeX6OIc9l8EBSzh6S2xxGziJG+5YrQAnivOJ0jRB
rEz83EJgJNEZ3NYlJick/FDEVjej01fZgnGvuOxsuOIR0/5jXoEI7H1vH/KL
Ee6IobIYCkVzCLedB6fjyfbTmlPKFvBbCsu9PTukBlp7TVGtmozp84Twyetg
a7xIZGHr8W0J3BOMYHdgHjNBE68p6QWacjL8WpwGVLVNXep4YQk2u0ruY3xK
VKy45Fam6KGi2Z9KwB1LW+DzjsRbsSIzgj6usQCD4ccw65gswsV4dZ6Otf5J
owZFqS27cNGZUFQI4M4GUXNh4ItA23BAgxmyDgOrKjdZ0dTRS9O+yCMju256
Gp+nEDsDYaWxTqxtTYnhOGQBynGr9uvWyKRqd/MN0tspn5cJ0vQI3B4CprUc
aLIV4a3zA5A2DXwlXB6aF+4jrk6WRowZiLxBuYCHsZPmyxfUFM2WN2XaSSmN
shHCZ+ZRdb+MGugQgPqL6GFX6+TuF5SZp70MfRhJp11hIwt8EMJiKWO0F6Fa
LBnZnSgSushwFYGoUMp2XWypyVGfBr1wZzOgN/MgHdyTKGWD13gmOidYGWma
SoRZtm4DlyO+s1e/O9hrqWgDARMWFH3lRsgcU/gVtiAkGzOk4yedyGht0hHB
y2nOQxfCyEK0/ZVwNwwwBTD2JJL6pj+PHGvFLyeKcnNVVlnlBWPFy4aVt5tj
oPV6J7QxgdFgghaNeNdRuxDLQstaTHpYlHJfW+NE+oGMNCDgsdOkxx0LXOuD
Z7RrXbWF64lRMFOS3+SIqbZSTpOlMSQ7xdGjQOaUYeqCb9S/GKfO4xD3vs4s
0yr1yEwHmkCPprJ4C4g+oaqELsPIL/suw0aUdnLgyn1/FW0jcg+lZGPIEhaN
QoqGXXDsW47gH0xJtoK3DaXUnn4QxjWXKMiqsvUAfrFEaPBq9QudAOo3ybki
eDxyAhHDpaZxCQshZrorNSfXaZm4uaQRGn2kjaX3yvr9Zs7BqIYrHyTULCyA
lvWjx6pKuVlV9TskqMBrCfrO8+naarIa4UuT7+GakinJ9nV9k5MF710WF2u0
6rgxXiDvwFQzaAP02mD3yjmU6XggEWurR2Nm5jRiYnjv94b1IavohG153SX0
rvuaTH4h/XdFDFTAzZBPS3qjkQUke5UDG1rQ3GDCwwvgXRig5lqDjJGPscre
M98CN2nDkh8z2EdQi4vtNCrZGr55yOzV210ZA3xYtzCmAiudrD3EUHav+DkO
KgWZSg5nuYyPjRtStMWl1lolQ/eLrwv76J2Gn668kMoC/TbDh5G5m0QbdF6r
Gd5xDACgmvxC1IhszkVzte1qePgWPD9XgxXmEBPP4lINiZgtS65gChGDiNyn
YQoKweY/2S92IBdekYSolVf51HmIWoCJlp7XEDv7DBtemfWUknBhBfAyn9Sr
FczqmJD2cvcS96e4jAtlOsbPPZtQ0j0c2CBYiR8IVN4jijRPx4M13liC1xrq
TOuS155gToLINIZcBYFFErlHB9JKAJmwBTS9KI8+S+mHLVnf7w0QYpWlCUdH
cQfWaBdTNgd21ZWGc4qFEuOGArVvt+yZ6uxzXSytbm2CxKFFrP32lkmmyvGk
MccvN+6MFYpfqzEstKVnsxw2DKq7Dcu9gCdrefegTNoGxGP2MbQ3t+1IGyrL
+u6nQMVkc1nyuNpXK1y06gsrcdGWjbNB7j2sfq3q3jSLKSFxRtqwNdV/qNzA
YPnLfRWbgzAQ1NBaSzlCpjTcnmhPG2zJQ6PR65sVHBZwSzvXl7Y1wgUhV57Q
kXI3GbBMBvNhEj83o4YJep4s5bOq1nDtAPCaAE5eHoSNSwzy8sa9Chv5iPzK
nf8irdS9rgcRrHiQhUoysN4oBfvDrYCC3g7MFmmHL6a+I2XLOnmlotU47/zK
6Gv34g1NnwQIV+IcYxo75QARVSZwYd5NinS02nXAv9aKUY8oWZ42tsYRB5cX
LwtKaiw+VN9LaDLU2MQHKc1SjmCborakf2PhZ1dYlV0xEhT70yW7bc0tTSib
tOSKKelpitXIfG/bcjmDvXI5+nq0yfswJsYL2q4b/Tp47ge9a6jXMZ00NQfU
S+nFglwBKk0as+cXnW2lwoWgrWuOJLTVRWdTgAyNocr4RpxjfAHQZ9oOW5qv
c6EQw4UDd6uHi4LlHyacbG04LWwQnvYFEN4EDELT9q+1p0QaylX9lIZUqdxg
IAPSRkFcrn/5SJaeC/Wr2q+785ogOfwixyYua2PbY7RDvUUZgzlq3fDjMqVN
nXhP/S1tziVmGsdedDCH7SdqcurYLLh1RjLUOsMaU0fKXiCBwzBiQyNlvI/A
5ARs7vF5+k513Er5fAQYQrqYDALL8xUyFY7zvar0m+dMWsQZM9+eD+v86IhR
5gQPmODUfC43qrzm3ByIjbZgZmcrpzAJoQlmgrBR2ZXH7+8I2BZB7sfv54N5
TSZFIJG4nIg9KHRf71VORcTWPwnNZ/AYPntcEBbQe1JOHsSCJLYHowB+17ee
7WFBpBaFLXijm1ga4hDYGt+i0xbRsK2mAyzmjsVH2HajELj3crVq0Qq2PwMX
yYcM8MoUqe7zfXs7dCBZqa3xHCP/+fey1ScEyVRzzl/N8zE1acPFw6hpzjFe
KfuKN1br1Q6nafco4wI9Toojth4k3Lu1r4+vNa8CEsaxUND1XNowRBryckdJ
uADshucPNy/FrQn73RXs9UkX47yZaGHeot5tS68uL6DSluZvws9KnjIHXzn2
qnzdFl7h9zZjY1Gs6z6jiScfcq6/InTCh/HkOFGBtBgpDVOQZ/CQFfIYBAqX
staMsSzzTjnnOnxlarjG0qjt6hJzpy7ebWy+AZ3kQ0usFfHrSuApKPlSUuWA
D0Y2wEDdvcUAZ41fUbGBWxEtmqubtlOgYD8fBYdrPiFoGbUfj5N8LSGuEStO
+TnMlVPG5jvqs+gihHG+xiWBhOAj2hykvjCWj5yPWG7lws8RuuDM649IUaM9
iG20QAn/sfEACOZQEsSp5GVyDxbDlg4nekdFAu1Fo2EgeuWiWSqviyym690S
4KKUGUTT8SbfbDEqZH/t6Aj69N6/UtdfLEx3EZ/rYZz65ooY3OZNvwGNOax2
WHKEOyyAQKZUB7NrJDCgbonM4ZGtoLTVFeTr4+mwRpALOKLobluO74gBSagt
Mmgx07qrBHaClV0gzzRRiRFqbK9OaGUOGoj6yr+sM9yBdN7BvUBxkGu/RG+H
kVUhya4R+vO4wCjoK4YbI8qEOvy9Vp1OzVvbakPWwPE09iIwg9lDRxYxnD10
NAIWjmaThxq5CgJTzEy6Nx/QrouVbCyX8aOadWt+Wh5IinJmv9ZcLk7VAQuh
deyjmjgZHgQaXYmg7QGFnTRs2aKL930gi1hriRbZltRwACDUhYxQg6BiL7mq
F3F/BwK0PKCzBfPIZkDicZrR6kZ5css5hNnoL8Q4fGUBn85qGyTTY76xBe7G
ivgb0b95LWkLDtk5fop+IT8CfEmJza8svem6ZrvfFUEJtbktU+J8dyItp5hc
0SePkCD3YAFbVKIkrT2wCHG5tDJW8y7ETM+ZCK2lGs6kDBU2iAPtpdAKNlnH
qIZiqL/w5dBRLNU4yIOuUIR5I6uKboUIg01G/cCf+FLZ6kaKtY4Xl6iXjpbb
hnELDgdlQzGO3mGAfYDTiXuOoMtQ9TQHew4MTyVmJRIF0jIZawQKwaBNpMkN
+aWc3wrSsxRY8O0JqhPFSky3S75q7TA8911nwA7NSOjREib4dT3q7ekMDST9
98yE7wpuii8aoAr4LBl7mPWrCL6y/iiVvXNNwTJiWkef0oN5k/NIb7OvlIVs
Px8MHSa9fN66UCBQ6yLNNFvQNrxOyQhbJj9UP8BlR5SrcBQcjbblvBiMnKug
5FBJb5ZarUG+CviepG0jwXOkM2RQ8LHF6PqSt7jFshMJ6aiHQZ2TCH6VYbWV
ADA5cYaF2OiSj7Dmne2LLXIhdnzK4lLsNM62WRAtV0lTH0vhcCg2m3xZkMcj
ajSwxgd4y2LgKMgWuvtwnR5XKeJyjADubKdaE4f/0lCmnwVk/tRDZkL9ZHKP
NSI1NjfWbyiTet1kqMAD+5alUZ8VE7AxRZ3leF5/VZDwKhmgcyJL+LI2UZAF
3D7y5cDwXWdt0Y4ZY2Rff+nUskCzDnfyFySR5tAqduRhQiaClcF9OOxRr4Zu
mBrZTyArydURBOUy+fH9S0l+ea1mBfUy+6ZDu7ObYKtlCaYPxkVwT4njwCKT
o28YHiQfMOBVs6TpLNrJJhVSZZxwLl9uiQ9+7uqw8O2pzcVLktB3MNwhpujZ
YIqJtT/+jGxsEFoC9stMQPfEDGK5x6RAKsRnM9fGIcTZhHom1QxiVBRW1592
W77xTmkTKJSMF4k9GFha9BORQ17UGPe2bc1DUV8EWeDtwVTZyhFWEKWES74C
u88jOmaqAWkIhvHGHXd1j1qFxUhpPv7PwHLLCIt7zmlh9rRip8xCO7rA52Ot
KmqFZleoLgxH1EE3gVVKsGiUmCHpUwZiHQQmOLmtY4O3PDhGWwnZztwO0Psi
iMcNlA1TGJfGY0K6HFl6iiUzYiK3vE6Pe7axtCv3ggXBU6RQsfVDtwpI5K1l
p0TEHa90O9zzVpltq9rham3zCBdsQUYFJrKa55YGq3AmUsDoncSZXhNbYz13
zQ+TgJlM4TFuZBmiHixFJYFftO/ISKR0dG5ZG1Ta1kSqU7S0nQs6ejRGWbKC
E8L9Grg9qY+Udwl1cgVKrhaiNlreZb6+lZ0F0oL43nsJTjwoPzrkva2pOA94
IfDkxLh4TgvatAF5tuA7g1Yt690S1ePaBT+FSXZMcdoeaylz+/6Uz5M/o8TA
7SeUiK1rQJaaZwVyVCdCdUqX37977F/utfMgev7UdfwYCkq7WJ4DM4y2DEmC
liHGbxmCJkSrkxjpTVKTmNcJSTfYbECDNN5IzH80efnOsgdFV2pslWiH+Fn0
wQXlwAlp4UKS4M9aDkLG7UiE4hJ24vpKqTvQ1kSxKlBWVwcgZByGm3dY9fqU
o2gTXpKZIrFbh7KiY0kQo0qpe+a1gArDiOmSl5WAcppK0DhbIrSf8VEVe1Jp
h11XiUrMU7FOwvSr9YdABe4DkWKh0csnb54MFRmFe00bdLzPLxANf8XaxrXc
sLEBXq+GfpZ7xF0Hg/c7MI3cMDl0yQbsEU6nn4S+3eRHZ3xV8gb09VlIrf3M
oZXPege1D4slUvvAD+qD5z15+5Txu0+5TqPEKO/L5x9ehHLEPBNlddgenfl4
p+QZiKku5WpmmA54H8JuMn8EHbuhgLn2sxudcyZh2jvp3t3N8N0PErsCFlCY
x606/Qn/LVMdA6JuPbdJPLfm2rl9o532aINnC1ddop4HteUqJBPYN50qIfQc
T9Awto0J7mFrl+Xkz0iIiwb7Y830KrmA4bqWkVa7eBCf1lvSUgtsCGQVk3Jf
HWL0nzgKrW8fhPXZG23YmcTYXIPIabRfkO43ZTwLCSG0c+Y7Ie/AeLWgE+rG
doGk4ixXYUM2ikH/c7dJXavI+iorMckmMpF7ncGTKgJrtzky9HZ+mBojVBec
icGCMDeUpTwRqzxgQK1m1xRYB9eX4HO4ko8UDfKWRkcFCyC8+U2wdKVa1uCM
ceNJDzGOc/w+Jwghplnw8L2x4Vv/C3aFX9VEcNUVafLdFFOOyQ81ZgteT7+F
P7/NLtbzrCrwb5rXN0T4SX8mBz/jsTDuWHw8NMqhjAFKpOrGArIi71bTurm4
A2bunSVu5Al+NIGDNqnhDpMF3mGygTvcOTpIk5/gFQ3z+F8gZyC8Eh7S0xNs
0PNtky0JOX4+hQGAfYEzsuQICwHP6HCQrHgJGwwVhXnvxdpegWlath8Prx3o
utuUd5rVAh8LozKvs2axTk4ePXoo4yErBmcLAzmvYbIOfvbtnuQQbJ6jm0yJ
PglviO//OrtKTo9P7rvnPAqeg1NQov7+Af44zz4Vm12TpcmbcAgsDWEQH45u
8bb4sKExUE/R9wUY0Q0+NznMkeUKdkBoj4Wy/VYvD0/AB79ddDWKe+/hX588
vAcbNS/m8Jbf4rI/2cyLi50Ann/cbokXEsyNFrbzpfwhUhKXz+By/ITb5JqZ
0MHgE71Z0BX/+sHJ/Y9Y74RBuXW2oWNw8LMvEquCyhVsyPelpZtszSEIzPY2
i4HP84bxSIZBZmryLTiH9WIBR/MvAwuf0MLfpFneLcaDD/bWyJwen57omKi5
8rdw8SYD8fAEhuTtFnJAt3VTXcmU+T6EcT6EG0tXY4VDb2HwMTiCF/m82aFr
DkO4p0NA5yF5B8oV5uT9FKetuQR/Kk2e0QQF7sZttibeeOihSCqrgjeWrbbY
HHbCom5K2LnPeR7+XDPxwbckQb/bFYjy0LazP4HVS6lz2Lkf8i+dqSvrzpnQ
er3FuuFI8AW+ffoueXiamh92Jb7E8V2ZuXuPTmBDPdu1bZ7tStBtr6beMj3X
SjYZImyxZ06lGeH+k2r4v7C+gj8/HiY3Omv4cBT7MCrw4WFUetqof1nyPXi8
HS6hFTmU0nJeXFDi/gLJ8lFFXre++nR8SCR2Tu1pf3Q3kLtvsiX2jObd/TTb
bOc59vv5NhTJHFUEb6zABqfww+mQnHwuJtJt9iEOCMf6Q1bpNjwmdf9kSxWT
X5InZ3BjwmqLUbUqGizpzikaKzDuFsMWl+1487QZ6eOp/ByHMdMcmJdKJELR
9W7e+12fNaXZVVzHKkn0TOoHEWg5r+tPmI3s8CBZ2gTKcg+NIyIzdGlXD7L+
pMQ44eEsw39/07/JUdJyjjZzIyDT8Nt6DpfN6/k3UsDQhNdhB6YwYxZXzgbh
Kzvf7MsoXhWWSlIbo5CZHtMbEq4EmZaRchIJdRLBmm1GOkCDh7ef10tlC9rb
vZbWYrCeRGp2k0MUYMkcrv5k8wguJqBhdMzFazmugL85hnF0ZswfWF8uEKyJ
pYd/PMBjcfAnQyybd6QmqMUmHHdk9VA43TmZnpjvayTWjbaieQaW3xlIK5D/
J8cJCBc8Lw+Sk3tnx8fwf8l3rz8YDXtg954zv67hzq8teLphVOQMt83k9P6D
P56tf7376qe3L3fN1fLe/5j/9cW6/j578D9f/zhfd399vXz94W7+6Nsv293p
q83xH8/sbV7l1UW3Pkvu3zs1B9/YCZpQi4/24Cw5PPhmk4M4Wx4kB17CA/6S
MMyEYysHyf9lEvdhSfc9OHos2aQ/njz8+uTk6wf3jo8f4w8pn/THg95B+B18
cXLwOCsv/niQL0/vg+l38LjL4C+Y5QOnlskl/uPZz27E1NzrIyzb33Aclvkb
XuFg7PQcYF+NA/Ri8FcZHP+rtgANv72q5vydq0PFXzxcHH997/T0wWT5KDuZ
nJzkDybzFfwJe+R48eju6SI/PuHrqJKUbjp83vlXnDm7/mfazAl/iVgM/tjv
H4XfoFFlR00nED7FyfDekbIb9CP4kJlt7Y/gE1zY27wnXeRhoeDin+VjGmC2
tD/D54HFkB/I3x/p3393Q4GdPjAUVUTRSQoPHzpsbjyfi/wS+Xnwcu+Rfzf4
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

-->

</rfc>

