@@ -0,0 +1,72 @@
1+module Crypto.Subtle.Encrypt
2+ ( encrypt, decrypt
3+ , EncryptAlgorithm, rsaOAEP, aesCTR, aesCBC, aesGCM, aesKW
4+ ) where
5+
6+import Crypto.Subtle.Key.Types (CryptoKey)
7+import Crypto.Subtle.AES (AESTagLength)
8+
9+import Prelude ((<<<), (<$))
10+import Data.Function.Uncurried (Fn3, runFn3)
11+import Data.Tuple (Tuple (..))
12+import Data.Maybe (Maybe (..))
13+import Data.Either (Either (..))
14+import Data.ArrayBuffer.Types (ArrayBuffer)
15+import Effect.Promise (Promise, runPromise)
16+import Effect.Aff (Aff, makeAff, nonCanceler)
17+import Unsafe.Coerce (unsafeCoerce)
18+
19+
20+
21+foreign import data EncryptAlgorithm :: Type
22+
23+rsaOAEP :: Maybe ArrayBuffer -- ^ Label
24+ -> EncryptAlgorithm
25+rsaOAEP mL = case mL of
26+ Nothing -> unsafeCoerce {name: "RSA_OAEP"}
27+ Just l -> unsafeCoerce {name: "RSA_OAEP", label: l}
28+
29+aesCTR :: ArrayBuffer -- ^ Counter
30+ -> Int -- ^ Counter length
31+ -> EncryptAlgorithm
32+aesCTR c l = unsafeCoerce {name: "AES-CTR", counter: c, length: l}
33+
34+aesCBC :: ArrayBuffer -- ^ Initialization vector
35+ -> EncryptAlgorithm
36+aesCBC i = unsafeCoerce {name: "AES-CBC", iv: i}
37+
38+aesGCM :: ArrayBuffer -- ^ Initialization vector
39+ -> Maybe ArrayBuffer -- ^ Additional data
40+ -> Maybe AESTagLength -- ^ Tag length
41+ -> EncryptAlgorithm
42+aesGCM i mD mT = case Tuple mD mT of
43+ Tuple Nothing Nothing -> unsafeCoerce {name: "AES-GCM", iv: i}
44+ Tuple (Just d) (Just t) -> unsafeCoerce {name: "AES-GCM", iv: i, additionalData: d, tagLength: t}
45+ Tuple (Just d) Nothing -> unsafeCoerce {name: "AES-GCM", iv: i, additionalData: d}
46+ Tuple Nothing (Just t) -> unsafeCoerce {name: "AES-GCM", iv: i, tagLength: t}
47+
48+aesKW :: EncryptAlgorithm
49+aesKW = unsafeCoerce {name: "AES-KW"}
50+
51+
52+
53+
54+foreign import encryptImpl :: Fn3 EncryptAlgorithm CryptoKey ArrayBuffer (Promise ArrayBuffer)
55+
56+encrypt :: EncryptAlgorithm
57+ -> CryptoKey
58+ -> ArrayBuffer
59+ -> Aff ArrayBuffer
60+encrypt a k x = makeAff \resolve ->
61+ nonCanceler <$ runPromise (resolve <<< Right) (resolve <<< Left) (runFn3 encryptImpl a k x)
62+
63+
64+
65+foreign import decryptImpl :: Fn3 EncryptAlgorithm CryptoKey ArrayBuffer (Promise ArrayBuffer)
66+
67+decrypt :: EncryptAlgorithm
68+ -> CryptoKey
69+ -> ArrayBuffer
70+ -> Aff (Maybe ArrayBuffer)
71+decrypt a k x = makeAff \resolve ->
72+ nonCanceler <$ runPromise (resolve <<< Right <<< Just) (\_ -> resolve (Right Nothing)) (runFn3 decryptImpl a k x)