Need peer-to-peer encryption?
├─ Yes → Use DIDComm
└─ No
├─ Web-based OAuth integration?
│ ├─ Yes → Use OIDC4VCI
│ └─ No
│ └─ Browser-based wallet?
│ ├─ Yes → Use CHAPI
│ └─ No → Use DIDComm (default)
// Store offer ID for later referencevalofferId=offer.offerId// Extract protocol-specific data if neededvalofferData=offer.offerDatawhen(offer.protocolName){"didcomm"->{valdidCommMessage=offerDataasDidCommMessage// Handle DIDComm-specific data}"oidc4vci"->{valoidcOffer=offerDataasOidc4VciOffer// Handle OIDC4VCI-specific data}}
Step 5: Request Credential
1
2
3
4
5
6
7
8
9
10
11
12
13
14
valrequest=registry.requestCredential(protocolName="didcomm",request=CredentialRequestRequest(holderDid=holderDid,issuerDid=issuerDid,offerId=offerId,// Reference to the offeroptions=mapOf("fromKeyId"to"$holderDid#key-1","toKeyId"to"$issuerDid#key-1")))println("✅ Request created: ${request.requestId}")
importcom.trustweave.credential.models.VerifiableCredentialimportkotlinx.serialization.json.buildJsonObjectimportkotlinx.serialization.json.put// Create the credentialvalcredential=VerifiableCredential(type=listOf("VerifiableCredential","PersonCredential"),issuer=issuerDid,credentialSubject=buildJsonObject{put("id",holderDid)put("name","Alice")put("email","alice@example.com")put("role","Developer")},issuanceDate=java.time.Instant.now().toString())// Issue the credentialvalissue=registry.issueCredential(protocolName="didcomm",request=CredentialIssueRequest(issuerDid=issuerDid,holderDid=holderDid,credential=credential,requestId=request.requestId,// Reference to the requestoptions=mapOf("fromKeyId"to"$issuerDid#key-1","toKeyId"to"$holderDid#key-1")))println("✅ Credential issued:")println(" Credential ID: ${issue.credential.id}")println(" Issue ID: ${issue.issueId}")
What happens:
Registry validates request ID exists
Protocol creates issue message with credential
Credential is signed and encrypted
Returns issued credential with proof
Step 7: Verify Credential
1
2
3
4
5
6
7
8
9
10
// The issued credential can now be verifiedvalverification=trustLayer.verify{credential(issue.credential)}if(verification.valid){println("✅ Credential is valid")}else{println("❌ Credential invalid: ${verification.errors}")}
Requesting a Proof
Complete workflow for requesting and receiving a proof presentation.
// Prover creates a verifiable presentationvalpresentation=VerifiablePresentation(type=listOf("VerifiablePresentation"),holder=proverDid,verifiableCredential=listOf(credential),// Credential from previous workflowproof=proof// Proof of presentation)
Step 3: Present Proof
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
valpresentationResponse=registry.presentProof(protocolName="didcomm",request=ProofPresentationRequest(proverDid=proverDid,verifierDid=verifierDid,presentation=presentation,requestId=proofRequest.requestId,// Reference to the requestoptions=mapOf("fromKeyId"to"$proverDid#key-1","toKeyId"to"$verifierDid#key-1")))println("✅ Proof presented: ${presentationResponse.presentationId}")
Step 4: Verify Presentation
1
2
3
4
5
6
7
8
9
10
11
12
valverification=trustLayer.verify{presentation(presentationResponse.presentation)}if(verification.valid){println("✅ Presentation is valid")// Extract attributesvalname=extractAttribute(presentationResponse.presentation,"name")println("Name: $name")}else{println("❌ Presentation invalid: ${verification.errors}")}
Protocol Selection
Guide for choosing the right protocol for your use case.
funvalidateRequest(request:CredentialOfferRequest):ValidationResult{valerrors=mutableListOf<String>()// Validate DIDsif(!isValidDid(request.issuerDid)){errors.add("Invalid issuer DID: ${request.issuerDid}")}if(!isValidDid(request.holderDid)){errors.add("Invalid holder DID: ${request.holderDid}")}// Validate previewif(request.credentialPreview.attributes.isEmpty()){errors.add("Credential preview must have at least one attribute")}// Validate protocol-specific options// (Implementation depends on protocol)returnif(errors.isEmpty()){ValidationResult.Valid}else{ValidationResult.Invalid(errors)}}// Use before operationvalvalidation=validateRequest(request)if(validationisValidationResult.Invalid){println("Validation failed:")validation.errors.forEach{println(" - $it")}return}valoffer=registry.offerCredential("didcomm",request)
Protocol Switching
How to switch between protocols seamlessly.
Example: Switch Protocol Mid-Flow
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Start with DIDCommvaldidCommOffer=registry.offerCredential("didcomm",request)// Switch to OIDC4VCI for request (if needed)valoidcRequest=registry.requestCredential(protocolName="oidc4vci",request=CredentialRequestRequest(holderDid=holderDid,issuerDid=issuerDid,offerId=didCommOffer.offerId,options=mapOf("credentialIssuer"to"https://issuer.example.com")))// Continue with OIDC4VCIvalissue=registry.issueCredential("oidc4vci",issueRequest)
Note: Protocol switching may not always be possible. Check protocol compatibility before switching.