@@ -5,17 +5,14 @@ module Crypto.Subtle.Key.Derive
55 , DeriveTargetAlgorithm, hmac, aes
66 ) where
77
8−import Crypto.Subtle.Key.Types (CryptoKey, CryptoKeyUsage)
9−import Crypto.Subtle.Hash (HashingFunction)
10−import Crypto.Subtle.Constants.EC (ECAlgorithm)
8+import Control.Promise (Promise, toAff')
119import Crypto.Subtle.Constants.AES (AESAlgorithm, AESBitLength)
12−
13−import Prelude ((<<<), (<$))
14−import Data.Function.Uncurried (Fn3, Fn5, runFn3, runFn5)
10+import Crypto.Subtle.Constants.EC (ECAlgorithm)
11+import Crypto.Subtle.Hash (HashingFunction)
12+import Crypto.Subtle.Key.Types (CryptoKey, CryptoKeyUsage, errorFromDOMException)
1513import Data.ArrayBuffer.Types (ArrayBuffer)
16−import Data.Either (Either (..))
17−import Effect.Promise (Promise, runPromise)
18−import Effect.Aff (Aff, makeAff, nonCanceler)
14+import Data.Function.Uncurried (Fn3, Fn5, runFn3, runFn5)
15+import Effect.Aff (Aff)
1916import Unsafe.Coerce (unsafeCoerce)
2017
2118
@@ -24,38 +21,41 @@ foreign import deriveKeyImpl :: Fn5 DeriveAlgorithm CryptoKey DeriveTargetAlgori
2421foreign import deriveBitsImpl :: Fn3 DeriveAlgorithm CryptoKey Int (Promise ArrayBuffer)
2522
2623
24+-- | https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey
2725deriveKey :: DeriveAlgorithm
2826 -> CryptoKey -- ^ Base key
2927 -> DeriveTargetAlgorithm
3028 -> Boolean -- ^ Extractable
3129 -> Array CryptoKeyUsage
3230 -> Aff CryptoKey
33−deriveKey a k t e u = makeAff \resolve ->
34− nonCanceler <$ runPromise (resolve <<< Right) (resolve <<< Left) (runFn5 deriveKeyImpl a k t e u)
31+deriveKey a k t e u = toAff' errorFromDOMException (runFn5 deriveKeyImpl a k t e u)
3532
33+-- | https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveBits
3634deriveBits :: DeriveAlgorithm
3735 -> CryptoKey -- ^ Base key
3836 -> Int -- ^ Length in bits
3937 -> Aff ArrayBuffer
40−deriveBits a k l = makeAff \resolve ->
41− nonCanceler <$ runPromise (resolve <<< Right) (resolve <<< Left) (runFn3 deriveBitsImpl a k l)
38+deriveBits a k l = toAff' errorFromDOMException (runFn3 deriveBitsImpl a k l)
4239
4340
4441foreign import data DeriveAlgorithm :: Type
4542foreign import data DeriveTargetAlgorithm :: Type
4643
4744
45+-- | https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey#ecdh
4846ec :: ECAlgorithm
4947 -> CryptoKey -- ^ Public key of the other entity
5048 -> DeriveAlgorithm
5149ec e k = unsafeCoerce {name: e, public: k}
5250
51+-- | https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey#hkdf
5352hkdf :: HashingFunction
5453 -> ArrayBuffer -- ^ Salt
5554 -> ArrayBuffer -- ^ Info
5655 -> DeriveAlgorithm
5756hkdf h s i = unsafeCoerce {name: "HKDF", hash: h, salt: s, info: i}
5857
58+-- | https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey#pbkdf2
5959pbkdf2 :: HashingFunction
6060 -> ArrayBuffer -- ^ Salt
6161 -> Int -- ^ Iterations
@@ -65,8 +65,10 @@ pbkdf2 h s i = unsafeCoerce {name: "PBKDF2", hash: h, salt: s, iterations: i}
6565
6666
6767
68+-- | https://developer.mozilla.org/en-US/docs/Web/API/HmacKeyGenParams
6869hmac :: HashingFunction -> DeriveTargetAlgorithm
6970hmac h = unsafeCoerce {name: "HMAC", hash: h}
7071
72+-- | https://developer.mozilla.org/en-US/docs/Web/API/AesKeyGenParams
7173aes :: AESAlgorithm -> AESBitLength -> DeriveTargetAlgorithm
7274aes a l = unsafeCoerce {name: a, length: l}