npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

secp256k1-native

v1.1.3

Published

Low level bindings for bitcoin's secp256k1 library

Downloads

246

Readme

secp256k1-native

Build Status

Low-level bindings for bitcoin's secp256k1 elliptic curve library.

Usage

const crypto = require('crypto')
const secp256k1 = require('secp256k1-native')

const signCtx = secp256k1.secp256k1_context_create(secp256k1.secp256k1_context_SIGN)
const verifyCtx = secp256k1.secp256k1_context_create(secp256k1.secp256k1_context_VERIFY)

let seckey
do {
  seckey = crypto.randomBytes(32)
} while (!secp256k1.secp256k1_ec_seckey_verify(signCtx, seckey))

const pubkey = Buffer.alloc(64)
secp256k1.secp256k1_ec_pubkey_create(signCtx, pubkey, seckey)

const msg = Buffer.from('Hello, World!')
const msg32 = crypto.createHash('sha256').update(msg).digest()

const sig = Buffer.alloc(64)
secp256k1.secp256k1_ecdsa_sign(signCtx, sig, msg32, seckey)

const result = secp256k1.secp256k1_ecdsa_verify(verifyCtx, sig, msg32, pubkey) ? 'valid' : 'invalid'
console.log('signature is', result)
// signature is valid

API

Constants

  • secp256k1_SECKEYBYTES = 32
  • secp256k1_PUBKEYBYTES = 64
  • secp256k1_ec_TWEAKBYTES = 32
  • secp256k1_ecdsa_SIGBYTES = 64
  • secp256k1_ecdsa_recoverable_SIGBYTES = 65
  • secp256k1_ecdsa_COMPACTBYTES = 64
  • secp256k1_ecdsa_MSGYBYTES = 32

Context

A context is needed in order to store blinding fators used to protect against side-channel attacks.

var ctx = secp256k1.secp256k1_context_create(flags)

Create a new context in order to protect from side-channel attacks. Returns ctx as a buffer.

Flags:

  • secp256k1.secp256k1_context_SIGN
  • secp256k1.secp256k1_context_VERIFY
  • secp256k1.secp256k1_context_NONE
  • secp256k1.secp256k1_context_DECLASSIFY

secp256k1.secp256k1_context_randomize(ctx, [seed32])

Randomize a given context. seed32 may be used to pass 32 bytes of entropy or else it should be passed as null.

Keys

secp256k1.secp256k1_ec_pubkey_parse(ctx, pubkey, input)

Parse a 33 or 65 byte secp256k1 public key into the 64 byte internal representation used by the library. The result shall be written to pubkey, which should be a 64 byte buffer. Any ctx may be used.

const size = secp256k1.secp256k1_ec_pubkey_serialize(ctx, output, pubkey, flags)

Serialise a secp256k1 public key to either its 33 or 65 byte representation, the result shall be written to output and the function returns the number of bytes written.

Flags:

  • secp256k1.secp256k1_ec_COMPRESSED
  • secp256k1.secp256k1_ec_UNCOMPRESSED

secp256k1.secp256k1_ec_sekey_verify(ctx, seckey)

Verify seckey is a valid secp256k1 scalar, ie. less than the curve order. Any ctx may be used.

secp256k1.secp256k1_ec_pubkey_create(signCtx, pubkey, seckey)

Compute the public key for a given secp256k1 private key. seckey must be a valid secp256k1 scalar and pubkey should be a buffer of 64 bytes in length. signCtx must have been created with the secp256k1_context_SIGN flag.

secp256k1.secp256k1_ec_privkey_negate(ctx, seckey)

Negate a secp256k1 private key in place. For scalar, x, compute n - x, where n is secp256k1's order. Any ctx may be used.

secp256k1.secp256k1_ec_pubkey_negate(ctx, pubkey)

Negate a secp2561 public key in place. Any ctx may be used.

Key tweaking

sn_secp256k1_ec_privkey_tweak_add(ctx, seckey, tweak)

Tweak a secp256k1 private key in place, by adding a 32 byte tweak to it. Any ctx may be used

sn_secp256k1_ec_privkey_tweak_mul(ctx, seckey, tweak)

Tweak a secp256k1 private key in place, by multiplying with a 32 byte tweak. Any ctx may be used

sn_secp256k1_ec_privkey_tweak_add(verifyCtx, pubkey, tweak)

Tweak a secp256k1 public key in place, by adding a tweak * G to it, where G is the generator. A VERIFY context must be used. pubkey should be a parsed 64 byte internal representation.

sn_secp256k1_ec_privkey_tweak_mul(verifyCtx, pubkey, tweak)

Tweak a secp256k1 public key in place, by multiplying with a 32 byte tweak. A VERIFY context must be used. pubkey should be a parsed 64 byte internal representation.

Signatures

secp256k1.secp256k1_ecdsa_signature_parse_der(ctx, sig, input)

Parse a DER-encoded ECDSA signature into its internal representation. sig should be a 64 byte buffer.

secp256k1.secp256k1_ecdsa_signature_parse_compact(ctx, sig, input64)

Parse a 64 byte ECDSA signature into its internal representation. sig should be a 64 byte buffer.

secp256k1.secp256k1_ecdsa_signature_serialize_der(ctx, output, sig)

Serialise sig to output as a DER-encoded ECDSA signature.

secp256k1.secp256k1_ecdsa_signature_serialize_compact(ctx, output64, sig)

Serialise sig to output as a compact 64 byte ECDSA signature.

const hasChanged = secp256k1.secp256k1_ecdsa_signature_normalize(ctx, sigout, sigin)

Normalise a compact-encoded ECDSA signature to it's lower-S form. Returns a boolean as to whether the signature was changed.

secp256k1.secp256k1_ecdsa_sign(ctx, sig, msg32, seckey)

Compute an ECDSA signature for seckey against msg32, which should be the 32 byte hash of a given message. A SIGN context should be used.

secp256k1.secp256k1_ecdsa_verify(ctx, sig, msg32, pubkey)

Verify an ECDSA signature against a pubkey and msg32. A VERIFY context should be used.

Recoverable signatures

The public key is recoverable from the signature.

secp256k1.secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, sig, input64, recid)

Given the recovery id, recid, parse a 64 byte ECDSA recoverable signature into its 65 byte internal representation. sig should be a 65 byte buffer.

const recid = secp256k1.secp256k1_ecdsa_recoverable_signature_serialize_compact(ctx, output, sig)

Serialize a recoverable ECDSA signature to output in its 64 byte compact-encoded from and return the recovery ID.

secp256k1.secp256k1_ecdsa_recoverable_signature_convert(ctx, sigout, sigin)

Convert an ECDSA recoverable signature to an ECDSA signature. sigin should be secp256k1_ecdsa_recoverable_SIGBYTES and sigout should be secp256k1_ecdsa_SIGBYTES.

secp256k1.secp256k1_ecdsa_sign_recoverable(ctx, sig, msg32, seckey)

Compute an ECDSA recoverable signature for seckey against msg32, which should be the 32 byte hash of a given message. A SIGN context should be used and sig should be secp256k1_ecdsa_recoverable_SIGBYTES.

secp256k1.secp256k1_ecdsa_recover(ctx, pubkey, sig, msg32)

Recover the secp256k1 public key used to create sig from msg32. A VERIFY context should be used and sig should be secp256k1_ecdsa_recoverable_SIGBYTES.

Elliptic Curve Diffie-Hellman

secp256k1_ecdh(ctx, output, point, scalar, [data])

Compute a shared secret by performing an ECDH between a public key, point, and a secret key, scalar, with optional data. output should be a 32 byte buffer and any context may be used.