GitHub - cryptocoinjs/secp256k1-node: Node.js binding for an Optimized C library for EC operations on curve secp256k1 (original) (raw)
This module provides native bindings to bitcoin-core/secp256k1. In browser elliptic will be used as fallback.
Works on node version 14.0.0 or greater, because use N-API.
Installation
from npm
npm install secp256k1
from git
git clone git@github.com:cryptocoinjs/secp256k1-node.git
cd secp256k1-node
git submodule update --init
npm install
Windows
The easiest way to build the package on windows is to install windows-build-tools.
Or install the following software:
- Git: https://git-scm.com/download/win
- nvm: https://github.com/coreybutler/nvm-windows
- Python 2.7: https://www.python.org/downloads/release/python-2712/
- Visual C++ Build Tools: http://landinghub.visualstudio.com/visual-cpp-build-tools (Custom Install, and select both Windows 8.1 and Windows 10 SDKs)
And run commands:
npm config set msvs_version 2015 --global
npm install npm@next -g
Based on:
Usage
- API Reference (v4.x) (current version)
- API Reference (v3.x)
- API Reference (v2.x)
Private Key generation, Public Key creation, signature creation, signature verification
const { randomBytes } = require('crypto') const secp256k1 = require('secp256k1') // or require('secp256k1/elliptic') // if you want to use pure js implementation in node
// generate message to sign
// message should have 32-byte length, if you have some other length you can hash message
// for example msg = sha256(rawMessage)
const msg = randomBytes(32)
// generate privKey let privKey do { privKey = randomBytes(32) } while (!secp256k1.privateKeyVerify(privKey))
// get the public key in a compressed format const pubKey = secp256k1.publicKeyCreate(privKey)
// sign the message const sigObj = secp256k1.ecdsaSign(msg, privKey)
// verify the signature console.log(secp256k1.ecdsaVerify(sigObj.signature, msg, pubKey)) // => true
* .verify return false for high signatures
Get X point of ECDH
const { randomBytes } = require('crypto') // const secp256k1 = require('./elliptic') const secp256k1 = require('./')
// generate privKey function getPrivateKey () { while (true) { const privKey = randomBytes(32) if (secp256k1.privateKeyVerify(privKey)) return privKey } }
// generate private and public keys const privKey = getPrivateKey() const pubKey = secp256k1.publicKeyCreate(privKey)
// compressed public key from X and Y function hashfn (x, y) { const pubKey = new Uint8Array(33) pubKey[0] = (y[31] & 1) === 0 ? 0x02 : 0x03 pubKey.set(x, 1) return pubKey }
// get X point of ecdh const ecdhPointX = secp256k1.ecdh(pubKey, privKey, { hashfn }, Buffer.alloc(33)) console.log(ecdhPointX.toString('hex'))
LICENSE
This library is free and open-source software released under the MIT license.