mirror of
https://github.com/urbit/shrub.git
synced 2024-12-15 21:03:10 +03:00
1556402668
Currently only uses the official English wordlist, but could be expanded to use various other wordlists in the future. Includes tests.
47 lines
931 B
Plaintext
47 lines
931 B
Plaintext
:: bip39 implementation in hoon
|
|
::
|
|
/+ bip39-english
|
|
::
|
|
|%
|
|
++ from-entropy
|
|
|= byts
|
|
^- tape
|
|
=. wid (mul wid 8)
|
|
~| [%unsupported-entropy-bit-length wid]
|
|
?> &((gte wid 128) (lte wid 256))
|
|
::
|
|
=+ cs=(div wid 32)
|
|
=/ check=@
|
|
%^ rsh 0 (sub 256 cs)
|
|
(sha-256l:sha (div wid 8) dat)
|
|
=/ bits=byts
|
|
:- (add wid cs)
|
|
%+ can 0
|
|
:~ cs^check
|
|
wid^dat
|
|
==
|
|
::
|
|
=/ pieces
|
|
|- ^- (list @)
|
|
:- (end 0 11 dat.bits)
|
|
?: (lte wid.bits 11) ~
|
|
$(bits [(sub wid.bits 11) (rsh 0 11 dat.bits)])
|
|
::
|
|
=/ words=(list tape)
|
|
%+ turn pieces
|
|
|= ind=@ud
|
|
(snag ind `(list tape)`bip39-english)
|
|
::
|
|
%+ roll (flop words)
|
|
|= [nex=tape all=tape]
|
|
?~ all nex
|
|
:(weld all " " nex)
|
|
::
|
|
::NOTE always produces a 512-bit result
|
|
++ to-seed
|
|
|= [mnem=tape pass=tape]
|
|
^- @
|
|
%- hmac-sha512t:pbkdf:crypto
|
|
[(crip mnem) (crip (weld "mnemonic" pass)) 2.048 64]
|
|
--
|