A signature in Bitcoin (as used to sign transactions inside scriptSigs and scriptWitnesses), consists of a DER encoding of an ECDSA signature, plus a sighash type byte.
It is required when dealing with script opcodes such as OP_CHECKSIG, OP_CHECKSIGVERIFY, OP_CHECKMULTISIG & OP_CHECKMULTISIGVERIFY.
<?php use BitWasp\Buffertools\Buffer; use BitWasp\Bitcoin\Bitcoin; use BitWasp\Bitcoin\Key\Factory\PrivateKeyFactory; use BitWasp\Bitcoin\Signature\TransactionSignature; use BitWasp\Bitcoin\Crypto\EcAdapter\Impl\PhpEcc\Signature\Signature; include_once "../libraries/vendor/autoload.php"; include_once("html_iframe_header.php"); $errmsg = ''; if ($_SERVER['REQUEST_METHOD'] == 'POST') { try { $sigHashType = $_POST['sighashtype']; $ecAdapter = Bitcoin::getEcAdapter(); $privKeyFactory = new PrivateKeyFactory($ecAdapter); if ($_POST["compression"] == "y") { $privKey = $privKeyFactory->fromHexCompressed($_POST['privatekey']); } else { $privKey = $privKeyFactory->fromHexUncompressed($_POST['privatekey']); } $sig = new TransactionSignature($ecAdapter, $privKey->signCompact(Buffer::hex($_POST['data'])), $sigHashType); $signature = $sig->getSignature(); $derSign = new Signature($ecAdapter, $signature->getR(), $signature->getS()); ?> <div class="table-responsive"> <table border=0 class='table'> <tr><td>DER Signature</td><td><?php echo $derSign->getBuffer()->getHex(). Buffer::int($sigHashType, 1)->getHex()?></td></tr> <tr><td>SigHash</td><td><?php echo Buffer::int($sigHashType, 1)->getHex()?></td></tr> <tr><td>Recovery Id</td><td><?php echo $signature->getRecoveryId()?></td></tr> <tr><td>V</td><td><?php echo $signature->getFlags()?></td></tr> <tr><td>R</td><td><?php echo Buffer::int(gmp_strval($signature->getR(),10), 32)->getHex()?></td></tr> <tr><td>S</td><td><?php echo Buffer::int(gmp_strval($signature->getS(),10), 32)->getHex()?></td></tr> </table> </div> <?php } catch (Exception $e) { $errmsg .= "Problem found. " . $e->getMessage(); } } if ($errmsg) { ?> <div class="alert alert-danger"> <strong>Error!</strong> <?php echo $errmsg?> </div> <?php } ?> <form action='' method='post'> <div class="form-group"> <label for="data">Data To Sign (Hex):</label> <input class="form-control" type='text' name='data' id='data' value='<?php echo $_POST['data']?>'> </div> <div class="form-group"> <label for="privatekey">Private Key Hex:</label> <input class="form-control" type='text' name='privatekey' id='privatekey' value='<?php echo $_POST['privatekey']?>'> </div> <div class="form-group"> <label for="sighashtype">SigHashType:</label> <select name="sighashtype" class="form-control" id='sighashtype'> <?php $sighashtypes = [1=>"ALL",2=>"NONE",3=>"SINGLE",128=>"ANYONECANPAY"]; foreach($sighashtypes as $sighashkey=>$sighashtype) { echo "<option value='{$sighashkey}'".($sighashkey == $_POST['sighashtype'] ? " selected": "").">{$sighashtype}</option>"; } ?> </select> </div> <div class="form-group"> <label for="compression">Private Key:</label> <select name="compression" class="form-control" id='compression'> <?php $yesno = array("y"=>"Has Compression", "n"=>"Without Compression"); foreach($yesno as $yesno_k=>$yesno_v) { echo "<option value='{$yesno_k}'".($yesno_k == $_POST['compression'] ? " selected": "").">{$yesno_v}</option>"; } ?> </select> </div> <input type='submit' class="btn btn-success btn-block"/> </form> <?php include_once("html_iframe_footer.php");