package Ġid . walt . web wallet . backend . wallet Ċ Ċ import Ġcom . be ust . kl ax on . Converter Ċ import Ġcom . be ust . kl ax on . JsonValue Ċ import Ġcom . be ust . kl ax on . Kl ax on Ċ import Ġcom . nim bus ds . j ose . util . Base 6 4 URL Ċ import Ġcom . nim bus ds . oauth 2 . sdk . http . HTTP Request Ċ import Ġid . walt . crypto . Key Algorithm Ċ import Ġid . walt . cust od ian . Cust od ian Ċ import Ġid . walt . issuer . backend . Iss u ance Session Ċ import Ġid . walt . model . Did Method Ċ import Ġid . walt . model . Did Url Ċ import Ġid . walt . model . dif . Descriptor Mapping Ċ import Ġid . walt . model . dif . Presentation Submission Ċ import Ġid . walt . model . oidc . ID Token Ċ import Ġid . walt . model . oidc . SI OP v 2 Request Ċ import Ġid . walt . model . oidc . Vp Token Ref Ċ import Ġid . walt . model . oidc . kl ax on Ċ import Ġid . walt . rest . cust od ian . Cust od ian Controller Ċ import Ġid . walt . services . context . Context Manager Ċ import Ġid . walt . services . did . Did Service Ċ import Ġid . walt . services . ess if . Ess if Client Ċ import Ġid . walt . services . ess if . d ide b si . Did Eb si Service Ċ import Ġid . walt . services . jwt . key Id Ċ import Ġid . walt . services . key . Key Service Ċ import Ġid . walt . vc lib . model . to Credential Ċ import Ġid . walt . vc lib . model . Ver ifiable Credential Ċ import Ġid . walt . web wallet . backend . auth . JWT Service Ċ import Ġid . walt . web wallet . backend . auth . UserRole Ċ import Ġid . walt . web wallet . backend . config . Wallet Config Ċ import Ġio . jav al in . api builder . Api Builder .* Ċ import Ġio . jav al in . http . Context Ċ import Ġio . jav al in . http . Http Code Ċ import Ġio . jav al in . plugin . openapi . dsl . document Ċ import Ġio . jav al in . plugin . openapi . dsl . document ed Ċ import Ġjava . net . URI Ċ import Ġjava . net . URL Ċ import Ġjava . net . URL Encoder Ċ import Ġjava . net . http . HttpClient Ċ import Ġjava . net . http . HttpRequest Ċ import Ġjava . net . http . HttpResponse Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . util .* Ċ Ċ object ĠWallet Controller Ġ{ ĊĠ Ġval Ġroutes ĊĠĠĠ Ġget () Ġ= Ġpath (" wallet ") Ġ{ ĊĠĠĠĠĠ Ġpath (" did ") Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġlist Ġd ids ĊĠĠĠĠĠĠĠ Ġpath (" list ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġget ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocumented ( document (). operation { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . summary (" List Ġmy ĠD IDs "). operation Id (" list D ids "). add Tags Item (" wallet ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. json Array < String >(" 2 0 0 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWallet Controller :: list D ids ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĠUser Role . AUTHORIZ ED ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġnew ĠD ID ĊĠĠĠĠĠĠĠ Ġpath (" create ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġpost ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocumented ( document (). operation { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . summary (" Create Ġnew ĠD ID "). description (" Creates Ġand Ġregisters ĠD ID . ĠFor ĠEB SI : Ġneeds Ġbe arer Ġtoken Ġto Ġbe Ġgiven Ġas Ġform Ġparameter Ġ' eb si Bearer Token ', Ġfor ĠD ID Ġregistration . "). operation Id (" create Did "). add Tags Item (" wallet ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < Did Method >(" method ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body < Did Creation Request >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. result < String >(" 2 0 0 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWallet Controller :: create Did ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĠUser Role . AUTHORIZ ED ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġpath (" credentials ") Ġ{ ĊĠĠĠĠĠĠĠ Ġget (" list ", Ġdocumented ( Cust od ian Controller . list Credential Ids Docs (), ĠC ust od ian Controller :: list Credentials ), ĠUser Role . AUTHORIZ ED ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġpath (" si op v 2 ") Ġ{ ĊĠĠĠĠĠĠĠ Ġget (" presentation Exchange ", Ġdocumented ( ĊĠĠĠĠĠĠĠĠĠ Ġdocument (). operation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . summary (" Parse ĠSI OP v 2 Ġrequest Ġfrom ĠURL Ġquery Ġparameters ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. operation Id (" get Presentation Exchange ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Tags Item (" SI OP v 2 ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" response _ type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" client _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" redirect _ uri ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" scope ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" nonce ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" registration ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < Long >(" exp ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < Long >(" iat ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" claims ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" subject _ did ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. json < Presentation Exchange >(" 2 0 0 "), ĊĠĠĠĠĠĠĠĠĠ ĠWallet Controller :: get Presentation Exchange ĊĠĠĠĠĠĠĠ Ġ), ĠUser Role . AUTHORIZ ED ) ĊĠĠĠĠĠĠĠ Ġpost (" presentation Exchange ", Ġdocumented ( ĊĠĠĠĠĠĠĠĠĠ Ġdocument (). operation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . summary (" Post Ġpresentation Ġexchange Ġwith Ġuser Ġselected Ġcredentials Ġto Ġbe Ġshared ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. operation Id (" post Presentation Exchange ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Tags Item (" SI OP v 2 ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body < Presentation Exchange >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. json < Presentation Exchange Response >(" 2 0 0 "), ĊĠĠĠĠĠĠĠĠĠ ĠWallet Controller :: post Presentation Exchange ĊĠĠĠĠĠĠĠ Ġ), ĠUser Role . AUTHORIZ ED ) ĊĠĠĠĠĠĠĠ Ġ// Ġiss u ance Ġ// ĠLE G ACY ĊĠĠĠĠĠĠĠ Ġget (" credential Iss u ance ", Ġdocumented ( ĊĠĠĠĠĠĠĠĠĠ Ġdocument (). operation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . summary (" Parse ĠSI OP v 2 Ġrequest Ġfrom ĠURL Ġquery Ġparameters ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. operation Id (" getC redential Iss u ance Request ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Tags Item (" SI OP v 2 ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" response _ type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" client _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" redirect _ uri ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" scope ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" nonce ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" registration ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < Long >(" exp ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < Long >(" iat ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" claims ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" subject _ did ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. json < Presentation Exchange >(" 2 0 0 "), ĊĠĠĠĠĠĠĠĠĠ ĠWallet Controller :: get Presentation Exchange Ġ// Ġsame Ġas Ġget Presentation Exchange ĊĠĠĠĠĠĠĠ Ġ), ĠUser Role . AUTHORIZ ED ) ĊĠĠĠĠĠĠĠ Ġpost (" credential Iss u ance ", Ġdocumented ( ĊĠĠĠĠĠĠĠĠĠ Ġdocument (). operation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . summary (" Post Ġpresentation Ġrequired Ġby Ġissuer , Ġto Ġissue Ġcredentials ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. operation Id (" post Credential Iss u ance Response ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Tags Item (" SI OP v 2 ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body < Presentation Exchange >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. json < Presentation Exchange Response >(" 2 0 0 "), ĊĠĠĠĠĠĠĠĠĠ ĠWallet Controller :: post Credential Iss u ance Response ĊĠĠĠĠĠĠĠ Ġ), ĠUser Role . AUTHORIZ ED ) ĊĠĠĠĠĠĠĠ Ġ// Ġiss u ance Ġ// ĠO IDC ĊĠĠĠĠĠĠĠ Ġpath (" issuer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġget (" list ", Ġdocumented ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument (). operation Ġ{ Ġit . summary (" List Ġknown Ġcredential Ġiss u ers "). add Tags Item (" SI OP v 2 "). operation Id (" list Iss u ers ") Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWallet Controller :: list Iss u ers ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser Role . UN AUTHORIZ ED ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġget (" metadata ", Ġdocumented ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument (). operation Ġ{ Ġit . summary (" get Ġissuer Ġmeta Ġdata "). add Tags Item (" SI OP v 2 "). operation Id (" issuer Meta ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" issuer Id "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWallet Controller :: issuer Meta ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser Role . UN AUTHORIZ ED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpost (" init Iss u ance ", Ġdocumented ( ĊĠĠĠĠĠĠĠĠĠ Ġdocument (). operation Ġ{ Ġit . summary (" Initialize Ġcredential Ġiss u ance Ġfrom Ġselected Ġissuer "). add Tags Item (" SI OP v 2 "). operation Id (" init Iss u ance ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body < Credential Iss u ance Request >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. result < String >(" 2 0 0 "), ĊĠĠĠĠĠĠĠĠĠ ĠWallet Controller :: init Iss u ance ĊĠĠĠĠĠĠĠ Ġ), ĠUser Role . AUTHORIZ ED ) ĊĠĠĠĠĠĠĠ Ġget (" finalize Iss u ance ", Ġdocumented ( ĊĠĠĠĠĠĠĠĠĠ Ġdocument (). operation Ġ{ Ġit . summary (" Finalize Ġcredential Ġiss u ance "). add Tags Item (" SI OP v 2 "). operation Id (" finalize Iss u ance ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" code ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" state ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. result < String >(" 3 0 2 "), ĊĠĠĠĠĠĠĠĠĠ ĠWallet Controller :: finalize Iss u ance ĊĠĠĠĠĠĠĠ Ġ), ĠUser Role . UN AUTHORIZ ED ) ĊĠĠĠĠĠĠĠ Ġget (" iss ued Credentials ", Ġdocumented ( ĊĠĠĠĠĠĠĠĠĠ Ġdocument (). operation Ġ{ Ġit . summary (" Get Ġcredentials Ġissued Ġin Ġcurrent Ġiss u ance Ġsession "). add Tags Item (" SI OP v 2 "). operation Id (" get Iss ued Credentials ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Param < String >(" sessionId ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. json Array < Ver ifiable Credential >(" 2 0 0 "), ĊĠĠĠĠĠĠĠĠĠ ĠWallet Controller :: get Iss ued Credentials ĊĠĠĠĠĠĠĠ Ġ), ĠUser Role . AUTHORIZ ED ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġfun Ġlist D ids ( ctx : ĠContext ) Ġ{ ĊĠĠĠ Ġctx . json ( Did Service . list D ids ()) ĊĠ Ġ} ĊĊĠ Ġfun Ġcreate Did ( ctx : Context ) Ġ{ ĊĠĠĠ Ġval Ġmethod Ġ= ĠDid Method . valueOf ( ctx . query Param (" method ") !! ) ĊĊĠĠĠ Ġif ( method Ġ== ĠDid Method . eb si ) Ġ{ ĊĠĠĠĠĠ Ġval Ġdid Creation Req Ġ= Ġctx . body As Class < Did Creation Request >() ĊĠĠĠĠĠ Ġif ( did Creation Req ?. bearer Token . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġctx . status ( Http Code . BAD _ REQUEST ). result (" eb si Bearer Token Ġform Ġparameter Ġis Ġrequired Ġfor ĠEB SI ĠD ID Ġregistration .") ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġkey Ġ= ĠKey Service . getService (). list Keys (). first OrNull Ġ{ Ġk Ġ-> Ġk . algorithm Ġ== ĠKey Algorithm . ECD SA _ Sec p 2 5 6 k 1 Ġ} ?. key Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠKey Service . getService (). generate ( Key Algorithm . ECD SA _ Sec p 2 5 6 k 1 ) ĊĠĠĠĠĠ Ġval Ġdid Ġ= ĠDid Service . create ( method , Ġkey . id ) ĊĠĠĠĠĠ ĠEss if Client . on board ( did , Ġdid Creation Req . bearer Token ) ĊĠĠĠĠĠ ĠEss if Client . auth Api ( did ) ĊĠĠĠĠĠ ĠDid Eb si Service . getService (). register Did ( did , Ġdid ) ĊĠĠĠĠĠ Ġctx . result ( did ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( method Ġ== ĠDid Method . key ) Ġ{ ĊĠĠĠĠĠ Ġctx . result ( Did Service . create ( method , ĠKey Service . getService (). list Keys (). first OrNull Ġ{ Ġk Ġ-> Ġk . algorithm Ġ== ĠKey Algorithm . Ed D SA _ Ed 2 5 5 1 9 Ġ} ?. key Id ?. id )) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( method Ġ== ĠDid Method . web ) Ġ{ ĊĠĠĠĠĠ Ġval Ġkey Ġ= ĠKey Service . getService (). generate ( Key Algorithm . RSA ) ĊĠĠĠĠĠ Ġval Ġdid Str Ġ= ĠDid Service . create ( method , Ġkey . id , ĠDid Service . Did Web Options ( URI . create ( Wallet Config . config . wallet Api Url ). authority , Ġ" api / did - registry /${ key . id } ")) ĊĠĠĠĠĠ Ġval Ġdid Doc Ġ= ĠDid Service . load ( did Str ) ĊĠĠĠĠĠ Ġ// Ġ!! ĠImp licit ĠUSER ĠCON TEXT Ġis ĠLO ST Ġafter Ġthis Ġstatement Ġ!! ĊĠĠĠĠĠ ĠContext Manager . run With ( Did Web Registry Controller . did Registry Context ) Ġ{ ĊĠĠĠĠĠĠĠ ĠDid Service . store Did ( did Str , Ġdid Doc . encode Pretty ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġctx . result ( did Str ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġget Presentation Exchange ( ctx : ĠContext ) Ġ{ ĊĠĠĠ Ġval Ġreq Ġ= ĠSI OP v 2 Request . from HttpContext ( ctx ) ĊĠĠĠ Ġval Ġdid Ġ= Ġctx . query Param (" subject _ did ") !! ĊĠĠĠ Ġctx . json ( Presentation Exchange ( did , Ġreq , Ġget Cl a imed Credentials ( did , Ġreq ))) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġhandle Presentation Response ( ctx : ĠContext ): ĠAny ? Ġ{ ĊĠĠĠ Ġval Ġpe Ġ= Ġctx . body (). let Ġ{ Ġkl ax on . parse < Presentation Exchange >( it ) Ġ} !! ĊĠĠĠ Ġval Ġmy Credentials Ġ= ĠC ust od ian . getService (). list Credentials () ĊĠĠĠ Ġval Ġselected Credential Ids Ġ= Ġpe . claimed Credentials . map Ġ{ Ġcred Ġ-> Ġcred . credential Id Ġ}. toSet () ĊĠĠĠ Ġval Ġselected Credentials Ġ= Ġmy Credentials . filter Ġ{ Ġcred Ġ-> Ġselected Credential Ids . contains ( cred . id ) Ġ}. map Ġ{ Ġcred Ġ-> Ġcred . encode () Ġ}. toList () ĊĠĠĠ Ġval Ġvp Ġ= ĠC ust od ian . getService (). create Presentation ( selected Credentials , Ġpe . subject , Ġnull , Ġchallenge Ġ= Ġpe . request . nonce , Ġexpiration Date Ġ= Ġnull ) ĊĠĠĠ Ġval Ġid _ token Ġ= ĠID Token ( ĊĠĠĠĠĠ Ġsubject Ġ= Ġpe . subject , ĊĠĠĠĠĠ Ġclient _ id Ġ= Ġpe . request . client _ id , ĊĠĠĠĠĠ Ġnonce Ġ= Ġpe . request . nonce Ġ?: Ġ"", ĊĠĠĠĠĠ Ġvp Token Ref Ġ= ĠV p Token Ref ( ĊĠĠĠĠĠĠĠ Ġpresentation _ submission Ġ= ĠPresentation Submission ( ĊĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ" 1 ", ĊĠĠĠĠĠĠĠĠĠ Ġdefinition _ id Ġ= Ġ" 1 ", ĊĠĠĠĠĠĠĠĠĠ Ġdescriptor _ map Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDescriptor Mapping . from VP (" 1 ", Ġvp ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġper Ġ= ĠPresentation Exchange Response ( ĊĠĠĠĠĠ Ġid _ token Ġ= Ġid _ token . sign (), ĊĠĠĠĠĠ Ġvp _ token Ġ= Ġvp ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġif ( pe . request . response _ mode Ġ== Ġ" form _ post " Ġ|| Ġpe . request . response _ mode Ġ== Ġ" fragment ") Ġ{ ĊĠĠĠĠĠ Ġ// Ġtrigger Ġform Ġpost Ġor Ġcall Ġredirect Ġuri Ġwith Ġfragment Ġfrom Ġweb ĠUI Ġin Ġbrowser ĊĠĠĠĠĠ Ġctx . json ( per ) ĊĠĠĠĠĠ Ġreturn Ġper ĊĠĠĠ Ġ} Ġelse Ġif ( pe . request . response _ mode Ġ== Ġ" post ") Ġ{ ĊĠĠĠĠĠ Ġ// Ġpost Ġresponse Ġto Ġredirect Ġuri Ġand Ġreturn Ġresult Ġ( avoid ing ĠCORS ) ĊĠĠĠĠĠ Ġval Ġreq Ġ= ĠHTTP Request ( HTTP Request . Method . POST , ĠURI . create ( pe . request . redirect _ uri )) ĊĠĠĠĠĠ Ġreq . query Ġ= ĠformData ( map Of (" id _ token " Ġto Ġper . id _ token , Ġ" vp _ token " Ġto Ġper . vp _ token )) ĊĠĠĠĠĠ Ġval Ġresponse Ġ= Ġreq . send (); ĊĠĠĠĠĠ Ġctx . status ( response . statusCode ). result ( response . content ) ĊĠĠĠĠĠ Ġreturn Ġresponse . content ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġctx . status ( Http Code . BAD _ REQUEST ). result (" Unknown Ġresponse Ġmode Ġ${ pe . request . response _ mode }") ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġpost Presentation Exchange ( ctx : ĠContext ) Ġ{ ĊĠĠĠ Ġhandle Presentation Response ( ctx ) ĊĠ Ġ} ĊĊĠ Ġval Ġcredential Converter Ġ= Ġobject : ĠConverter Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcan Convert ( cls : ĠClass <* >) ĊĠĠĠĠĠĠĠ Ġ= Ġcls Ġ== ĠVer ifiable Credential :: class . java ĊĊĠĠĠ Ġoverride Ġfun ĠtoJson ( value : ĠAny ): ĠString ĊĠĠĠĠĠĠĠ Ġ= Ġ( value Ġas ĠVer ifiable Credential ). encode () ĊĊĠĠĠ Ġoverride Ġfun Ġfrom Json ( jv : ĠJson Value ) ĊĠĠĠĠĠĠĠ Ġ= Ġj v . toString (). to Credential () ĊĊĠ Ġ} ĊĊĠ Ġfun Ġpost Credential Iss u ance Response ( ctx : ĠContext ) Ġ{ ĊĠĠĠ Ġval Ġcredentials Response Ġ= Ġhandle Presentation Response ( ctx ) ĊĠĠĠ Ġif ( credentials Response Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġcredentials Ġ= ĠK l ax on (). parse Array < Ver ifiable Credential >( credentials Response Ġas ĠString ) ĊĠĠĠ Ġcredentials ?. forEach Ġ{ ĊĠĠĠĠĠ ĠC ust od ian . getService (). store Credential ( it . id !! , Ġit ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Cl a imed Credentials ( subject : ĠString , Ġreq : ĠSI OP v 2 Request ): ĠList < Cl a imed Credential > Ġ{ ĊĠĠĠ Ġval Ġmy Credentials Ġ= ĠC ust od ian . getService (). list Credentials () ĊĠĠĠ Ġreturn Ġreq . claims . vp _ token ?. presentation _ definition ?. input _ descriptors ?. flatMap Ġ{ Ġin desc Ġ-> ĊĠĠĠĠĠ Ġmy Credentials . filter Ġ{ Ġin desc . schema . uri Ġ== Ġit . credential Schema ?. id Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . subject Ġ== Ġsubject Ġ&& Ġ! it . id . isNull OrEmpty () Ġ}. map Ġ{ Ġcred Ġ-> ĊĠĠĠĠĠĠĠ ĠCla imed Credential ( in desc . id , Ġcred . id !! ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ?. toList () Ġ?: ĠlistOf () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠformData ( data : ĠMap < String , ĠString >): ĠString Ġ{ ĊĊĠĠĠ Ġreturn Ġdata . map Ġ{( k , Ġv ) Ġ-> Ġ"${ ( URL Encoder . encode ( k , ĠStandard Charsets . UTF _ 8 ))} =${ URL Encoder . encode ( v , ĠStandard Charsets . UTF _ 8 )} "} ĊĠĠĠĠĠ Ġ. join ToString ("& ") ĊĠ Ġ} ĊĊĠ Ġfun Ġlist Iss u ers ( ctx : ĠContext ) Ġ{ ĊĠĠĠ Ġctx . json ( Wallet Config . config . iss u ers . values ) ĊĠ Ġ} ĊĊĠ Ġfun Ġissuer Meta ( ctx : ĠContext ) Ġ{ ĊĠĠĠ Ġval Ġmetadata Ġ= ĠWallet Config . config . iss u ers . get ( ctx . query Param (" issuer Id ")) ?. metadata ĊĠĠĠ Ġif ( metadata Ġ!= Ġnull ) ĊĠĠĠĠĠ Ġctx . json ( metadata . to JSONObject ()) ĊĠĠĠ Ġelse ĊĠĠĠĠĠ Ġctx . status ( Http Code . NOT _ FOUND ) ĊĠ Ġ} ĊĊĠ Ġfun Ġinit Iss u ance ( ctx : ĠContext ) Ġ{ ĊĠĠĠ Ġval Ġiss u ance Ġ= Ġctx . body As Class < Credential Iss u ance Request >() ĊĠĠĠ Ġval Ġlocation Ġ= ĠCredential Iss u ance Manager . init Iss u ance ( iss u ance , ĠJWT Service . getUser Info ( ctx ) !! ) ĊĠĠĠ Ġif (! location . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġctx . result ( location ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġctx . status ( Http Code . INTERNAL _ SERVER _ ERROR ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġfinalize Iss u ance ( ctx : ĠContext ) Ġ{ ĊĠĠĠ Ġval Ġstate Ġ= Ġctx . query Param (" state ") ĊĠĠĠ Ġval Ġcode Ġ= Ġctx . query Param (" code ") ĊĠĠĠ Ġif ( state . isNull OrEmpty () Ġ|| Ġcode . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġctx . status ( Http Code . BAD _ REQUEST ). result (" No Ġstate Ġor Ġauthorization Ġcode Ġgiven ") ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġiss u ance Ġ= ĠCredential Iss u ance Manager . finalize Iss u ance ( state , Ġcode ) ĊĠĠĠ Ġif ( iss u ance ?. response Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġctx . status ( Http Code . FOUND ). header (" Location ", Ġ"${ Wallet Config . config . wallet Ui Url }/ Receive Credential ? sessionId =${ iss u ance . id }") ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġctx . status ( Http Code . FOUND ). header (" Location ", Ġ"${ Wallet Config . config . wallet Ui Url }/ Iss u ance Error ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġget Iss ued Credentials ( ctx : ĠContext ) Ġ{ ĊĠĠĠ Ġval ĠsessionId Ġ= Ġctx . query Param (" sessionId ") ĊĠĠĠ Ġval Ġiss u ance Session Ġ= ĠsessionId ?. let Ġ{ ĠCredential Iss u ance Manager . getSession ( it ) Ġ} ĊĠĠĠ Ġif ( iss u ance Session Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġctx . status ( Http Code . BAD _ REQUEST ). result (" Invalid Ġor Ġexpired Ġsession Ġid Ġgiven ") ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġctx . json ( iss u ance Session . response ?. map Ġ{ Ġit . credential Ġ} ?. filter NotNull ()?. map Ġ{ ĠString ( Base 6 4 . getUrl Decoder (). decode ( it )). to Credential () Ġ} Ġ?: ĠlistOf < Ver ifiable Credential >()) ĊĠ Ġ} Ċ } Ċ