jose 5.10.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/README.md +15 -15
  2. package/dist/types/index.d.ts +5 -5
  3. package/dist/types/jwe/compact/decrypt.d.ts +4 -4
  4. package/dist/types/jwe/compact/encrypt.d.ts +4 -4
  5. package/dist/types/jwe/flattened/decrypt.d.ts +4 -4
  6. package/dist/types/jwe/flattened/encrypt.d.ts +6 -6
  7. package/dist/types/jwe/general/decrypt.d.ts +4 -4
  8. package/dist/types/jwe/general/encrypt.d.ts +7 -7
  9. package/dist/types/jwk/embedded.d.ts +2 -2
  10. package/dist/types/jwk/thumbprint.d.ts +5 -5
  11. package/dist/types/jwks/local.d.ts +2 -2
  12. package/dist/types/jwks/remote.d.ts +104 -25
  13. package/dist/types/jws/compact/sign.d.ts +4 -4
  14. package/dist/types/jws/compact/verify.d.ts +4 -4
  15. package/dist/types/jws/flattened/sign.d.ts +4 -4
  16. package/dist/types/jws/flattened/verify.d.ts +4 -4
  17. package/dist/types/jws/general/sign.d.ts +6 -6
  18. package/dist/types/jws/general/verify.d.ts +4 -4
  19. package/dist/types/jwt/decrypt.d.ts +5 -5
  20. package/dist/types/jwt/encrypt.d.ts +4 -4
  21. package/dist/types/jwt/produce.d.ts +3 -3
  22. package/dist/types/jwt/sign.d.ts +3 -3
  23. package/dist/types/jwt/unsecured.d.ts +5 -5
  24. package/dist/types/jwt/verify.d.ts +5 -5
  25. package/dist/types/key/export.d.ts +10 -12
  26. package/dist/types/key/generate_key_pair.d.ts +10 -11
  27. package/dist/types/key/generate_secret.d.ts +6 -9
  28. package/dist/types/key/import.d.ts +20 -27
  29. package/dist/types/types.d.ts +27 -29
  30. package/dist/types/util/decode_jwt.d.ts +2 -2
  31. package/dist/types/util/decode_protected_header.d.ts +2 -2
  32. package/dist/types/util/errors.d.ts +6 -6
  33. package/dist/{browser → webapi}/index.js +2 -2
  34. package/dist/{node/esm → webapi}/jwe/flattened/decrypt.js +8 -4
  35. package/dist/{node/esm → webapi}/jwe/flattened/encrypt.js +7 -3
  36. package/dist/{node/esm → webapi}/jwe/general/encrypt.js +8 -3
  37. package/dist/{node/esm → webapi}/jwk/thumbprint.js +18 -8
  38. package/dist/{node/esm → webapi}/jwks/local.js +1 -6
  39. package/dist/{node/esm → webapi}/jwks/remote.js +34 -6
  40. package/dist/{node/esm → webapi}/jws/flattened/sign.js +7 -5
  41. package/dist/{browser → webapi}/jws/flattened/verify.js +8 -14
  42. package/dist/{browser → webapi}/jwt/unsecured.js +1 -1
  43. package/dist/{node/esm → webapi}/key/export.js +2 -3
  44. package/dist/{browser/runtime/generate.js → webapi/key/generate_key_pair.js} +4 -57
  45. package/dist/webapi/key/generate_secret.js +40 -0
  46. package/dist/{browser → webapi}/key/import.js +8 -6
  47. package/dist/{node/esm → webapi}/lib/aesgcmkw.js +3 -3
  48. package/dist/{browser/runtime → webapi/lib}/aeskw.js +9 -16
  49. package/dist/{browser/runtime → webapi/lib}/asn1.js +24 -20
  50. package/dist/{browser/runtime → webapi/lib}/base64url.js +17 -9
  51. package/dist/{browser → webapi}/lib/buffer_utils.js +4 -19
  52. package/dist/{browser → webapi}/lib/cek.js +1 -2
  53. package/dist/{browser/runtime → webapi/lib}/check_cek_length.js +1 -2
  54. package/dist/{browser → webapi}/lib/check_iv_length.js +1 -2
  55. package/dist/webapi/lib/check_key_type.js +126 -0
  56. package/dist/{node/esm → webapi}/lib/crypto_key.js +9 -26
  57. package/dist/{browser/runtime → webapi/lib}/decrypt.js +26 -10
  58. package/dist/{node/esm → webapi}/lib/decrypt_key_management.js +22 -24
  59. package/dist/{browser/runtime → webapi/lib}/digest.js +1 -3
  60. package/dist/webapi/lib/ecdhes.js +46 -0
  61. package/dist/{browser/runtime → webapi/lib}/encrypt.js +8 -10
  62. package/dist/{node/esm → webapi}/lib/encrypt_key_management.js +26 -23
  63. package/dist/webapi/lib/get_sign_verify_key.js +12 -0
  64. package/dist/{node/esm → webapi}/lib/is_disjoint.js +1 -2
  65. package/dist/{browser → webapi}/lib/is_jwk.js +1 -1
  66. package/dist/webapi/lib/is_key_like.js +14 -0
  67. package/dist/{browser → webapi}/lib/is_object.js +2 -2
  68. package/dist/{node/esm → webapi}/lib/iv.js +1 -2
  69. package/dist/{browser/runtime → webapi/lib}/jwk_to_key.js +3 -13
  70. package/dist/webapi/lib/key_to_jwk.js +27 -0
  71. package/dist/webapi/lib/normalize_key.js +164 -0
  72. package/dist/webapi/lib/pbes2kw.js +37 -0
  73. package/dist/webapi/lib/rsaes.js +24 -0
  74. package/dist/{browser/runtime → webapi/lib}/sign.js +1 -3
  75. package/dist/{browser/runtime → webapi/lib}/subtle_dsa.js +4 -5
  76. package/dist/{browser → webapi}/lib/validate_algorithms.js +1 -2
  77. package/dist/{node/esm → webapi}/lib/validate_crit.js +3 -4
  78. package/dist/{browser/runtime → webapi/lib}/verify.js +1 -3
  79. package/dist/{node/esm → webapi}/util/base64url.js +1 -1
  80. package/package.json +36 -219
  81. package/dist/browser/jwe/compact/encrypt.js +0 -26
  82. package/dist/browser/jwe/flattened/decrypt.js +0 -161
  83. package/dist/browser/jwe/flattened/encrypt.js +0 -153
  84. package/dist/browser/jwe/general/encrypt.js +0 -174
  85. package/dist/browser/jwk/thumbprint.js +0 -53
  86. package/dist/browser/jwks/local.js +0 -124
  87. package/dist/browser/jwks/remote.js +0 -139
  88. package/dist/browser/jws/compact/sign.js +0 -17
  89. package/dist/browser/jws/flattened/sign.js +0 -81
  90. package/dist/browser/jws/general/sign.js +0 -67
  91. package/dist/browser/jwt/encrypt.js +0 -68
  92. package/dist/browser/jwt/produce.js +0 -75
  93. package/dist/browser/jwt/sign.js +0 -20
  94. package/dist/browser/key/export.js +0 -12
  95. package/dist/browser/key/generate_key_pair.js +0 -4
  96. package/dist/browser/key/generate_secret.js +0 -4
  97. package/dist/browser/lib/aesgcmkw.js +0 -16
  98. package/dist/browser/lib/check_key_type.js +0 -77
  99. package/dist/browser/lib/check_p2s.js +0 -6
  100. package/dist/browser/lib/crypto_key.js +0 -157
  101. package/dist/browser/lib/decrypt_key_management.js +0 -129
  102. package/dist/browser/lib/encrypt_key_management.js +0 -89
  103. package/dist/browser/lib/format_pem.js +0 -4
  104. package/dist/browser/lib/is_disjoint.js +0 -22
  105. package/dist/browser/lib/iv.js +0 -20
  106. package/dist/browser/lib/validate_crit.js +0 -34
  107. package/dist/browser/package.json +0 -1
  108. package/dist/browser/runtime/bogus.js +0 -6
  109. package/dist/browser/runtime/ecdhes.js +0 -47
  110. package/dist/browser/runtime/fetch_jwks.js +0 -34
  111. package/dist/browser/runtime/get_sign_verify_key.js +0 -24
  112. package/dist/browser/runtime/is_key_like.js +0 -8
  113. package/dist/browser/runtime/key_to_jwk.js +0 -21
  114. package/dist/browser/runtime/normalize_key.js +0 -68
  115. package/dist/browser/runtime/pbes2kw.js +0 -51
  116. package/dist/browser/runtime/random.js +0 -2
  117. package/dist/browser/runtime/rsaes.js +0 -37
  118. package/dist/browser/runtime/runtime.js +0 -1
  119. package/dist/browser/runtime/subtle_rsaes.js +0 -12
  120. package/dist/browser/runtime/timing_safe_equal.js +0 -19
  121. package/dist/browser/runtime/webcrypto.js +0 -2
  122. package/dist/browser/util/base64url.js +0 -3
  123. package/dist/browser/util/errors.js +0 -114
  124. package/dist/browser/util/runtime.js +0 -2
  125. package/dist/node/cjs/index.js +0 -69
  126. package/dist/node/cjs/jwe/compact/decrypt.js +0 -30
  127. package/dist/node/cjs/jwe/compact/encrypt.js +0 -31
  128. package/dist/node/cjs/jwe/flattened/decrypt.js +0 -164
  129. package/dist/node/cjs/jwe/flattened/encrypt.js +0 -165
  130. package/dist/node/cjs/jwe/general/decrypt.js +0 -34
  131. package/dist/node/cjs/jwe/general/encrypt.js +0 -186
  132. package/dist/node/cjs/jwk/embedded.js +0 -20
  133. package/dist/node/cjs/jwk/thumbprint.js +0 -57
  134. package/dist/node/cjs/jwks/local.js +0 -128
  135. package/dist/node/cjs/jwks/remote.js +0 -152
  136. package/dist/node/cjs/jws/compact/sign.js +0 -22
  137. package/dist/node/cjs/jws/compact/verify.js +0 -24
  138. package/dist/node/cjs/jws/flattened/sign.js +0 -88
  139. package/dist/node/cjs/jws/flattened/verify.js +0 -125
  140. package/dist/node/cjs/jws/general/sign.js +0 -77
  141. package/dist/node/cjs/jws/general/verify.js +0 -27
  142. package/dist/node/cjs/jwt/decrypt.js +0 -26
  143. package/dist/node/cjs/jwt/encrypt.js +0 -79
  144. package/dist/node/cjs/jwt/produce.js +0 -80
  145. package/dist/node/cjs/jwt/sign.js +0 -25
  146. package/dist/node/cjs/jwt/unsecured.js +0 -36
  147. package/dist/node/cjs/jwt/verify.js +0 -18
  148. package/dist/node/cjs/key/export.js +0 -17
  149. package/dist/node/cjs/key/generate_key_pair.js +0 -7
  150. package/dist/node/cjs/key/generate_secret.js +0 -7
  151. package/dist/node/cjs/key/import.js +0 -51
  152. package/dist/node/cjs/lib/aesgcmkw.js +0 -20
  153. package/dist/node/cjs/lib/buffer_utils.js +0 -60
  154. package/dist/node/cjs/lib/cek.js +0 -23
  155. package/dist/node/cjs/lib/check_iv_length.js +0 -10
  156. package/dist/node/cjs/lib/check_key_type.js +0 -80
  157. package/dist/node/cjs/lib/check_p2s.js +0 -9
  158. package/dist/node/cjs/lib/crypto_key.js +0 -161
  159. package/dist/node/cjs/lib/decrypt_key_management.js +0 -131
  160. package/dist/node/cjs/lib/encrypt_key_management.js +0 -91
  161. package/dist/node/cjs/lib/epoch.js +0 -3
  162. package/dist/node/cjs/lib/invalid_key_input.js +0 -34
  163. package/dist/node/cjs/lib/is_disjoint.js +0 -24
  164. package/dist/node/cjs/lib/is_jwk.js +0 -19
  165. package/dist/node/cjs/lib/is_object.js +0 -19
  166. package/dist/node/cjs/lib/iv.js +0 -23
  167. package/dist/node/cjs/lib/jwt_claims_set.js +0 -106
  168. package/dist/node/cjs/lib/private_symbols.js +0 -4
  169. package/dist/node/cjs/lib/secs.js +0 -57
  170. package/dist/node/cjs/lib/validate_algorithms.js +0 -13
  171. package/dist/node/cjs/lib/validate_crit.js +0 -36
  172. package/dist/node/cjs/runtime/aeskw.js +0 -55
  173. package/dist/node/cjs/runtime/asn1.js +0 -54
  174. package/dist/node/cjs/runtime/base64url.js +0 -20
  175. package/dist/node/cjs/runtime/cbc_tag.js +0 -11
  176. package/dist/node/cjs/runtime/check_cek_length.js +0 -37
  177. package/dist/node/cjs/runtime/check_key_length.js +0 -18
  178. package/dist/node/cjs/runtime/ciphers.js +0 -8
  179. package/dist/node/cjs/runtime/decrypt.js +0 -103
  180. package/dist/node/cjs/runtime/digest.js +0 -5
  181. package/dist/node/cjs/runtime/dsa_digest.js +0 -26
  182. package/dist/node/cjs/runtime/ecdhes.js +0 -70
  183. package/dist/node/cjs/runtime/encrypt.js +0 -80
  184. package/dist/node/cjs/runtime/fetch_jwks.js +0 -45
  185. package/dist/node/cjs/runtime/generate.js +0 -103
  186. package/dist/node/cjs/runtime/get_named_curve.js +0 -61
  187. package/dist/node/cjs/runtime/get_sign_verify_key.js +0 -31
  188. package/dist/node/cjs/runtime/hmac_digest.js +0 -16
  189. package/dist/node/cjs/runtime/is_key_like.js +0 -11
  190. package/dist/node/cjs/runtime/is_key_object.js +0 -4
  191. package/dist/node/cjs/runtime/jwk_to_key.js +0 -10
  192. package/dist/node/cjs/runtime/key_to_jwk.js +0 -36
  193. package/dist/node/cjs/runtime/node_key.js +0 -111
  194. package/dist/node/cjs/runtime/normalize_key.js +0 -3
  195. package/dist/node/cjs/runtime/pbes2kw.js +0 -48
  196. package/dist/node/cjs/runtime/random.js +0 -5
  197. package/dist/node/cjs/runtime/rsaes.js +0 -71
  198. package/dist/node/cjs/runtime/runtime.js +0 -3
  199. package/dist/node/cjs/runtime/sign.js +0 -19
  200. package/dist/node/cjs/runtime/timing_safe_equal.js +0 -5
  201. package/dist/node/cjs/runtime/verify.js +0 -31
  202. package/dist/node/cjs/runtime/webcrypto.js +0 -9
  203. package/dist/node/cjs/util/base64url.js +0 -6
  204. package/dist/node/cjs/util/decode_jwt.js +0 -35
  205. package/dist/node/cjs/util/decode_protected_header.js +0 -37
  206. package/dist/node/cjs/util/errors.js +0 -117
  207. package/dist/node/cjs/util/runtime.js +0 -4
  208. package/dist/node/esm/index.js +0 -30
  209. package/dist/node/esm/jwe/compact/decrypt.js +0 -27
  210. package/dist/node/esm/jwe/general/decrypt.js +0 -31
  211. package/dist/node/esm/jwk/embedded.js +0 -17
  212. package/dist/node/esm/jws/compact/verify.js +0 -21
  213. package/dist/node/esm/jws/flattened/verify.js +0 -122
  214. package/dist/node/esm/jws/general/verify.js +0 -24
  215. package/dist/node/esm/jwt/decrypt.js +0 -23
  216. package/dist/node/esm/jwt/unsecured.js +0 -32
  217. package/dist/node/esm/jwt/verify.js +0 -15
  218. package/dist/node/esm/key/generate_key_pair.js +0 -4
  219. package/dist/node/esm/key/generate_secret.js +0 -4
  220. package/dist/node/esm/key/import.js +0 -45
  221. package/dist/node/esm/lib/buffer_utils.js +0 -51
  222. package/dist/node/esm/lib/cek.js +0 -20
  223. package/dist/node/esm/lib/check_iv_length.js +0 -8
  224. package/dist/node/esm/lib/check_key_type.js +0 -77
  225. package/dist/node/esm/lib/check_p2s.js +0 -6
  226. package/dist/node/esm/lib/epoch.js +0 -1
  227. package/dist/node/esm/lib/invalid_key_input.js +0 -31
  228. package/dist/node/esm/lib/is_jwk.js +0 -13
  229. package/dist/node/esm/lib/is_object.js +0 -16
  230. package/dist/node/esm/lib/jwt_claims_set.js +0 -104
  231. package/dist/node/esm/lib/private_symbols.js +0 -1
  232. package/dist/node/esm/lib/secs.js +0 -55
  233. package/dist/node/esm/lib/validate_algorithms.js +0 -11
  234. package/dist/node/esm/package.json +0 -1
  235. package/dist/node/esm/runtime/aeskw.js +0 -50
  236. package/dist/node/esm/runtime/asn1.js +0 -46
  237. package/dist/node/esm/runtime/base64url.js +0 -14
  238. package/dist/node/esm/runtime/cbc_tag.js +0 -8
  239. package/dist/node/esm/runtime/check_cek_length.js +0 -35
  240. package/dist/node/esm/runtime/check_key_length.js +0 -16
  241. package/dist/node/esm/runtime/ciphers.js +0 -6
  242. package/dist/node/esm/runtime/decrypt.js +0 -101
  243. package/dist/node/esm/runtime/digest.js +0 -3
  244. package/dist/node/esm/runtime/dsa_digest.js +0 -23
  245. package/dist/node/esm/runtime/ecdhes.js +0 -64
  246. package/dist/node/esm/runtime/encrypt.js +0 -78
  247. package/dist/node/esm/runtime/fetch_jwks.js +0 -43
  248. package/dist/node/esm/runtime/generate.js +0 -99
  249. package/dist/node/esm/runtime/get_named_curve.js +0 -58
  250. package/dist/node/esm/runtime/get_sign_verify_key.js +0 -28
  251. package/dist/node/esm/runtime/hmac_digest.js +0 -13
  252. package/dist/node/esm/runtime/is_key_like.js +0 -8
  253. package/dist/node/esm/runtime/is_key_object.js +0 -2
  254. package/dist/node/esm/runtime/jwk_to_key.js +0 -8
  255. package/dist/node/esm/runtime/key_to_jwk.js +0 -34
  256. package/dist/node/esm/runtime/node_key.js +0 -108
  257. package/dist/node/esm/runtime/normalize_key.js +0 -1
  258. package/dist/node/esm/runtime/pbes2kw.js +0 -43
  259. package/dist/node/esm/runtime/random.js +0 -1
  260. package/dist/node/esm/runtime/rsaes.js +0 -66
  261. package/dist/node/esm/runtime/runtime.js +0 -1
  262. package/dist/node/esm/runtime/sign.js +0 -17
  263. package/dist/node/esm/runtime/timing_safe_equal.js +0 -3
  264. package/dist/node/esm/runtime/verify.js +0 -29
  265. package/dist/node/esm/runtime/webcrypto.js +0 -5
  266. package/dist/node/esm/util/decode_jwt.js +0 -32
  267. package/dist/node/esm/util/decode_protected_header.js +0 -34
  268. package/dist/node/esm/util/runtime.js +0 -2
  269. package/dist/types/util/runtime.d.ts +0 -3
  270. /package/dist/{browser → webapi}/jwe/compact/decrypt.js +0 -0
  271. /package/dist/{node/esm → webapi}/jwe/compact/encrypt.js +0 -0
  272. /package/dist/{browser → webapi}/jwe/general/decrypt.js +0 -0
  273. /package/dist/{browser → webapi}/jwk/embedded.js +0 -0
  274. /package/dist/{node/esm → webapi}/jws/compact/sign.js +0 -0
  275. /package/dist/{browser → webapi}/jws/compact/verify.js +0 -0
  276. /package/dist/{node/esm → webapi}/jws/general/sign.js +0 -0
  277. /package/dist/{browser → webapi}/jws/general/verify.js +0 -0
  278. /package/dist/{browser → webapi}/jwt/decrypt.js +0 -0
  279. /package/dist/{node/esm → webapi}/jwt/encrypt.js +0 -0
  280. /package/dist/{node/esm → webapi}/jwt/produce.js +0 -0
  281. /package/dist/{node/esm → webapi}/jwt/sign.js +0 -0
  282. /package/dist/{browser → webapi}/jwt/verify.js +0 -0
  283. /package/dist/{browser/runtime → webapi/lib}/check_key_length.js +0 -0
  284. /package/dist/{browser → webapi}/lib/epoch.js +0 -0
  285. /package/dist/{browser → webapi}/lib/invalid_key_input.js +0 -0
  286. /package/dist/{browser → webapi}/lib/jwt_claims_set.js +0 -0
  287. /package/dist/{browser → webapi}/lib/private_symbols.js +0 -0
  288. /package/dist/{browser → webapi}/lib/secs.js +0 -0
  289. /package/dist/{browser → webapi}/util/decode_jwt.js +0 -0
  290. /package/dist/{browser → webapi}/util/decode_protected_header.js +0 -0
  291. /package/dist/{node/esm → webapi}/util/errors.js +0 -0
@@ -0,0 +1,12 @@
1
+ import { checkSigCryptoKey } from './crypto_key.js';
2
+ import invalidKeyInput from './invalid_key_input.js';
3
+ export default async (alg, key, usage) => {
4
+ if (key instanceof Uint8Array) {
5
+ if (!alg.startsWith('HS')) {
6
+ throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));
7
+ }
8
+ return crypto.subtle.importKey('raw', key, { hash: `SHA-${alg.slice(-3)}`, name: 'HMAC' }, false, [usage]);
9
+ }
10
+ checkSigCryptoKey(key, alg, usage);
11
+ return key;
12
+ };
@@ -1,4 +1,4 @@
1
- const isDisjoint = (...headers) => {
1
+ export default (...headers) => {
2
2
  const sources = headers.filter(Boolean);
3
3
  if (sources.length === 0 || sources.length === 1) {
4
4
  return true;
@@ -19,4 +19,3 @@ const isDisjoint = (...headers) => {
19
19
  }
20
20
  return true;
21
21
  };
22
- export default isDisjoint;
@@ -9,5 +9,5 @@ export function isPublicJWK(key) {
9
9
  return key.kty !== 'oct' && typeof key.d === 'undefined';
10
10
  }
11
11
  export function isSecretJWK(key) {
12
- return isJWK(key) && key.kty === 'oct' && typeof key.k === 'string';
12
+ return key.kty === 'oct' && typeof key.k === 'string';
13
13
  }
@@ -0,0 +1,14 @@
1
+ export function assertCryptoKey(key) {
2
+ if (!isCryptoKey(key)) {
3
+ throw new Error('CryptoKey instance expected');
4
+ }
5
+ }
6
+ export function isCryptoKey(key) {
7
+ return key?.[Symbol.toStringTag] === 'CryptoKey';
8
+ }
9
+ export function isKeyObject(key) {
10
+ return key?.[Symbol.toStringTag] === 'KeyObject';
11
+ }
12
+ export default (key) => {
13
+ return isCryptoKey(key) || isKeyObject(key);
14
+ };
@@ -1,7 +1,7 @@
1
1
  function isObjectLike(value) {
2
2
  return typeof value === 'object' && value !== null;
3
3
  }
4
- export default function isObject(input) {
4
+ export default (input) => {
5
5
  if (!isObjectLike(input) || Object.prototype.toString.call(input) !== '[object Object]') {
6
6
  return false;
7
7
  }
@@ -13,4 +13,4 @@ export default function isObject(input) {
13
13
  proto = Object.getPrototypeOf(proto);
14
14
  }
15
15
  return Object.getPrototypeOf(input) === proto;
16
- }
16
+ };
@@ -1,5 +1,4 @@
1
1
  import { JOSENotSupported } from '../util/errors.js';
2
- import random from '../runtime/random.js';
3
2
  export function bitLength(alg) {
4
3
  switch (alg) {
5
4
  case 'A128GCM':
@@ -17,4 +16,4 @@ export function bitLength(alg) {
17
16
  throw new JOSENotSupported(`Unsupported JWE Algorithm: ${alg}`);
18
17
  }
19
18
  }
20
- export default (alg) => random(new Uint8Array(bitLength(alg) >> 3));
19
+ export default (alg) => crypto.getRandomValues(new Uint8Array(bitLength(alg) >> 3));
@@ -1,4 +1,3 @@
1
- import crypto from './webcrypto.js';
2
1
  import { JOSENotSupported } from '../util/errors.js';
3
2
  function subtleMapping(jwk) {
4
3
  let algorithm;
@@ -62,11 +61,8 @@ function subtleMapping(jwk) {
62
61
  case 'OKP': {
63
62
  switch (jwk.alg) {
64
63
  case 'Ed25519':
65
- algorithm = { name: 'Ed25519' };
66
- keyUsages = jwk.d ? ['sign'] : ['verify'];
67
- break;
68
64
  case 'EdDSA':
69
- algorithm = { name: jwk.crv };
65
+ algorithm = { name: 'Ed25519' };
70
66
  keyUsages = jwk.d ? ['sign'] : ['verify'];
71
67
  break;
72
68
  case 'ECDH-ES':
@@ -86,19 +82,13 @@ function subtleMapping(jwk) {
86
82
  }
87
83
  return { algorithm, keyUsages };
88
84
  }
89
- const parse = async (jwk) => {
85
+ export default async (jwk) => {
90
86
  if (!jwk.alg) {
91
87
  throw new TypeError('"alg" argument is required when "jwk.alg" is not present');
92
88
  }
93
89
  const { algorithm, keyUsages } = subtleMapping(jwk);
94
- const rest = [
95
- algorithm,
96
- jwk.ext ?? false,
97
- jwk.key_ops ?? keyUsages,
98
- ];
99
90
  const keyData = { ...jwk };
100
91
  delete keyData.alg;
101
92
  delete keyData.use;
102
- return crypto.subtle.importKey('jwk', keyData, ...rest);
93
+ return crypto.subtle.importKey('jwk', keyData, algorithm, jwk.ext ?? (jwk.d ? false : true), jwk.key_ops ?? keyUsages);
103
94
  };
104
- export default parse;
@@ -0,0 +1,27 @@
1
+ import invalidKeyInput from './invalid_key_input.js';
2
+ import { encode as base64url } from './base64url.js';
3
+ import { isCryptoKey, isKeyObject } from './is_key_like.js';
4
+ export default async function keyToJWK(key) {
5
+ if (isKeyObject(key)) {
6
+ if (key.type === 'secret') {
7
+ key = key.export();
8
+ }
9
+ else {
10
+ return key.export({ format: 'jwk' });
11
+ }
12
+ }
13
+ if (key instanceof Uint8Array) {
14
+ return {
15
+ kty: 'oct',
16
+ k: base64url(key),
17
+ };
18
+ }
19
+ if (!isCryptoKey(key)) {
20
+ throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'Uint8Array'));
21
+ }
22
+ if (!key.extractable) {
23
+ throw new TypeError('non-extractable CryptoKey cannot be exported as a JWK');
24
+ }
25
+ const { ext, key_ops, alg, use, ...jwk } = await crypto.subtle.exportKey('jwk', key);
26
+ return jwk;
27
+ }
@@ -0,0 +1,164 @@
1
+ import { isJWK } from './is_jwk.js';
2
+ import { decode } from './base64url.js';
3
+ import importJWK from './jwk_to_key.js';
4
+ import { isCryptoKey, isKeyObject } from './is_key_like.js';
5
+ let cache;
6
+ const handleJWK = async (key, jwk, alg, freeze = false) => {
7
+ cache ||= new WeakMap();
8
+ let cached = cache.get(key);
9
+ if (cached?.[alg]) {
10
+ return cached[alg];
11
+ }
12
+ const cryptoKey = await importJWK({ ...jwk, alg });
13
+ if (freeze)
14
+ Object.freeze(key);
15
+ if (!cached) {
16
+ cache.set(key, { [alg]: cryptoKey });
17
+ }
18
+ else {
19
+ cached[alg] = cryptoKey;
20
+ }
21
+ return cryptoKey;
22
+ };
23
+ const handleKeyObject = (keyObject, alg) => {
24
+ cache ||= new WeakMap();
25
+ let cached = cache.get(keyObject);
26
+ if (cached?.[alg]) {
27
+ return cached[alg];
28
+ }
29
+ const isPublic = keyObject.type === 'public';
30
+ const extractable = isPublic ? true : false;
31
+ let cryptoKey;
32
+ if (keyObject.asymmetricKeyType === 'x25519') {
33
+ switch (alg) {
34
+ case 'ECDH-ES':
35
+ case 'ECDH-ES+A128KW':
36
+ case 'ECDH-ES+A192KW':
37
+ case 'ECDH-ES+A256KW':
38
+ break;
39
+ default:
40
+ throw new TypeError('given KeyObject instance cannot be used for this algorithm');
41
+ }
42
+ cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, isPublic ? [] : ['deriveBits']);
43
+ }
44
+ if (keyObject.asymmetricKeyType === 'ed25519') {
45
+ if (alg !== 'EdDSA' && alg !== 'Ed25519') {
46
+ throw new TypeError('given KeyObject instance cannot be used for this algorithm');
47
+ }
48
+ cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, [
49
+ isPublic ? 'verify' : 'sign',
50
+ ]);
51
+ }
52
+ if (keyObject.asymmetricKeyType === 'rsa') {
53
+ let hash;
54
+ switch (alg) {
55
+ case 'RSA-OAEP':
56
+ hash = 'SHA-1';
57
+ break;
58
+ case 'RS256':
59
+ case 'PS256':
60
+ case 'RSA-OAEP-256':
61
+ hash = 'SHA-256';
62
+ break;
63
+ case 'RS384':
64
+ case 'PS384':
65
+ case 'RSA-OAEP-384':
66
+ hash = 'SHA-384';
67
+ break;
68
+ case 'RS512':
69
+ case 'PS512':
70
+ case 'RSA-OAEP-512':
71
+ hash = 'SHA-512';
72
+ break;
73
+ default:
74
+ throw new TypeError('given KeyObject instance cannot be used for this algorithm');
75
+ }
76
+ if (alg.startsWith('RSA-OAEP')) {
77
+ return keyObject.toCryptoKey({
78
+ name: 'RSA-OAEP',
79
+ hash,
80
+ }, extractable, isPublic ? ['encrypt'] : ['decrypt']);
81
+ }
82
+ cryptoKey = keyObject.toCryptoKey({
83
+ name: alg.startsWith('PS') ? 'RSA-PSS' : 'RSASSA-PKCS1-v1_5',
84
+ hash,
85
+ }, extractable, [isPublic ? 'verify' : 'sign']);
86
+ }
87
+ if (keyObject.asymmetricKeyType === 'ec') {
88
+ const nist = new Map([
89
+ ['prime256v1', 'P-256'],
90
+ ['secp384r1', 'P-384'],
91
+ ['secp521r1', 'P-521'],
92
+ ]);
93
+ const namedCurve = nist.get(keyObject.asymmetricKeyDetails?.namedCurve);
94
+ if (!namedCurve) {
95
+ throw new TypeError('given KeyObject instance cannot be used for this algorithm');
96
+ }
97
+ if (alg === 'ES256' && namedCurve === 'P-256') {
98
+ cryptoKey = keyObject.toCryptoKey({
99
+ name: 'ECDSA',
100
+ namedCurve,
101
+ }, extractable, [isPublic ? 'verify' : 'sign']);
102
+ }
103
+ if (alg === 'ES384' && namedCurve === 'P-384') {
104
+ cryptoKey = keyObject.toCryptoKey({
105
+ name: 'ECDSA',
106
+ namedCurve,
107
+ }, extractable, [isPublic ? 'verify' : 'sign']);
108
+ }
109
+ if (alg === 'ES512' && namedCurve === 'P-521') {
110
+ cryptoKey = keyObject.toCryptoKey({
111
+ name: 'ECDSA',
112
+ namedCurve,
113
+ }, extractable, [isPublic ? 'verify' : 'sign']);
114
+ }
115
+ if (alg.startsWith('ECDH-ES')) {
116
+ cryptoKey = keyObject.toCryptoKey({
117
+ name: 'ECDH',
118
+ namedCurve,
119
+ }, extractable, isPublic ? [] : ['deriveBits']);
120
+ }
121
+ }
122
+ if (!cryptoKey) {
123
+ throw new TypeError('given KeyObject instance cannot be used for this algorithm');
124
+ }
125
+ if (!cached) {
126
+ cache.set(keyObject, { [alg]: cryptoKey });
127
+ }
128
+ else {
129
+ cached[alg] = cryptoKey;
130
+ }
131
+ return cryptoKey;
132
+ };
133
+ export default async (key, alg) => {
134
+ if (key instanceof Uint8Array) {
135
+ return key;
136
+ }
137
+ if (isCryptoKey(key)) {
138
+ return key;
139
+ }
140
+ if (isKeyObject(key)) {
141
+ if (key.type === 'secret') {
142
+ return key.export();
143
+ }
144
+ if ('toCryptoKey' in key && typeof key.toCryptoKey === 'function') {
145
+ try {
146
+ return handleKeyObject(key, alg);
147
+ }
148
+ catch (err) {
149
+ if (err instanceof TypeError) {
150
+ throw err;
151
+ }
152
+ }
153
+ }
154
+ let jwk = key.export({ format: 'jwk' });
155
+ return handleJWK(key, jwk, alg);
156
+ }
157
+ if (isJWK(key)) {
158
+ if (key.k) {
159
+ return decode(key.k);
160
+ }
161
+ return handleJWK(key, key, alg, true);
162
+ }
163
+ throw new Error('unreachable');
164
+ };
@@ -0,0 +1,37 @@
1
+ import { encode as base64url } from './base64url.js';
2
+ import * as aeskw from './aeskw.js';
3
+ import { checkEncCryptoKey } from './crypto_key.js';
4
+ import { concat, encoder } from './buffer_utils.js';
5
+ import { JWEInvalid } from '../util/errors.js';
6
+ function getCryptoKey(key, alg) {
7
+ if (key instanceof Uint8Array) {
8
+ return crypto.subtle.importKey('raw', key, 'PBKDF2', false, ['deriveBits']);
9
+ }
10
+ checkEncCryptoKey(key, alg, 'deriveBits');
11
+ return key;
12
+ }
13
+ const concatSalt = (alg, p2sInput) => concat(encoder.encode(alg), new Uint8Array([0]), p2sInput);
14
+ async function deriveKey(p2s, alg, p2c, key) {
15
+ if (!(p2s instanceof Uint8Array) || p2s.length < 8) {
16
+ throw new JWEInvalid('PBES2 Salt Input must be 8 or more octets');
17
+ }
18
+ const salt = concatSalt(alg, p2s);
19
+ const keylen = parseInt(alg.slice(13, 16), 10);
20
+ const subtleAlg = {
21
+ hash: `SHA-${alg.slice(8, 11)}`,
22
+ iterations: p2c,
23
+ name: 'PBKDF2',
24
+ salt,
25
+ };
26
+ const cryptoKey = await getCryptoKey(key, alg);
27
+ return new Uint8Array(await crypto.subtle.deriveBits(subtleAlg, cryptoKey, keylen));
28
+ }
29
+ export async function wrap(alg, key, cek, p2c = 2048, p2s = crypto.getRandomValues(new Uint8Array(16))) {
30
+ const derived = await deriveKey(p2s, alg, p2c, key);
31
+ const encryptedKey = await aeskw.wrap(alg.slice(-6), derived, cek);
32
+ return { encryptedKey, p2c, p2s: base64url(p2s) };
33
+ }
34
+ export async function unwrap(alg, key, encryptedKey, p2c, p2s) {
35
+ const derived = await deriveKey(p2s, alg, p2c, key);
36
+ return aeskw.unwrap(alg.slice(-6), derived, encryptedKey);
37
+ }
@@ -0,0 +1,24 @@
1
+ import { checkEncCryptoKey } from './crypto_key.js';
2
+ import checkKeyLength from './check_key_length.js';
3
+ import { JOSENotSupported } from '../util/errors.js';
4
+ const subtleAlgorithm = (alg) => {
5
+ switch (alg) {
6
+ case 'RSA-OAEP':
7
+ case 'RSA-OAEP-256':
8
+ case 'RSA-OAEP-384':
9
+ case 'RSA-OAEP-512':
10
+ return 'RSA-OAEP';
11
+ default:
12
+ throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);
13
+ }
14
+ };
15
+ export async function encrypt(alg, key, cek) {
16
+ checkEncCryptoKey(key, alg, 'encrypt');
17
+ checkKeyLength(alg, key);
18
+ return new Uint8Array(await crypto.subtle.encrypt(subtleAlgorithm(alg), key, cek));
19
+ }
20
+ export async function decrypt(alg, key, encryptedKey) {
21
+ checkEncCryptoKey(key, alg, 'decrypt');
22
+ checkKeyLength(alg, key);
23
+ return new Uint8Array(await crypto.subtle.decrypt(subtleAlgorithm(alg), key, encryptedKey));
24
+ }
@@ -1,11 +1,9 @@
1
1
  import subtleAlgorithm from './subtle_dsa.js';
2
- import crypto from './webcrypto.js';
3
2
  import checkKeyLength from './check_key_length.js';
4
3
  import getSignKey from './get_sign_verify_key.js';
5
- const sign = async (alg, key, data) => {
4
+ export default async (alg, key, data) => {
6
5
  const cryptoKey = await getSignKey(alg, key, 'sign');
7
6
  checkKeyLength(alg, cryptoKey);
8
7
  const signature = await crypto.subtle.sign(subtleAlgorithm(alg, cryptoKey.algorithm), cryptoKey, data);
9
8
  return new Uint8Array(signature);
10
9
  };
11
- export default sign;
@@ -1,5 +1,5 @@
1
1
  import { JOSENotSupported } from '../util/errors.js';
2
- export default function subtleDsa(alg, algorithm) {
2
+ export default (alg, algorithm) => {
3
3
  const hash = `SHA-${alg.slice(-3)}`;
4
4
  switch (alg) {
5
5
  case 'HS256':
@@ -9,7 +9,7 @@ export default function subtleDsa(alg, algorithm) {
9
9
  case 'PS256':
10
10
  case 'PS384':
11
11
  case 'PS512':
12
- return { hash, name: 'RSA-PSS', saltLength: alg.slice(-3) >> 3 };
12
+ return { hash, name: 'RSA-PSS', saltLength: parseInt(alg.slice(-3), 10) >> 3 };
13
13
  case 'RS256':
14
14
  case 'RS384':
15
15
  case 'RS512':
@@ -19,10 +19,9 @@ export default function subtleDsa(alg, algorithm) {
19
19
  case 'ES512':
20
20
  return { hash, name: 'ECDSA', namedCurve: algorithm.namedCurve };
21
21
  case 'Ed25519':
22
- return { name: 'Ed25519' };
23
22
  case 'EdDSA':
24
- return { name: algorithm.name };
23
+ return { name: 'Ed25519' };
25
24
  default:
26
25
  throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);
27
26
  }
28
- }
27
+ };
@@ -1,4 +1,4 @@
1
- const validateAlgorithms = (option, algorithms) => {
1
+ export default (option, algorithms) => {
2
2
  if (algorithms !== undefined &&
3
3
  (!Array.isArray(algorithms) || algorithms.some((s) => typeof s !== 'string'))) {
4
4
  throw new TypeError(`"${option}" option must be an array of strings`);
@@ -8,4 +8,3 @@ const validateAlgorithms = (option, algorithms) => {
8
8
  }
9
9
  return new Set(algorithms);
10
10
  };
11
- export default validateAlgorithms;
@@ -1,5 +1,5 @@
1
- import { JOSENotSupported } from '../util/errors.js';
2
- function validateCrit(Err, recognizedDefault, recognizedOption, protectedHeader, joseHeader) {
1
+ import { JOSENotSupported, JWEInvalid, JWSInvalid } from '../util/errors.js';
2
+ export default (Err, recognizedDefault, recognizedOption, protectedHeader, joseHeader) => {
3
3
  if (joseHeader.crit !== undefined && protectedHeader?.crit === undefined) {
4
4
  throw new Err('"crit" (Critical) Header Parameter MUST be integrity protected');
5
5
  }
@@ -30,5 +30,4 @@ function validateCrit(Err, recognizedDefault, recognizedOption, protectedHeader,
30
30
  }
31
31
  }
32
32
  return new Set(protectedHeader.crit);
33
- }
34
- export default validateCrit;
33
+ };
@@ -1,8 +1,7 @@
1
1
  import subtleAlgorithm from './subtle_dsa.js';
2
- import crypto from './webcrypto.js';
3
2
  import checkKeyLength from './check_key_length.js';
4
3
  import getVerifyKey from './get_sign_verify_key.js';
5
- const verify = async (alg, key, signature, data) => {
4
+ export default async (alg, key, signature, data) => {
6
5
  const cryptoKey = await getVerifyKey(alg, key, 'verify');
7
6
  checkKeyLength(alg, cryptoKey);
8
7
  const algorithm = subtleAlgorithm(alg, cryptoKey.algorithm);
@@ -13,4 +12,3 @@ const verify = async (alg, key, signature, data) => {
13
12
  return false;
14
13
  }
15
14
  };
16
- export default verify;
@@ -1,3 +1,3 @@
1
- import * as base64url from '../runtime/base64url.js';
1
+ import * as base64url from '../lib/base64url.js';
2
2
  export const encode = base64url.encode;
3
3
  export const decode = base64url.decode;