Pure Go implementation of secp256k1 elliptic curve cryptography.
go get p256k1.mleku.dev@latest
import (
"p256k1.mleku.dev/keys"
"p256k1.mleku.dev/schnorr"
"p256k1.mleku.dev/ecdsa"
"p256k1.mleku.dev/exchange"
)
// Generate a key pair
kp, _ := keys.Generate()
// Schnorr signing (BIP-340)
message := make([]byte, 32) // 32-byte message hash
sig, _ := schnorr.Sign(message, kp, nil)
// Verify
xonly, _, _ := keys.XOnlyFromPublic(kp.Pubkey())
valid := schnorr.Verify(sig, message, xonly)
// ECDSA signing
ecdsaSig, _ := ecdsa.Sign(message, kp.Seckey())
valid = ecdsa.Verify(ecdsaSig, message, kp.Pubkey())
// ECDH key exchange
kp2, _ := keys.Generate()
shared, _ := exchange.SharedSecret(kp2.Pubkey(), kp.Seckey())
import "p256k1.mleku.dev"
// Generate key pair
kp, _ := p256k1.KeyPairGenerate()
// Sign with Schnorr
var sig [64]byte
p256k1.SchnorrSign(sig[:], messageHash, kp, nil)
// Verify
xonly, _, _ := p256k1.XOnlyPubkeyFromPubkey(kp.Pubkey())
valid := p256k1.SchnorrVerify(sig[:], messageHash, xonly)
| Package | Description |
|---|---|
p256k1.mleku.dev | Core implementation with all primitives |
p256k1.mleku.dev/ecdsa | ECDSA signatures (sign, verify, recover) |
p256k1.mleku.dev/schnorr | BIP-340 Schnorr signatures with batch verify |
p256k1.mleku.dev/keys | Key generation, parsing, serialization |
p256k1.mleku.dev/exchange | ECDH key exchange and HKDF derivation |
p256k1.mleku.dev/signer | High-level signer abstraction |
Benchmarks on AMD64 (Ryzen 5):
| Operation | Time |
|---|---|
| Schnorr Sign | ~45 µs |
| Schnorr Verify | ~52 µs |
| ECDSA Sign | ~42 µs |
| ECDSA Verify | ~85 µs |
| ECDH | ~45 µs |
Batch Schnorr verification provides significant speedups for multiple signatures.
The implementation is organized into layers following DDD principles:
MIT License - derived from libsecp256k1.