jose 5.9.6 → 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 +21 -19
  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 +38 -59
  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 +4 -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} +5 -54
  45. package/dist/webapi/key/generate_secret.js +40 -0
  46. package/dist/{browser → webapi}/key/import.js +9 -7
  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 +25 -17
  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 +11 -23
  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 +4 -10
  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 +5 -4
  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 -121
  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 -152
  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 -125
  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 -156
  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 -25
  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 -101
  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 -106
  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 -22
  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 -97
  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 -103
  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
@@ -1,101 +0,0 @@
1
- import { createDecipheriv, KeyObject } from 'node:crypto';
2
- import checkIvLength from '../lib/check_iv_length.js';
3
- import checkCekLength from './check_cek_length.js';
4
- import { concat } from '../lib/buffer_utils.js';
5
- import { JOSENotSupported, JWEDecryptionFailed, JWEInvalid } from '../util/errors.js';
6
- import timingSafeEqual from './timing_safe_equal.js';
7
- import cbcTag from './cbc_tag.js';
8
- import { isCryptoKey } from './webcrypto.js';
9
- import { checkEncCryptoKey } from '../lib/crypto_key.js';
10
- import isKeyObject from './is_key_object.js';
11
- import invalidKeyInput from '../lib/invalid_key_input.js';
12
- import supported from './ciphers.js';
13
- import { types } from './is_key_like.js';
14
- function cbcDecrypt(enc, cek, ciphertext, iv, tag, aad) {
15
- const keySize = parseInt(enc.slice(1, 4), 10);
16
- if (isKeyObject(cek)) {
17
- cek = cek.export();
18
- }
19
- const encKey = cek.subarray(keySize >> 3);
20
- const macKey = cek.subarray(0, keySize >> 3);
21
- const macSize = parseInt(enc.slice(-3), 10);
22
- const algorithm = `aes-${keySize}-cbc`;
23
- if (!supported(algorithm)) {
24
- throw new JOSENotSupported(`alg ${enc} is not supported by your javascript runtime`);
25
- }
26
- const expectedTag = cbcTag(aad, iv, ciphertext, macSize, macKey, keySize);
27
- let macCheckPassed;
28
- try {
29
- macCheckPassed = timingSafeEqual(tag, expectedTag);
30
- }
31
- catch {
32
- }
33
- if (!macCheckPassed) {
34
- throw new JWEDecryptionFailed();
35
- }
36
- let plaintext;
37
- try {
38
- const decipher = createDecipheriv(algorithm, encKey, iv);
39
- plaintext = concat(decipher.update(ciphertext), decipher.final());
40
- }
41
- catch {
42
- }
43
- if (!plaintext) {
44
- throw new JWEDecryptionFailed();
45
- }
46
- return plaintext;
47
- }
48
- function gcmDecrypt(enc, cek, ciphertext, iv, tag, aad) {
49
- const keySize = parseInt(enc.slice(1, 4), 10);
50
- const algorithm = `aes-${keySize}-gcm`;
51
- if (!supported(algorithm)) {
52
- throw new JOSENotSupported(`alg ${enc} is not supported by your javascript runtime`);
53
- }
54
- try {
55
- const decipher = createDecipheriv(algorithm, cek, iv, { authTagLength: 16 });
56
- decipher.setAuthTag(tag);
57
- if (aad.byteLength) {
58
- decipher.setAAD(aad, { plaintextLength: ciphertext.length });
59
- }
60
- const plaintext = decipher.update(ciphertext);
61
- decipher.final();
62
- return plaintext;
63
- }
64
- catch {
65
- throw new JWEDecryptionFailed();
66
- }
67
- }
68
- const decrypt = (enc, cek, ciphertext, iv, tag, aad) => {
69
- let key;
70
- if (isCryptoKey(cek)) {
71
- checkEncCryptoKey(cek, enc, 'decrypt');
72
- key = KeyObject.from(cek);
73
- }
74
- else if (cek instanceof Uint8Array || isKeyObject(cek)) {
75
- key = cek;
76
- }
77
- else {
78
- throw new TypeError(invalidKeyInput(cek, ...types, 'Uint8Array'));
79
- }
80
- if (!iv) {
81
- throw new JWEInvalid('JWE Initialization Vector missing');
82
- }
83
- if (!tag) {
84
- throw new JWEInvalid('JWE Authentication Tag missing');
85
- }
86
- checkCekLength(enc, key);
87
- checkIvLength(enc, iv);
88
- switch (enc) {
89
- case 'A128CBC-HS256':
90
- case 'A192CBC-HS384':
91
- case 'A256CBC-HS512':
92
- return cbcDecrypt(enc, key, ciphertext, iv, tag, aad);
93
- case 'A128GCM':
94
- case 'A192GCM':
95
- case 'A256GCM':
96
- return gcmDecrypt(enc, key, ciphertext, iv, tag, aad);
97
- default:
98
- throw new JOSENotSupported('Unsupported JWE Content Encryption Algorithm');
99
- }
100
- };
101
- export default decrypt;
@@ -1,3 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
- const digest = (algorithm, data) => createHash(algorithm).update(data).digest();
3
- export default digest;
@@ -1,22 +0,0 @@
1
- import { JOSENotSupported } from '../util/errors.js';
2
- export default function dsaDigest(alg) {
3
- switch (alg) {
4
- case 'PS256':
5
- case 'RS256':
6
- case 'ES256':
7
- case 'ES256K':
8
- return 'sha256';
9
- case 'PS384':
10
- case 'RS384':
11
- case 'ES384':
12
- return 'sha384';
13
- case 'PS512':
14
- case 'RS512':
15
- case 'ES512':
16
- return 'sha512';
17
- case 'EdDSA':
18
- return undefined;
19
- default:
20
- throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);
21
- }
22
- }
@@ -1,64 +0,0 @@
1
- import { diffieHellman, generateKeyPair as generateKeyPairCb, KeyObject } from 'node:crypto';
2
- import { promisify } from 'node:util';
3
- import getNamedCurve from './get_named_curve.js';
4
- import { encoder, concat, uint32be, lengthAndInput, concatKdf } from '../lib/buffer_utils.js';
5
- import { JOSENotSupported } from '../util/errors.js';
6
- import { isCryptoKey } from './webcrypto.js';
7
- import { checkEncCryptoKey } from '../lib/crypto_key.js';
8
- import isKeyObject from './is_key_object.js';
9
- import invalidKeyInput from '../lib/invalid_key_input.js';
10
- import { types } from './is_key_like.js';
11
- const generateKeyPair = promisify(generateKeyPairCb);
12
- export async function deriveKey(publicKee, privateKee, algorithm, keyLength, apu = new Uint8Array(0), apv = new Uint8Array(0)) {
13
- let publicKey;
14
- if (isCryptoKey(publicKee)) {
15
- checkEncCryptoKey(publicKee, 'ECDH');
16
- publicKey = KeyObject.from(publicKee);
17
- }
18
- else if (isKeyObject(publicKee)) {
19
- publicKey = publicKee;
20
- }
21
- else {
22
- throw new TypeError(invalidKeyInput(publicKee, ...types));
23
- }
24
- let privateKey;
25
- if (isCryptoKey(privateKee)) {
26
- checkEncCryptoKey(privateKee, 'ECDH', 'deriveBits');
27
- privateKey = KeyObject.from(privateKee);
28
- }
29
- else if (isKeyObject(privateKee)) {
30
- privateKey = privateKee;
31
- }
32
- else {
33
- throw new TypeError(invalidKeyInput(privateKee, ...types));
34
- }
35
- const value = concat(lengthAndInput(encoder.encode(algorithm)), lengthAndInput(apu), lengthAndInput(apv), uint32be(keyLength));
36
- const sharedSecret = diffieHellman({ privateKey, publicKey });
37
- return concatKdf(sharedSecret, keyLength, value);
38
- }
39
- export async function generateEpk(kee) {
40
- let key;
41
- if (isCryptoKey(kee)) {
42
- key = KeyObject.from(kee);
43
- }
44
- else if (isKeyObject(kee)) {
45
- key = kee;
46
- }
47
- else {
48
- throw new TypeError(invalidKeyInput(kee, ...types));
49
- }
50
- switch (key.asymmetricKeyType) {
51
- case 'x25519':
52
- return generateKeyPair('x25519');
53
- case 'x448': {
54
- return generateKeyPair('x448');
55
- }
56
- case 'ec': {
57
- const namedCurve = getNamedCurve(key);
58
- return generateKeyPair('ec', { namedCurve });
59
- }
60
- default:
61
- throw new JOSENotSupported('Invalid or unsupported EPK');
62
- }
63
- }
64
- export const ecdhAllowed = (key) => ['P-256', 'P-384', 'P-521', 'X25519', 'X448'].includes(getNamedCurve(key));
@@ -1,78 +0,0 @@
1
- import { createCipheriv, KeyObject } from 'node:crypto';
2
- import checkIvLength from '../lib/check_iv_length.js';
3
- import checkCekLength from './check_cek_length.js';
4
- import { concat } from '../lib/buffer_utils.js';
5
- import cbcTag from './cbc_tag.js';
6
- import { isCryptoKey } from './webcrypto.js';
7
- import { checkEncCryptoKey } from '../lib/crypto_key.js';
8
- import isKeyObject from './is_key_object.js';
9
- import invalidKeyInput from '../lib/invalid_key_input.js';
10
- import generateIv from '../lib/iv.js';
11
- import { JOSENotSupported } from '../util/errors.js';
12
- import supported from './ciphers.js';
13
- import { types } from './is_key_like.js';
14
- function cbcEncrypt(enc, plaintext, cek, iv, aad) {
15
- const keySize = parseInt(enc.slice(1, 4), 10);
16
- if (isKeyObject(cek)) {
17
- cek = cek.export();
18
- }
19
- const encKey = cek.subarray(keySize >> 3);
20
- const macKey = cek.subarray(0, keySize >> 3);
21
- const algorithm = `aes-${keySize}-cbc`;
22
- if (!supported(algorithm)) {
23
- throw new JOSENotSupported(`alg ${enc} is not supported by your javascript runtime`);
24
- }
25
- const cipher = createCipheriv(algorithm, encKey, iv);
26
- const ciphertext = concat(cipher.update(plaintext), cipher.final());
27
- const macSize = parseInt(enc.slice(-3), 10);
28
- const tag = cbcTag(aad, iv, ciphertext, macSize, macKey, keySize);
29
- return { ciphertext, tag, iv };
30
- }
31
- function gcmEncrypt(enc, plaintext, cek, iv, aad) {
32
- const keySize = parseInt(enc.slice(1, 4), 10);
33
- const algorithm = `aes-${keySize}-gcm`;
34
- if (!supported(algorithm)) {
35
- throw new JOSENotSupported(`alg ${enc} is not supported by your javascript runtime`);
36
- }
37
- const cipher = createCipheriv(algorithm, cek, iv, { authTagLength: 16 });
38
- if (aad.byteLength) {
39
- cipher.setAAD(aad, { plaintextLength: plaintext.length });
40
- }
41
- const ciphertext = cipher.update(plaintext);
42
- cipher.final();
43
- const tag = cipher.getAuthTag();
44
- return { ciphertext, tag, iv };
45
- }
46
- const encrypt = (enc, plaintext, cek, iv, aad) => {
47
- let key;
48
- if (isCryptoKey(cek)) {
49
- checkEncCryptoKey(cek, enc, 'encrypt');
50
- key = KeyObject.from(cek);
51
- }
52
- else if (cek instanceof Uint8Array || isKeyObject(cek)) {
53
- key = cek;
54
- }
55
- else {
56
- throw new TypeError(invalidKeyInput(cek, ...types, 'Uint8Array'));
57
- }
58
- checkCekLength(enc, key);
59
- if (iv) {
60
- checkIvLength(enc, iv);
61
- }
62
- else {
63
- iv = generateIv(enc);
64
- }
65
- switch (enc) {
66
- case 'A128CBC-HS256':
67
- case 'A192CBC-HS384':
68
- case 'A256CBC-HS512':
69
- return cbcEncrypt(enc, plaintext, key, iv, aad);
70
- case 'A128GCM':
71
- case 'A192GCM':
72
- case 'A256GCM':
73
- return gcmEncrypt(enc, plaintext, key, iv, aad);
74
- default:
75
- throw new JOSENotSupported('Unsupported JWE Content Encryption Algorithm');
76
- }
77
- };
78
- export default encrypt;
@@ -1,43 +0,0 @@
1
- import * as http from 'node:http';
2
- import * as https from 'node:https';
3
- import { once } from 'node:events';
4
- import { JOSEError, JWKSTimeout } from '../util/errors.js';
5
- import { concat, decoder } from '../lib/buffer_utils.js';
6
- const fetchJwks = async (url, timeout, options) => {
7
- let get;
8
- switch (url.protocol) {
9
- case 'https:':
10
- get = https.get;
11
- break;
12
- case 'http:':
13
- get = http.get;
14
- break;
15
- default:
16
- throw new TypeError('Unsupported URL protocol.');
17
- }
18
- const { agent, headers } = options;
19
- const req = get(url.href, {
20
- agent,
21
- timeout,
22
- headers,
23
- });
24
- const [response] = (await Promise.race([once(req, 'response'), once(req, 'timeout')]));
25
- if (!response) {
26
- req.destroy();
27
- throw new JWKSTimeout();
28
- }
29
- if (response.statusCode !== 200) {
30
- throw new JOSEError('Expected 200 OK from the JSON Web Key Set HTTP response');
31
- }
32
- const parts = [];
33
- for await (const part of response) {
34
- parts.push(part);
35
- }
36
- try {
37
- return JSON.parse(decoder.decode(concat(...parts)));
38
- }
39
- catch {
40
- throw new JOSEError('Failed to parse the JSON Web Key Set HTTP response as JSON');
41
- }
42
- };
43
- export default fetchJwks;
@@ -1,97 +0,0 @@
1
- import { createSecretKey, generateKeyPair as generateKeyPairCb } from 'node:crypto';
2
- import { promisify } from 'node:util';
3
- import random from './random.js';
4
- import { JOSENotSupported } from '../util/errors.js';
5
- const generate = promisify(generateKeyPairCb);
6
- export async function generateSecret(alg, options) {
7
- let length;
8
- switch (alg) {
9
- case 'HS256':
10
- case 'HS384':
11
- case 'HS512':
12
- case 'A128CBC-HS256':
13
- case 'A192CBC-HS384':
14
- case 'A256CBC-HS512':
15
- length = parseInt(alg.slice(-3), 10);
16
- break;
17
- case 'A128KW':
18
- case 'A192KW':
19
- case 'A256KW':
20
- case 'A128GCMKW':
21
- case 'A192GCMKW':
22
- case 'A256GCMKW':
23
- case 'A128GCM':
24
- case 'A192GCM':
25
- case 'A256GCM':
26
- length = parseInt(alg.slice(1, 4), 10);
27
- break;
28
- default:
29
- throw new JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');
30
- }
31
- return createSecretKey(random(new Uint8Array(length >> 3)));
32
- }
33
- export async function generateKeyPair(alg, options) {
34
- switch (alg) {
35
- case 'RS256':
36
- case 'RS384':
37
- case 'RS512':
38
- case 'PS256':
39
- case 'PS384':
40
- case 'PS512':
41
- case 'RSA-OAEP':
42
- case 'RSA-OAEP-256':
43
- case 'RSA-OAEP-384':
44
- case 'RSA-OAEP-512':
45
- case 'RSA1_5': {
46
- const modulusLength = options?.modulusLength ?? 2048;
47
- if (typeof modulusLength !== 'number' || modulusLength < 2048) {
48
- throw new JOSENotSupported('Invalid or unsupported modulusLength option provided, 2048 bits or larger keys must be used');
49
- }
50
- const keypair = await generate('rsa', {
51
- modulusLength,
52
- publicExponent: 0x10001,
53
- });
54
- return keypair;
55
- }
56
- case 'ES256':
57
- return generate('ec', { namedCurve: 'P-256' });
58
- case 'ES256K':
59
- return generate('ec', { namedCurve: 'secp256k1' });
60
- case 'ES384':
61
- return generate('ec', { namedCurve: 'P-384' });
62
- case 'ES512':
63
- return generate('ec', { namedCurve: 'P-521' });
64
- case 'EdDSA': {
65
- switch (options?.crv) {
66
- case undefined:
67
- case 'Ed25519':
68
- return generate('ed25519');
69
- case 'Ed448':
70
- return generate('ed448');
71
- default:
72
- throw new JOSENotSupported('Invalid or unsupported crv option provided, supported values are Ed25519 and Ed448');
73
- }
74
- }
75
- case 'ECDH-ES':
76
- case 'ECDH-ES+A128KW':
77
- case 'ECDH-ES+A192KW':
78
- case 'ECDH-ES+A256KW': {
79
- const crv = options?.crv ?? 'P-256';
80
- switch (crv) {
81
- case undefined:
82
- case 'P-256':
83
- case 'P-384':
84
- case 'P-521':
85
- return generate('ec', { namedCurve: crv });
86
- case 'X25519':
87
- return generate('x25519');
88
- case 'X448':
89
- return generate('x448');
90
- default:
91
- throw new JOSENotSupported('Invalid or unsupported crv option provided, supported values are P-256, P-384, P-521, X25519, and X448');
92
- }
93
- }
94
- default:
95
- throw new JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');
96
- }
97
- }
@@ -1,58 +0,0 @@
1
- import { KeyObject } from 'node:crypto';
2
- import { JOSENotSupported } from '../util/errors.js';
3
- import { isCryptoKey } from './webcrypto.js';
4
- import isKeyObject from './is_key_object.js';
5
- import invalidKeyInput from '../lib/invalid_key_input.js';
6
- import { types } from './is_key_like.js';
7
- import { isJWK } from '../lib/is_jwk.js';
8
- export const weakMap = new WeakMap();
9
- const namedCurveToJOSE = (namedCurve) => {
10
- switch (namedCurve) {
11
- case 'prime256v1':
12
- return 'P-256';
13
- case 'secp384r1':
14
- return 'P-384';
15
- case 'secp521r1':
16
- return 'P-521';
17
- case 'secp256k1':
18
- return 'secp256k1';
19
- default:
20
- throw new JOSENotSupported('Unsupported key curve for this operation');
21
- }
22
- };
23
- const getNamedCurve = (kee, raw) => {
24
- let key;
25
- if (isCryptoKey(kee)) {
26
- key = KeyObject.from(kee);
27
- }
28
- else if (isKeyObject(kee)) {
29
- key = kee;
30
- }
31
- else if (isJWK(kee)) {
32
- return kee.crv;
33
- }
34
- else {
35
- throw new TypeError(invalidKeyInput(kee, ...types));
36
- }
37
- if (key.type === 'secret') {
38
- throw new TypeError('only "private" or "public" type keys can be used for this operation');
39
- }
40
- switch (key.asymmetricKeyType) {
41
- case 'ed25519':
42
- case 'ed448':
43
- return `Ed${key.asymmetricKeyType.slice(2)}`;
44
- case 'x25519':
45
- case 'x448':
46
- return `X${key.asymmetricKeyType.slice(1)}`;
47
- case 'ec': {
48
- const namedCurve = key.asymmetricKeyDetails.namedCurve;
49
- if (raw) {
50
- return namedCurve;
51
- }
52
- return namedCurveToJOSE(namedCurve);
53
- }
54
- default:
55
- throw new TypeError('Invalid asymmetric key type for this operation');
56
- }
57
- };
58
- export default getNamedCurve;
@@ -1,28 +0,0 @@
1
- import { KeyObject, createSecretKey } from 'node:crypto';
2
- import { isCryptoKey } from './webcrypto.js';
3
- import { checkSigCryptoKey } from '../lib/crypto_key.js';
4
- import invalidKeyInput from '../lib/invalid_key_input.js';
5
- import { types } from './is_key_like.js';
6
- import * as jwk from '../lib/is_jwk.js';
7
- export default function getSignVerifyKey(alg, key, usage) {
8
- if (key instanceof Uint8Array) {
9
- if (!alg.startsWith('HS')) {
10
- throw new TypeError(invalidKeyInput(key, ...types));
11
- }
12
- return createSecretKey(key);
13
- }
14
- if (key instanceof KeyObject) {
15
- return key;
16
- }
17
- if (isCryptoKey(key)) {
18
- checkSigCryptoKey(key, alg, usage);
19
- return KeyObject.from(key);
20
- }
21
- if (jwk.isJWK(key)) {
22
- if (alg.startsWith('HS')) {
23
- return createSecretKey(Buffer.from(key.k, 'base64url'));
24
- }
25
- return key;
26
- }
27
- throw new TypeError(invalidKeyInput(key, ...types, 'Uint8Array', 'JSON Web Key'));
28
- }
@@ -1,13 +0,0 @@
1
- import { JOSENotSupported } from '../util/errors.js';
2
- export default function hmacDigest(alg) {
3
- switch (alg) {
4
- case 'HS256':
5
- return 'sha256';
6
- case 'HS384':
7
- return 'sha384';
8
- case 'HS512':
9
- return 'sha512';
10
- default:
11
- throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);
12
- }
13
- }
@@ -1,8 +0,0 @@
1
- import webcrypto, { isCryptoKey } from './webcrypto.js';
2
- import isKeyObject from './is_key_object.js';
3
- export default (key) => isKeyObject(key) || isCryptoKey(key);
4
- const types = ['KeyObject'];
5
- if (globalThis.CryptoKey || webcrypto?.CryptoKey) {
6
- types.push('CryptoKey');
7
- }
8
- export { types };
@@ -1,2 +0,0 @@
1
- import * as util from 'node:util';
2
- export default (obj) => util.types.isKeyObject(obj);
@@ -1,8 +0,0 @@
1
- import { createPrivateKey, createPublicKey } from 'node:crypto';
2
- const parse = (key) => {
3
- if (key.d) {
4
- return createPrivateKey({ format: 'jwk', key });
5
- }
6
- return createPublicKey({ format: 'jwk', key });
7
- };
8
- export default parse;
@@ -1,34 +0,0 @@
1
- import { KeyObject } from 'node:crypto';
2
- import { encode as base64url } from './base64url.js';
3
- import { JOSENotSupported } from '../util/errors.js';
4
- import { isCryptoKey } from './webcrypto.js';
5
- import isKeyObject from './is_key_object.js';
6
- import invalidKeyInput from '../lib/invalid_key_input.js';
7
- import { types } from './is_key_like.js';
8
- const keyToJWK = (key) => {
9
- let keyObject;
10
- if (isCryptoKey(key)) {
11
- if (!key.extractable) {
12
- throw new TypeError('CryptoKey is not extractable');
13
- }
14
- keyObject = KeyObject.from(key);
15
- }
16
- else if (isKeyObject(key)) {
17
- keyObject = key;
18
- }
19
- else if (key instanceof Uint8Array) {
20
- return {
21
- kty: 'oct',
22
- k: base64url(key),
23
- };
24
- }
25
- else {
26
- throw new TypeError(invalidKeyInput(key, ...types, 'Uint8Array'));
27
- }
28
- if (keyObject.type !== 'secret' &&
29
- !['rsa', 'ec', 'ed25519', 'x25519', 'ed448', 'x448'].includes(keyObject.asymmetricKeyType)) {
30
- throw new JOSENotSupported('Unsupported key asymmetricKeyType');
31
- }
32
- return keyObject.export({ format: 'jwk' });
33
- };
34
- export default keyToJWK;
@@ -1,103 +0,0 @@
1
- import { constants, KeyObject } from 'node:crypto';
2
- import getNamedCurve from './get_named_curve.js';
3
- import { JOSENotSupported } from '../util/errors.js';
4
- import checkKeyLength from './check_key_length.js';
5
- const ecCurveAlgMap = new Map([
6
- ['ES256', 'P-256'],
7
- ['ES256K', 'secp256k1'],
8
- ['ES384', 'P-384'],
9
- ['ES512', 'P-521'],
10
- ]);
11
- export default function keyForCrypto(alg, key) {
12
- let asymmetricKeyType;
13
- let asymmetricKeyDetails;
14
- let isJWK;
15
- if (key instanceof KeyObject) {
16
- asymmetricKeyType = key.asymmetricKeyType;
17
- asymmetricKeyDetails = key.asymmetricKeyDetails;
18
- }
19
- else {
20
- isJWK = true;
21
- switch (key.kty) {
22
- case 'RSA':
23
- asymmetricKeyType = 'rsa';
24
- break;
25
- case 'EC':
26
- asymmetricKeyType = 'ec';
27
- break;
28
- case 'OKP': {
29
- if (key.crv === 'Ed25519') {
30
- asymmetricKeyType = 'ed25519';
31
- break;
32
- }
33
- if (key.crv === 'Ed448') {
34
- asymmetricKeyType = 'ed448';
35
- break;
36
- }
37
- throw new TypeError('Invalid key for this operation, its crv must be Ed25519 or Ed448');
38
- }
39
- default:
40
- throw new TypeError('Invalid key for this operation, its kty must be RSA, OKP, or EC');
41
- }
42
- }
43
- let options;
44
- switch (alg) {
45
- case 'EdDSA':
46
- if (!['ed25519', 'ed448'].includes(asymmetricKeyType)) {
47
- throw new TypeError('Invalid key for this operation, its asymmetricKeyType must be ed25519 or ed448');
48
- }
49
- break;
50
- case 'RS256':
51
- case 'RS384':
52
- case 'RS512':
53
- if (asymmetricKeyType !== 'rsa') {
54
- throw new TypeError('Invalid key for this operation, its asymmetricKeyType must be rsa');
55
- }
56
- checkKeyLength(key, alg);
57
- break;
58
- case 'PS256':
59
- case 'PS384':
60
- case 'PS512':
61
- if (asymmetricKeyType === 'rsa-pss') {
62
- const { hashAlgorithm, mgf1HashAlgorithm, saltLength } = asymmetricKeyDetails;
63
- const length = parseInt(alg.slice(-3), 10);
64
- if (hashAlgorithm !== undefined &&
65
- (hashAlgorithm !== `sha${length}` || mgf1HashAlgorithm !== hashAlgorithm)) {
66
- throw new TypeError(`Invalid key for this operation, its RSA-PSS parameters do not meet the requirements of "alg" ${alg}`);
67
- }
68
- if (saltLength !== undefined && saltLength > length >> 3) {
69
- throw new TypeError(`Invalid key for this operation, its RSA-PSS parameter saltLength does not meet the requirements of "alg" ${alg}`);
70
- }
71
- }
72
- else if (asymmetricKeyType !== 'rsa') {
73
- throw new TypeError('Invalid key for this operation, its asymmetricKeyType must be rsa or rsa-pss');
74
- }
75
- checkKeyLength(key, alg);
76
- options = {
77
- padding: constants.RSA_PKCS1_PSS_PADDING,
78
- saltLength: constants.RSA_PSS_SALTLEN_DIGEST,
79
- };
80
- break;
81
- case 'ES256':
82
- case 'ES256K':
83
- case 'ES384':
84
- case 'ES512': {
85
- if (asymmetricKeyType !== 'ec') {
86
- throw new TypeError('Invalid key for this operation, its asymmetricKeyType must be ec');
87
- }
88
- const actual = getNamedCurve(key);
89
- const expected = ecCurveAlgMap.get(alg);
90
- if (actual !== expected) {
91
- throw new TypeError(`Invalid key curve for the algorithm, its curve must be ${expected}, got ${actual}`);
92
- }
93
- options = { dsaEncoding: 'ieee-p1363' };
94
- break;
95
- }
96
- default:
97
- throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);
98
- }
99
- if (isJWK) {
100
- return { format: 'jwk', key, ...options };
101
- }
102
- return options ? { ...options, key } : key;
103
- }
@@ -1 +0,0 @@
1
- export default {};