bip39

BIP39 mnemonic codes in Haskell (docs.ppad.tech/bip39).
git clone git://git.ppad.tech/bip39.git
Log | Files | Refs | README | LICENSE

Vectors.hs (2568B)


      1 {-# LANGUAGE OverloadedStrings #-}
      2 {-# LANGUAGE RecordWildCards #-}
      3 
      4 module Vectors (
      5     Vectors(..)
      6   , Bip39Test(..)
      7   , JPBip39Test(..)
      8   ) where
      9 
     10 import Data.Aeson ((.:))
     11 import qualified Data.Aeson as A
     12 import qualified Data.ByteString as BS
     13 import qualified Data.ByteString.Base16 as B16
     14 import qualified Data.Text as T
     15 import qualified Data.Text.Encoding as TE
     16 import qualified Data.Vector as V
     17 
     18 data Vectors = Vectors {
     19     v_english             :: ![Bip39Test]
     20   , v_chinese_traditional :: ![Bip39Test]
     21   , v_chinese_simplified  :: ![Bip39Test]
     22   , v_french              :: ![Bip39Test]
     23   , v_spanish             :: ![Bip39Test]
     24   , v_korean              :: ![Bip39Test]
     25   , v_japanese            :: ![Bip39Test]
     26   , v_portuguese          :: ![Bip39Test]
     27   , v_czech               :: ![Bip39Test]
     28   , v_italian             :: ![Bip39Test]
     29   } deriving Show
     30 
     31 instance A.FromJSON Vectors where
     32   parseJSON = A.withObject "Vectors" $ \m -> Vectors
     33     <$> m .: "english"
     34     <*> m .: "chinese_traditional"
     35     <*> m .: "chinese_simplified"
     36     <*> m .: "french"
     37     <*> m .: "spanish"
     38     <*> m .: "korean"
     39     <*> m .: "japanese"
     40     <*> m .: "portuguese"
     41     <*> m .: "czech"
     42     <*> m .: "italian"
     43 
     44 data Bip39Test = Bip39Test {
     45     bt_entropy        :: !BS.ByteString
     46   , bt_mnemonic       :: !T.Text
     47   , bt_seed           :: !BS.ByteString
     48   , bt_xprv           :: !BS.ByteString
     49   } deriving Show
     50 
     51 decodehex :: T.Text -> BS.ByteString
     52 decodehex t = case B16.decode (TE.encodeUtf8 t) of
     53   Nothing -> error "bang (decodehex)"
     54   Just bs -> bs
     55 
     56 instance A.FromJSON Bip39Test where
     57   parseJSON  = A.withArray "Bip39Test" $ \m ->
     58     let bt_entropy = case m V.! 0 of
     59           A.String t -> decodehex t
     60           _ -> error "bang (entropy)"
     61         bt_mnemonic = case m V.! 1 of
     62           A.String t -> t
     63           _ -> error "bang (mnemonic)"
     64         bt_seed = case m V.! 2 of
     65           A.String t -> decodehex t
     66           _ -> error "bang (seed)"
     67         bt_xprv = case m V.! 3 of
     68           A.String t -> TE.encodeUtf8 t
     69           _ -> error "bang (xprv)"
     70     in  pure Bip39Test {..}
     71 
     72 data JPBip39Test = JPBip39Test {
     73     jp_entropy :: !BS.ByteString
     74   , jp_mnemonic :: !T.Text
     75   , jp_passphrase :: !T.Text
     76   , jp_seed :: !BS.ByteString
     77   , jp_xprv :: !BS.ByteString
     78   } deriving Show
     79 
     80 instance A.FromJSON JPBip39Test where
     81   parseJSON = A.withObject "JPBip39Test" $ \m -> JPBip39Test
     82     <$> fmap decodehex (m .: "entropy")
     83     <*> m .: "mnemonic"
     84     <*> m .: "passphrase"
     85     <*> fmap decodehex (m .: "seed")
     86     <*> fmap TE.encodeUtf8 (m .: "bip32_xprv")
     87