diff --git a/package-lock.json b/package-lock.json index 0a1ad1800..b3bf3652c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,6 @@ "@typescript-eslint/parser": "^6.4.1", "c8": "^8.0.1", "chai": "^4.3.7", - "esbuild": "^0.19.2", "eslint": "^8.47.0", "eslint-config-prettier": "^9.0.0", "mocha": "^10.2.0", @@ -48,34 +47,106 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -204,358 +275,6 @@ "resolved": "packages/vdaf", "link": true }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", - "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", - "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", - "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", - "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", - "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", - "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", - "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", - "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", - "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", - "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", - "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", - "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", - "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", - "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", - "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", - "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", - "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", - "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", - "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", - "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", - "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", - "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -572,9 +291,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz", + "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -618,6 +337,37 @@ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true }, + "node_modules/@hpke/chacha20poly1305": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@hpke/chacha20poly1305/-/chacha20poly1305-1.2.2.tgz", + "integrity": "sha512-/0xGEhAR8SUP9N0ynvb0QMt0wPKEW1tfU0AIrPKiDhkihLq+z9fGn4zQlFWP5o8U/AMlMLAN/uCgA/WUOfMR5Q==", + "dependencies": { + "@noble/ciphers": "0.2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@hpke/core": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@hpke/core/-/core-1.2.2.tgz", + "integrity": "sha512-9N9Qryj0ZrN5M5rvkb7ZprdIewag/6EN3kzZM49bCR1yyHZrQYDEhzP/mLFbS46POAj/TRE1uYdEl6/cFIsgVA==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@hpke/dhkem-x25519": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@hpke/dhkem-x25519/-/dhkem-x25519-1.2.2.tgz", + "integrity": "sha512-TAAGe8xSHHEBwQE3PL6cGZxEFnNdNCNKfOGLoWfmwV73yhgD+x9pnDrr0DvBaZCTvt6JsIGpABFVwZZzUf4cJg==", + "dependencies": { + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", @@ -661,36 +411,36 @@ } }, "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.3.tgz", + "integrity": "sha512-nvOEW4YoqRKD9HBJ9OJ6przvIvP9qilp5nAn1462P5ZlL/MM9SgPEZFyjTGPfs7QkocdUsJa6KjHhyRn4ueItA==", "dev": true, "dependencies": { - "jest-get-type": "^29.4.3" + "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -726,6 +476,36 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@noble/ciphers": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.2.0.tgz", + "integrity": "sha512-6YBxJDAapHSdd3bLDv6x2wRPwq4QFMUaB3HvljNBUTThDd12eSm7/3F+2lnfzx2jvM+S6Nsy0jEt9QbPqSwqRw==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -852,9 +632,9 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sindresorhus/is": { @@ -915,9 +695,9 @@ "dev": true }, "node_modules/@tsconfig/node20": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.1.tgz", - "integrity": "sha512-7AuWv3hETpJGJegd0bTdnHIrdT/WuR3UUScGRemxhmH0vhbTTGKFZvY8DHZOqIECNdiIy6iFLh52E6Op9YrFiA==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.2.tgz", + "integrity": "sha512-madaWq2k+LYMEhmcp0fs+OGaLFk0OenpHa4gmI4VEmCKX4PJntQ6fnnGADVFrVkBj0wIdAlQnK/MrlYTHsa1gQ==", "dev": true }, "node_modules/@types/body-parser": { @@ -980,9 +760,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "version": "4.17.36", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", + "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", "dev": true, "dependencies": { "@types/node": "*", @@ -997,6 +777,12 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -1049,9 +835,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", - "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==", + "version": "20.5.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.3.tgz", + "integrity": "sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA==", "dev": true }, "node_modules/@types/qs": { @@ -1092,11 +878,12 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", "dev": true, "dependencies": { + "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } @@ -1372,13 +1159,11 @@ } }, "node_modules/agentkeepalive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", - "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", "humanize-ms": "^1.2.1" }, "engines": { @@ -1469,9 +1254,9 @@ } }, "node_modules/ansi-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", "dev": true }, "node_modules/ansi-styles": { @@ -1804,47 +1589,6 @@ "node": ">=12" } }, - "node_modules/c8/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/c8/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/c8/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/cacache": { "version": "15.3.0", "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", @@ -1884,9 +1628,9 @@ } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dev": true, "dependencies": { "clone-response": "^1.0.2", @@ -2113,14 +1857,17 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone-response": { @@ -2215,6 +1962,30 @@ "node": ">=8" } }, + "node_modules/configstore/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/configstore/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -2490,9 +2261,9 @@ } }, "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2616,43 +2387,6 @@ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, - "node_modules/esbuild": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", - "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.2", - "@esbuild/android-arm64": "0.19.2", - "@esbuild/android-x64": "0.19.2", - "@esbuild/darwin-arm64": "0.19.2", - "@esbuild/darwin-x64": "0.19.2", - "@esbuild/freebsd-arm64": "0.19.2", - "@esbuild/freebsd-x64": "0.19.2", - "@esbuild/linux-arm": "0.19.2", - "@esbuild/linux-arm64": "0.19.2", - "@esbuild/linux-ia32": "0.19.2", - "@esbuild/linux-loong64": "0.19.2", - "@esbuild/linux-mips64el": "0.19.2", - "@esbuild/linux-ppc64": "0.19.2", - "@esbuild/linux-riscv64": "0.19.2", - "@esbuild/linux-s390x": "0.19.2", - "@esbuild/linux-x64": "0.19.2", - "@esbuild/netbsd-x64": "0.19.2", - "@esbuild/openbsd-x64": "0.19.2", - "@esbuild/sunos-x64": "0.19.2", - "@esbuild/win32-arm64": "0.19.2", - "@esbuild/win32-ia32": "0.19.2", - "@esbuild/win32-x64": "0.19.2" - } - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -2754,19 +2488,7 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { + "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", @@ -2782,13 +2504,16 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">=4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { @@ -2820,15 +2545,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -2841,7 +2557,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -2868,16 +2584,16 @@ } }, "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.3.tgz", + "integrity": "sha512-x1vY4LlEMWUYVZQrFi4ZANXFwqYbJ/JNQspLVvzhW2BNY28aNcXMQH6imBbt+RBf5sVRTodYHXtSP/TLEU0Dxw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "@jest/expect-utils": "^29.6.3", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3006,9 +2722,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3262,9 +2978,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -3640,10 +3356,18 @@ "node": ">=10" } }, - "node_modules/hpke": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/hpke/-/hpke-0.5.0.tgz", - "integrity": "sha512-rD6Y9v9a2rrUsdRcmgH1rDo8NTrqzwfSZ72hcC4yp3/QpEiCujDnROGk+x8n48FrHu798OzIZOTrQYYMO09VnQ==" + "node_modules/hpke-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/hpke-js/-/hpke-js-1.2.2.tgz", + "integrity": "sha512-dIb7rEotvgW1VsnKSUYXINNh6f24hBDclcII2Rfvme0iaX41byBUfsjUdfRETp+hsbRxGJQyQD9RDFZGyLealA==", + "dependencies": { + "@noble/ciphers": "0.2.0", + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.1" + }, + "engines": { + "node": ">=16.0.0" + } }, "node_modules/html-escaper": { "version": "2.0.2", @@ -3936,9 +3660,9 @@ "dev": true }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -4148,21 +3872,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/istanbul-reports": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", @@ -4177,57 +3886,57 @@ } }, "node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.3.tgz", + "integrity": "sha512-3sw+AdWnwH9sSNohMRKA7JiYUJSRr/WS6+sEFfBuhxU5V5GlEVKfvUn8JuMHE0wqKowemR1C2aHy8VtXbaV8dQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.3.tgz", + "integrity": "sha512-6ZrMYINZdwduSt5Xu18/n49O1IgXdjsfG7NEZaQws9k69eTKWKcVbJBw/MZsjOZe2sSyJFmuzh8042XWwl54Zg==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "jest-diff": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -4236,12 +3945,12 @@ } }, "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -4384,9 +4093,9 @@ } }, "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -4579,29 +4288,20 @@ "dev": true }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -4947,6 +4647,17 @@ "balanced-match": "^1.0.0" } }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/mocha/node_modules/minimatch": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", @@ -4980,6 +4691,24 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocha/node_modules/yargs-parser": { "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", @@ -5276,6 +5005,17 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/npm-upgrade/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/npm-upgrade/node_modules/semver": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", @@ -5291,6 +5031,33 @@ "node": ">=10" } }, + "node_modules/npm-upgrade/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-upgrade/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -5668,9 +5435,9 @@ } }, "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5849,12 +5616,12 @@ } }, "node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -6058,9 +5825,9 @@ } }, "node_modules/rc-config-loader": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.2.tgz", - "integrity": "sha512-qKTnVWFl9OQYKATPzdfaZIbTxcHziQl92zYSxYC6umhOqyAsoj8H8Gq/+aFjAso68sBdjTz3A7omqeAkkF1MWg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", + "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", "dev": true, "dependencies": { "debug": "^4.3.4", @@ -6226,12 +5993,12 @@ } }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -6399,9 +6166,9 @@ } }, "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -6527,9 +6294,9 @@ } }, "node_modules/shiki": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.2.tgz", - "integrity": "sha512-ltSZlSLOuSY0M0Y75KA+ieRaZ0Trf5Wl3gutE7jzLuIcWxLp5i/uEnLoQWNvgKXQ5OMpGkJnVMRLAuzjc0LJ2A==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", + "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", "dev": true, "dependencies": { "ansi-sequence-parser": "^1.1.0", @@ -7067,9 +6834,9 @@ } }, "node_modules/typedoc/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -7082,16 +6849,16 @@ } }, "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/typescript-eslint-language-service": { @@ -7236,29 +7003,14 @@ "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/validate-npm-package-name": { @@ -7412,30 +7164,30 @@ "dev": true }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-unparser": { @@ -7475,7 +7227,6 @@ } }, "packages/common": { - "name": "@divviup/common", "version": "0.1.0", "license": "MPL-2.0", "dependencies": { @@ -7483,18 +7234,19 @@ } }, "packages/dap": { - "name": "@divviup/dap", "version": "0.1.0", "license": "MPL-2.0", "dependencies": { "@divviup/common": "^0.1.0", "@divviup/prio3": "^0.1.0", "@divviup/vdaf": "^0.1.0", - "hpke": "^0.5.0" + "@hpke/chacha20poly1305": "^1.2.2", + "@hpke/core": "^1.2.2", + "@hpke/dhkem-x25519": "^1.2.2", + "hpke-js": "^1.2.2" } }, "packages/field": { - "name": "@divviup/field", "version": "0.1.0", "license": "MPL-2.0", "dependencies": { @@ -7514,7 +7266,6 @@ } }, "packages/prg": { - "name": "@divviup/prg", "version": "0.1.0", "license": "MPL-2.0", "dependencies": { @@ -7525,7 +7276,6 @@ } }, "packages/prio3": { - "name": "@divviup/prio3", "version": "0.1.0", "license": "MPL-2.0", "dependencies": { @@ -7537,7 +7287,6 @@ } }, "packages/vdaf": { - "name": "@divviup/vdaf", "version": "0.1.0", "license": "MPL-2.0", "dependencies": { diff --git a/package.json b/package.json index 379005985..e3096cc30 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "scripts": { "test": "npm test -ws --if-present", "build": "npm run -ws --if-present build", + "build:clean": "npm run -ws --if-present build:clean", "test:coverage": "c8 npm test", "lint": "npm run -ws --if-present lint", "clean": "npm run -ws clean", @@ -31,7 +32,6 @@ "@typescript-eslint/parser": "^6.4.1", "c8": "^8.0.1", "chai": "^4.3.7", - "esbuild": "^0.19.2", "eslint": "^8.47.0", "eslint-config-prettier": "^9.0.0", "mocha": "^10.2.0", @@ -44,4 +44,4 @@ "typescript": "^5.0.4", "typescript-eslint-language-service": "^5.0.5" } -} \ No newline at end of file +} diff --git a/packages/dap/package.json b/packages/dap/package.json index e226f24cc..b388e93b3 100644 --- a/packages/dap/package.json +++ b/packages/dap/package.json @@ -5,27 +5,26 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "source": "src/index.ts", - "module": "dist/module.js", - "browser": "dist/browser.js", "type": "module", "license": "MPL-2.0", "scripts": { "clean": "rm -rf dist/*", "build:clean": "npm run clean && npm run build", - "build": "npm run build:web && npm run build:node", - "build:web": "esbuild browser=src/index.ts --bundle --loader:.wasm=binary --format=esm --outdir=dist --sourcemap --minify", - "build:node": "tsc -p ./tsconfig.json", + "build": "tsc -p ./tsconfig.json", "docs": "typedoc src", "test": "mocha \"src/**/*.spec.ts\"", "lint": "eslint src --ext .ts && prettier -c src", - "format": "prettier -w src", "check": "tsc --noEmit -p ./tsconfig.json", + "format": "prettier -w src", "test:coverage": "c8 npm test" }, "dependencies": { "@divviup/common": "^0.1.0", "@divviup/prio3": "^0.1.0", "@divviup/vdaf": "^0.1.0", - "hpke": "^0.5.0" + "@hpke/chacha20poly1305": "^1.2.2", + "@hpke/core": "^1.2.2", + "@hpke/dhkem-x25519": "^1.2.2", + "hpke-js": "^1.2.2" } } diff --git a/packages/dap/src/aggregator.spec.ts b/packages/dap/src/aggregator.spec.ts index d80555c3a..5cedafbad 100644 --- a/packages/dap/src/aggregator.spec.ts +++ b/packages/dap/src/aggregator.spec.ts @@ -2,7 +2,6 @@ import { Aggregator } from "./aggregator"; import assert from "assert"; import { Role } from "./constants"; import { HpkeConfig, HpkeConfigList } from "./hpkeConfig"; -import { Aead, Kdf, Kem, Keypair } from "hpke"; import { InputShareAad, InputShareInfo, @@ -11,12 +10,14 @@ import { } from "./report"; import { TaskId } from "./taskId"; import { ReportId } from "./reportId"; +import { KdfId, AeadId } from "hpke-js"; +import { DhkemP256HkdfSha256 } from "@hpke/core"; describe("DAP Aggregator", () => { it("should append a trailing slash on construction from a string", () => { const aggregator = new Aggregator( "http://example.com/aggregator", - Role.Leader, + Role.Leader ); assert.equal(aggregator.url.toString(), "http://example.com/aggregator/"); @@ -25,7 +26,7 @@ describe("DAP Aggregator", () => { it("should append a trailing slash on construction from a URL", () => { const aggregator = new Aggregator( new URL("http://example.com/aggregator"), - Role.Leader, + Role.Leader ); assert.equal(aggregator.url.toString(), "http://example.com/aggregator/"); @@ -34,27 +35,29 @@ describe("DAP Aggregator", () => { it("has a convenience method to build helper aggregator", () => { assert.deepEqual( Aggregator.helper("http://example.com"), - new Aggregator("http://example.com", Role.Helper), + new Aggregator("http://example.com", Role.Helper) ); }); it("has a convenience method to build leader aggregator", () => { assert.deepEqual( Aggregator.leader("http://example.com"), - new Aggregator("http://example.com", Role.Leader), + new Aggregator("http://example.com", Role.Leader) ); }); - it("performs a hpke seal with the first valid hpke config", () => { + it("performs a hpke seal with the first valid hpke config", async () => { const aggregator = Aggregator.leader("https://example.com"); - const kem = Kem.DhP256HkdfSha256; - const { public_key, private_key } = new Keypair(kem); + const kem = new DhkemP256HkdfSha256(); + const { publicKey, privateKey } = await kem.generateKeyPair(); + const key = await kem.serializePublicKey(publicKey); + const hpkeConfig = new HpkeConfig( 1, - kem, - Kdf.Sha256, - Aead.AesGcm128, - Buffer.from(public_key), + kem.id, + KdfId.HkdfSha256, + AeadId.Aes128Gcm, + Buffer.from(key) ); aggregator.hpkeConfigList = new HpkeConfigList([hpkeConfig]); @@ -62,32 +65,35 @@ describe("DAP Aggregator", () => { const aad = new InputShareAad( TaskId.random(), new ReportMetadata(ReportId.random(), Date.now() / 1000), - Buffer.alloc(0), + Buffer.alloc(0) ); - const cipherText = aggregator.seal(inputShare, aad); + const cipherText = await aggregator.seal(inputShare, aad); - const open = hpkeConfig - .config() - .base_mode_open( - private_key, - cipherText.encapsulatedContext, - new InputShareInfo(Role.Leader).encode(), - cipherText.payload, - aad.encode(), - ); + const open = await hpkeConfig.cipherSuite().open( + { + recipientKey: privateKey, + enc: cipherText.encapsulatedContext, + info: new InputShareInfo(Role.Leader).encode(), + }, + cipherText.payload, + aad.encode() + ); - assert.deepEqual(Buffer.from(open), inputShare.encode()); + assert.deepEqual( + Buffer.from(open).toString("hex"), + inputShare.encode().toString("hex") + ); }); - it("throws when hpke seal is called without a hpke config list", () => { + it("throws when hpke seal is called without a hpke config list", async () => { const aggregator = Aggregator.leader("https://example.com"); const inputShare = new PlaintextInputShare([], Buffer.from("payload")); const aad = new InputShareAad( TaskId.random(), new ReportMetadata(ReportId.random(), Date.now() / 1000), - Buffer.alloc(0), + Buffer.alloc(0) ); - assert.throws(() => aggregator.seal(inputShare, aad)); + await assert.rejects(aggregator.seal(inputShare, aad)); }); }); diff --git a/packages/dap/src/aggregator.ts b/packages/dap/src/aggregator.ts index e894a4395..24340574b 100644 --- a/packages/dap/src/aggregator.ts +++ b/packages/dap/src/aggregator.ts @@ -24,13 +24,16 @@ export class Aggregator { return new Aggregator(url, Role.Leader); } - seal(inputShare: PlaintextInputShare, aad: InputShareAad): HpkeCiphertext { + async seal( + inputShare: PlaintextInputShare, + aad: InputShareAad, + ): Promise { if (!this.hpkeConfigList) { throw new Error( "Attempted to call Aggregator#seal before fetching a hpkeConfigList.", ); } - return this.hpkeConfigList + return await this.hpkeConfigList .selectConfig() .seal( new InputShareInfo(this.role).encode(), diff --git a/packages/dap/src/client.spec.ts b/packages/dap/src/client.spec.ts index 347f9aa7a..502d1c9ee 100644 --- a/packages/dap/src/client.spec.ts +++ b/packages/dap/src/client.spec.ts @@ -1,13 +1,14 @@ import assert from "assert"; import { DAPClient, KnownVdafSpec, VdafMeasurement } from "./client"; import { HpkeConfig, HpkeConfigList } from "./hpkeConfig"; -import * as hpke from "hpke"; import { TaskId } from "./taskId"; import { DAPError } from "./errors"; import { zip } from "@divviup/common"; import { encodeOpaque32 } from "./encoding"; import { Prio3Count, Prio3Histogram, Prio3Sum } from "@divviup/prio3"; import { inspect } from "node:util"; +import { KdfId, AeadId, CipherSuite } from "hpke-js"; +import { DhkemP256HkdfSha256 } from "@hpke/core"; interface Fetch { (input: RequestInfo, init?: RequestInit | undefined): Promise; @@ -23,7 +24,7 @@ interface ResponseSpec { function mockFetch(mocks: { [url: string]: ResponseSpec[] }): Fetch { function fakeFetch( input: RequestInfo, - init?: RequestInit | undefined, + init?: RequestInit | undefined ): Promise { fakeFetch.calls.push([input, init]); @@ -40,8 +41,8 @@ function mockFetch(mocks: { [url: string]: ResponseSpec[] }): Fetch { if (!response) { throw new Error( `received unhandled request.\n\nurl: ${requestUrl}.\n\nmocks: ${inspect( - mocks, - ).slice(1, -1)}`, + mocks + ).slice(1, -1)}` ); } @@ -49,7 +50,7 @@ function mockFetch(mocks: { [url: string]: ResponseSpec[] }): Fetch { new Response(Buffer.from(response.body || ""), { status: response.status || 200, headers: { "Content-Type": response.contentType || "text/plain" }, - }), + }) ); } @@ -57,14 +58,18 @@ function mockFetch(mocks: { [url: string]: ResponseSpec[] }): Fetch { return fakeFetch; } -function buildHpkeConfigList(): HpkeConfigList { +async function buildHpkeConfigList(): Promise { + const kem = new DhkemP256HkdfSha256(); + const { publicKey } = await kem.generateKeyPair(); + const key = await kem.serializePublicKey(publicKey); + return new HpkeConfigList([ new HpkeConfig( Math.floor(Math.random() * 255), - hpke.Kem.DhP256HkdfSha256, - hpke.Kdf.Sha256, - hpke.Aead.AesGcm128, - Buffer.from(new hpke.Keypair(hpke.Kem.DhP256HkdfSha256).public_key), + kem.id, + KdfId.HkdfSha256, + AeadId.Aes128Gcm, + Buffer.from(key) ), ]); } @@ -87,12 +92,14 @@ function buildParams(): { }; } -function withHpkeConfigs< +async function withHpkeConfigs< Spec extends KnownVdafSpec, - Measurement extends VdafMeasurement, ->(dapClient: DAPClient): DAPClient { + Measurement extends VdafMeasurement +>( + dapClient: DAPClient +): Promise> { for (const aggregator of dapClient.aggregators) { - aggregator.hpkeConfigList = buildHpkeConfigList(); + aggregator.hpkeConfigList = await buildHpkeConfigList(); } return dapClient; } @@ -106,7 +113,7 @@ describe("DAPClient", () => { }); assert.equal( client.taskId.toString(), - "3XTBHxTtUAtI516GeXZsVIKjBPYVNIYmF94vEBb4jcY", + "3XTBHxTtUAtI516GeXZsVIKjBPYVNIYmF94vEBb4jcY" ); }); @@ -115,13 +122,13 @@ describe("DAPClient", () => { ...buildParams(), taskId: Buffer.from( "3XTBHxTtUAtI516GeXZsVIKjBPYVNIYmF94vEBb4jcY", - "base64url", + "base64url" ), }); assert.equal( client.taskId.toString(), - "3XTBHxTtUAtI516GeXZsVIKjBPYVNIYmF94vEBb4jcY", + "3XTBHxTtUAtI516GeXZsVIKjBPYVNIYmF94vEBb4jcY" ); }); @@ -171,7 +178,7 @@ describe("DAPClient", () => { ...buildParams(), timePrecisionSeconds: "ten" as unknown as number, }), - (e: Error) => e.message == "timePrecisionSeconds must be a number", + (e: Error) => e.message == "timePrecisionSeconds must be a number" ); }); }); @@ -180,17 +187,17 @@ describe("DAPClient", () => { it("can succeed", async () => { const params = buildParams(); const [hpkeConfig1, hpkeConfig2] = [ - buildHpkeConfigList(), - buildHpkeConfigList(), + await buildHpkeConfigList(), + await buildHpkeConfigList(), ]; const taskId = params.taskId.buffer.toString("base64url"); const fetch = mockFetch({ [`https://a.example.com/v1/hpke_config?task_id=${taskId}`]: [ - hpkeConfigResponse(hpkeConfig1), + await hpkeConfigResponse(hpkeConfig1), ], [`https://b.example.com/dap/hpke_config?task_id=${taskId}`]: [ - hpkeConfigResponse(hpkeConfig2), + await hpkeConfigResponse(hpkeConfig2), ], }); @@ -230,7 +237,7 @@ describe("DAPClient", () => { }); it("does not fetch key configuration if all of the aggregators already have key configs", async () => { - const client = withHpkeConfigs(new DAPClient(buildParams())); + const client = await withHpkeConfigs(new DAPClient(buildParams())); const fetch = mockFetch({}); client.fetch = fetch; await client.fetchKeyConfiguration(); @@ -244,13 +251,13 @@ describe("DAPClient", () => { [`https://a.example.com/v1/hpke_config?task_id=${taskId}`]: [ { contentType: "application/text", - body: buildHpkeConfigList().encode(), + body: (await buildHpkeConfigList()).encode(), }, ], [`https://b.example.com/dap/hpke_config?task_id=${taskId}`]: [ { contentType: "application/text", - body: buildHpkeConfigList().encode(), + body: (await buildHpkeConfigList()).encode(), }, ], }); @@ -263,25 +270,26 @@ describe("DAPClient", () => { describe("generating reports", () => { it("can succeed", async () => { - const privateKeys = [] as [Buffer, number][]; + const privateKeys = [] as [CryptoKey, number][]; const client = new DAPClient({ ...buildParams(), taskId: new TaskId(Buffer.alloc(32, 1)), }); - const kem = hpke.Kem.DhP256HkdfSha256; - const kdf = hpke.Kdf.Sha256; - const aead = hpke.Aead.AesGcm128; + const kem = new DhkemP256HkdfSha256(); + const kdf = KdfId.HkdfSha256; + const aead = AeadId.Aes128Gcm; for (const aggregator of client.aggregators) { - const { private_key, public_key } = new hpke.Keypair(kem); - privateKeys.push([Buffer.from(private_key), aggregator.role]); + const { publicKey, privateKey } = await kem.generateKeyPair(); + const key = await kem.serializePublicKey(publicKey); + privateKeys.push([privateKey, aggregator.role]); aggregator.hpkeConfigList = new HpkeConfigList([ new HpkeConfig( Math.floor(Math.random() * 255), - kem, + kem.id, kdf, aead, - Buffer.from(public_key), + Buffer.from(key) ), ]); } @@ -290,7 +298,7 @@ describe("DAPClient", () => { assert.equal(report.encryptedInputShares.length, 2); assert( Math.floor(Date.now() / 1000) - Number(report.metadata.time) < - 2 /*2 second delta, double the minimum batch duration*/, + 2 /*2 second delta, double the minimum batch duration*/ ); const aad = Buffer.concat([ @@ -301,7 +309,7 @@ describe("DAPClient", () => { for (const [[privateKey, role], share] of zip( privateKeys, - report.encryptedInputShares, + report.encryptedInputShares )) { const info = Buffer.from([ ...Buffer.from("dap-04 input share"), @@ -313,20 +321,18 @@ describe("DAPClient", () => { // with these decrypted shares in order to assert that the // client does in fact generate valid input shares, but for // now we just assert that the hpke layer is as expected - assert.doesNotThrow(() => - hpke.Config.try_from_ids(aead, kdf, kem).base_mode_open( - privateKey, - share.encapsulatedContext, - info, + await assert.doesNotReject( + new CipherSuite({ aead, kdf, kem }).open( + { recipientKey: privateKey, enc: share.encapsulatedContext, info }, share.payload, - aad, - ), + aad + ) ); } }); it("accepts an optional timestamp", async () => { - const client = withHpkeConfigs(new DAPClient(buildParams())); + const client = await withHpkeConfigs(new DAPClient(buildParams())); const fetch = mockFetch({}); client.fetch = fetch; const timestamp = new Date(0); @@ -337,24 +343,24 @@ describe("DAPClient", () => { }); it("fails if the measurement is not valid", async () => { - const client = withHpkeConfigs(new DAPClient(buildParams())); + const client = await withHpkeConfigs(new DAPClient(buildParams())); await assert.rejects( client.generateReport(-25.25), - /measurement -25.25 was not an integer/, // this is specific to the Sum circuit as configured + /measurement -25.25 was not an integer/ // this is specific to the Sum circuit as configured ); }); it("fails if there is an hpke error", async () => { - const client = withHpkeConfigs(new DAPClient(buildParams())); + const client = await withHpkeConfigs(new DAPClient(buildParams())); assert(client.aggregators[0].hpkeConfigList); client.aggregators[0].hpkeConfigList.configs[0].publicKey = Buffer.from( - "not a valid public key", + "not a valid public key" ); await assert.rejects(client.generateReport(21)); }); it("fails if the HpkeConfig cannot be converted to a hpke.Config", async () => { - const client = withHpkeConfigs(new DAPClient(buildParams())); + const client = await withHpkeConfigs(new DAPClient(buildParams())); assert(client.aggregators[0].hpkeConfigList); client.aggregators[0].hpkeConfigList.configs[0].aeadId = 500.25; await assert.rejects(client.generateReport(21)); @@ -365,10 +371,10 @@ describe("DAPClient", () => { const taskId = params.taskId.buffer.toString("base64url"); const fetch = mockFetch({ [`https://a.example.com/v1/hpke_config?task_id=${taskId}`]: [ - hpkeConfigResponse(), + await hpkeConfigResponse(), ], [`https://b.example.com/dap/hpke_config?task_id=${taskId}`]: [ - hpkeConfigResponse(), + await hpkeConfigResponse(), ], }); const client = new DAPClient(params); @@ -385,7 +391,7 @@ describe("DAPClient", () => { const fetch = mockFetch({ [`https://a.example.com/v1/tasks/${taskId}/reports`]: [{ status: 201 }], }); - const client = withHpkeConfigs(new DAPClient(params)); + const client = await withHpkeConfigs(new DAPClient(params)); client.fetch = fetch; const report = await client.generateReport(100); await client.sendReport(report); @@ -394,20 +400,20 @@ describe("DAPClient", () => { const request = new Request(url, args); assert.equal( request.url, - `https://a.example.com/v1/tasks/${taskId}/reports`, + `https://a.example.com/v1/tasks/${taskId}/reports` ); assert(!!args); assert.deepEqual(args.body, report.encode()); assert.equal(request.method, "PUT"); assert.equal( request.headers.get("Content-Type"), - "application/dap-report", + "application/dap-report" ); }); it("throws an error on failure", async () => { const fetch = mockFetch({}); - const client = withHpkeConfigs(new DAPClient(buildParams())); + const client = await withHpkeConfigs(new DAPClient(buildParams())); client.fetch = fetch; const report = await client.generateReport(100); await assert.rejects(client.sendReport(report)); @@ -421,10 +427,10 @@ describe("DAPClient", () => { const taskId = params.taskId.buffer.toString("base64url"); const fetch = mockFetch({ [`https://a.example.com/v1/hpke_config?task_id=${taskId}`]: [ - hpkeConfigResponse(), + await hpkeConfigResponse(), ], [`https://b.example.com/dap/hpke_config?task_id=${taskId}`]: [ - hpkeConfigResponse(), + await hpkeConfigResponse(), ], [`https://a.example.com/v1/tasks/${taskId}/reports`]: [{ status: 201 }], }); @@ -440,12 +446,12 @@ describe("DAPClient", () => { const taskId = params.taskId.buffer.toString("base64url"); const fetch = mockFetch({ [`https://a.example.com/v1/hpke_config?task_id=${taskId}`]: [ - hpkeConfigResponse(), - hpkeConfigResponse(), + await hpkeConfigResponse(), + await hpkeConfigResponse(), ], [`https://b.example.com/dap/hpke_config?task_id=${taskId}`]: [ - hpkeConfigResponse(), - hpkeConfigResponse(), + await hpkeConfigResponse(), + await hpkeConfigResponse(), ], [`https://a.example.com/v1/tasks/${taskId}/reports`]: [ { @@ -477,12 +483,12 @@ describe("DAPClient", () => { const taskId = params.taskId.buffer.toString("base64url"); const fetch = mockFetch({ [`https://a.example.com/v1/hpke_config?task_id=${taskId}`]: [ - hpkeConfigResponse(), - hpkeConfigResponse(), + await hpkeConfigResponse(), + await hpkeConfigResponse(), ], [`https://b.example.com/dap/hpke_config?task_id=${taskId}`]: [ - hpkeConfigResponse(), - hpkeConfigResponse(), + await hpkeConfigResponse(), + await hpkeConfigResponse(), ], [`https://a.example.com/v1/tasks/${taskId}/reports`]: [ outdatedConfigResponse(params.taskId), @@ -494,7 +500,7 @@ describe("DAPClient", () => { client.fetch = fetch; await assert.rejects( client.sendMeasurement(10), - (e) => e instanceof DAPError && e.shortType == "outdatedConfig", + (e) => e instanceof DAPError && e.shortType == "outdatedConfig" ); assert.equal(fetch.calls.length, 6); // we do not try again }); @@ -516,9 +522,11 @@ function outdatedConfigResponse(taskId: TaskId): ResponseSpec { }; } -function hpkeConfigResponse(config = buildHpkeConfigList()): ResponseSpec { +async function hpkeConfigResponse( + config?: HpkeConfigList +): Promise { return { - body: config.encode(), + body: (config || (await buildHpkeConfigList())).encode(), contentType: "application/dap-hpke-config-list", }; } diff --git a/packages/dap/src/client.ts b/packages/dap/src/client.ts index f1522e7bd..3711888bc 100644 --- a/packages/dap/src/client.ts +++ b/packages/dap/src/client.ts @@ -178,10 +178,12 @@ export class DAPClient< const time = roundedTime(this.#timePrecisionSeconds, options?.timestamp); const metadata = new ReportMetadata(reportId, time); const aad = new InputShareAad(this.taskId, metadata, publicShare); - const ciphertexts = this.#aggregators.map((aggregator, i) => - aggregator.seal( - new PlaintextInputShare(this.#extensions, inputShares[i]), - aad, + const ciphertexts = await Promise.all( + this.#aggregators.map((aggregator, i) => + aggregator.seal( + new PlaintextInputShare(this.#extensions, inputShares[i]), + aad, + ), ), ); diff --git a/packages/dap/src/hpke.spec.ts b/packages/dap/src/hpke.spec.ts deleted file mode 100644 index 1a411c9d0..000000000 --- a/packages/dap/src/hpke.spec.ts +++ /dev/null @@ -1,82 +0,0 @@ -import assert from "assert"; -import { Keypair, Aead, Kdf, Kem, Config } from "hpke"; -import { TextEncoder, TextDecoder } from "util"; - -describe("HPKE", () => { - describe("Config", () => { - it("throws when the algorithms specified are invalid", () => { - const [aead, kdf, kem] = [100, 100, 100]; - - assert(!(aead in Aead)); - assert(!(kdf in Kdf)); - assert(!(kem in Kem)); - - assert.throws(() => Config.try_from_ids(aead, kdf, kem)); - }); - }); - - describe("Keypair", () => { - it("generates a (65, 32)-byte keypair for Kem.DhP256HkdfSha256", () => { - const keypair = new Keypair(Kem.DhP256HkdfSha256); - assert.equal(keypair.public_key.length, 65); - assert.equal(keypair.private_key.length, 32); - }); - - it("generates a (32, 32)-byte keypair for Kem.X25519HkdfSha256", () => { - const keypair = new Keypair(Kem.X25519HkdfSha256); - assert.equal(keypair.public_key.length, 32); - assert.equal(keypair.private_key.length, 32); - }); - - it("throws when provided an invalid Kem", () => { - assert.throws(() => new Keypair(1000)); - }); - }); - - describe("Round trips", () => { - const decoder = new TextDecoder(); - const encoder = new TextEncoder(); - - const startMessage = "plaintext message text"; - const plaintext = encoder.encode(startMessage); - const info = encoder.encode("app info"); - const aad = encoder.encode("associated data"); - - for (const aead of [ - Aead.AesGcm128, - Aead.AesGcm256, - Aead.ChaCha20Poly1305, - ]) { - for (const kdf of [Kdf.Sha256, Kdf.Sha384, Kdf.Sha512]) { - for (const kem of [Kem.DhP256HkdfSha256, Kem.X25519HkdfSha256]) { - it(`succeeds for ${Aead[aead]}, ${Kdf[kdf]}, ${Kem[kem]}`, () => { - const config = Config.try_from_ids(aead, kdf, kem); - - assert.equal(config.aead, aead); - assert.equal(config.kem, kem); - assert.equal(config.kdf, kdf); - - const keypair = new Keypair(config.kem); - - const keyAndCiphertext = config.base_mode_seal( - keypair.public_key, - info, - plaintext, - aad, - ); - - const roundTrip = config.base_mode_open( - keypair.private_key, - keyAndCiphertext.encapped_key, - info, - keyAndCiphertext.ciphertext, - aad, - ); - - assert.equal(startMessage, decoder.decode(roundTrip)); - }); - } - } - } - }); -}); diff --git a/packages/dap/src/hpkeConfig.spec.ts b/packages/dap/src/hpkeConfig.spec.ts index 7a8a6c65f..5bf5698c6 100644 --- a/packages/dap/src/hpkeConfig.spec.ts +++ b/packages/dap/src/hpkeConfig.spec.ts @@ -1,48 +1,50 @@ import { HpkeConfig, HpkeConfigList } from "./hpkeConfig"; import assert from "assert"; -import { Kem, Kdf, Aead, Keypair } from "hpke"; +import { KemId, KdfId, AeadId } from "hpke-js"; +import { DhkemX25519HkdfSha256 } from "@hpke/dhkem-x25519"; +import { DhkemP256HkdfSha256 } from "@hpke/core"; describe("DAP HpkeConfigList", () => { it("encodes as expected", () => { const config1 = new HpkeConfig( 255, - Kem.DhP256HkdfSha256, - Kdf.Sha256, - Aead.AesGcm128, - Buffer.from("public key"), + KemId.DhkemP256HkdfSha256, + KdfId.HkdfSha256, + AeadId.Aes128Gcm, + Buffer.from("public key") ); const config2 = new HpkeConfig( 255, - Kem.X25519HkdfSha256, - Kdf.Sha384, - Aead.ChaCha20Poly1305, - Buffer.from("public key"), + KemId.DhkemX25519HkdfSha256, + KdfId.HkdfSha384, + AeadId.Chacha20Poly1305, + Buffer.from("public key") ); const list = new HpkeConfigList([config1, config2]); assert.deepEqual( [...list.encode()], - [0, 38, ...config1.encode(), ...config2.encode()], + [0, 38, ...config1.encode(), ...config2.encode()] ); }); it("decodes as expected", () => { const config1 = new HpkeConfig( 255, - Kem.DhP256HkdfSha256, - Kdf.Sha256, - Aead.AesGcm128, - Buffer.from("public key"), + KemId.DhkemP256HkdfSha256, + KdfId.HkdfSha256, + AeadId.Aes128Gcm, + Buffer.from("public key") ); const config2 = new HpkeConfig( 255, - Kem.X25519HkdfSha256, - Kdf.Sha384, - Aead.ChaCha20Poly1305, - Buffer.from("public key"), + KemId.DhkemX25519HkdfSha256, + KdfId.HkdfSha384, + AeadId.Chacha20Poly1305, + Buffer.from("public key") ); const list = HpkeConfigList.parse( - Buffer.from([0, 38, ...config1.encode(), ...config2.encode()]), + Buffer.from([0, 38, ...config1.encode(), ...config2.encode()]) ); assert.deepEqual(list.configs, [config1, config2]); @@ -51,18 +53,18 @@ describe("DAP HpkeConfigList", () => { it("selects the first config that it recognizes", () => { const validConfig = new HpkeConfig( 255, - Kem.DhP256HkdfSha256, - Kdf.Sha256, - Aead.AesGcm128, - Buffer.from("public key"), + KemId.DhkemP256HkdfSha256, + KdfId.HkdfSha256, + AeadId.Aes128Gcm, + Buffer.from("public key") ); const invalidConfig = new HpkeConfig( 100, - Kem.X25519HkdfSha256, - Kdf.Sha512, - Aead.ChaCha20Poly1305, - Buffer.from("public key"), + KemId.DhkemX25519HkdfSha256, + KdfId.HkdfSha512, + AeadId.Chacha20Poly1305, + Buffer.from("public key") ); // none of these are known ids, so we skip the invalid config @@ -80,10 +82,10 @@ describe("DAP HpkeConfig", () => { it("encodes as expected", () => { const config = new HpkeConfig( 255, - Kem.DhP256HkdfSha256, - Kdf.Sha256, - Aead.AesGcm128, - Buffer.from("public key"), + KemId.DhkemP256HkdfSha256, + KdfId.HkdfSha256, + AeadId.Aes128Gcm, + Buffer.from("public key") ); assert.deepEqual( @@ -95,7 +97,7 @@ describe("DAP HpkeConfig", () => { ...[0, 1], ...[0, 10], //length of "public key" ...Buffer.from("public key", "ascii"), - ], + ] ); }); @@ -108,7 +110,7 @@ describe("DAP HpkeConfig", () => { ...[0, 3], ...[0, 10], //length of "public key" ...Buffer.from("public key", "ascii"), - ]), + ]) ); assert.equal(config.publicKey.toString("ascii"), "public key"); @@ -152,10 +154,10 @@ describe("DAP HpkeConfig", () => { assert.throws(() => { new HpkeConfig( 100, - Kem.DhP256HkdfSha256, + KemId.DhkemP256HkdfSha256, 50, - Aead.ChaCha20Poly1305, - Buffer.alloc(10), + AeadId.Chacha20Poly1305, + Buffer.alloc(10) ); }, /kdfId was 50 but must be one of the following:/); }); @@ -164,111 +166,118 @@ describe("DAP HpkeConfig", () => { assert.throws(() => { new HpkeConfig( 100, - Kem.DhP256HkdfSha256, - Kdf.Sha512, + KemId.DhkemP256HkdfSha256, + KdfId.HkdfSha512, 5, - Buffer.alloc(10), + Buffer.alloc(10) ); }, /aeadId was 5 but must be one of the following:/); }); describe("seal", () => { - it("throws if the public key is a valid key for the wrong kem", () => { - const wrongKeyType = new Keypair(Kem.DhP256HkdfSha256).public_key; + it("throws if the public key is a valid key for the wrong kem", async () => { + const kem = new DhkemP256HkdfSha256(); + const { publicKey } = await kem.generateKeyPair(); + const key = await kem.serializePublicKey(publicKey); + const config = new HpkeConfig( 100, - Kem.X25519HkdfSha256, - Kdf.Sha256, - Aead.AesGcm128, - Buffer.from(wrongKeyType), + KemId.DhkemX25519HkdfSha256, + KdfId.HkdfSha256, + AeadId.Aes128Gcm, + Buffer.from(key) ); - assert.throws(() => { + await assert.rejects( config.seal( Buffer.from("info"), Buffer.from("plaintext"), - Buffer.from("aad"), - ); - }); + Buffer.from("aad") + ) + ); }); - it("throws if the public key is not a valid key at all", () => { + it("throws if the public key is not a valid key at all", async () => { const config = new HpkeConfig( 100, - Kem.X25519HkdfSha256, - Kdf.Sha256, - Aead.AesGcm128, - Buffer.from("not a valid key"), + KemId.DhkemX25519HkdfSha256, + KdfId.HkdfSha256, + AeadId.Aes128Gcm, + Buffer.from("not a valid key") ); - assert.throws(() => { + await assert.rejects( config.seal( Buffer.from("info"), Buffer.from("plaintext"), - Buffer.from("aad"), - ); - }); + Buffer.from("aad") + ) + ); }); - it("generates a valid X25519HkdfSha256 HpkeCiphertext if the ids are valid", () => { - const kem = Kem.X25519HkdfSha256; - const { public_key, private_key } = new Keypair(kem); + it("generates a valid X25519HkdfSha256 HpkeCiphertext if the ids are valid", async () => { + const kem = new DhkemX25519HkdfSha256(); + const { publicKey, privateKey } = await kem.generateKeyPair(); + const key = await kem.serializePublicKey(publicKey); const config = new HpkeConfig( 100, - kem, - Kdf.Sha256, - Aead.AesGcm128, - Buffer.from(public_key), + kem.id, + KdfId.HkdfSha256, + AeadId.Aes128Gcm, + Buffer.from(key) ); + const cipherSuite = config.cipherSuite(); + const info = Buffer.from("info"); const aad = Buffer.from("aad"); const plaintext = Buffer.from("plaintext"); - const hpkeCipherText = config.seal(info, plaintext, aad); + const hpkeCipherText = await config.seal(info, plaintext, aad); - const decrypted = config - .config() - .base_mode_open( - private_key, - hpkeCipherText.encapsulatedContext, + const decrypted = await cipherSuite.open( + { + recipientKey: privateKey, info, - hpkeCipherText.payload, - aad, - ); + enc: hpkeCipherText.encapsulatedContext, + }, + hpkeCipherText.payload, + aad + ); - assert.deepEqual(decrypted, plaintext); + assert.deepEqual(Buffer.from(decrypted), plaintext); }); - it("generates a valid DhP256HkdfSha256 HpkeCiphertext if the ids are valid", () => { - const kem = Kem.DhP256HkdfSha256; - - const { public_key, private_key } = new Keypair(kem); + it("generates a valid DhP256HkdfSha256 HpkeCiphertext if the ids are valid", async () => { + const kem = new DhkemP256HkdfSha256(); + const { publicKey, privateKey } = await kem.generateKeyPair(); + const key = await kem.serializePublicKey(publicKey); + console.log(Buffer.from(key).toString("ascii")); const config = new HpkeConfig( 100, - kem, - Kdf.Sha256, - Aead.AesGcm128, - Buffer.from(public_key), + kem.id, + KdfId.HkdfSha256, + AeadId.Aes128Gcm, + Buffer.from(key) ); const info = Buffer.from("info"); const aad = Buffer.from("aad"); const plaintext = Buffer.from("plaintext"); - const hpkeCipherText = config.seal(info, plaintext, aad); + const hpkeCipherText = await config.seal(info, plaintext, aad); - const decrypted = config - .config() - .base_mode_open( - private_key, - hpkeCipherText.encapsulatedContext, + const decrypted = await config.cipherSuite().open( + { + recipientKey: privateKey, + enc: hpkeCipherText.encapsulatedContext, info, - hpkeCipherText.payload, - aad, - ); + }, + hpkeCipherText.payload, + aad + ); - assert.deepEqual(decrypted, plaintext); + assert.deepEqual(Buffer.from(decrypted), plaintext); }); }); }); diff --git a/packages/dap/src/hpkeConfig.ts b/packages/dap/src/hpkeConfig.ts index 80f629ef8..121a02e5a 100644 --- a/packages/dap/src/hpkeConfig.ts +++ b/packages/dap/src/hpkeConfig.ts @@ -1,5 +1,5 @@ import { Buffer } from "buffer"; -import * as hpke from "hpke"; +import { CipherSuite, KemId, KdfId, AeadId } from "hpke-js"; import { Parser, ParseSource, Encodable, encodeArray16 } from "./encoding"; import { HpkeCiphertext } from "./ciphertext"; @@ -19,7 +19,7 @@ export class HpkeConfigList implements Encodable { if (this.#selectedConfig) return this.#selectedConfig; for (const config of this.configs) { try { - config.config(); + config.cipherSuite(); this.#selectedConfig = config; return config; } catch (_) { @@ -34,35 +34,33 @@ export class HpkeConfigList implements Encodable { export class HpkeConfig implements Encodable { constructor( public id: number, - public kemId: hpke.Kem, - public kdfId: hpke.Kdf, - public aeadId: hpke.Aead, - public publicKey: Buffer, + public kemId: number, + public kdfId: number, + public aeadId: number, + public publicKey: Buffer ) { if (id !== Math.floor(id) || id < 0 || id > 255) { throw new Error("id must be an integer in [0, 255]"); } - this.validate(hpke.Kem, "kemId"); - this.validate(hpke.Kdf, "kdfId"); - this.validate(hpke.Aead, "aeadId"); + this.validate(KemId, "kemId"); + this.validate(KdfId, "kdfId"); + this.validate(AeadId, "aeadId"); } private validate( - e: { [key: string]: unknown }, - id: "kemId" | "kdfId" | "aeadId", + e: { [key: string]: number }, + id: "kemId" | "kdfId" | "aeadId" ) { const actual = this[id]; - if (!(actual in e)) { - const errorText = Object.keys(e) - .map((n) => parseInt(n, 10)) - .filter((n) => !isNaN(n)) - .map((id) => ` ${id}: ${e[id] as string}`) + if (!Object.values(e).includes(actual)) { + const errorText = Object.entries(e) + .map(([name, identifier]) => ` ${identifier}: ${name}`) .join("\n"); throw new Error( - `${id} was ${actual} but must be one of the following:\n${errorText}`, + `${id} was ${actual} but must be one of the following:\n${errorText}` ); } } @@ -74,7 +72,7 @@ export class HpkeConfig implements Encodable { parser.uint16(), parser.uint16(), parser.uint16(), - parser.opaque16(), + parser.opaque16() ); } @@ -92,22 +90,34 @@ export class HpkeConfig implements Encodable { } /** @internal */ - config(): hpke.Config { - return hpke.Config.try_from_ids(this.aeadId, this.kdfId, this.kemId); + cipherSuite(): CipherSuite { + const aead: AeadId = this.aeadId as AeadId; + const kdf: KdfId = this.kdfId as KdfId; + const kem: KemId = this.kemId as KemId; + return new CipherSuite({ + aead, + kdf, + kem, + }); } - seal(info: Buffer, plaintext: Buffer, aad: Buffer): HpkeCiphertext { - const text = this.config().base_mode_seal( - this.publicKey, - info, - plaintext, - aad, + async seal( + info: Buffer, + plaintext: Buffer, + aad: Buffer + ): Promise { + const cipherSuite = this.cipherSuite(); + const recipientPublicKey = await cipherSuite.kem.importKey( + "raw", + this.publicKey ); - return new HpkeCiphertext( - this.id, - Buffer.from(text.encapped_key), - Buffer.from(text.ciphertext), + const { ct, enc } = await this.cipherSuite().seal( + { recipientPublicKey, info }, + plaintext, + aad ); + + return new HpkeCiphertext(this.id, Buffer.from(enc), Buffer.from(ct)); } } diff --git a/packages/dap/src/index.ts b/packages/dap/src/index.ts index c316ec886..439f30478 100644 --- a/packages/dap/src/index.ts +++ b/packages/dap/src/index.ts @@ -1,3 +1,6 @@ export { DAPClient, DAPClient as default } from "./client"; export { DAPError } from "./errors"; export type { ReportOptions } from "./client"; +export { KnownVdafSpec, VdafMeasurement } from "./client"; +export { TaskId } from "./taskId"; +export { HpkeConfig } from "./hpkeConfig";