@@ -0,0 +1,65 @@
1+module Crypto.Subtle.Key.Generate
2+ ( generateKey
3+ , GenerateAlgorithm, exp65537, rsa, ec, hmac, aes
4+ , AESBitLength, l128, l192, l256
5+ ) where
6+
7+import Crypto.Subtle.Key.Types (CryptoKey, CryptoKeyUsage)
8+import Crypto.Subtle.Hash (HashingFunction)
9+import Crypto.Subtle.RSA (RSAAlgorithm)
10+import Crypto.Subtle.EC (ECAlgorithm, ECCurve)
11+import Crypto.Subtle.AES (AESAlgorithm)
12+
13+import Prelude ((<<<), (<$))
14+import Data.Function.Uncurried (Fn3, runFn3)
15+import Data.ArrayBuffer.Types (Uint8Array)
16+import Data.Either (Either (..))
17+import Effect.Promise (Promise, runPromise)
18+import Effect.Aff (Aff, makeAff, nonCanceler)
19+import Unsafe.Coerce (unsafeCoerce)
20+
21+
22+
23+foreign import generateKeyImpl :: Fn3 GenerateAlgorithm Boolean (Array CryptoKeyUsage) (Promise CryptoKey)
24+
25+
26+generateKey :: GenerateAlgorithm
27+ -> Boolean -- ^ Extractable
28+ -> Array CryptoKeyUsage
29+ -> Aff CryptoKey
30+generateKey a e u = makeAff \resolve ->
31+ nonCanceler <$ runPromise (resolve <<< Right) (resolve <<< Left) (runFn3 generateKeyImpl a e u)
32+
33+
34+foreign import data GenerateAlgorithm :: Type
35+
36+
37+foreign import exp65537 :: Uint8Array
38+
39+
40+rsa :: RSAAlgorithm
41+ -> Int -- ^ Modulus length. Should be at least 2048, or 4096 according to some bozo
42+ -> Uint8Array -- ^ Public exponent. Just use `exp65537`.
43+ -> HashingFunction
44+ -> GenerateAlgorithm
45+rsa r l e h = unsafeCoerce {name: r, modulusLength: l, publicExponent: e, hash: h}
46+
47+ec :: ECAlgorithm -> ECCurve -> GenerateAlgorithm
48+ec e c = unsafeCoerce {name: e, namedCurve: c}
49+
50+hmac :: HashingFunction -> GenerateAlgorithm
51+hmac h = unsafeCoerce {name: "HMAC", hash: h}
52+
53+
54+newtype AESBitLength = AESBitLength Int
55+
56+l128 :: AESBitLength
57+l128 = AESBitLength 128
58+l192 :: AESBitLength
59+l192 = AESBitLength 192
60+l256 :: AESBitLength
61+l256 = AESBitLength 256
62+
63+
64+aes :: AESAlgorithm -> AESBitLength -> GenerateAlgorithm
65+aes a l = unsafeCoerce {name: a, length: l}