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,
|
def checkSignature(txSignatureComponent : TransactionSignatureComponent,
|
||||||
pubKey: ECPublicKey, signature : ECDigitalSignature, flags : Seq[ScriptFlag]) : TransactionSignatureCheckerResult = {
|
pubKey: ECPublicKey, signature : ECDigitalSignature, flags : Seq[ScriptFlag]) : TransactionSignatureCheckerResult = {
|
||||||
|
logger.info("Signature: " + signature)
|
||||||
val pubKeyEncodedCorrectly = BitcoinScriptUtil.checkPubKeyEncoding(pubKey,flags)
|
val pubKeyEncodedCorrectly = BitcoinScriptUtil.checkPubKeyEncoding(pubKey,flags)
|
||||||
if (ScriptFlagUtil.requiresStrictDerEncoding(flags) && !DERSignatureUtil.isStrictDEREncoding(signature)) {
|
if (ScriptFlagUtil.requiresStrictDerEncoding(flags) && !DERSignatureUtil.isStrictDEREncoding(signature)) {
|
||||||
logger.error("Signature was not stricly encoded der: " + signature.hex)
|
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)) {
|
} else if (ScriptFlagUtil.requireLowSValue(flags) && !DERSignatureUtil.isLowDerSignature(signature)) {
|
||||||
logger.error("Signature did not have a low s value")
|
logger.error("Signature did not have a low s value")
|
||||||
ScriptValidationFailureHighSValue
|
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) {
|
} else if (!pubKeyEncodedCorrectly) {
|
||||||
logger.error("The public key given for signature checking was not encoded correctly")
|
logger.error("The public key given for signature checking was not encoded correctly")
|
||||||
SignatureValidationFailurePubKeyEncoding
|
SignatureValidationFailurePubKeyEncoding
|
||||||
|
@ -96,7 +101,7 @@ trait TransactionSignatureChecker extends BitcoinSLogger {
|
||||||
val result = checkSignature(txSignatureComponent,pubKey,sig,flags)
|
val result = checkSignature(txSignatureComponent,pubKey,sig,flags)
|
||||||
result match {
|
result match {
|
||||||
case SignatureValidationSuccess =>
|
case SignatureValidationSuccess =>
|
||||||
multiSignatureEvaluator(txSignatureComponent, sigs.tail,pubKeys.tail,flags, requiredSigs -1)
|
multiSignatureEvaluator(txSignatureComponent, sigs.tail,pubKeys.tail,flags, requiredSigs - 1)
|
||||||
case SignatureValidationFailureIncorrectSignatures =>
|
case SignatureValidationFailureIncorrectSignatures =>
|
||||||
multiSignatureEvaluator(txSignatureComponent, sigs,pubKeys.tail,flags, requiredSigs)
|
multiSignatureEvaluator(txSignatureComponent, sigs,pubKeys.tail,flags, requiredSigs)
|
||||||
case SignatureValidationFailureNotStrictDerEncoding =>
|
case SignatureValidationFailureNotStrictDerEncoding =>
|
||||||
|
@ -106,6 +111,7 @@ trait TransactionSignatureChecker extends BitcoinSLogger {
|
||||||
case SignatureValidationFailurePubKeyEncoding =>
|
case SignatureValidationFailurePubKeyEncoding =>
|
||||||
SignatureValidationFailurePubKeyEncoding
|
SignatureValidationFailurePubKeyEncoding
|
||||||
case ScriptValidationFailureHighSValue => ScriptValidationFailureHighSValue
|
case ScriptValidationFailureHighSValue => ScriptValidationFailureHighSValue
|
||||||
|
case ScriptValidationFailureHashType => ScriptValidationFailureHashType
|
||||||
}
|
}
|
||||||
} else if (sigs.isEmpty) {
|
} else if (sigs.isEmpty) {
|
||||||
//means that we have checked all of the sigs against the public keys
|
//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 {
|
case object ScriptValidationFailureHighSValue extends TransactionSignatureCheckerResult {
|
||||||
def isValid = false
|
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)
|
ScriptProgram(program,ScriptErrorPubKeyType)
|
||||||
case ScriptValidationFailureHighSValue =>
|
case ScriptValidationFailureHighSValue =>
|
||||||
ScriptProgram(program,ScriptErrorSigHighS)
|
ScriptProgram(program,ScriptErrorSigHighS)
|
||||||
|
case ScriptValidationFailureHashType =>
|
||||||
|
ScriptProgram(program,ScriptErrorSigHashType)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -239,6 +241,8 @@ trait CryptoInterpreter extends ControlOperationsInterpreter with BitcoinSLogger
|
||||||
ScriptProgram(program,ScriptErrorPubKeyType)
|
ScriptProgram(program,ScriptErrorPubKeyType)
|
||||||
case ScriptValidationFailureHighSValue =>
|
case ScriptValidationFailureHighSValue =>
|
||||||
ScriptProgram(program,ScriptErrorSigHighS)
|
ScriptProgram(program,ScriptErrorSigHighS)
|
||||||
|
case ScriptValidationFailureHashType =>
|
||||||
|
ScriptProgram(program,ScriptErrorSigHashType)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue