W3 specification
const keys = await crypto.subtle.generateKey(
{
name: "ECDSA",
namedCurve: "P-256", // P-256, P-384, or P-521
},
false,
["sign", "verify"],
);
const publicKey = await crypto.subtle.importKey(
"jwk",
{
crv: "P-521",
ext: true,
key_ops: ["verify"],
kty: "EC",
x: "Adqn62IVQX8LIauAXrUtxH05DHlRygKcsP9qWAnd9tfJvpaG7bzIs16WMEUe1V-f4AxbQJceU4xCP8dJppK_fzdC",
y: "AEo3s1eExCOvpuBtBWnWlr7TuFhq_fMzqX9eqDHiy8qWl4I_koQtMePodrAc85mVrJAjvsa77Y3Ul3QtIWpXXBqa",
},
{
name: "ECDSA",
namedCurve: "P-521",
},
false,
["verify"],
);
const jwk = await crypto.subtle.exportKey(
"jwk",
publicKey,
);
const signature = await crypto.subtle.sign(
{
name: "ECDSA",
hash: "SHA-256", // SHA-1, SHA-256, SHA-384, or SHA-512
},
privateKey, // ECDSA private key
data, // BufferSource
);
const ok = await crypto.subtle.verify(
{
name: "ECDSA",
hash: "SHA-256", // SHA-1, SHA-256, SHA-384, or SHA-512
hash: "SHA-256", // SHA-1, SHA-256, SHA-384, or SHA-512
},
publicKey, // ECDSA public key
signature, // BufferSource
data, // BufferSource
);