github.com/lzy4123/fabric@v2.1.1+incompatible/bccsp/idemix/handlers/nymsigner.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  package handlers
     7  
     8  import (
     9  	"github.com/hyperledger/fabric/bccsp"
    10  	"github.com/pkg/errors"
    11  )
    12  
    13  type NymSigner struct {
    14  	NymSignatureScheme NymSignatureScheme
    15  }
    16  
    17  func (s *NymSigner) Sign(k bccsp.Key, digest []byte, opts bccsp.SignerOpts) ([]byte, error) {
    18  	userSecretKey, ok := k.(*userSecretKey)
    19  	if !ok {
    20  		return nil, errors.New("invalid key, expected *userSecretKey")
    21  	}
    22  
    23  	signerOpts, ok := opts.(*bccsp.IdemixNymSignerOpts)
    24  	if !ok {
    25  		return nil, errors.New("invalid options, expected *IdemixNymSignerOpts")
    26  	}
    27  
    28  	// Issuer public key
    29  	if signerOpts.IssuerPK == nil {
    30  		return nil, errors.New("invalid options, missing issuer public key")
    31  	}
    32  	ipk, ok := signerOpts.IssuerPK.(*issuerPublicKey)
    33  	if !ok {
    34  		return nil, errors.New("invalid issuer public key, expected *issuerPublicKey")
    35  	}
    36  
    37  	// Nym
    38  	if signerOpts.Nym == nil {
    39  		return nil, errors.New("invalid options, missing nym key")
    40  	}
    41  	nymSk, ok := signerOpts.Nym.(*nymSecretKey)
    42  	if !ok {
    43  		return nil, errors.New("invalid nym key, expected *nymSecretKey")
    44  	}
    45  
    46  	sigma, err := s.NymSignatureScheme.Sign(
    47  		userSecretKey.sk,
    48  		nymSk.pk, nymSk.sk,
    49  		ipk.pk,
    50  		digest)
    51  	if err != nil {
    52  		return nil, err
    53  	}
    54  
    55  	return sigma, nil
    56  }
    57  
    58  type NymVerifier struct {
    59  	NymSignatureScheme NymSignatureScheme
    60  }
    61  
    62  func (v *NymVerifier) Verify(k bccsp.Key, signature, digest []byte, opts bccsp.SignerOpts) (bool, error) {
    63  	nymPublicKey, ok := k.(*nymPublicKey)
    64  	if !ok {
    65  		return false, errors.New("invalid key, expected *nymPublicKey")
    66  	}
    67  
    68  	signerOpts, ok := opts.(*bccsp.IdemixNymSignerOpts)
    69  	if !ok {
    70  		return false, errors.New("invalid options, expected *IdemixNymSignerOpts")
    71  	}
    72  
    73  	if signerOpts.IssuerPK == nil {
    74  		return false, errors.New("invalid options, missing issuer public key")
    75  	}
    76  	ipk, ok := signerOpts.IssuerPK.(*issuerPublicKey)
    77  	if !ok {
    78  		return false, errors.New("invalid issuer public key, expected *issuerPublicKey")
    79  	}
    80  
    81  	if len(signature) == 0 {
    82  		return false, errors.New("invalid signature, it must not be empty")
    83  	}
    84  
    85  	err := v.NymSignatureScheme.Verify(
    86  		ipk.pk,
    87  		nymPublicKey.pk,
    88  		signature,
    89  		digest)
    90  	if err != nil {
    91  		return false, err
    92  	}
    93  
    94  	return true, nil
    95  }