diff options
Diffstat (limited to 'src/crypto/crypton/Crypto.hs')
| -rw-r--r-- | src/crypto/crypton/Crypto.hs | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/src/crypto/crypton/Crypto.hs b/src/crypto/crypton/Crypto.hs new file mode 100644 index 0000000..c933b0a --- /dev/null +++ b/src/crypto/crypton/Crypto.hs @@ -0,0 +1,139 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Crypto ( + getEntropy, + getRandomBytes, + + Digest, Blake2b_256, + hashInit, hashUpdates, hashFinalize, + hashDigestSize, + digestFromByteString, + + AeadState, + Nonce, nonce8, nonce12, + Auth(..), authTag, + aeadInitialize, aeadAppendAAD, + aeadFinalize, aeadFinalizeAAD, + encrypt, decrypt, + + EdPublicKey, EdSecretKey, EdSignature, + edPublicKey, edSecretKey, edGenerateSecretKey, edToPublic, + edSignature, edSign, edVerify, + CxPublicKey, CxSecretKey, DhSecret, + cxPublicKey, cxSecretKey, cxGenerateSecretKey, cxToPublic, + diffieHellman, + + CryptoFailable(..), + maybeCryptoError, + throwCryptoErrorIO, +) where + +import Control.Monad + +import Crypto.Cipher.ChaChaPoly1305 qualified as C +import Crypto.Error +import Crypto.Hash +import Crypto.MAC.Poly1305 (Auth(..), authTag) +import Crypto.PubKey.Curve25519 qualified as Cx +import Crypto.PubKey.Ed25519 qualified as Ed +import Crypto.Random +import Crypto.Random.Entropy + +import Data.ByteArray qualified as BA +import Data.ByteString (ByteString) + +import ConvertByteString + + +instance ToByteString (Digest a) where + toByteString = BA.convert + withByteArray = BA.withByteArray + + +type AeadState = C.State + +type Nonce = C.Nonce + +nonce8 :: ByteString -> ByteString -> CryptoFailable Nonce +nonce8 = C.nonce8 + +nonce12 :: ByteString -> CryptoFailable Nonce +nonce12 = C.nonce12 + +aeadInitialize :: ScrubbedBytes -> Nonce -> CryptoFailable AeadState +aeadInitialize = C.initialize + +aeadAppendAAD :: ByteString -> AeadState -> AeadState +aeadAppendAAD = C.appendAAD + +aeadFinalizeAAD :: AeadState -> AeadState +aeadFinalizeAAD = C.finalizeAAD + +encrypt :: ByteString -> AeadState -> ( ByteString, AeadState ) +encrypt = C.encrypt + +decrypt :: ( ByteString, Auth ) -> AeadState -> Maybe ByteString +decrypt ( ctext, auth ) st = do + let ( plain, st' ) = C.decrypt ctext st + guard (C.finalize st' `BA.constEq` auth) + return plain + +aeadFinalize :: AeadState -> Auth +aeadFinalize = C.finalize + + +type EdPublicKey = Ed.PublicKey +type EdSecretKey = Ed.SecretKey +type EdSignature = Ed.Signature + +instance ToByteString EdSecretKey where + toByteString = BA.convert + withByteArray = BA.withByteArray + +edPublicKey :: ByteString -> CryptoFailable EdPublicKey +edPublicKey = Ed.publicKey + +edSecretKey :: ScrubbedBytes -> CryptoFailable EdSecretKey +edSecretKey = Ed.secretKey + +edGenerateSecretKey :: IO EdSecretKey +edGenerateSecretKey = Ed.generateSecretKey + +edToPublic :: EdSecretKey -> EdPublicKey +edToPublic = Ed.toPublic + +edSignature :: ByteString -> CryptoFailable EdSignature +edSignature = Ed.signature + +edSign :: ToByteString ba => EdSecretKey -> EdPublicKey -> ba -> EdSignature +edSign skey pkey content = Ed.sign skey pkey (toByteString content) + +edVerify :: ToByteString ba => EdPublicKey -> ba -> EdSignature -> Bool +edVerify pkey content sig = Ed.verify pkey (toByteString content) sig + +type CxPublicKey = Cx.PublicKey +type CxSecretKey = Cx.SecretKey +type DhSecret = Cx.DhSecret + +instance ToByteString CxSecretKey where + toByteString = BA.convert + withByteArray = BA.withByteArray + +instance ToByteString DhSecret where + toByteString = BA.convert + withByteArray = BA.withByteArray + +cxPublicKey :: ByteString -> CryptoFailable CxPublicKey +cxPublicKey = Cx.publicKey + +cxSecretKey :: ScrubbedBytes -> CryptoFailable CxSecretKey +cxSecretKey = Cx.secretKey + +cxGenerateSecretKey :: IO CxSecretKey +cxGenerateSecretKey = Cx.generateSecretKey + +cxToPublic :: CxSecretKey -> CxPublicKey +cxToPublic = Cx.toPublic + +diffieHellman :: CxPublicKey -> CxSecretKey -> DhSecret +diffieHellman = Cx.dh |