repin to mq, derivation fallible again

This commit is contained in:
Alain Brenzikofer
2026-09-28 15:31:46 +02:00
parent 7b4ac1bb8b
commit cfe6a69acd
6 changed files with 20 additions and 19 deletions
+8 -5
View File
@@ -65,7 +65,7 @@ import Simplex.Chat.Badges.Types (BadgeAlert (..), BadgeAlertKind (..), BadgeIss
import Simplex.Chat.Badges.Code (badgeCodeText, parseBadgeCode)
import Simplex.Chat.Badges.Service (BadgeBalance (..), BadgeServiceCommand (..), BadgeServiceErrorCode (..), BadgeServiceRequest (..), BadgeServiceResponse (..), BadgeStatement (..), StatementDebitType (..), StatementEntry (..), StatementEntryType (..), currentBadgeServiceVersion)
import Simplex.Chat.Names (SimplexDomainProof (..), SimplexDomainClaim (..), claimDomain, mkDomainClaim)
import Simplex.Chat.Wallet (AccountKey, WalletAddress, WalletError (..), WalletInfo (..), accountSecret, deriveAccount, importWalletMaster, masterMnemonic, newWalletMaster)
import Simplex.Chat.Wallet (AccountKey, WalletAddress, WalletError (..), WalletInfo (..), accountSecret, deriveAccount, entropyFromMnemonic, masterMnemonic, newWalletMaster)
import Simplex.Chat.Call
import Simplex.Chat.Controller
import Simplex.Chat.Delivery (DeliveryJobScope (..), DeliveryJobSpec (..), DeliveryWorkerScope (..))
@@ -116,7 +116,7 @@ import Simplex.Messaging.Agent.Store.Interface (getCurrentMigrations)
import Simplex.Messaging.Client (NetworkConfig (..), NetworkRequestMode (..), NetworkTimeout (..), SMPWebPortServers (..), SocksMode (SMAlways), pattern NRMInteractive, textToHostMode)
import qualified Simplex.Messaging.Crypto as C
import qualified Simplex.Messaging.Crypto.ShortLink as SL
import Simplex.Messaging.Crypto.BIP32 (WalletMaster)
import Simplex.Messaging.Crypto.BIP32 (WalletMaster, mkWalletMaster)
import Simplex.Messaging.Crypto.BIP44 (AccountIndex, mkAccountIndex)
import Simplex.Messaging.Crypto.File (CryptoFile (..), CryptoFileArgs (..))
import qualified Simplex.Messaging.Crypto.File as CF
@@ -1508,8 +1508,8 @@ processChatCommand cxt nm = \case
when (isJust wallet_) $ throwWalletError WEMasterExists
-- the counter starts at 1 for a generated seed, leaving account 0 to other wallets, and is unknown for an imported one
(master, nextAccount) <- case mnemonic_ of
Nothing -> (,Just 1) <$> (liftIO . newWalletMaster =<< asks random)
Just phrase -> (,Nothing) <$> liftWallet (importWalletMaster phrase)
Nothing -> (,Just 1) <$> (liftDerivation . newWalletMaster =<< asks random)
Just phrase -> (,Nothing) <$> (liftDerivation . pure . mkWalletMaster =<< liftWallet (entropyFromMnemonic phrase))
created <- withFastStore' $ \db -> createWallet db master nextAccount
unless created $ throwWalletError WEMasterExists
pure $ CRWallet user (Just $ WalletInfo [] nextAccount)
@@ -6037,7 +6037,10 @@ withWalletStore action = liftWallet =<< withFastStore action
walletAccount :: WalletMaster -> AccountIndex -> CM (AccountKey, WalletAddress)
walletAccount master n = do
g <- asks random
liftIO $ deriveAccount g master n
liftDerivation $ deriveAccount g master n
liftDerivation :: IO (Either String a) -> CM a
liftDerivation = liftError' (ChatError . CEInternalError)
chatCommandP :: Parser ChatCommand
chatCommandP =
+7 -9
View File
@@ -8,7 +8,6 @@ module Simplex.Chat.Wallet
WalletError (..),
newWalletMaster,
entropyFromMnemonic,
importWalletMaster,
masterMnemonic,
deriveAccount,
accountSecret,
@@ -16,6 +15,8 @@ module Simplex.Chat.Wallet
where
import Control.Concurrent.STM
import Control.Monad.Except
import Control.Monad.IO.Class (liftIO)
import Crypto.Random (ChaChaDRG)
import qualified Data.Aeson.TH as JQ
import Data.Bifunctor (first)
@@ -59,22 +60,19 @@ data WalletError
masterStrength :: B39.EntropyStrength
masterStrength = B39.ES256
newWalletMaster :: TVar ChaChaDRG -> IO B32.WalletMaster
newWalletMaster :: TVar ChaChaDRG -> IO (Either String B32.WalletMaster)
newWalletMaster g = B32.mkWalletMaster <$> atomically (B39.randomEntropy masterStrength g)
entropyFromMnemonic :: Text -> Either WalletError B39.WalletEntropy
entropyFromMnemonic = first (const WEBadMnemonic) . B39.parsePhrase
importWalletMaster :: Text -> Either WalletError B32.WalletMaster
importWalletMaster phrase = B32.mkWalletMaster <$> entropyFromMnemonic phrase
masterMnemonic :: B32.WalletMaster -> Text
masterMnemonic = decodeLatin1 . B39.entropyPhrase . B32.masterEntropy
deriveAccount :: TVar ChaChaDRG -> B32.WalletMaster -> AccountIndex -> IO (AccountKey, WalletAddress)
deriveAccount g master n = do
k <- B32.xkKey <$> B32.derivePath g (B32.walletMasterKey master) path
a <- addressFromPrivateKey g k
deriveAccount :: TVar ChaChaDRG -> B32.WalletMaster -> AccountIndex -> IO (Either String (AccountKey, WalletAddress))
deriveAccount g master n = runExceptT $ do
k <- B32.xkKey <$> ExceptT (B32.derivePath g (B32.walletMasterKey master) path)
a <- liftIO $ addressFromPrivateKey g k
pure (k, WalletAddress {accountIndex = n, keyPath = decodeLatin1 $ B32.renderPath path, address = a})
where
path = bip44Path Ethereum n