Skip to content

Latest commit

 

History

History
80 lines (72 loc) · 2.17 KB

File metadata and controls

80 lines (72 loc) · 2.17 KB

ECDSA

W3 specification

Operations

Operation Parameters Result
generateKey EcKeyGenParams CryptoKeyPair
importKey EcKeyImportParams CryptoKey
exportKey None JsonWebKey or BufferSource
sign EcdsaParams ArrayBuffer
verify EcdsaParams Boolean

Generate key

const keys = await crypto.subtle.generateKey(
  {
    name: "ECDSA",
    namedCurve: "P-256", // P-256, P-384, or P-521
  },
  false,
  ["sign", "verify"],
);

Import key

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"],
);

Export key

const jwk = await crypto.subtle.exportKey(
  "jwk",
  publicKey,
);

Sign

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
);

Verify

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
);