github.com/true-sqn/fabric@v2.1.1+incompatible/idemix/weak-bb.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package idemix 8 9 import ( 10 "github.com/hyperledger/fabric-amcl/amcl" 11 "github.com/hyperledger/fabric-amcl/amcl/FP256BN" 12 "github.com/pkg/errors" 13 ) 14 15 // WBBKeyGen creates a fresh weak-Boneh-Boyen signature key pair (http://ia.cr/2004/171) 16 func WBBKeyGen(rng *amcl.RAND) (*FP256BN.BIG, *FP256BN.ECP2) { 17 // sample sk uniform from Zq 18 sk := RandModOrder(rng) 19 // set pk = g2^sk 20 pk := GenG2.Mul(sk) 21 return sk, pk 22 } 23 24 // WBBSign places a weak Boneh-Boyen signature on message m using secret key sk 25 func WBBSign(sk *FP256BN.BIG, m *FP256BN.BIG) *FP256BN.ECP { 26 // compute exp = 1/(m + sk) mod q 27 exp := Modadd(sk, m, GroupOrder) 28 exp.Invmodp(GroupOrder) 29 30 // return signature sig = g1^(1/(m + sk)) 31 return GenG1.Mul(exp) 32 } 33 34 // WBBVerify verifies a weak Boneh-Boyen signature sig on message m with public key pk 35 func WBBVerify(pk *FP256BN.ECP2, sig *FP256BN.ECP, m *FP256BN.BIG) error { 36 if pk == nil || sig == nil || m == nil { 37 return errors.Errorf("Weak-BB signature invalid: received nil input") 38 } 39 // Set P = pk * g2^m 40 P := FP256BN.NewECP2() 41 P.Copy(pk) 42 P.Add(GenG2.Mul(m)) 43 P.Affine() 44 // check that e(sig, pk * g2^m) = e(g1, g2) 45 if !FP256BN.Fexp(FP256BN.Ate(P, sig)).Equals(GenGT) { 46 return errors.Errorf("Weak-BB signature is invalid") 47 } 48 return nil 49 }