----------------------------------------------------------------------------- -- | -- Module : Crypto.Sign.Ed25519 -- Copyright : (c) Marcel Fourné 20[19..] -- License : BSD3 -- Maintainer : Marcel Fourné (haskell@marcelfourne.de) -- Stability : stable -- Portability : Good -- -- original implementation of this API is by Austin Seipp and can be found under: https://hackage.haskell.org/package/ed25519 -- ----------------------------------------------------------------------------- {-# LANGUAGE Safe #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE ScopedTypeVariables #-} module Crypto.Sign.Ed25519 ( PublicKey(..) , SecretKey(..) , createKeypair , createKeypairFromSeed_ , createKeypairFromSeed , toPublicKey , sign , verify , Signature(..) , dsign , dverify , sign' , verify' ) where import safe Prelude (Eq,Show, Ord, IO, Either(Right,Left), Maybe, Bool, return, undefined, error, (==)) import safe GHC.Generics (Generic) import safe qualified Crypto.ECC.Ed25519.Sign as S import safe qualified Crypto.ECC.Ed25519.Internal.Ed25519 as I import safe qualified Data.ByteString as BS -- | http://hackage.haskell.org/package/ed25519-0.0.5.0/docs/Crypto-Sign-Ed25519.html newtype PublicKey = PublicKey { unPublicKey :: BS.ByteString } deriving (Eq, Show, Ord, Generic) -- | http://hackage.haskell.org/package/ed25519-0.0.5.0/docs/Crypto-Sign-Ed25519.html newtype SecretKey = SecretKey { unSecretKey :: BS.ByteString } deriving (Eq, Show, Ord, Generic) -- | http://hackage.haskell.org/package/ed25519-0.0.5.0/docs/Crypto-Sign-Ed25519.html createKeypair :: IO (PublicKey, SecretKey) createKeypair = do a <- S.genkeys case a of Right (I.SecKeyBytes sk, pk) -> return (PublicKey pk, SecretKey sk) Left e -> error e -- | http://hackage.haskell.org/package/ed25519-0.0.5.0/docs/Crypto-Sign-Ed25519.html createKeypairFromSeed_ :: BS.ByteString -> Maybe (PublicKey, SecretKey) createKeypairFromSeed_ = undefined -- | http://hackage.haskell.org/package/ed25519-0.0.5.0/docs/Crypto-Sign-Ed25519.html createKeypairFromSeed :: BS.ByteString -> (PublicKey, SecretKey) createKeypairFromSeed = undefined -- | http://hackage.haskell.org/package/ed25519-0.0.5.0/docs/Crypto-Sign-Ed25519.html toPublicKey :: SecretKey -> PublicKey toPublicKey sk = let (SecretKey sk') = sk sk'' = I.SecKeyBytes sk' a = S.publickey sk'' in case a of Right pk -> PublicKey pk Left e -> error e -- | http://hackage.haskell.org/package/ed25519-0.0.5.0/docs/Crypto-Sign-Ed25519.html sign :: SecretKey -> BS.ByteString -> BS.ByteString sign sk m = let SecretKey sk' = sk a = S.sign (I.SecKeyBytes sk') m in case a of Right sigm -> sigm Left e -> error e -- | http://hackage.haskell.org/package/ed25519-0.0.5.0/docs/Crypto-Sign-Ed25519.html verify :: PublicKey -> BS.ByteString -> Bool verify pk m = let PublicKey pk' = pk in S.verify pk' m == Right I.SigOK -- | http://hackage.haskell.org/package/ed25519-0.0.5.0/docs/Crypto-Sign-Ed25519.html newtype Signature = Signature { unSignature :: BS.ByteString } deriving (Eq, Show, Ord) -- | http://hackage.haskell.org/package/ed25519-0.0.5.0/docs/Crypto-Sign-Ed25519.html dsign :: SecretKey -> BS.ByteString -> Signature dsign sk m = let SecretKey sk' = sk a = S.dsign (I.SecKeyBytes sk') m in case a of Right sig -> Signature sig Left e -> error e -- | http://hackage.haskell.org/package/ed25519-0.0.5.0/docs/Crypto-Sign-Ed25519.html dverify :: PublicKey -> BS.ByteString -> Signature -> Bool dverify pk m sig = let PublicKey pk' = pk Signature sig' = sig in S.dverify pk' sig' m == Right I.SigOK -- | http://hackage.haskell.org/package/ed25519-0.0.5.0/docs/Crypto-Sign-Ed25519.html sign' :: SecretKey -> BS.ByteString -> Signature sign' sk m = dsign sk m -- | http://hackage.haskell.org/package/ed25519-0.0.5.0/docs/Crypto-Sign-Ed25519.html verify' :: PublicKey -> BS.ByteString -> Signature -> Bool verify' pk m sig = dverify pk m sig