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

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  package handlers_test
     7  
     8  import (
     9  	"github.com/hyperledger/fabric/bccsp/idemix/handlers"
    10  
    11  	"github.com/hyperledger/fabric/bccsp"
    12  	"github.com/hyperledger/fabric/bccsp/idemix/handlers/mock"
    13  	. "github.com/onsi/ginkgo"
    14  	. "github.com/onsi/gomega"
    15  	"github.com/pkg/errors"
    16  )
    17  
    18  var _ = Describe("Issuer", func() {
    19  
    20  	Describe("when creating an issuer key-pair", func() {
    21  		var (
    22  			IssuerKeyGen *handlers.IssuerKeyGen
    23  
    24  			fakeIssuer      *mock.Issuer
    25  			IssuerSecretKey bccsp.Key
    26  		)
    27  
    28  		BeforeEach(func() {
    29  			fakeIssuer = &mock.Issuer{}
    30  
    31  			IssuerKeyGen = &handlers.IssuerKeyGen{}
    32  			IssuerKeyGen.Issuer = fakeIssuer
    33  		})
    34  
    35  		Context("and the underlying cryptographic algorithm succeed", func() {
    36  			var (
    37  				sk                  bccsp.Key
    38  				fakeIssuerSecretKey *mock.IssuerSecretKey
    39  				SKI                 []byte
    40  				pkBytes             []byte
    41  			)
    42  			BeforeEach(func() {
    43  				SKI = []byte("a fake SKI")
    44  				pkBytes = []byte("a fake public")
    45  
    46  				fakeIssuerPublicKey := &mock.IssuerPublicKey{}
    47  				fakeIssuerPublicKey.BytesReturns(pkBytes, nil)
    48  				fakeIssuerPublicKey.HashReturns(SKI)
    49  
    50  				fakeIssuerSecretKey = &mock.IssuerSecretKey{}
    51  				fakeIssuerSecretKey.PublicReturns(fakeIssuerPublicKey)
    52  				fakeIssuerSecretKey.BytesReturns([]byte("private"), nil)
    53  
    54  				fakeIssuer.NewKeyReturns(fakeIssuerSecretKey, nil)
    55  
    56  				IssuerSecretKey = handlers.NewIssuerSecretKey(fakeIssuerSecretKey, false)
    57  			})
    58  
    59  			AfterEach(func() {
    60  				Expect(sk.Private()).To(BeTrue())
    61  				Expect(sk.Symmetric()).To(BeFalse())
    62  				Expect(sk.SKI()).NotTo(BeNil())
    63  				Expect(sk.SKI()).To(BeEquivalentTo(SKI))
    64  
    65  				pk, err := sk.PublicKey()
    66  				Expect(err).NotTo(HaveOccurred())
    67  
    68  				Expect(pk.Private()).To(BeFalse())
    69  				Expect(pk.Symmetric()).To(BeFalse())
    70  				Expect(pk.SKI()).NotTo(BeNil())
    71  				Expect(pk.SKI()).To(BeEquivalentTo(SKI))
    72  				raw, err := pk.Bytes()
    73  				Expect(err).NotTo(HaveOccurred())
    74  				Expect(raw).NotTo(BeNil())
    75  				Expect(raw).To(BeEquivalentTo(pkBytes))
    76  
    77  				pk2, err := pk.PublicKey()
    78  				Expect(err).NotTo(HaveOccurred())
    79  				Expect(pk).To(BeEquivalentTo(pk2))
    80  			})
    81  
    82  			Context("and the secret key is exportable", func() {
    83  				BeforeEach(func() {
    84  					IssuerKeyGen.Exportable = true
    85  					IssuerSecretKey = handlers.NewIssuerSecretKey(fakeIssuerSecretKey, true)
    86  				})
    87  
    88  				It("returns no error and a key", func() {
    89  					var err error
    90  					sk, err = IssuerKeyGen.KeyGen(&bccsp.IdemixIssuerKeyGenOpts{})
    91  					Expect(err).NotTo(HaveOccurred())
    92  					Expect(sk).To(BeEquivalentTo(IssuerSecretKey))
    93  
    94  					raw, err := sk.Bytes()
    95  					Expect(err).NotTo(HaveOccurred())
    96  					Expect(raw).NotTo(BeNil())
    97  					Expect(raw).To(BeEquivalentTo([]byte("private")))
    98  				})
    99  			})
   100  
   101  			Context("and the secret key is not exportable", func() {
   102  				BeforeEach(func() {
   103  					IssuerKeyGen.Exportable = false
   104  					IssuerSecretKey = handlers.NewIssuerSecretKey(fakeIssuerSecretKey, false)
   105  				})
   106  
   107  				It("returns no error and a key", func() {
   108  					sk, err := IssuerKeyGen.KeyGen(&bccsp.IdemixIssuerKeyGenOpts{})
   109  					Expect(err).NotTo(HaveOccurred())
   110  					Expect(sk).To(BeEquivalentTo(IssuerSecretKey))
   111  
   112  					raw, err := sk.Bytes()
   113  					Expect(err).To(MatchError("not exportable"))
   114  					Expect(raw).To(BeNil())
   115  				})
   116  
   117  			})
   118  		})
   119  
   120  		Context("and the underlying cryptographic algorithm fails", func() {
   121  			BeforeEach(func() {
   122  				fakeIssuer.NewKeyReturns(nil, errors.New("new-key error"))
   123  			})
   124  
   125  			It("returns an error", func() {
   126  				keyPair, err := IssuerKeyGen.KeyGen(&bccsp.IdemixIssuerKeyGenOpts{})
   127  				Expect(err).To(MatchError("new-key error"))
   128  				Expect(keyPair).To(BeNil())
   129  			})
   130  		})
   131  
   132  		Context("and the options are not well formed", func() {
   133  
   134  			Context("and the option is nil", func() {
   135  				It("returns error", func() {
   136  					sk, err := IssuerKeyGen.KeyGen(nil)
   137  					Expect(err).To(MatchError("invalid options, expected *bccsp.IdemixIssuerKeyGenOpts"))
   138  					Expect(sk).To(BeNil())
   139  				})
   140  			})
   141  
   142  			Context("and the option is not of type *bccsp.IdemixIssuerKeyGenOpts", func() {
   143  				It("returns error", func() {
   144  					sk, err := IssuerKeyGen.KeyGen(&bccsp.AESKeyGenOpts{})
   145  					Expect(err).To(MatchError("invalid options, expected *bccsp.IdemixIssuerKeyGenOpts"))
   146  					Expect(sk).To(BeNil())
   147  				})
   148  			})
   149  		})
   150  	})
   151  
   152  	Describe("when importing an issuer public key", func() {
   153  		var (
   154  			IssuerPublicKeyImporter *handlers.IssuerPublicKeyImporter
   155  
   156  			fakeIssuer      *mock.Issuer
   157  			IssuerPublicKey bccsp.Key
   158  		)
   159  
   160  		BeforeEach(func() {
   161  			fakeIssuer = &mock.Issuer{}
   162  
   163  			IssuerPublicKeyImporter = &handlers.IssuerPublicKeyImporter{}
   164  			IssuerPublicKeyImporter.Issuer = fakeIssuer
   165  		})
   166  
   167  		Context("and the underlying cryptographic algorithm succeed", func() {
   168  			var (
   169  				pk                  bccsp.Key
   170  				fakeIssuerPublicKey *mock.IssuerPublicKey
   171  				SKI                 []byte
   172  				pkBytes             []byte
   173  				fakeRaw             []byte
   174  			)
   175  
   176  			BeforeEach(func() {
   177  				fakeRaw = []byte("a fake raw")
   178  				SKI = []byte("a fake SKI")
   179  				pkBytes = []byte("a fake public")
   180  
   181  				fakeIssuerPublicKey = &mock.IssuerPublicKey{}
   182  				fakeIssuerPublicKey.BytesReturns(pkBytes, nil)
   183  				fakeIssuerPublicKey.HashReturns(SKI)
   184  
   185  				fakeIssuer.NewPublicKeyFromBytesReturns(fakeIssuerPublicKey, nil)
   186  			})
   187  
   188  			Context("and the secret key is exportable", func() {
   189  				BeforeEach(func() {
   190  					IssuerPublicKey = handlers.NewIssuerPublicKey(fakeIssuerPublicKey)
   191  				})
   192  
   193  				It("returns no error and a key", func() {
   194  					var err error
   195  					pk, err = IssuerPublicKeyImporter.KeyImport(fakeRaw, &bccsp.IdemixIssuerPublicKeyImportOpts{})
   196  					Expect(err).NotTo(HaveOccurred())
   197  					Expect(pk).To(BeEquivalentTo(IssuerPublicKey))
   198  
   199  					raw, err := pk.Bytes()
   200  					Expect(err).NotTo(HaveOccurred())
   201  					Expect(raw).NotTo(BeNil())
   202  					Expect(raw).To(BeEquivalentTo(pkBytes))
   203  
   204  					pk, err := pk.PublicKey()
   205  					Expect(err).NotTo(HaveOccurred())
   206  					Expect(pk).To(BeEquivalentTo(IssuerPublicKey))
   207  				})
   208  			})
   209  		})
   210  
   211  		Context("and the underlying cryptographic algorithm fails", func() {
   212  			BeforeEach(func() {
   213  				fakeIssuer.NewPublicKeyFromBytesReturns(nil, errors.New("new-key error"))
   214  			})
   215  
   216  			It("returns an error", func() {
   217  				pk, err := IssuerPublicKeyImporter.KeyImport([]byte{1, 2, 3}, &bccsp.IdemixIssuerPublicKeyImportOpts{})
   218  				Expect(err).To(MatchError("new-key error"))
   219  				Expect(pk).To(BeNil())
   220  			})
   221  		})
   222  
   223  		Context("and the arguments are not well formed", func() {
   224  
   225  			Context("and the raw is nil", func() {
   226  				It("returns error", func() {
   227  					pk, err := IssuerPublicKeyImporter.KeyImport(nil, &bccsp.IdemixIssuerPublicKeyImportOpts{})
   228  					Expect(err).To(MatchError("invalid raw, expected byte array"))
   229  					Expect(pk).To(BeNil())
   230  				})
   231  			})
   232  
   233  			Context("and the raw is empty", func() {
   234  				It("returns error", func() {
   235  					pk, err := IssuerPublicKeyImporter.KeyImport([]byte{}, &bccsp.IdemixIssuerPublicKeyImportOpts{})
   236  					Expect(err).To(MatchError("invalid raw, it must not be nil"))
   237  					Expect(pk).To(BeNil())
   238  				})
   239  			})
   240  
   241  			Context("and the option is nil", func() {
   242  				It("returns error", func() {
   243  					pk, err := IssuerPublicKeyImporter.KeyImport([]byte{1, 2, 3}, nil)
   244  					Expect(err).To(MatchError("invalid options, expected *bccsp.IdemixIssuerPublicKeyImportOpts"))
   245  					Expect(pk).To(BeNil())
   246  				})
   247  			})
   248  
   249  			Context("and the option is not of type *bccsp.IdemixIssuerPublicKeyImportOpts", func() {
   250  				It("returns error", func() {
   251  					pk, err := IssuerPublicKeyImporter.KeyImport([]byte{1, 2, 3}, &bccsp.IdemixNymPublicKeyImportOpts{})
   252  					Expect(err).To(MatchError("invalid options, expected *bccsp.IdemixIssuerPublicKeyImportOpts"))
   253  					Expect(pk).To(BeNil())
   254  				})
   255  			})
   256  		})
   257  
   258  	})
   259  })