<?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\CompactSignature; include_once "../libraries/vendor/autoload.php"; include_once("html_iframe_header.php"); $errmsg = ''; if ($_SERVER['REQUEST_METHOD'] == 'POST') { try { $ecAdapter = Bitcoin::getEcAdapter(); $r = Buffer::hex($_POST["R"],32); $R = $r->getGmp(); $s = Buffer::hex($_POST["S"],32); $S = $s->getGmp(); $recoveryFlag = (int)$_POST["V"]; $recoveryId = $recoveryFlag - 27 - ($_POST['compression']=="y" ? 4 : 0); $cs = new CompactSignature($ecAdapter, $R, $S, $recoveryId, $_POST['compression']=="y"); $publicKey = $ecAdapter->recover(Buffer::hex($_POST["msg"]), $cs); ?> <div class="alert alert-success"> <b>Recovered Public Key</b>: <?php echo $publicKey->getHex();?> </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="msg">Hash Message (Hex):</label> <input class="form-control" type='text' name='msg' id='msg' value='<?php echo $_POST['msg']?>'> </div> <div class="form-group"> <label for="V">V (Int):</label> <input class="form-control" type='text' name='V' id='V' value='<?php echo $_POST['V']?>'> </div> <div class="form-group"> <label for="R">R (Hex):</label> <input class="form-control" type='text' name='R' id='R' value='<?php echo $_POST['R']?>'> </div> <div class="form-group"> <label for="S">S (Hex):</label> <input class="form-control" type='text' name='S' id='S' value='<?php echo $_POST['S']?>'> </div> <div class="form-group"> <label for="compression">Public 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");
<?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\CompactSignature; use BitWasp\Bitcoin\Crypto\EcAdapter\Impl\PhpEcc\Signature\Signature; include_once "../libraries/vendor/autoload.php"; include_once("html_iframe_header.php"); $errmsg = ''; ini_set("display_errors", "1"); if ($_SERVER['REQUEST_METHOD'] == 'POST') { try { $ecAdapter = Bitcoin::getEcAdapter(); $derSign = Buffer::hex($_POST["der"]); if (!TransactionSignature::isDERSignature($derSign)) { throw new Exception("DER signature not valid."); } $binary = $derSign->getBinary(); $nLenR = ord($binary[3]); $R = $derSign->slice(4, $nLenR)->getGmp(); $r = ltrim(Buffer::int(gmp_strval($R,10), (int)$nLenR)->getHex(), "00"); $nLenS = ord($binary[5 + $nLenR]); $S = $derSign->slice(6 + $nLenR, $nLenS)->getGmp(); $s = Buffer::int(gmp_strval($S,10), (int)$nLenS)->getHex(); $sigHash = $derSign->slice(6 + $nLenR + $nLenS, 1); $publicKeys = []; foreach(range(0,3) as $V) { try { $flag = (int)$V + 27 + ($_POST['compression']=="y" ? 4 : 0); $cs = new CompactSignature($ecAdapter, $R, $S, (int)$V, $_POST['compression']=="y"); $publicKey = $ecAdapter->recover(Buffer::hex($_POST["msg"]), $cs); $publicKeys[] = $publicKey->getHex() . " (RecoveryId = {$V})"; } catch (Exception $e) { } } //is low S //$isLowDerSignature = $ecAdapter->validateSignatureElement($S, true); ?> <div class="alert alert-success"> <b>Recovered Public Key</b>: <br/> <?php echo implode("<br/>", $publicKeys);?> </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="msg">Hash Message (Hex):</label> <input class="form-control" type='text' name='msg' id='msg' value='<?php echo $_POST['msg']?>'> </div> <div class="form-group"> <label for="der">DER Signature:</label> <input class="form-control" type='text' name='der' id='der' value='<?php echo $_POST['der']?>'> </div> <div class="form-group"> <label for="compression">Public 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");