$ yarn add ecdsa-secp256r1
const ECDSA = require('ecdsa-secp256r1')
const privateKey = ECDSA.generateKey()
privateKey.toJWK()
/*
{ kty: 'EC',
crv: 'P-256',
x: '4YdUIhIDncVu5tScgjxthiXOO_el11FWb56gR3qnhVQ',
y: 'UyEvWOJbMZa9PtggGeRC9iQcAzOZZsyXpFE1qaF6jFk',
d: 'TYVI2fW-nHSPGCx0MhWasg2Ggiyl1E_Kq4D1A5LmkxU' }
*/
privateKey.asPublic().toJWK()
/*
{ kty: 'EC',
crv: 'P-256',
x: '4YdUIhIDncVu5tScgjxthiXOO_el11FWb56gR3qnhVQ',
y: 'UyEvWOJbMZa9PtggGeRC9iQcAzOZZsyXpFE1qaF6jFk' }
*/
privateKey.toPEM()
/*
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgTYVI2fW+nHSPGCx0
MhWasg2Ggiyl1E/Kq4D1A5LmkxWhRANCAAThh1QiEgOdxW7m1JyCPG2GJc4796XX
UVZvnqBHeqeFVFMhL1jiWzGWvT7YIBnkQvYkHAMzmWbMl6RRNamheoxZ
-----END PRIVATE KEY-----
*/
privateKey.asPublic().toPEM()
/*
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE4YdUIhIDncVu5tScgjxthiXOO/el
11FWb56gR3qnhVRTIS9Y4lsxlr0+2CAZ5EL2JBwDM5lmzJekUTWpoXqMWQ==
-----END PUBLIC KEY-----
*/
privateKey.toCompressedPublicKey()
/*
A+GHVCISA53FbubUnII8bYYlzjv3pddRVm+eoEd6p4VU
*/
const message = { text: 'hello' }
privateKey.sign(JSON.stringify(message))
/*
lY3Lf9xDtcsqom5IKu+ZyikxeYHlEuxnPfme4lMxp76NMkIm5BiLxVjbqBSo4itfT/LEuBCzMXl11cB0w/X8dA==
*/
const key = 'A+GHVCISA53FbubUnII8bYYlzjv3pddRVm+eoEd6p4VU'
const publicKey = ECDSA.fromCompressedPublicKey(key) // or ECDSA.fromJWK
const message = { text: 'hello' }
const signature = 'lY3Lf9xDtcsqom5IKu+ZyikxeYHlEuxnPfme4lMxp76NMkIm5BiLxVjbqBSo4itfT/LEuBCzMXl11cB0w/X8dA=='
publicKey.verify(JSON.stringify(message), signature)
/*
true
*/
Support: https://caniuse.com/#feat=cryptography
const ECDSA = require('ecdsa-secp256r1/browser')
const privateKey = await ECDSA.generateKey()
// API is the same as Node.js, except everything returns Promises
or
<script src="/PATH/TO/browser.js"></script>
<script>
;(async function() {
const privateKey = await ECDSA.generateKey()
const message = { text: 'hello' }
const signature = await privateKey.sign(JSON.stringify(message))
})()
</script>
Inspired from https://github.com/relocately/ec-key