<?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.29 (Ruby 3.0.2) -->


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

]>


<rfc ipr="trust200902" docName="draft-shim-capp-00" category="std" consensus="true" submissionType="IETF">
  <front>
    <title abbrev="CAPP">Contextual Authentication Presentation Protocol (CAPP)</title>

    <author fullname="Ace Shim">
      <organization>Hopae Inc.</organization>
      <address>
        <email>ace@hopae.com</email>
      </address>
    </author>
    <author fullname="Lukas J. Han">
      <organization>Hopae Inc.</organization>
      <address>
        <email>lukas.j.han@gmail.com</email>
      </address>
    </author>

    <date year="2025" month="August" day="21"/>

    <area>Security</area>
    <workgroup>TBD</workgroup>
    <keyword>Verifiable Credentials</keyword> <keyword>Passive Authentication</keyword>

    <abstract>


<?line 22?>

<t>CAPP is a decentralized presentation protocol for Verifiable Credentials that enables frictionless, context-triggered, pre-consented credential sharing without requiring interactive challenge-response cycles. It is optimized for physical access, transit, event entry, and other passive authentication scenarios.</t>



    </abstract>



  </front>

  <middle>


<?line 26?>

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

<t>The use of Verifiable Credentials (VCs) often requires a verifier-issued challenge, user interaction, and roundtrip communication. CAPP introduces a passive, context-aware presentation flow based on a Consent Profile locally maintained by the Holder.</t>

<t>CAPP is purpose-built for physical and routine authentication scenarios where users should not be required to approve every interaction explicitly. It allows for seamless, automatic credential presentation based on pre-defined conditions (e.g., location, time, trigger signal).</t>

<section anchor="example-use-cases"><name>Example Use Cases</name>

<t><list style="symbols">
  <t><strong>Building Access</strong>: An employee walks into the office building and passes through the turnstile without tapping or confirming—CAPP presents a purpose-bound VP to the verifier as the user approaches the gate.</t>
  <t><strong>Airport Boarding Gate</strong>: A traveler approaches a boarding gate and their flight ticket credential is automatically presented via NFC.</t>
  <t><strong>Event Entry</strong>: A guest enters via QR or beacon without needing repeated approvals.</t>
  <t><strong>Subway and Transit Access</strong>: A metro rider walks through the gate using a digital transit pass wallet that pushes the credential passively.</t>
  <t><strong>Smart Gym/Workspace Entry</strong>: Members are authenticated passively using a pre-agreed consent profile.</t>
  <t><strong>Healthcare Check-In</strong>: A returning patient’s insurance credential is passively presented to the hospital kiosk.</t>
</list></t>

<t>These scenarios share a common trait: <strong>the need for high trust, low interaction, and rapid flow</strong>.</t>

</section>
</section>
<section anchor="terminology"><name>Terminology</name>

<t><list style="symbols">
  <t><strong>Holder</strong>: Entity that owns and controls credentials</t>
  <t><strong>Verifier</strong>: Entity requesting and verifying a credential</t>
  <t><strong>CAPP-ready VP</strong>: A VP that has been pre-constructed, bound to a specific context and purpose</t>
  <t><strong>Consent Profile</strong>: A user-defined policy specifying disclosure conditions</t>
  <t><strong>Trigger</strong>: QR/NFC/URI or other signal initiating VP flow</t>
</list></t>

</section>
<section anchor="protocol-overview"><name>Protocol Overview</name>

<t><list style="numbers" type="1">
  <t><strong>Preparation</strong>: Holder creates VP (with aud, purpose, exp, nonce), configures Consent Profile.</t>
  <t><strong>Trigger</strong>: Verifier emits a signed trigger (e.g., capp:// URI).</t>
  <t><strong>Consent Profile Matching</strong>: Device checks verifier, time, purpose, context.</t>
  <t><strong>Automatic Presentation</strong>: VP sent to verifier endpoint (HTTPS or DIDComm).</t>
</list></t>

</section>
<section anchor="flow-diagram-non-normative"><name>Flow Diagram (Non-Normative)</name>

<figure><artwork><![CDATA[
   Holder                      Device                      Gate
     |                           |                          |
     | Configure Consent Profile |                          |
     |-------------------------->|                          |
     |                           |                          |
     |                           |  Create CAPP-ready VP    |
     |                           |--------------------------|
     |                           |                          |
     |                           |<-------------------------|
     |                           |     Emit Trigger         |
     |                           |--------------------------|
     |                           |                          |
     |                           |   Match Consent Profile  |
     |                           |--------------------------|
     |                           |                          |
     |                           |      Auto-send VP        |
     |                           |------------------------->|
     |                           |                          |
     |                           |                          | Validate VP
     |                           |                          |------------>
     |                           |                          | Grant Access
     |<-----------------------------------------------------|
     |                           |                          |
]]></artwork></figure>

</section>
<section anchor="examples"><name>Examples</name>

<section anchor="consent-profile-example"><name>Consent Profile Example</name>

<figure><sourcecode type="json"><![CDATA[
{
  "verifier": "did:example:building",
  "purpose": "building-entry",
  "location": "166 Geary St, SF",
  "timeWindow": "08:00–18:00",
  "autoPresent": true,
  "disclosurePolicy": "minimal"
}
]]></sourcecode></figure>

</section>
<section anchor="vp-payload-format"><name>VP Payload Format</name>

<figure><sourcecode type="json"><![CDATA[
{
  "type": ["VerifiablePresentation", "CAPPPresentation"],
  "holder": "did:example:holder123",
  "verifiableCredential": ["<VC or SD-JWT>"],
  "purpose": "building-entry",
  "aud": "did:example:corp-building",
  "exp": "2025-06-12T09:30:00Z",
  "nonce": "f8a8...x3b",
  "proof": {
    "type": "Ed25519Signature2020",
    "created": "2025-06-12T08:45:00Z",
    "verificationMethod": "did:holder#key-1",
    "proofPurpose": "authentication"
  }
}
]]></sourcecode></figure>

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

<t><list style="symbols">
  <t><strong>Replay Mitigation</strong>: Nonce &amp; Expiration REQUIRED; short TTL (&lt;5m); reject replays.</t>
  <t><strong>Verifier Spoofing</strong>: Triggers MUST be signed; device verifies before presenting.</t>
  <t><strong>Consent Profile Protection</strong>: Encrypted storage; modifications gated by re-auth.</t>
  <t><strong>Device Theft</strong>: Require user presence; allow emergency disable.</t>
  <t><strong>Purpose Binding</strong>: VP MUST include purpose; verifier MUST validate match.</t>
  <t><strong>Linkability Controls</strong>: Use pairwise DIDs; minimize metadata.</t>
  <t><strong>Endpoint Security</strong>: TLS required; verifier validates signature, status, audience.</t>
  <t><strong>Passive Channel</strong>: Short-lived, non-reusable triggers; no direct PII; signed JWT/hash.</t>
  <t><strong>Auditability</strong>: Devices SHOULD log VP history; allow revocation/pause.</t>
</list></t>

</section>
<section anchor="extensions"><name>Extensions</name>

<t><list style="symbols">
  <t><spanx style="verb">presentation_definition.profile = "capp"</spanx></t>
  <t>VC API 2.0 extensions for triggered_presentation</t>
  <t>Secure passive triggers (e.g. ephemeral BLE URIs)</t>
</list></t>

</section>
<section anchor="compatibility"><name>Compatibility</name>

<t><list style="symbols">
  <t>W3C VC Data Model</t>
  <t>SD-JWT / BBS+</t>
  <t>DIDComm v2 / HTTPS POST</t>
  <t>Selective Disclosure JWT</t>
</list></t>

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

<t>This document has no IANA actions.</t>

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

<t>TBD</t>

</section>


  </middle>

  <back>








  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA9VY4W7byBH+z6cYKEBhuyItO5cgkdPD2bKT+GAniqU4QIvi
bkWupI0pLrtLSmHuLsg7tH/6enmSfrNLUrJj51IEbVEBdzHJndmZb76Zndkw
DINCFansU2egs0K+K0qR0mFZzGVWqFgUSmc0NNLisXnQhY51SluDw+FwuxOI
ycTIJSvAcydIdJyJBRQmRkyL0M7VIoxFnoe9XgB9cqZN1SdbJIEtJwtlLZSO
qxwCpyfjp4HKTZ8KU9piv9d73NsPhJGiTyMZl0YVVbDS5mpmdJn3aXx0HFzJ
Cm+SfkAU0qU0aqrEJJU0MDJhD0Rq3aehwEZLecOzQOBRGy89LdPUW945jCWN
YHgHH4i0mYlMvXcSfXqucyHpNIsj91EuhEr7JGL5w5y/RLFe3FR3Vl4JSz9G
9FxkX68yZanobTQX2Q8zfuVUh4gY/4/ExBZGxEUQMO6kLAlKZAznjEjVe5lQ
vhm2vAnbVJs7gKJiLgqSGb+3NDUqZkn8bbsUe3KEhVGzmYRMl9WHeM1bYLO4
1UN2LozKZrRSALcsyMi/lcq9UVjKNnMk4rlIU5nNZAgzc9ZDcRVjt4hOC3ZH
54VaOEfY5HxeWUQtBdKxswhuZlYVXZJL7Evsd9UlkSWkEWII1BEX17lsgRDM
0zbyMC5UkqQyCO4B/8LopHROB8F4LqmETXp6F1pblwO7je+FzGoXJcdg6VZL
E4LaJQPT+NllfWaNgc68uSBzlgDXHCAvFmVWWxqRj2ttldNd+7QOh1ghPa4H
eprqFU2ExdZ4EjTwIeK8nSq4kGqgmFYERkFEZVg3qRB6CRqmiTTRmlB5aXJt
ZTgpVVrciII3vID8nQjTCnFwKBoLUugyTSjTBU1kg1dChSbUBqMRKMTRVJvw
kHyXpypGeaocJ2C2Xllnh5Vi4YmJzfUCG8ebDLwGSIsFEzaRU+cyAEwUf0Yc
ZTSLug4XHxTQTjK/HNPJqlkm0m3Acu8enbwTixwgvgYzBtBrQSLa2TkCQAkT
/NCRc2enT4cwH0t1JSWtRHpl2TPtcNbTqUKBmTRCjCVHVnIGAtTZ3C0rSpPZ
gkPWJFIBqFgAAMD+qTILPH36+A8Xr9pnR5MmbswsuhxSvXFDTRLWPTs+OvhF
PJf+3QwlOnJOHSpoMQUdaWGcnc/wybnGubeU6XVhQZNmIetwXkGhMmCkms1h
vYqvZLEZJq5ZTfgcJ2sfEJ+lEvTi6cBbcuIy/IQz3O8/K6V1Kc/M4qWvLhiU
iRTApYUrk9KZY2QuBSv1TEPuerWjcrISlTN07IvJZvxoIZF5ZBRyoo7gZnSc
j6V18aNEzVQBh+qa5KLJMin8dUU1L20D8CZNfTqD3t6ehQDcz6rF7hsccjbH
mbJ2+lwuJuwt5/tGwslkraU1h4kuZkZ6nrvsz332+42eS5EW85hVDeYyvgpP
M++ykUw6VpIjJpD79PGfTFxbwrFY3ojdeuN13GqmzbXNHSJXqANXkSunSJl1
aeAzAo64koeQAThV9GEaC3PcXJbPFYPNvQCn5+qW0ilylbiKt7PDCUpjyTmh
Uz2rfGb6msbeAUn0Dz4ceoW8ZwVcR41GMY83+gWWu6xTZUOSaxZo12SsS6bK
A76WdsKcjzjVRFIh+TyynIS88xypN5Eya09PuBcXfJz6ZOV6SDaXMXaPmzLv
K4RPar/B9Zrut+BsbutbrlE5q1qTszJRNk41Iik3ip/TNvaVjrW8uthF1u2+
vjjlfPIHqS+AAB8iwrkPZxhzBrztBl8Cj6WSeLkXQSdaxlwYV1BZrw8D4wTK
WlawxVkKJnMj4T3rcr3v4oQA07a7vsLNSj5Ub7gbBfvRdbObaKHkKlcB2WZm
Y13D6xLPbWh/d5fgHur5/ehzJOlcFPEcPrLWY7nkOh1ziti2eDbnQ2t1HaQo
+I4VHrbn0WbX7IwcktsKIW4LscySXIPWtPV8PB6OGPTj0+MBksIdOPSUaX+s
kMxiQVsvdBa+0IbVL+V2EHz48IEbxhrcW3+1D7f+uJ67hpN+vX3B7337tZEe
NLH6rNv4Cunwzt/3X7P3t1n+RemBoytdS+evlb7bq/+85U++fe8TJBLVGfZv
7f2/9Bv/ufz9jIX/D5bjx7UjhOFJzbOvlf5CAv2XLL/90yUG0YQz6HL4bZqu
+fSNRj1DK9M0erWqu/PlS79vxZard9COFNbNFzeJW390pf6txVz6CzbtNMdH
p0+dRCV96Vf1m4mi0+VV9QHFi5oPoZuS/edm3uHvew8f0jMpMH6N0GqNnvoV
fM69UVmiV7ym96jf6336+Pc9/tcv4Oa9PuU67tJGutfrTmPouhCWRlemFiLt
BL/Vft9jjg9FlWqR0FN3qN3wsqhyNv4vnfX8vXmkdrr+xunau786A+buQLyJ
jn+7t3/fG79sta6Herfdk8sBn8Oj4/DHN+Pva5W/Ayb6mJvbxdrk4fWIoL/h
Vfu9/Qdh72G4tz/uPe7f7wHPP/sFrvfhJdNH4lEURe/uT+pYGq2n+PCL41wD
Teck2X/wYO/xiDs0dO4Smn1osMb3WsnNDR/1v3vQbtjC4KlwLjE4tY54vO5d
ySrca1Y7O4ZrLK6P/ny39Vsb4fbOzrGaxyjhe07XdF7IPMXwdY6mcta2SC/Y
f/oDaJ8rv5ouTl69Pr04OT7gGwSMR+PxGW09ebDYPkBD/lbGfL3EmuqZru0E
RzksrRu5+hyzdP56NObrB98eHlDiu6M6n7gzx9jR3qdAOrqt3XZNr4wbo0+y
2FQ5Dz+20EbM5AEtdNKCat2o6C5ZeCwDYF5p3ZlhMJoWrObCX4n4odxbEEOV
u/RAXyvNDC8qbuOZs15HHQk6QpbWviKrnJcqi9MykU2berDuOd3nZVOaF3xg
em1nKrsSE5XWIXODEavky45cKLNS+APtqYWDnM7qveQhWUCPqAf1pp1tQu/Q
Pxu19z0bZjQWWD9gMH27QBB/uFudRLH/tZv1Vd5gLrJMpqx0xGQIU7xN3MiA
/qx0wDQ9P4zMNNAyTJHh6elBMxMgqXcxhdU+H2KjonZ63fNbGj1/+frsGFOn
m3bmikNbNdEwclkXz91cIF6Rr+OFzGxD8J83r6B+clOZm7iiehCnPyFDMY50
fsZiFJzD4SntRz2MQI0WNwG3160/beqDiANYtpecjdN+0iGZz5kxmNqOzk54
3LHbbCLmCp7rvbds5Zv7A978GAGkc51IHl993aNdOjoa/RHP9TxCy32881PK
8OVo7GxIpb/LPV7PlpB1l6mHLw4/y/sxcKREx+WCs4lHYYTIrfRDvXVAXsgp
PEbwWeLo2F/TTkR8FfwLDVg+9q4YAAA=

-->

</rfc>

