--- title: Sonr Crypto description: A Go cryptography library for threshold signatures, multi-party computation, zero-knowledge proofs, and decentralized identity — built on a single pluggable elliptic-curve abstraction. sidebar: label: Overview icon: book-open --- `github.com/sonr-io/crypto` is the cryptographic foundation of Sonr. It bundles roughly 60 Go packages spanning elliptic-curve arithmetic, secret sharing, distributed key generation, threshold ECDSA and Ed25519, BLS and BBS+ signatures, range proofs, accumulators, homomorphic encryption, and the identity layer that turns a threshold key into a `did:key` identifier issuing UCAN capability tokens. Almost everything is generic over one abstraction — the `Curve` / `Point` / `Scalar` triple in [`core/curves`](/foundations/curves). Learn that first and the rest of the library reads consistently. ## Install ```bash go get github.com/sonr-io/crypto ``` The module requires **Go 1.24.7 or newer** and is licensed Apache 2.0. :::warning[Read before you deploy] This library carries no public security audit, and several packages contain stubs, known defects, or deliberately non-constant-time code paths. The [security notes](/reference/security) page enumerates every one we found while documenting it — read it before you build anything load-bearing on these primitives. ::: ## A first example Threshold ECDSA is the library's headline capability. The [`mpc`](/identity/mpc-enclave) package wraps the DKLs18 two-party protocol into a single value you can create, sign with, verify, and rotate: ```go package main import ( "fmt" "log" "github.com/sonr-io/crypto/mpc" ) func main() { // Runs both sides of the 2-of-2 distributed key generation. enclave, err := mpc.NewEnclave() if err != nil { log.Fatal(err) } sig, err := enclave.Sign([]byte("transfer 100 to bob")) if err != nil { log.Fatal(err) } ok, err := enclave.Verify([]byte("transfer 100 to bob"), sig) if err != nil { log.Fatal(err) } fmt.Println("public key:", enclave.PubKeyHex(), "valid:", ok) } ``` ## The layers The curve abstraction, modular arithmetic, hash-to-field, commitments, and the round-driving protocol iterator every multi-party package uses. AES-GCM and deterministic AES-SIV, Argon2id key derivation, HKDF and X25519, plus the salt, password, and memory-hygiene helpers. BLS aggregation and threshold keygen, BBS+ selective disclosure, ECDSA canonicalization and RFC 6979 signing, VRFs, and chain-specific Schnorr schemes. Shamir, Feldman, and Pedersen sharing; FROST and Gennaro DKG; two-party threshold ECDSA; threshold Ed25519; and the oblivious transfer beneath them. Schnorr proofs of knowledge, pairing-based accumulators for set membership, Bulletproofs range proofs, and Paillier homomorphic encryption. `did:key` encoding, the MPC enclave, UCAN capability tokens, ECIES payload encryption, and WebAssembly module signing. ## Choosing a primitive | Goal | Reach for | | --- | --- | | Sign with a key that never exists in one place | [Threshold ECDSA](/threshold/threshold-ecdsa) or the [MPC enclave](/identity/mpc-enclave) | | Produce a standard Ed25519 signature from shares | [Threshold Ed25519](/threshold/threshold-ed25519) | | Aggregate many signatures into one | [BLS](/signatures/bls) | | Prove attributes without revealing them | [BBS+](/signatures/bbs) | | Prove a hidden value lies in a range | [Bulletproofs](/zero-knowledge/bulletproof) | | Prove set membership with a constant-size witness | [Accumulator](/zero-knowledge/accumulator) | | Add ciphertexts without decrypting | [Paillier](/zero-knowledge/paillier) | | Split an existing secret among holders | [Secret sharing](/threshold/secret-sharing) | | Derive a key from a password | [Argon2id](/symmetric/key-derivation) | | Encrypt a payload to a public key | [ECIES](/identity/ecies) | | Delegate scoped authority to another party | [UCAN](/identity/ucan) | ## Where to next Install the module, pick a curve, and understand the conventions shared across packages. Every importable package mapped to the page that documents it.