diff options
Diffstat (limited to 'nizk/commit')
-rw-r--r-- | nizk/commit/commit.go | 93 |
1 files changed, 47 insertions, 46 deletions
diff --git a/nizk/commit/commit.go b/nizk/commit/commit.go index 5238c15..085d9a2 100644 --- a/nizk/commit/commit.go +++ b/nizk/commit/commit.go @@ -5,45 +5,46 @@ import ( ) // This is a construction of a proof of a statement of the form -// σ == [(Φ = g^(αβ)) && (A = g^α) && (Β = g^β)] -// || [(Φ = g^(αβ+1)) && (A = g^α) && (Β = g^β)] -// for given Φ, A and B +// [(C = g^(ab)) && (A = g^a) && (Β = g^b)] +// || [(C = g^(ab+1)) && (A = g^a) && (Β = g^b)] +// +// for given C, A and B type Statement struct { - α *Scalar - β *Scalar + a *Scalar + b *Scalar plus bool *Commitment } type Commitment struct { - Φ *Point + C *Point A *Point B *Point } -func NewStatement(α, β *Scalar, plus bool) *Statement { +func NewStatement(a, b *Scalar, plus bool) *Statement { return &Statement{ - α: α, - β: β, + a: a, + b: b, plus: plus, - Commitment: commitment(α, β, plus), + Commitment: commitment(a, b, plus), } } -func commitment(α, β *Scalar, plus bool) *Commitment { - var Φ *Point - φ := α.Mul(β) +func commitment(a, b *Scalar, plus bool) *Commitment { + var C *Point + c := a.Mul(b) if plus { - Φ = G.Exp(φ.Add(One)) + C = G.Exp(c.Add(One)) } else { - Φ = G.Exp(φ) + C = G.Exp(c) } return &Commitment{ - Φ: Φ, - A: G.Exp(α), - B: G.Exp(β), + C: C, + A: G.Exp(a), + B: G.Exp(b), } } @@ -52,53 +53,53 @@ func (s *Statement) Commit() *Commitment { } type Proof struct { - Ch [2]*Scalar - Rho [2]*Scalar + Ch [2]*Scalar + R [2]*Scalar } func (s *Statement) Proof() *Proof { - var ε [2][2]*Point - var r1, r2, ω *Scalar + var e [2][2]*Point + var r1, r2, w *Scalar r1 = Curve.RandomScalar() r2 = Curve.RandomScalar() - ω = Curve.RandomScalar() + w = Curve.RandomScalar() if s.plus { - ε[0][0] = G.Exp(r1) - ε[0][1] = s.B.Exp(r1).Mul(G.Exp(ω)) - ε[1][0] = G.Exp(r2) - ε[1][1] = s.B.Exp(r2) + e[0][0] = G.Exp(r1) + e[0][1] = s.B.Exp(r1).Mul(G.Exp(w)) + e[1][0] = G.Exp(r2) + e[1][1] = s.B.Exp(r2) } else { - ε[0][0] = G.Exp(r1) - ε[0][1] = s.B.Exp(r1) - ε[1][0] = G.Exp(r2).Mul(s.A.Exp(ω)) - ε[1][1] = s.B.Exp(r2).Mul(s.Φ.Div(G).Exp(ω)) + e[0][0] = G.Exp(r1) + e[0][1] = s.B.Exp(r1) + e[1][0] = G.Exp(r2).Mul(s.A.Exp(w)) + e[1][1] = s.B.Exp(r2).Mul(s.C.Div(G).Exp(w)) } - ch := Challenge(G, s.Φ, s.A, s.B, ε[0][0], ε[0][1], ε[1][0], ε[1][1]) + ch := Challenge(G, s.C, s.A, s.B, e[0][0], e[0][1], e[1][0], e[1][1]) pr := &Proof{} if s.plus { - pr.Ch[0] = ω - pr.Ch[1] = ch.Sub(ω) - pr.Rho[0] = r1.Sub(s.α.Mul(pr.Ch[0])) - pr.Rho[1] = r2.Sub(s.α.Mul(pr.Ch[1])) + pr.Ch[0] = w + pr.Ch[1] = ch.Sub(w) + pr.R[0] = r1.Sub(s.a.Mul(pr.Ch[0])) + pr.R[1] = r2.Sub(s.a.Mul(pr.Ch[1])) } else { - pr.Ch[0] = ch.Sub(ω) - pr.Ch[1] = ω - pr.Rho[0] = r1.Sub(s.α.Mul(pr.Ch[0])) - pr.Rho[1] = r2 + pr.Ch[0] = ch.Sub(w) + pr.Ch[1] = w + pr.R[0] = r1.Sub(s.a.Mul(pr.Ch[0])) + pr.R[1] = r2 } return pr } func (c *Commitment) Verify(p *Proof) bool { - var ε [2][2]*Point - ε[0][0] = G.Exp(p.Rho[0]).Mul(c.A.Exp(p.Ch[0])) - ε[0][1] = c.B.Exp(p.Rho[0]).Mul(c.Φ.Exp(p.Ch[0])) - ε[1][0] = G.Exp(p.Rho[1]).Mul(c.A.Exp(p.Ch[1])) - ε[1][1] = c.B.Exp(p.Rho[1]).Mul(c.Φ.Div(G).Exp(p.Ch[1])) - ch := Challenge(G, c.Φ, c.A, c.B, ε[0][0], ε[0][1], ε[1][0], ε[1][1]) + var e [2][2]*Point + e[0][0] = G.Exp(p.R[0]).Mul(c.A.Exp(p.Ch[0])) + e[0][1] = c.B.Exp(p.R[0]).Mul(c.C.Exp(p.Ch[0])) + e[1][0] = G.Exp(p.R[1]).Mul(c.A.Exp(p.Ch[1])) + e[1][1] = c.B.Exp(p.R[1]).Mul(c.C.Div(G).Exp(p.Ch[1])) + ch := Challenge(G, c.C, c.A, c.B, e[0][0], e[0][1], e[1][0], e[1][1]) return p.Ch[0].Add(p.Ch[1]).Equal(ch) } |