Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: panva/jose
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v3.19.0
Choose a base ref
...
head repository: panva/jose
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v3.20.0
Choose a head ref
  • 11 commits
  • 276 files changed
  • 1 contributor

Commits on Sep 26, 2021

  1. chore: cleanup after publish

    panva committed Sep 26, 2021

    Verified

    This commit was signed with the committer’s verified signature.
    iampopovich Alex Popov
    Copy the full SHA
    aa32f78 View commit details
  2. test: cf with got

    panva committed Sep 26, 2021

    Verified

    This commit was signed with the committer’s verified signature.
    iampopovich Alex Popov
    Copy the full SHA
    a012a1c View commit details

Commits on Sep 27, 2021

  1. docs: update types.d.ts

    panva committed Sep 27, 2021

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    7e3e59c View commit details
  2. Verified

    This commit was signed with the committer’s verified signature.
    iampopovich Alex Popov
    Copy the full SHA
    1191341 View commit details

Commits on Sep 29, 2021

  1. test: bump deno, update imports

    panva committed Sep 29, 2021

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    ee03b7e View commit details
  2. refactor: minor tweaks

    panva committed Sep 29, 2021

    Verified

    This commit was signed with the committer’s verified signature.
    iampopovich Alex Popov
    Copy the full SHA
    a34bdab View commit details

Commits on Oct 3, 2021

  1. Revert "test: skip process crashing tests on electron@15"

    This reverts commit 137c473.
    panva committed Oct 3, 2021

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    4128c16 View commit details

Commits on Oct 5, 2021

  1. docs: update md templates

    panva committed Oct 5, 2021

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    94815a9 View commit details

Commits on Oct 6, 2021

  1. Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    a13eb04 View commit details
  2. Verified

    This commit was signed with the committer’s verified signature.
    iampopovich Alex Popov
    Copy the full SHA
    efa1619 View commit details
  3. chore(release): 3.20.0

    panva committed Oct 6, 2021

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    c71c21b View commit details
Showing with 1,812 additions and 3,214 deletions.
  1. +12 −0 CHANGELOG.md
  2. +2 −2 dist/browser/jwk/embedded.js
  3. +7 −10 dist/browser/jwks/remote.js
  4. +1 −1 dist/browser/jwt/encrypt.js
  5. +4 −4 dist/browser/{lib/jwt_producer.js → jwt/produce.js}
  6. +1 −1 dist/browser/jwt/sign.js
  7. +1 −1 dist/browser/jwt/unsecured.js
  8. +33 −16 dist/browser/lib/check_key_type.js
  9. +35 −35 dist/browser/lib/decrypt_key_management.js
  10. +2 −2 dist/browser/lib/encrypt_key_management.js
  11. +16 −3 dist/browser/runtime/fetch_jwks.js
  12. +5 −0 dist/browser/runtime/is_key_like.js
  13. +10 −3 dist/browser/util/errors.js
  14. +23 −23 dist/deno/README.md
  15. +2 −2 dist/deno/jwe/compact/decrypt.ts
  16. +1 −1 dist/deno/jwe/compact/encrypt.ts
  17. +3 −3 dist/deno/jwe/flattened/decrypt.ts
  18. +3 −4 dist/deno/jwe/flattened/encrypt.ts
  19. +2 −2 dist/deno/jwe/general/decrypt.ts
  20. +3 −5 dist/deno/jwk/embedded.ts
  21. +1 −1 dist/deno/jwk/from_key_like.ts
  22. +5 −1 dist/deno/jwk/parse.ts
  23. +17 −23 dist/deno/jwks/remote.ts
  24. +1 −1 dist/deno/jws/compact/sign.ts
  25. +2 −2 dist/deno/jws/compact/verify.ts
  26. +1 −1 dist/deno/jws/flattened/sign.ts
  27. +2 −2 dist/deno/jws/flattened/verify.ts
  28. +2 −2 dist/deno/jws/general/sign.ts
  29. +2 −2 dist/deno/jws/general/verify.ts
  30. +2 −2 dist/deno/jwt/decrypt.ts
  31. +2 −2 dist/deno/jwt/encrypt.ts
  32. +4 −4 dist/deno/{lib/jwt_producer.ts → jwt/produce.ts}
  33. +2 −2 dist/deno/jwt/sign.ts
  34. +1 −1 dist/deno/jwt/unsecured.ts
  35. +2 −2 dist/deno/jwt/verify.ts
  36. +3 −3 dist/deno/key/export.ts
  37. +2 −2 dist/deno/key/import.ts
  38. +46 −24 dist/deno/lib/check_key_type.ts
  39. +59 −53 dist/deno/lib/decrypt_key_management.ts
  40. +8 −9 dist/deno/lib/encrypt_key_management.ts
  41. +1 −1 dist/deno/lib/is_object.ts
  42. +0 −1 dist/deno/runtime/aeskw.ts
  43. +0 −1 dist/deno/runtime/check_cek_length.ts
  44. +26 −14 dist/deno/runtime/fetch_jwks.ts
  45. +0 −1 dist/deno/runtime/generate.ts
  46. +8 −8 dist/deno/runtime/interfaces.d.ts
  47. +8 −0 dist/deno/runtime/is_key_like.ts
  48. +2 −2 dist/deno/runtime/jwk_to_key.ts
  49. +2 −2 dist/deno/runtime/key_to_jwk.ts
  50. +32 −35 dist/deno/types.d.ts
  51. +0 −13 dist/deno/types.i.d.ts
  52. +12 −3 dist/deno/util/errors.ts
  53. +2 −2 dist/deno/util/generate_key_pair.ts
  54. +4 −1 dist/deno/util/generate_secret.ts
  55. +2 −2 dist/node/cjs/jwk/embedded.js
  56. +7 −10 dist/node/cjs/jwks/remote.js
  57. +2 −2 dist/node/cjs/jwt/encrypt.js
  58. +5 −4 dist/node/cjs/{lib/jwt_producer.js → jwt/produce.js}
  59. +2 −2 dist/node/cjs/jwt/sign.js
  60. +2 −2 dist/node/cjs/jwt/unsecured.js
  61. +33 −16 dist/node/cjs/lib/check_key_type.js
  62. +35 −35 dist/node/cjs/lib/decrypt_key_management.js
  63. +2 −2 dist/node/cjs/lib/encrypt_key_management.js
  64. +5 −1 dist/node/cjs/runtime/fetch_jwks.js
  65. +11 −0 dist/node/cjs/runtime/is_key_like.js
  66. +12 −4 dist/node/cjs/util/errors.js
  67. +2 −2 dist/node/esm/jwk/embedded.js
  68. +7 −10 dist/node/esm/jwks/remote.js
  69. +1 −1 dist/node/esm/jwt/encrypt.js
  70. +4 −4 dist/node/esm/{lib/jwt_producer.js → jwt/produce.js}
  71. +1 −1 dist/node/esm/jwt/sign.js
  72. +1 −1 dist/node/esm/jwt/unsecured.js
  73. +33 −16 dist/node/esm/lib/check_key_type.js
  74. +35 −35 dist/node/esm/lib/decrypt_key_management.js
  75. +2 −2 dist/node/esm/lib/encrypt_key_management.js
  76. +6 −2 dist/node/esm/runtime/fetch_jwks.js
  77. +8 −0 dist/node/esm/runtime/is_key_like.js
  78. +10 −3 dist/node/esm/util/errors.js
  79. +1 −1 dist/types/jwe/compact/decrypt.d.ts
  80. +1 −1 dist/types/jwe/compact/encrypt.d.ts
  81. +1 −1 dist/types/jwe/flattened/decrypt.d.ts
  82. +1 −1 dist/types/jwe/flattened/encrypt.d.ts
  83. +1 −1 dist/types/jwe/general/decrypt.d.ts
  84. +2 −3 dist/types/jwk/embedded.d.ts
  85. +1 −1 dist/types/jwk/from_key_like.d.ts
  86. +1 −1 dist/types/jwk/parse.d.ts
  87. +1 −1 dist/types/jws/compact/sign.d.ts
  88. +1 −1 dist/types/jws/compact/verify.d.ts
  89. +1 −1 dist/types/jws/flattened/sign.d.ts
  90. +1 −1 dist/types/jws/flattened/verify.d.ts
  91. +1 −1 dist/types/jws/general/sign.d.ts
  92. +1 −1 dist/types/jws/general/verify.d.ts
  93. +1 −1 dist/types/jwt/decrypt.d.ts
  94. +2 −2 dist/types/jwt/encrypt.d.ts
  95. +1 −1 dist/types/{lib/jwt_producer.d.ts → jwt/produce.d.ts}
  96. +2 −2 dist/types/jwt/sign.d.ts
  97. +1 −1 dist/types/jwt/unsecured.d.ts
  98. +1 −1 dist/types/jwt/verify.d.ts
  99. +3 −3 dist/types/key/export.d.ts
  100. +1 −1 dist/types/key/import.d.ts
  101. +99 −6 dist/types/types.d.ts
  102. +5 −0 dist/types/util/errors.d.ts
  103. +2 −2 dist/types/util/generate_key_pair.d.ts
  104. +1 −1 dist/types/util/generate_secret.d.ts
  105. +2 −26 docs/classes/jwe_compact_encrypt.CompactEncrypt.md
  106. +2 −38 docs/classes/jwe_flattened_encrypt.FlattenedEncrypt.md
  107. +2 −14 docs/classes/jws_compact_sign.CompactSign.md
  108. +2 −18 docs/classes/jws_flattened_sign.FlattenedSign.md
  109. +2 −14 docs/classes/jws_general_sign.GeneralSign.md
  110. +2 −104 docs/classes/jwt_encrypt.EncryptJWT.md
  111. +159 −0 docs/classes/jwt_produce.ProduceJWT.md
  112. +2 −80 docs/classes/jwt_sign.SignJWT.md
  113. +1 −79 docs/classes/jwt_unsecured.UnsecuredJWT.md
  114. +0 −30 docs/classes/util_errors.JOSEAlgNotAllowed.md
  115. +0 −46 docs/classes/util_errors.JOSEError.md
  116. +0 −30 docs/classes/util_errors.JOSENotSupported.md
  117. +0 −38 docs/classes/util_errors.JWEDecryptionFailed.md
  118. +0 −30 docs/classes/util_errors.JWEInvalid.md
  119. +0 −30 docs/classes/util_errors.JWKInvalid.md
  120. +0 −30 docs/classes/util_errors.JWKSInvalid.md
  121. +0 −38 docs/classes/util_errors.JWKSMultipleMatchingKeys.md
  122. +0 −38 docs/classes/util_errors.JWKSNoMatchingKey.md
  123. +51 −0 docs/classes/util_errors.JWKSTimeout.md
  124. +0 −30 docs/classes/util_errors.JWSInvalid.md
  125. +0 −38 docs/classes/util_errors.JWSSignatureVerificationFailed.md
  126. +0 −40 docs/classes/util_errors.JWTClaimValidationFailed.md
  127. +0 −46 docs/classes/util_errors.JWTExpired.md
  128. +0 −30 docs/classes/util_errors.JWTInvalid.md
  129. +2 −10 docs/functions/jwe_compact_decrypt.compactDecrypt.md
  130. +2 −10 docs/functions/jwe_flattened_decrypt.flattenedDecrypt.md
  131. +2 −10 docs/functions/jwe_general_decrypt.generalDecrypt.md
  132. +3 −7 docs/functions/jwk_embedded.EmbeddedJWK.md
  133. +1 −5 docs/functions/jwk_from_key_like.fromKeyLike.md
  134. +2 −6 docs/functions/jwk_parse.parseJwk.md
  135. +1 −5 docs/functions/jwk_thumbprint.calculateThumbprint.md
  136. +1 −5 docs/functions/jwks_remote.createRemoteJWKSet.md
  137. +2 −10 docs/functions/jws_compact_verify.compactVerify.md
  138. +2 −10 docs/functions/jws_flattened_verify.flattenedVerify.md
  139. +2 −10 docs/functions/jws_general_verify.generalVerify.md
  140. +2 −10 docs/functions/jwt_decrypt.jwtDecrypt.md
  141. +2 −10 docs/functions/jwt_verify.jwtVerify.md
  142. +2 −6 docs/functions/key_export.exportJWK.md
  143. +2 −6 docs/functions/key_export.exportPKCS8.md
  144. +2 −6 docs/functions/key_export.exportSPKI.md
  145. +4 −8 docs/functions/key_import.importJWK.md
  146. +1 −5 docs/functions/key_import.importPKCS8.md
  147. +1 −5 docs/functions/key_import.importSPKI.md
  148. +1 −5 docs/functions/key_import.importX509.md
  149. +0 −4 docs/functions/util_base64url.decode.md
  150. +0 −4 docs/functions/util_base64url.encode.md
  151. +1 −5 docs/functions/util_decode_protected_header.decodeProtectedHeader.md
  152. +1 −5 docs/functions/util_generate_key_pair.generateKeyPair.md
  153. +3 −7 docs/functions/util_generate_secret.generateSecret.md
  154. +0 −4 docs/functions/util_random.random.md
  155. +2 −12 docs/interfaces/jwe_compact_decrypt.CompactDecryptGetKey.md
  156. +2 −12 docs/interfaces/jwe_flattened_decrypt.FlattenedDecryptGetKey.md
  157. +2 −12 docs/interfaces/jwe_general_decrypt.GeneralDecryptGetKey.md
  158. +0 −12 docs/interfaces/jwks_remote.RemoteJWKSetOptions.md
  159. +2 −12 docs/interfaces/jws_compact_verify.CompactVerifyGetKey.md
  160. +2 −12 docs/interfaces/jws_flattened_verify.FlattenedVerifyGetKey.md
  161. +0 −8 docs/interfaces/jws_general_sign.Signature.md
  162. +2 −12 docs/interfaces/jws_general_verify.GeneralVerifyGetKey.md
  163. +2 −12 docs/interfaces/jwt_decrypt.JWTDecryptGetKey.md
  164. +1 −97 docs/interfaces/jwt_decrypt.JWTDecryptOptions.md
  165. +0 −8 docs/interfaces/jwt_unsecured.UnsecuredResult.md
  166. +2 −12 docs/interfaces/jwt_verify.JWTVerifyGetKey.md
  167. +1 −81 docs/interfaces/jwt_verify.JWTVerifyOptions.md
  168. +0 −4 docs/interfaces/key_import.PEMImportOptions.md
  169. +0 −8 docs/interfaces/types.CompactDecryptResult.md
  170. +0 −8 docs/interfaces/types.CompactVerifyResult.md
  171. +1 −17 docs/interfaces/types.CritOption.md
  172. +1 −29 docs/interfaces/types.DecryptOptions.md
  173. +0 −4 docs/interfaces/types.DeflateFunction.md
  174. +1 −19 docs/interfaces/types.EncryptOptions.md
  175. +0 −26 docs/interfaces/types.FlattenedDecryptResult.md
  176. +0 −32 docs/interfaces/types.FlattenedJWE.md
  177. +0 −38 docs/interfaces/types.FlattenedJWS.md
  178. +0 −16 docs/interfaces/types.FlattenedJWSInput.md
  179. +0 −18 docs/interfaces/types.FlattenedVerifyResult.md
  180. +0 −46 docs/interfaces/types.GeneralDecryptResult.md
  181. +0 −58 docs/interfaces/types.GeneralJWE.md
  182. +0 −8 docs/interfaces/types.GeneralJWS.md
  183. +0 −8 docs/interfaces/types.GeneralJWSInput.md
  184. +0 −30 docs/interfaces/types.GeneralVerifyResult.md
  185. +2 −26 docs/interfaces/types.GetKeyFunction.md
  186. +0 −4 docs/interfaces/types.InflateFunction.md
  187. +0 −86 docs/interfaces/types.JWEHeaderParameters.md
  188. +0 −24 docs/interfaces/types.JWEKeyManagementHeaderParameters.md
  189. +0 −92 docs/interfaces/types.JWK.md
  190. +0 −82 docs/interfaces/types.JWSHeaderParameters.md
  191. +0 −36 docs/interfaces/types.JWTClaimVerificationOptions.md
  192. +0 −8 docs/interfaces/types.JWTDecryptResult.md
  193. +0 −28 docs/interfaces/types.JWTPayload.md
  194. +0 −8 docs/interfaces/types.JWTVerifyResult.md
  195. +0 −40 docs/interfaces/types.JoseHeaderParameters.md
  196. +1 −5 docs/interfaces/types.ResolvedKey.md
  197. +1 −15 docs/interfaces/types.SignOptions.md
  198. +1 −21 docs/interfaces/types.VerifyOptions.md
  199. +0 −12 docs/interfaces/util_generate_key_pair.GenerateKeyPairOptions.md
  200. +2 −10 docs/interfaces/util_generate_key_pair.GenerateKeyPairResult.md
  201. +0 −4 docs/interfaces/util_generate_secret.GenerateSecretOptions.md
  202. +7 −0 docs/modules/jwt_produce.md
  203. +1 −0 docs/modules/util_errors.md
  204. +33 −32 docs/types/types.KeyLike.md
  205. +0 −4 docs/types/util_decode_protected_header.ProtectedHeaderParameters.md
  206. +8 −9 package.json
  207. +71 −0 patches/typedoc-plugin-markdown+3.10.4.patch
  208. +2 −2 src/jwe/compact/decrypt.ts
  209. +1 −1 src/jwe/compact/encrypt.ts
  210. +3 −3 src/jwe/flattened/decrypt.ts
  211. +3 −4 src/jwe/flattened/encrypt.ts
  212. +2 −2 src/jwe/general/decrypt.ts
  213. +3 −5 src/jwk/embedded.ts
  214. +1 −1 src/jwk/from_key_like.ts
  215. +5 −1 src/jwk/parse.ts
  216. +17 −23 src/jwks/remote.ts
  217. +1 −1 src/jws/compact/sign.ts
  218. +2 −2 src/jws/compact/verify.ts
  219. +1 −1 src/jws/flattened/sign.ts
  220. +2 −2 src/jws/flattened/verify.ts
  221. +2 −2 src/jws/general/sign.ts
  222. +2 −2 src/jws/general/verify.ts
  223. +2 −2 src/jwt/decrypt.ts
  224. +2 −2 src/jwt/encrypt.ts
  225. +4 −4 src/{lib/jwt_producer.ts → jwt/produce.ts}
  226. +2 −2 src/jwt/sign.ts
  227. +1 −1 src/jwt/unsecured.ts
  228. +2 −2 src/jwt/verify.ts
  229. +3 −3 src/key/export.ts
  230. +2 −2 src/key/import.ts
  231. +46 −24 src/lib/check_key_type.ts
  232. +59 −53 src/lib/decrypt_key_management.ts
  233. +8 −9 src/lib/encrypt_key_management.ts
  234. +1 −1 src/lib/is_object.ts
  235. +0 −1 src/runtime/browser/aeskw.ts
  236. +0 −1 src/runtime/browser/check_cek_length.ts
  237. +26 −14 src/runtime/browser/fetch_jwks.ts
  238. +0 −1 src/runtime/browser/generate.ts
  239. +8 −0 src/runtime/browser/is_key_like.ts
  240. +2 −2 src/runtime/browser/jwk_to_key.ts
  241. +2 −2 src/runtime/browser/key_to_jwk.ts
  242. +8 −8 src/runtime/interfaces.d.ts
  243. +3 −4 src/runtime/node/decrypt.ts
  244. +3 −4 src/runtime/node/encrypt.ts
  245. +10 −2 src/runtime/node/fetch_jwks.ts
  246. +13 −0 src/runtime/node/is_key_like.ts
  247. +2 −2 src/runtime/node/jwk_to_key.ts
  248. +2 −2 src/runtime/node/key_to_jwk.ts
  249. +32 −38 src/types.d.ts
  250. +0 −13 src/types.i.d.ts
  251. +12 −3 src/util/errors.ts
  252. +2 −2 src/util/generate_key_pair.ts
  253. +4 −1 src/util/generate_secret.ts
  254. +6 −0 test-browser/jwks.js
  255. +4 −4 test-browser/keylike.js
  256. +57 −34 test-cloudflare-workers/cloudflare.test.mjs
  257. +0 −2 test-cloudflare-workers/template.js
  258. +0 −8 test-deno/imports.test.ts
  259. +1 −1 test-deno/jwe_asymmetric.test.ts
  260. +1 −1 test-deno/jwe_symmetric.test.ts
  261. +16 −2 test-deno/jwks.test.ts
  262. +3 −3 test-deno/jws.test.ts
  263. +5 −5 test-deno/keylike.test.ts
  264. +1 −1 test-deno/pem.test.ts
  265. +3 −14 test/jwe/smoke.test.mjs
  266. +32 −43 test/jwk/jwk2key.test.mjs
  267. +23 −6 test/jwks/remote.test.mjs
  268. +1 −0 test/jws/compact.sign.test.mjs
  269. +1 −0 test/jws/flattened.sign.test.mjs
  270. +3 −14 test/jws/smoke.test.mjs
  271. +6 −17 test/key/importexport.test.mjs
  272. +115 −0 test/unit/check_key_type.test.mjs
  273. +3 −0 tools/explode-exports.js
  274. +1 −0 tools/postbump.js
  275. +17 −4 tools/strip-dts-comments.js
  276. +1 −1 tsconfig/base.json
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -2,6 +2,18 @@

All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.

## [3.20.0](https://github.com/panva/jose/compare/v3.19.0...v3.20.0) (2021-10-06)


### Features

* improve key input type errors, remove dependency on @types/node ([a13eb04](https://github.com/panva/jose/commit/a13eb045d86d96e56f7a250cdc808f8c5aa0e62a))


### Bug Fixes

* proper createRemoteJWKSet timeoutDuration handling ([efa1619](https://github.com/panva/jose/commit/efa16195173f9f66b21d4f41039caaad0ccfa92a)), closes [#277](https://github.com/panva/jose/issues/277)

## [3.19.0](https://github.com/panva/jose/compare/v3.18.0...v3.19.0) (2021-09-26)


4 changes: 2 additions & 2 deletions dist/browser/jwk/embedded.js
Original file line number Diff line number Diff line change
@@ -9,8 +9,8 @@ async function EmbeddedJWK(protectedHeader, token) {
if (!isObject(joseHeader.jwk)) {
throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a JSON object');
}
const key = (await importJWK({ ...joseHeader.jwk, ext: true }, joseHeader.alg, true));
if (key.type !== 'public') {
const key = await importJWK({ ...joseHeader.jwk, ext: true }, joseHeader.alg, true);
if (key instanceof Uint8Array || key.type !== 'public') {
throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a public key');
}
return key;
17 changes: 7 additions & 10 deletions dist/browser/jwks/remote.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import fetchJwks from '../runtime/fetch_jwks.js';
import parseJWK from '../jwk/parse.js';
import { importJWK } from '../key/import.js';
import { JWKSInvalid, JOSENotSupported, JWKSNoMatchingKey, JWKSMultipleMatchingKeys, } from '../util/errors.js';
import isObject from '../lib/is_object.js';
function getKtyFromAlg(alg) {
switch (alg.substr(0, 2)) {
switch (typeof alg === 'string' && alg.substr(0, 2)) {
case 'RS':
case 'PS':
return 'RSA';
@@ -32,7 +32,7 @@ class RemoteJWKSet {
typeof (options === null || options === void 0 ? void 0 : options.cooldownDuration) === 'number' ? options === null || options === void 0 ? void 0 : options.cooldownDuration : 30000;
}
coolingDown() {
if (typeof this._cooldownStarted === 'undefined') {
if (!this._cooldownStarted) {
return false;
}
return Date.now() < this._cooldownStarted + this._cooldownDuration;
@@ -56,7 +56,7 @@ class RemoteJWKSet {
candidate = jwk.key_ops.includes('verify');
}
if (candidate && protectedHeader.alg === 'EdDSA') {
candidate = ['Ed25519', 'Ed448'].includes(jwk.crv);
candidate = jwk.crv === 'Ed25519' || jwk.crv === 'Ed448';
}
if (candidate) {
switch (protectedHeader.alg) {
@@ -88,13 +88,10 @@ class RemoteJWKSet {
else if (length !== 1) {
throw new JWKSMultipleMatchingKeys();
}
if (!this._cached.has(jwk)) {
this._cached.set(jwk, {});
}
const cached = this._cached.get(jwk);
const cached = this._cached.get(jwk) || this._cached.set(jwk, {}).get(jwk);
if (cached[protectedHeader.alg] === undefined) {
const keyObject = (await parseJWK({ ...jwk, alg: protectedHeader.alg, ext: true }));
if (keyObject.type !== 'public') {
const keyObject = await importJWK({ ...jwk, ext: true }, protectedHeader.alg);
if (keyObject instanceof Uint8Array || keyObject.type !== 'public') {
throw new JWKSInvalid('JSON Web Key Set members must be public keys');
}
cached[protectedHeader.alg] = keyObject;
2 changes: 1 addition & 1 deletion dist/browser/jwt/encrypt.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import CompactEncrypt from '../jwe/compact/encrypt.js';
import { encoder } from '../lib/buffer_utils.js';
import ProduceJWT from '../lib/jwt_producer.js';
import { ProduceJWT } from './produce.js';
class EncryptJWT extends ProduceJWT {
setProtectedHeader(protectedHeader) {
if (this._protectedHeader) {
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import epoch from './epoch.js';
import isObject from './is_object.js';
import secs from './secs.js';
export default class ProduceJWT {
import epoch from '../lib/epoch.js';
import isObject from '../lib/is_object.js';
import secs from '../lib/secs.js';
export class ProduceJWT {
constructor(payload) {
if (!isObject(payload)) {
throw new TypeError('JWT Claims Set MUST be an object');
2 changes: 1 addition & 1 deletion dist/browser/jwt/sign.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import CompactSign from '../jws/compact/sign.js';
import { JWTInvalid } from '../util/errors.js';
import { encoder } from '../lib/buffer_utils.js';
import ProduceJWT from '../lib/jwt_producer.js';
import { ProduceJWT } from './produce.js';
class SignJWT extends ProduceJWT {
setProtectedHeader(protectedHeader) {
this._protectedHeader = protectedHeader;
2 changes: 1 addition & 1 deletion dist/browser/jwt/unsecured.js
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@ import * as base64url from '../runtime/base64url.js';
import { decoder } from '../lib/buffer_utils.js';
import { JWTInvalid } from '../util/errors.js';
import jwtPayload from '../lib/jwt_claims_set.js';
import ProduceJWT from '../lib/jwt_producer.js';
import { ProduceJWT } from './produce.js';
class UnsecuredJWT extends ProduceJWT {
encode() {
const header = base64url.encode(JSON.stringify({ alg: 'none' }));
49 changes: 33 additions & 16 deletions dist/browser/lib/check_key_type.js
Original file line number Diff line number Diff line change
@@ -1,28 +1,45 @@
import invalidKeyInput from '../runtime/invalid_key_input.js';
const checkKeyType = (alg, key, usage) => {
if (!(key instanceof Uint8Array) && !(key === null || key === void 0 ? void 0 : key.type)) {
throw new TypeError(invalidKeyInput(key, 'KeyObject', 'CryptoKey', 'Uint8Array'));
import isKeyLike, { types } from '../runtime/is_key_like.js';
const symmetricTypeCheck = (key) => {
if (key instanceof Uint8Array)
return;
if (!isKeyLike(key)) {
throw new TypeError(invalidKeyInput(key, ...types, 'Uint8Array'));
}
if (alg.startsWith('HS') ||
alg === 'dir' ||
alg.startsWith('PBES2') ||
alg.match(/^A\d{3}(?:GCM)?KW$/)) {
if (key instanceof Uint8Array || key.type === 'secret') {
return;
}
throw new TypeError('CryptoKey or KeyObject instances for symmetric algorithms must be of type "secret"');
if (key.type !== 'secret') {
throw new TypeError(`${types.join(' or ')} instances for symmetric algorithms must be of type "secret"`);
}
if (key instanceof Uint8Array) {
throw new TypeError(invalidKeyInput(key, 'KeyObject', 'CryptoKey'));
};
const asymmetricTypeCheck = (key, usage) => {
if (!isKeyLike(key)) {
throw new TypeError(invalidKeyInput(key, ...types));
}
if (key.type === 'secret') {
throw new TypeError('CryptoKey or KeyObject instances for asymmetric algorithms must not be of type "secret"');
throw new TypeError(`${types.join(' or ')} instances for asymmetric algorithms must not be of type "secret"`);
}
if (usage === 'sign' && key.type === 'public') {
throw new TypeError('CryptoKey or KeyObject instances for asymmetric algorithm signing must be of type "private"');
throw new TypeError(`${types.join(' or ')} instances for asymmetric algorithm signing must be of type "private"`);
}
if (usage === 'decrypt' && key.type === 'public') {
throw new TypeError('CryptoKey or KeyObject instances for asymmetric algorithm decryption must be of type "private"');
throw new TypeError(`${types.join(' or ')} instances for asymmetric algorithm decryption must be of type "private"`);
}
if (key.algorithm && usage === 'verify' && key.type === 'private') {
throw new TypeError(`${types.join(' or ')} instances for asymmetric algorithm verifying must be of type "public"`);
}
if (key.algorithm && usage === 'encrypt' && key.type === 'private') {
throw new TypeError(`${types.join(' or ')} instances for asymmetric algorithm encryption must be of type "public"`);
}
};
const checkKeyType = (alg, key, usage) => {
const symmetric = alg.startsWith('HS') ||
alg === 'dir' ||
alg.startsWith('PBES2') ||
/^A\d{3}(?:GCM)?KW$/.test(alg);
if (symmetric) {
symmetricTypeCheck(key);
}
else {
asymmetricTypeCheck(key, usage);
}
};
export default checkKeyType;
70 changes: 35 additions & 35 deletions dist/browser/lib/decrypt_key_management.js
Original file line number Diff line number Diff line change
@@ -8,81 +8,81 @@ import { JOSENotSupported, JWEInvalid } from '../util/errors.js';
import { bitLengths as cekLengths } from '../lib/cek.js';
import { importJWK } from '../key/import.js';
import checkKeyType from './check_key_type.js';
function assertEnryptedKey(encryptedKey) {
if (!encryptedKey) {
throw new JWEInvalid('JWE Encrypted Key missing');
}
}
function assertHeaderParameter(joseHeader, parameter, name) {
if (joseHeader[parameter] === undefined) {
throw new JWEInvalid(`JOSE Header ${name} (${parameter}) missing`);
}
}
import isObject from './is_object.js';
async function decryptKeyManagement(alg, key, encryptedKey, joseHeader) {
checkKeyType(alg, key, 'decrypt');
switch (alg) {
case 'dir': {
if (encryptedKey !== undefined) {
if (encryptedKey !== undefined)
throw new JWEInvalid('Encountered unexpected JWE Encrypted Key');
}
return key;
}
case 'ECDH-ES':
if (encryptedKey !== undefined) {
if (encryptedKey !== undefined)
throw new JWEInvalid('Encountered unexpected JWE Encrypted Key');
}
case 'ECDH-ES+A128KW':
case 'ECDH-ES+A192KW':
case 'ECDH-ES+A256KW': {
assertHeaderParameter(joseHeader, 'epk', 'Ephemeral Public Key');
if (!ECDH.ecdhAllowed(key)) {
if (!isObject(joseHeader.epk))
throw new JWEInvalid(`JOSE Header "epk" (Ephemeral Public Key) missing or invalid`);
if (!ECDH.ecdhAllowed(key))
throw new JOSENotSupported('ECDH-ES with the provided key is not allowed or not supported by your javascript runtime');
}
const epk = await importJWK(joseHeader.epk, alg);
let partyUInfo;
let partyVInfo;
if (joseHeader.apu !== undefined)
if (joseHeader.apu !== undefined) {
if (typeof joseHeader.apu !== 'string')
throw new JWEInvalid(`JOSE Header "apu" (Agreement PartyUInfo) invalid`);
partyUInfo = base64url(joseHeader.apu);
if (joseHeader.apv !== undefined)
}
if (joseHeader.apv !== undefined) {
if (typeof joseHeader.apv !== 'string')
throw new JWEInvalid(`JOSE Header "apv" (Agreement PartyVInfo) invalid`);
partyVInfo = base64url(joseHeader.apv);
}
const sharedSecret = await ECDH.deriveKey(epk, key, alg === 'ECDH-ES' ? joseHeader.enc : alg, parseInt(alg.substr(-5, 3), 10) || cekLengths.get(joseHeader.enc), partyUInfo, partyVInfo);
if (alg === 'ECDH-ES') {
if (alg === 'ECDH-ES')
return sharedSecret;
}
assertEnryptedKey(encryptedKey);
const kwAlg = alg.substr(-6);
return aesKw(kwAlg, sharedSecret, encryptedKey);
if (encryptedKey === undefined)
throw new JWEInvalid('JWE Encrypted Key missing');
return aesKw(alg.substr(-6), sharedSecret, encryptedKey);
}
case 'RSA1_5':
case 'RSA-OAEP':
case 'RSA-OAEP-256':
case 'RSA-OAEP-384':
case 'RSA-OAEP-512': {
assertEnryptedKey(encryptedKey);
if (encryptedKey === undefined)
throw new JWEInvalid('JWE Encrypted Key missing');
return rsaEs(alg, key, encryptedKey);
}
case 'PBES2-HS256+A128KW':
case 'PBES2-HS384+A192KW':
case 'PBES2-HS512+A256KW': {
assertEnryptedKey(encryptedKey);
assertHeaderParameter(joseHeader, 'p2c', 'PBES2 Count');
assertHeaderParameter(joseHeader, 'p2s', 'PBES2 Salt');
const { p2c } = joseHeader;
const p2s = base64url(joseHeader.p2s);
return pbes2Kw(alg, key, encryptedKey, p2c, p2s);
if (encryptedKey === undefined)
throw new JWEInvalid('JWE Encrypted Key missing');
if (typeof joseHeader.p2c !== 'number')
throw new JWEInvalid(`JOSE Header "p2c" (PBES2 Count) missing or invalid`);
if (typeof joseHeader.p2s !== 'string')
throw new JWEInvalid(`JOSE Header "p2s" (PBES2 Salt) missing or invalid`);
return pbes2Kw(alg, key, encryptedKey, joseHeader.p2c, base64url(joseHeader.p2s));
}
case 'A128KW':
case 'A192KW':
case 'A256KW': {
assertEnryptedKey(encryptedKey);
if (encryptedKey === undefined)
throw new JWEInvalid('JWE Encrypted Key missing');
return aesKw(alg, key, encryptedKey);
}
case 'A128GCMKW':
case 'A192GCMKW':
case 'A256GCMKW': {
assertEnryptedKey(encryptedKey);
assertHeaderParameter(joseHeader, 'iv', 'Initialization Vector');
assertHeaderParameter(joseHeader, 'tag', 'Authentication Tag');
if (encryptedKey === undefined)
throw new JWEInvalid('JWE Encrypted Key missing');
if (typeof joseHeader.iv !== 'string')
throw new JWEInvalid(`JOSE Header "iv" (Initialization Vector) missing or invalid`);
if (typeof joseHeader.tag !== 'string')
throw new JWEInvalid(`JOSE Header "tag" (Authentication Tag) missing or invalid`);
const iv = base64url(joseHeader.iv);
const tag = base64url(joseHeader.tag);
return aesGcmKw(alg, key, encryptedKey, iv, tag);
4 changes: 2 additions & 2 deletions dist/browser/lib/encrypt_key_management.js
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@ import { wrap as aesGcmKw } from '../runtime/aesgcmkw.js';
import { encode as base64url } from '../runtime/base64url.js';
import cekFactory, { bitLengths as cekLengths } from '../lib/cek.js';
import { JOSENotSupported } from '../util/errors.js';
import { fromKeyLike } from '../jwk/from_key_like.js';
import { exportJWK } from '../key/export.js';
import checkKeyType from './check_key_type.js';
const generateCek = cekFactory(random);
async function encryptKeyManagement(alg, enc, key, providedCek, providedParameters = {}) {
@@ -30,7 +30,7 @@ async function encryptKeyManagement(alg, enc, key, providedCek, providedParamete
const { apu, apv } = providedParameters;
let { epk: ephemeralKey } = providedParameters;
ephemeralKey || (ephemeralKey = await ECDH.generateEpk(key));
const { x, y, crv, kty } = await fromKeyLike(ephemeralKey);
const { x, y, crv, kty } = await exportJWK(ephemeralKey);
const sharedSecret = await ECDH.deriveKey(key, ephemeralKey, alg === 'ECDH-ES' ? enc : alg, parseInt(alg.substr(-5, 3), 10) || cekLengths.get(enc), apu, apv);
parameters = { epk: { x, y, crv, kty } };
if (apu)
19 changes: 16 additions & 3 deletions dist/browser/runtime/fetch_jwks.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
import { JOSEError } from '../util/errors.js';
import { JOSEError, JWKSTimeout } from '../util/errors.js';
import globalThis, { isCloudflareWorkers } from './global.js';
const fetchJwks = async (url, timeout) => {
let controller;
let id;
let timedOut = false;
if (typeof AbortController === 'function') {
controller = new AbortController();
setTimeout(() => controller.abort(), timeout);
id = setTimeout(() => {
timedOut = true;
controller.abort();
}, timeout);
}
const response = await globalThis.fetch(url.href, {
const response = await globalThis
.fetch(url.href, {
signal: controller ? controller.signal : undefined,
redirect: 'manual',
method: 'GET',
@@ -17,7 +23,14 @@ const fetchJwks = async (url, timeout) => {
mode: 'cors',
}
: undefined),
})
.catch((err) => {
if (timedOut)
throw new JWKSTimeout();
throw err;
});
if (id !== undefined)
clearTimeout(id);
if (response.status !== 200) {
throw new JOSEError('Expected 200 OK from the JSON Web Key Set HTTP response');
}
5 changes: 5 additions & 0 deletions dist/browser/runtime/is_key_like.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { isCryptoKey } from './webcrypto.js';
export default (key) => {
return isCryptoKey(key);
};
export const types = ['CryptoKey'];
13 changes: 10 additions & 3 deletions dist/browser/util/errors.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
export class JOSEError extends Error {
constructor(message) {
var _a;
super(message);
this.code = JOSEError.code;
this.name = this.constructor.name;
if (Error.captureStackTrace) {
Error.captureStackTrace(this, this.constructor);
}
(_a = Error.captureStackTrace) === null || _a === void 0 ? void 0 : _a.call(Error, this, this.constructor);
}
}
JOSEError.code = 'ERR_JOSE_GENERIC';
@@ -91,6 +90,14 @@ export class JWKSMultipleMatchingKeys extends JOSEError {
}
}
JWKSMultipleMatchingKeys.code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';
export class JWKSTimeout extends JOSEError {
constructor() {
super(...arguments);
this.code = JWKSTimeout.code;
this.message = 'request timed out';
}
}
JWKSTimeout.code = 'ERR_JWKS_TIMEOUT';
export class JWSSignatureVerificationFailed extends JOSEError {
constructor() {
super(...arguments);
Loading