hssh-0.1.0.0: src/Network/SSH/AuthAgent.hs
module Network.SSH.AuthAgent where
import qualified Data.ByteArray as BA
import qualified Crypto.PubKey.Ed25519 as Ed25519
import Network.SSH.Message
import Network.SSH.Key
-- | An `AuthAgent` is something that is capable of cryptographic signing
-- using a public key algorithm like Ed25519 or RSA.
--
-- Currently, `KeyPair` is the only instance, but the method
-- signatures have been designed with other mechanisms like HSM's
-- or agent-forwarding in mind.
class AuthAgent agent where
-- | Get a list of public keys for which the agent holds the corresponding
-- private keys.
--
-- The list contents may change when called subsequently.
getPublicKeys :: agent -> IO [PublicKey]
-- | Sign the given hash with the requested public key.
--
-- The signature may be denied in case the key is no longer available.
-- This method shall not throw exceptions, but rather return `Nothing` if possible.
getSignature :: BA.ByteArrayAccess hash => agent -> PublicKey -> hash -> IO (Maybe Signature)
instance AuthAgent KeyPair where
getPublicKeys kp = case kp of
KeyPairEd25519 pk _ -> pure [PublicKeyEd25519 pk]
getSignature kp pk0 hash = case kp of
KeyPairEd25519 pk sk
| pk0 == PublicKeyEd25519 pk -> pure $ Just $ SignatureEd25519 $ Ed25519.sign sk pk hash
| otherwise -> pure Nothing