<?php
use BitWasp\Bitcoin\Bitcoin;
use BitWasp\Bitcoin\Crypto\Random\Random;
use BitWasp\Bitcoin\Key\Factory\HierarchicalKeyFactory;
use BitWasp\Bitcoin\Mnemonic\Bip39\Bip39Mnemonic;
use BitWasp\Bitcoin\Mnemonic\Bip39\Bip39SeedGenerator;
use BitWasp\Bitcoin\Mnemonic\MnemonicFactory;
use BitWasp\Buffertools\Buffer;
use BitWasp\Bitcoin\Key\Deterministic\HierarchicalKey;
include_once "../libraries/vendor/autoload.php";
include_once("html_iframe_header.php");
$result = 0;
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
try {
if ($_POST['action'] == 'by_words') {
// Generate mnemonic
$wordInBytes = ($_POST['words'] / 3) * 4 ; //3 words per 32 bits (4 bytes);
$random = new Random();
$entropy = $random->bytes($wordInBytes);
$bip39 = MnemonicFactory::bip39();
$seedGenerator = new Bip39SeedGenerator();
$displayMnemonicCode = $bip39->entropyToMnemonic($entropy);
// Derive a seed from mnemonic/password
$seed = $seedGenerator->getSeed($displayMnemonicCode, $_POST['passphase']);
$HdFactory = new HierarchicalKeyFactory();
$bip32Root = $HdFactory->fromEntropy($seed);
$displaySeed = $seed->getHex();
} else if ($_POST['action'] == 'by_mnemonic_code') {
$seedGenerator = new Bip39SeedGenerator();
$seed = $seedGenerator->getSeed( $_POST['mnemonic_code'], $_POST['passphase']);
$HdFactory = new HierarchicalKeyFactory();
$bip32Root = $HdFactory->fromEntropy($seed);
$displayMnemonicCode = $_POST['mnemonic_code'];
$displaySeed = $seed->getHex();
} else if ($_POST['action'] == 'by_seed') {
$seed = Buffer::hex($_POST['seed']);
$HdFactory = new HierarchicalKeyFactory();
$bip32Root = $HdFactory->fromEntropy($seed);
$displaySeed = $seed->getHex();
} else if ($_POST['action'] == 'by_mpriv') {
$HdFactory = new HierarchicalKeyFactory();
$bip32Root = $HdFactory->fromExtended($_POST['mpriv']);
$displaySeed = "";
}
$display_dpat = $displayPubkey = $displayPrikey = "";
if ($_POST['derivation_path']) {
$_POST['derivation_path'] = ltrim($_POST['derivation_path'], 'm/');
$key = $bip32Root->derivePath($_POST['derivation_path']);
$displayDpath = "m/{$_POST['derivation_path']}";
$displayPubkey = $key->getPublicKey()->getHex();
$displayPrikey = $key->getPrivateKey()->getHex();
$displayExtendedPrikey = $key->toExtendedKey();
$displayExtendedPubkey = $key->toExtendedPublicKey();
}
$result = 1;
} catch (Exception $e) {
$errmsg .= "Problem found. " . $e->getMessage();
}
}
if ($errmsg) {
?>
<div class="alert alert-danger">
<strong>Error!</strong> <?php echo $errmsg?>
</div>
<?php
}
if ($result) {
?>
<h5>Mnemonic</h5>
<div class="table-responsive">
<table border=0 class='table'>
<tr><td>Word Length</td><td><?php echo $_POST['words']?></td></tr>
<tr><td>Passphase</td><td><?php echo $_POST['passphase'];?></td></tr>
<tr><td>Seed</td><td><?php echo $displaySeed?></td></tr>
<tr><td>Mnemonic Code</td><td><?php echo $displayMnemonicCode;?></td></tr>
<tr><td>Bip32 Root Extended Private Key</td><td><?php echo $bip32Root->toExtendedKey();?> <!-- same output also if use $bip32Root->toExtendedPrivateKey(); --></td></tr>
<tr><td>Bip32 Root Extended Public Key</td><td><?php echo $bip32Root->toExtendedPublicKey();?></td></tr>
</table>
</div>
<h5>Derivation</h5>
<div class="table-responsive">
<table border=0 class='table'>
<tr><td>Derivation Path</td><td><?php echo $displayDpath?></td></tr>
<tr><td>Public Key</td><td><?php echo $displayPubkey?></td></tr>
<tr><td>Private Key</td><td><?php echo $displayPrikey?></td></tr>
<tr><td>Bip32 Extended Private Key</td><td><?php echo $displayExtendedPrikey?></td></tr>
<tr><td>Bip32 Extended Public Key</td><td><?php echo $displayExtendedPubkey?></td></tr>
</table>
</div>
<?php
}
?>
<form action='' method='post'>
<input type='hidden' name='action'/>
<div class="form-group">
<label for="words">Words Length:</label>
<div class="input-group mb-3">
<select id="words" name="words" class="form-control" >
<?php
$words = [12,15,18,21,24];
foreach($words as $word) {
echo "<option value='{$word}'".($word == $_POST['words'] ? " selected": "").">{$word}</option>";
}
?>
</select>
<div class="input-group-append">
<input class="btn btn-success" type="submit" value="Retrieve" name='action_type' onclick="this.form.action.value='by_words'"/>
</div>
</div>
</div>
<div class="form-group">
<label for="mnemonic_code">Mnemonics Code:</label>
<div class="input-group mb-3">
<input class="form-control" type='text' name='mnemonic_code' id='mnemonic_code' value='<?php echo $_POST['mnemonic_code']?>'>
<div class="input-group-append">
<input class="btn btn-success" type="submit" value="Retrieve" name='action_type' onclick="this.form.action.value='by_mnemonic_code'"/>
</div>
</div>
</div>
<div class="form-group">
<label for="seed">Seed:</label>
<div class="input-group mb-3">
<input class="form-control" type='text' name='seed' id='seed' value='<?php echo $_POST['seed']?>'>
<div class="input-group-append">
<input class="btn btn-success" type="submit" value="Retrieve" name='action_type' onclick="this.form.action.value='by_seed'"/>
</div>
</div>
</div>
<div class="form-group">
<label for="mpriv">Bip32 Root Extended Private Key:</label>
<div class="input-group mb-3">
<input class="form-control" type='text' name='mpriv' id='mpriv' value='<?php echo $_POST['mpriv']?>'>
<div class="input-group-append">
<input class="btn btn-success" type="submit" value="Retrieve" name='action_type' onclick="this.form.action.value='by_mpriv'"/>
</div>
</div>
</div>
<div class="form-group">
<label for="passphase">Passphase:</label>
<input class="form-control" type='text' name='passphase' id='passphase' value='<?php echo $_POST['passphase']?>'>
* Only applicable if you click retrieve from words length or mnemonic code.
</div>
<div class="form-group">
<label for="derivation_path">Derivation Path:</label>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">m/</span>
</div>
<input class="form-control" type='text' name='derivation_path' id='derivation_path' value='<?php echo htmlentities($_POST['derivation_path'],ENT_QUOTES)?>'>
</div>
* BIP32 path sample: m/0/0, BIP44 path sample: m/44'/0'/0'/0/0
</div>
</form>
<?php
include_once("html_iframe_footer.php");