CP.hs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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 qualified Data.ByteArray as BA
  19. import qualified Data.ByteString as BS
  20. import Crypto.Error
  21. import Data.SMTP.Crypto.Types.CP
  22. data State = Sha3_512Ed25519s (Hash.Context Hashs.SHA512)
  23. initCp :: Algo -> State
  24. initCp Sha3_512Ed25519 = Sha3_512Ed25519s Hash.hashInit
  25. update :: State -> ByteString -> State
  26. update (Sha3_512Ed25519s s) dt = Sha3_512Ed25519s $ Hash.hashUpdate s dt
  27. update' :: State -> LBS.ByteString -> State
  28. update' (Sha3_512Ed25519s s) dt = Sha3_512Ed25519s $ Hash.hashUpdates s $ LBS.toChunks dt
  29. checkSeal :: State -> Seal.Seal -> SCP -> Bool
  30. checkSeal _ _ SAll = True
  31. checkSeal (Sha3_512Ed25519s s) (Seal.Seal _ seal _) (SCPSha3_512Ed25519 _ pk) = let
  32. dg = Hash.hashFinalize s
  33. sig' = Ed25519.signature seal
  34. in case sig' of
  35. CryptoFailed _ -> False
  36. CryptoPassed sig -> Ed25519.verify pk dg sig
  37. -- toSeal :: State -> SCP -> Maybe Seal.Seal
  38. -- toSeal (Sha3_512Ed25519s s) (SCPSha3_512Ed25519 cpid pk (Just sk)) = let
  39. -- dg = Hash.hashFinalize s
  40. -- sig = ba2bs $ Ed25519.sign sk pk dg
  41. -- in Just $ Seal.Seal cpid sig Nothing
  42. -- toSeal (Sha3_512Ed25519s _) _ = Nothing
  43. -- ba2bs :: BA.ByteArrayAccess a => a -> ByteString
  44. -- ba2bs = BS.pack . BA.unpack