diff options
Diffstat (limited to 'src/crypto/crypton/Crypto.hs')
| -rw-r--r-- | src/crypto/crypton/Crypto.hs | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/crypto/crypton/Crypto.hs b/src/crypto/crypton/Crypto.hs new file mode 100644 index 0000000..7c98088 --- /dev/null +++ b/src/crypto/crypton/Crypto.hs @@ -0,0 +1,118 @@ +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 +import Data.ByteString (ByteString) + + +type AeadState = C.State + +type Nonce = C.Nonce + +nonce8 :: Bytes -> Bytes -> CryptoFailable Nonce +nonce8 = C.nonce8 + +nonce12 :: Bytes -> 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 :: ByteArray ba => ba -> AeadState -> ( ba, AeadState ) +encrypt = C.encrypt + +decrypt :: ByteArray ba => ( ba, Auth ) -> AeadState -> Maybe ba +decrypt ( ctext, auth ) st = do + let ( plain, st' ) = C.decrypt ctext st + guard (C.finalize st' `constEq` auth) + return plain + +aeadFinalize :: AeadState -> Auth +aeadFinalize = C.finalize + + +type EdPublicKey = Ed.PublicKey +type EdSecretKey = Ed.SecretKey +type EdSignature = Ed.Signature + +edPublicKey :: ByteString -> CryptoFailable EdPublicKey +edPublicKey = Ed.publicKey + +edSecretKey :: ByteArrayAccess ba => ba -> 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 :: ByteArrayAccess ba => EdSecretKey -> EdPublicKey -> ba -> EdSignature +edSign = Ed.sign + +edVerify :: ByteArrayAccess ba => EdPublicKey -> ba -> EdSignature -> Bool +edVerify = Ed.verify + +type CxPublicKey = Cx.PublicKey +type CxSecretKey = Cx.SecretKey +type DhSecret = Cx.DhSecret + +cxPublicKey :: ByteString -> CryptoFailable CxPublicKey +cxPublicKey = Cx.publicKey + +cxSecretKey :: ByteArrayAccess ba => ba -> CryptoFailable CxSecretKey +cxSecretKey = Cx.secretKey + +cxGenerateSecretKey :: IO CxSecretKey +cxGenerateSecretKey = Cx.generateSecretKey + +cxToPublic :: CxSecretKey -> CxPublicKey +cxToPublic = Cx.toPublic + +diffieHellman :: CxPublicKey -> CxSecretKey -> DhSecret +diffieHellman = Cx.dh |