| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- :: bip39 implementation in hoon
- ::
- /= bip39-english /common/bip39-english
- /= * /common/zose
- ::
- |%
- ++ 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]
- ::
- ++ en-base58
- |= dat=@
- =/ cha
- '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
- %- flop
- |- ^- tape
- ?: =(0 dat) ~
- :- (cut 3 [(mod dat 58) 1] cha)
- $(dat (div dat 58))
- ::
- ++ de-base58
- |= t=tape
- =- (scan t (bass 58 (plus -)))
- ;~ pose
- (cook |=(a=@ (sub a 56)) (shim 'A' 'H'))
- (cook |=(a=@ (sub a 57)) (shim 'J' 'N'))
- (cook |=(a=@ (sub a 58)) (shim 'P' 'Z'))
- (cook |=(a=@ (sub a 64)) (shim 'a' 'k'))
- (cook |=(a=@ (sub a 65)) (shim 'm' 'z'))
- (cook |=(a=@ (sub a 49)) (shim '1' '9'))
- ==
- --
|