/** * @param \BitWasp\Bitcoin\Crypto\EcAdapter\Signature\SignatureInterface[] $signatures * @param \BitWasp\Bitcoin\Crypto\EcAdapter\Key\PublicKeyInterface[] $publicKeys * @param BufferInterface $messageHash * @return \SplObjectStorage */ public function link(array $signatures, array $publicKeys, BufferInterface $messageHash) { $sigCount = count($signatures); $storage = new \SplObjectStorage(); foreach ($signatures as $signature) { foreach ($publicKeys as $key) { if ($this->ecAdapter->verify($messageHash, $key, $signature)) { $storage->attach($key, $signature); if (count($storage) === $sigCount) { break 2; } break; } } } return $storage; }
/** * @param ScriptInterface $script * @param Buffer $sigBuf * @param Buffer $keyBuf * @return bool * @throws ScriptRuntimeException * @throws \Exception */ private function checkSig(ScriptInterface $script, Buffer $sigBuf, Buffer $keyBuf) { $this->checkSignatureEncoding($sigBuf)->checkPublicKeyEncoding($keyBuf); try { $txSignature = TransactionSignatureFactory::fromHex($sigBuf->getHex()); $publicKey = PublicKeyFactory::fromHex($keyBuf->getHex()); return $this->ecAdapter->verify($this->transaction->getSignatureHash()->calculate($script, $this->inputToSign, $txSignature->getHashType()), $publicKey, $txSignature->getSignature()); } catch (\Exception $e) { return false; } }
/** * @param ScriptInterface $script * @param BufferInterface $sigBuf * @param BufferInterface $keyBuf * @param int $sigVersion * @param int $flags * @return bool * @throws ScriptRuntimeException */ public function checkSig(ScriptInterface $script, BufferInterface $sigBuf, BufferInterface $keyBuf, $sigVersion, $flags) { $this->checkSignatureEncoding($sigBuf, $flags)->checkPublicKeyEncoding($keyBuf, $flags); try { $txSignature = TransactionSignatureFactory::fromHex($sigBuf->getHex()); $publicKey = PublicKeyFactory::fromHex($keyBuf->getHex()); if ($sigVersion === 1) { $hasher = new V1Hasher($this->transaction, $this->amount); } else { $hasher = new Hasher($this->transaction); } $hash = $hasher->calculate($script, $this->nInput, $txSignature->getHashType()); return $this->adapter->verify($hash, $publicKey, $txSignature->getSignature()); } catch (\Exception $e) { return false; } }