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


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

]>

<?rfc comments="yes"?>

<rfc ipr="trust200902" docName="draft-sabadello-did-challenge-sasl-00" category="std" consensus="true" submissionType="IETF" 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="May" day="11"/>

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

    <abstract>


<?line 30?>

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

<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">nonce</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">timestamp</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">realm</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 SP signature
]]></artwork></figure>

<t>Where:</t>

<t><list style="symbols">
  <t><spanx style="verb">did</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">signature</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="client-verification"><name>Client Verification</name>

<t>Upon receiving the DID Challenge, the client MUST perform the
verification steps listed below, in the order given. If any step
fails, the client MUST immediately treat the exchange as an
authentication failure, MUST NOT proceed to subsequent steps, and
MUST terminate the authentication exchange with an appropriate
error indication.</t>

<t><list style="symbols">
  <t>Parse the DID Challenge. Verify that the DID Challenge conforms to the
grammar defined in <xref target="did-challenge"></xref>. A challenge that does not conform
MUST cause the client to abort the authentication exchange.</t>
  <t>Extract the <spanx style="verb">nonce</spanx>, <spanx style="verb">timestamp</spanx>, and <spanx style="verb">signature</spanx> fields.</t>
  <t>Verify the <spanx style="verb">realm</spanx>. Verify that the realm in the received
DID Challenge matches the realm of the service the client intends to
authenticate to. A realm mismatch MUST cause the client to abort
the authentication exchange.</t>
</list></t>

</section>
<section anchor="server-verification"><name>Server Verification</name>

<t>Upon receiving the DID Response, the server MUST perform the
verification steps listed below, in the order given. If any step
fails, the server MUST immediately treat the exchange as an
authentication failure, MUST NOT proceed to subsequent steps, and
MUST terminate the authentication exchange with an appropriate
error indication.</t>

<t><list style="symbols">
  <t>Parse the DID Response. Verify that the DID Response
conforms to the grammar defined in <xref target="did-response"></xref>. A response
that does not conform MUST cause the server to abort the authentication
exchange.</t>
  <t>Extract the <spanx style="verb">did</spanx> and <spanx style="verb">signature</spanx> fields.</t>
  <t>Verify the <spanx style="verb">nonce</spanx>. Verify that the nonce embedded in the DID
Challenge has not previously been accepted in a completed
authentication exchange. The server MUST maintain a record of
all nonces issued and accepted within the active timestamp
window for this purpose. A repeated nonce MUST
be treated as a replay attack and the exchange rejected.</t>
  <t>Verify the <spanx style="verb">timestamp</spanx>. Verify that the timestamp embedded in
the DID Challenge, interpreted as milliseconds since the Unix
epoch, represents a time within the
server's acceptance window. The RECOMMENDED acceptance window
is no more than 300 seconds (5 minutes) in the past, and no
more than 5 seconds in the future (to accommodate minor clock
skew between client and server). Server clocks SHOULD be
synchronized via NTP or an equivalent mechanism. A timestamp
outside the acceptance window MUST be treated as an
authentication failure.</t>
  <t>Resolve the DID. Resolve the <spanx style="verb">did</spanx> field to a DID document
using a trust valided DID resolver, in accordance with the <eref target="https://www.w3.org/TR/did-resolution/">W3C DID Resolution v1.0</eref>
specification. If resolution
fails for any reason, or if the DID is deactivated, the
server MUST treat this as an authentication failure.</t>
  <t>Retrieve authentication verification methods. From the
resolved DID Document, retrieve all verification methods that
have an "authentication" verification relationship, in
accordance with the <eref target="https://www.w3.org/TR/did-1.1/#verification-relationships">W3C DIDs v1.1 - Verification Relationships</eref>
specification. If no
such verification methods are present, the server MUST treat
this as an authentication failure.</t>
  <t>Verify the signature. Decode the <spanx style="verb">signature</spanx> field using
base64url decoding without padding. Using
each candidate verification method retrieved in the previous step, attempt
to verify the decoded signature against the entire DID
Challenge string (including the enclosing angle brackets),
treated as an opaque octet string. The signing algorithm used
for each attempt MUST correspond to the key type of the
candidate verification method. If no
verification method is able to verify the signature, the server MUST
treat this as an authentication failure.</t>
</list></t>

<t>If all steps succeed, the server MUST use the authenticated DID as the authorization
identity. The server MUST then invoke whatever authorization
check is required by the enclosing application (e.g., the
AuthorizeCallback in the SASL framework) before granting access.</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=[16b252dc259b9200fff1f3f79f19c19e]
@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: 25.0.3+9-2-Debian
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>For <spanx style="verb">nonce</spanx>, the same rules apply as in <xref target="did-challenge"></xref>.</t>
  <t>For <spanx style="verb">timestamp</spanx>, the same rules apply as in <xref target="did-challenge"></xref>.</t>
  <t>For <spanx style="verb">realm</spanx>, the same rules apply as in <xref target="did-challenge"></xref>.</t>
  <t><spanx style="verb">vc-type</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>
</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">vp</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="server-verification-1"><name>Server Verification</name>

<t>Upon receiving the VC/VP Response, the server MUST perform the verification steps listed below, in the order given.
If any step fails, the server MUST immediately treat the exchange as an authentication failure, MUST NOT proceed
to subsequent steps, and MUST terminate the authentication exchange with an appropriate error indication.</t>

<t><list style="symbols">
  <t>Parse the VC-VP Response. Verify that the VC-VP Response
conforms to the grammar defined in <xref target="vc-vp-response"></xref>. A response
that does not conform MUST cause the server to abort the authentication
exchange.</t>
  <t>Verify the <spanx style="verb">nonce</spanx> and the <spanx style="verb">timestamp</spanx> following the same rules as in <xref target="server-verification"></xref>.</t>
  <t>Verify that the "holder" property of the <spanx style="verb">VP</spanx> field matches the <spanx style="verb">did</spanx> in <xref target="did-challenge"></xref>.</t>
  <t>Verify that the "type" property of the <spanx style="verb">VP</spanx> field matches the requested <spanx style="verb">vc-type</spanx> field in the <xref target="vc-vp-response"></xref>.</t>
  <t>Resolve the DID. Resolve the "holder" property of the <spanx style="verb">VP</spanx> field to a DID document
using a trust valided DID resolver, in accordance with the <eref target="https://www.w3.org/TR/did-resolution/">W3C DID Resolution v1.0</eref>
specification. If resolution
fails for any reason, or if the DID is deactivated, the
server MUST treat this as an authentication failure.</t>
  <t>Retrieve assertion verification methods. From the
resolved DID Document, retrieve all verification methods that
have an "assertionMethod" verification relationship, in
accordance with the <eref target="https://www.w3.org/TR/did-1.1/#verification-relationships">W3C DIDs v1.1 - Verification Relationships</eref>
specification. If no
such verification methods are present, the server MUST treat
this as an authentication failure.</t>
  <t>Verify the signature. Decode and verify the "proof" property of the <spanx style="verb">VP</spanx> field
in accordance with the <eref target="https://www.w3.org/TR/vc-data-model/">W3C Verifiable Credentials Data Model v2.0</eref> specification.
If the signature cannot be verified, the server MUST
treat this as an authentication failure.</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=[d19c09701f285ad2a95d855816a547ee]
@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: 25.0.3+9-2-Debian
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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
rqkhTJkAAA==

-->

</rfc>

