Merge pull request #408 from harding/hd-ancestor-compromise

Fix Images For Normal HD Key Derivation; Mention Ancestor Key Risk
This commit is contained in:
saivann 2014-05-19 19:07:19 -04:00
commit 5c102c569d
11 changed files with 322 additions and 182 deletions

View file

@ -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.
![Creating Child Public Keys From An Extended Private Key](/img/dev/en-hd-private-parent-to-private-child.svg) ![Creating Child Public Keys From An Extended Private Key](/img/dev/en-hd-private-parent-to-private-child.svg)
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.
![Cross-Generational Key Compromise](/img/dev/en-hd-cross-generational-key-compromise.svg) ![Cross-Generational Key Compromise](/img/dev/en-hd-cross-generational-key-compromise.svg)
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

View file

@ -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

View file

@ -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"
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Before After
Before After

View file

@ -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&#45;Generational Key Compromise</text> <text text-anchor="middle" x="286" y="-8.4" font-family="Sans" font-size="14.00">Cross&#45;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&#45;</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&#45;&gt;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&#45;&gt;child_private_key -->
<g id="edge16" class="edge"><title>parent_private_key&#45;&gt;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&#45;&gt;parent_private_key -->
<g id="node7" class="node"><title>attacker_child_chain_code</title> <g id="edge18" class="edge"><title>parent_chain_code&#45;&gt;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&#45;&gt;attacker_child_chain_code --> <!-- parent_chain_code&#45;&gt;child_private_key -->
<g id="edge7" class="edge"><title>attacker_parent_chain_code&#45;&gt;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&#45;&gt;child_chain_code -->
<g id="node8" class="node"><title>attacker_child_public_key</title> <g id="edge10" class="edge"><title>parent_chain_code&#45;&gt;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&#45;&gt;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&#45;&gt;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&#45;&gt;attacker_grandchild_private_key --> <!-- parent_chain_code&#45;&gt;child_public_key -->
<g id="edge13" class="edge"><title>attacker_child_private_key&#45;&gt;attacker_grandchild_private_key</title> <g id="edge12" class="edge"><title>parent_chain_code&#45;&gt;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&#45;&gt;attacker_grandchild_private_key --> <!-- parent_public_key -->
<g id="edge17" class="edge"><title>attacker_child_chain_code&#45;&gt;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&#45;&gt;child_chain_code -->
<g id="node11" class="node"><title>attacker_grandchild_chain_code</title> <g id="edge8" class="edge"><title>parent_public_key&#45;&gt;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&#45;&gt;attacker_grandchild_chain_code --> <!-- parent_public_key&#45;&gt;child_public_key -->
<g id="edge21" class="edge"><title>attacker_child_chain_code&#45;&gt;attacker_grandchild_chain_code</title> <g id="edge6" class="edge"><title>parent_public_key&#45;&gt;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&#45;&gt;attacker_grandchild_public_key --> <!-- child_private_key&#45;&gt;grandchild_private_key -->
<g id="edge19" class="edge"><title>attacker_child_chain_code&#45;&gt;attacker_grandchild_public_key</title> <g id="edge20" class="edge"><title>child_private_key&#45;&gt;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&#45;&gt;attacker_grandchild_public_key --> <!-- child_chain_code&#45;&gt;child_private_key -->
<g id="edge15" class="edge"><title>attacker_child_public_key&#45;&gt;attacker_grandchild_public_key</title> <g id="edge32" class="edge"><title>child_chain_code&#45;&gt;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&#45;&gt;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&#45;&gt;grandchild_chain_code -->
<g id="edge30" class="edge"><title>child_chain_code&#45;&gt;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&#45;&gt;grandchild_public_key -->
<g id="edge28" class="edge"><title>child_chain_code&#45;&gt;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&#45;&gt;grandchild_chain_code -->
<g id="edge22" class="edge"><title>child_public_key&#45;&gt;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&#45;&gt;grandchild_public_key -->
<g id="edge24" class="edge"><title>child_public_key&#45;&gt;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&#45;&gt;greatgrandchild_private_key -->
<g id="edge34" class="edge"><title>grandchild_private_key&#45;&gt;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&#45;&gt;grandchild_private_key -->
<!-- grandchild_chain_code&#45;&gt;greatgrandchild_private_key -->
<g id="edge40" class="edge"><title>grandchild_chain_code&#45;&gt;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&#45;&gt;greatgrandchild_chain_code -->
<g id="edge44" class="edge"><title>grandchild_chain_code&#45;&gt;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&#45;&gt;greatgrandchild_public_key -->
<g id="edge42" class="edge"><title>grandchild_chain_code&#45;&gt;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&#45;&gt;greatgrandchild_chain_code -->
<g id="edge36" class="edge"><title>grandchild_public_key&#45;&gt;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&#45;&gt;greatgrandchild_public_key -->
<g id="edge38" class="edge"><title>grandchild_public_key&#45;&gt;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&#45;&gt;greatgrandchild_private_key -->
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before After
Before After

View file

@ -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;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

Before After
Before After

View file

@ -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&#45;Way Hash</text> <text text-anchor="middle" x="360" y="-154.9" font-family="Sans" font-size="14.00">One&#45;Way Hash</text>
</g> </g>
<!-- parent_private_key&#45;&gt;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&#45;&gt;hmac --> <!-- parent_chain_code&#45;&gt;hmac -->
<g id="edge19" class="edge"><title>parent_chain_code&#45;&gt;hmac</title> <g id="edge21" class="edge"><title>parent_chain_code&#45;&gt;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&#45;&gt;hmac -->
<g id="edge19" class="edge"><title>parent_public_key&#45;&gt;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&#45;&gt;hmac --> <!-- i_norm&#45;&gt;hmac -->
<g id="edge21" class="edge"><title>i_norm&#45;&gt;hmac</title> <g id="edge25" class="edge"><title>i_norm&#45;&gt;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&#45;&gt;child_private_key --> <!-- hmac&#45;&gt;child_private_key -->
<g id="edge25" class="edge"><title>hmac&#45;&gt;child_private_key</title> <g id="edge29" class="edge"><title>hmac&#45;&gt;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&#45;&gt;child_chain_code --> <!-- hmac&#45;&gt;child_chain_code -->
<g id="edge27" class="edge"><title>hmac&#45;&gt;child_chain_code</title> <g id="edge31" class="edge"><title>hmac&#45;&gt;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&#45;&gt;child_public_key --> <!-- hmac&#45;&gt;child_public_key -->
<g id="edge23" class="edge"><title>hmac&#45;&gt;child_public_key</title> <g id="edge27" class="edge"><title>hmac&#45;&gt;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&#45;&gt;parent_private_key --> <!-- rel1&#45;&gt;parent_private_key -->
<g id="edge3" class="edge"><title>rel1&#45;&gt;parent_private_key</title> <g id="edge3" class="edge"><title>rel1&#45;&gt;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&#45;&gt;parent_chain_code --> <!-- rel1&#45;&gt;parent_chain_code -->
<!-- rel1&#45;&gt;parent_public_key --> <!-- rel1&#45;&gt;parent_public_key -->
<g id="edge7" class="edge"><title>rel1&#45;&gt;parent_public_key</title> <g id="edge7" class="edge"><title>rel1&#45;&gt;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

Before After
Before After

View file

@ -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)"
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before After
Before After

View file

@ -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&#45;&gt;child_private_key_norm --> <!-- n_parent_private_key&#45;&gt;child_private_key_norm -->
<g id="edge28" class="edge"><title>n_parent_private_key&#45;&gt;child_private_key_norm</title> <g id="edge30" class="edge"><title>n_parent_private_key&#45;&gt;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&#45;Way</text> <text text-anchor="middle" x="290" y="-315.4" font-family="Sans" font-size="14.00">One&#45;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&#45;&gt;hmac_norm --> <!-- n_parent_chain_code&#45;&gt;hmac_norm -->
<g id="edge20" class="edge"><title>n_parent_chain_code&#45;&gt;hmac_norm</title> <g id="edge20" class="edge"><title>n_parent_chain_code&#45;&gt;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&#45;&gt;hmac_norm -->
<g id="edge22" class="edge"><title>n_parent_public_key&#45;&gt;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&#45;&gt;child_private_key_norm --> <!-- hmac_norm&#45;&gt;child_private_key_norm -->
<g id="edge24" class="edge"><title>hmac_norm&#45;&gt;child_private_key_norm</title> <g id="edge26" class="edge"><title>hmac_norm&#45;&gt;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&#45;&gt;child_chain_code_norm --> <!-- hmac_norm&#45;&gt;child_chain_code_norm -->
<g id="edge26" class="edge"><title>hmac_norm&#45;&gt;child_chain_code_norm</title> <g id="edge28" class="edge"><title>hmac_norm&#45;&gt;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 &lt;0x80000000</text> <text text-anchor="middle" x="97" y="-214.9" font-family="Sans" font-size="14.00">Index &lt;0x80000000</text>
</g> </g>
<!-- i_norm&#45;&gt;hmac_norm --> <!-- i_norm&#45;&gt;hmac_norm -->
<g id="edge22" class="edge"><title>i_norm&#45;&gt;hmac_norm</title> <g id="edge24" class="edge"><title>i_norm&#45;&gt;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

Before After
Before After