diff options
-rw-r--r-- | test/bun.js/web-crypto.test.ts | 107 |
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", () => {}); + }); + }); }); |