Fix Formula For Normal HD Key Derivation; Mention Ancestor Key Risk
_includes/guide_wallets.md: * Fix formula given for normal child key derivation to state that public keys must also be provided to the HMAC hash function. This required updating both text and images. * Add one-paragraph warning about ancestor key compromise when the ancestor extended public key is compromised along with a descended private key. Update img/dev/en-hd-private-parent-to-private-child.* to help illustrate this warning. en/developer-reference.md: * Remove %include% of previously-removed file which caused new versions of Jekyll to die.
|
@ -158,7 +158,7 @@ As illustrated above, HD key derivation takes four inputs<!--noref-->:
|
||||||
* The [index][key index]{:#term-key-index}{:.term} number is a 32-bit integer specified by the program.
|
* The [index][key index]{:#term-key-index}{:.term} number is a 32-bit integer specified by the program.
|
||||||
|
|
||||||
In the normal form shown in the above illustration, the parent chain
|
In the normal form shown in the above illustration, the parent chain
|
||||||
code and the index number are fed into a one-way cryptographic hash
|
code, the parent public key, and the index number are fed into a one-way cryptographic hash
|
||||||
([HMAC-SHA512][]) to produce 512 bits of
|
([HMAC-SHA512][]) to produce 512 bits of
|
||||||
deterministically-generated-but-seemingly-random data. The
|
deterministically-generated-but-seemingly-random data. The
|
||||||
seemingly-random 256 bits on the righthand side of the hash output are
|
seemingly-random 256 bits on the righthand side of the hash output are
|
||||||
|
@ -218,14 +218,14 @@ which makes them special.
|
||||||
Deriving [child extended keys][child extended key]{:#term-child-extended-key}{:.term} from parent extended keys is more nuanced
|
Deriving [child extended keys][child extended key]{:#term-child-extended-key}{:.term} from parent extended keys is more nuanced
|
||||||
than described earlier due to the presence of two extended private key
|
than described earlier due to the presence of two extended private key
|
||||||
derivation formulas. The normal formula, described above, combines
|
derivation formulas. The normal formula, described above, combines
|
||||||
together only the index number and the parent chain code to create the
|
together the index number, the parent chain code, and the parent public key to create the
|
||||||
child chain code and the integer value which is combined with the parent
|
child chain code and the integer value which is combined with the parent
|
||||||
private key to create the child private key.
|
private key to create the child private key.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
The hardened formula, illustrated above, combines together the index
|
The hardened formula, illustrated above, combines together the index
|
||||||
number, the parent chain code, and also the parent private key to create
|
number, the parent chain code, and the parent private key to create
|
||||||
the data used to generate the child chain code and child private key.
|
the data used to generate the child chain code and child private key.
|
||||||
This formula makes it impossible to create child public keys without
|
This formula makes it impossible to create child public keys without
|
||||||
knowing the parent private key. In other words, parent extended public
|
knowing the parent private key. In other words, parent extended public
|
||||||
|
@ -235,13 +235,22 @@ Because of that, a [hardened extended private
|
||||||
key][]{:#term-hardened-extended-private-key}{:.term} is much less
|
key][]{:#term-hardened-extended-private-key}{:.term} is much less
|
||||||
useful than a normal extended private key---however, it's more secure
|
useful than a normal extended private key---however, it's more secure
|
||||||
against multi-level key compromise. If an attacker gets a normal parent
|
against multi-level key compromise. If an attacker gets a normal parent
|
||||||
chain code, he can brute-force find all 2<sup>31</sup> normal chain
|
chain code and parent public key, he can brute-force find all 2<sup>31</sup> normal chain
|
||||||
codes deriving from it. If the attacker also obtains a child, grandchild, or
|
codes deriving from it. If the attacker also obtains a child, grandchild, or
|
||||||
further-descended private key, he can use the chain code to generate all
|
further-descended private key, he can use the chain code to generate all
|
||||||
of the extended private keys descending from that private key.
|
of the extended private keys descending from that private key, as
|
||||||
|
shown in the grandchild and great-grandchild generations of the illustration below.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
Perhaps worse, the attacker can reverse the normal child private key
|
||||||
|
derivation formula and subtract a parent chain code from a child private
|
||||||
|
key to recover the parent private key, as shown in the child and
|
||||||
|
parent generations of the illustration above. This means an attacker
|
||||||
|
who acquires an extended public key and any private key descended from
|
||||||
|
it can recover that public key's private key and all keys descended from
|
||||||
|
it.
|
||||||
|
|
||||||
For this reason, the chain code part of an extended public key should be
|
For this reason, the chain code part of an extended public key should be
|
||||||
better secured than standard public keys and users should be advised
|
better secured than standard public keys and users should be advised
|
||||||
against exporting even non-extended private keys to
|
against exporting even non-extended private keys to
|
||||||
|
|
|
@ -22,7 +22,6 @@ title: "Developer Reference - Bitcoin"
|
||||||
{% include ref_block_chain.md %}
|
{% include ref_block_chain.md %}
|
||||||
{% include ref_transactions.md %}
|
{% include ref_transactions.md %}
|
||||||
{% include ref_wallets.md %}
|
{% include ref_wallets.md %}
|
||||||
{% include ref_payment_processing.md %}
|
|
||||||
|
|
||||||
## Bitcoin Core APIs
|
## Bitcoin Core APIs
|
||||||
|
|
||||||
|
|
|
@ -3,47 +3,73 @@ digraph extended {
|
||||||
size=6.25;
|
size=6.25;
|
||||||
rankdir=LR;
|
rankdir=LR;
|
||||||
penwidth=1.75;
|
penwidth=1.75;
|
||||||
node [ penwidth = 1.75, shape = "box" ];
|
node [ fontname="Sans", penwidth = 1.75, shape = "box" ];
|
||||||
edge [ penwidth = 1.75 ];
|
edge [ fontname="Sans", penwidth = 1.75, style = "" ];
|
||||||
|
graph [ fontname="Sans" ];
|
||||||
nodesep=0.15;
|
nodesep=0.15;
|
||||||
splines = ortho;
|
splines = false;
|
||||||
ranksep = 0.7;
|
ranksep = 0.7;
|
||||||
|
|
||||||
subgraph cluster_parent {
|
subgraph cluster_parent {
|
||||||
attacker_parent_private_key [ label = "Private", style = "invis" ];
|
parent_private_key [ label = "Private", style = "" ];
|
||||||
attacker_parent_chain_code [ label = "Chain", style = "filled" ];
|
parent_chain_code [ label = "Chain", style = "filled" ];
|
||||||
attacker_parent_public_key [ label = "Public", style = "invis" ];
|
parent_public_key [ label = "Public", style = "filled" ];
|
||||||
|
|
||||||
label = "Parent"
|
label = "Parent\n "
|
||||||
}
|
}
|
||||||
|
|
||||||
subgraph cluster_child {
|
subgraph cluster_child {
|
||||||
attacker_child_private_key [ label = "Private", style = "filled" ];
|
child_private_key [ label = "Private" ];
|
||||||
attacker_child_chain_code [ label = "Chain" ];
|
child_chain_code [ label = "Chain" ];
|
||||||
attacker_child_public_key [ label = "Public" ];
|
child_public_key [ label = "Public" ];
|
||||||
|
|
||||||
label = "Child"
|
label = "Child\n "
|
||||||
}
|
}
|
||||||
|
|
||||||
subgraph cluster_grandchild {
|
subgraph cluster_grandchild {
|
||||||
attacker_grandchild_private_key [ label = "Private" ];
|
grandchild_private_key [ label = "Private", style = "filled" ];
|
||||||
attacker_grandchild_chain_code [ label = "Chain" ];
|
grandchild_chain_code [ label = "Chain" ];
|
||||||
attacker_grandchild_public_key [ label = "Public" ];
|
grandchild_public_key [ label = "Public" ];
|
||||||
|
|
||||||
label = "Grandchild"
|
label = "Grandchild\n "
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_greatgrandchild {
|
||||||
|
greatgrandchild_private_key [ label = "Private" ];
|
||||||
|
greatgrandchild_chain_code [ label = "Chain" ];
|
||||||
|
greatgrandchild_public_key [ label = "Public" ];
|
||||||
|
|
||||||
|
label = "Great-\nGrandchild"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
parent_public_key -> child_public_key;
|
||||||
|
parent_public_key -> child_chain_code;
|
||||||
|
parent_chain_code -> child_chain_code [ label = "Normal Child\nKey Derivation", weight = 100 ];
|
||||||
|
parent_chain_code -> child_public_key;
|
||||||
|
parent_chain_code -> child_private_key [ style = "invis" ];
|
||||||
|
parent_private_key -> child_private_key [ dir = "back", style = "", label = "Parent Key\nDerivation" ];
|
||||||
|
|
||||||
attacker_parent_public_key -> attacker_child_public_key [ style = "invis" ];
|
parent_chain_code -> parent_private_key [ constraint = false ];
|
||||||
attacker_parent_chain_code -> attacker_child_chain_code;
|
|
||||||
attacker_parent_chain_code -> attacker_child_public_key [ style = "invis" ];
|
child_private_key -> grandchild_private_key [ dir = "back", style = "" ];
|
||||||
attacker_parent_private_key -> attacker_child_private_key [style = "invis" ];
|
child_public_key -> grandchild_chain_code;
|
||||||
|
child_public_key -> grandchild_public_key;
|
||||||
|
child_chain_code -> grandchild_private_key [ style = "invis" ];
|
||||||
|
child_chain_code -> grandchild_public_key;
|
||||||
|
child_chain_code -> grandchild_chain_code [ weight = 100 ];
|
||||||
|
|
||||||
|
child_chain_code -> child_private_key [ constraint = false ]
|
||||||
|
|
||||||
|
grandchild_private_key -> greatgrandchild_private_key;
|
||||||
|
grandchild_public_key -> greatgrandchild_chain_code;
|
||||||
|
grandchild_public_key -> greatgrandchild_public_key;
|
||||||
|
grandchild_chain_code -> greatgrandchild_private_key;
|
||||||
|
grandchild_chain_code -> greatgrandchild_public_key;
|
||||||
|
grandchild_chain_code -> greatgrandchild_chain_code [ weight = 100 ];
|
||||||
|
|
||||||
|
grandchild_chain_code -> grandchild_private_key [ constraint = false, style = "invis" ]
|
||||||
|
greatgrandchild_chain_code -> greatgrandchild_private_key [ constraint = false, style = "invis" ]
|
||||||
|
|
||||||
attacker_child_private_key -> attacker_grandchild_private_key;
|
|
||||||
attacker_child_public_key -> attacker_grandchild_public_key;
|
|
||||||
attacker_child_chain_code -> attacker_grandchild_private_key;
|
|
||||||
attacker_child_chain_code -> attacker_grandchild_public_key;
|
|
||||||
attacker_child_chain_code -> attacker_grandchild_chain_code;
|
|
||||||
label = "Cross-Generational Key Compromise"
|
label = "Cross-Generational Key Compromise"
|
||||||
}
|
}
|
||||||
|
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 9.3 KiB |
|
@ -4,93 +4,189 @@
|
||||||
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
||||||
-->
|
-->
|
||||||
<!-- Title: extended Pages: 1 -->
|
<!-- Title: extended Pages: 1 -->
|
||||||
<svg width="347pt" height="220pt"
|
<svg width="450pt" height="192pt"
|
||||||
viewBox="0.00 0.00 347.00 220.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
viewBox="0.00 0.00 450.00 192.41" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
<g id="graph1" class="graph" transform="scale(1 1) rotate(0) translate(4 216)">
|
<g id="graph1" class="graph" transform="scale(0.775862 0.775862) rotate(0) translate(4 244)">
|
||||||
<title>extended</title>
|
<title>extended</title>
|
||||||
<polygon fill="white" stroke="white" points="-4,5 -4,-216 344,-216 344,5 -4,5"/>
|
<polygon fill="white" stroke="white" points="-4,5 -4,-244 577,-244 577,5 -4,5"/>
|
||||||
<text text-anchor="middle" x="169.5" y="-8.4" font-family="Sans" font-size="14.00">Cross-Generational Key Compromise</text>
|
<text text-anchor="middle" x="286" y="-8.4" font-family="Sans" font-size="14.00">Cross-Generational Key Compromise</text>
|
||||||
<g id="graph2" class="cluster"><title>cluster_parent</title>
|
<g id="graph2" class="cluster"><title>cluster_parent</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="8,-33 8,-204 90,-204 90,-33 8,-33"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="8,-33 8,-232 90,-232 90,-33 8,-33"/>
|
||||||
<text text-anchor="middle" x="49" y="-187.4" font-family="Sans" font-size="14.00">Parent</text>
|
<text text-anchor="middle" x="49" y="-215.4" font-family="Sans" font-size="14.00">Parent</text>
|
||||||
|
<text text-anchor="middle" x="49" y="-198.4" font-family="Sans" font-size="14.00"> </text>
|
||||||
</g>
|
</g>
|
||||||
<g id="graph3" class="cluster"><title>cluster_child</title>
|
<g id="graph3" class="cluster"><title>cluster_child</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="124,-33 124,-204 206,-204 206,-33 124,-33"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="228,-33 228,-232 310,-232 310,-33 228,-33"/>
|
||||||
<text text-anchor="middle" x="165" y="-187.4" font-family="Sans" font-size="14.00">Child</text>
|
<text text-anchor="middle" x="269" y="-215.4" font-family="Sans" font-size="14.00">Child</text>
|
||||||
|
<text text-anchor="middle" x="269" y="-198.4" font-family="Sans" font-size="14.00"> </text>
|
||||||
</g>
|
</g>
|
||||||
<g id="graph4" class="cluster"><title>cluster_grandchild</title>
|
<g id="graph4" class="cluster"><title>cluster_grandchild</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="240,-33 240,-204 331,-204 331,-33 240,-33"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="346,-33 346,-232 437,-232 437,-33 346,-33"/>
|
||||||
<text text-anchor="middle" x="285.5" y="-187.4" font-family="Sans" font-size="14.00">Grandchild</text>
|
<text text-anchor="middle" x="391.5" y="-215.4" font-family="Sans" font-size="14.00">Grandchild</text>
|
||||||
|
<text text-anchor="middle" x="391.5" y="-198.4" font-family="Sans" font-size="14.00"> </text>
|
||||||
</g>
|
</g>
|
||||||
<!-- attacker_parent_private_key -->
|
<g id="graph5" class="cluster"><title>cluster_greatgrandchild</title>
|
||||||
<!-- attacker_child_private_key -->
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="473,-33 473,-232 564,-232 564,-33 473,-33"/>
|
||||||
<g id="node6" class="node"><title>attacker_child_private_key</title>
|
<text text-anchor="middle" x="518.5" y="-215.4" font-family="Sans" font-size="14.00">Great-</text>
|
||||||
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="198,-171 132,-171 132,-135 198,-135 198,-171"/>
|
<text text-anchor="middle" x="518.5" y="-198.4" font-family="Sans" font-size="14.00">Grandchild</text>
|
||||||
<text text-anchor="middle" x="165" y="-148.9" font-family="Sans" font-size="14.00">Private</text>
|
|
||||||
</g>
|
</g>
|
||||||
<!-- attacker_parent_private_key->attacker_child_private_key -->
|
<!-- parent_private_key -->
|
||||||
<!-- attacker_parent_chain_code -->
|
<g id="node2" class="node"><title>parent_private_key</title>
|
||||||
<g id="node3" class="node"><title>attacker_parent_chain_code</title>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="82,-182 16,-182 16,-146 82,-146 82,-182"/>
|
||||||
|
<text text-anchor="middle" x="49" y="-159.9" font-family="Sans" font-size="14.00">Private</text>
|
||||||
|
</g>
|
||||||
|
<!-- child_private_key -->
|
||||||
|
<g id="node6" class="node"><title>child_private_key</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="302,-182 236,-182 236,-146 302,-146 302,-182"/>
|
||||||
|
<text text-anchor="middle" x="269" y="-159.9" font-family="Sans" font-size="14.00">Private</text>
|
||||||
|
</g>
|
||||||
|
<!-- parent_private_key->child_private_key -->
|
||||||
|
<g id="edge16" class="edge"><title>parent_private_key->child_private_key</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M92.6643,-164C134.855,-164 197.827,-164 235.993,-164"/>
|
||||||
|
<polygon fill="black" stroke="black" points="92.4133,-160.5 82.4133,-164 92.4132,-167.5 92.4133,-160.5"/>
|
||||||
|
<text text-anchor="middle" x="159" y="-185.4" font-family="Sans" font-size="14.00">Parent Key</text>
|
||||||
|
<text text-anchor="middle" x="159" y="-168.4" font-family="Sans" font-size="14.00">Derivation</text>
|
||||||
|
</g>
|
||||||
|
<!-- parent_chain_code -->
|
||||||
|
<g id="node3" class="node"><title>parent_chain_code</title>
|
||||||
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="77,-124 21,-124 21,-88 77,-88 77,-124"/>
|
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="77,-124 21,-124 21,-88 77,-88 77,-124"/>
|
||||||
<text text-anchor="middle" x="49" y="-101.9" font-family="Sans" font-size="14.00">Chain</text>
|
<text text-anchor="middle" x="49" y="-101.9" font-family="Sans" font-size="14.00">Chain</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- attacker_child_chain_code -->
|
<!-- parent_chain_code->parent_private_key -->
|
||||||
<g id="node7" class="node"><title>attacker_child_chain_code</title>
|
<g id="edge18" class="edge"><title>parent_chain_code->parent_private_key</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="193,-124 137,-124 137,-88 193,-88 193,-124"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M49,-124.125C49,-127.987 49,-131.848 49,-135.71"/>
|
||||||
<text text-anchor="middle" x="165" y="-101.9" font-family="Sans" font-size="14.00">Chain</text>
|
<polygon fill="black" stroke="black" points="45.5001,-135.932 49,-145.932 52.5001,-135.932 45.5001,-135.932"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- attacker_parent_chain_code->attacker_child_chain_code -->
|
<!-- parent_chain_code->child_private_key -->
|
||||||
<g id="edge7" class="edge"><title>attacker_parent_chain_code->attacker_child_chain_code</title>
|
<!-- child_chain_code -->
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M77.0804,-106C91.9313,-106 110.386,-106 126.548,-106"/>
|
<g id="node7" class="node"><title>child_chain_code</title>
|
||||||
<polygon fill="black" stroke="black" points="126.776,-109.5 136.776,-106 126.776,-102.5 126.776,-109.5"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="297,-124 241,-124 241,-88 297,-88 297,-124"/>
|
||||||
|
<text text-anchor="middle" x="269" y="-101.9" font-family="Sans" font-size="14.00">Chain</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- attacker_child_public_key -->
|
<!-- parent_chain_code->child_chain_code -->
|
||||||
<g id="node8" class="node"><title>attacker_child_public_key</title>
|
<g id="edge10" class="edge"><title>parent_chain_code->child_chain_code</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="193,-77 137,-77 137,-41 193,-41 193,-77"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M77.3108,-106C116.336,-106 186.787,-106 230.55,-106"/>
|
||||||
<text text-anchor="middle" x="165" y="-54.9" font-family="Sans" font-size="14.00">Public</text>
|
<polygon fill="black" stroke="black" points="230.798,-109.5 240.798,-106 230.798,-102.5 230.798,-109.5"/>
|
||||||
|
<text text-anchor="middle" x="159" y="-127.4" font-family="Sans" font-size="14.00">Normal Child</text>
|
||||||
|
<text text-anchor="middle" x="159" y="-110.4" font-family="Sans" font-size="14.00">Key Derivation</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- attacker_parent_chain_code->attacker_child_public_key -->
|
<!-- child_public_key -->
|
||||||
<!-- attacker_parent_public_key -->
|
<g id="node8" class="node"><title>child_public_key</title>
|
||||||
<!-- attacker_parent_public_key->attacker_child_public_key -->
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="297,-77 241,-77 241,-41 297,-41 297,-77"/>
|
||||||
<!-- attacker_grandchild_private_key -->
|
<text text-anchor="middle" x="269" y="-54.9" font-family="Sans" font-size="14.00">Public</text>
|
||||||
<g id="node10" class="node"><title>attacker_grandchild_private_key</title>
|
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="318,-171 252,-171 252,-135 318,-135 318,-171"/>
|
|
||||||
<text text-anchor="middle" x="285" y="-148.9" font-family="Sans" font-size="14.00">Private</text>
|
|
||||||
</g>
|
</g>
|
||||||
<!-- attacker_child_private_key->attacker_grandchild_private_key -->
|
<!-- parent_chain_code->child_public_key -->
|
||||||
<g id="edge13" class="edge"><title>attacker_child_private_key->attacker_grandchild_private_key</title>
|
<g id="edge12" class="edge"><title>parent_chain_code->child_public_key</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M198.108,-153C211.618,-153 227.42,-153 241.818,-153"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M77.3108,-99.9518C116.311,-91.6199 186.697,-76.5829 230.466,-67.2323"/>
|
||||||
<polygon fill="black" stroke="black" points="242,-156.5 252,-153 242,-149.5 242,-156.5"/>
|
<polygon fill="black" stroke="black" points="231.401,-70.6115 240.449,-65.0994 229.939,-63.766 231.401,-70.6115"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- attacker_child_chain_code->attacker_grandchild_private_key -->
|
<!-- parent_public_key -->
|
||||||
<g id="edge17" class="edge"><title>attacker_child_chain_code->attacker_grandchild_private_key</title>
|
<g id="node4" class="node"><title>parent_public_key</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M193.135,-117.019C207.844,-122.78 226.152,-129.951 242.544,-136.371"/>
|
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="77,-77 21,-77 21,-41 77,-41 77,-77"/>
|
||||||
<polygon fill="black" stroke="black" points="241.345,-139.661 251.933,-140.049 243.898,-133.143 241.345,-139.661"/>
|
<text text-anchor="middle" x="49" y="-54.9" font-family="Sans" font-size="14.00">Public</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- attacker_grandchild_chain_code -->
|
<!-- parent_public_key->child_chain_code -->
|
||||||
<g id="node11" class="node"><title>attacker_grandchild_chain_code</title>
|
<g id="edge8" class="edge"><title>parent_public_key->child_chain_code</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="313,-124 257,-124 257,-88 313,-88 313,-124"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M77.7612,-65.1444C117.01,-73.5295 187.437,-88.5752 230.998,-97.8815"/>
|
||||||
<text text-anchor="middle" x="285" y="-101.9" font-family="Sans" font-size="14.00">Chain</text>
|
<polygon fill="black" stroke="black" points="230.417,-101.336 240.927,-100.003 231.879,-94.4906 230.417,-101.336"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- attacker_child_chain_code->attacker_grandchild_chain_code -->
|
<!-- parent_public_key->child_public_key -->
|
||||||
<g id="edge21" class="edge"><title>attacker_child_chain_code->attacker_grandchild_chain_code</title>
|
<g id="edge6" class="edge"><title>parent_public_key->child_public_key</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M193.135,-106C208.968,-106 228.972,-106 246.268,-106"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M77.7612,-59C116.712,-59 186.369,-59 230.002,-59"/>
|
||||||
<polygon fill="black" stroke="black" points="246.626,-109.5 256.626,-106 246.626,-102.5 246.626,-109.5"/>
|
<polygon fill="black" stroke="black" points="230.232,-62.5001 240.232,-59 230.232,-55.5001 230.232,-62.5001"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- attacker_grandchild_public_key -->
|
<!-- grandchild_private_key -->
|
||||||
<g id="node12" class="node"><title>attacker_grandchild_public_key</title>
|
<g id="node10" class="node"><title>grandchild_private_key</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="313,-77 257,-77 257,-41 313,-41 313,-77"/>
|
<polygon fill="lightgrey" stroke="black" stroke-width="1.75" points="424,-182 358,-182 358,-146 424,-146 424,-182"/>
|
||||||
<text text-anchor="middle" x="285" y="-54.9" font-family="Sans" font-size="14.00">Public</text>
|
<text text-anchor="middle" x="391" y="-159.9" font-family="Sans" font-size="14.00">Private</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- attacker_child_chain_code->attacker_grandchild_public_key -->
|
<!-- child_private_key->grandchild_private_key -->
|
||||||
<g id="edge19" class="edge"><title>attacker_child_chain_code->attacker_grandchild_public_key</title>
|
<g id="edge20" class="edge"><title>child_private_key->grandchild_private_key</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M193.135,-94.9806C209.15,-88.7079 229.432,-80.764 246.863,-73.937"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M312.136,-164C327.197,-164 343.851,-164 357.959,-164"/>
|
||||||
<polygon fill="black" stroke="black" points="248.173,-77.1828 256.208,-70.2768 245.62,-70.6648 248.173,-77.1828"/>
|
<polygon fill="black" stroke="black" points="312.015,-160.5 302.015,-164 312.015,-167.5 312.015,-160.5"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- attacker_child_public_key->attacker_grandchild_public_key -->
|
<!-- child_chain_code->child_private_key -->
|
||||||
<g id="edge15" class="edge"><title>attacker_child_public_key->attacker_grandchild_public_key</title>
|
<g id="edge32" class="edge"><title>child_chain_code->child_private_key</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M193.743,-59C209.476,-59 229.188,-59 246.261,-59"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M269,-124.125C269,-127.987 269,-131.848 269,-135.71"/>
|
||||||
<polygon fill="black" stroke="black" points="246.492,-62.5001 256.492,-59 246.492,-55.5001 246.492,-62.5001"/>
|
<polygon fill="black" stroke="black" points="265.5,-135.932 269,-145.932 272.5,-135.932 265.5,-135.932"/>
|
||||||
</g>
|
</g>
|
||||||
|
<!-- child_chain_code->grandchild_private_key -->
|
||||||
|
<!-- grandchild_chain_code -->
|
||||||
|
<g id="node11" class="node"><title>grandchild_chain_code</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="419,-124 363,-124 363,-88 419,-88 419,-124"/>
|
||||||
|
<text text-anchor="middle" x="391" y="-101.9" font-family="Sans" font-size="14.00">Chain</text>
|
||||||
|
</g>
|
||||||
|
<!-- child_chain_code->grandchild_chain_code -->
|
||||||
|
<g id="edge30" class="edge"><title>child_chain_code->grandchild_chain_code</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M297.296,-106C313.772,-106 334.767,-106 352.706,-106"/>
|
||||||
|
<polygon fill="black" stroke="black" points="352.858,-109.5 362.858,-106 352.858,-102.5 352.858,-109.5"/>
|
||||||
|
</g>
|
||||||
|
<!-- grandchild_public_key -->
|
||||||
|
<g id="node12" class="node"><title>grandchild_public_key</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="419,-77 363,-77 363,-41 419,-41 419,-77"/>
|
||||||
|
<text text-anchor="middle" x="391" y="-54.9" font-family="Sans" font-size="14.00">Public</text>
|
||||||
|
</g>
|
||||||
|
<!-- child_chain_code->grandchild_public_key -->
|
||||||
|
<g id="edge28" class="edge"><title>child_chain_code->grandchild_public_key</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M297.296,-95.0991C313.807,-88.7383 334.856,-80.6291 352.821,-73.7084"/>
|
||||||
|
<polygon fill="black" stroke="black" points="354.362,-76.8656 362.435,-70.0046 351.845,-70.3335 354.362,-76.8656"/>
|
||||||
|
</g>
|
||||||
|
<!-- child_public_key->grandchild_chain_code -->
|
||||||
|
<g id="edge22" class="edge"><title>child_public_key->grandchild_chain_code</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M297.604,-70.0194C314.242,-76.4294 335.411,-84.5847 353.387,-91.5099"/>
|
||||||
|
<polygon fill="black" stroke="black" points="352.407,-94.8828 362.996,-95.2117 354.923,-88.3507 352.407,-94.8828"/>
|
||||||
|
</g>
|
||||||
|
<!-- child_public_key->grandchild_public_key -->
|
||||||
|
<g id="edge24" class="edge"><title>child_public_key->grandchild_public_key</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M297.604,-59C313.853,-59 334.423,-59 352.12,-59"/>
|
||||||
|
<polygon fill="black" stroke="black" points="352.153,-62.5001 362.153,-59 352.153,-55.5001 352.153,-62.5001"/>
|
||||||
|
</g>
|
||||||
|
<!-- greatgrandchild_private_key -->
|
||||||
|
<g id="node14" class="node"><title>greatgrandchild_private_key</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="551,-182 485,-182 485,-146 551,-146 551,-182"/>
|
||||||
|
<text text-anchor="middle" x="518" y="-159.9" font-family="Sans" font-size="14.00">Private</text>
|
||||||
|
</g>
|
||||||
|
<!-- grandchild_private_key->greatgrandchild_private_key -->
|
||||||
|
<g id="edge34" class="edge"><title>grandchild_private_key->greatgrandchild_private_key</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M424.036,-164C439.495,-164 458.112,-164 474.682,-164"/>
|
||||||
|
<polygon fill="black" stroke="black" points="474.688,-167.5 484.688,-164 474.688,-160.5 474.688,-167.5"/>
|
||||||
|
</g>
|
||||||
|
<!-- grandchild_chain_code->grandchild_private_key -->
|
||||||
|
<!-- grandchild_chain_code->greatgrandchild_private_key -->
|
||||||
|
<g id="edge40" class="edge"><title>grandchild_chain_code->greatgrandchild_private_key</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M419.185,-118.872C435.814,-126.466 457.181,-136.224 475.789,-144.723"/>
|
||||||
|
<polygon fill="black" stroke="black" points="474.398,-147.935 484.948,-148.906 477.306,-141.568 474.398,-147.935"/>
|
||||||
|
</g>
|
||||||
|
<!-- greatgrandchild_chain_code -->
|
||||||
|
<g id="node15" class="node"><title>greatgrandchild_chain_code</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="546,-124 490,-124 490,-88 546,-88 546,-124"/>
|
||||||
|
<text text-anchor="middle" x="518" y="-101.9" font-family="Sans" font-size="14.00">Chain</text>
|
||||||
|
</g>
|
||||||
|
<!-- grandchild_chain_code->greatgrandchild_chain_code -->
|
||||||
|
<g id="edge44" class="edge"><title>grandchild_chain_code->greatgrandchild_chain_code</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M419.185,-106C437.025,-106 460.318,-106 479.807,-106"/>
|
||||||
|
<polygon fill="black" stroke="black" points="479.893,-109.5 489.893,-106 479.893,-102.5 479.893,-109.5"/>
|
||||||
|
</g>
|
||||||
|
<!-- greatgrandchild_public_key -->
|
||||||
|
<g id="node16" class="node"><title>greatgrandchild_public_key</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="546,-77 490,-77 490,-41 546,-41 546,-77"/>
|
||||||
|
<text text-anchor="middle" x="518" y="-54.9" font-family="Sans" font-size="14.00">Public</text>
|
||||||
|
</g>
|
||||||
|
<!-- grandchild_chain_code->greatgrandchild_public_key -->
|
||||||
|
<g id="edge42" class="edge"><title>grandchild_chain_code->greatgrandchild_public_key</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M419.185,-95.5692C437.065,-88.9525 460.421,-80.3089 479.936,-73.0865"/>
|
||||||
|
<polygon fill="black" stroke="black" points="481.291,-76.3174 489.454,-69.5642 478.861,-69.7526 481.291,-76.3174"/>
|
||||||
|
</g>
|
||||||
|
<!-- grandchild_public_key->greatgrandchild_chain_code -->
|
||||||
|
<g id="edge36" class="edge"><title>grandchild_public_key->greatgrandchild_chain_code</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M419.501,-69.5477C437.394,-76.1695 460.679,-84.7866 480.116,-91.9799"/>
|
||||||
|
<polygon fill="black" stroke="black" points="479.001,-95.2991 489.594,-95.4875 481.43,-88.7342 479.001,-95.2991"/>
|
||||||
|
</g>
|
||||||
|
<!-- grandchild_public_key->greatgrandchild_public_key -->
|
||||||
|
<g id="edge38" class="edge"><title>grandchild_public_key->greatgrandchild_public_key</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M419.501,-59C437.026,-59 459.722,-59 478.91,-59"/>
|
||||||
|
<polygon fill="black" stroke="black" points="479.154,-62.5001 489.154,-59 479.154,-55.5001 479.154,-62.5001"/>
|
||||||
|
</g>
|
||||||
|
<!-- greatgrandchild_chain_code->greatgrandchild_private_key -->
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 13 KiB |
|
@ -3,10 +3,11 @@ digraph extended {
|
||||||
size=6.25;
|
size=6.25;
|
||||||
rankdir=LR;
|
rankdir=LR;
|
||||||
penwidth=1.75;
|
penwidth=1.75;
|
||||||
node [ penwidth = 1.75, shape = "box" ];
|
node [ fontname="Sans", penwidth = 1.75, shape = "box" ];
|
||||||
edge [ penwidth = 1.75 ];
|
edge [ fontname="Sans", penwidth = 1.75 ];
|
||||||
|
graph [ fontname="Sans" ]
|
||||||
nodesep=0.15;
|
nodesep=0.15;
|
||||||
splines = ortho;
|
//splines = ortho;
|
||||||
ranksep = 0.3;
|
ranksep = 0.3;
|
||||||
|
|
||||||
subgraph cluster_parent {
|
subgraph cluster_parent {
|
||||||
|
@ -15,24 +16,25 @@ parent_private_key [ label = "Parent Private Key" ];
|
||||||
parent_chain_code [ label = "Parent Chain Code" ];
|
parent_chain_code [ label = "Parent Chain Code" ];
|
||||||
parent_public_key [ label = "Parent Public Key" ];
|
parent_public_key [ label = "Parent Public Key" ];
|
||||||
}
|
}
|
||||||
|
|
||||||
child_private_key [ label = "Child Private Key" ];
|
child_private_key [ label = "Child Private Key" ];
|
||||||
child_chain_code [ label = "Child Chain Code" ];
|
child_chain_code [ label = "Child Chain Code" ];
|
||||||
child_public_key [ label = "Child Public Key" ];
|
child_public_key [ label = "Child Public Key" ];
|
||||||
|
|
||||||
i_norm [ label = "Index Number" ];
|
i_norm [ label = "Index Number" ];
|
||||||
hmac [ label = "One-Way Hash", style = "diagonals" ];
|
hmac [ label = "One-Way Hash", style = "diagonals" ];
|
||||||
|
|
||||||
rel1 [ label = "Mathematical\nRelationship", shape = "none" ]
|
rel1 [ label = "Mathematical\nRelationship", shape = "none" ]
|
||||||
rel2 [ label = "Derived\nMathematical\nRelationship", shape = "none" ]
|
rel2 [ label = "Derived\nMathematical\nRelationship", shape = "none" ]
|
||||||
|
|
||||||
rel1 -> parent_private_key [ weight = 0, dir = "back" ];
|
rel1 -> parent_private_key [ weight = "", dir = "back" ];
|
||||||
rel1 -> parent_chain_code [ style = "invis" ];
|
rel1 -> parent_chain_code [ weight = "", style = "invis" ];
|
||||||
rel1 -> parent_public_key [ weight = 0 ];
|
rel1 -> parent_public_key [ weight = "" ];
|
||||||
|
|
||||||
child_private_key -> rel2 [ weight = 0 ];
|
child_private_key -> rel2 [ ];
|
||||||
child_chain_code -> rel2 [ weight = 1, style = "invis" ];
|
child_chain_code -> rel2 [ style = "invis" ];
|
||||||
child_public_key -> rel2 [ weight = 0, dir = "back" ];
|
child_public_key -> rel2 [ dir = "back" ];
|
||||||
|
|
||||||
//rel1 -> rel2 [ weight = 0 ];
|
|
||||||
|
|
||||||
//parent_private_key -> parent_public_key [constraint = false, label = "Math Rel" ];
|
//parent_private_key -> parent_public_key [constraint = false, label = "Math Rel" ];
|
||||||
//child_private_key -> child_public_key [constraint = false, minlen = 2];
|
//child_private_key -> child_public_key [constraint = false, minlen = 2];
|
||||||
|
@ -40,7 +42,9 @@ child_public_key -> rel2 [ weight = 0, dir = "back" ];
|
||||||
parent_private_key -> child_private_key;
|
parent_private_key -> child_private_key;
|
||||||
parent_public_key -> child_public_key;
|
parent_public_key -> child_public_key;
|
||||||
|
|
||||||
|
parent_public_key -> hmac;
|
||||||
parent_chain_code -> hmac;
|
parent_chain_code -> hmac;
|
||||||
|
parent_private_key -> hmac [ style = "invis" ];
|
||||||
i_norm -> hmac;
|
i_norm -> hmac;
|
||||||
|
|
||||||
hmac -> child_public_key;
|
hmac -> child_public_key;
|
||||||
|
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.4 KiB |
|
@ -28,11 +28,6 @@
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M278.202,-206C324.606,-206 384.552,-206 431.72,-206"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M278.202,-206C324.606,-206 384.552,-206 431.72,-206"/>
|
||||||
<polygon fill="black" stroke="black" points="431.886,-209.5 441.886,-206 431.886,-202.5 431.886,-209.5"/>
|
<polygon fill="black" stroke="black" points="431.886,-209.5 441.886,-206 431.886,-202.5 431.886,-209.5"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- parent_chain_code -->
|
|
||||||
<g id="node3" class="node"><title>parent_chain_code</title>
|
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="278,-177 132,-177 132,-141 278,-141 278,-177"/>
|
|
||||||
<text text-anchor="middle" x="205" y="-154.9" font-family="Sans" font-size="14.00">Parent Chain Code</text>
|
|
||||||
</g>
|
|
||||||
<!-- hmac -->
|
<!-- hmac -->
|
||||||
<g id="node9" class="node"><title>hmac</title>
|
<g id="node9" class="node"><title>hmac</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="419,-177 301,-177 301,-141 419,-141 419,-177"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="419,-177 301,-177 301,-141 419,-141 419,-177"/>
|
||||||
|
@ -42,8 +37,14 @@
|
||||||
<polyline fill="none" stroke="black" stroke-width="1.75" points="419,-165 407,-177 "/>
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="419,-165 407,-177 "/>
|
||||||
<text text-anchor="middle" x="360" y="-154.9" font-family="Sans" font-size="14.00">One-Way Hash</text>
|
<text text-anchor="middle" x="360" y="-154.9" font-family="Sans" font-size="14.00">One-Way Hash</text>
|
||||||
</g>
|
</g>
|
||||||
|
<!-- parent_private_key->hmac -->
|
||||||
|
<!-- parent_chain_code -->
|
||||||
|
<g id="node3" class="node"><title>parent_chain_code</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="278,-177 132,-177 132,-141 278,-141 278,-177"/>
|
||||||
|
<text text-anchor="middle" x="205" y="-154.9" font-family="Sans" font-size="14.00">Parent Chain Code</text>
|
||||||
|
</g>
|
||||||
<!-- parent_chain_code->hmac -->
|
<!-- parent_chain_code->hmac -->
|
||||||
<g id="edge19" class="edge"><title>parent_chain_code->hmac</title>
|
<g id="edge21" class="edge"><title>parent_chain_code->hmac</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M278.415,-159C282.322,-159 286.244,-159 290.139,-159"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M278.415,-159C282.322,-159 286.244,-159 290.139,-159"/>
|
||||||
<polygon fill="black" stroke="black" points="290.362,-162.5 300.362,-159 290.362,-155.5 290.362,-162.5"/>
|
<polygon fill="black" stroke="black" points="290.362,-162.5 300.362,-159 290.362,-155.5 290.362,-162.5"/>
|
||||||
</g>
|
</g>
|
||||||
|
@ -62,6 +63,11 @@
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M273.603,-112C321.996,-112 386.725,-112 436.057,-112"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M273.603,-112C321.996,-112 386.725,-112 436.057,-112"/>
|
||||||
<polygon fill="black" stroke="black" points="436.339,-115.5 446.339,-112 436.339,-108.5 436.339,-115.5"/>
|
<polygon fill="black" stroke="black" points="436.339,-115.5 446.339,-112 436.339,-108.5 436.339,-115.5"/>
|
||||||
</g>
|
</g>
|
||||||
|
<!-- parent_public_key->hmac -->
|
||||||
|
<g id="edge19" class="edge"><title>parent_public_key->hmac</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M269.613,-130.115C275.163,-131.741 280.685,-133.384 286,-135 289.101,-135.943 292.271,-136.92 295.47,-137.916"/>
|
||||||
|
<polygon fill="black" stroke="black" points="294.524,-141.288 305.113,-140.949 296.624,-134.61 294.524,-141.288"/>
|
||||||
|
</g>
|
||||||
<!-- rel2 -->
|
<!-- rel2 -->
|
||||||
<g id="node11" class="node"><title>rel2</title>
|
<g id="node11" class="node"><title>rel2</title>
|
||||||
<text text-anchor="middle" x="653" y="-171.9" font-family="Sans" font-size="14.00">Derived</text>
|
<text text-anchor="middle" x="653" y="-171.9" font-family="Sans" font-size="14.00">Derived</text>
|
||||||
|
@ -90,22 +96,22 @@
|
||||||
<text text-anchor="middle" x="205" y="-55.9" font-family="Sans" font-size="14.00">Index Number</text>
|
<text text-anchor="middle" x="205" y="-55.9" font-family="Sans" font-size="14.00">Index Number</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- i_norm->hmac -->
|
<!-- i_norm->hmac -->
|
||||||
<g id="edge21" class="edge"><title>i_norm->hmac</title>
|
<g id="edge25" class="edge"><title>i_norm->hmac</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M262.135,-76.929C275.539,-80.9004 286,-84 286,-84 286,-84 313.355,-111.725 334.802,-133.461"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M262.317,-73.0124C270.556,-76.0017 278.704,-79.6258 286,-84 307.108,-96.6552 326.469,-116.725 340.089,-132.92"/>
|
||||||
<polygon fill="black" stroke="black" points="332.572,-136.184 342.087,-140.845 337.555,-131.268 332.572,-136.184"/>
|
<polygon fill="black" stroke="black" points="337.631,-135.444 346.667,-140.976 343.053,-131.016 337.631,-135.444"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- hmac->child_private_key -->
|
<!-- hmac->child_private_key -->
|
||||||
<g id="edge25" class="edge"><title>hmac->child_private_key</title>
|
<g id="edge29" class="edge"><title>hmac->child_private_key</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M417.181,-177.037C425.321,-179.605 433.753,-182.265 442.059,-184.884"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M417.181,-177.037C425.321,-179.605 433.753,-182.265 442.059,-184.884"/>
|
||||||
<polygon fill="black" stroke="black" points="441.136,-188.263 451.726,-187.934 443.242,-181.587 441.136,-188.263"/>
|
<polygon fill="black" stroke="black" points="441.136,-188.263 451.726,-187.934 443.242,-181.587 441.136,-188.263"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- hmac->child_chain_code -->
|
<!-- hmac->child_chain_code -->
|
||||||
<g id="edge27" class="edge"><title>hmac->child_chain_code</title>
|
<g id="edge31" class="edge"><title>hmac->child_chain_code</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M419.745,-159C423.73,-159 427.774,-159 431.828,-159"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M419.745,-159C423.73,-159 427.774,-159 431.828,-159"/>
|
||||||
<polygon fill="black" stroke="black" points="431.9,-162.5 441.9,-159 431.9,-155.5 431.9,-162.5"/>
|
<polygon fill="black" stroke="black" points="431.9,-162.5 441.9,-159 431.9,-155.5 431.9,-162.5"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- hmac->child_public_key -->
|
<!-- hmac->child_public_key -->
|
||||||
<g id="edge23" class="edge"><title>hmac->child_public_key</title>
|
<g id="edge27" class="edge"><title>hmac->child_public_key</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M417.181,-140.963C425.321,-138.395 433.753,-135.735 442.059,-133.116"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M417.181,-140.963C425.321,-138.395 433.753,-135.735 442.059,-133.116"/>
|
||||||
<polygon fill="black" stroke="black" points="443.242,-136.413 451.726,-130.066 441.136,-129.737 443.242,-136.413"/>
|
<polygon fill="black" stroke="black" points="443.242,-136.413 451.726,-130.066 441.136,-129.737 443.242,-136.413"/>
|
||||||
</g>
|
</g>
|
||||||
|
@ -116,14 +122,14 @@
|
||||||
</g>
|
</g>
|
||||||
<!-- rel1->parent_private_key -->
|
<!-- rel1->parent_private_key -->
|
||||||
<g id="edge3" class="edge"><title>rel1->parent_private_key</title>
|
<g id="edge3" class="edge"><title>rel1->parent_private_key</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M119.618,-181.476C122.373,-182.434 124,-183 124,-183 124,-183 131.328,-185.081 141.576,-187.991"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M120.192,-181.787C121.471,-182.198 122.741,-182.603 124,-183 129.158,-184.628 134.517,-186.266 139.911,-187.876"/>
|
||||||
<polygon fill="black" stroke="black" points="120.632,-178.123 110.037,-178.143 118.332,-184.734 120.632,-178.123"/>
|
<polygon fill="black" stroke="black" points="120.86,-178.324 110.267,-178.54 118.683,-184.976 120.86,-178.324"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- rel1->parent_chain_code -->
|
<!-- rel1->parent_chain_code -->
|
||||||
<!-- rel1->parent_public_key -->
|
<!-- rel1->parent_public_key -->
|
||||||
<g id="edge7" class="edge"><title>rel1->parent_public_key</title>
|
<g id="edge7" class="edge"><title>rel1->parent_public_key</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M110.037,-139.857C118.235,-137.005 124,-135 124,-135 124,-135 127.007,-134.146 131.863,-132.767"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M110.267,-139.46C114.902,-137.918 119.525,-136.412 124,-135 125.934,-134.39 127.897,-133.778 129.879,-133.166"/>
|
||||||
<polygon fill="black" stroke="black" points="132.912,-136.108 141.576,-130.009 131,-129.374 132.912,-136.108"/>
|
<polygon fill="black" stroke="black" points="131.358,-136.375 139.911,-130.124 129.326,-129.677 131.358,-136.375"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 8.7 KiB |
|
@ -3,12 +3,14 @@ digraph extended {
|
||||||
size=6.25;
|
size=6.25;
|
||||||
rankdir=LR;
|
rankdir=LR;
|
||||||
penwidth=1.75;
|
penwidth=1.75;
|
||||||
node [ penwidth = 1.75, shape = "box" ];
|
node [ fontname="Sans", penwidth = 1.75, shape = "box" ];
|
||||||
edge [ penwidth = 1.75 ];
|
edge [ fontname="Sans", penwidth = 1.75 ];
|
||||||
|
graph [ fontname="Sans" ];
|
||||||
nodesep=0.05;
|
nodesep=0.05;
|
||||||
splines = ortho;
|
//splines = ortho;
|
||||||
ranksep = 1.0;
|
ranksep = 1.0;
|
||||||
subgraph cluster_hard {
|
subgraph cluster_hard {
|
||||||
|
style = "invis";
|
||||||
|
|
||||||
subgraph cluster_h_parent_extended_key {
|
subgraph cluster_h_parent_extended_key {
|
||||||
h_parent_private_key [ label = "Parent Private Key" ];
|
h_parent_private_key [ label = "Parent Private Key" ];
|
||||||
|
@ -31,18 +33,16 @@ subgraph cluster_hard {
|
||||||
hmac_hard -> child_private_key_hard;
|
hmac_hard -> child_private_key_hard;
|
||||||
hmac_hard -> child_chain_code_hard;
|
hmac_hard -> child_chain_code_hard;
|
||||||
h_parent_private_key -> child_private_key_hard;
|
h_parent_private_key -> child_private_key_hard;
|
||||||
|
|
||||||
label = "Hardened Private"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
subgraph cluster_norm {
|
subgraph cluster_norm {
|
||||||
//style = "invis"
|
style = "invis"
|
||||||
//label = "Creation Of Normal Child Extended Keys (Key + Chain Code)\nFrom Parent Extended Keys"
|
|
||||||
|
|
||||||
subgraph cluster_n_parent_extended_key {
|
subgraph cluster_n_parent_extended_key {
|
||||||
n_parent_private_key [ label = "Parent Private Key" ];
|
n_parent_private_key [ label = "Parent Private Key" ];
|
||||||
n_parent_chain_code [ label = "Parent Chain Code" ];
|
n_parent_chain_code [ label = "Parent Chain Code" ];
|
||||||
|
n_parent_public_key [ label = "Parent Public Key" ];
|
||||||
}
|
}
|
||||||
|
|
||||||
subgraph cluster_child_extended_key_norm {
|
subgraph cluster_child_extended_key_norm {
|
||||||
|
@ -53,15 +53,13 @@ subgraph cluster_norm {
|
||||||
i_norm [ label = "Index <0x80000000" ];
|
i_norm [ label = "Index <0x80000000" ];
|
||||||
|
|
||||||
n_parent_chain_code -> hmac_norm;
|
n_parent_chain_code -> hmac_norm;
|
||||||
|
n_parent_public_key -> hmac_norm;
|
||||||
i_norm -> hmac_norm;
|
i_norm -> hmac_norm;
|
||||||
hmac_norm -> child_private_key_norm;
|
hmac_norm -> child_private_key_norm;
|
||||||
hmac_norm -> child_chain_code_norm;
|
hmac_norm -> child_chain_code_norm;
|
||||||
n_parent_private_key -> child_private_key_norm;
|
n_parent_private_key -> child_private_key_norm [weight = 5];
|
||||||
|
|
||||||
label = "Normal Private"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
label = "Normal (Top) And Hardened (Bottom) Child Private Key Derivation";
|
||||||
label = "Creation Of Child Extended Private Keys (Key, Chain Code)"
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 11 KiB |
|
@ -4,31 +4,23 @@
|
||||||
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
|
||||||
-->
|
-->
|
||||||
<!-- Title: extended Pages: 1 -->
|
<!-- Title: extended Pages: 1 -->
|
||||||
<svg width="450pt" height="326pt"
|
<svg width="450pt" height="318pt"
|
||||||
viewBox="0.00 0.00 450.00 325.62" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
viewBox="0.00 0.00 450.00 317.69" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
<g id="graph1" class="graph" transform="scale(0.792254 0.792254) rotate(0) translate(4 407)">
|
<g id="graph1" class="graph" transform="scale(0.792254 0.792254) rotate(0) translate(4 397)">
|
||||||
<title>extended</title>
|
<title>extended</title>
|
||||||
<polygon fill="white" stroke="white" points="-4,5 -4,-407 565,-407 565,5 -4,5"/>
|
<polygon fill="white" stroke="white" points="-4,5 -4,-397 565,-397 565,5 -4,5"/>
|
||||||
<text text-anchor="middle" x="280" y="-8.4" font-family="Sans" font-size="14.00">Creation Of Child Extended Private Keys (Key, Chain Code)</text>
|
<text text-anchor="middle" x="280" y="-8.4" font-family="Sans" font-size="14.00">Normal (Top) And Hardened (Bottom) Child Private Key Derivation</text>
|
||||||
<g id="graph2" class="cluster"><title>cluster_hard</title>
|
<g id="graph2" class="cluster"><title>cluster_hard</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="8,-33 8,-210 552,-210 552,-33 8,-33"/>
|
|
||||||
<text text-anchor="middle" x="280" y="-193.4" font-family="Sans" font-size="14.00">Hardened Private</text>
|
|
||||||
</g>
|
</g>
|
||||||
<g id="graph3" class="cluster"><title>cluster_h_parent_extended_key</title>
|
<g id="graph3" class="cluster"><title>cluster_h_parent_extended_key</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="16,-85 16,-177 178,-177 178,-85 16,-85"/>
|
|
||||||
</g>
|
</g>
|
||||||
<g id="graph4" class="cluster"><title>cluster_child_extended_key_else</title>
|
<g id="graph4" class="cluster"><title>cluster_child_extended_key_else</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="394,-85 394,-177 544,-177 544,-85 394,-85"/>
|
|
||||||
</g>
|
</g>
|
||||||
<g id="graph5" class="cluster"><title>cluster_norm</title>
|
<g id="graph5" class="cluster"><title>cluster_norm</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="8,-218 8,-395 552,-395 552,-218 8,-218"/>
|
|
||||||
<text text-anchor="middle" x="280" y="-378.4" font-family="Sans" font-size="14.00">Normal Private</text>
|
|
||||||
</g>
|
</g>
|
||||||
<g id="graph6" class="cluster"><title>cluster_n_parent_extended_key</title>
|
<g id="graph6" class="cluster"><title>cluster_n_parent_extended_key</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="16,-270 16,-362 178,-362 178,-270 16,-270"/>
|
|
||||||
</g>
|
</g>
|
||||||
<g id="graph7" class="cluster"><title>cluster_child_extended_key_norm</title>
|
<g id="graph7" class="cluster"><title>cluster_child_extended_key_norm</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="394,-270 394,-362 544,-362 544,-270 394,-270"/>
|
|
||||||
</g>
|
</g>
|
||||||
<!-- h_parent_private_key -->
|
<!-- h_parent_private_key -->
|
||||||
<g id="node3" class="node"><title>h_parent_private_key</title>
|
<g id="node3" class="node"><title>h_parent_private_key</title>
|
||||||
|
@ -97,63 +89,73 @@
|
||||||
</g>
|
</g>
|
||||||
<!-- n_parent_private_key -->
|
<!-- n_parent_private_key -->
|
||||||
<g id="node18" class="node"><title>n_parent_private_key</title>
|
<g id="node18" class="node"><title>n_parent_private_key</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="170,-354 24,-354 24,-318 170,-318 170,-354"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="170,-369 24,-369 24,-333 170,-333 170,-369"/>
|
||||||
<text text-anchor="middle" x="97" y="-331.9" font-family="Sans" font-size="14.00">Parent Private Key</text>
|
<text text-anchor="middle" x="97" y="-346.9" font-family="Sans" font-size="14.00">Parent Private Key</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- child_private_key_norm -->
|
<!-- child_private_key_norm -->
|
||||||
<g id="node21" class="node"><title>child_private_key_norm</title>
|
<g id="node22" class="node"><title>child_private_key_norm</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="536,-354 402,-354 402,-318 536,-318 536,-354"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="536,-369 402,-369 402,-333 536,-333 536,-369"/>
|
||||||
<text text-anchor="middle" x="469" y="-331.9" font-family="Sans" font-size="14.00">Child Private Key</text>
|
<text text-anchor="middle" x="469" y="-346.9" font-family="Sans" font-size="14.00">Child Private Key</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- n_parent_private_key->child_private_key_norm -->
|
<!-- n_parent_private_key->child_private_key_norm -->
|
||||||
<g id="edge28" class="edge"><title>n_parent_private_key->child_private_key_norm</title>
|
<g id="edge30" class="edge"><title>n_parent_private_key->child_private_key_norm</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M170.051,-336C233.921,-336 326.389,-336 391.534,-336"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M170.051,-351C233.921,-351 326.389,-351 391.534,-351"/>
|
||||||
<polygon fill="black" stroke="black" points="391.746,-339.5 401.746,-336 391.746,-332.5 391.746,-339.5"/>
|
<polygon fill="black" stroke="black" points="391.746,-354.5 401.746,-351 391.746,-347.5 391.746,-354.5"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- n_parent_chain_code -->
|
<!-- n_parent_chain_code -->
|
||||||
<g id="node19" class="node"><title>n_parent_chain_code</title>
|
<g id="node19" class="node"><title>n_parent_chain_code</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="170,-314 24,-314 24,-278 170,-278 170,-314"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="170,-329 24,-329 24,-293 170,-293 170,-329"/>
|
||||||
<text text-anchor="middle" x="97" y="-291.9" font-family="Sans" font-size="14.00">Parent Chain Code</text>
|
<text text-anchor="middle" x="97" y="-306.9" font-family="Sans" font-size="14.00">Parent Chain Code</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- hmac_norm -->
|
<!-- hmac_norm -->
|
||||||
<g id="node23" class="node"><title>hmac_norm</title>
|
<g id="node24" class="node"><title>hmac_norm</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="330,-317 250,-317 250,-275 330,-275 330,-317"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="330,-332 250,-332 250,-290 330,-290 330,-332"/>
|
||||||
<polyline fill="none" stroke="black" stroke-width="1.75" points="262,-317 250,-305 "/>
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="262,-332 250,-320 "/>
|
||||||
<polyline fill="none" stroke="black" stroke-width="1.75" points="250,-287 262,-275 "/>
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="250,-302 262,-290 "/>
|
||||||
<polyline fill="none" stroke="black" stroke-width="1.75" points="318,-275 330,-287 "/>
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="318,-290 330,-302 "/>
|
||||||
<polyline fill="none" stroke="black" stroke-width="1.75" points="330,-305 318,-317 "/>
|
<polyline fill="none" stroke="black" stroke-width="1.75" points="330,-320 318,-332 "/>
|
||||||
<text text-anchor="middle" x="290" y="-300.4" font-family="Sans" font-size="14.00">One-Way</text>
|
<text text-anchor="middle" x="290" y="-315.4" font-family="Sans" font-size="14.00">One-Way</text>
|
||||||
<text text-anchor="middle" x="290" y="-283.4" font-family="Sans" font-size="14.00">Hash</text>
|
<text text-anchor="middle" x="290" y="-298.4" font-family="Sans" font-size="14.00">Hash</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- n_parent_chain_code->hmac_norm -->
|
<!-- n_parent_chain_code->hmac_norm -->
|
||||||
<g id="edge20" class="edge"><title>n_parent_chain_code->hmac_norm</title>
|
<g id="edge20" class="edge"><title>n_parent_chain_code->hmac_norm</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M170.24,-296C193.425,-296 218.516,-296 239.712,-296"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M170.24,-311C193.425,-311 218.516,-311 239.712,-311"/>
|
||||||
<polygon fill="black" stroke="black" points="239.779,-299.5 249.779,-296 239.779,-292.5 239.779,-299.5"/>
|
<polygon fill="black" stroke="black" points="239.779,-314.5 249.779,-311 239.779,-307.5 239.779,-314.5"/>
|
||||||
|
</g>
|
||||||
|
<!-- n_parent_public_key -->
|
||||||
|
<g id="node20" class="node"><title>n_parent_public_key</title>
|
||||||
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="165,-289 29,-289 29,-253 165,-253 165,-289"/>
|
||||||
|
<text text-anchor="middle" x="97" y="-266.9" font-family="Sans" font-size="14.00">Parent Public Key</text>
|
||||||
|
</g>
|
||||||
|
<!-- n_parent_public_key->hmac_norm -->
|
||||||
|
<g id="edge22" class="edge"><title>n_parent_public_key->hmac_norm</title>
|
||||||
|
<path fill="none" stroke="black" stroke-width="1.75" d="M165.588,-285.215C190.017,-290.278 217.057,-295.882 239.671,-300.569"/>
|
||||||
|
<polygon fill="black" stroke="black" points="239.222,-304.05 249.724,-302.653 240.643,-297.196 239.222,-304.05"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- child_chain_code_norm -->
|
<!-- child_chain_code_norm -->
|
||||||
<g id="node22" class="node"><title>child_chain_code_norm</title>
|
<g id="node23" class="node"><title>child_chain_code_norm</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="536,-314 402,-314 402,-278 536,-278 536,-314"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="536,-329 402,-329 402,-293 536,-293 536,-329"/>
|
||||||
<text text-anchor="middle" x="469" y="-291.9" font-family="Sans" font-size="14.00">Child Chain Code</text>
|
<text text-anchor="middle" x="469" y="-306.9" font-family="Sans" font-size="14.00">Child Chain Code</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- hmac_norm->child_private_key_norm -->
|
<!-- hmac_norm->child_private_key_norm -->
|
||||||
<g id="edge24" class="edge"><title>hmac_norm->child_private_key_norm</title>
|
<g id="edge26" class="edge"><title>hmac_norm->child_private_key_norm</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M330.171,-304.977C348.413,-309.053 370.63,-314.018 391.896,-318.77"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M330.171,-319.977C348.413,-324.053 370.63,-329.018 391.896,-333.77"/>
|
||||||
<polygon fill="black" stroke="black" points="391.386,-322.242 401.908,-321.007 392.912,-315.411 391.386,-322.242"/>
|
<polygon fill="black" stroke="black" points="391.386,-337.242 401.908,-336.007 392.912,-330.411 391.386,-337.242"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- hmac_norm->child_chain_code_norm -->
|
<!-- hmac_norm->child_chain_code_norm -->
|
||||||
<g id="edge26" class="edge"><title>hmac_norm->child_chain_code_norm</title>
|
<g id="edge28" class="edge"><title>hmac_norm->child_chain_code_norm</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M330.171,-296C348.413,-296 370.63,-296 391.896,-296"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M330.171,-311C348.413,-311 370.63,-311 391.896,-311"/>
|
||||||
<polygon fill="black" stroke="black" points="391.908,-299.5 401.908,-296 391.908,-292.5 391.908,-299.5"/>
|
<polygon fill="black" stroke="black" points="391.908,-314.5 401.908,-311 391.908,-307.5 391.908,-314.5"/>
|
||||||
</g>
|
</g>
|
||||||
<!-- i_norm -->
|
<!-- i_norm -->
|
||||||
<g id="node24" class="node"><title>i_norm</title>
|
<g id="node25" class="node"><title>i_norm</title>
|
||||||
<polygon fill="none" stroke="black" stroke-width="1.75" points="177,-262 17,-262 17,-226 177,-226 177,-262"/>
|
<polygon fill="none" stroke="black" stroke-width="1.75" points="177,-237 17,-237 17,-201 177,-201 177,-237"/>
|
||||||
<text text-anchor="middle" x="97" y="-239.9" font-family="Sans" font-size="14.00">Index <0x80000000</text>
|
<text text-anchor="middle" x="97" y="-214.9" font-family="Sans" font-size="14.00">Index <0x80000000</text>
|
||||||
</g>
|
</g>
|
||||||
<!-- i_norm->hmac_norm -->
|
<!-- i_norm->hmac_norm -->
|
||||||
<g id="edge22" class="edge"><title>i_norm->hmac_norm</title>
|
<g id="edge24" class="edge"><title>i_norm->hmac_norm</title>
|
||||||
<path fill="none" stroke="black" stroke-width="1.75" d="M163.96,-262.041C188.903,-268.761 216.759,-276.267 239.928,-282.509"/>
|
<path fill="none" stroke="black" stroke-width="1.75" d="M160.77,-237.084C166.665,-239.233 172.489,-241.544 178,-244 203.171,-255.218 229.705,-270.9 250.626,-284.272"/>
|
||||||
<polygon fill="black" stroke="black" points="239.315,-285.969 249.881,-285.191 241.136,-279.21 239.315,-285.969"/>
|
<polygon fill="black" stroke="black" points="248.931,-287.344 259.228,-289.841 252.736,-281.468 248.931,-287.344"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |