aboutsummaryrefslogtreecommitdiff
path: root/test/js/third_party/jsonwebtoken/test-utils.js
diff options
context:
space:
mode:
authorGravatar Ciro Spaciari <ciro.spaciari@gmail.com> 2023-10-07 19:22:45 -0300
committerGravatar GitHub <noreply@github.com> 2023-10-07 15:22:45 -0700
commit35109160ca5d439116bedeb3302ec3745e2895d5 (patch)
tree7b864016acc5e689c6262a9fddc41b00160de28f /test/js/third_party/jsonwebtoken/test-utils.js
parentbb9933fa7ec5eafcb8ef902c96d85a2b248a85be (diff)
downloadbun-35109160ca5d439116bedeb3302ec3745e2895d5.tar.gz
bun-35109160ca5d439116bedeb3302ec3745e2895d5.tar.zst
bun-35109160ca5d439116bedeb3302ec3745e2895d5.zip
feat(KeyObject) (#5940)
* oops * createSecretKey but weird error * use the right prototype, do not add a function called export lol * HMAC JWT export + base64 fix * Fix Equals, Fix Get KeySize, add complete export RSA * fix RSA export * add EC exports * X25519 and ED25519 export + fixes * fix default exports * better asymmetricKeyType * fix private exports * fix symmetricKeySize * createPublicKey validations + refactor * jwt + der fixes * oopsies * add PEM into createPublicKey * cleanup * WIP * bunch of fixes * public from private + private OKP * encrypted keys fixes * oops * fix clear tls error, add some support to jwk and other formats on publicEncrypt/publicDecrypt * more fixes and tests working * more fixes more tests * more clear hmac errors * more tests and fixes * add generateKeyPair * more tests passing, some skips * fix EC key from private * fix OKP JWK * nodejs ignores ext and key_ops on KeyObject.exports * add EC sign verify test * some fixes * add crypto.generateKeyPairSync(type, options) * more fixes and more tests * fix hmac tests * jsonwebtoken tests * oops * oops2 * generated files * revert package.json * vm tests * todos instead of failues * toBunString -> toString * undo simdutf * improvements * unlikely * cleanup * cleanup 2 * oops * move _generateKeyPairSync checks to native
Diffstat (limited to 'test/js/third_party/jsonwebtoken/test-utils.js')
-rw-r--r--test/js/third_party/jsonwebtoken/test-utils.js116
1 files changed, 116 insertions, 0 deletions
diff --git a/test/js/third_party/jsonwebtoken/test-utils.js b/test/js/third_party/jsonwebtoken/test-utils.js
new file mode 100644
index 000000000..94a7e43e9
--- /dev/null
+++ b/test/js/third_party/jsonwebtoken/test-utils.js
@@ -0,0 +1,116 @@
+"use strict";
+
+import jwt from "jsonwebtoken";
+function expect(value) {
+ return {
+ toEqual: expected => {
+ if (typeof value === "object") {
+ if (typeof expected === "object") {
+ for (const propertyName in expected) {
+ expect(value[propertyName]).toEqual(expected[propertyName]);
+ }
+ return;
+ }
+ throw new Error(`Expected ${value} to strictly equal ${expected}`);
+ }
+ if (value !== expected) {
+ throw new Error(`Expected ${value} to equal ${expected}`);
+ }
+ },
+ toStrictEqual: expected => {
+ if (typeof value === "object") {
+ if (typeof expected === "object") {
+ for (const propertyName in expected) {
+ expect(value[propertyName]).toStrictEqual(expected[propertyName]);
+ }
+ return;
+ }
+ throw new Error(`Expected ${value} to strictly equal ${expected}`);
+ }
+ if (value !== expected) {
+ throw new Error(`Expected ${value} to strictly equal ${expected}`);
+ }
+ },
+ };
+}
+/**
+ * Correctly report errors that occur in an asynchronous callback
+ * @param {function(err): void} done The mocha callback
+ * @param {function(): void} testFunction The assertions function
+ */
+function asyncCheck(done, testFunction) {
+ try {
+ testFunction();
+ done();
+ } catch (err) {
+ done(err);
+ }
+}
+
+/**
+ * Base64-url encode a string
+ * @param str {string} The string to encode
+ * @returns {string} The encoded string
+ */
+function base64UrlEncode(str) {
+ return Buffer.from(str).toString("base64").replace(/[=]/g, "").replace(/\+/g, "-").replace(/\//g, "_");
+}
+
+/**
+ * Verify a JWT, ensuring that the asynchronous and synchronous calls to `verify` have the same result
+ * @param {string} jwtString The JWT as a string
+ * @param {string} secretOrPrivateKey The shared secret or private key
+ * @param {object} options Verify options
+ * @param {function(err, token):void} callback
+ */
+function verifyJWTHelper(jwtString, secretOrPrivateKey, options, callback) {
+ let error;
+ let syncVerified;
+ try {
+ syncVerified = jwt.verify(jwtString, secretOrPrivateKey, options);
+ } catch (err) {
+ error = err;
+ }
+ jwt.verify(jwtString, secretOrPrivateKey, options, (err, asyncVerifiedToken) => {
+ if (error) {
+ callback(err);
+ } else {
+ expect(syncVerified).toStrictEqual(asyncVerifiedToken);
+ callback(null, syncVerified);
+ }
+ });
+}
+
+/**
+ * Sign a payload to create a JWT, ensuring that the asynchronous and synchronous calls to `sign` have the same result
+ * @param {object} payload The JWT payload
+ * @param {string} secretOrPrivateKey The shared secret or private key
+ * @param {object} options Sign options
+ * @param {function(err, token):void} callback
+ */
+function signJWTHelper(payload, secretOrPrivateKey, options, callback) {
+ let error;
+ let syncSigned;
+ try {
+ syncSigned = jwt.sign(payload, secretOrPrivateKey, options);
+ } catch (err) {
+ error = err;
+ }
+ jwt.sign(payload, secretOrPrivateKey, options, (err, asyncSigned) => {
+ if (error) {
+ callback(err);
+ } else {
+ expect(syncSigned).toEqual(asyncSigned);
+ callback(null, syncSigned);
+ }
+ });
+}
+
+export { asyncCheck, base64UrlEncode, signJWTHelper, verifyJWTHelper };
+
+export default {
+ asyncCheck,
+ base64UrlEncode,
+ signJWTHelper,
+ verifyJWTHelper,
+};