80 lines
4.0 KiB
TypeScript
80 lines
4.0 KiB
TypeScript
|
import { Crypto as NodeCrypto } from "@peculiar/webcrypto";
|
||
|
import { Crypto as WebCrypto } from "@peculiar/webcrypto-web";
|
||
|
import * as assert from "assert";
|
||
|
|
||
|
const nodeCrypto = new NodeCrypto();
|
||
|
const webCrypto = new WebCrypto();
|
||
|
|
||
|
context("ED", () => {
|
||
|
|
||
|
context("generate/export/import/sign/verify", () => {
|
||
|
const alg = { name: "EdDSA", namedCurve: "Ed25519" };
|
||
|
const data = Buffer.from("Some message to sign");
|
||
|
|
||
|
it("pkcs8/spki", async () => {
|
||
|
const linerKeys = await webCrypto.subtle.generateKey(alg, true, ["sign", "verify"]);
|
||
|
const pkcs8 = await webCrypto.subtle.exportKey("pkcs8", linerKeys.privateKey);
|
||
|
const spki = await webCrypto.subtle.exportKey("spki", linerKeys.publicKey);
|
||
|
|
||
|
const nodePrivateKey = await nodeCrypto.subtle.importKey("pkcs8", pkcs8, alg, false, ["sign"]);
|
||
|
const nodePublicKey = await nodeCrypto.subtle.importKey("spki", spki, alg, false, ["verify"]);
|
||
|
const linerPrivateKey = await webCrypto.subtle.importKey("pkcs8", pkcs8, alg, false, ["sign"]);
|
||
|
const linerPublicKey = await webCrypto.subtle.importKey("spki", spki, alg, false, ["verify"]);
|
||
|
|
||
|
const nodeSignature = await nodeCrypto.subtle.sign(alg, nodePrivateKey, data);
|
||
|
const linerSignature = await webCrypto.subtle.sign(alg, linerPrivateKey, data);
|
||
|
|
||
|
assert.strictEqual(Buffer.from(linerSignature).toString("hex"), Buffer.from(nodeSignature).toString("hex"));
|
||
|
|
||
|
const nodeOk = await nodeCrypto.subtle.verify(alg, nodePublicKey, nodeSignature, data);
|
||
|
const linerOk = await webCrypto.subtle.verify(alg, linerPublicKey, nodeSignature, data);
|
||
|
|
||
|
assert.strictEqual(linerOk, nodeOk);
|
||
|
});
|
||
|
|
||
|
it("jwk", async () => {
|
||
|
const linerKeys = await webCrypto.subtle.generateKey(alg, true, ["sign", "verify"]);
|
||
|
const privateJwk = await webCrypto.subtle.exportKey("jwk", linerKeys.privateKey);
|
||
|
const publicJwk = await webCrypto.subtle.exportKey("jwk", linerKeys.publicKey);
|
||
|
|
||
|
const nodePrivateKey = await nodeCrypto.subtle.importKey("jwk", privateJwk, alg, false, ["sign"]);
|
||
|
const nodePublicKey = await nodeCrypto.subtle.importKey("jwk", publicJwk, alg, false, ["verify"]);
|
||
|
const linerPrivateKey = await webCrypto.subtle.importKey("jwk", privateJwk, alg, false, ["sign"]);
|
||
|
const linerPublicKey = await webCrypto.subtle.importKey("jwk", publicJwk, alg, false, ["verify"]);
|
||
|
|
||
|
const nodeSignature = await nodeCrypto.subtle.sign(alg, nodePrivateKey, data);
|
||
|
const linerSignature = await webCrypto.subtle.sign(alg, linerPrivateKey, data);
|
||
|
|
||
|
assert.strictEqual(Buffer.from(linerSignature).toString("hex"), Buffer.from(nodeSignature).toString("hex"));
|
||
|
|
||
|
const nodeOk = await nodeCrypto.subtle.verify(alg, nodePublicKey, nodeSignature, data);
|
||
|
const linerOk = await webCrypto.subtle.verify(alg, linerPublicKey, nodeSignature, data);
|
||
|
|
||
|
assert.strictEqual(linerOk, nodeOk);
|
||
|
});
|
||
|
|
||
|
it("pkcs8/raw", async () => {
|
||
|
const linerKeys = await webCrypto.subtle.generateKey(alg, true, ["sign", "verify"]);
|
||
|
const pkcs8 = await webCrypto.subtle.exportKey("pkcs8", linerKeys.privateKey);
|
||
|
const raw = await webCrypto.subtle.exportKey("raw", linerKeys.publicKey);
|
||
|
|
||
|
const nodePrivateKey = await nodeCrypto.subtle.importKey("pkcs8", pkcs8, alg, false, ["sign"]);
|
||
|
const nodePublicKey = await nodeCrypto.subtle.importKey("raw", raw, alg, false, ["verify"]);
|
||
|
const linerPrivateKey = await webCrypto.subtle.importKey("pkcs8", pkcs8, alg, false, ["sign"]);
|
||
|
const linerPublicKey = await webCrypto.subtle.importKey("raw", raw, alg, false, ["verify"]);
|
||
|
|
||
|
const nodeSignature = await nodeCrypto.subtle.sign(alg, nodePrivateKey, data);
|
||
|
const linerSignature = await webCrypto.subtle.sign(alg, linerPrivateKey, data);
|
||
|
|
||
|
assert.strictEqual(Buffer.from(linerSignature).toString("hex"), Buffer.from(nodeSignature).toString("hex"));
|
||
|
|
||
|
const nodeOk = await nodeCrypto.subtle.verify(alg, nodePublicKey, nodeSignature, data);
|
||
|
const linerOk = await webCrypto.subtle.verify(alg, linerPublicKey, nodeSignature, data);
|
||
|
|
||
|
assert.strictEqual(linerOk, nodeOk);
|
||
|
});
|
||
|
|
||
|
});
|
||
|
|
||
|
});
|