ENT-12314: Dont display warning for sig constraint fail if checking for rotated keys after.

This commit is contained in:
Adel El-Beik 2024-11-05 18:17:58 +00:00
parent a3519d9fd0
commit 8d9120713c
3 changed files with 14 additions and 6 deletions

View File

@ -114,14 +114,21 @@ object AutomaticPlaceholderConstraint : AttachmentConstraint {
*/
@KeepForDJVM
data class SignatureAttachmentConstraint(val key: PublicKey) : AttachmentConstraint {
override fun isSatisfiedBy(attachment: Attachment): Boolean {
override fun isSatisfiedBy(attachment: Attachment) = isSatisfiedBy(attachment, disableWarnings = false)
fun isSatisfiedBy(attachment: Attachment, disableWarnings: Boolean): Boolean {
log.debug("Checking signature constraints: verifying $key in contract attachment signer keys: ${attachment.signerKeys}")
return if (!key.isFulfilledBy(attachment.signerKeys.map { it })) {
log.warn("Untrusted signing key: expected $key. but contract attachment contains ${attachment.signerKeys}." +
"The key on the attachment may be a rotated key. Will recheck. To remove this warning you should update your" +
"output state signature attachment constraint to use the same key as on the attachment.")
if (!disableWarnings) log.warn("Untrusted signing key: expected $key. but contract attachment contains ${attachment.signerKeys}")
false
}
else true
}
}
fun isSatisfiedByWithNoWarnForSigConstraint(constraint: AttachmentConstraint, attachment: Attachment): Boolean {
return if (constraint is SignatureAttachmentConstraint) {
constraint.isSatisfiedBy(attachment, true)
} else {
constraint.isSatisfiedBy(attachment)
}
}

View File

@ -32,6 +32,7 @@ import net.corda.core.contracts.TransactionVerificationException.TransactionMiss
import net.corda.core.contracts.TransactionVerificationException.TransactionNonMatchingEncumbranceException
import net.corda.core.contracts.TransactionVerificationException.TransactionNotaryMismatchEncumbranceException
import net.corda.core.contracts.TransactionVerificationException.TransactionRequiredContractUnspecifiedException
import net.corda.core.contracts.isSatisfiedByWithNoWarnForSigConstraint
import net.corda.core.crypto.CompositeKey
import net.corda.core.crypto.SecureHash
import net.corda.core.internal.rules.StateContractValidationEnforcementRule
@ -430,7 +431,7 @@ private class Validator(private val ltx: LedgerTransaction, private val transact
if (HashAttachmentConstraint.disableHashConstraints && constraint is HashAttachmentConstraint)
logger.warnOnce("Skipping hash constraints verification.")
else if (!constraint.isSatisfiedBy(constraintAttachment)) {
else if (!isSatisfiedByWithNoWarnForSigConstraint(constraint, constraintAttachment)) {
verifyConstraintUsingRotatedKeys(constraint, constraintAttachment, contract)
}
}

View File

@ -573,7 +573,7 @@ open class TransactionBuilder(
// Sanity check that the selected attachment actually passes.
if (!defaultOutputConstraint.isSatisfiedBy(constraintAttachment)) {
if (!isSatisfiedByWithNoWarnForSigConstraint(defaultOutputConstraint, constraintAttachment)) {
// The defaultOutputConstraint is the input constraint by the attachment in use currently may have a rotated key
if (defaultOutputConstraint is SignatureAttachmentConstraint && (getRotatedKeys(serviceHub).canBeTransitioned(defaultOutputConstraint.key, constraintAttachment.signerKeys))) {
return Pair(makeSignatureAttachmentConstraint(attachmentToUse.signerKeys), constraintAttachment)