@@ -7,6 +7,7 @@ import android.util.Log
77import androidx.compose.ui.input.key.Key
88import com.credman.cmwallet.CmWalletApplication.Companion.TAG
99import com.credman.cmwallet.createJWTES256
10+ import com.credman.cmwallet.jweSerialization
1011import com.credman.cmwallet.loadECPrivateKey
1112import com.credman.cmwallet.openid4vci.data.CredentialOffer
1213import com.credman.cmwallet.openid4vci.data.CredentialRequest
@@ -37,6 +38,7 @@ import io.ktor.http.parameters
3738import io.ktor.serialization.kotlinx.json.json
3839import io.ktor.util.encodeBase64
3940import kotlinx.coroutines.delay
41+ import kotlinx.serialization.encodeToString
4042import kotlinx.serialization.json.Json
4143import kotlinx.serialization.json.JsonArray
4244import kotlinx.serialization.json.JsonObject
@@ -283,6 +285,19 @@ class OpenId4VCI(val credentialOfferJson: String) {
283285 return result.body()
284286 }
285287
288+ fun requireCredentialRequestEncryption (): Boolean = credentialOffer.issuerMetadata.credentialRequestEncryption?.encryptionRequired ? : false
289+ fun getCredentialRequestEncryptionKey (): JSONObject {
290+ require(credentialOffer.issuerMetadata.credentialRequestEncryption!! .encValuesSupported.contains(" A128GCM" )) {
291+ " Don't support the credential request encryption method yet"
292+ }
293+ val keys = credentialOffer.issuerMetadata.credentialRequestEncryption.jwks.keys
294+ val key = keys.firstOrNull{
295+ it.alg == " ECDH-ES"
296+ } ? : throw java.lang.UnsupportedOperationException (" No supported encryption key" )
297+ return JSONObject (Json .encodeToString(key))
298+ }
299+ fun requireCredentialResponseEncryption (): Boolean = credentialOffer.issuerMetadata.credentialResponseEncryption?.encryptionRequired ? : false
300+
286301 @OptIn(ExperimentalUuidApi ::class )
287302 suspend fun requestCredentialFromEndpoint (
288303 accessToken : String ,
@@ -299,9 +314,18 @@ class OpenId4VCI(val credentialOfferJson: String) {
299314 header(HttpHeaders .Authorization , " Dpop $accessToken " )
300315 header(" dpop" , dpop)
301316
302- contentType(ContentType .Application .Json )
303- setBody(json.encodeToJsonElement(credentialRequest))
304-
317+ if (requireCredentialRequestEncryption()) {
318+ contentType(ContentType (" application" , " jwt" ))
319+ setBody(jweSerialization(
320+ recipientKeyJwk = getCredentialRequestEncryptionKey(),
321+ plainText = json.encodeToJsonElement(credentialRequest).toString()
322+ ))
323+ } else {
324+ contentType(ContentType .Application .Json )
325+ setBody(
326+ json.encodeToJsonElement(credentialRequest)
327+ )
328+ }
305329 }
306330
307331 if (result.status == HttpStatusCode .Unauthorized ) {
0 commit comments