package Ġid . walt . common Ċ Ċ import Ġcom . be ust . kl ax on . Kl ax on Ċ import Ġcom . nim bus ds . j ose . j wk . J WK Ċ import Ġcom . nim bus ds . jwt . JWT Claims Set Ċ import Ġcom . nim bus ds . jwt . Signed JWT Ċ import Ġid . walt . model .* Ċ import Ġid . walt . services . ess if . user wallet . User Wallet Service Ċ import Ġid . walt . services . jwt . Jwt Service Ċ import Ġid . walt . services . key . Key Service Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġkotlinx . serialization . json . jsonObject Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . time . Instant Ċ import Ġjava . util .* Ċ Ċ object ĠO id c Util Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} ĊĠĠĠ Ġprivate Ġval Ġkey Service Ġ= ĠKey Service . getService () ĊĠĠĠ Ġprivate Ġval Ġjwt Service Ġ= ĠJwt Service . getService () ĊĊĠĠĠ Ġfun Ġgenerate Oid c Authentication Request ( ĊĠĠĠĠĠĠĠ Ġdid : ĠString , ĊĠĠĠĠĠĠĠ Ġredirect Uri : ĠString , ĊĠĠĠĠĠĠĠ Ġcallback : ĠString , ĊĠĠĠĠĠĠĠ Ġnonce : ĠString ĊĠĠĠ Ġ): ĠO id c Request Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġingest Ġcorrect Ġparameters Ġand Ġclaims ĊĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġ" openid Ġdid _ auth n " ĊĠĠĠĠĠĠĠ Ġval Ġresponse _ type Ġ= Ġ" id _ token " ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey J wk Ġ= ĠK l ax on (). parse < J wk >( key Service . to J wk ( did ). to Public J WK (). toString ()) !! ĊĠĠĠĠĠĠĠ Ġval Ġauth Request Header Ġ= ĠAuthentication Header (" ES 2 5 6 K ", Ġ" JWT ", ĠpublicKey J wk ) ĊĠĠĠĠĠĠĠ Ġval Ġiss Ġ= Ġdid ĊĠĠĠĠĠĠĠ Ġval Ġj w ks _ uri Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġclient _ id Ġ= Ġredirect Uri ĊĠĠĠĠĠĠĠ Ġval Ġregistration Ġ= ĠAuthentication Request Registration ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" https :// app . eb si . xyz "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse _ type , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" ES 2 5 K ", Ġ" Ed D SA "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" ES 2 5 K ", Ġ" Ed D SA "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" ES 2 5 K ", Ġ" Ed D SA "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" ECD H - ES "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" A 1 2 8 GCM ", Ġ" A 2 5 6 GCM "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj w ks _ uri ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġclaims Ġ= ĠClaim ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠId Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġauth Request Payload Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication Request Payload ( scope , Ġiss , Ġresponse _ type , Ġclient _ id , Ġnonce , Ġregistration , Ġclaims ) ĊĠĠĠĠĠĠĠ Ġval Ġdid Auth Request Jwt Ġ= ĠAuthentication Request Jwt ( auth Request Header , Ġauth Request Payload ) ĊĠĠĠĠĠĠĠ Ġval Ġdid Auth Req Ġ= ĠDid Auth Request ( response _ type , Ġclient _ id , Ġscope , Ġnonce , Ġdid Auth Request Jwt , Ġcallback ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġto Oid c Request ( did Auth Req , Ġdid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvalidate Oid c Authentication Request ( oidc Auth Req : ĠO id c Request ): ĠDid Auth Request Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġdid Auth Req Ġ= Ġto Did Auth Request ( oidc Auth Req ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠValidate ĠD ID ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdid Auth Req ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Oid c Authentication Request Uri ( authentication Request Response Json : ĠString ): ĠO id c Authentication Request Uri Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠJson . parse ToJson Element ( authentication Request Response Json ). jsonObject [" uri "]. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam String Ġ= Ġuri . substring After (" openid :// ?") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpm Ġ= Ġto Param Map ( param String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠO id c Authentication Request Uri ( pm [" response _ type "] !! , Ġpm [" scope "] !! , Ġpm [" request "] !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error Ġ{ Ġ" Could Ġnot Ġparse ĠAuthentication Request Response : Ġ$ authentication Request Response Json " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Oid c Request ( did Auth Req : ĠDid Auth Request , Ġkey Alias : ĠString ): ĠO id c Request Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġval Ġauth Request Jwt Ġ= Ġenc Base 6 4 ( Kl ax on (). toJson String ( did Auth Req ). toByteArray ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= ĠK l ax on (). toJson String ( did Auth Req ) ĊĠĠĠĠĠĠĠ Ġval Ġauth Request Jwt Ġ= Ġjwt Service . sign ( key Alias , Ġpayload ) ĊĊĠĠĠĠĠĠĠ Ġval ĠclientId Ġ= Ġurl Encode ( did Auth Req . client _ id ) ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġurl Encode ( did Auth Req . scope ) ĊĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġ" openid :// ? response _ type = id _ token & client _ id =$ clientId & scope =$ scope & request =$ auth Request Jwt & nonce =${ did Auth Req . nonce }" ĊĠĠĠĠĠĠĠ Ġreturn ĠO id c Request ( uri , Ġdid Auth Req . callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Did Auth Request ( oidc Auth Req : ĠO id c Request ): ĠDid Auth Request Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġparam String Ġ= Ġoid c Auth Req . uri . substring After (" openid :// ?") ĊĠĠĠĠĠĠĠ Ġval Ġpm Ġ= Ġto Param Map ( param String ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Type Ġ= Ġpm [" response _ type "] !! ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġpm [" scope "] !! ĊĠĠĠĠĠĠĠ Ġval Ġauth Request Jwt Ġ= Ġpm [" request "] !! ĊĊĠĠĠĠĠĠĠ Ġif Ġ( jwt Service . verify ( auth Request Jwt )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Successfully Ġverified Ġsignature Ġof ĠJWT " Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Could Ġnot Ġverify ĠJWT Ġ$ auth Request Jwt ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// val Ġdid Auth Request Str Ġ= ĠString ( dec Base 6 4 ( auth Request Jwt )) ĊĠĠĠĠĠĠĠ Ġval Ġjwt Ġ= ĠSigned JWT . parse ( auth Request Jwt ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠK l ax on (). parse < Did Auth Request >( jwt . payload . toString ()) !! ĊĊĠĠĠĠĠĠĠ Ġif Ġ( oidc Auth Req . callback Ġ!= Ġrequest . callback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Callbacks Ġin ĠO id c Request Ġdata Ġstructure Ġare Ġnot Ġmatching Ġwe Ġgot : Ġ${ oidc Auth Req . callback } Ġ& Ġ${ request . callback }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( scope Ġ!= Ġrequest . scope ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Scopes Ġin ĠO id c Request Ġdata Ġstructure Ġare Ġnot Ġmatching Ġwe Ġgot : Ġ${ scope } Ġ& Ġ${ request . scope }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( response Type Ġ!= Ġrequest . re ponse _ type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Scopes Ġin ĠO id c Request Ġdata Ġstructure Ġare Ġnot Ġmatching Ġwe Ġgot : Ġ${ response Type } Ġ& Ġ${ request . re ponse _ type }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrequest ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġreturn ĠDid Auth Request ( response Type , ĠclientId , Ġscope , Ġnonce , Ġrequest , Ġoid c Auth Req . callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Oid c Authentication Response ( ĊĠĠĠĠĠĠĠ Ġemp h PubKey : ĠJ WK , ĊĠĠĠĠĠĠĠ Ġdid : ĠString , ĊĠĠĠĠĠĠĠ Ġverified Claims : ĠString , ĊĠĠĠĠĠĠĠ Ġnonce : ĠString ĊĠĠĠ Ġ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// val Ġkid Ġ= ĠDid Service . load Did Eb si ( did ). authentication ! ![ 0 ] ĊĠĠĠĠĠĠĠ Ġ// val Ġkey Ġ= Ġemp h Priv Key Ġas ĠEC Key ĊĠĠĠĠĠĠĠ Ġ// val Ġkey Ġ= ĠKey Service . to J wk ( did , Ġfalse , Ġkid ) Ġas ĠEC Key ĊĊĠĠĠĠĠĠĠ Ġval Ġthumb print Ġ= Ġemp h PubKey . compute Thumb print (). toString () ĊĊĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= ĠJWT Claims Set . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. issuer (" https :// self - iss ued . me ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. audience ("/ si op - sessions ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subject ( thumb print ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. issue Time ( Date . from ( Instant . now ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expiration Time ( Date . from ( Instant . now (). plus Seconds ( 3 0 0 ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. claim (" nonce ", Ġnonce ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. claim (" sub _ j wk ", Ġemp h PubKey . to JSONObject ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. claim ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" claims ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" verified _ claims " Ġto Ġverified Claims , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" encryption _ key " Ġto ĠUser Wallet Service . embed Public Encryption Key ( emph PubKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (). toString () ĊĊĠĠĠĠĠĠĠ Ġval Ġjwt Ġ= Ġjwt Service . sign ( did , Ġpayload ) ĊĊĠĠĠĠĠĠĠ Ġjwt Service . verify ( jwt ). let Ġ{ Ġif Ġ(! it ) Ġthrow ĠIllegalStateException (" Generated ĠJ WK Ġnot Ġvalid ") Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġjwt ĊĠĠĠ Ġ} Ċ Ċ } Ċ