CP.hs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. {- |
  2. Crypto algorithms used on capabilities
  3. -}
  4. module Data.SMTP.Crypto.Algos.CP (
  5. Algo,
  6. initCp,
  7. update,
  8. update',
  9. checkSeal
  10. -- toSeal
  11. ) where
  12. import Data.ByteString (ByteString)
  13. import qualified Data.ByteString.Lazy as LBS
  14. import qualified Data.SMTP.Seal as Seal
  15. import qualified Crypto.Hash as Hash
  16. import qualified Crypto.Hash.Algorithms as Hashs
  17. import qualified Crypto.PubKey.Ed25519 as Ed25519
  18. import Crypto.Error
  19. import Data.SMTP.Crypto.Types.CP
  20. data State = Sha3_512Ed25519s (Hash.Context Hashs.SHA512)
  21. initCp :: Algo -> State
  22. initCp Sha3_512Ed25519 = Sha3_512Ed25519s Hash.hashInit
  23. update :: State -> ByteString -> State
  24. update (Sha3_512Ed25519s s) dt = Sha3_512Ed25519s $ Hash.hashUpdate s dt
  25. update' :: State -> LBS.ByteString -> State
  26. update' (Sha3_512Ed25519s s) dt = Sha3_512Ed25519s $ Hash.hashUpdates s $ LBS.toChunks dt
  27. checkSeal :: State -> Seal.Seal -> PCP -> Bool
  28. checkSeal _ _ PAll = True
  29. checkSeal (Sha3_512Ed25519s s) (Seal.Seal _ seal _) (PCPSha3_512Ed25519 _ pk) = let
  30. dg = Hash.hashFinalize s
  31. sig' = Ed25519.signature seal
  32. in case sig' of
  33. CryptoFailed _ -> False
  34. CryptoPassed sig -> Ed25519.verify pk dg sig
  35. -- toSeal :: State -> PCP -> Maybe Seal.Seal
  36. -- toSeal (Sha3_512Ed25519s s) (PCPSha3_512Ed25519 cpid pk (Just sk)) = let
  37. -- dg = Hash.hashFinalize s
  38. -- sig = ba2bs $ Ed25519.sign sk pk dg
  39. -- in Just $ Seal.Seal cpid sig Nothing
  40. -- toSeal (Sha3_512Ed25519s _) _ = Nothing
  41. -- ba2bs :: BA.ByteArrayAccess a => a -> ByteString
  42. -- ba2bs = BS.pack . BA.unpack