<?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.31 (Ruby 3.3.8) -->


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

]>

<?rfc comments="yes"?>

<rfc ipr="none" docName="draft-did-challenge-sasl-01" category="info" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="did-challenge-sasl">The DID-CHALLENGE SASL Mechanism</title>

    <author initials="M." surname="Sabadello" fullname="Markus Sabadello">
      <organization>Danube Tech GmbH</organization>
      <address>
        <postal>
          <street>Margaretenstraße 70/1/7</street>
          <city>Wien</city>
          <code>A-1050</code>
          <country>Austria</country>
        </postal>
        <phone>+43-664-3154848</phone>
        <email>markus@danubetech.com</email>
      </address>
    </author>

    <date year="2026" month="March" day="16"/>

    <area>Security</area>
    <workgroup>Common Authentication Technology Next Generation</workgroup>
    

    <abstract>


<?line 29?>

<t>This specification defines "DID-CHALLENGE", a mechanism for the Simple Authentication and
Security Layer (SASL) based on Decentralized Identifiers (DIDs). The mechanism follows a
server-first challenge/response pattern in which the client authenticates by producing a
cryptographic signature over a server-generated challenge, using the private key associated
with its DID. Unlike password-based SASL mechanisms, no shared secret is transmitted or
stored on the server; authentication is grounded entirely in asymmetric cryptography and
the verifiable binding between a DID and its associated key material.</t>

<t>An optional extension adds support for Verifiable Credentials (VCs) and Verifiable
Presentations (VPs), enabling attribute-based access control in addition to identity
authentication.</t>



    </abstract>



  </front>

  <middle>


<?line 43?>

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

<t>Many Internet protocols require authentication. Common approaches include username/password
schemes (as used in IMAP or XMPP), static public key authentication (as used in SSH), and
federated identity protocols (as used in OpenID Connect). Each of these approaches has
well-known limitations: passwords can be stolen or guessed, static public keys provide no
mechanism for revocation, and federated schemes introduce a dependency on a central identity
provider.</t>

<t><eref target="https://www.w3.org/TR/did-1.1/">Decentralized Identifiers</eref> are a class of globally unique identifier designed
to be created and controlled directly by their subjects, without requiring a central registration
authority. A DID resolves to a DID Document - a machine-readable document that contains
cryptographic key material and other metadata about the DID subject. DID Documents are anchored
in a Verifiable Data Registry: a system - such as a distributed ledger, decentralized file
system, or DNS zone - that provides a trustworthy, tamper-evident record of DID state. The
controller of a DID can prove that control by signing data with the private key corresponding
to a public key published in the DID Document, without needing permission from any third party.</t>

<t>The <eref target="https://www.rfc-editor.org/rfc/rfc4422.html">Simple Authentication and Security Layer</eref>
is an extensible framework that
decouples authentication mechanisms from the application protocols that use them. By defining
a SASL mechanism, a new authentication approach can be made available to any SASL-enabled
protocol - including IMAP, SMTP, LDAP, XMPP, and others - without modifying those protocols
individually.</t>

<t>This specification defines "DID-CHALLENGE", a SASL mechanism that allows a client to
authenticate using a DID. The SASL client takes the role of a DID controller; the SASL
server takes the role of a DID Resolver and verifier. Authentication proceeds by the server
issuing a challenge (a nonce, timestamp, and realm), the client signing that challenge with
its DID's private key, and the server verifying the signature against the public key material
retrieved from the client's DID Document. Because authentication is based on key ownership
rather than a shared secret, a compromise of the server's credential store does not yield
material that could be used to impersonate clients.</t>

<t>This specification also defines an optional extension that adds support for Verifiable
Credentials (VCs) and Verifiable Presentations (VPs). VCs are signed
statements issued by a trusted third party (an Issuer) about a subject - for example,
attesting to a person's name, age, professional qualification, or membership in an
organisation. After completing the initial DID-based authentication exchange, the server
may issue one or more VC/VP Challenges requesting that the client present credentials of
a specified type. The client responds with a Verifiable Presentation: a signed envelope
containing the requested credentials and binding them to the authenticated DID. This
enables the server to make fine-grained, attribute-based access-control decisions beyond
simple identity verification.</t>

<t>Readers seeking to implement
this mechanism should be familiar with the SASL framework (<eref target="https://www.rfc-editor.org/rfc/rfc4422.html">RFC4422</eref>),
the <eref target="https://www.w3.org/TR/did-1.1/#did-syntax">W3C DIDs v1.1 - DID Syntax</eref> specification, and the
<eref target="https://www.w3.org/TR/did-resolution/">W3C DID Resolution v1.0</eref> specification. Familiarity
with the <eref target="https://www.w3.org/TR/2025/REC-vc-data-model-2.0-20250515/#types">W3C Verifiable Credentials Data Model v2.0</eref> specification
is required for implementations that use the optional VC/VP extension.</t>

</section>
<section anchor="sasl-mechanism-name"><name>SASL mechanism name</name>

<t>The name of the DID-based SASL mechanism is "DID-CHALLENGE".</t>

</section>
<section anchor="authentication"><name>Authentication</name>

<t>This section describes the interaction between a SASL client and SASL server that use
the "DID-CHALLENGE" mechanism.</t>

<section anchor="the-authentication-exchange"><name>The Authentication Exchange</name>

<t>The "DID-CHALLENGE" mechanism is a server-first mechanism: the
server sends the first piece of authentication data (see <xref target="did-challenge"></xref>)
without waiting for any initial client message beyond
the mechanism selection.</t>

<t>The exchange consists of the following steps:</t>

<figure><artwork><![CDATA[
C: Request authentication exchange
S: DID Challenge
C: DID Response
S: Outcome of authentication exchange
]]></artwork></figure>

<t>The mechanism is capable of transferring an authorization identity string (see <xref target="authorization-identity-string"></xref>),
which the client MUST include in the DID Response (see <xref target="did-response"></xref>).</t>

<t>The server is not expected to provide additional data when indicating a successful outcome.
On failure, the server MUST terminate the exchange and SHOULD provide an appropriate error
indication to the client in accordance with the enclosing protocol's SASL profile.</t>

<t>As security layers, the mechanism provides authentication and integrity protection of
the authorization identity during the exchange, by means of a
cryptographic signature over the server-generated challenge (see
<xref target="authorization-identity-string"></xref>). It does not provide a general-purpose security
layer over the application data stream after authentication
completes; confidentiality and integrity of post-authentication
traffic MUST be provided by the underlying transport, such as (<eref target="https://www.rfc-editor.org/rfc/rfc8446.html">RFC8446</eref>).</t>

<t>The use of TLS is therefore strongly RECOMMENDED whenever this
mechanism is employed (see <xref target="requirement-for-a-confidential-channel"></xref>).</t>

</section>
<section anchor="authorization-identity-string"><name>Authorization Identity String</name>

<t>In the "DID-CHALLENGE" mechanism, the <eref target="https://www.rfc-editor.org/rfc/rfc4422#section-3.4.1">authorization identity string</eref>
is a DID as defined by <eref target="https://www.w3.org/TR/did-1.1/#did-syntax">W3C DIDs v1.1 - DID Syntax</eref>, and percent-encoded as defined by
<eref target="https://www.rfc-editor.org/rfc/rfc3986#section-2.1">RFC3986 - Section 2.1</eref>.</t>

<t>Example authorization identity string:</t>

<figure><artwork><![CDATA[
did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D
]]></artwork></figure>

</section>
<section anchor="did-challenge"><name>DID Challenge</name>

<t>The DID Challenge has the following format:</t>

<figure><artwork><![CDATA[
"<" <nonce> "." <timestamp> "@" <realm> ">"
]]></artwork></figure>

<t>Where:</t>

<t><list style="symbols">
  <t><spanx style="verb">&lt;nonce&gt;</spanx> is a server-generated random string.  It MUST be
unique across all challenges issued by the server.  The nonce
MUST be generated by a cryptographically strong pseudo-random
number generator and MUST contain at least 64 bits of entropy.
The nonce MUST NOT contain the characters ".", "@", "&lt;", "&gt;",
or SP, as these are used as delimiters in the challenge format.</t>
  <t><spanx style="verb">&lt;timestamp&gt;</spanx> is the number of milliseconds elapsed since the
Unix epoch (1970-01-01T00:00:00Z), encoded as a decimal integer
with no leading zeros.  The server MUST set this field to the
current time at the moment the challenge is generated.</t>
  <t><spanx style="verb">&lt;realm&gt;</spanx> is the SASL realm of the server.  It
identifies the service context to which the challenge belongs
and is included in the signed material to prevent cross-service
signature reuse.  The realm MUST NOT contain the characters
"@", "&lt;", "&gt;", or SP.</t>
</list></t>

<t>Example:</t>

<figure><artwork><![CDATA[
<7795631894096664932.1765144656954@java-sasl-xmpp-server>
]]></artwork></figure>

<t>In this example, the nonce is "7795631894096664932", the timestamp
is "1741267200000" (2025-03-06T12:00:00Z in milliseconds), and the
realm is "java-sasl-xmpp-server".</t>

</section>
<section anchor="did-response"><name>DID Response</name>

<t>The DID Response has the following format:</t>

<figure><artwork><![CDATA[
<did> <signature>
]]></artwork></figure>

<t>Where:</t>

<t><list style="symbols">
  <t><spanx style="verb">&lt;did&gt;</spanx> is the client's Decentralized Identifier (DID), percent-encoded
as defined in <xref target="authorization-identity-string"></xref>. This is the
SASL authorization identity string supplied by the client. The DID MUST
be resolvable to a DID Document that contains at least one verification
method with an "authentication" verification relationship
(see <eref target="https://www.w3.org/TR/did-1.1/#verification-relationships">W3C DIDs v1.1 - Verification Relationships</eref>.</t>
  <t><spanx style="verb">&lt;signature&gt;</spanx> is the base64url encoding (<eref target="https://www.rfc-editor.org/rfc/rfc4648.html">RFC4648</eref>) of the raw bytes of the digital
signature, without padding characters ("="). The signature MUST be computed over
the entire DID Challenge string (including the enclosing angle brackets) as
specified in <xref target="did-challenge"></xref>.</t>
</list></t>

<t>The signing algorithm MUST correspond
to the key type of the verification method in the DID document (e.g., Ed25519 for
keys of type "Multikey" with a Multibase-encoded Ed25519 public key).</t>

<t>The two fields MUST be separated by exactly one space character.
Leading and trailing whitespace in the DID Response MUST NOT be
present.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D frEko8nWU-rfArpMZsMVbXpg4xChaQIv_MCmIAmHD3OCWwYvL7CDOedMbezMs4pmGGuzpkRH2QX8UMa-RFToBg
]]></artwork></figure>

</section>
<section anchor="verification"><name>Verification</name>

<t>The signature in the initial response MUST cover the entire DID Challenge, and is generated using the DID's associated private key.</t>

<t>The server MUST perform the following verification steps:</t>

<t><list style="symbols">
  <t>Resolve the DID to its DID document, according to the <eref target="https://www.w3.org/TR/did-resolution/">W3C DID Resolution v1.0</eref>.</t>
  <t>Retrieve the public keys from the DID document which have an "authentication" verification relationship, according to <eref target="https://www.w3.org/TR/did-1.1/#verification-relationships">W3C DIDs v1.1 - Verification Relationships</eref>.</t>
  <t>Using the public keys from the DID document, verify the signature in the DID Response against the DID Challenge.</t>
  <t>Verify that the DID Challenge nonce has not been re-used.</t>
  <t>Verify that the DID Challenge timestamp is not too long in the past or in the future, e.g. 5 minutes.</t>
</list></t>

</section>
</section>
<section anchor="sasl-exchange-with-dids"><name>SASL Exchange with DIDs</name>

<t>This section illustrates the detailed steps of the SASL exchange.</t>

<t>The flow includes the DID Challenge (see <xref target="did-challenge"></xref>) and DID Response (see <xref target="did-response"></xref>) steps.</t>

<figure><artset><artwork  type="svg"><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="1097px" preserveAspectRatio="none" version="1.1" viewBox="0 0 1016 1097" width="1016px">
  <defs/>
  <g>
    <text fill="black" font-family="sans-serif" font-size="18" x="339" y="29.2419">"The DID-CHALLENGE SASL mechanism"</text>
    <line x1="104" x2="104" y1="79.5838" y2="1054.6462" stroke="black" stroke-width="1.0"/>
    <line x1="315" x2="315" y1="79.5838" y2="1054.6462" stroke="black" stroke-width="1.0"/>
    <line x1="612" x2="612" y1="79.5838" y2="1054.6462" stroke="black" stroke-width="1.0"/>
    <line x1="835" x2="835" y1="79.5838" y2="1054.6462" stroke="black" stroke-width="1.0"/>
    <line x1="957" x2="957" y1="79.5838" y2="1054.6462" stroke="black" stroke-width="1.0"/>
    <rect fill="white" height="33.0679" width="111" x="47" y="41.5158" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="54" y="63.4818">Protocol Client</text>
    <rect fill="white" height="33.0679" width="111" x="47" y="1053.6462" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="54" y="1075.6121">Protocol Client</text>
    <rect fill="white" height="33.0679" width="89" x="269" y="41.5158" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="276" y="63.4818">SASL Client</text>
    <rect fill="white" height="33.0679" width="89" x="269" y="1053.6462" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="276" y="1075.6121">SASL Client</text>
    <rect fill="white" height="33.0679" width="93" x="564" y="41.5158" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="571" y="63.4818">SASL Server</text>
    <rect fill="white" height="33.0679" width="93" x="564" y="1053.6462" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="571" y="1075.6121">SASL Server</text>
    <rect fill="white" height="33.0679" width="115" x="776" y="41.5158" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="783" y="63.4818">Protocol Server</text>
    <rect fill="white" height="33.0679" width="115" x="776" y="1053.6462" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="783" y="1075.6121">Protocol Server</text>
    <rect fill="white" height="33.0679" width="100" x="905" y="41.5158" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="912" y="63.4818">DID Resolver</text>
    <rect fill="white" height="33.0679" width="100" x="905" y="1053.6462" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="912" y="1075.6121">DID Resolver</text>
    <polygon fill="black" points="823.5,109.2898,833.5,113.2898,823.5,117.2898,827.5,113.2898" stroke="black" stroke-width="1.0"/>
    <line x1="104.5" x2="829.5" y1="113.2898" y2="113.2898" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="111.5" y="107.4808">Network Connection</text>
    <line x1="313.5" x2="303.5" y1="144.9958" y2="140.9958" stroke="black" stroke-width="1.0"/>
    <line x1="313.5" x2="303.5" y1="144.9958" y2="148.9958" stroke="black" stroke-width="1.0"/>
    <line x1="104.5" x2="314.5" y1="144.9958" y2="144.9958" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="111.5" y="139.1868">Start login</text>
    <line x1="104.5" x2="114.5" y1="176.7018" y2="172.7018" stroke="black" stroke-width="1.0"/>
    <line x1="104.5" x2="114.5" y1="176.7018" y2="180.7018" stroke="black" stroke-width="1.0"/>
    <line x1="104.5" x2="314.5" y1="176.7018" y2="176.7018" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="121.5" y="170.8928">NameCallback for DID</text>
    <line x1="313.5" x2="303.5" y1="208.4078" y2="204.4078" stroke="black" stroke-width="1.0"/>
    <line x1="313.5" x2="303.5" y1="208.4078" y2="212.4078" stroke="black" stroke-width="1.0"/>
    <line x1="104.5" x2="314.5" y1="208.4078" y2="208.4078" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="111.5" y="202.5988">DID</text>
    <path d="M148,221.4078 L148,248.4078 L306,248.4078 L306,231.4078 L296,221.4078 L148,221.4078 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M296,221.4078 L296,231.4078 L306,231.4078 L296,221.4078 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="154" y="240.3048">did%3Akey%3A&lt;..did..&gt;</text>
    <line x1="104.5" x2="114.5" y1="281.8199" y2="277.8199" stroke="black" stroke-width="1.0"/>
    <line x1="104.5" x2="114.5" y1="281.8199" y2="285.8199" stroke="black" stroke-width="1.0"/>
    <line x1="104.5" x2="314.5" y1="281.8199" y2="281.8199" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="121.5" y="276.0109">JWKCallback for DID private key</text>
    <line x1="313.5" x2="303.5" y1="313.5259" y2="309.5259" stroke="black" stroke-width="1.0"/>
    <line x1="313.5" x2="303.5" y1="313.5259" y2="317.5259" stroke="black" stroke-width="1.0"/>
    <line x1="104.5" x2="314.5" y1="313.5259" y2="313.5259" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="111.5" y="307.7169">DID private key</text>
    <path d="M8,326.5259 L8,353.5259 L307,353.5259 L307,336.5259 L297,326.5259 L8,326.5259 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M297,326.5259 L297,336.5259 L307,336.5259 L297,326.5259 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="14" y="345.4229">{ "kty": "OKP", "crv": "Ed25519", "x": "..", "d": ".." }</text>
    <line x1="610.5" x2="600.5" y1="386.9379" y2="382.9379" stroke="black" stroke-width="1.0"/>
    <line x1="610.5" x2="600.5" y1="386.9379" y2="390.9379" stroke="black" stroke-width="1.0"/>
    <line x1="315.5" x2="611.5" y1="386.9379" y2="386.9379" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="322.5" y="381.1289">Start SASL authentication</text>
    <line x1="315.5" x2="325.5" y1="418.6439" y2="414.6439" stroke="black" stroke-width="1.0"/>
    <line x1="315.5" x2="325.5" y1="418.6439" y2="422.6439" stroke="black" stroke-width="1.0"/>
    <line x1="315.5" x2="611.5" y1="418.6439" y2="418.6439" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="332.5" y="412.8349">List of authn mechanisms</text>
    <line x1="610.5" x2="600.5" y1="450.3499" y2="446.3499" stroke="black" stroke-width="1.0"/>
    <line x1="610.5" x2="600.5" y1="450.3499" y2="454.3499" stroke="black" stroke-width="1.0"/>
    <line x1="315.5" x2="611.5" y1="450.3499" y2="450.3499" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="322.5" y="444.5409">Selected authn mechanism "DID-CHALLENGE"</text>
    <line x1="612.5" x2="654.5" y1="482.056" y2="482.056" stroke="black" stroke-width="1.0"/>
    <line x1="654.5" x2="654.5" y1="482.056" y2="495.056" stroke="black" stroke-width="1.0"/>
    <line x1="613.5" x2="654.5" y1="495.056" y2="495.056" stroke="black" stroke-width="1.0"/>
    <line x1="613.5" x2="623.5" y1="495.056" y2="491.056" stroke="black" stroke-width="1.0"/>
    <line x1="613.5" x2="623.5" y1="495.056" y2="499.056" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="619.5" y="476.247">Generate DID Challenge</text>
    <path d="M199,508.056 L199,535.056 L603,535.056 L603,518.056 L593,508.056 L199,508.056 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M593,508.056 L593,518.056 L603,518.056 L593,508.056 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="205" y="526.953">&lt;1809528678543235072.1724868615672@java-sasl-xmpp-server&gt;</text>
    <line x1="315.5" x2="325.5" y1="568.468" y2="564.468" stroke="black" stroke-width="1.0"/>
    <line x1="315.5" x2="325.5" y1="568.468" y2="572.468" stroke="black" stroke-width="1.0"/>
    <line x1="315.5" x2="611.5" y1="568.468" y2="568.468" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="332.5" y="562.659">DID Challenge (nonce, timestamp, realm)</text>
    <line x1="315.5" x2="357.5" y1="600.174" y2="600.174" stroke="black" stroke-width="1.0"/>
    <line x1="357.5" x2="357.5" y1="600.174" y2="613.174" stroke="black" stroke-width="1.0"/>
    <line x1="316.5" x2="357.5" y1="613.174" y2="613.174" stroke="black" stroke-width="1.0"/>
    <line x1="316.5" x2="326.5" y1="613.174" y2="609.174" stroke="black" stroke-width="1.0"/>
    <line x1="316.5" x2="326.5" y1="613.174" y2="617.174" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="322.5" y="594.365">Generate DID Response with signature</text>
    <path d="M320,626.174 L320,653.174 L424,653.174 L424,636.174 L414,626.174 L320,626.174 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M414,626.174 L414,636.174 L424,636.174 L414,626.174 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="326" y="645.071">&lt;..signature..&gt;</text>
    <line x1="610.5" x2="600.5" y1="686.586" y2="682.586" stroke="black" stroke-width="1.0"/>
    <line x1="610.5" x2="600.5" y1="686.586" y2="690.586" stroke="black" stroke-width="1.0"/>
    <line x1="315.5" x2="611.5" y1="686.586" y2="686.586" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="322.5" y="680.777">DID Response (DID, signature)</text>
    <path d="M291,699.586 L291,726.586 L603,726.586 L603,709.586 L593,699.586 L291,699.586 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M593,699.586 L593,709.586 L603,709.586 L593,699.586 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="297" y="718.4831">did%3Akey%3A&lt;..did..&gt; frEko8nWU&lt;..signature..&gt;</text>
    <line x1="955" x2="945" y1="759.9981" y2="755.9981" stroke="black" stroke-width="1.0"/>
    <line x1="955" x2="945" y1="759.9981" y2="763.9981" stroke="black" stroke-width="1.0"/>
    <line x1="612.5" x2="956" y1="759.9981" y2="759.9981" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="619.5" y="754.1891">Resolve DID</text>
    <line x1="612.5" x2="622.5" y1="791.7041" y2="787.7041" stroke="black" stroke-width="1.0"/>
    <line x1="612.5" x2="622.5" y1="791.7041" y2="795.7041" stroke="black" stroke-width="1.0"/>
    <line x1="612.5" x2="956" y1="791.7041" y2="791.7041" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="629.5" y="785.8951">DID document with DID public key</text>
    <line x1="612.5" x2="654.5" y1="823.4101" y2="823.4101" stroke="black" stroke-width="1.0"/>
    <line x1="654.5" x2="654.5" y1="823.4101" y2="836.4101" stroke="black" stroke-width="1.0"/>
    <line x1="613.5" x2="654.5" y1="836.4101" y2="836.4101" stroke="black" stroke-width="1.0"/>
    <line x1="613.5" x2="623.5" y1="836.4101" y2="832.4101" stroke="black" stroke-width="1.0"/>
    <line x1="613.5" x2="623.5" y1="836.4101" y2="840.4101" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="619.5" y="817.6011">Verify DID Response with signature</text>
    <path d="M617,849.4101 L617,876.4101 L663,876.4101 L663,859.4101 L653,849.4101 L617,849.4101 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M653,849.4101 L653,859.4101 L663,859.4101 L653,849.4101 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="623" y="868.3071">true</text>
    <line x1="833.5" x2="823.5" y1="909.8221" y2="905.8221" stroke="black" stroke-width="1.0"/>
    <line x1="833.5" x2="823.5" y1="909.8221" y2="913.8221" stroke="black" stroke-width="1.0"/>
    <line x1="612.5" x2="834.5" y1="909.8221" y2="909.8221" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="619.5" y="904.0131">NameCallback with DID</text>
    <line x1="612.5" x2="622.5" y1="941.5282" y2="937.5282" stroke="black" stroke-width="1.0"/>
    <line x1="612.5" x2="622.5" y1="941.5282" y2="945.5282" stroke="black" stroke-width="1.0"/>
    <line x1="612.5" x2="834.5" y1="941.5282" y2="941.5282" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="629.5" y="935.7192">(empty)</text>
    <line x1="833.5" x2="823.5" y1="973.2342" y2="969.2342" stroke="black" stroke-width="1.0"/>
    <line x1="833.5" x2="823.5" y1="973.2342" y2="977.2342" stroke="black" stroke-width="1.0"/>
    <line x1="612.5" x2="834.5" y1="973.2342" y2="973.2342" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="619.5" y="967.4252">AuthorizeCallback</text>
    <line x1="612.5" x2="622.5" y1="1004.9402" y2="1000.9402" stroke="black" stroke-width="1.0"/>
    <line x1="612.5" x2="622.5" y1="1004.9402" y2="1008.9402" stroke="black" stroke-width="1.0"/>
    <line x1="612.5" x2="834.5" y1="1004.9402" y2="1004.9402" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="629.5" y="999.1312">authorized=true with DID</text>
    <line x1="315.5" x2="325.5" y1="1036.6462" y2="1032.6462" stroke="black" stroke-width="1.0"/>
    <line x1="315.5" x2="325.5" y1="1036.6462" y2="1040.6462" stroke="black" stroke-width="1.0"/>
    <line x1="315.5" x2="611.5" y1="1036.6462" y2="1036.6462" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="332.5" y="1030.8372">Completed SASL authentication</text>
    <!--MD5=[8d67b0742f61068e603f7dfaa3c9f387]
@startuml

title "The DID-CHALLENGE SASL mechanism"
participant ProtocolClient as "Protocol Client"
participant SASLClient as "SASL Client"
participant SASLServer as "SASL Server"
participant ProtocolServer as "Protocol Server"
participant DIDResolver as "DID Resolver"
ProtocolClient- ->ProtocolServer: Network Connection
ProtocolClient->>SASLClient: Start login
SASLClient->>ProtocolClient: NameCallback for DID
ProtocolClient->>SASLClient: DID
note left of SASLClient: did%3Akey%3A<..did..>
SASLClient->>ProtocolClient: JWKCallback for DID private key
ProtocolClient->>SASLClient: DID private key
note left of SASLClient: { "kty": "OKP", "crv": "Ed25519", "x": "..", "d": ".." }
SASLClient->>SASLServer: Start SASL authentication
SASLServer->>SASLClient: List of authn mechanisms
SASLClient->>SASLServer: Selected authn mechanism "DID-CHALLENGE"
SASLServer->>SASLServer: Generate DID Challenge
note left of SASLServer: <1809528678543235072.1724868615672@java-sasl-xmpp-server>
SASLServer->>SASLClient: DID Challenge (nonce, timestamp, realm)
SASLClient->>SASLClient: Generate DID Response with signature
note right of SASLClient: <..signature..>
SASLClient->>SASLServer: DID Response (DID, signature)
note left of SASLServer: did%3Akey%3A<..did..> frEko8nWU<..signature..>
SASLServer->>DIDResolver: Resolve DID
DIDResolver->>SASLServer: DID document with DID public key
SASLServer->>SASLServer: Verify DID Response with signature
note right of SASLServer: true
SASLServer->>ProtocolServer: NameCallback with DID
ProtocolServer->>SASLServer: (empty)
SASLServer->>ProtocolServer: AuthorizeCallback
ProtocolServer->>SASLServer: authorized=true with DID
SASLServer->>SASLClient: Completed SASL authentication

@enduml

PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 21.0.10+7-Debian-1
Operating System: Linux
Default Encoding: UTF-8
Language: en
Country: US
-->
  </g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[                                                                          "The DID-CHALLENGE SASL mechanism"                                                                     
                                                                                                                                                                                 
                     ┌───────────────┐                  ┌───────────┐                             ┌───────────┐                         ┌───────────────┐          ┌────────────┐
                     │Protocol Client│                  │SASL Client│                             │SASL Server│                         │Protocol Server│          │DID Resolver│
                     └───────┬───────┘                  └─────┬─────┘                             └─────┬─────┘                         └───────┬───────┘          └─────┬──────┘
                             │                                │              Network Connection         │                                       │                        │       
                             │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ >│                        │       
                             │                                │                                         │                                       │                        │       
                             │          Start login           │                                         │                                       │                        │       
                             │───────────────────────────────>│                                         │                                       │                        │       
                             │                                │                                         │                                       │                        │       
                             │     NameCallback for DID       │                                         │                                       │                        │       
                             │<───────────────────────────────│                                         │                                       │                        │       
                             │                                │                                         │                                       │                        │       
                             │              DID               │                                         │                                       │                        │       
                             │───────────────────────────────>│                                         │                                       │                        │       
                             │                                │                                         │                                       │                        │       
                             │      ╔═══════════════════════╗ │                                         │                                       │                        │       
                             │      ║did%3Akey%3A<..did..> ░║ │                                         │                                       │                        │       
                             │      ╚═══════════════════════╝ │                                         │                                       │                        │       
                             │JWKCallback for DID private key │                                         │                                       │                        │       
                             │<───────────────────────────────│                                         │                                       │                        │       
                             │                                │                                         │                                       │                        │       
                             │        DID private key         │                                         │                                       │                        │       
                             │───────────────────────────────>│                                         │                                       │                        │       
                             │                                │                                         │                                       │                        │       
  ╔══════════════════════════╧═══════════════════════════════╗│                                         │                                       │                        │       
  ║{ "kty": "OKP", "crv": "Ed25519", "x": "..", "d": ".." } ░║│                                         │                                       │                        │       
  ╚══════════════════════════╤═══════════════════════════════╝│                                         │                                       │                        │       
                             │                                │       Start SASL authentication         │                                       │                        │       
                             │                                │────────────────────────────────────────>│                                       │                        │       
                             │                                │                                         │                                       │                        │       
                             │                                │        List of authn mechanisms         │                                       │                        │       
                             │                                │<────────────────────────────────────────│                                       │                        │       
                             │                                │                                         │                                       │                        │       
                             │                                │Selected authn mechanism "DID-CHALLENGE" │                                       │                        │       
                             │                                │────────────────────────────────────────>│                                       │                        │       
                             │                                │                                         │                                       │                        │       
                             │                                │                                         ────┐                                   │                        │       
                             │                                │                                             │ Generate DID Challenge            │                        │       
                             │                                │                                         <───┘                                   │                        │       
                             │                                │                                         │                                       │                        │       
                             │            ╔═══════════════════╧═══════════════════════════════════════╗ │                                       │                        │       
                             │            ║<1809528678543235072.1724868615672@java-sasl-xmpp-server> ░║ │                                       │                        │       
                             │            ╚═══════════════════╤═══════════════════════════════════════╝ │                                       │                        │       
                             │                                │DID Challenge (nonce, timestamp, realm)  │                                       │                        │       
                             │                                │<────────────────────────────────────────│                                       │                        │       
                             │                                │                                         │                                       │                        │       
                             │                                ────┐                                     │                                       │                        │       
                             │                                    │ Generate DID Response with signature│                                       │                        │       
                             │                                <───┘                                     │                                       │                        │       
                             │                                │                                         │                                       │                        │       
                             │                                │ ╔═════════════════╗                     │                                       │                        │       
                             │                                │ ║<..signature..> ░║                     │                                       │                        │       
                             │                                │ ╚═════════════════╝                     │                                       │                        │       
                             │                                │     DID Response (DID, signature)       │                                       │                        │       
                             │                                │────────────────────────────────────────>│                                       │                        │       
                             │                                │                                         │                                       │                        │       
                             │                       ╔════════╧═══════════════════════════════════════╗ │                                       │                        │       
                             │                       ║did%3Akey%3A<..did..> frEko8nWU<..signature..> ░║ │                                       │                        │       
                             │                       ╚════════╤═══════════════════════════════════════╝ │                                       │                        │       
                             │                                │                                         │                          Resolve DID  │                        │       
                             │                                │                                         │───────────────────────────────────────────────────────────────>│       
                             │                                │                                         │                                       │                        │       
                             │                                │                                         │               DID document with DID public key                 │       
                             │                                │                                         │<───────────────────────────────────────────────────────────────│       
                             │                                │                                         │                                       │                        │       
                             │                                │                                         ────┐                                   │                        │       
                             │                                │                                             │ Verify DID Response with signature│                        │       
                             │                                │                                         <───┘                                   │                        │       
                             │                                │                                         │                                       │                        │       
                             │                                │                                         │ ╔══════╗                              │                        │       
                             │                                │                                         │ ║true ░║                              │                        │       
                             │                                │                                         │ ╚══════╝                              │                        │       
                             │                                │                                         │        NameCallback with DID          │                        │       
                             │                                │                                         │──────────────────────────────────────>│                        │       
                             │                                │                                         │                                       │                        │       
                             │                                │                                         │               (empty)                 │                        │       
                             │                                │                                         │<──────────────────────────────────────│                        │       
                             │                                │                                         │                                       │                        │       
                             │                                │                                         │          AuthorizeCallback            │                        │       
                             │                                │                                         │──────────────────────────────────────>│                        │       
                             │                                │                                         │                                       │                        │       
                             │                                │                                         │       authorized=true with DID        │                        │       
                             │                                │                                         │<──────────────────────────────────────│                        │       
                             │                                │                                         │                                       │                        │       
                             │                                │     Completed SASL authentication       │                                       │                        │       
                             │                                │<────────────────────────────────────────│                                       │                        │       
                     ┌───────┴───────┐                  ┌─────┴─────┐                             ┌─────┴─────┐                         ┌───────┴───────┐          ┌─────┴──────┐
                     │Protocol Client│                  │SASL Client│                             │SASL Server│                         │Protocol Server│          │DID Resolver│
                     └───────────────┘                  └───────────┘                             └───────────┘                         └───────────────┘          └────────────┘
]]></artwork></artset></figure>

</section>
<section anchor="optional-authentication-with-vcsvps"><name>(Optional) Authentication with VCs/VPs</name>

<t>This section defines an optional extension of the "DID-CHALLENGE" SASL mechanism which adds support for Verifiable Credentials (VCs)
and Verifiable Presentations (VPs).</t>

<section anchor="the-authentication-exchange-with-vcvp-support"><name>The Authentication Exchange (with VC/VP support)</name>

<t>The exchange consists of the following steps (expanding on <xref target="authentication"></xref>):</t>

<figure><artwork><![CDATA[
C: Request authentication exchange
S: DID Challenge
C: DID Response
S: VC/VP Challenge
C: VC/VP Response
S: Outcome of authentication exchange
]]></artwork></figure>

<t>The steps VC/VP Challenge and VC/VP Response may be repeated multiple times.</t>

</section>
<section anchor="vc-vp-challenge"><name>VC-VP Challenge</name>

<t>The VC/VP Challenge follows the following format:</t>

<figure><artwork><![CDATA[
"<" <nonce> "." <timestamp> "." <vc.type> "@" <realm> ">"
]]></artwork></figure>

<t>Where:</t>

<t><list style="symbols">
  <t><spanx style="verb">&lt;nonce&gt;</spanx> MUST be a unique string.</t>
  <t><spanx style="verb">&lt;timestamp&gt;</spanx> MUST be a UNIX timestamp.</t>
  <t><spanx style="verb">&lt;vc.type&gt;</spanx> MUST be a type of a Verifiable Credential as defined in <eref target="https://www.w3.org/TR/2025/REC-vc-data-model-2.0-20250515/#types">W3C Verifiable Credentials Data Model v2.0 - Types</eref>.</t>
  <t><spanx style="verb">&lt;realm&gt;</spanx> MUST be a SASL realm.</t>
</list></t>

<t>Example:</t>

<figure><artwork><![CDATA[
<7795631894096664932.1765144656954.DegreeCredential@java-sasl-xmpp-server>
]]></artwork></figure>

</section>
<section anchor="vc-vp-response"><name>VC-VP Response</name>

<t>The VC/VP Response follows the following format:</t>

<figure><artwork><![CDATA[
<vp>
]]></artwork></figure>

<t>Where:</t>

<t><list style="symbols">
  <t><spanx style="verb">&lt;vp&gt;</spanx> MUST be a Verifiable Presentation as defined in <eref target="https://www.w3.org/TR/2025/REC-vc-data-model-2.0-20250515/#verifiable-presentations">W3C Verifiable Credentials Data Model v2.0 - Verifiable Presentations</eref>.</t>
</list></t>

<t>Example:</t>

<figure><artwork><![CDATA[
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://www.w3.org/ns/credentials/examples/v2"
  ],
  "id": "urn:uuid:3978344f-8596-4c3a-a978-8fcaba3903c5",
  "type": ["VerifiablePresentation"],
  "verifiableCredential": [{
    "id": "did:key:z6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D"
    "type": ["DegreeCredential"]
  }]
}
]]></artwork></figure>

</section>
<section anchor="verification-1"><name>Verification</name>

<t>The signature in the Verifiable Presentation MUST be generated using the DID's associated private key.</t>

<t>The server MUST perform the following verification steps, in addition to the steps in <xref target="verification"></xref>.</t>

<t><list style="symbols">
  <t>Retrieve the public keys from the DID document which have an "assertionMethod" verification relationship, according to <eref target="https://www.w3.org/TR/did-1.1/#assertion">W3C DIDs v1.1 - Assertion</eref>.</t>
  <t>Using the public keys from the DID document, verify the proof in the VC/VP Response against the VC/VP Challenge.</t>
  <t>Verify that the VC/VP Challenge nonce has not been re-used.</t>
  <t>Verify that the VC/VP Challenge timestamp is not too long in the past or in the future, e.g. 5 minutes.</t>
  <t>Verify that the "holder" property of the VC/VP Response matches the DID.</t>
  <t>Verify that the "type" property of the VC/VP Response matches the requested VC type in the VC/VP Challenge.</t>
</list></t>

</section>
</section>
<section anchor="optional-sasl-exchange-with-dids-and-vcsvps"><name>(Optional) SASL Exchange with DIDs and VCs/VPs</name>

<t>This section illustrates the detailed steps of the SASL exchange with DIDs and VCs/VPs, building on <xref target="sasl-exchange-with-dids"></xref>.</t>

<t>The flow includes the DID Challenge (see <xref target="did-challenge"></xref>), DID Response (see <xref target="did-response"></xref>),
VC/VP Challenge (see <xref target="vc-vp-challenge"></xref>), and VC/VP Response (see <xref target="vc-vp-response"></xref>).</t>

<figure><artset><artwork  type="svg"><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="1634px" preserveAspectRatio="none" version="1.1" viewBox="0 0 1052 1634" width="1052px">
  <defs/>
  <g>
    <text fill="black" font-family="sans-serif" font-size="18" x="318" y="29.2419">"The DID-CHALLENGE SASL mechanism with VCs"</text>
    <rect fill="white" height="124.8241" width="361" x="13" y="370.2319" stroke="#000000" stroke-width="2.0"/>
    <rect fill="white" height="384.0602" width="749.5" x="118" y="1031.9402" stroke="#000000" stroke-width="2.0"/>
    <line x1="80" x2="80" y1="79.5838" y2="1591.5304" stroke="black" stroke-width="1.0"/>
    <line x1="317" x2="317" y1="79.5838" y2="1591.5304" stroke="black" stroke-width="1.0"/>
    <line x1="648" x2="648" y1="79.5838" y2="1591.5304" stroke="black" stroke-width="1.0"/>
    <line x1="871" x2="871" y1="79.5838" y2="1591.5304" stroke="black" stroke-width="1.0"/>
    <line x1="993" x2="993" y1="79.5838" y2="1591.5304" stroke="black" stroke-width="1.0"/>
    <rect fill="white" height="33.0679" width="111" x="23" y="41.5158" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="30" y="63.4818">Protocol Client</text>
    <rect fill="white" height="33.0679" width="111" x="23" y="1590.5304" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="30" y="1612.4964">Protocol Client</text>
    <rect fill="white" height="33.0679" width="89" x="271" y="41.5158" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="278" y="63.4818">SASL Client</text>
    <rect fill="white" height="33.0679" width="89" x="271" y="1590.5304" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="278" y="1612.4964">SASL Client</text>
    <rect fill="white" height="33.0679" width="93" x="600" y="41.5158" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="607" y="63.4818">SASL Server</text>
    <rect fill="white" height="33.0679" width="93" x="600" y="1590.5304" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="607" y="1612.4964">SASL Server</text>
    <rect fill="white" height="33.0679" width="115" x="812" y="41.5158" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="819" y="63.4818">Protocol Server</text>
    <rect fill="white" height="33.0679" width="115" x="812" y="1590.5304" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="819" y="1612.4964">Protocol Server</text>
    <rect fill="white" height="33.0679" width="100" x="941" y="41.5158" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="948" y="63.4818">DID Resolver</text>
    <rect fill="white" height="33.0679" width="100" x="941" y="1590.5304" stroke="black" stroke-width="1.5"/>
    <text fill="black" font-family="sans-serif" font-size="14" x="948" y="1612.4964">DID Resolver</text>
    <polygon fill="black" points="859.5,109.2898,869.5,113.2898,859.5,117.2898,863.5,113.2898" stroke="black" stroke-width="1.0"/>
    <line x1="80.5" x2="865.5" y1="113.2898" y2="113.2898" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="87.5" y="107.4808">Network Connection</text>
    <line x1="315.5" x2="305.5" y1="144.9958" y2="140.9958" stroke="black" stroke-width="1.0"/>
    <line x1="315.5" x2="305.5" y1="144.9958" y2="148.9958" stroke="black" stroke-width="1.0"/>
    <line x1="80.5" x2="316.5" y1="144.9958" y2="144.9958" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="87.5" y="139.1868">Start login</text>
    <line x1="80.5" x2="90.5" y1="176.7018" y2="172.7018" stroke="black" stroke-width="1.0"/>
    <line x1="80.5" x2="90.5" y1="176.7018" y2="180.7018" stroke="black" stroke-width="1.0"/>
    <line x1="80.5" x2="316.5" y1="176.7018" y2="176.7018" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="97.5" y="170.8928">NameCallback for DID</text>
    <line x1="315.5" x2="305.5" y1="208.4078" y2="204.4078" stroke="black" stroke-width="1.0"/>
    <line x1="315.5" x2="305.5" y1="208.4078" y2="212.4078" stroke="black" stroke-width="1.0"/>
    <line x1="80.5" x2="316.5" y1="208.4078" y2="208.4078" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="87.5" y="202.5988">DID</text>
    <path d="M150,221.4078 L150,248.4078 L308,248.4078 L308,231.4078 L298,221.4078 L150,221.4078 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M298,221.4078 L298,231.4078 L308,231.4078 L298,221.4078 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="156" y="240.3048">did%3Akey%3A&lt;..did..&gt;</text>
    <line x1="80.5" x2="90.5" y1="281.8199" y2="277.8199" stroke="black" stroke-width="1.0"/>
    <line x1="80.5" x2="90.5" y1="281.8199" y2="285.8199" stroke="black" stroke-width="1.0"/>
    <line x1="80.5" x2="316.5" y1="281.8199" y2="281.8199" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="97.5" y="276.0109">JWKCallback for DID private key</text>
    <line x1="315.5" x2="305.5" y1="313.5259" y2="309.5259" stroke="black" stroke-width="1.0"/>
    <line x1="315.5" x2="305.5" y1="313.5259" y2="317.5259" stroke="black" stroke-width="1.0"/>
    <line x1="80.5" x2="316.5" y1="313.5259" y2="313.5259" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="87.5" y="307.7169">DID private key</text>
    <path d="M9,326.5259 L9,353.5259 L308,353.5259 L308,336.5259 L298,326.5259 L9,326.5259 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M298,326.5259 L298,336.5259 L308,336.5259 L298,326.5259 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="15" y="345.4229">{ "kty": "OKP", "crv": "Ed25519", "x": "..", "d": ".." }</text>
    <path d="M13,370.2319 L80,370.2319 L80,379.2319 L70,389.2319 L13,389.2319 L13,370.2319 " fill="white" stroke="#000000" stroke-width="1.0"/>
    <rect fill="none" height="124.8241" width="361" x="13" y="370.2319" stroke="#000000" stroke-width="2.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" font-weight="bold" x="28" y="385.1289">opt</text>
    <text fill="black" font-family="sans-serif" font-size="11" font-weight="bold" x="95" y="383.9908">[Authentication with VCs/VPs]</text>
    <line x1="80.5" x2="90.5" y1="413.6439" y2="409.6439" stroke="black" stroke-width="1.0"/>
    <line x1="80.5" x2="90.5" y1="413.6439" y2="417.6439" stroke="black" stroke-width="1.0"/>
    <line x1="80.5" x2="316.5" y1="413.6439" y2="413.6439" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="97.5" y="407.8349">VCCallback for Verifiable Credentials</text>
    <line x1="315.5" x2="305.5" y1="445.3499" y2="441.3499" stroke="black" stroke-width="1.0"/>
    <line x1="315.5" x2="305.5" y1="445.3499" y2="449.3499" stroke="black" stroke-width="1.0"/>
    <line x1="80.5" x2="316.5" y1="445.3499" y2="445.3499" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="87.5" y="439.5409">Verifiable Credentials</text>
    <path d="M225,458.3499 L225,485.3499 L308,485.3499 L308,468.3499 L298,458.3499 L225,458.3499 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M298,458.3499 L298,468.3499 L308,468.3499 L298,458.3499 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="231" y="477.247">{ ... VCs ... }</text>
    <line x1="646.5" x2="636.5" y1="525.762" y2="521.762" stroke="black" stroke-width="1.0"/>
    <line x1="646.5" x2="636.5" y1="525.762" y2="529.762" stroke="black" stroke-width="1.0"/>
    <line x1="317.5" x2="647.5" y1="525.762" y2="525.762" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="324.5" y="519.953">Start SASL authentication</text>
    <line x1="317.5" x2="327.5" y1="557.468" y2="553.468" stroke="black" stroke-width="1.0"/>
    <line x1="317.5" x2="327.5" y1="557.468" y2="561.468" stroke="black" stroke-width="1.0"/>
    <line x1="317.5" x2="647.5" y1="557.468" y2="557.468" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="334.5" y="551.659">List of authn mechanisms</text>
    <line x1="646.5" x2="636.5" y1="589.174" y2="585.174" stroke="black" stroke-width="1.0"/>
    <line x1="646.5" x2="636.5" y1="589.174" y2="593.174" stroke="black" stroke-width="1.0"/>
    <line x1="317.5" x2="647.5" y1="589.174" y2="589.174" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="324.5" y="583.365">Selected authn mechanism "DID-CHALLENGE"</text>
    <line x1="648.5" x2="690.5" y1="620.88" y2="620.88" stroke="black" stroke-width="1.0"/>
    <line x1="690.5" x2="690.5" y1="620.88" y2="633.88" stroke="black" stroke-width="1.0"/>
    <line x1="649.5" x2="690.5" y1="633.88" y2="633.88" stroke="black" stroke-width="1.0"/>
    <line x1="649.5" x2="659.5" y1="633.88" y2="629.88" stroke="black" stroke-width="1.0"/>
    <line x1="649.5" x2="659.5" y1="633.88" y2="637.88" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="655.5" y="615.071">Generate DID Challenge</text>
    <path d="M235,646.88 L235,673.88 L639,673.88 L639,656.88 L629,646.88 L235,646.88 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M629,646.88 L629,656.88 L639,656.88 L629,646.88 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="241" y="665.777">&lt;1809528678543235072.1724868615672@java-sasl-xmpp-server&gt;</text>
    <line x1="317.5" x2="327.5" y1="707.2921" y2="703.2921" stroke="black" stroke-width="1.0"/>
    <line x1="317.5" x2="327.5" y1="707.2921" y2="711.2921" stroke="black" stroke-width="1.0"/>
    <line x1="317.5" x2="647.5" y1="707.2921" y2="707.2921" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="334.5" y="701.4831">DID Challenge (nonce, timestamp, realm)</text>
    <line x1="317.5" x2="359.5" y1="738.9981" y2="738.9981" stroke="black" stroke-width="1.0"/>
    <line x1="359.5" x2="359.5" y1="738.9981" y2="751.9981" stroke="black" stroke-width="1.0"/>
    <line x1="318.5" x2="359.5" y1="751.9981" y2="751.9981" stroke="black" stroke-width="1.0"/>
    <line x1="318.5" x2="328.5" y1="751.9981" y2="747.9981" stroke="black" stroke-width="1.0"/>
    <line x1="318.5" x2="328.5" y1="751.9981" y2="755.9981" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="324.5" y="733.1891">Generate DID Response with signature</text>
    <path d="M322,764.9981 L322,791.9981 L426,791.9981 L426,774.9981 L416,764.9981 L322,764.9981 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M416,764.9981 L416,774.9981 L426,774.9981 L416,764.9981 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="328" y="783.8951">&lt;..signature..&gt;</text>
    <line x1="646.5" x2="636.5" y1="825.4101" y2="821.4101" stroke="black" stroke-width="1.0"/>
    <line x1="646.5" x2="636.5" y1="825.4101" y2="829.4101" stroke="black" stroke-width="1.0"/>
    <line x1="317.5" x2="647.5" y1="825.4101" y2="825.4101" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="324.5" y="819.6011">DID Response (DID, signature)</text>
    <path d="M327,838.4101 L327,865.4101 L639,865.4101 L639,848.4101 L629,838.4101 L327,838.4101 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M629,838.4101 L629,848.4101 L639,848.4101 L629,838.4101 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="333" y="857.3071">did%3Akey%3A&lt;..did..&gt; 2mJ4tBo6H&lt;..signature..&gt;</text>
    <line x1="991" x2="981" y1="898.8221" y2="894.8221" stroke="black" stroke-width="1.0"/>
    <line x1="991" x2="981" y1="898.8221" y2="902.8221" stroke="black" stroke-width="1.0"/>
    <line x1="648.5" x2="992" y1="898.8221" y2="898.8221" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="655.5" y="893.0131">Resolve DID</text>
    <line x1="648.5" x2="658.5" y1="930.5282" y2="926.5282" stroke="black" stroke-width="1.0"/>
    <line x1="648.5" x2="658.5" y1="930.5282" y2="934.5282" stroke="black" stroke-width="1.0"/>
    <line x1="648.5" x2="992" y1="930.5282" y2="930.5282" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="665.5" y="924.7192">DID document with DID public key</text>
    <line x1="648.5" x2="690.5" y1="962.2342" y2="962.2342" stroke="black" stroke-width="1.0"/>
    <line x1="690.5" x2="690.5" y1="962.2342" y2="975.2342" stroke="black" stroke-width="1.0"/>
    <line x1="649.5" x2="690.5" y1="975.2342" y2="975.2342" stroke="black" stroke-width="1.0"/>
    <line x1="649.5" x2="659.5" y1="975.2342" y2="971.2342" stroke="black" stroke-width="1.0"/>
    <line x1="649.5" x2="659.5" y1="975.2342" y2="979.2342" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="655.5" y="956.4252">Verify DID Response with signature</text>
    <path d="M653,988.2342 L653,1015.2342 L699,1015.2342 L699,998.2342 L689,988.2342 L653,988.2342 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M689,988.2342 L689,998.2342 L699,998.2342 L689,988.2342 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="659" y="1007.1312">true</text>
    <path d="M118,1031.9402 L185,1031.9402 L185,1040.9402 L175,1050.9402 L118,1050.9402 L118,1031.9402 " fill="white" stroke="#000000" stroke-width="1.0"/>
    <rect fill="none" height="384.0602" width="749.5" x="118" y="1031.9402" stroke="#000000" stroke-width="2.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" font-weight="bold" x="133" y="1046.8372">opt</text>
    <text fill="black" font-family="sans-serif" font-size="11" font-weight="bold" x="200" y="1045.6991">[Authentication with VCs/VPs]</text>
    <line x1="648.5" x2="690.5" y1="1075.3522" y2="1075.3522" stroke="black" stroke-width="1.0"/>
    <line x1="690.5" x2="690.5" y1="1075.3522" y2="1088.3522" stroke="black" stroke-width="1.0"/>
    <line x1="649.5" x2="690.5" y1="1088.3522" y2="1088.3522" stroke="black" stroke-width="1.0"/>
    <line x1="649.5" x2="659.5" y1="1088.3522" y2="1084.3522" stroke="black" stroke-width="1.0"/>
    <line x1="649.5" x2="659.5" y1="1088.3522" y2="1092.3522" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="655.5" y="1069.5432">Generate VC/VP Challenge</text>
    <path d="M128,1101.3522 L128,1128.3522 L639,1128.3522 L639,1111.3522 L629,1101.3522 L128,1101.3522 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M629,1101.3522 L629,1111.3522 L639,1111.3522 L629,1101.3522 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="134" y="1120.2492">&lt;1809528678543235072.1724868615672.DegreeCredential@java-sasl-xmpp-server&gt;</text>
    <line x1="317.5" x2="327.5" y1="1161.7643" y2="1157.7643" stroke="black" stroke-width="1.0"/>
    <line x1="317.5" x2="327.5" y1="1161.7643" y2="1165.7643" stroke="black" stroke-width="1.0"/>
    <line x1="317.5" x2="647.5" y1="1161.7643" y2="1161.7643" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="334.5" y="1155.9553">VC/VP Challenge (nonce, timestamp, vc.type, realm)</text>
    <line x1="317.5" x2="359.5" y1="1193.4703" y2="1193.4703" stroke="black" stroke-width="1.0"/>
    <line x1="359.5" x2="359.5" y1="1193.4703" y2="1206.4703" stroke="black" stroke-width="1.0"/>
    <line x1="318.5" x2="359.5" y1="1206.4703" y2="1206.4703" stroke="black" stroke-width="1.0"/>
    <line x1="318.5" x2="328.5" y1="1206.4703" y2="1202.4703" stroke="black" stroke-width="1.0"/>
    <line x1="318.5" x2="328.5" y1="1206.4703" y2="1210.4703" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="324.5" y="1187.6613">Generate VC/VP Response with proof</text>
    <path d="M322,1219.4703 L322,1246.4703 L384,1246.4703 L384,1229.4703 L374,1219.4703 L322,1219.4703 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M374,1219.4703 L374,1229.4703 L384,1229.4703 L374,1219.4703 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="328" y="1238.3673">&lt;..vp..&gt;</text>
    <line x1="646.5" x2="636.5" y1="1279.8823" y2="1275.8823" stroke="black" stroke-width="1.0"/>
    <line x1="646.5" x2="636.5" y1="1279.8823" y2="1283.8823" stroke="black" stroke-width="1.0"/>
    <line x1="317.5" x2="647.5" y1="1279.8823" y2="1279.8823" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="324.5" y="1274.0733">VC/VP Response (VP)</text>
    <path d="M577,1292.8823 L577,1319.8823 L639,1319.8823 L639,1302.8823 L629,1292.8823 L577,1292.8823 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M629,1292.8823 L629,1302.8823 L639,1302.8823 L629,1292.8823 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="583" y="1311.7793">&lt;..vp..&gt;</text>
    <line x1="648.5" x2="690.5" y1="1353.2943" y2="1353.2943" stroke="black" stroke-width="1.0"/>
    <line x1="690.5" x2="690.5" y1="1353.2943" y2="1366.2943" stroke="black" stroke-width="1.0"/>
    <line x1="649.5" x2="690.5" y1="1366.2943" y2="1366.2943" stroke="black" stroke-width="1.0"/>
    <line x1="649.5" x2="659.5" y1="1366.2943" y2="1362.2943" stroke="black" stroke-width="1.0"/>
    <line x1="649.5" x2="659.5" y1="1366.2943" y2="1370.2943" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="655.5" y="1347.4853">Verify VC/VP Response with proof</text>
    <path d="M653,1379.2943 L653,1406.2943 L699,1406.2943 L699,1389.2943 L689,1379.2943 L653,1379.2943 " fill="white" stroke="black" stroke-width="1.0"/>
    <path d="M689,1379.2943 L689,1389.2943 L699,1389.2943 L689,1379.2943 " fill="white" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="659" y="1398.1914">true</text>
    <line x1="869.5" x2="859.5" y1="1446.7064" y2="1442.7064" stroke="black" stroke-width="1.0"/>
    <line x1="869.5" x2="859.5" y1="1446.7064" y2="1450.7064" stroke="black" stroke-width="1.0"/>
    <line x1="648.5" x2="870.5" y1="1446.7064" y2="1446.7064" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="655.5" y="1440.8974">NameCallback with DID</text>
    <line x1="648.5" x2="658.5" y1="1478.4124" y2="1474.4124" stroke="black" stroke-width="1.0"/>
    <line x1="648.5" x2="658.5" y1="1478.4124" y2="1482.4124" stroke="black" stroke-width="1.0"/>
    <line x1="648.5" x2="870.5" y1="1478.4124" y2="1478.4124" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="665.5" y="1472.6034">(empty)</text>
    <line x1="869.5" x2="859.5" y1="1510.1184" y2="1506.1184" stroke="black" stroke-width="1.0"/>
    <line x1="869.5" x2="859.5" y1="1510.1184" y2="1514.1184" stroke="black" stroke-width="1.0"/>
    <line x1="648.5" x2="870.5" y1="1510.1184" y2="1510.1184" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="655.5" y="1504.3094">AuthorizeCallback</text>
    <line x1="648.5" x2="658.5" y1="1541.8244" y2="1537.8244" stroke="black" stroke-width="1.0"/>
    <line x1="648.5" x2="658.5" y1="1541.8244" y2="1545.8244" stroke="black" stroke-width="1.0"/>
    <line x1="648.5" x2="870.5" y1="1541.8244" y2="1541.8244" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="665.5" y="1536.0154">authorized=true with DID</text>
    <line x1="317.5" x2="327.5" y1="1573.5304" y2="1569.5304" stroke="black" stroke-width="1.0"/>
    <line x1="317.5" x2="327.5" y1="1573.5304" y2="1577.5304" stroke="black" stroke-width="1.0"/>
    <line x1="317.5" x2="647.5" y1="1573.5304" y2="1573.5304" stroke="black" stroke-width="1.0"/>
    <text fill="black" font-family="sans-serif" font-size="13" x="334.5" y="1567.7214">Completed SASL authentication</text>
    <!--MD5=[83349222c5899734810a125d7a49a60f]
@startuml

title "The DID-CHALLENGE SASL mechanism with VCs"
participant ProtocolClient as "Protocol Client"
participant SASLClient as "SASL Client"
participant SASLServer as "SASL Server"
participant ProtocolServer as "Protocol Server"
participant DIDResolver as "DID Resolver"
ProtocolClient- ->ProtocolServer: Network Connection
ProtocolClient->>SASLClient: Start login
SASLClient->>ProtocolClient: NameCallback for DID
ProtocolClient->>SASLClient: DID
note left of SASLClient: did%3Akey%3A<..did..>
SASLClient->>ProtocolClient: JWKCallback for DID private key
ProtocolClient->>SASLClient: DID private key
note left of SASLClient: { "kty": "OKP", "crv": "Ed25519", "x": "..", "d": ".." }
opt Authentication with VCs/VPs
    SASLClient->>ProtocolClient: VCCallback for Verifiable Credentials
    ProtocolClient->>SASLClient: Verifiable Credentials
    note left of SASLClient: { ... VCs ... }
end
SASLClient->>SASLServer: Start SASL authentication
SASLServer->>SASLClient: List of authn mechanisms
SASLClient->>SASLServer: Selected authn mechanism "DID-CHALLENGE"
SASLServer->>SASLServer: Generate DID Challenge
note left of SASLServer: <1809528678543235072.1724868615672@java-sasl-xmpp-server>
SASLServer->>SASLClient: DID Challenge (nonce, timestamp, realm)
SASLClient->>SASLClient: Generate DID Response with signature
note right of SASLClient: <..signature..>
SASLClient->>SASLServer: DID Response (DID, signature)
note left of SASLServer: did%3Akey%3A<..did..> 2mJ4tBo6H<..signature..>
SASLServer->>DIDResolver: Resolve DID
DIDResolver->>SASLServer: DID document with DID public key
SASLServer->>SASLServer: Verify DID Response with signature
note right of SASLServer: true
opt Authentication with VCs/VPs
    SASLServer->>SASLServer: Generate VC/VP Challenge
    note left of SASLServer: <1809528678543235072.1724868615672.DegreeCredential@java-sasl-xmpp-server>
    SASLServer->>SASLClient: VC/VP Challenge (nonce, timestamp, vc.type, realm)
    SASLClient->>SASLClient: Generate VC/VP Response with proof
    note right of SASLClient: <..vp..>
    SASLClient->>SASLServer: VC/VP Response (VP)
    note left of SASLServer: <..vp..>
    SASLServer->>SASLServer: Verify VC/VP Response with proof
    note right of SASLServer: true
end
SASLServer->>ProtocolServer: NameCallback with DID
ProtocolServer->>SASLServer: (empty)
SASLServer->>ProtocolServer: AuthorizeCallback
ProtocolServer->>SASLServer: authorized=true with DID
SASLServer->>SASLClient: Completed SASL authentication

@enduml

PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 21.0.10+7-Debian-1
Operating System: Linux
Default Encoding: UTF-8
Language: en
Country: US
-->
  </g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[                                                                             "The DID-CHALLENGE SASL mechanism with VCs"                                                                        
                                                                                                                                                                                                
                    ┌───────────────┐                        ┌───────────┐                                       ┌───────────┐                         ┌───────────────┐          ┌────────────┐
                    │Protocol Client│                        │SASL Client│                                       │SASL Server│                         │Protocol Server│          │DID Resolver│
                    └───────┬───────┘                        └─────┬─────┘                                       └─────┬─────┘                         └───────┬───────┘          └─────┬──────┘
                            │                                      │                Network Connection                 │                                       │                        │       
                            │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ >│                        │       
                            │                                      │                                                   │                                       │                        │       
                            │             Start login              │                                                   │                                       │                        │       
                            │─────────────────────────────────────>│                                                   │                                       │                        │       
                            │                                      │                                                   │                                       │                        │       
                            │        NameCallback for DID          │                                                   │                                       │                        │       
                            │<─────────────────────────────────────│                                                   │                                       │                        │       
                            │                                      │                                                   │                                       │                        │       
                            │                 DID                  │                                                   │                                       │                        │       
                            │─────────────────────────────────────>│                                                   │                                       │                        │       
                            │                                      │                                                   │                                       │                        │       
                            │            ╔═══════════════════════╗ │                                                   │                                       │                        │       
                            │            ║did%3Akey%3A<..did..> ░║ │                                                   │                                       │                        │       
                            │            ╚═══════════════════════╝ │                                                   │                                       │                        │       
                            │   JWKCallback for DID private key    │                                                   │                                       │                        │       
                            │<─────────────────────────────────────│                                                   │                                       │                        │       
                            │                                      │                                                   │                                       │                        │       
                            │           DID private key            │                                                   │                                       │                        │       
                            │─────────────────────────────────────>│                                                   │                                       │                        │       
                            │                                      │                                                   │                                       │                        │       
      ╔═════════════════════╧════════════════════════════════════╗ │                                                   │                                       │                        │       
      ║{ "kty": "OKP", "crv": "Ed25519", "x": "..", "d": ".." } ░║ │                                                   │                                       │                        │       
      ╚═════════════════════╤════════════════════════════════════╝ │                                                   │                                       │                        │       
                            │                                      │                                                   │                                       │                        │       
          ╔══════╤══════════╪══════════════════════════════════════╪═══════════════╗                                   │                                       │                        │       
          ║ OPT  │  Authentication with VCs/VPs                    │               ║                                   │                                       │                        │       
          ╟──────┘          │                                      │               ║                                   │                                       │                        │       
          ║                 │VCCallback for Verifiable Credentials │               ║                                   │                                       │                        │       
          ║                 │<─────────────────────────────────────│               ║                                   │                                       │                        │       
          ║                 │                                      │               ║                                   │                                       │                        │       
          ║                 │       Verifiable Credentials         │               ║                                   │                                       │                        │       
          ║                 │─────────────────────────────────────>│               ║                                   │                                       │                        │       
          ║                 │                                      │               ║                                   │                                       │                        │       
          ║                 │                  ╔═════════════════╗ │               ║                                   │                                       │                        │       
          ║                 │                  ║{ ... VCs ... } ░║ │               ║                                   │                                       │                        │       
          ╚═════════════════╪══════════════════╚═════════════════╝═╪═══════════════╝                                   │                                       │                        │       
                            │                                      │                                                   │                                       │                        │       
                            │                                      │            Start SASL authentication              │                                       │                        │       
                            │                                      │──────────────────────────────────────────────────>│                                       │                        │       
                            │                                      │                                                   │                                       │                        │       
                            │                                      │             List of authn mechanisms              │                                       │                        │       
                            │                                      │<──────────────────────────────────────────────────│                                       │                        │       
                            │                                      │                                                   │                                       │                        │       
                            │                                      │     Selected authn mechanism "DID-CHALLENGE"      │                                       │                        │       
                            │                                      │──────────────────────────────────────────────────>│                                       │                        │       
                            │                                      │                                                   │                                       │                        │       
                            │                                      │                                                   ────┐                                   │                        │       
                            │                                      │                                                       │ Generate DID Challenge            │                        │       
                            │                                      │                                                   <───┘                                   │                        │       
                            │                                      │                                                   │                                       │                        │       
                            │                            ╔═════════╧═════════════════════════════════════════════════╗ │                                       │                        │       
                            │                            ║<1809528678543235072.1724868615672@java-sasl-xmpp-server> ░║ │                                       │                        │       
                            │                            ╚═════════╤═════════════════════════════════════════════════╝ │                                       │                        │       
                            │                                      │     DID Challenge (nonce, timestamp, realm)       │                                       │                        │       
                            │                                      │<──────────────────────────────────────────────────│                                       │                        │       
                            │                                      │                                                   │                                       │                        │       
                            │                                      ────┐                                               │                                       │                        │       
                            │                                          │ Generate DID Response with signature          │                                       │                        │       
                            │                                      <───┘                                               │                                       │                        │       
                            │                                      │                                                   │                                       │                        │       
                            │                                      │ ╔═════════════════╗                               │                                       │                        │       
                            │                                      │ ║<..signature..> ░║                               │                                       │                        │       
                            │                                      │ ╚═════════════════╝                               │                                       │                        │       
                            │                                      │          DID Response (DID, signature)            │                                       │                        │       
                            │                                      │──────────────────────────────────────────────────>│                                       │                        │       
                            │                                      │                                                   │                                       │                        │       
                            │                                      │╔════════════════════════════════════════════════╗ │                                       │                        │       
                            │                                      │║did%3Akey%3A<..did..> 2mJ4tBo6H<..signature..> ░║ │                                       │                        │       
                            │                                      │╚════════════════════════════════════════════════╝ │                                       │                        │       
                            │                                      │                                                   │                          Resolve DID  │                        │       
                            │                                      │                                                   │───────────────────────────────────────────────────────────────>│       
                            │                                      │                                                   │                                       │                        │       
                            │                                      │                                                   │               DID document with DID public key                 │       
                            │                                      │                                                   │<───────────────────────────────────────────────────────────────│       
                            │                                      │                                                   │                                       │                        │       
                            │                                      │                                                   ────┐                                   │                        │       
                            │                                      │                                                       │ Verify DID Response with signature│                        │       
                            │                                      │                                                   <───┘                                   │                        │       
                            │                                      │                                                   │                                       │                        │       
                            │                                      │                                                   │ ╔══════╗                              │                        │       
                            │                                      │                                                   │ ║true ░║                              │                        │       
                            │                                      │                                                   │ ╚══════╝                              │                        │       
                            │                                      │                                                   │                                       │                        │       
                            │    ╔══════╤══════════════════════════╪═══════════════════════════════════════════════════╪═══════════════════════════════════════╪═╗                      │       
                            │    ║ OPT  │  Authentication with VCs/VPs                                                 │                                       │ ║                      │       
                            │    ╟──────┘                          │                                                   │                                       │ ║                      │       
                            │    ║                                 │                                                   ────┐                                   │ ║                      │       
                            │    ║                                 │                                                       │ Generate VC/VP Challenge          │ ║                      │       
                            │    ║                                 │                                                   <───┘                                   │ ║                      │       
                            │    ║                                 │                                                   │                                       │ ║                      │       
                            │    ║      ╔══════════════════════════╧═════════════════════════════════════════════════╗ │                                       │ ║                      │       
                            │    ║      ║<1809528678543235072.1724868615672.DegreeCredential@java-sasl-xmpp-server> ░║ │                                       │ ║                      │       
                            │    ║      ╚══════════════════════════╤═════════════════════════════════════════════════╝ │                                       │ ║                      │       
                            │    ║                                 │VC/VP Challenge (nonce, timestamp, vc.type, realm) │                                       │ ║                      │       
                            │    ║                                 │<──────────────────────────────────────────────────│                                       │ ║                      │       
                            │    ║                                 │                                                   │                                       │ ║                      │       
                            │    ║                                 ────┐                                               │                                       │ ║                      │       
                            │    ║                                     │ Generate VC/VP Response with proof            │                                       │ ║                      │       
                            │    ║                                 <───┘                                               │                                       │ ║                      │       
                            │    ║                                 │                                                   │                                       │ ║                      │       
                            │    ║                                 │ ╔══════════╗                                      │                                       │ ║                      │       
                            │    ║                                 │ ║<..vp..> ░║                                      │                                       │ ║                      │       
                            │    ║                                 │ ╚══════════╝                                      │                                       │ ║                      │       
                            │    ║                                 │               VC/VP Response (VP)                 │                                       │ ║                      │       
                            │    ║                                 │──────────────────────────────────────────────────>│                                       │ ║                      │       
                            │    ║                                 │                                                   │                                       │ ║                      │       
                            │    ║                                 │                                      ╔══════════╗ │                                       │ ║                      │       
                            │    ║                                 │                                      ║<..vp..> ░║ │                                       │ ║                      │       
                            │    ║                                 │                                      ╚══════════╝ │                                       │ ║                      │       
                            │    ║                                 │                                                   ────┐                                   │ ║                      │       
                            │    ║                                 │                                                       │ Verify VC/VP Response with proof  │ ║                      │       
                            │    ║                                 │                                                   <───┘                                   │ ║                      │       
                            │    ║                                 │                                                   │                                       │ ║                      │       
                            │    ║                                 │                                                   │ ╔══════╗                              │ ║                      │       
                            │    ║                                 │                                                   │ ║true ░║                              │ ║                      │       
                            │    ╚═════════════════════════════════╪═══════════════════════════════════════════════════╪═╚══════╝══════════════════════════════╪═╝                      │       
                            │                                      │                                                   │                                       │                        │       
                            │                                      │                                                   │        NameCallback with DID          │                        │       
                            │                                      │                                                   │──────────────────────────────────────>│                        │       
                            │                                      │                                                   │                                       │                        │       
                            │                                      │                                                   │               (empty)                 │                        │       
                            │                                      │                                                   │<──────────────────────────────────────│                        │       
                            │                                      │                                                   │                                       │                        │       
                            │                                      │                                                   │          AuthorizeCallback            │                        │       
                            │                                      │                                                   │──────────────────────────────────────>│                        │       
                            │                                      │                                                   │                                       │                        │       
                            │                                      │                                                   │       authorized=true with DID        │                        │       
                            │                                      │                                                   │<──────────────────────────────────────│                        │       
                            │                                      │                                                   │                                       │                        │       
                            │                                      │          Completed SASL authentication            │                                       │                        │       
                            │                                      │<──────────────────────────────────────────────────│                                       │                        │       
                    ┌───────┴───────┐                        ┌─────┴─────┐                                       ┌─────┴─────┐                         ┌───────┴───────┐          ┌─────┴──────┐
                    │Protocol Client│                        │SASL Client│                                       │SASL Server│                         │Protocol Server│          │DID Resolver│
                    └───────────────┘                        └───────────┘                                       └───────────┘                         └───────────────┘          └────────────┘
]]></artwork></artset></figure>

</section>
<section anchor="example-exchange"><name>Example Exchange</name>

<section anchor="step-1-client-namecallback-for-did"><name>Step 1: Client NameCallback for DID</name>

<t>When the client is initialized, it obtains a DID to be used for authentication.</t>

<figure><artwork><![CDATA[
-- CLIENT CALLBACK: NameCallback
    
>C Client DID:  --- defaultName: null, name: null
getName() -> did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D
C> DID:  --- defaultName: null, name: did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D
]]></artwork></figure>

</section>
<section anchor="step-2-client-jwkcallback-for-private-key"><name>Step 2: Client JWKCallback for Private Key</name>

<t>When the client is initialized, it obtains a private key that will be used for
signing challenges.</t>

<figure><artwork><![CDATA[
-- CLIENT CALLBACK: JWKCallback

>C Client private key:  --- defaultText: (JWK), text: null
getTextInputJWK() -> {
    "kid": "did:key:z6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D#z6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D",
    "kty": "OKP",
    "crv": "Ed25519",
    "x": "EbV6-hVmDiD3DKTUgsf2SjjnO7t0ttwMhStQ5JyCFhw",
    "d": "vGjHIZzZxS3R4mo-V0I_S72ULXDqa2INqkAtuvqJUN8"
}
C> Private key:  --- defaultText: (JWK), text: {
  "kid": "did:key:z6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D#z6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D",
  "kty": "OKP",
  "crv": "Ed25519",
  "x": "EbV6-hVmDiD3DKTUgsf2SjjnO7t0ttwMhStQ5JyCFhw",
  "d": "vGjHIZzZxS3R4mo-V0I_S72ULXDqa2INqkAtuvqJUN8"
}
]]></artwork></figure>

</section>
<section anchor="step-3-server-client-challenge"><name>Step 3: Server -&gt; Client Challenge</name>

<t>The server initiates the authentication flow by generating and sending a challenge. The challenge
contains a none, timestamp, and realm.</t>

<figure><artwork><![CDATA[
-- SERVER -> CLIENT: Challenge
<4513455346757278126.1757192932938@java-sasl-xmpp-server>
]]></artwork></figure>

</section>
<section anchor="step-4-client-signature"><name>Step 4: Client Signature</name>

<t>The client signs the challenge using the DID's private key.</t>

<figure><artwork><![CDATA[
-- CLIENT
Created signature for challenge <4513455346757278126.1757192932938@java-sasl-xmpp-server>: frEko8nWU-rfArpMZsMVbXpg4xChaQIv_MCmIAmHD3OCWwYvL7CDOedMbezMs4pmGGuzpkRH2QX8UMa-RFToBg
]]></artwork></figure>

</section>
<section anchor="step-5-client-server-response"><name>Step 5: Client -&gt; Server Response</name>

<t>The client response to the server with the DID and the signed challenge.</t>

<figure><artwork><![CDATA[
-- CLIENT -> SERVER: Response
did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D frEko8nWU-rfArpMZsMVbXpg4xChaQIv_MCmIAmHD3OCWwYvL7CDOedMbezMs4pmGGuzpkRH2QX8UMa-RFToBg
]]></artwork></figure>

</section>
<section anchor="step-6-server-namecallback-with-did"><name>Step 6: Server NameCallback with DID</name>

<t>The server obtains the DID from the client's response.</t>

<figure><artwork><![CDATA[
-- SERVER CALLBACK: NameCallback

>S DID:  --- defaultName: did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D, name: null
checkName(did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D) --> did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D
S> DID:  --- defaultName: did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D, name: did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D
]]></artwork></figure>

</section>
<section anchor="step-7-server-verification"><name>Step 7: Server Verification</name>

<t>The server verifies the signature in the client's response by resolving the client's DID to a DID document, which
contains public keys need for the verification.</t>

<figure><artwork><![CDATA[
-- SERVER
Verified signature frEko8nWU-rfArpMZsMVbXpg4xChaQIv_MCmIAmHD3OCWwYvL7CDOedMbezMs4pmGGuzpkRH2QX8UMa-RFToBg for challenge <4513455346757278126.1757192932938@java-sasl-xmpp-server>: true
]]></artwork></figure>

</section>
<section anchor="step-8-server-authorizecallback-with-authorization-id"><name>Step 8: Server AuthorizeCallback with authorization ID</name>

<t>The server determines the DID as the "authorized ID", concluding the authentication flow.</t>

<figure><artwork><![CDATA[
-- SERVER CALLBACK: AuthorizeCallback

>S --- authenticationID: did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D, authorizationID: did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D, authorizedID: null, isAuthorized: false
S> --- authenticationID: did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D, authorizationID: did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D, authorizedID: did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D, isAuthorized: true

authorizationId: did%3Akey%3Az6MkfePUhxLV6cM54cgZ4bGmnEdTNm3WDf4arwh5kR3dH51D
]]></artwork></figure>

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

<t>This section addresses the security properties of the DID-CHALLENGE
SASL mechanism and the threats it is, and is not, designed to
counter. Implementers SHOULD also consult the security
considerations of the SASL framework (<eref target="https://www.rfc-editor.org/rfc/rfc4422.html">RFC4422</eref>), the
<eref target="https://www.w3.org/TR/did-1.1/">W3C Decentralized Identifiers v1.1</eref>
specification, and, when the
optional VC/VP extension is used, the <eref target="https://www.w3.org/TR/2025/REC-vc-data-model-2.0-20250515/#types">W3C Verifiable Credentials
Data Model 2.0</eref> specification.</t>

<section anchor="mechanism-strength"><name>Mechanism Strength</name>

<t>The DID-CHALLENGE mechanism authenticates clients by asymmetric
cryptography rather than by transmitting a password or a password-
derived value. This eliminates an entire class of server-side risks
present in password-based SASL mechanisms such as PLAIN or DIGEST-
MD5: a compromise of the server's credential store yields no
material that can be used to impersonate clients.</t>

<t>The security of the mechanism depends on the following properties
holding simultaneously: (a) the signature algorithm is
computationally infeasible to forge; (b) the client's private key
has not been compromised; (c) the DID resolver consulted by the
server returns an authentic DID document (see <xref target="choosing-and-trusting-did-resolvers"></xref>; and
(d) the authentication exchange is protected from observation and
tampering by a lower-layer security protocol (see <xref target="requirement-for-a-confidential-channel"></xref>).
If any of these properties fails to hold, the security guarantees
of the mechanism are reduced or eliminated entirely.</t>

</section>
<section anchor="requirement-for-a-confidential-channel"><name>Requirement for a Confidential Channel</name>

<t>The DID-CHALLENGE mechanism does not itself provide a security
layer (confidentiality or integrity protection of the application-
layer data stream after authentication). The client transmits its
DID and a cryptographic signature in the clear at the SASL layer.
An eavesdropper learns the client's DID, which may be linkable to
the client's real-world identity, and obtains a valid signature
over a server-chosen challenge string.</t>

<t>The DID-CHALLENGE mechanism MUST NOT be used over an unprotected
channel. Implementations MUST employ TLS (<eref target="https://www.rfc-editor.org/rfc/rfc8446.html">RFC8446</eref>) or an
equivalent protocol providing both confidentiality and integrity
before initiating a DID-CHALLENGE exchange.</t>

<t>When the optional VC/VP extension (see <xref target="optional-authentication-with-vcsvps"></xref>) is used, this
requirement is especially critical. Verifiable Presentations may
contain sensitive personal attributes — such as name, date of
birth, or professional credentials — that are transmitted in the
clear at the SASL layer and MUST be protected by the underlying
confidentiality layer.</t>

</section>
<section anchor="replay-attacks"><name>Replay Attacks</name>

<t>The DID Challenge includes a nonce and a timestamp to prevent
replay attacks. The nonce MUST be generated by a cryptographically
strong pseudo-random number generator and MUST be unique per
challenge. The server MUST maintain a record of all nonces issued
within the active timestamp window and MUST reject any DID Response
whose nonce has already been accepted. A server that reuses nonces
or fails to track them renders the replay defence ineffective.</t>

<t>The timestamp provides a complementary time-bounded validity window.
The server MUST reject any DID Response whose challenge timestamp
lies outside a configured acceptance window, with a RECOMMENDED
default of no more than 5 minutes. Server clocks SHOULD be
synchronized via NTP or an equivalent mechanism, since excessive
clock skew will cause legitimate authentications to be rejected or,
if compensated by widening the window, increase replay exposure.</t>

<t>Both controls apply equally to the VC/VP Challenge and VC/VP
Response defined in <xref target="optional-authentication-with-vcsvps"></xref>. Servers MUST track VC/VP nonces
independently and apply the same timestamp validation.</t>

</section>
<section anchor="man-in-the-middle-attacks-and-channel-binding"><name>Man-in-the-Middle Attacks and Channel Binding</name>

<t>Because the client signs a server-supplied challenge, a man-in-the-
middle adversary who can intercept and substitute the challenge
could induce the client to produce a signature the adversary then
uses to authenticate to the real server. Running the exchange over
TLS substantially raises the bar for this attack. To eliminate it
entirely, implementations SHOULD incorporate a TLS channel binding
value (see <eref target="https://www.rfc-editor.org/rfc/rfc5929.html">RFC5929</eref>)
into the signed material, so that a signature
produced within one TLS session cannot be transferred to another.</t>

<t>The realm field in the challenge binds the signature to a specific
service context. Clients MUST verify that the realm in the
received challenge matches the service they intend to authenticate
to before computing the DID Response, and MUST abort the exchange
on a mismatch.</t>

</section>
<section anchor="server-spoofing-and-mutual-authentication"><name>Server Spoofing and Mutual Authentication</name>

<t>The DID-CHALLENGE mechanism provides unilateral authentication: the
client proves its identity to the server, but the server does not
prove its identity to the client beyond what is provided by the
underlying transport. A malicious server can issue a legitimate-
looking challenge and collect a valid DID Response.</t>

<t>Clients MUST validate the server's TLS certificate against a
trusted certification authority or equivalent trust anchor before
initiating a DID-CHALLENGE exchange. Clients MUST NOT proceed if
certificate validation fails. Deployments with stronger mutual-
authentication requirements MAY combine DID-CHALLENGE with a DID-
based server-authentication step at the application layer, though
this is outside the scope of this specification.</t>

</section>
<section anchor="choosing-and-trusting-did-resolvers"><name>Choosing and Trusting DID Resolvers</name>

<t>The server verifies the client's signature using public key
material obtained by resolving the client's DID. A malicious or
compromised DID resolver that returns a fraudulent DID document
could substitute attacker-controlled key material, allowing
impersonation of an arbitrary DID. As discussed in
<eref target="https://www.w3.org/TR/did-1.1/#choosing-did-resolvers">W3C DIDs v1.1 - Choosing DID Resolvers</eref>,
there is no universal authority that mandates a
correct resolver implementation for a given DID method; server
implementers MUST select DID resolver software they have
independently verified and trust.</t>

<t>The network path between the server and its DID resolver SHOULD be
protected by TLS. Where the DID method supports it, the integrity
of the retrieved DID document SHOULD be verified using content
integrity mechanisms before its key material is used. Servers
SHOULD restrict the set of accepted DID methods to those whose
resolver implementations and underlying registries have undergone
independent security review.</t>

</section>
<section anchor="key-revocation-rotation-and-did-method-properties"><name>Key Revocation, Rotation, and DID Method Properties</name>

<t>A DID controller who suspects key compromise SHOULD immediately
update the DID document to revoke or rotate the affected
verification method. There is an inherent window of exposure
between the moment of compromise and the moment the revocation
propagates to the server's resolver; its duration depends on
registry propagation speed and the server's cache refresh policy.
Servers MUST NOT rely indefinitely on cached DID documents, and
SHOULD treat a DID resolution failure as an authentication failure
rather than silently falling back to stale cached data.</t>

<t>DID methods differ significantly in their security properties.
Methods such as "did:key" encode the public key directly in the
identifier and support neither revocation nor rotation; a
compromised private key cannot be remediated and the DID must be
abandoned entirely. Methods anchored in distributed ledgers or
similar registries support revocation but introduce availability
and integrity dependencies on that infrastructure. Methods based
on DNS (such as "did:web") inherit the DNS attack surface,
including susceptibility to hijacking.</t>

<t>Servers SHOULD maintain an explicit list of accepted DID methods
and SHOULD prefer those whose specifications have undergone
independent security review, as required by
<eref target="https://www.w3.org/TR/did-1.1/#security-requirements">W3C DIDs v1.1 - Security Requirements</eref>.</t>

</section>
<section anchor="non-repudiation"><name>Non-Repudiation</name>

<t>The DID Response is a cryptographic signature over a challenge that
encodes a unique nonce, a timestamp, and the server's realm.
Provided the client's private key is used exclusively by the DID
controller and has not been compromised, this signature constitutes
evidence that the DID controller authenticated to the specified
server at approximately the time encoded in the challenge. This
property, discussed in
<eref target="https://www.w3.org/TR/did-1.1/#non-repudiation">W3C DIDs v1.1 - Non-Repudiation</eref>, supports non-
repudiation of authentication events. Deployments that require
non-repudiation for compliance or forensic purposes SHOULD log and
archive authentication exchanges accordingly.</t>

</section>
<section anchor="authentication-vs-authorization"><name>Authentication vs. Authorization</name>

<t>Successful completion of the DID-CHALLENGE exchange proves that the
client controls a private key corresponding to a verification method
listed under the "authentication" relationship in its DID document.
This proves control of the DID; it does not by itself confer any
authorization to access resources on the server. Servers MUST
maintain and enforce an authorization policy that maps authenticated
DIDs to permitted operations, independently of the authentication
outcome.</t>

</section>
<section anchor="private-key-protection"><name>Private Key Protection</name>

<t>The security of DID-CHALLENGE rests entirely on the secrecy of the
client's private key. An adversary who obtains the private key can
authenticate as the corresponding DID until the DID document is
updated to revoke the associated verification method — and, for DID
methods that do not support revocation, indefinitely.</t>

<t>Client implementations MUST protect private keys in a manner
commensurate with the sensitivity of the resources being accessed.
Suitable measures include hardware security modules (HSMs),
operating-system-provided secure key storage, or encrypted software
key stores protected by a strong passphrase. Private keys MUST NOT
be stored in plaintext. Implementers MUST ensure that the
JWKCallback interface does not expose the private key to
unauthorized processes or log files.</t>

</section>
<section anchor="security-of-the-optional-vcvp-extension"><name>Security of the Optional VC/VP Extension</name>

<t>When the optional VC/VP extension is used, the server MUST
additionally verify: that the VP proof is valid and was produced
using a key with an "assertionMethod" relationship in the client's
DID document; that the VP "holder" property matches the
authenticated DID; that each credential's issuer signature is
valid; that no credential has expired or been revoked; and that the
credential type matches the type requested in the VC/VP Challenge.</t>

<t>Servers MUST implement credential status checking to detect revoked
credentials, and MUST maintain an explicit issuer trust policy,
rejecting credentials from issuers not covered by that policy. The
trustworthiness of a credential issuer cannot be inferred from the
credential itself. Finally, servers SHOULD request only the
credential types strictly necessary for the access-control decision
being made, to minimise unnecessary disclosure of personal
information, particularly given that VPs are transmitted in the
clear at the SASL layer (see <xref target="requirement-for-a-confidential-channel"></xref>).</t>

</section>
</section>
<section anchor="implementations"><name>Implementations</name>

<t>The following repositories contain various parts of an example implementation:</t>

<t><list style="symbols">
  <t>SASL client demonstration components: <eref target="https://github.com/peacekeeper/java-sasl-client-demo">https://github.com/peacekeeper/java-sasl-client-demo</eref></t>
  <t>SASL server demonstration components: <eref target="https://github.com/peacekeeper/java-sasl-server-demo">https://github.com/peacekeeper/java-sasl-server-demo</eref></t>
  <t>SASL local "Hello World" demonstration: <eref target="https://github.com/peacekeeper/java-sasl-local-demo">https://github.com/peacekeeper/java-sasl-local-demo</eref></t>
  <t>Implementation of a DID-based SASL authentication mechanism: <eref target="https://github.com/peacekeeper/java-sasl-did-mechanism">https://github.com/peacekeeper/java-sasl-did-mechanism</eref></t>
  <t>XMPP server (based on Tigase) using the DID-based SASL authentication mechanism: <eref target="https://github.com/peacekeeper/java-sasl-xmpp-server">https://github.com/peacekeeper/java-sasl-xmpp-server</eref></t>
  <t>XMPP client demo (based on Tigase) using the DID-based SASL authentication mechanism: <eref target="https://github.com/peacekeeper/java-sasl-xmpp-client-tigase">https://github.com/peacekeeper/java-sasl-xmpp-client-tigase</eref></t>
  <t>XMPP client demo (based on Smack) using the DID-based SASL authentication mechanism: <eref target="https://github.com/peacekeeper/java-sasl-xmpp-client-smack">https://github.com/peacekeeper/java-sasl-xmpp-client-smack</eref></t>
  <t>XMPP client plugin (based on Spark) using the DID-based SASL authentication mechanism: <eref target="https://github.com/peacekeeper/java-sasl-xmpp-client-spark">https://github.com/peacekeeper/java-sasl-xmpp-client-spark</eref></t>
  <t>XMPP client application (based on Spark) using the DID-based SASL authentication mechanism: <eref target="https://github.com/peacekeeper/java-sasl-xmpp-client-spark">https://github.com/peacekeeper/java-sasl-xmpp-client-spark</eref></t>
</list></t>

</section>


  </middle>

  <back>








  </back>

<!-- ##markdown-source:
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
DiKWxshmxeA91cYyHqrt3vbh3vbOweHOFv6vxzcweMPDBlsHV9s7mp0Qdz5H
brpwVeEDB1oJa29g1Zv1s612s47qPcrtBajYl/yFJcjLZRWGLSxXuUzhmj0q
2i6HRXRMCvNMCqz4fidKpUf0tIyY+W5vH5N1eea0ooJ0YM6VEF+xkdB7TzaV
Hu4+BftLTsthgsrPn4DzAaCkOodU8F7oU/WCxjBjrsJvTJEqB6VrvK/99u+9
9vdu+T3xp4r8qeSm0guOtpaKGLMf7LV1rlQZBUuUuDnYO3qQnwLttCNnlEsd
3wLm8RSD/iLNJlkT507W3WZQhdEPzOlZgo3ev/b0GQunHIwVQxeXNtTQQ2Yq
+sBTAx07bsI+twUSBioQDuDJAZjyRjSYtZXMJQo1U4bxtwnndK4+zie4jTmd
GWNoNsaYDpkwG455GYODgA00z3jRpN3W3BCDyaDPX6U7+/vbz1BCGW0+4zA4
XO+8zZsMvuqZtCV9gWS0Ppvp7FL+BvzmtlRGRlqMSlHF1i8ALUdbvMjlsooT
T90O2Bttxkgp1RB84gewDUBparoqOLYqHPwYnaNd0tCf49rxcf3qpjwqvvsQ
1ePjujr/QZ5fj76vJnsfgRv+eDb/0/nJ7Ox49vp0993Jd7f/Nn9zeHL6TqTn
I/HrudyrZt980/5a3bx/vfPH748+nMfR+6+vyq8m1mP0pdFxgOJJvV6Tf6mD
NSc2hFvFoEqz+4bbO6ej9nu8gyve1k+YVaCZQL2iHu+o9oDfTA4nMhtdllCY
61VbTJYF+zrI16lgPxn7qdnSAc2s9po6m1HeLmogB8rnmMZz8Tit2oH+76he
P7iDVvetrq937DrbdasEyN/CC1gIp7w2o8QrGmgvBa0+5h5GmDatRYQO9P19
rfdiMldNCX4sxgcayIqMYW0+jlul11F78X1wYwrQ0tKlj01KVSktJEgn5Qt+
T0unRLQbmgowvHjshHjXaFEay+RztCyMgeON/ylXLGVdQpVE8CGZPAXCgJQV
r/K4aNpZHrXNx0YdWOW9q9UHVm1SoMdw+y5Lsgo68wudJTvRyWvw6sxXXH0X
tsexvLY09Lp2l0ox2Hbq8+r5vbZ2/lXtYWVuf1xl8+2GeY+Fq4mil+HwQ/5W
NLQfpA9toSLt9Hn50i1xyC8bmBt4bZIVzH0PjcJeMHA8EydAzhFYccqGA2B3
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
ncT/0sv6/3WIYRHriAAA

-->

</rfc>

