Skip to content

Commit 00ec2df

Browse files
committed
Fix recursive disclosure (example: address)
1 parent 177832d commit 00ec2df

File tree

6 files changed

+84
-50
lines changed

6 files changed

+84
-50
lines changed

app/src/main/assets/databasenew.json

Lines changed: 22 additions & 22 deletions
Large diffs are not rendered by default.

app/src/main/java/com/credman/cmwallet/data/repository/CredentialRepository.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,19 @@ class CredentialRepository {
183183
val currPath = path.toMutableList() // Make a copy
184184
currPath.add(key)
185185
if (v is JSONObject) {
186+
val displayName = displayConfig?.claims?.firstOrNull{
187+
JSONArray(it.path) == currPath
188+
}?.display?.first()?.name ?: currPath.joinToString(separator = ".")
189+
claims.add(
190+
SdJwtClaim(
191+
path = currPath,
192+
value = null,
193+
fieldDisplayPropertySet = setOf(VerificationFieldDisplayProperties(
194+
displayName = displayName,
195+
)),
196+
// isSelectivelyDisclosable = TODO()
197+
)
198+
)
186199
constructJwtClaims(
187200
v,
188201
displayConfig,

app/src/main/java/com/credman/cmwallet/sdjwt/SdJwt.kt

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,17 @@ import java.math.BigInteger
99
import java.nio.ByteBuffer
1010
import java.security.MessageDigest
1111
import android.util.Base64
12+
import android.util.Log
1213
import com.credman.cmwallet.createJWTES256
1314
import com.credman.cmwallet.jwsDeserialization
1415
import com.credman.cmwallet.loadECPrivateKey
1516
import kotlinx.serialization.json.buildJsonObject
1617
import kotlinx.serialization.json.put
18+
import java.lang.IllegalStateException
1719
import java.security.PrivateKey
1820
import java.time.Instant
21+
import kotlin.collections.iterator
22+
import kotlin.collections.mutableListOf
1923

2024
class SdJwt(
2125
credential: String,
@@ -37,6 +41,23 @@ class SdJwt(
3741
verify(issuerJwt, disclosures)
3842
}
3943

44+
private fun addDisclosuresToPresentation(sd: JSONObject, ret: MutableList<String>) {
45+
for (key in sd.keys()) {
46+
if ("_sd" == key) {
47+
val digest = sd.getString("_sd")
48+
val disclosure = verifiedResult.digestDisclosureMap[digest]!!
49+
ret.add(disclosure)
50+
} else {
51+
val recursiveSd = sd.get(key)
52+
if (recursiveSd is JSONObject) {
53+
addDisclosuresToPresentation(recursiveSd, ret)
54+
} else {
55+
throw IllegalStateException("Unexpected type ${recursiveSd::class.java}")
56+
}
57+
}
58+
}
59+
}
60+
4061
fun present(
4162
claimSets: JSONArray?, // If null, match all
4263
nonce: String,
@@ -67,8 +88,7 @@ class SdJwt(
6788
}
6889
}
6990
if (claimSetMatched) {
70-
val digest = sd.getString("_sd")
71-
ret.add(verifiedResult.digestDisclosureMap[digest]!!)
91+
addDisclosuresToPresentation(sd, ret)
7292
} else {
7393
break
7494
}

matcher/credentialmanager.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,11 @@ __attribute__((import_module("credman"), import_name("GetCallingAppInfo")))
101101
#endif
102102
void GetCallingAppInfo(CallingAppInfo* info);
103103

104-
#endif
105104

106105
// Only works for system applications
107106
#if defined(__wasm__)
108107
__attribute__((import_module("credman_v4"), import_name("SelfDeclarePackageInfo")))
109108
#endif
110-
void SelfDeclarePackageInfo(char *package_display_name, char* package_icon, size_t package_icon_len);
109+
void SelfDeclarePackageInfo(char *package_display_name, char* package_icon, size_t package_icon_len);
110+
111+
#endif

0 commit comments

Comments
 (0)