webbuf_secp256k1

Crates.iowebbuf_secp256k1
lib.rswebbuf_secp256k1
version0.15.0
created_at2024-10-25 19:06:56.769599+00
updated_at2025-12-13 13:44:04.470188+00
descriptionRust WASM elliptic curve secp256k1 for digital signatures and Diffie-Hellman key exchange
homepage
repositoryhttps://github.com/identellica/webbuf
max_upload_size
id1422832
size161,417
Ryan X. Charles (ryanxcharles)

documentation

README

webbuf_secp256k1

Elliptic curve secp256k1 for ECDSA signatures and Diffie-Hellman key exchange, for Rust and WebAssembly.

Installation

[dependencies]
webbuf_secp256k1 = "0.13"

Usage

Key Generation

use webbuf_secp256k1::secp256k1::{
    private_key_verify, public_key_verify, public_key_create
};

// Verify a private key (must be 32 bytes, valid scalar)
let priv_key = [0x01u8; 32];
assert!(private_key_verify(&priv_key));

// Derive public key from private key (compressed, 33 bytes)
let pub_key = public_key_create(&priv_key).unwrap();
assert_eq!(pub_key.len(), 33);

// Verify a public key
assert!(public_key_verify(&pub_key));

Signing and Verification

use webbuf_secp256k1::secp256k1::{sign, verify, public_key_create};

let priv_key = [0x01u8; 32];
let hash = [0x02u8; 32]; // 32-byte message hash
let k = [0x03u8; 32];    // 32-byte nonce (use RFC 6979 in production!)

// Sign: returns 64-byte signature (r || s)
let signature = sign(&hash, &priv_key, &k).unwrap();
assert_eq!(signature.len(), 64);

// Verify signature
let pub_key = public_key_create(&priv_key).unwrap();
assert!(verify(&signature, &hash, &pub_key).is_ok());

Diffie-Hellman Key Exchange

use webbuf_secp256k1::secp256k1::{shared_secret, public_key_create};

let alice_priv = [0x01u8; 32];
let bob_priv = [0x02u8; 32];

let alice_pub = public_key_create(&alice_priv).unwrap();
let bob_pub = public_key_create(&bob_priv).unwrap();

// Both parties derive the same shared secret
let secret_a = shared_secret(&alice_priv, &bob_pub).unwrap();
let secret_b = shared_secret(&bob_priv, &alice_pub).unwrap();
assert_eq!(secret_a, secret_b);

Key Addition

use webbuf_secp256k1::secp256k1::{private_key_add, public_key_add, public_key_create};

let priv1 = [0x01u8; 32];
let priv2 = [0x02u8; 32];

// Add private keys (mod curve order)
let combined_priv = private_key_add(&priv1, &priv2).unwrap();

// Add public keys (point addition)
let pub1 = public_key_create(&priv1).unwrap();
let pub2 = public_key_create(&priv2).unwrap();
let combined_pub = public_key_add(&pub1, &pub2).unwrap();

API

Function Description
private_key_verify(key: &[u8]) -> bool Check if 32-byte key is valid
public_key_verify(key: &[u8]) -> bool Check if 33-byte compressed key is valid
public_key_create(priv_key: &[u8]) -> Result<Vec<u8>, String> Derive public key
private_key_add(key1: &[u8], key2: &[u8]) -> Result<Vec<u8>, String> Add two private keys
public_key_add(key1: &[u8], key2: &[u8]) -> Result<Vec<u8>, String> Add two public keys
sign(hash: &[u8], priv_key: &[u8], k: &[u8]) -> Result<Vec<u8>, String> Sign hash with nonce k
verify(sig: &[u8], hash: &[u8], pub_key: &[u8]) -> Result<(), String> Verify signature
shared_secret(priv_key: &[u8], pub_key: &[u8]) -> Result<Vec<u8>, String> ECDH shared secret

WebAssembly

Build with the wasm feature for WebAssembly support:

[dependencies]
webbuf_secp256k1 = { version = "0.13", features = ["wasm"] }

The TypeScript wrapper is available as @webbuf/secp256k1 on npm.

License

MIT

Commit count: 0

cargo fmt