git.iko.soy/rowtype-yoga/purescript-yoga-subtlecrypto
on master help sign in
generate
commitefd3d3b84ac25ed78f91c896c68488e4edc0ae33 authorAthan Clark <athan.clark@localcooking.com> dateWed 16 Jan 2019, 04:23 (8 years ago) parent9eef815
2 files changed+69
src/Crypto/Subtle/Key/Generate.js+4 src/Crypto/Subtle/Key/Generate.purs+65
src/Crypto/Subtle/Key/Generate.jsnew file+4
@@ -0,0 +1,4 @@
1+"use strict";
2+
3+exports.generateKeyImpl = crypto.subtle.generateKey;
4+exports.exp65537 = new Uint8Array([0x01,0x00,0x01]);
src/Crypto/Subtle/Key/Generate.pursnew file+65
@@ -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}