Skip to content

Commit e427eea

Browse files
committed
Merge remote-tracking branch 'origin/main'
2 parents 816c55c + d256546 commit e427eea

File tree

4 files changed

+42
-2
lines changed

4 files changed

+42
-2
lines changed

src/main/kotlin/id/walt/auditor/PolicyRegistryService.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ open class PolicyRegistryService : WaltIdService() {
165165
)
166166
register(CredentialStatusPolicy::class, "Verify by credential status")
167167
register(DynamicPolicy::class, DynamicPolicyArg::class, "Verify credential by rego policy")
168+
register(MultiSignaturePolicy::class, "Verify embedded multiple signatures")
168169

169170
// predefined, hardcoded rego policy specializations
170171
// VerifiableMandate policy as specialized rego policy
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package id.walt.auditor.policies
2+
3+
import id.walt.auditor.SimpleVerificationPolicy
4+
import id.walt.auditor.VerificationPolicyResult
5+
import id.walt.credentials.w3c.VerifiableCredential
6+
7+
class JwtHelper(val credential: String) {
8+
val header get() = credential.substringBefore(".")
9+
val payload get() = credential.substringAfter(".").substringBefore(".")
10+
val signature get() = credential.substringAfterLast(".")
11+
val jwsSignaturePart get() = mapOf(
12+
"protected" to header,
13+
"signature" to signature
14+
)
15+
16+
companion object {
17+
fun fromJWS(payload: String, sig: Map<String, String>): JwtHelper {
18+
val h = sig["protected"] ?: throw Exception("No header found")
19+
val s = sig["signature"] ?: throw Exception("No sig found")
20+
return JwtHelper("$h.$payload.$s")
21+
}
22+
}
23+
}
24+
25+
class MultiSignaturePolicy: SimpleVerificationPolicy() {
26+
override val description: String
27+
get() = "JWS Multi Signature Verification Policy"
28+
29+
override fun doVerify(vc: VerifiableCredential): VerificationPolicyResult {
30+
val payload = (vc.credentialSubject?.properties?.get("payload") as? String) ?: return VerificationPolicyResult.failure()
31+
val signatures = (vc.credentialSubject?.properties?.get("signatures") as? List<Map<String, String>>) ?: return VerificationPolicyResult.failure()
32+
val credentials = signatures.map { JwtHelper.fromJWS(payload, it).credential }
33+
return if(credentials.all { SignaturePolicy().verify(VerifiableCredential.fromString(it)).isSuccess }) {
34+
VerificationPolicyResult.success()
35+
} else VerificationPolicyResult.failure()
36+
}
37+
}

src/main/kotlin/id/walt/credentials/w3c/VerifiablePresentation.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ data class PresentableCredential(
6262
} else {
6363
verifiableCredential.sdJwt!!.present(selectiveDisclosure?.let { SDMapBuilder().addField(claimKey, false, it).build() })
6464
}
65-
JsonPrimitive(presentedJwt.toString(formatForPresentation = true))
65+
JsonPrimitive(presentedJwt.toString(formatForPresentation = false))
6666
} else verifiableCredential.toJsonElement()
6767

6868
val isJwt

src/main/kotlin/id/walt/signatory/WaltIdSignatory.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@ class WaltIdSignatory(configurationPath: String) : Signatory() {
101101
val fullProofConfig = fillProofConfig(config)
102102
val vcRequest = credentialBuilder.apply {
103103
issuer?.let { setIssuer(it) }
104-
setIssuerId(fullProofConfig.issuerDid)
104+
if(issuer?.id.isNullOrEmpty()) {
105+
setIssuerId(fullProofConfig.issuerDid)
106+
}
105107
setIssuanceDate(fullProofConfig.issueDate ?: Instant.now())
106108
setIssued(fullProofConfig.issueDate ?: Instant.now())
107109
fullProofConfig.subjectDid?.let { setSubjectId(it) }

0 commit comments

Comments
 (0)