Skip to content

Commit

Permalink
feat: embed pedersen params
Browse files Browse the repository at this point in the history
  • Loading branch information
tarrencev committed Jul 13, 2022
1 parent 11ab8ac commit 2f9ce5c
Show file tree
Hide file tree
Showing 8 changed files with 149 additions and 274 deletions.
17 changes: 5 additions & 12 deletions account.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package caigo

import (
"context"
"fmt"
"math/big"

"github.com/dontpanicdao/caigo/types"
Expand All @@ -20,7 +19,6 @@ type Account struct {
PublicX *big.Int
PublicY *big.Int
private *big.Int
curve *StarkCurve
}

/*
Expand All @@ -30,13 +28,9 @@ type Account struct {
- full provider definition
- public key pair for signature verifications
*/
func NewAccount(sc *StarkCurve, private, address string, provider types.Provider) (*Account, error) {
if len(sc.ConstantPoints) == 0 {
return nil, fmt.Errorf("must initiate precomputed constant points")
}

func NewAccount(private, address string, provider types.Provider) (*Account, error) {
priv := SNValToBN(private)
x, y, err := sc.PrivateToPoint(priv)
x, y, err := Curve.PrivateToPoint(priv)
if err != nil {
return nil, err
}
Expand All @@ -47,12 +41,11 @@ func NewAccount(sc *StarkCurve, private, address string, provider types.Provider
PublicX: x,
PublicY: y,
private: priv,
curve: sc,
}, nil
}

func (account *Account) Sign(msgHash *big.Int) (*big.Int, *big.Int, error) {
return account.curve.Sign(msgHash, account.private)
return Curve.Sign(msgHash, account.private)
}

/*
Expand All @@ -77,7 +70,7 @@ func (account *Account) HashMultiCall(fee *types.Felt, nonce *big.Int, calls []t

callArray := fmtExecuteCalldata(nonce, calls)
callArray = append(callArray, big.NewInt(int64(len(callArray))))
cdHash, err := account.curve.HashElements(callArray)
cdHash, err := Curve.HashElements(callArray)
if err != nil {
return nil, err
}
Expand All @@ -93,7 +86,7 @@ func (account *Account) HashMultiCall(fee *types.Felt, nonce *big.Int, calls []t
}

multiHashData = append(multiHashData, big.NewInt(int64(len(multiHashData))))
return account.curve.HashElements(multiHashData)
return Curve.HashElements(multiHashData)
}

func (account *Account) EstimateFee(ctx context.Context, calls []types.Transaction) (*types.FeeEstimate, error) {
Expand Down
106 changes: 48 additions & 58 deletions caigo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,38 +7,28 @@ import (
"testing"
)

var caigoCurve StarkCurve

func init() {
var err error
caigoCurve, err = SC(WithConstants("./pedersen_params.json"))
if err != nil {
panic(err.Error())
}
}

func BenchmarkSignatureVerify(b *testing.B) {
private, _ := caigoCurve.GetRandomPrivateKey()
x, y, _ := caigoCurve.PrivateToPoint(private)
private, _ := Curve.GetRandomPrivateKey()
x, y, _ := Curve.PrivateToPoint(private)

hash, _ := caigoCurve.PedersenHash(
hash, _ := Curve.PedersenHash(
[]*big.Int{
HexToBN("0x7f15c38ea577a26f4f553282fcfe4f1feeb8ecfaad8f221ae41abf8224cbddd"),
HexToBN("0x7f15c38ea577a26f4f553282fcfe4f1feeb8ecfaad8f221ae41abf8224cbdde"),
})

r, s, _ := caigoCurve.Sign(hash, private)
r, s, _ := Curve.Sign(hash, private)

b.Run(fmt.Sprintf("sign_input_size_%d", hash.BitLen()), func(b *testing.B) {
caigoCurve.Sign(hash, private)
Curve.Sign(hash, private)
})
b.Run(fmt.Sprintf("verify_input_size_%d", hash.BitLen()), func(b *testing.B) {
caigoCurve.Verify(hash, r, s, x, y)
Curve.Verify(hash, r, s, x, y)
})
}

func TestHashAndSign(t *testing.T) {
hashy, err := caigoCurve.HashElements([]*big.Int{
hashy, err := Curve.HashElements([]*big.Int{
big.NewInt(1953658213),
big.NewInt(126947999705460),
big.NewInt(1953658213),
Expand All @@ -47,37 +37,37 @@ func TestHashAndSign(t *testing.T) {
t.Errorf("Hasing elements: %v\n", err)
}

priv, _ := caigoCurve.GetRandomPrivateKey()
x, y, err := caigoCurve.PrivateToPoint(priv)
priv, _ := Curve.GetRandomPrivateKey()
x, y, err := Curve.PrivateToPoint(priv)
if err != nil {
t.Errorf("Could not convert random private key to point: %v\n", err)
}

r, s, err := caigoCurve.Sign(hashy, priv)
r, s, err := Curve.Sign(hashy, priv)
if err != nil {
t.Errorf("Could not convert gen signature: %v\n", err)
}

if !caigoCurve.Verify(hashy, r, s, x, y) {
if !Curve.Verify(hashy, r, s, x, y) {
t.Errorf("Verified bad signature %v %v\n", r, s)
}
}

func TestComputeFact(t *testing.T) {
testFacts := []struct {
programHash *big.Int
programOutput []*big.Int
expected *big.Int
programHash *big.Int
programOutput []*big.Int
expected *big.Int
}{
{
programHash: HexToBN("0x114952172aed91e59f870a314e75de0a437ff550e4618068cec2d832e48b0c7"),
programHash: HexToBN("0x114952172aed91e59f870a314e75de0a437ff550e4618068cec2d832e48b0c7"),
programOutput: []*big.Int{big.NewInt(289)},
expected: HexToBN("0xe6168c0a865aa80d724ad05627fa65fbcfe4b1d66a586e9f348f461b076072c4"),
expected: HexToBN("0xe6168c0a865aa80d724ad05627fa65fbcfe4b1d66a586e9f348f461b076072c4"),
},
{
programHash: HexToBN("0x79920d895101ad1fbdea9adf141d8f362fdea9ee35f33dfcd07f38e4a589bab"),
programHash: HexToBN("0x79920d895101ad1fbdea9adf141d8f362fdea9ee35f33dfcd07f38e4a589bab"),
programOutput: []*big.Int{StrToBig("2754806153357301156380357983574496185342034785016738734224771556919270737441")},
expected: HexToBN("0x1d174fa1443deea9aab54bbca8d9be308dd14a0323dd827556c173bd132098db"),
expected: HexToBN("0x1d174fa1443deea9aab54bbca8d9be308dd14a0323dd827556c173bd132098db"),
},
}

Expand All @@ -90,92 +80,92 @@ func TestComputeFact(t *testing.T) {
}

func TestBadSignature(t *testing.T) {
hash, err := caigoCurve.PedersenHash([]*big.Int{HexToBN("0x12773"), HexToBN("0x872362")})
hash, err := Curve.PedersenHash([]*big.Int{HexToBN("0x12773"), HexToBN("0x872362")})
if err != nil {
t.Errorf("Hashing err: %v\n", err)
}

priv, _ := caigoCurve.GetRandomPrivateKey()
x, y, err := caigoCurve.PrivateToPoint(priv)
priv, _ := Curve.GetRandomPrivateKey()
x, y, err := Curve.PrivateToPoint(priv)
if err != nil {
t.Errorf("Could not convert random private key to point: %v\n", err)
}

r, s, err := caigoCurve.Sign(hash, priv)
r, s, err := Curve.Sign(hash, priv)
if err != nil {
t.Errorf("Could not convert gen signature: %v\n", err)
}

badR := new(big.Int).Add(r, big.NewInt(1))
if caigoCurve.Verify(hash, badR, s, x, y) {
if Curve.Verify(hash, badR, s, x, y) {
t.Errorf("Verified bad signature %v %v\n", r, s)
}

badS := new(big.Int).Add(s, big.NewInt(1))
if caigoCurve.Verify(hash, r, badS, x, y) {
if Curve.Verify(hash, r, badS, x, y) {
t.Errorf("Verified bad signature %v %v\n", r, s)
}

badHash := new(big.Int).Add(hash, big.NewInt(1))
if caigoCurve.Verify(badHash, r, s, x, y) {
if Curve.Verify(badHash, r, s, x, y) {
t.Errorf("Verified bad signature %v %v\n", r, s)
}
}

func TestSignature(t *testing.T) {
testSignature := []struct {
private *big.Int
publicX *big.Int
publicY *big.Int
hash *big.Int
rIn *big.Int
sIn *big.Int
raw string
private *big.Int
publicX *big.Int
publicY *big.Int
hash *big.Int
rIn *big.Int
sIn *big.Int
raw string
}{
{
private: StrToBig("104397037759416840641267745129360920341912682966983343798870479003077644689"),
publicX: StrToBig("1913222325711601599563860015182907040361852177892954047964358042507353067365"),
publicY: StrToBig("798905265292544287704154888908626830160713383708400542998012716235575472365"),
hash: StrToBig("2680576269831035412725132645807649347045997097070150916157159360688041452746"),
rIn: StrToBig("607684330780324271206686790958794501662789535258258105407533051445036595885"),
sIn: StrToBig("453590782387078613313238308551260565642934039343903827708036287031471258875"),
hash: StrToBig("2680576269831035412725132645807649347045997097070150916157159360688041452746"),
rIn: StrToBig("607684330780324271206686790958794501662789535258258105407533051445036595885"),
sIn: StrToBig("453590782387078613313238308551260565642934039343903827708036287031471258875"),
},
{
hash: HexToBN("0x7f15c38ea577a26f4f553282fcfe4f1feeb8ecfaad8f221ae41abf8224cbddd"),
rIn: StrToBig("2458502865976494910213617956670505342647705497324144349552978333078363662855"),
sIn: StrToBig("3439514492576562277095748549117516048613512930236865921315982886313695689433"),
raw: "04033f45f07e1bd1a51b45fc24ec8c8c9908db9e42191be9e169bfcac0c0d997450319d0f53f6ca077c4fa5207819144a2a4165daef6ee47a7c1d06c0dcaa3e456",
rIn: StrToBig("2458502865976494910213617956670505342647705497324144349552978333078363662855"),
sIn: StrToBig("3439514492576562277095748549117516048613512930236865921315982886313695689433"),
raw: "04033f45f07e1bd1a51b45fc24ec8c8c9908db9e42191be9e169bfcac0c0d997450319d0f53f6ca077c4fa5207819144a2a4165daef6ee47a7c1d06c0dcaa3e456",
},
{
hash: HexToBN("0x324df642fcc7d98b1d9941250840704f35b9ac2e3e2b58b6a034cc09adac54c"),
hash: HexToBN("0x324df642fcc7d98b1d9941250840704f35b9ac2e3e2b58b6a034cc09adac54c"),
publicX: HexToBN("0x4e52f2f40700e9cdd0f386c31a1f160d0f310504fc508a1051b747a26070d10"),
rIn: StrToBig("2849277527182985104629156126825776904262411756563556603659114084811678482647"),
sIn: StrToBig("3156340738553451171391693475354397094160428600037567299774561739201502791079"),
rIn: StrToBig("2849277527182985104629156126825776904262411756563556603659114084811678482647"),
sIn: StrToBig("3156340738553451171391693475354397094160428600037567299774561739201502791079"),
},
}

var err error
for _, tt := range testSignature {
if tt.raw != "" {
h, _ := HexToBytes(tt.raw)
tt.publicX, tt.publicY = elliptic.Unmarshal(curve, h)
tt.publicX, tt.publicY = elliptic.Unmarshal(Curve, h)
} else if tt.private != nil {
tt.publicX, tt.publicY, err = caigoCurve.PrivateToPoint(tt.private)
tt.publicX, tt.publicY, err = Curve.PrivateToPoint(tt.private)
if err != nil {
t.Errorf("Could not convert random private key to point: %v\n", err)
}
} else if tt.publicX != nil {
tt.publicY = caigoCurve.GetYCoordinate(tt.publicX)
tt.publicY = Curve.GetYCoordinate(tt.publicX)
}

if tt.rIn == nil && tt.private != nil {
tt.rIn, tt.sIn, err = caigoCurve.Sign(tt.hash, tt.private)
if tt.rIn == nil && tt.private != nil {
tt.rIn, tt.sIn, err = Curve.Sign(tt.hash, tt.private)
if err != nil {
t.Errorf("Could not sign good hash: %v\n", err)
}
}
if !caigoCurve.Verify(tt.hash, tt.rIn, tt.sIn, tt.publicX, tt.publicY) {

if !Curve.Verify(tt.hash, tt.rIn, tt.sIn, tt.publicX, tt.publicY) {
t.Errorf("successful signature did not verify\n")
}
}
Expand Down
Loading

0 comments on commit 2f9ce5c

Please sign in to comment.