|
| 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 | +} |
0 commit comments