111 lines
3.8 KiB
Go
111 lines
3.8 KiB
Go
|
// Copyright 2017-2021 DERO Project. All rights reserved.
|
||
|
// Use of this source code in any form is governed by RESEARCH license.
|
||
|
// license can be found in the LICENSE file.
|
||
|
// GPG: 0F39 E425 8C65 3947 702A 8234 08B2 0360 A03A 9DE8
|
||
|
//
|
||
|
//
|
||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||
|
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||
|
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||
|
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||
|
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||
|
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
|
||
|
package crypto
|
||
|
|
||
|
import "fmt"
|
||
|
import "math/big"
|
||
|
|
||
|
//import "crypto/rand"
|
||
|
//import "encoding/hex"
|
||
|
|
||
|
import "github.com/deroproject/derohe/cryptography/bn256"
|
||
|
|
||
|
//import "golang.org/x/crypto/sha3"
|
||
|
|
||
|
var G *bn256.G1
|
||
|
var global_pedersen_values PedersenVectorCommitment
|
||
|
|
||
|
func init() {
|
||
|
var zeroes [64]byte
|
||
|
var gs, hs []*bn256.G1
|
||
|
|
||
|
global_pedersen_values.G = HashToPoint(HashtoNumber([]byte(PROTOCOL_CONSTANT + "G"))) // this is same as mybase or vice-versa
|
||
|
global_pedersen_values.H = HashToPoint(HashtoNumber([]byte(PROTOCOL_CONSTANT + "H")))
|
||
|
|
||
|
global_pedersen_values.GSUM = new(bn256.G1)
|
||
|
global_pedersen_values.GSUM.Unmarshal(zeroes[:])
|
||
|
|
||
|
for i := 0; i < 128; i++ {
|
||
|
gs = append(gs, HashToPoint(HashtoNumber(append([]byte(PROTOCOL_CONSTANT+"G"), hextobytes(makestring64(fmt.Sprintf("%x", i)))...))))
|
||
|
hs = append(hs, HashToPoint(HashtoNumber(append([]byte(PROTOCOL_CONSTANT+"H"), hextobytes(makestring64(fmt.Sprintf("%x", i)))...))))
|
||
|
|
||
|
global_pedersen_values.GSUM = new(bn256.G1).Add(global_pedersen_values.GSUM, gs[i])
|
||
|
}
|
||
|
global_pedersen_values.Gs = NewPointVector(gs)
|
||
|
global_pedersen_values.Hs = NewPointVector(hs)
|
||
|
|
||
|
// also initialize elgamal_zero
|
||
|
ElGamal_ZERO = new(bn256.G1).ScalarMult(global_pedersen_values.G, new(big.Int).SetUint64(0))
|
||
|
ElGamal_ZERO_string = ElGamal_ZERO.String()
|
||
|
ElGamal_BASE_G = global_pedersen_values.G
|
||
|
G = global_pedersen_values.G
|
||
|
((*bn256.G1)(&GPoint)).Set(G) // setup base point
|
||
|
|
||
|
// fmt.Printf("basepoint %s on %x\n", G.String(), G.Marshal())
|
||
|
}
|
||
|
|
||
|
type PedersenCommitmentNew struct {
|
||
|
G *bn256.G1
|
||
|
H *bn256.G1
|
||
|
Randomness *big.Int
|
||
|
Result *bn256.G1
|
||
|
}
|
||
|
|
||
|
func NewPedersenCommitmentNew() (p *PedersenCommitmentNew) {
|
||
|
return &PedersenCommitmentNew{G: global_pedersen_values.G, H: global_pedersen_values.H}
|
||
|
}
|
||
|
|
||
|
// commit a specific value to specific bases
|
||
|
func (p *PedersenCommitmentNew) Commit(value *big.Int) *PedersenCommitmentNew {
|
||
|
p.Randomness = RandomScalarFixed()
|
||
|
point := new(bn256.G1).Add(new(bn256.G1).ScalarMult(p.G, value), new(bn256.G1).ScalarMult(p.H, p.Randomness))
|
||
|
p.Result = new(bn256.G1).Set(point)
|
||
|
return p
|
||
|
}
|
||
|
|
||
|
type PedersenVectorCommitment struct {
|
||
|
G *bn256.G1
|
||
|
H *bn256.G1
|
||
|
GSUM *bn256.G1
|
||
|
|
||
|
Gs *PointVector
|
||
|
Hs *PointVector
|
||
|
Randomness *big.Int
|
||
|
Result *bn256.G1
|
||
|
|
||
|
gvalues *FieldVector
|
||
|
hvalues *FieldVector
|
||
|
}
|
||
|
|
||
|
func NewPedersenVectorCommitment() (p *PedersenVectorCommitment) {
|
||
|
p = &PedersenVectorCommitment{}
|
||
|
*p = global_pedersen_values
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// commit a specific value to specific bases
|
||
|
func (p *PedersenVectorCommitment) Commit(gvalues, hvalues *FieldVector) *PedersenVectorCommitment {
|
||
|
|
||
|
p.Randomness = RandomScalarFixed()
|
||
|
point := new(bn256.G1).ScalarMult(p.H, p.Randomness)
|
||
|
point = new(bn256.G1).Add(point, p.Gs.MultiExponentiate(gvalues))
|
||
|
point = new(bn256.G1).Add(point, p.Hs.MultiExponentiate(hvalues))
|
||
|
|
||
|
p.Result = new(bn256.G1).Set(point)
|
||
|
return p
|
||
|
}
|