packages feed

Dust-crypto-0.1: Dust/Crypto/Keys.hs

{-# LANGUAGE DeriveGeneric, DefaultSignatures #-} -- For automatic generation of cereal put and get

module Dust.Crypto.Keys
(
   PublicKey(..),
   PrivateKey(..),
   Keypair(..),

   loadKeypair,
   saveKeypair,
   loadPublic,

   loadSigningKeypair,
   saveSigningKeypair
) where

import GHC.Generics
import Data.Serialize
import Data.ByteString

newtype PublicKey = PublicKey { publicBytes :: ByteString } deriving (Show, Eq, Generic)
newtype PrivateKey = PrivateKey { privateBytes :: ByteString } deriving (Show, Eq, Generic)

instance Serialize PublicKey

data Keypair = Keypair {
    public :: PublicKey,
    private :: PrivateKey
} deriving (Show, Eq)

loadKeypair :: IO (Keypair)
loadKeypair = do
    public <- loadPublic "id.pub"
    private <- loadPrivate "id.priv"
    return (Keypair public private)

loadPrivate :: FilePath -> IO (PrivateKey)
loadPrivate path = do
    key <- loadKey path
    return (PrivateKey key)

loadPublic :: FilePath -> IO (PublicKey)
loadPublic path = do
    key <- loadKey path
    return (PublicKey key)

loadKey :: FilePath -> IO (ByteString)
loadKey path = Data.ByteString.readFile path

saveKeypair :: Keypair -> IO ()
saveKeypair (Keypair public private) = do
    savePublic "id.pub" public
    savePrivate "id.priv" private

savePrivate :: FilePath -> PrivateKey -> IO ()
savePrivate path (PrivateKey bs) = do
    saveKey path bs

savePublic :: FilePath -> PublicKey -> IO ()
savePublic path (PublicKey bs) = do
    saveKey path bs

saveKey :: FilePath -> ByteString -> IO ()
saveKey path bs = Data.ByteString.writeFile path bs

loadSigningKeypair :: IO (Keypair)
loadSigningKeypair = do
    public <- loadPublic "sign.pub"
    private <- loadPrivate "sign.priv"
    return (Keypair public private)

saveSigningKeypair :: Keypair -> IO ()
saveSigningKeypair (Keypair public private) = do
    savePublic "sign.pub" public
    savePrivate "sign.priv" private