summaryrefslogtreecommitdiff
path: root/src/crypto/crypton/Crypto.hs
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2026-10-18 10:13:30 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2026-10-23 23:26:21 +0200
commite45b366ca8b9caa4fe0087e5c4fb1720472d9c23 (patch)
tree284f7cca2d3d58482ea459bd3b80c585a0fa7c72 /src/crypto/crypton/Crypto.hs
parent552cb773ce9d8472530e123e926493b3dd1e658f (diff)
Refactor code to support multiple crypto backendsHEADmaster
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