Skip to content

Commit e1bfffe

Browse files
committed
Use seed instead of xprv in KadenaKey
1 parent b996c8e commit e1bfffe

File tree

3 files changed

+28
-22
lines changed

3 files changed

+28
-22
lines changed

src/Commands/ListKeys.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ listKeysCommand efc mInd = do
2020
ekey <- readKadenaKey h
2121
case ekey of
2222
Left e -> printf "Error reading key from %s: %s\n" keyfile e
23-
Right (HDRoot xprv mpass) -> do
24-
let pass = fromMaybe "" mpass
25-
let getAndShow n = tshow (unKeyIndex n) <> ": " <> pubKeyToText (snd $ generateCryptoPairFromRoot xprv pass n)
23+
Right (HDRoot seed mpass) -> do
24+
let xprv = seedToRoot seed mpass
25+
let getAndShow n = tshow (unKeyIndex n) <> ": " <> pubKeyToText (snd $ generateCryptoPairFromRoot xprv mpass n)
2626
let ind = fromMaybe 5 mInd
2727
mapM_ (T.putStrLn . getAndShow) [0..ind]
2828
Right (PlainKeyPair _ pub) -> do

src/Commands/Sign.hs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ signYamlFile kkey mindex enc msgFile = do
8585
cmd = _csd_cmd csd
8686
signingKeys = S.fromList $ map _s_pubKey $ unSignatureList sigs
8787
case kkey of
88-
HDRoot xprv mpass -> tryHdIndex msgFile csd xprv mpass mindex
88+
HDRoot seed mpass -> tryHdIndex msgFile csd seed mpass mindex
8989
PlainKeyPair sec pub -> do
9090
let pubHex = PublicKeyHex $ toB16 $ BA.convert pub
9191
if S.member pubHex signingKeys
@@ -101,14 +101,15 @@ signYamlFile kkey mindex enc msgFile = do
101101
tryHdIndex
102102
:: FilePath
103103
-> CommandSigData
104-
-> Crypto.XPrv
104+
-> ByteString
105105
-> Maybe Text
106106
-> Maybe KeyIndex
107107
-> IO (Maybe (FilePath, Int))
108-
tryHdIndex msgFile csd xprv mpass mind = do
108+
tryHdIndex msgFile csd seed mpass mind = do
109109
let startingSigs = _csd_sigs csd
110110
cmd = _csd_cmd csd
111111
cmdBS = encodeUtf8 cmd
112+
xprv = seedToRoot seed mpass
112113
signingKeys = S.fromList $ map _s_pubKey $ unSignatureList startingSigs
113114
signPairs = getSigningInds signingKeys xprv mpass (maybe [0..100] (:[]) mind)
114115
f (esec, pub) = addSig pub (ED25519Sig $ sigToText $ signHD esec (fromMaybe "" mpass) (calcHash cmdBS))
@@ -133,7 +134,7 @@ getSigningInds
133134
-> [(EncryptedPrivateKey, PublicKeyHex)]
134135
getSigningInds signingKeys xprv mpass inds = filter inSigningKeys pairs
135136
where
136-
pairs = map (mkPair . generateCryptoPairFromRoot xprv (fromMaybe "" mpass)) inds
137+
pairs = map (mkPair . generateCryptoPairFromRoot xprv mpass) inds
137138
mkPair (esec, pub) = (esec, PublicKeyHex $ pubKeyToText pub)
138139
inSigningKeys pair = S.member (snd pair) signingKeys
139140

@@ -155,8 +156,8 @@ signOther msgFile kkey kind enc = do
155156
msg <- fmapLT mkParseErr $
156157
hoistEither $ genericDecode enc rawbs
157158
let (pubKey, sig) = case kkey of
158-
HDRoot xprv mpass ->
159-
let (esec, pub) = generateCryptoPairFromRoot xprv (fromMaybe "" mpass) kind
159+
HDRoot seed mpass ->
160+
let (esec, pub) = generateCryptoPairFromRoot (seedToRoot seed mpass) mpass kind
160161
in (pub, sigToText $ signHD esec (fromMaybe "" mpass) msg)
161162
PlainKeyPair sec pub -> (PublicKey $ BA.convert pub, toB16 $ BA.convert $ sign sec msg)
162163
lift $ T.putStrLn $ pubKeyToText pubKey <> ": " <> sig

src/Keys.hs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import Data.ByteArray (ByteArrayAccess)
2424
import qualified Data.ByteArray as BA
2525
import Data.ByteString (ByteString)
2626
import qualified Data.ByteString as BS
27+
import Data.Either (fromRight)
2728
import qualified Data.ByteString.Base16 as B16
2829
import qualified Data.Map as Map
2930
import Data.String (IsString, fromString)
@@ -43,17 +44,17 @@ import Data.Base16.Types (extractBase16)
4344
------------------------------------------------------------------------------
4445

4546
mnemonicToRoot :: MnemonicPhrase -> Crypto.XPrv
46-
mnemonicToRoot phrase = seedToRoot (phraseToSeed phrase) "" -- TODO: Empty passowrd
47+
mnemonicToRoot phrase = seedToRoot (phraseToSeed phrase) Nothing -- TODO: Empty passowrd
4748

4849
genMnemonic12 :: MonadIO m => m (Either Text (Crypto.MnemonicSentence 12))
4950
genMnemonic12 = 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)
5455
generateCryptoPairFromRoot 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'
124125
newtype WordKey = WordKey { _unWordKey :: Int }
@@ -128,7 +129,7 @@ wordsToPhraseMap :: [Text] -> Map.Map WordKey Text
128129
wordsToPhraseMap = Map.fromList . zip [WordKey 1 ..]
129130

130131
data KadenaKey
131-
= HDRoot Crypto.XPrv (Maybe Text)
132+
= HDRoot ByteString (Maybe Text) --Seed + Maybe Chaibnweaver password
132133
| PlainKeyPair ED25519.SecretKey ED25519.PublicKey
133134

134135
data 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

173174
decodeEncryptedMnemonic :: 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

184189
genPairFromPhrase :: MnemonicPhrase -> KeyIndex -> (EncryptedPrivateKey, PublicKey)
185190
genPairFromPhrase phrase idx =
186-
generateCryptoPairFromRoot (mnemonicToRoot phrase) "" idx
191+
generateCryptoPairFromRoot (mnemonicToRoot phrase) Nothing idx
187192

188193
newtype PublicKey = PublicKey ByteString
189194
deriving (Eq, Ord, Show)

0 commit comments

Comments
 (0)