summaryrefslogtreecommitdiff
path: root/src/crypto/crypton/Crypto.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/crypto/crypton/Crypto.hs')
-rw-r--r--src/crypto/crypton/Crypto.hs118
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