{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# OPTIONS_HADDOCK hide #-} -- | -- Copyright: 2020 Input Output (Hong Kong) Ltd., 2021-2022 Input Output Global Inc. (IOG), 2023-2025 Intersect -- License: Apache-2.0 module Command.Key.Private ( Cmd (..) , mod , run ) where import Prelude hiding ( mod ) import Cardano.Address.Derivation ( xprvChainCode, xprvPrivateKey ) import Codec.Binary.Encoding ( AbstractEncoding (..) ) import Data.Maybe ( fromJust ) import Data.Text ( Text ) import Options.Applicative ( CommandFields, Mod, command, footerDoc, helper, info, progDesc ) import Options.Applicative.Help.Pretty ( pretty ) import Options.Applicative.Private ( PrivateType (..), privateOpt ) import System.IO ( stdin, stdout ) import System.IO.Extra ( hGetXPrv, hPutBytes ) import qualified Cardano.Codec.Bech32.Prefixes as CIP5 newtype Cmd = Private { keyPart :: PrivateType } deriving (Show) mod :: (Cmd -> parent) -> Mod CommandFields parent mod liftCmd = command "private" $ info (helper <*> fmap liftCmd parser) $ mempty <> progDesc "Get the signing or chain code part of an extended private key" <> footerDoc (Just $ pretty $ mconcat [ "The private key is read from stdin." :: Text , "To get a signing key pass '--signing-key'." , "To get a chain code pass '--chain-code'." , "Bech32 encoding will be used." , "In order to have the signing key hex encoded pass the result to the stdin of bech32 tool." ]) where parser = Private <$> privateOpt run :: Cmd -> IO () run Private{keyPart} = do (hrp, xprv) <- hGetXPrv stdin allowedPrefixes let bytes = case keyPart of ChainCode -> xprvChainCode xprv SigningKey -> xprvPrivateKey xprv hPutBytes stdout bytes (getFormat keyPart hrp) where prefixes = [ (CIP5.root_xsk, CIP5.root_sk ) , (CIP5.acct_xsk, CIP5.acct_sk ) , (CIP5.addr_xsk, CIP5.addr_sk ) , (CIP5.stake_xsk, CIP5.stake_sk ) , (CIP5.root_shared_xsk, CIP5.root_shared_sk ) , (CIP5.acct_shared_xsk, CIP5.acct_shared_sk ) , (CIP5.addr_shared_xsk, CIP5.addr_shared_sk ) , (CIP5.stake_shared_xsk, CIP5.stake_shared_sk ) , (CIP5.policy_xsk, CIP5.policy_sk ) , (CIP5.drep_xsk, CIP5.drep_sk ) , (CIP5.cc_cold_xsk, CIP5.cc_cold_sk ) , (CIP5.cc_hot_xsk, CIP5.cc_hot_sk ) ] allowedPrefixes = map fst prefixes getFormat ChainCode _ = EBase16 getFormat SigningKey hrp = EBech32 $ fromJust $ lookup hrp prefixes