go-blindsecp256k1/README.md
README.mdRaw
1# go-blindsecp256k1 [](https://godoc.org/github.com/arnaucube/go-blindsecp256k1) [](https://goreportcard.com/report/github.com/arnaucube/go-blindsecp256k1) [](https://github.com/arnaucube/go-blindsecp256k1/actions?query=workflow%3ATest)
2
3Blind signature over [secp256k1](https://en.bitcoin.it/wiki/Secp256k1), based on *"[New Blind Signature Schemes Based on the (Elliptic Curve) Discrete Logarithm Problem](https://sci-hub.do/10.1109/ICCKE.2013.6682844)"* paper by Hamid Mala & Nafiseh Nezhadansari.
4
5**WARNING**: this repo is experimental, do not use in production.
6
7## Usage
8
9```go
10import (
11 [...]
12 "github.com/arnaucube/go-blindsecp256k1"
13)
14
15[...]
16
17// signer: create new signer key pair
18sk := blindsecp256k1.NewPrivateKey()
19signerPubK := sk.Public()
20
21// signer: when user requests new R parameter to blind a new msg,
22// create new signerR (public) with its secret k
23k, signerR := blindsecp256k1.NewRequestParameters()
24
25// user: blinds the msg using signer's R
26msg := new(big.Int).SetBytes([]byte("test"))
27msgBlinded, userSecretData, err := blindsecp256k1.Blind(msg, signerR)
28require.Nil(t, err)
29
30// signer: signs the blinded message using its private key & secret k
31sBlind, err := sk.BlindSign(msgBlinded, k)
32require.Nil(t, err)
33
34// user: unblinds the blinded signature
35sig := blindsecp256k1.Unblind(sBlind, userSecretData)
36
37// signature can be verified with signer PublicKey
38verified := blindsecp256k1.Verify(msg, sig, signerPubK)
39assert.True(t, verified)
40```
41
42## WASM usage
43WASM wrappers for browser usage can be found at the [wasm](https://github.com/arnaucube/go-blindsecp256k1/tree/master/wasm/) directory with an example in html&js.