aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/bun.js/web-crypto.test.ts107
1 files changed, 106 insertions, 1 deletions
diff --git a/test/bun.js/web-crypto.test.ts b/test/bun.js/web-crypto.test.ts
index d7afd523c..5800f2a1d 100644
--- a/test/bun.js/web-crypto.test.ts
+++ b/test/bun.js/web-crypto.test.ts
@@ -1,4 +1,9 @@
-import { describe, expect, it } from "bun:test";
+import { describe, expect, it, beforeAll } from "bun:test";
+
+type Ed25519KeyPair = {
+ privateKey: CryptoKey;
+ publicKey: CryptoKey;
+};
describe("Web Crypto", () => {
it("has globals", () => {
@@ -71,4 +76,104 @@ describe("Web Crypto", () => {
const isSigValid = await verifySignature(msg, signature, SECRET);
expect(isSigValid).toBe(true);
});
+
+ describe("Ed25519", () => {
+ let importedKeypair: Ed25519KeyPair;
+
+ describe("generateKey", () => {
+ it("should generate key pair", async () => {
+ const keyPair = (await crypto.subtle.generateKey("Ed25519", true, ["sign", "verify"])) as Ed25519KeyPair;
+ expect(keyPair.privateKey).toBeDefined();
+ expect(keyPair.privateKey instanceof CryptoKey).toBe(true);
+ expect(keyPair.publicKey).toBeDefined();
+ expect(keyPair.publicKey instanceof CryptoKey).toBe(true);
+ });
+
+ it("should generate an extractable key pair", async () => {
+ const keyPair = (await crypto.subtle.generateKey("Ed25519", true, ["sign", "verify"])) as Ed25519KeyPair;
+ const privateKey = await crypto.subtle.exportKey("jwk", keyPair.privateKey);
+ const publicKey = await crypto.subtle.exportKey("jwk", keyPair.publicKey);
+
+ expect(privateKey).toBeDefined();
+ expect(privateKey.d).toBeDefined();
+ expect(privateKey.x).toBeDefined();
+ expect(privateKey.x!.length).toBe(43);
+ expect(privateKey.d!.length).toBe(43);
+ expect(privateKey.kty).toEqual("OKP");
+ expect(privateKey.crv).toEqual("Ed25519");
+ expect(privateKey.ext).toBe(true);
+ expect(privateKey.key_ops).toStrictEqual(["sign"]);
+
+ expect(publicKey).toBeDefined();
+ expect(publicKey.x).toBeDefined();
+ expect(publicKey.x!.length).toBe(43);
+ expect(publicKey.kty).toEqual("OKP");
+ expect(publicKey.crv).toEqual("Ed25519");
+ expect(publicKey.ext).toBe(true);
+ expect(publicKey.key_ops).toStrictEqual(["verify"]);
+ });
+
+ it("should generate an nonextractable private key", async done => {
+ const keyPair = (await crypto.subtle.generateKey("Ed25519", false, ["sign", "verify"])) as Ed25519KeyPair;
+ expect(keyPair.privateKey).toBeDefined();
+ expect(keyPair.publicKey).toBeDefined();
+ try {
+ await crypto.subtle.exportKey("jwk", keyPair.privateKey);
+ done(new Error("Should not be able to export private key"));
+ } catch (e) {
+ if (!(e instanceof Error)) {
+ process.exit(1);
+ } else {
+ expect(e.message).toBe("The CryptoKey is nonextractable");
+ done();
+ }
+ }
+ });
+
+ it("should generate keys with correct usages", async () => {
+ const keyPair1 = (await crypto.subtle.generateKey("Ed25519", false, ["sign"])) as Ed25519KeyPair;
+ const keyPair2 = (await crypto.subtle.generateKey("Ed25519", false, ["sign", "verify"])) as Ed25519KeyPair;
+
+ expect(keyPair1.privateKey?.usages).toBeDefined();
+ expect(keyPair1.publicKey?.usages).toBeDefined();
+ expect(keyPair1.privateKey?.usages).toStrictEqual(["sign"]);
+ expect(keyPair1.publicKey?.usages).toStrictEqual([]);
+
+ expect(keyPair2.privateKey?.usages).toBeDefined();
+ expect(keyPair2.publicKey?.usages).toBeDefined();
+ expect(keyPair2.privateKey?.usages).toEqual(["sign"]);
+ expect(keyPair2.publicKey?.usages).toEqual(["verify"]);
+ });
+ });
+
+ describe("importKey", () => {
+ it("should do raw import", async () => {
+ const privateKey = "whvdISVptebNycNBnzsGltGsSWhThuD-mP2tcsBbNt8";
+ const buf = Buffer.from(privateKey, "base64url");
+ console.log(buf);
+ const imported = await crypto.subtle.importKey("raw", buf, "Ed25519", false, ["sign", "verify"]);
+ });
+
+ it("should do JWK import", async () => {
+ const kp = await crypto.subtle.importKey(
+ "jwk",
+ {
+ kty: "OKP",
+ d: "whvdISVptebNycNBnzsGltGsSWhThuD-mP2tcsBbNt8",
+ use: "sig",
+ crv: "Ed25519",
+ // kid: "sig-1675587884",
+ x: "jZJN1eHyhwujYgS9btOxrSGJuVrWVmJMmkovz6vmmJQ",
+ alg: "EdDSA",
+ ext: true,
+ },
+ "Ed25519",
+ true,
+ ["sign"],
+ );
+ });
+
+ it("should do PKCS8 import", () => {});
+ });
+ });
});