isomorphic-secp256k1-js

3.0.0 • Public • Published

secp256k1 logo

Isomorphic SEPC256K1 JS

NPM Package CI status License: MIT

An ultra lightweight (1.6kb minify + gzip) Universal JavaScript Elliptic Curve Digital Signature Algorithm (ECDSA) for the Koblitz secp256k1 curve.

Cross platform support for Node.js and Deno.

Exports

The npm package isomorphic-secp256k1-js features optimal JavaScript module design. It doesn’t have a main index module, so use deep imports from the ECMAScript modules that are exported via the package.json field exports:

Impact on your bundle

Using the esbuild minify and gzip you can generate a digital signature with less than 1.6kb impact to your bundle.

cat dist/sign.mjs | wc
  1      86    2898

cat dist/sign.mjs.zip | wc
  10      59    1604
cat dist/get_public_key.mjs | wc
  1      27    1389

cat dist/get_public_key.mjs.zip | wc
  3      29    1006
cat dist/recover_public_key.mjs | wc
  1      50    2055

cat dist/recover_public_key.mjs.zip | wc
  4      38    1360

Installation

For Node.js, to install isomorphic-secp256k1-js run:

npm i isomorphic-secp256k1-js

For Deno.js, at the root of your project add a deno.json file and include these import paths:

{
  "imports": {
    "universal-sha256-js/": "https://deno.land/x/sha256js/",
    "universal-hmac-sha256-js/": "https://deno.land/x/hmacsha256/",
    "universal-hmac-sha256-js/hmac-sha256-node.mjs": "https://deno.land/x/hmacsha256/hmac-sha256-deno.mjs"
  }
}

Then import:

import recover_public_key from "https://deno.land/x/secp256k1js/recover_public_key.mjs";
import sign from "https://deno.land/x/secp256k1js/sign.mjs";
import get_public_key from "https://deno.land/x/secp256k1js/get_public_key.mjs";

Examples

Recover public key from private key.

const private_key = new Uint8Array([
  210, 101, 63, 247, 203, 178, 216, 255, 18, 154, 194, 126, 245, 120, 28, 230,
  139, 37, 88, 196, 26, 116, 175, 31, 45, 220, 166, 53, 203, 238, 240, 125,
]);

// Compressed public key.
console.log(get_public_key(private_key));

Generate a secp25k1 digital signature.

const private_key = new Uint8Array([
  210, 101, 63, 247, 203, 178, 216, 255, 18, 154, 194, 126, 245, 120, 28, 230,
  139, 37, 88, 196, 26, 116, 175, 31, 45, 220, 166, 53, 203, 238, 240, 125,
]);

const data = Uint8Array.from([
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
  22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
]);
sign({ data, private_key }).then(console.log);

The logged output is { r: [23, …, 89], s: [111, …, 142], v: 1 }

Note

As this package is ESM if you need to require it in a Common JS package, then you can require like this:

(async function () {
  const { default: recover_public_key } = await import(
    "isomorphic-secp256k1-js/recover_public_key.mjs"
  );
  const { number_to_array } = await import("./private/utils.mjs");

  const key_pair = await recover_public_key({
    data,
    signature: {
      r: number_to_array(
        50172533143525448505731076092836454339589141171079665638497512992118311974590n
      ),
      s: number_to_array(
        3372897403575535231543296615264124933490702058654620386530787287980439847001n
      ),
      v: 0,
    },
  });
  console.log(key_pair);
})();

Logged output was Uint8Array(33) [2,192,222,210,188,31,19,5,…

Requirements

Supported runtime environments:

Package Sidebar

Install

npm i isomorphic-secp256k1-js

Weekly Downloads

5

Version

3.0.0

License

MIT

Unpacked Size

17.4 kB

Total Files

7

Last publish

Collaborators

  • pur3miish