git.iko.soy/rowtype-yoga/purescript-yoga-subtlecrypto
on master help sign in
keypair support
commit258b3dd27d71e9822e329b7a27cc188a095819b2 authorAthan Clark <athan.clark@localcooking.com> dateThu 17 Jan 2019, 02:13 (8 years ago) parent00331fb
4 files changed+236−53
src/Crypto/Subtle/Key/Generate.purs+22−10 src/Crypto/Subtle/Key/Types.purs+14−10 test.browser.js+151−25 test/Main.purs+49−8
src/Crypto/Subtle/Key/Generate.purs+22−10
@@ -1,9 +1,11 @@
11module Crypto.Subtle.Key.Generate
2− ( generateKey
3− , GenerateAlgorithm, exp65537, rsa, ec, hmac, aes
2+ ( generateKey, generateKeyPair
3+ , AsymmetricAlgorithm, rsa, ec
4+ , SymmetricAlgorithm, hmac, aes
5+ , exp65537
46 ) where
57
6−import Crypto.Subtle.Key.Types (CryptoKey, CryptoKeyUsage)
8+import Crypto.Subtle.Key.Types (CryptoKey, CryptoKeyPair, CryptoKeyUsage)
79import Crypto.Subtle.Hash (HashingFunction)
810import Crypto.Subtle.Constants.RSA (RSAAlgorithm)
911import Crypto.Subtle.Constants.EC (ECAlgorithm, ECCurve)
@@ -19,18 +21,28 @@ import Unsafe.Coerce (unsafeCoerce)
1921
2022
2123
22−foreign import generateKeyImpl :: Fn3 GenerateAlgorithm Boolean (Array CryptoKeyUsage) (Promise CryptoKey)
24+foreign import generateKeyImpl :: forall a b. Fn3 a Boolean (Array CryptoKeyUsage) (Promise b)
2325
2426
25−generateKey :: GenerateAlgorithm
27+-- | Generate a symmetric key
28+generateKey :: SymmetricAlgorithm
2629 -> Boolean -- ^ Extractable
2730 -> Array CryptoKeyUsage
2831 -> Aff CryptoKey
2932generateKey a e u = makeAff \resolve ->
3033 nonCanceler <$ runPromise (resolve <<< Right) (resolve <<< Left) (runFn3 generateKeyImpl a e u)
3134
35+-- | Generate an asymmetric keypair
36+generateKeyPair :: AsymmetricAlgorithm
37+ -> Boolean -- ^ Extractable
38+ -> Array CryptoKeyUsage
39+ -> Aff CryptoKeyPair
40+generateKeyPair a e u = makeAff \resolve ->
41+ nonCanceler <$ runPromise (resolve <<< Right) (resolve <<< Left) (runFn3 generateKeyImpl a e u)
42+
3243
33−foreign import data GenerateAlgorithm :: Type
44+foreign import data SymmetricAlgorithm :: Type
45+foreign import data AsymmetricAlgorithm :: Type
3446
3547
3648foreign import exp65537 :: Uint8Array
@@ -40,16 +52,16 @@ rsa :: RSAAlgorithm
4052 -> Int -- ^ Modulus length. Should be at least 2048, or 4096 according to some bozo
4153 -> Uint8Array -- ^ Public exponent. Just use `exp65537`.
4254 -> HashingFunction
43− -> GenerateAlgorithm
55+ -> AsymmetricAlgorithm
4456rsa r l e h = unsafeCoerce {name: r, modulusLength: l, publicExponent: e, hash: h}
4557
46−ec :: ECAlgorithm -> ECCurve -> GenerateAlgorithm
58+ec :: ECAlgorithm -> ECCurve -> AsymmetricAlgorithm
4759ec e c = unsafeCoerce {name: e, namedCurve: c}
4860
49−hmac :: HashingFunction -> GenerateAlgorithm
61+hmac :: HashingFunction -> SymmetricAlgorithm
5062hmac h = unsafeCoerce {name: "HMAC", hash: h}
5163
5264aes :: AESAlgorithm
5365 -> AESBitLength
54− -> GenerateAlgorithm
66+ -> SymmetricAlgorithm
5567aes a l = unsafeCoerce {name: a, length: l}
src/Crypto/Subtle/Key/Types.purs+14−10
@@ -6,6 +6,7 @@ module Crypto.Subtle.Key.Types
66 , CryptoKey
77 , getType, getExtractable, getAlgorithm, getUsages
88 , exportKey
9+ , CryptoKeyPair (..)
910 , ExternalFormat, raw, pkcs8, spki, jwk
1011 ) where
1112
@@ -17,6 +18,7 @@ import Data.ArrayBuffer.Types (ArrayBuffer)
1718import Foreign (Foreign)
1819import Effect.Aff (Aff, makeAff, nonCanceler)
1920import Effect.Promise (Promise, runPromise)
21+import Unsafe.Coerce (unsafeCoerce)
2022
2123
2224-- TODO enumerate different key types - public, secret, etc.
@@ -48,25 +50,27 @@ allUsages = [encrypt, decrypt, sign, verify, deriveKey, deriveBits, wrapKey, unw
4850
4951
5052
51−newtype CryptoKey = CryptoKey
52− { "type" :: CryptoKeyType
53− , extractable :: Boolean
54− , algorithm :: Foreign
55− , usages :: Array CryptoKeyUsage
56− }
53+foreign import data CryptoKey :: Type
5754
5855
5956getType :: CryptoKey -> CryptoKeyType
60−getType (CryptoKey r) = r."type"
57+getType r = (unsafeCoerce r)."type"
6158
6259getExtractable :: CryptoKey -> Boolean
63−getExtractable (CryptoKey r) = r.extractable
60+getExtractable r = (unsafeCoerce r).extractable
6461
6562getAlgorithm :: CryptoKey -> Foreign
66−getAlgorithm (CryptoKey r) = r.algorithm
63+getAlgorithm r = (unsafeCoerce r).algorithm
6764
6865getUsages :: CryptoKey -> Array CryptoKeyUsage
69−getUsages (CryptoKey r) = r.usages
66+getUsages r = (unsafeCoerce r).usages
67+
68+
69+newtype CryptoKeyPair = CryptoKeyPair
70+ { privateKey :: CryptoKey
71+ , publicKey :: CryptoKey
72+ }
73+
7074
7175
7276
test.browser.js+151−25
@@ -286,6 +286,16 @@ var PS = {};
286286 exports["p384"] = p384;
287287 exports["p521"] = p521;
288288})(PS["Crypto.Subtle.Constants.EC"] = PS["Crypto.Subtle.Constants.EC"] || {});
289+(function(exports) {
290+ // Generated by purs version 0.12.0
291+ "use strict";
292+ var rsaPSS = "RSA-PSS";
293+ var rsaPKCS1 = "RSASSA-PKCS1-v1_5";
294+ var rsaOAEP = "RSA-OAEP";
295+ exports["rsaPKCS1"] = rsaPKCS1;
296+ exports["rsaPSS"] = rsaPSS;
297+ exports["rsaOAEP"] = rsaOAEP;
298+})(PS["Crypto.Subtle.Constants.RSA"] = PS["Crypto.Subtle.Constants.RSA"] || {});
289299(function(exports) {
290300 "use strict";
291301
@@ -1699,6 +1709,7 @@ var PS = {};
16991709 exports.generateKeyImpl = function generateKeyImpl (a,e,u) {
17001710 return crypto.subtle.generateKey(a,e,u);
17011711 };
1712+ exports.exp65537 = new Uint8Array([0x01,0x00,0x01]);
17021713})(PS["Crypto.Subtle.Key.Generate"] = PS["Crypto.Subtle.Key.Generate"] || {});
17031714(function(exports) {
17041715 // Generated by purs version 0.12.0
@@ -1714,6 +1725,7 @@ var PS = {};
17141725 var Effect_Promise = PS["Effect.Promise"];
17151726 var Foreign = PS["Foreign"];
17161727 var Prelude = PS["Prelude"];
1728+ var Unsafe_Coerce = PS["Unsafe.Coerce"];
17171729 var wrapKey = "wrapKey";
17181730 var verify = "verify";
17191731 var unwrapKey = "unwrapKey";
@@ -1751,21 +1763,50 @@ var PS = {};
17511763 var Effect_Aff = PS["Effect.Aff"];
17521764 var Effect_Promise = PS["Effect.Promise"];
17531765 var Prelude = PS["Prelude"];
1754− var Unsafe_Coerce = PS["Unsafe.Coerce"];
1766+ var Unsafe_Coerce = PS["Unsafe.Coerce"];
1767+ var rsa = function (r) {
1768+ return function (l) {
1769+ return function (e) {
1770+ return function (h) {
1771+ return {
1772+ name: r,
1773+ modulusLength: l,
1774+ publicExponent: e,
1775+ hash: h
1776+ };
1777+ };
1778+ };
1779+ };
1780+ };
17551781 var hmac = function (h) {
17561782 return {
17571783 name: "HMAC",
17581784 hash: h
17591785 };
17601786 };
1787+ var generateKeyPair = function (a) {
1788+ return function (e) {
1789+ return function (u) {
1790+ return Effect_Aff.makeAff(function (resolve) {
1791+ return Data_Functor.voidRight(Effect.functorEffect)(Effect_Aff.nonCanceler)(Effect_Promise.runPromise(function ($2) {
1792+ return resolve(Data_Either.Right.create($2));
1793+ })(function ($3) {
1794+ return resolve(Data_Either.Left.create($3));
1795+ })(function (dictDeferred) {
1796+ return $foreign.generateKeyImpl(a, e, u);
1797+ }));
1798+ });
1799+ };
1800+ };
1801+ };
17611802 var generateKey = function (a) {
17621803 return function (e) {
17631804 return function (u) {
17641805 return Effect_Aff.makeAff(function (resolve) {
1765− return Data_Functor.voidRight(Effect.functorEffect)(Effect_Aff.nonCanceler)(Effect_Promise.runPromise(function ($1) {
1766− return resolve(Data_Either.Right.create($1));
1767− })(function ($2) {
1768− return resolve(Data_Either.Left.create($2));
1806+ return Data_Functor.voidRight(Effect.functorEffect)(Effect_Aff.nonCanceler)(Effect_Promise.runPromise(function ($4) {
1807+ return resolve(Data_Either.Right.create($4));
1808+ })(function ($5) {
1809+ return resolve(Data_Either.Left.create($5));
17691810 })(function (dictDeferred) {
17701811 return $foreign.generateKeyImpl(a, e, u);
17711812 }));
@@ -1790,9 +1831,12 @@ var PS = {};
17901831 };
17911832 };
17921833 exports["generateKey"] = generateKey;
1834+ exports["generateKeyPair"] = generateKeyPair;
1835+ exports["rsa"] = rsa;
17931836 exports["ec"] = ec;
17941837 exports["hmac"] = hmac;
17951838 exports["aes"] = aes;
1839+ exports["exp65537"] = $foreign.exp65537;
17961840})(PS["Crypto.Subtle.Key.Generate"] = PS["Crypto.Subtle.Key.Generate"] || {});
17971841(function(exports) {
17981842 "use strict";
@@ -1821,6 +1865,7 @@ var PS = {};
18211865 var Control_Semigroupoid = PS["Control.Semigroupoid"];
18221866 var Crypto_Subtle_Constants_AES = PS["Crypto.Subtle.Constants.AES"];
18231867 var Crypto_Subtle_Constants_EC = PS["Crypto.Subtle.Constants.EC"];
1868+ var Crypto_Subtle_Constants_RSA = PS["Crypto.Subtle.Constants.RSA"];
18241869 var Crypto_Subtle_Hash = PS["Crypto.Subtle.Hash"];
18251870 var Crypto_Subtle_Key_Generate = PS["Crypto.Subtle.Key.Generate"];
18261871 var Crypto_Subtle_Key_Types = PS["Crypto.Subtle.Key.Types"];
@@ -1833,8 +1878,8 @@ var PS = {};
18331878 var Effect_Exception = PS["Effect.Exception"];
18341879 var Prelude = PS["Prelude"];
18351880 var Unsafe_Coerce = PS["Unsafe.Coerce"];
1836− var log$prime = function ($23) {
1837− return Effect_Class.liftEffect(Effect_Aff.monadEffectAff)(Effect_Console.log($23));
1881+ var log$prime = function ($45) {
1882+ return Effect_Class.liftEffect(Effect_Aff.monadEffectAff)(Effect_Console.log($45));
18381883 };
18391884 var main = (function () {
18401885 var resolve = function (eX) {
@@ -1844,7 +1889,7 @@ var PS = {};
18441889 if (eX instanceof Data_Either.Right) {
18451890 return Control_Applicative.pure(Effect.applicativeEffect)(Data_Unit.unit);
18461891 };
1847− throw new Error("Failed pattern match at Test.Main line 23, column 20 - line 25, column 29: " + [ eX.constructor.name ]);
1892+ throw new Error("Failed pattern match at Test.Main line 24, column 20 - line 26, column 29: " + [ eX.constructor.name ]);
18481893 };
18491894 return Effect_Aff.runAff_(resolve)(Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime("Generating Keys..."))(function () {
18501895 return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)((function () {
@@ -1908,29 +1953,110 @@ var PS = {};
19081953 });
19091954 });
19101955 }))(function () {
1911− var genEC = function (alg) {
1912− return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(Control_Bind.bind(Effect_Aff.bindAff)(Crypto_Subtle_Key_Generate.generateKey(Crypto_Subtle_Key_Generate.ec(alg)(Crypto_Subtle_Constants_EC.p256))(true)(Crypto_Subtle_Key_Types.allUsages))(function (v) {
1913− return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - P-256"))(function () {
1914− return log$prime(v);
1915− });
1916− }))(function () {
1917− return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(Control_Bind.bind(Effect_Aff.bindAff)(Crypto_Subtle_Key_Generate.generateKey(Crypto_Subtle_Key_Generate.ec(alg)(Crypto_Subtle_Constants_EC.p384))(true)(Crypto_Subtle_Key_Types.allUsages))(function (v) {
1918− return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - P-384"))(function () {
1919− return log$prime(v);
1956+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)((function () {
1957+ var genEC = function (alg) {
1958+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(Control_Bind.bind(Effect_Aff.bindAff)(Crypto_Subtle_Key_Generate.generateKeyPair(Crypto_Subtle_Key_Generate.ec(alg)(Crypto_Subtle_Constants_EC.p256))(true)(Crypto_Subtle_Key_Types.allUsages))(function (v) {
1959+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - P-256"))(function () {
1960+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - privateKey"))(function () {
1961+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(v.privateKey))(function () {
1962+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - publicKey"))(function () {
1963+ return log$prime(v.publicKey);
1964+ });
1965+ });
1966+ });
19201967 });
19211968 }))(function () {
1922− return Control_Bind.bind(Effect_Aff.bindAff)(Crypto_Subtle_Key_Generate.generateKey(Crypto_Subtle_Key_Generate.ec(alg)(Crypto_Subtle_Constants_EC.p521))(true)(Crypto_Subtle_Key_Types.allUsages))(function (v) {
1923− return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - P-521"))(function () {
1924− return log$prime(v);
1969+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(Control_Bind.bind(Effect_Aff.bindAff)(Crypto_Subtle_Key_Generate.generateKeyPair(Crypto_Subtle_Key_Generate.ec(alg)(Crypto_Subtle_Constants_EC.p384))(true)(Crypto_Subtle_Key_Types.allUsages))(function (v) {
1970+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - P-384"))(function () {
1971+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - privateKey"))(function () {
1972+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(v.privateKey))(function () {
1973+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - publicKey"))(function () {
1974+ return log$prime(v.publicKey);
1975+ });
1976+ });
1977+ });
19251978 });
1979+ }))(function () {
1980+ return Control_Bind.bind(Effect_Aff.bindAff)(Crypto_Subtle_Key_Generate.generateKeyPair(Crypto_Subtle_Key_Generate.ec(alg)(Crypto_Subtle_Constants_EC.p521))(true)(Crypto_Subtle_Key_Types.allUsages))(function (v) {
1981+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - P-521"))(function () {
1982+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - privateKey"))(function () {
1983+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(v.privateKey))(function () {
1984+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - publicKey"))(function () {
1985+ return log$prime(v.publicKey);
1986+ });
1987+ });
1988+ });
1989+ });
1990+ });
1991+ });
1992+ });
1993+ };
1994+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime("- ECDSA"))(function () {
1995+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(genEC(Crypto_Subtle_Constants_EC.ecdsa))(function () {
1996+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime("- ECDH"))(function () {
1997+ return genEC(Crypto_Subtle_Constants_EC.ecdh);
19261998 });
19271999 });
19282000 });
1929− };
1930− return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime("- ECDSA"))(function () {
1931− return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(genEC(Crypto_Subtle_Constants_EC.ecdsa))(function () {
1932− return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime("- ECDH"))(function () {
1933− return genEC(Crypto_Subtle_Constants_EC.ecdh);
2001+ })())(function () {
2002+ var genRSA = function (alg) {
2003+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(Control_Bind.bind(Effect_Aff.bindAff)(Crypto_Subtle_Key_Generate.generateKeyPair(Crypto_Subtle_Key_Generate.rsa(alg)(2048)(Crypto_Subtle_Key_Generate.exp65537)(Crypto_Subtle_Hash.sha1))(true)(Crypto_Subtle_Key_Types.allUsages))(function (v) {
2004+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - SHA-1"))(function () {
2005+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - privateKey"))(function () {
2006+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(v.privateKey))(function () {
2007+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - publicKey"))(function () {
2008+ return log$prime(v.publicKey);
2009+ });
2010+ });
2011+ });
2012+ });
2013+ }))(function () {
2014+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(Control_Bind.bind(Effect_Aff.bindAff)(Crypto_Subtle_Key_Generate.generateKeyPair(Crypto_Subtle_Key_Generate.rsa(alg)(2048)(Crypto_Subtle_Key_Generate.exp65537)(Crypto_Subtle_Hash.sha256))(true)(Crypto_Subtle_Key_Types.allUsages))(function (v) {
2015+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - SHA-256"))(function () {
2016+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - privateKey"))(function () {
2017+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(v.privateKey))(function () {
2018+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - publicKey"))(function () {
2019+ return log$prime(v.publicKey);
2020+ });
2021+ });
2022+ });
2023+ });
2024+ }))(function () {
2025+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(Control_Bind.bind(Effect_Aff.bindAff)(Crypto_Subtle_Key_Generate.generateKeyPair(Crypto_Subtle_Key_Generate.rsa(alg)(2048)(Crypto_Subtle_Key_Generate.exp65537)(Crypto_Subtle_Hash.sha384))(true)(Crypto_Subtle_Key_Types.allUsages))(function (v) {
2026+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - SHA-384"))(function () {
2027+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - privateKey"))(function () {
2028+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(v.privateKey))(function () {
2029+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - publicKey"))(function () {
2030+ return log$prime(v.publicKey);
2031+ });
2032+ });
2033+ });
2034+ });
2035+ }))(function () {
2036+ return Control_Bind.bind(Effect_Aff.bindAff)(Crypto_Subtle_Key_Generate.generateKeyPair(Crypto_Subtle_Key_Generate.rsa(alg)(2048)(Crypto_Subtle_Key_Generate.exp65537)(Crypto_Subtle_Hash.sha512))(true)(Crypto_Subtle_Key_Types.allUsages))(function (v) {
2037+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - SHA-512"))(function () {
2038+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - privateKey"))(function () {
2039+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(v.privateKey))(function () {
2040+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime(" - publicKey"))(function () {
2041+ return log$prime(v.publicKey);
2042+ });
2043+ });
2044+ });
2045+ });
2046+ });
2047+ });
2048+ });
2049+ });
2050+ };
2051+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime("- RSASSA-PKCS1-v1_5"))(function () {
2052+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(genRSA(Crypto_Subtle_Constants_RSA.rsaPKCS1))(function () {
2053+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime("- RSA-PSS"))(function () {
2054+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(genRSA(Crypto_Subtle_Constants_RSA.rsaPSS))(function () {
2055+ return Control_Bind.discard(Control_Bind.discardUnit)(Effect_Aff.bindAff)(log$prime("- RSA-OAEP"))(function () {
2056+ return genRSA(Crypto_Subtle_Constants_RSA.rsaOAEP);
2057+ });
2058+ });
2059+ });
19342060 });
19352061 });
19362062 });
test/Main.purs+49−8
@@ -1,8 +1,9 @@
11module Test.Main where
22
3−import Crypto.Subtle.Key.Types (allUsages)
4−import Crypto.Subtle.Key.Generate (generateKey, aes, hmac, ec, rsa)
3+import Crypto.Subtle.Key.Types (allUsages, CryptoKeyPair (..))
4+import Crypto.Subtle.Key.Generate (generateKey, generateKeyPair, aes, hmac, ec, rsa, exp65537)
55import Crypto.Subtle.Constants.AES as AES
6+import Crypto.Subtle.Constants.RSA as RSA
67import Crypto.Subtle.Constants.EC as EC
78import Crypto.Subtle.Hash as Hash
89
@@ -57,19 +58,59 @@ main = do
5758 log' " - SHA-512"
5859 log' (unsafeCoerce k)
5960 do let genEC alg = do
60− do k <- generateKey (ec alg EC.p256) true allUsages
61+ do CryptoKeyPair {privateKey,publicKey} <- generateKeyPair (ec alg EC.p256) true allUsages
6162 log' " - P-256"
62− log' (unsafeCoerce k)
63− do k <- generateKey (ec alg EC.p384) true allUsages
63+ log' " - privateKey"
64+ log' (unsafeCoerce privateKey)
65+ log' " - publicKey"
66+ log' (unsafeCoerce publicKey)
67+ do CryptoKeyPair {privateKey,publicKey} <- generateKeyPair (ec alg EC.p384) true allUsages
6468 log' " - P-384"
65− log' (unsafeCoerce k)
66− do k <- generateKey (ec alg EC.p521) true allUsages
69+ log' " - privateKey"
70+ log' (unsafeCoerce privateKey)
71+ log' " - publicKey"
72+ log' (unsafeCoerce publicKey)
73+ do CryptoKeyPair {privateKey,publicKey} <- generateKeyPair (ec alg EC.p521) true allUsages
6774 log' " - P-521"
68− log' (unsafeCoerce k)
75+ log' " - privateKey"
76+ log' (unsafeCoerce privateKey)
77+ log' " - publicKey"
78+ log' (unsafeCoerce publicKey)
6979 log' "- ECDSA"
7080 genEC EC.ecdsa
7181 log' "- ECDH"
7282 genEC EC.ecdh
83+ do let genRSA alg = do
84+ do CryptoKeyPair {privateKey,publicKey} <- generateKeyPair (rsa alg 2048 exp65537 Hash.sha1) true allUsages
85+ log' " - SHA-1"
86+ log' " - privateKey"
87+ log' (unsafeCoerce privateKey)
88+ log' " - publicKey"
89+ log' (unsafeCoerce publicKey)
90+ do CryptoKeyPair {privateKey,publicKey} <- generateKeyPair (rsa alg 2048 exp65537 Hash.sha256) true allUsages
91+ log' " - SHA-256"
92+ log' " - privateKey"
93+ log' (unsafeCoerce privateKey)
94+ log' " - publicKey"
95+ log' (unsafeCoerce publicKey)
96+ do CryptoKeyPair {privateKey,publicKey} <- generateKeyPair (rsa alg 2048 exp65537 Hash.sha384) true allUsages
97+ log' " - SHA-384"
98+ log' " - privateKey"
99+ log' (unsafeCoerce privateKey)
100+ log' " - publicKey"
101+ log' (unsafeCoerce publicKey)
102+ do CryptoKeyPair {privateKey,publicKey} <- generateKeyPair (rsa alg 2048 exp65537 Hash.sha512) true allUsages
103+ log' " - SHA-512"
104+ log' " - privateKey"
105+ log' (unsafeCoerce privateKey)
106+ log' " - publicKey"
107+ log' (unsafeCoerce publicKey)
108+ log' "- RSASSA-PKCS1-v1_5"
109+ genRSA RSA.rsaPKCS1
110+ log' "- RSA-PSS"
111+ genRSA RSA.rsaPSS
112+ log' "- RSA-OAEP"
113+ genRSA RSA.rsaOAEP
73114
74115
75116log' :: String -> Aff Unit