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 }