package blindsecp256k1
|
|
|
|
import (
|
|
"math/big"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestFlow(t *testing.T) {
|
|
// signer: create new signer key pair
|
|
sk := NewPrivateKey()
|
|
signerPubK := sk.Public()
|
|
|
|
// signer: when user requests new R parameter to blind a new msg,
|
|
// create new signerR (public) with its secret k
|
|
k, signerR := NewRequestParameters()
|
|
|
|
// user: blinds the msg using signer's R
|
|
msg := new(big.Int).SetBytes([]byte("test"))
|
|
msgBlinded, userSecretData, err := Blind(msg, signerR)
|
|
require.Nil(t, err)
|
|
|
|
// signer: signs the blinded message using its private key & secret k
|
|
sBlind, err := sk.BlindSign(msgBlinded, k)
|
|
require.Nil(t, err)
|
|
|
|
// user: unblinds the blinded signature
|
|
sig := Unblind(sBlind, userSecretData)
|
|
sigB := sig.Bytes()
|
|
sig2, err := NewSignatureFromBytes(sigB)
|
|
assert.Nil(t, err)
|
|
assert.Equal(t, sig, sig2)
|
|
|
|
// signature can be verified with signer PublicKey
|
|
verified := Verify(msg, sig, signerPubK)
|
|
assert.True(t, verified)
|
|
}
|
|
|
|
func newBigIntWithBitLen(n int) *big.Int {
|
|
b := make([]byte, n/8)
|
|
for i := 0; i < len(b); i++ {
|
|
b[i] = 255
|
|
}
|
|
bi := new(big.Int).SetBytes(b[:])
|
|
return bi
|
|
}
|
|
|
|
func TestMinBigIntBytesLen(t *testing.T) {
|
|
k := big.NewInt(1)
|
|
sk := PrivateKey(*k)
|
|
|
|
mBlinded := newBigIntWithBitLen(MinBigIntBytesLen)
|
|
require.Equal(t, MinBigIntBytesLen, mBlinded.BitLen())
|
|
_, err := sk.BlindSign(mBlinded, k)
|
|
assert.Nil(t, err)
|
|
|
|
mBlinded = new(big.Int).Div(mBlinded, big.NewInt(2))
|
|
require.Equal(t, MinBigIntBytesLen-1, mBlinded.BitLen())
|
|
_, err = sk.BlindSign(mBlinded, k)
|
|
assert.Equal(t, "mBlinded too small", err.Error())
|
|
}
|