Skip to content

Commit 1eac7fe

Browse files
committed
Support credential_sets, but only for single document case.
1 parent 4ca6a83 commit 1eac7fe

File tree

6 files changed

+25
-7
lines changed

6 files changed

+25
-7
lines changed

app/src/main/assets/openid4vp.wasm

44 Bytes
Binary file not shown.

app/src/main/java/com/credman/cmwallet/getcred/GetCredentialActivity.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,13 @@ class GetCredentialActivity : FragmentActivity() {
236236
val selectedEntryId = JSONObject(entryId!!)
237237
val providerIdx = selectedEntryId.getInt("provider_idx")
238238
val selectedId = selectedEntryId.getString("id")
239+
val dqclCredId = selectedEntryId.getString("dcql_cred_id")
239240

240241
val response = processDigitalCredentialOption(
241242
it.requestJson,
242243
providerIdx,
243244
selectedId,
245+
dqclCredId,
244246
webOriginOrAppOrigin(
245247
origin,
246248
request.callingAppInfo.signingInfoCompat.signingCertificateHistory[0].toByteArray()
@@ -407,6 +409,7 @@ class GetCredentialActivity : FragmentActivity() {
407409
requestJson: String,
408410
providerIdx: Int,
409411
selectedID: String,
412+
dcqlCredId: String,
410413
origin: String
411414
): DigitalCredentialResult {
412415
val selectedCredential = CmWalletApplication.credentialRepo.getCredential(selectedID)
@@ -429,7 +432,7 @@ class GetCredentialActivity : FragmentActivity() {
429432
val openId4VPRequest = OpenId4VP(requestData, computeClientId(request!!.callingAppInfo))
430433
Log.i("GetCredentialActivity", "nonce ${openId4VPRequest.nonce}")
431434
val matchedCredential =
432-
openId4VPRequest.performQueryOnCredential(selectedCredential)
435+
openId4VPRequest.performQueryOnCredential(selectedCredential, dcqlCredId)
433436
Log.i("GetCredentialActivity", "matchedCredential $matchedCredential")
434437

435438

app/src/main/java/com/credman/cmwallet/openid4vp/DCQL.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,25 @@ data class MatchedCredential(
2121

2222
fun performQueryOnCredential(
2323
query: JSONObject,
24-
selectedCredential: CredentialItem
24+
selectedCredential: CredentialItem,
25+
dcqlCredId: String? // Only support a single document
2526
): OpenId4VPMatchedCredential {
2627
require(query.has("credentials")) { "dcql_query must contain a credentials" }
2728
val credentials = query.getJSONArray("credentials")
28-
require(credentials.length() == 1) { "Only support returning a single document" }
29-
val credential = credentials.getJSONObject(0)!!
29+
val credential = if (dcqlCredId == null) {
30+
require(credentials.length() == 1) { "Only support a single document" }
31+
credentials.getJSONObject(0)!!
32+
} else {
33+
credentials.let {
34+
for (i in 0..<it.length()) {
35+
val dcqlCred = it.getJSONObject(i)
36+
if (dcqlCred.optString("id") == dcqlCredId) {
37+
return@let dcqlCred
38+
}
39+
}
40+
throw IllegalStateException("Could not find a matching dcql credential query")
41+
}
42+
}
3043

3144
require(credential.has("id")) { "dcql_query credential must contain an id" }
3245
val dcqlId = credential.getString(("id"))

app/src/main/java/com/credman/cmwallet/openid4vp/OpenId4VP.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,8 @@ class OpenId4VP(var requestJson: JSONObject, var clientId: String) {
123123
return DCQLQuery(dcqlQuery, credentialStore)
124124
}
125125

126-
fun performQueryOnCredential(selectedCredential: CredentialItem): OpenId4VPMatchedCredential {
127-
return performQueryOnCredential(dcqlQuery, selectedCredential)
126+
fun performQueryOnCredential(selectedCredential: CredentialItem, dcqlCredId: String? = null): OpenId4VPMatchedCredential {
127+
return performQueryOnCredential(dcqlQuery, selectedCredential, dcqlCredId)
128128
}
129129

130130
fun getHandover(origin: String): List<Any> {

matcher/dcql.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,8 @@ cJSON* dcql_query(cJSON* query, cJSON* credential_store) {
206206
cJSON_AddItemReferenceToObject(candidate_matched_credentials, id, m);
207207
}
208208

209-
if (cJSON_GetArraySize(credentials) == cJSON_GetArraySize(candidate_matched_credentials)) {
209+
// Only support matching 1 credential for now
210+
if (cJSON_GetArraySize(candidate_matched_credentials) > 0) {
210211
matched_credentials = candidate_matched_credentials;
211212
}
212213
}

matcher/openid4vp.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ int main() {
135135
cJSON* matched_id = cJSON_GetObjectItem(c, "id");
136136

137137
cJSON_AddItemReferenceToObject(id_obj, "id", matched_id);
138+
cJSON_AddItemReferenceToObject(id_obj, "dcql_cred_id", doc_id);
138139
cJSON_AddItemReferenceToObject(id_obj, "provider_idx", cJSON_CreateNumber(i));
139140
char* id = cJSON_PrintUnformatted(id_obj);
140141

0 commit comments

Comments
 (0)