Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/main'
Browse files Browse the repository at this point in the history
  • Loading branch information
waltkb committed Oct 18, 2023
2 parents 816c55c + d256546 commit e427eea
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 2 deletions.
1 change: 1 addition & 0 deletions src/main/kotlin/id/walt/auditor/PolicyRegistryService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ open class PolicyRegistryService : WaltIdService() {
)
register(CredentialStatusPolicy::class, "Verify by credential status")
register(DynamicPolicy::class, DynamicPolicyArg::class, "Verify credential by rego policy")
register(MultiSignaturePolicy::class, "Verify embedded multiple signatures")

// predefined, hardcoded rego policy specializations
// VerifiableMandate policy as specialized rego policy
Expand Down
37 changes: 37 additions & 0 deletions src/main/kotlin/id/walt/auditor/policies/MultiSignaturePolicy.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package id.walt.auditor.policies

import id.walt.auditor.SimpleVerificationPolicy
import id.walt.auditor.VerificationPolicyResult
import id.walt.credentials.w3c.VerifiableCredential

class JwtHelper(val credential: String) {
val header get() = credential.substringBefore(".")
val payload get() = credential.substringAfter(".").substringBefore(".")
val signature get() = credential.substringAfterLast(".")
val jwsSignaturePart get() = mapOf(
"protected" to header,
"signature" to signature
)

companion object {
fun fromJWS(payload: String, sig: Map<String, String>): JwtHelper {
val h = sig["protected"] ?: throw Exception("No header found")
val s = sig["signature"] ?: throw Exception("No sig found")
return JwtHelper("$h.$payload.$s")
}
}
}

class MultiSignaturePolicy: SimpleVerificationPolicy() {
override val description: String
get() = "JWS Multi Signature Verification Policy"

override fun doVerify(vc: VerifiableCredential): VerificationPolicyResult {
val payload = (vc.credentialSubject?.properties?.get("payload") as? String) ?: return VerificationPolicyResult.failure()
val signatures = (vc.credentialSubject?.properties?.get("signatures") as? List<Map<String, String>>) ?: return VerificationPolicyResult.failure()
val credentials = signatures.map { JwtHelper.fromJWS(payload, it).credential }
return if(credentials.all { SignaturePolicy().verify(VerifiableCredential.fromString(it)).isSuccess }) {
VerificationPolicyResult.success()
} else VerificationPolicyResult.failure()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ data class PresentableCredential(
} else {
verifiableCredential.sdJwt!!.present(selectiveDisclosure?.let { SDMapBuilder().addField(claimKey, false, it).build() })
}
JsonPrimitive(presentedJwt.toString(formatForPresentation = true))
JsonPrimitive(presentedJwt.toString(formatForPresentation = false))
} else verifiableCredential.toJsonElement()

val isJwt
Expand Down
4 changes: 3 additions & 1 deletion src/main/kotlin/id/walt/signatory/WaltIdSignatory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,9 @@ class WaltIdSignatory(configurationPath: String) : Signatory() {
val fullProofConfig = fillProofConfig(config)
val vcRequest = credentialBuilder.apply {
issuer?.let { setIssuer(it) }
setIssuerId(fullProofConfig.issuerDid)
if(issuer?.id.isNullOrEmpty()) {
setIssuerId(fullProofConfig.issuerDid)
}
setIssuanceDate(fullProofConfig.issueDate ?: Instant.now())
setIssued(fullProofConfig.issueDate ?: Instant.now())
fullProofConfig.subjectDid?.let { setSubjectId(it) }
Expand Down

0 comments on commit e427eea

Please sign in to comment.