github.com/blockchain-gm/fabric-ca@v0.0.0-20200423072702-b2c40c7ac69c/lib/server/idemix/idemixlib.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  	// "crypto/ecdsa"
    11  
    12  	sm2 "github.com/tjfoc/gmsm/sm2"
    13  
    14  	"github.com/hyperledger/fabric-amcl/amcl"
    15  	fp256bn "github.com/hyperledger/fabric-amcl/amcl/FP256BN"
    16  	"github.com/hyperledger/fabric/idemix"
    17  	"github.com/pkg/errors"
    18  )
    19  
    20  // Lib represents idemix library
    21  type Lib interface {
    22  	NewIssuerKey(AttributeNames []string, rng *amcl.RAND) (ik *idemix.IssuerKey, err error)
    23  	NewCredential(key *idemix.IssuerKey, m *idemix.CredRequest, attrs []*fp256bn.BIG, rng *amcl.RAND) (cred *idemix.Credential, err error)
    24  	CreateCRI(key *sm2.PrivateKey, unrevokedHandles []*fp256bn.BIG, epoch int, alg idemix.RevocationAlgorithm, rng *amcl.RAND) (cri *idemix.CredentialRevocationInformation, err error)
    25  	GenerateLongTermRevocationKey() (pk *sm2.PrivateKey, err error)
    26  	GetRand() (rand *amcl.RAND, err error)
    27  	RandModOrder(rng *amcl.RAND) (big *fp256bn.BIG, err error)
    28  }
    29  
    30  // libImpl is adapter for idemix library. It implements Lib interface
    31  type libImpl struct{}
    32  
    33  // NewLib returns an instance of an object that implements Lib interface
    34  func NewLib() Lib {
    35  	return &libImpl{}
    36  }
    37  
    38  func (i *libImpl) GetRand() (rand *amcl.RAND, err error) {
    39  	defer func() {
    40  		r := recover()
    41  		if r != nil {
    42  			err = errors.Errorf("failure: %s", r)
    43  		}
    44  	}()
    45  	return idemix.GetRand()
    46  }
    47  func (i *libImpl) NewCredential(key *idemix.IssuerKey, m *idemix.CredRequest, attrs []*fp256bn.BIG, rng *amcl.RAND) (cred *idemix.Credential, err error) {
    48  	defer func() {
    49  		r := recover()
    50  		if r != nil {
    51  			err = errors.Errorf("failure: %s", r)
    52  		}
    53  	}()
    54  	return idemix.NewCredential(key, m, attrs, rng)
    55  }
    56  func (i *libImpl) RandModOrder(rng *amcl.RAND) (big *fp256bn.BIG, err error) {
    57  	defer func() {
    58  		r := recover()
    59  		if r != nil {
    60  			err = errors.Errorf("failure: %s", r)
    61  		}
    62  	}()
    63  	return idemix.RandModOrder(rng), nil
    64  }
    65  func (i *libImpl) NewIssuerKey(AttributeNames []string, rng *amcl.RAND) (ik *idemix.IssuerKey, err error) {
    66  	defer func() {
    67  		r := recover()
    68  		if r != nil {
    69  			err = errors.Errorf("failure: %s", r)
    70  		}
    71  	}()
    72  	return idemix.NewIssuerKey(AttributeNames, rng)
    73  }
    74  func (i *libImpl) CreateCRI(key *sm2.PrivateKey, unrevokedHandles []*fp256bn.BIG, epoch int, alg idemix.RevocationAlgorithm, rng *amcl.RAND) (cri *idemix.CredentialRevocationInformation, err error) {
    75  	defer func() {
    76  		r := recover()
    77  		if r != nil {
    78  			err = errors.Errorf("failure: %s", r)
    79  		}
    80  	}()
    81  	return idemix.CreateCRI(key, unrevokedHandles, epoch, alg, rng)
    82  }
    83  func (i *libImpl) GenerateLongTermRevocationKey() (pk *sm2.PrivateKey, err error) {
    84  	defer func() {
    85  		r := recover()
    86  		if r != nil {
    87  			err = errors.Errorf("failure: %s", r)
    88  		}
    89  	}()
    90  	return idemix.GenerateLongTermRevocationKey()
    91  }