@@ -24,6 +24,7 @@ import Data.ByteArray (ByteArrayAccess)
2424import qualified Data.ByteArray as BA
2525import Data.ByteString (ByteString )
2626import qualified Data.ByteString as BS
27+ import Data.Either (fromRight )
2728import qualified Data.ByteString.Base16 as B16
2829import qualified Data.Map as Map
2930import Data.String (IsString , fromString )
@@ -43,17 +44,17 @@ import Data.Base16.Types (extractBase16)
4344------------------------------------------------------------------------------
4445
4546mnemonicToRoot :: MnemonicPhrase -> Crypto. XPrv
46- mnemonicToRoot phrase = seedToRoot (phraseToSeed phrase) " " -- TODO: Empty passowrd
47+ mnemonicToRoot phrase = seedToRoot (phraseToSeed phrase) Nothing -- TODO: Empty passowrd
4748
4849genMnemonic12 :: MonadIO m => m (Either Text (Crypto. MnemonicSentence 12 ))
4950genMnemonic12 = liftIO $ bimap tshow Crypto. entropyToWords . Crypto. toEntropy @ 128
5051 -- This size must be a 1/8th the size of the 'toEntropy' size: 128 / 8 = 16
5152 <$> Crypto.Random.Entropy. getEntropy @ ByteString 16
5253
53- generateCryptoPairFromRoot :: Crypto. XPrv -> Text -> KeyIndex -> (EncryptedPrivateKey , PublicKey )
54+ generateCryptoPairFromRoot :: Crypto. XPrv -> Maybe Text -> KeyIndex -> (EncryptedPrivateKey , PublicKey )
5455generateCryptoPairFromRoot root pass i =
5556 let hardenedIdx = 0x80000000 .|. (fromKeyIndex i)
56- xprv = Crypto. deriveXPrv scheme (T. encodeUtf8 pass) root hardenedIdx
57+ xprv = Crypto. deriveXPrv scheme (T. encodeUtf8 $ fromMaybe " " pass) root hardenedIdx
5758 in (EncryptedPrivateKey xprv, PublicKey $ Crypto. xpubPublicKey $ Crypto. toXPub xprv)
5859 where
5960 scheme = Crypto. DerivationScheme2
@@ -117,8 +118,8 @@ sentenceToSeed s = Crypto.sentenceToSeed s Crypto.english ""
117118-- | Takes a n-sentence crypto seed and a password, and produces an encrypted key that can be
118119-- unlocked with the password
119120-- TODO: enter password 2x, to confirm
120- seedToRoot :: Crypto. Seed -> Text -> Crypto. XPrv
121- seedToRoot seed password = Crypto. generate seed ( T. encodeUtf8 password)
121+ seedToRoot :: ByteArrayAccess ba => ba -> Maybe Text -> Crypto. XPrv
122+ seedToRoot seed password = Crypto. generate seed $ T. encodeUtf8 $ fromMaybe " " password
122123
123124-- | Convenience function for unpacking byte array things into 'Text'
124125newtype WordKey = WordKey { _unWordKey :: Int }
@@ -128,7 +129,7 @@ wordsToPhraseMap :: [Text] -> Map.Map WordKey Text
128129wordsToPhraseMap = Map. fromList . zip [WordKey 1 .. ]
129130
130131data KadenaKey
131- = HDRoot Crypto. XPrv (Maybe Text )
132+ = HDRoot ByteString (Maybe Text ) -- Seed + Maybe Chaibnweaver password
132133 | PlainKeyPair ED25519. SecretKey ED25519. PublicKey
133134
134135data KeyPairYaml = KeyPairYaml
@@ -168,22 +169,26 @@ decodeMnemonic t = do
168169 Just phrase -> do
169170 case phraseToEitherSeed phrase of
170171 Left _ -> pure $ Left " failed converting phrase to seed"
171- Right seed -> pure $ Right $ HDRoot (seedToRoot seed " " ) Nothing
172+ Right seed -> pure $ Right $ HDRoot (BA. convert seed) Nothing
172173
173174decodeEncryptedMnemonic :: Text -> IO (Either String KadenaKey )
174- decodeEncryptedMnemonic t = do
175- case Crypto. xprv =<< fmapL T. unpack ( B16. decodeBase16Untyped ( T. encodeUtf8 t)) of
176- Left _ -> pure $ Left " Could not decode HD key "
177- Right xprv -> do
175+ decodeEncryptedMnemonic t =
176+ -- We now that a valid encrypted key has a length of 128
177+ case ( BS. length seed) of
178+ 128 -> do
178179 hSetBuffering stderr NoBuffering
179180 hPutStr stderr " Enter password to decrypt key: "
180181 pass <- T. pack <$> withoutInputEcho getLine
181182 hPutStrLn stderr " "
182- pure $ Right $ HDRoot xprv (Just pass)
183+ return $ Right $ HDRoot seed (Just pass)
184+ _ -> pure $ Left " Could not decode HD key"
185+
186+ where
187+ seed = (fromRight BS. empty . B16. decodeBase16Untyped . T. encodeUtf8) t
183188
184189genPairFromPhrase :: MnemonicPhrase -> KeyIndex -> (EncryptedPrivateKey , PublicKey )
185190genPairFromPhrase phrase idx =
186- generateCryptoPairFromRoot (mnemonicToRoot phrase) " " idx
191+ generateCryptoPairFromRoot (mnemonicToRoot phrase) Nothing idx
187192
188193newtype PublicKey = PublicKey ByteString
189194 deriving (Eq , Ord , Show )
0 commit comments