69 lines
2.6 KiB
Markdown
69 lines
2.6 KiB
Markdown
# p256k1
|
|
|
|
This is a library that uses the `bitcoin-core` optimized secp256k1 elliptic
|
|
curve signatures library for `nostr` schnorr signatures.
|
|
|
|
If you need to build it without `libsecp256k1` C library, you must disable cgo:
|
|
|
|
export CGO_ENABLED='0'
|
|
|
|
This enables the fallback `btcec` pure Go library to be used in its place. This
|
|
CGO setting is not default for Go, so it must be set in order to disable this.
|
|
|
|
The standard `libsecp256k1-0` and `libsecp256k1-dev` available through the
|
|
ubuntu dpkg repositories do not include support for the BIP-340 schnorr
|
|
signatures or the ECDH X-only shared secret generation algorithm, so you must
|
|
follow the following instructions to get the benefits of using this library. It
|
|
is 4x faster at signing and generating shared secrets so it is a must if your
|
|
intention is to use it for high throughput systems like a network transport.
|
|
|
|
The easy way to install it, if you have ubuntu/debian, is the script
|
|
[../ubuntu_install_libsecp256k1.sh](../../../scripts/ubuntu_install_libsecp256k1.sh),
|
|
it
|
|
handles the dependencies and runs the build all in one step for you. Note that
|
|
it
|
|
|
|
For ubuntu, you need these:
|
|
|
|
sudo apt -y install build-essential autoconf libtool
|
|
|
|
For other linux distributions, the process is the same but the dependencies are
|
|
likely different. The main thing is it requires make, gcc/++, autoconf and
|
|
libtool to run. The most important thing to point out is that you must enable
|
|
the schnorr signatures feature, and ECDH.
|
|
|
|
The directory `p256k/secp256k1` needs to be initialized, built and installed,
|
|
like so:
|
|
|
|
```bash
|
|
cd secp256k1
|
|
git submodule init
|
|
git submodule update
|
|
```
|
|
|
|
Then to build, you can refer to the [instructions](./secp256k1/README.md) or
|
|
just use the default autotools:
|
|
|
|
```bash
|
|
./autogen.sh
|
|
./configure --enable-module-schnorrsig --enable-module-ecdh --prefix=/usr
|
|
make
|
|
sudo make install
|
|
```
|
|
|
|
On WSL2 you may have to attend to various things to make this work, setting up
|
|
your basic locale (uncomment one or more in `/etc/locale.gen`, and run
|
|
`locale-gen`), installing the basic build tools (build-essential or base-devel)
|
|
and of course git, curl, wget, libtool and
|
|
autoconf.
|
|
|
|
## ECDH
|
|
|
|
TODO: Currently the use of the libsecp256k1 library for ECDH, used in nip-04 and
|
|
nip-44 encryption is not enabled, because the default version uses the Y
|
|
coordinate and this is incorrect for nostr. It will be enabled soon... for now
|
|
it is done with the `btcec` fallback version. This is slower, however previous
|
|
tests have shown that this ECDH library is fast enough to enable 8mb/s
|
|
throughput per CPU thread when used to generate a distinct secret for TCP
|
|
packets. The C library will likely raise this to 20mb/s or more.
|