mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2025-02-25 07:17:32 +01:00
Implementing ScriptVerifyLowS flag
This commit is contained in:
parent
300a045818
commit
ea5fef9237
3 changed files with 18 additions and 1 deletions
|
@ -29,6 +29,7 @@ trait TransactionSignatureChecker extends BitcoinSLogger {
|
|||
*/
|
||||
def checkSignature(txSignatureComponent : TransactionSignatureComponent,
|
||||
pubKey: ECPublicKey, signature : ECDigitalSignature, flags : Seq[ScriptFlag]) : TransactionSignatureCheckerResult = {
|
||||
logger.info("Signature: " + signature)
|
||||
val pubKeyEncodedCorrectly = BitcoinScriptUtil.checkPubKeyEncoding(pubKey,flags)
|
||||
if (ScriptFlagUtil.requiresStrictDerEncoding(flags) && !DERSignatureUtil.isStrictDEREncoding(signature)) {
|
||||
logger.error("Signature was not stricly encoded der: " + signature.hex)
|
||||
|
@ -36,6 +37,10 @@ trait TransactionSignatureChecker extends BitcoinSLogger {
|
|||
} else if (ScriptFlagUtil.requireLowSValue(flags) && !DERSignatureUtil.isLowDerSignature(signature)) {
|
||||
logger.error("Signature did not have a low s value")
|
||||
ScriptValidationFailureHighSValue
|
||||
} else if (ScriptFlagUtil.requireStrictEncoding(flags) && signature.bytes.size > 0 &&
|
||||
!HashTypeFactory.hashTypes.find(_.byte == signature.bytes.last).isDefined) {
|
||||
logger.error("Hash type was not defined on the signature")
|
||||
ScriptValidationFailureHashType
|
||||
} else if (!pubKeyEncodedCorrectly) {
|
||||
logger.error("The public key given for signature checking was not encoded correctly")
|
||||
SignatureValidationFailurePubKeyEncoding
|
||||
|
@ -96,7 +101,7 @@ trait TransactionSignatureChecker extends BitcoinSLogger {
|
|||
val result = checkSignature(txSignatureComponent,pubKey,sig,flags)
|
||||
result match {
|
||||
case SignatureValidationSuccess =>
|
||||
multiSignatureEvaluator(txSignatureComponent, sigs.tail,pubKeys.tail,flags, requiredSigs -1)
|
||||
multiSignatureEvaluator(txSignatureComponent, sigs.tail,pubKeys.tail,flags, requiredSigs - 1)
|
||||
case SignatureValidationFailureIncorrectSignatures =>
|
||||
multiSignatureEvaluator(txSignatureComponent, sigs,pubKeys.tail,flags, requiredSigs)
|
||||
case SignatureValidationFailureNotStrictDerEncoding =>
|
||||
|
@ -106,6 +111,7 @@ trait TransactionSignatureChecker extends BitcoinSLogger {
|
|||
case SignatureValidationFailurePubKeyEncoding =>
|
||||
SignatureValidationFailurePubKeyEncoding
|
||||
case ScriptValidationFailureHighSValue => ScriptValidationFailureHighSValue
|
||||
case ScriptValidationFailureHashType => ScriptValidationFailureHashType
|
||||
}
|
||||
} else if (sigs.isEmpty) {
|
||||
//means that we have checked all of the sigs against the public keys
|
||||
|
|
|
@ -62,3 +62,10 @@ case object SignatureValidationFailurePubKeyEncoding extends TransactionSignatur
|
|||
case object ScriptValidationFailureHighSValue extends TransactionSignatureCheckerResult {
|
||||
def isValid = false
|
||||
}
|
||||
|
||||
/**
|
||||
* Fails the script if the hash type is not defined on a digital signature
|
||||
*/
|
||||
case object ScriptValidationFailureHashType extends TransactionSignatureCheckerResult {
|
||||
def isValid = false
|
||||
}
|
||||
|
|
|
@ -118,6 +118,8 @@ trait CryptoInterpreter extends ControlOperationsInterpreter with BitcoinSLogger
|
|||
ScriptProgram(program,ScriptErrorPubKeyType)
|
||||
case ScriptValidationFailureHighSValue =>
|
||||
ScriptProgram(program,ScriptErrorSigHighS)
|
||||
case ScriptValidationFailureHashType =>
|
||||
ScriptProgram(program,ScriptErrorSigHashType)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -239,6 +241,8 @@ trait CryptoInterpreter extends ControlOperationsInterpreter with BitcoinSLogger
|
|||
ScriptProgram(program,ScriptErrorPubKeyType)
|
||||
case ScriptValidationFailureHighSValue =>
|
||||
ScriptProgram(program,ScriptErrorSigHighS)
|
||||
case ScriptValidationFailureHashType =>
|
||||
ScriptProgram(program,ScriptErrorSigHashType)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue