<?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-01" 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="31"/>

    <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 anchor="denial-of-service"><name>Denial of Service</name>

<t>The DID-CHALLENGE mechanism introduces potential denial-of-service
vectors that do not arise in password-based SASL mechanisms.
Implementers SHOULD consider each of the following.</t>

<t>Challenge generation and nonce tracking. Each mechanism-selection
message causes the server to generate a nonce and allocate an
entry in its nonce-tracking table. An attacker who sends many
such messages can exhaust server
memory and CPU. Servers MUST enforce a short timeout on
incomplete exchanges (RECOMMENDED: 30 seconds from challenge
issuance), after which the nonce is discarded and any subsequent
messages referencing it rejected. Servers SHOULD rate-limit
challenge issuance per source address and SHOULD bound the size
of the nonce table.</t>

<t>DID resolution amplification. Every authentication attempt
requires an outbound DID resolution request. An attacker who
sends many requests using different DIDs forces a corresponding
number of outbound network requests, potentially stressing both
the server and DID method infrastructure. Servers SHOULD
cache recently resolved DID Documents for a short period (subject
to the constraints in
<xref target="key-revocation-rotation-and-did-method-properties"></xref>),
rate-limit outbound resolution
requests, and impose a resolution timeout.</t>

<t>Cryptographic verification cost. Signature verification is
computationally expensive, and the server may need to try multiple
candidate keys if the DID Document contains more than one
"authentication" verification method. The ordering of steps in
<xref target="server-verification"></xref>) is therefore deliberate: the cheap,
non-cryptographic
checks (format, nonce, timestamp) are placed first so that most
malformed or replayed requests are rejected before any signature
verification is attempted. Servers MAY additionally impose per-
source-address limits on signature verification attempts.</t>

<t>VC/VP extension. The optional VC/VP extension adds VP proof
verification, per-credential issuer signature verification, and
credential status checking to each exchange, all of which may
involve further outbound network requests. The same rate-limiting
measures above apply. Servers SHOULD additionally cap the number
of credentials permitted in a single Verifiable Presentation and
reject oversized presentations before performing any cryptographic
work. Servers SHOULD cache credential status information briefly
to avoid redundant outbound requests during bursts of
authentication attempts.</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>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>The author would like to thank the members of the KITTEN
working group for their review and feedback on earlier
versions of this specification.</t>

<t>This work was funded through <eref target="https://nlnet.nl/commonsfund">NGI0 Commons Fund</eref>,
a fund established by <eref target="https://nlnet.nl">NLnet</eref> with financial support from
the European Commission's <eref target="https://ngi.eu">Next Generation Internet</eref> program.</t>

<t>Learn more at the <eref target="https://nlnet.nl/project/DID-SASL">NLnet project page</eref>.</t>

</section>


  </middle>

  <back>








  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA+1923IbR7Lge31FBRwbQ55FQ7xLon0cI5O0pbEocURK9rHC
MdNoFIg2G91wVzcoeMIT+xH7vh+zf7Jfsnmpa+NCUvLM7DnrCY9NAN11ycp7
ZmUmSSKyapSX18eybcbJEyGavCnUsbyaKHn64jQ5ef7s5cuzV9+cyctnly/l
ucomaZnrqUiHw1rNj+UoHyXwXVGo8lolOtWFGFVZmU5hkFGdjhv4bpiOVFFU
yfKzyc6uyNJGXVf14ljqZiR0O5zmWudVebWYwRgvzq6+FvmsPpZN3epmb2fn
6c6eGME7x3JvZ+8o2TlM9neFSGuVHstLlbV13izELezopJpOq1I+a5uJKpsc
5oFR5RVsoayK6nohX6kPjfxGlaqmn4TQTVqO/pIWVQmjL5QWs/xYvm+qrC91
VTe1Gmv4azHlPzIYHwbWP8LsMEdVHwspE/i/lHmpj+X5QF7avdO3DJXztL5p
deenqoYFn6ZlO1S0QvnNdPicftEwrWrotWvYZKNK+Cb93/9Lycc7j3YfPaaH
MtjzsfwuVyV/rEYw0bNkd+dwx3zRlg2C+BnAsM5T+nI2oX3+94P95OjoAKB4
ePDk4An9pKZpXhzLKS31jyNaVwPLGsCehUiSRKZDXEbWCHE1ybXUM5XlYwvj
kRrnpdKyF6FQry9TObUYJMdVLeFk5GU+nRWqe0xwEMKepnyZLlQttxAFt+Uw
1Wok4ZFTlcELdVrkv8AXL0b49jhXtZZbMK/eHhAWhxMCtG+1TIVW9VzVyTiv
dSMdRj6qlZ5VpVZyljaNqks4Rnk7yeE0cJ1ZAeBtZOrXCTscLuSsrkZtBjQE
A2f1YtZU13U6g9ekzq/LtGlrJSuYDjZv5r1mlINFu7n7stU4BE40q/M5/Cpv
1EKmWldZjs+K27yZyLzRSJcD+bYs8htcqda3VT1KGCpEpG7HgKNlJfUE0GYE
c2eAPRLOCkBW6mne4AKqGpC+qhmgODkv8fNwm3gc8Np1DUg0gifx61oVCwRP
CtQwVYBSmQz2vqDjw+FgLDiTdAgHPMxL5DQSMOlWKXgVN4IP0qb8RmnfU/gL
8LQYCPGslNUMF5EWEggW8J/wYzQCrGtnM6BLQqV3fqYT2A8uMi0AFd6d6G2a
xT8gLuCk4QHaGj5yobf7sC34jY6xgf0M20YZoKZZprQGGgJkqwra9WiUE1ia
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
7t/LV90XXaPMPcgsNhpxhTHYeTy4tyY/wQHu/Ay/e8J/94T/Czzh1azZ6PlC
S2Dj/t6dRNtbzTppmI073fDehk0PBlwbAv/7q1BYqe53z/7vnv2P8ezvTf90
0HxVHT3/r+TZvy91b0bFrgN2JVHeHyHv7f9auTrPdzrSfBlP59kAjSqHsEu8
bCXSdsQ+wYvUSb/vdWg7nyHCrJzGnWlHqXh3sX0HPLvDbkKVh649QhbLPv8/
DQXZu7W+lgU6ttCRtHtsbzqsVCfQo1pGKePalpjARYK9BvAemntSRM1cNZAu
aJJl261XiYeVJPLk5YuzV1fyBKTGV89Ovo0PgB7C/9EfX57YJcL4x/h2gs6d
tC2aV1TrtmyLom/q3uLf9Na1ol+3tmXypfyUiyY02smX95n8k6ZxR7LnjqSr
X10Ydelb4KwPO5mwbh95dG7BFgoPStgcLX+teMNhBQsTK84pmC0G2ZX6ACi7
Ba9j0TP6EB4Y/vyinLUNPMAH9zeHCr2bT3P8fvZgT3E/mDvQP/23XT3U/0L6
6Nnw3VEyeTc9zU/3T7+9enutx3uXP/1Uvn7c7DTN7fnksvnz4Z8WJ19PbsN3
aZfzb356/uKHX374cLn/5mBaJe92Xvzl8vHe25ffn/6c7r149fPNs6ad//yn
t6+esEf7V4umFw+AvYXuvw62qyC7Dq4fD9WPhqmjyf1jGwcApDRY3omL2tou
RIPWw9B1ZaAbYLiwl7XtnTosCdSpGWhqk7kp/G1UjKSuqSToKfby7M27sze0
WKLd446K88XB4e7+weHh/sHR48PHe4+f7O4dgSZz+Hj36d7TffjnyTrFxYHk
wLGpS6eyESCCQobmtrBTZHz56aUyhl1uw/hs8ku9QwnZoB/vo7dx/I+6PujA
c+jAA4dgcCcOc0aF57Sy8QuDR85rZ+tXW8daWHlmiUXjXHT0x34yfOL/xZuW
DlRHjrhWa2EheVmRZiGzXKrSwnOJGDboGiy/LtfJ+E+B3pJiQnm5pJp8yrAg
HX8LveZyrV7zW+z5t9GHHh+vjsEGWGGcy7rjfc7L1aiBLJhjG5YdRYVOl0JI
fU5p8kw4LASOFYxdm4EwStBFQPr0zrjBQ5b2DyGv345TkgHlTuOJO43lNHEO
9sYlk2LyHSkOGwdOcJP53vOmD7zUw8YX0S2EFZJ0A4Uvm10hmVNriWg8pIFP
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

-->

</rfc>

