Skip to content

Commit

Permalink
Merge pull request #1691 from akarve/bip85-details
Browse files Browse the repository at this point in the history
BIP-85: formatting and changelog updates, and add word cases for application 39'
  • Loading branch information
jonatack authored Nov 14, 2024
2 parents c58a428 + b398219 commit 16a23b7
Showing 1 changed file with 36 additions and 28 deletions.
64 changes: 36 additions & 28 deletions bip-0085.mediawiki
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ It is not possible to maintain one single (mnemonic) seed backup for all keychai

As HD keychains are essentially derived from initial entropy, this proposal provides a way to derive entropy from the keychain which can be fed into whatever method a wallet uses to derive the initial mnemonic seed or root key.

==Copyright==

This BIP is dual-licensed under the Open Publication License and BSD 2-clause license.

==Definitions==

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.
Expand Down Expand Up @@ -51,7 +55,11 @@ Ultimately, all of the mnemonic/seed schemes start with some "initial entropy" t

We assume a single BIP32 master root key. This specification is not concerned with how this was derived (e.g. directly or via a mnemonic scheme such as BIP39).

For each application that requires its own wallet, a unique private key is derived from the BIP32 master root key using a fully hardened derivation path. The resulting private key (k) is then processed with HMAC-SHA512, where the key is "bip-entropy-from-k", and the message payload is the private key k: <code>HMAC-SHA512(key="bip-entropy-from-k", msg=k)</code>. The result produces 512 bits of entropy. Each application SHOULD use up to the required number of bits necessary for their operation, and truncate the rest.
For each application that requires its own wallet, a unique private key is derived from the BIP32 master root key using a fully hardened derivation path. The resulting private key (k) is then processed with HMAC-SHA512, where the key is "bip-entropy-from-k", and the message payload is the private key k: <code>HMAC-SHA512(key="bip-entropy-from-k", msg=k)</code>
<ref name="hmac-sha512">
The reason for running the derived key through HMAC-SHA512 and truncating the result as necessary is to prevent leakage of the parent tree should the derived key (''k'') be compromised. While the specification requires the use of hardended key derivation which would prevent this, we cannot enforce hardened derivation, so this method ensures the derived entropy is hardened. Also, from a semantic point of view, since the purpose is to derive entropy and not a private key, we are required to transform the child key. This is done out of an abundance of caution, in order to ward off unwanted side effects should ''k'' be used for a dual purpose, including as a nonce ''hash(k)'', where undesirable and unforeseen interactions could occur.
</ref>.
The result produces 512 bits of entropy. Each application SHOULD use up to the required number of bits necessary for their operation, and truncate the rest.

The HMAC-SHA512 function is specified in [https://tools.ietf.org/html/rfc4231 RFC 4231].

Expand Down Expand Up @@ -95,12 +103,6 @@ OUTPUT
* DRNG(80 bytes)=b78b1ee6b345eae6836c2d53d33c64cdaf9a696487be81b03e822dc84b3f1cd883d7559e53d175f243e4c349e822a957bbff9224bc5dde9492ef54e8a439f6bc8c7355b87a925a37ee405a7502991111
==Reference Implementation==

* 1.3.0 Python 3.x library implementation: [https://github.com/akarve/bipsea]
* 1.1.0 Python 2.x library implementation: [https://github.com/ethankosakovsky/bip85]
* 1.0.0 JavaScript library implementation: [https://github.com/hoganri/bip85-js]
==Applications==

The Application number defines how entropy will be used post processing. Some basic examples follow:
Expand Down Expand Up @@ -167,10 +169,18 @@ Words Table
| 128 bits
| 12'
|-
| 15 words
| 160 bits
| 15'
|-
| 18 words
| 192 bits
| 18'
|-
| 21 words
| 224 bits
| 21'
|-
| 24 words
| 256 bits
| 24'
Expand Down Expand Up @@ -421,26 +431,26 @@ This specification is not backwards compatible with any other existing specifica

This specification relies on BIP32 but is agnostic to how the BIP32 root key is derived. As such, this standard is able to derive wallets with initialization schemes like BIP39 or Electrum wallet style mnemonics.

==Discussion==

The reason for running the derived key through HMAC-SHA512 and truncating the result as necessary is to prevent leakage of the parent tree should the derived key (''k'') be compromised. While the specification requires the use of hardended key derivation which would prevent this, we cannot enforce hardened derivation, so this method ensures the derived entropy is hardened. Also, from a semantic point of view, since the purpose is to derive entropy and not a private key, we are required to transform the child key. This is done out of an abundance of caution, in order to ward off unwanted side effects should ''k'' be used for a dual purpose, including as a nonce ''hash(k)'', where undesirable and unforeseen interactions could occur.

==Acknowledgements==
==References==

Many thanks to Peter Gray and Christopher Allen for their input, and to Peter for suggesting extra application use cases.
BIP32, BIP39

==Change Log==
==Reference Implementations==

===1.0.0 (2020-06-11)===
* 1.3.0 Python 3.x library implementation: [https://github.com/akarve/bipsea]
* 1.1.0 Python 2.x library implementation: [https://github.com/ethankosakovsky/bip85]
* 1.0.0 JavaScript library implementation: [https://github.com/hoganri/bip85-js]
* Initial version
==Changelog==

===1.1.0 (2020-11-19)===
===1.3.0 (2024-10-22)===

====Added====

* BIP85-DRNG-SHAKE256
* RSA application 828365'
* Dice application 89101'
* Czech language code to application 39'
* TPRV guidance for application 32'
* Warning on application 32' key and chain code ordering
===1.2.0 (2022-12-04)===

Expand All @@ -449,23 +459,21 @@ Many thanks to Peter Gray and Christopher Allen for their input, and to Peter fo
* Base64 application 707764'
* Base85 application 707785'
===1.3.0 (2024-10-22)===
===1.1.0 (2020-11-19)===

====Added====

* Dice application 89101'
* Czech language code to application 39'
* TPRV guidance for application 32'
* Warning on application 32' key and chain code ordering
* BIP85-DRNG-SHAKE256
* RSA application 828365'
==References==
===1.0.0 (2020-06-11)===

BIP32, BIP39
* Initial version
==Footnotes==

<references />

==Copyright==
==Acknowledgements==

This BIP is dual-licensed under the Open Publication License and BSD 2-clause license.
Many thanks to Peter Gray and Christopher Allen for their input, and to Peter for suggesting extra application use cases.

0 comments on commit 16a23b7

Please sign in to comment.