From ea5fef923761b413a66af66b42cb6ba9f42dda81 Mon Sep 17 00:00:00 2001 From: Chris Stewart Date: Mon, 25 Apr 2016 19:19:30 -0500 Subject: [PATCH] Implementing ScriptVerifyLowS flag --- .../org/bitcoins/crypto/TransactionSignatureChecker.scala | 8 +++++++- .../crypto/TransactionSignatureCheckerResult.scala | 7 +++++++ .../org/bitcoins/script/crypto/CryptoInterpreter.scala | 4 ++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/scala/org/bitcoins/crypto/TransactionSignatureChecker.scala b/src/main/scala/org/bitcoins/crypto/TransactionSignatureChecker.scala index 253f295b69..9eae09cebf 100644 --- a/src/main/scala/org/bitcoins/crypto/TransactionSignatureChecker.scala +++ b/src/main/scala/org/bitcoins/crypto/TransactionSignatureChecker.scala @@ -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 diff --git a/src/main/scala/org/bitcoins/crypto/TransactionSignatureCheckerResult.scala b/src/main/scala/org/bitcoins/crypto/TransactionSignatureCheckerResult.scala index d491b18aa9..7cad82f62a 100644 --- a/src/main/scala/org/bitcoins/crypto/TransactionSignatureCheckerResult.scala +++ b/src/main/scala/org/bitcoins/crypto/TransactionSignatureCheckerResult.scala @@ -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 +} diff --git a/src/main/scala/org/bitcoins/script/crypto/CryptoInterpreter.scala b/src/main/scala/org/bitcoins/script/crypto/CryptoInterpreter.scala index ff019dd7db..e9d22a3447 100644 --- a/src/main/scala/org/bitcoins/script/crypto/CryptoInterpreter.scala +++ b/src/main/scala/org/bitcoins/script/crypto/CryptoInterpreter.scala @@ -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) } } }