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
@@ -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,23 +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 'Ed25519':
18
- case 'EdDSA':
19
- return undefined;
20
- default:
21
- throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);
22
- }
23
- }
@@ -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,99 +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 'Ed25519':
65
- return generate('ed25519');
66
- case 'EdDSA': {
67
- switch (options?.crv) {
68
- case undefined:
69
- case 'Ed25519':
70
- return generate('ed25519');
71
- case 'Ed448':
72
- return generate('ed448');
73
- default:
74
- throw new JOSENotSupported('Invalid or unsupported crv option provided, supported values are Ed25519 and Ed448');
75
- }
76
- }
77
- case 'ECDH-ES':
78
- case 'ECDH-ES+A128KW':
79
- case 'ECDH-ES+A192KW':
80
- case 'ECDH-ES+A256KW': {
81
- const crv = options?.crv ?? 'P-256';
82
- switch (crv) {
83
- case undefined:
84
- case 'P-256':
85
- case 'P-384':
86
- case 'P-521':
87
- return generate('ec', { namedCurve: crv });
88
- case 'X25519':
89
- return generate('x25519');
90
- case 'X448':
91
- return generate('x448');
92
- default:
93
- throw new JOSENotSupported('Invalid or unsupported crv option provided, supported values are P-256, P-384, P-521, X25519, and X448');
94
- }
95
- }
96
- default:
97
- throw new JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');
98
- }
99
- }
@@ -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;