@bradthomasbrown/finite-domain
v2.0.0
Published
Minimal, unoptimized, and unaudited cryptographic domain library in JavaScript/TypeScript.
Readme
finite-domain
This is a simple, minimal implementation of elliptic curve domain parameters in TypeScript/JavaScript.
Why?
There is surprisingly little information on all aspects of the "cryptographic stack" in JavaScript and elsewhere that is simple and minimal. This repository is part of a series of repositories that builds up this stack from first principles, including:
- Finite field arithmetic
- Elliptic curves over finite fields
- Sponge constructions and Keccak
- Elliptic curve domain parameters (this library)
- ECDSA
- Interacting with EVM nodes
- And potentially more
Dependencies
These should be installed when you install the finite-domain package, but this is listed here for completeness.
Installation
npm i @bradthomasbrown/finite-domainUsage
import { FiniteField } from "@bradthomasbrown/finite-field";
import { FiniteCurve, FinitePoint } from "@bradthomasbrown/finite-curve";
import { FiniteDomain } from "@bradthomasbrown/finite-domain.js";
let secp256k1:FiniteDomain;
{
const p =
(1n << 256n)
- (1n << 32n)
- 977n;
const F = new FiniteField(p);
const E = new FiniteCurve(F, 0, 7);
const G = new FinitePoint(
0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798n,
0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8n
);
const n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n;
const h = 1;
secp256k1 = new FiniteDomain(E, G, n, h);
}
// this should be the same as the example from `finite-curve`, but a bit simpler
const P = secp256k1.divide(new FinitePoint(), 2, secp256k1.G);
console.log({ x: P.x, y: P.y });
// x: 86918276961810349294276103416548851884759982251107n
// y: 87194829221142880348582938487511785107150118762739500766654458540580527283772n
// # note the relatively extremely low value of x after halving the generator point,
// # a characteristic of SEC 2 curves (https://bitcoin.stackexchange.com/a/113122)