github.com/lzy4123/fabric@v2.1.1+incompatible/bccsp/idemix/handlers/user_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  	"crypto/sha256"
    10  
    11  	"github.com/hyperledger/fabric/bccsp"
    12  	"github.com/hyperledger/fabric/bccsp/idemix/handlers"
    13  	"github.com/hyperledger/fabric/bccsp/idemix/handlers/mock"
    14  	. "github.com/onsi/ginkgo"
    15  	. "github.com/onsi/gomega"
    16  	"github.com/pkg/errors"
    17  )
    18  
    19  var _ = Describe("User", func() {
    20  
    21  	var (
    22  		fakeUser          *mock.User
    23  		fakeUserSecretKey bccsp.Key
    24  	)
    25  
    26  	BeforeEach(func() {
    27  		fakeUser = &mock.User{}
    28  	})
    29  
    30  	Describe("when creating a user key", func() {
    31  		var (
    32  			UserKeyGen *handlers.UserKeyGen
    33  		)
    34  
    35  		BeforeEach(func() {
    36  			UserKeyGen = &handlers.UserKeyGen{}
    37  			UserKeyGen.User = fakeUser
    38  		})
    39  
    40  		Context("and the underlying cryptographic algorithm succeed", func() {
    41  			var (
    42  				sk            bccsp.Key
    43  				fakeIdemixKey *mock.Big
    44  				SKI           []byte
    45  			)
    46  			BeforeEach(func() {
    47  				fakeIdemixKey = &mock.Big{}
    48  				fakeIdemixKey.BytesReturns([]byte{1, 2, 3, 4}, nil)
    49  
    50  				fakeUser.NewKeyReturns(fakeIdemixKey, nil)
    51  				hash := sha256.New()
    52  				hash.Write([]byte{1, 2, 3, 4})
    53  				SKI = hash.Sum(nil)
    54  
    55  				fakeUserSecretKey = handlers.NewUserSecretKey(fakeIdemixKey, false)
    56  			})
    57  
    58  			AfterEach(func() {
    59  				Expect(sk.Private()).To(BeTrue())
    60  				Expect(sk.Symmetric()).To(BeTrue())
    61  				Expect(sk.SKI()).NotTo(BeNil())
    62  				Expect(sk.SKI()).To(BeEquivalentTo(SKI))
    63  
    64  				pk, err := sk.PublicKey()
    65  				Expect(err).To(MatchError("cannot call this method on a symmetric key"))
    66  				Expect(pk).To(BeNil())
    67  			})
    68  
    69  			Context("and the secret key is exportable", func() {
    70  				BeforeEach(func() {
    71  					UserKeyGen.Exportable = true
    72  					fakeUserSecretKey = handlers.NewUserSecretKey(fakeIdemixKey, true)
    73  				})
    74  
    75  				It("returns no error and a key", func() {
    76  					var err error
    77  					sk, err = UserKeyGen.KeyGen(&bccsp.IdemixUserSecretKeyGenOpts{})
    78  					Expect(err).NotTo(HaveOccurred())
    79  					Expect(sk).To(BeEquivalentTo(fakeUserSecretKey))
    80  
    81  					raw, err := sk.Bytes()
    82  					Expect(err).NotTo(HaveOccurred())
    83  					Expect(raw).NotTo(BeNil())
    84  					Expect(raw).To(BeEquivalentTo([]byte{1, 2, 3, 4}))
    85  				})
    86  			})
    87  
    88  			Context("and the secret key is not exportable", func() {
    89  				BeforeEach(func() {
    90  					UserKeyGen.Exportable = false
    91  					fakeUserSecretKey = handlers.NewUserSecretKey(fakeIdemixKey, false)
    92  				})
    93  
    94  				It("returns no error and a key", func() {
    95  					sk, err := UserKeyGen.KeyGen(&bccsp.IdemixUserSecretKeyGenOpts{})
    96  					Expect(err).NotTo(HaveOccurred())
    97  					Expect(sk).To(BeEquivalentTo(fakeUserSecretKey))
    98  
    99  					raw, err := sk.Bytes()
   100  					Expect(err).To(MatchError("not exportable"))
   101  					Expect(raw).To(BeNil())
   102  				})
   103  
   104  			})
   105  		})
   106  
   107  		Context("and the underlying cryptographic algorithm fails", func() {
   108  			BeforeEach(func() {
   109  				fakeUser.NewKeyReturns(nil, errors.New("new-key error"))
   110  			})
   111  
   112  			It("returns an error", func() {
   113  				keyPair, err := UserKeyGen.KeyGen(&bccsp.IdemixUserSecretKeyGenOpts{})
   114  				Expect(err).To(MatchError("new-key error"))
   115  				Expect(keyPair).To(BeNil())
   116  			})
   117  		})
   118  
   119  	})
   120  
   121  	Describe("when deriving a new pseudonym", func() {
   122  		var (
   123  			NymKeyDerivation    *handlers.NymKeyDerivation
   124  			fakeIssuerPublicKey bccsp.Key
   125  		)
   126  
   127  		BeforeEach(func() {
   128  			NymKeyDerivation = &handlers.NymKeyDerivation{}
   129  			NymKeyDerivation.User = fakeUser
   130  		})
   131  
   132  		Context("and the underlying cryptographic algorithm succeed", func() {
   133  			var (
   134  				nym     bccsp.Key
   135  				userKey *mock.Big
   136  				fakeNym bccsp.Key
   137  				result2 *mock.Big
   138  				result1 *mock.Ecp
   139  			)
   140  
   141  			BeforeEach(func() {
   142  				result2 = &mock.Big{}
   143  				result2.BytesReturns([]byte{1, 2, 3, 4}, nil)
   144  				result1 = &mock.Ecp{}
   145  				result1.BytesReturns([]byte{5, 6, 7, 8}, nil)
   146  
   147  				fakeUser.MakeNymReturns(result1, result2, nil)
   148  			})
   149  
   150  			AfterEach(func() {
   151  				Expect(nym.Private()).To(BeTrue())
   152  				Expect(nym.Symmetric()).To(BeFalse())
   153  				Expect(nym.SKI()).NotTo(BeNil())
   154  
   155  				pk, err := nym.PublicKey()
   156  				Expect(err).NotTo(HaveOccurred())
   157  
   158  				Expect(pk.Private()).To(BeFalse())
   159  				Expect(pk.Symmetric()).To(BeFalse())
   160  				Expect(pk.SKI()).NotTo(BeNil())
   161  				raw, err := pk.Bytes()
   162  				Expect(err).NotTo(HaveOccurred())
   163  				Expect(raw).NotTo(BeNil())
   164  
   165  				pk2, err := pk.PublicKey()
   166  				Expect(err).NotTo(HaveOccurred())
   167  				Expect(pk).To(BeEquivalentTo(pk2))
   168  			})
   169  
   170  			Context("and the secret key is exportable", func() {
   171  				BeforeEach(func() {
   172  					var err error
   173  					NymKeyDerivation.Exportable = true
   174  					fakeUserSecretKey = handlers.NewUserSecretKey(userKey, true)
   175  					fakeIssuerPublicKey = handlers.NewIssuerPublicKey(nil)
   176  					fakeNym, err = handlers.NewNymSecretKey(result2, result1, true)
   177  					Expect(err).NotTo(HaveOccurred())
   178  				})
   179  
   180  				It("returns no error and a key", func() {
   181  					var err error
   182  					nym, err = NymKeyDerivation.KeyDeriv(fakeUserSecretKey, &bccsp.IdemixNymKeyDerivationOpts{IssuerPK: fakeIssuerPublicKey})
   183  					Expect(err).NotTo(HaveOccurred())
   184  					Expect(nym).To(BeEquivalentTo(fakeNym))
   185  
   186  					raw, err := nym.Bytes()
   187  					Expect(err).NotTo(HaveOccurred())
   188  					Expect(raw).NotTo(BeNil())
   189  				})
   190  			})
   191  
   192  			Context("and the secret key is not exportable", func() {
   193  				BeforeEach(func() {
   194  					var err error
   195  					NymKeyDerivation.Exportable = false
   196  					fakeUserSecretKey = handlers.NewUserSecretKey(userKey, false)
   197  					fakeNym, err = handlers.NewNymSecretKey(result2, result1, false)
   198  					Expect(err).NotTo(HaveOccurred())
   199  				})
   200  
   201  				It("returns no error and a key", func() {
   202  					var err error
   203  					nym, err = NymKeyDerivation.KeyDeriv(fakeUserSecretKey, &bccsp.IdemixNymKeyDerivationOpts{IssuerPK: fakeIssuerPublicKey})
   204  					Expect(err).NotTo(HaveOccurred())
   205  					Expect(nym).To(BeEquivalentTo(fakeNym))
   206  
   207  					raw, err := nym.Bytes()
   208  					Expect(err).To(HaveOccurred())
   209  					Expect(raw).To(BeNil())
   210  				})
   211  
   212  			})
   213  		})
   214  
   215  		Context("and the underlying cryptographic algorithm fails", func() {
   216  			BeforeEach(func() {
   217  				fakeUserSecretKey = handlers.NewUserSecretKey(nil, true)
   218  				fakeIssuerPublicKey = handlers.NewIssuerPublicKey(nil)
   219  				fakeUser.MakeNymReturns(nil, nil, errors.New("make-nym error"))
   220  			})
   221  
   222  			It("returns an error", func() {
   223  				nym, err := NymKeyDerivation.KeyDeriv(fakeUserSecretKey, &bccsp.IdemixNymKeyDerivationOpts{IssuerPK: fakeIssuerPublicKey})
   224  				Expect(err).To(MatchError("make-nym error"))
   225  				Expect(nym).To(BeNil())
   226  			})
   227  		})
   228  
   229  		Context("and the options are not well formed", func() {
   230  
   231  			Context("and the user secret key is nil", func() {
   232  				It("returns error", func() {
   233  					nym, err := NymKeyDerivation.KeyDeriv(nil, &bccsp.IdemixNymKeyDerivationOpts{})
   234  					Expect(err).To(MatchError("invalid key, expected *userSecretKey"))
   235  					Expect(nym).To(BeNil())
   236  				})
   237  			})
   238  
   239  			Context("and the user secret key is not of type *userSecretKey", func() {
   240  				It("returns error", func() {
   241  					nym, err := NymKeyDerivation.KeyDeriv(handlers.NewIssuerPublicKey(nil), &bccsp.IdemixNymKeyDerivationOpts{})
   242  					Expect(err).To(MatchError("invalid key, expected *userSecretKey"))
   243  					Expect(nym).To(BeNil())
   244  				})
   245  			})
   246  
   247  			Context("and the option is missing", func() {
   248  				BeforeEach(func() {
   249  					fakeUserSecretKey = handlers.NewUserSecretKey(nil, false)
   250  				})
   251  
   252  				It("returns error", func() {
   253  					nym, err := NymKeyDerivation.KeyDeriv(fakeUserSecretKey, nil)
   254  					Expect(err).To(MatchError("invalid options, expected *IdemixNymKeyDerivationOpts"))
   255  					Expect(nym).To(BeNil())
   256  				})
   257  			})
   258  
   259  			Context("and the option is not of type *bccsp.IdemixNymKeyDerivationOpts", func() {
   260  				BeforeEach(func() {
   261  					fakeUserSecretKey = handlers.NewUserSecretKey(nil, false)
   262  				})
   263  
   264  				It("returns error", func() {
   265  					nym, err := NymKeyDerivation.KeyDeriv(fakeUserSecretKey, &bccsp.AESKeyGenOpts{})
   266  					Expect(err).To(MatchError("invalid options, expected *IdemixNymKeyDerivationOpts"))
   267  					Expect(nym).To(BeNil())
   268  				})
   269  			})
   270  
   271  			Context("and the issuer public key is missing", func() {
   272  				BeforeEach(func() {
   273  					fakeUserSecretKey = handlers.NewUserSecretKey(nil, false)
   274  				})
   275  
   276  				It("returns error", func() {
   277  					nym, err := NymKeyDerivation.KeyDeriv(fakeUserSecretKey, &bccsp.IdemixNymKeyDerivationOpts{})
   278  					Expect(err).To(MatchError("invalid options, missing issuer public key"))
   279  					Expect(nym).To(BeNil())
   280  				})
   281  
   282  			})
   283  
   284  			Context("and the issuer public key is not of type *issuerPublicKey", func() {
   285  				BeforeEach(func() {
   286  					fakeUserSecretKey = handlers.NewUserSecretKey(nil, false)
   287  				})
   288  
   289  				It("returns error", func() {
   290  					nym, err := NymKeyDerivation.KeyDeriv(fakeUserSecretKey, &bccsp.IdemixNymKeyDerivationOpts{IssuerPK: fakeUserSecretKey})
   291  					Expect(err).To(MatchError("invalid options, expected IssuerPK as *issuerPublicKey"))
   292  					Expect(nym).To(BeNil())
   293  				})
   294  
   295  			})
   296  		})
   297  	})
   298  
   299  	Context("when importing a user key", func() {
   300  		var (
   301  			UserKeyImporter *handlers.UserKeyImporter
   302  		)
   303  
   304  		BeforeEach(func() {
   305  			UserKeyImporter = &handlers.UserKeyImporter{Exportable: true, User: fakeUser}
   306  		})
   307  
   308  		Context("and the underlying cryptographic algorithm succeed", func() {
   309  
   310  			BeforeEach(func() {
   311  				sk := &mock.Big{}
   312  				sk.BytesReturns([]byte("fake-pk-bytes"), nil)
   313  
   314  				fakeUser.NewKeyFromBytesReturns(sk, nil)
   315  			})
   316  
   317  			It("import is successful", func() {
   318  				k, err := UserKeyImporter.KeyImport([]byte("fake-raw"), nil)
   319  				Expect(err).NotTo(HaveOccurred())
   320  
   321  				bytes, err := k.Bytes()
   322  				Expect(err).NotTo(HaveOccurred())
   323  				Expect(bytes).To(BeEquivalentTo([]byte("fake-pk-bytes")))
   324  			})
   325  		})
   326  
   327  		Context("and the underlying cryptographic algorithm fails", func() {
   328  
   329  			BeforeEach(func() {
   330  				fakeUser.NewKeyFromBytesReturns(nil, errors.New("new-public-key-nym-import-err"))
   331  			})
   332  
   333  			It("returns an error on nil raw", func() {
   334  				k, err := UserKeyImporter.KeyImport(nil, nil)
   335  				Expect(err).To(MatchError("invalid raw, expected byte array"))
   336  				Expect(k).To(BeNil())
   337  			})
   338  
   339  			It("returns an error on empty raw", func() {
   340  				k, err := UserKeyImporter.KeyImport([]byte{}, nil)
   341  				Expect(err).To(MatchError("invalid raw, it must not be nil"))
   342  				Expect(k).To(BeNil())
   343  			})
   344  
   345  			It("returns an error on invalid raw", func() {
   346  				k, err := UserKeyImporter.KeyImport(UserKeyImporter, nil)
   347  				Expect(err).To(MatchError("invalid raw, expected byte array"))
   348  				Expect(k).To(BeNil())
   349  			})
   350  
   351  			It("returns an error", func() {
   352  				k, err := UserKeyImporter.KeyImport([]byte("fake-raw"), nil)
   353  				Expect(err).To(MatchError("new-public-key-nym-import-err"))
   354  				Expect(k).To(BeNil())
   355  			})
   356  
   357  		})
   358  
   359  	})
   360  
   361  	Context("when importing a nym public key", func() {
   362  		var (
   363  			NymPublicKeyImporter *handlers.NymPublicKeyImporter
   364  		)
   365  
   366  		BeforeEach(func() {
   367  			NymPublicKeyImporter = &handlers.NymPublicKeyImporter{User: fakeUser}
   368  		})
   369  
   370  		Context("and the underlying cryptographic algorithm succeed", func() {
   371  
   372  			BeforeEach(func() {
   373  				ecp := &mock.Ecp{}
   374  				ecp.BytesReturns([]byte("fake-pk-bytes"), nil)
   375  
   376  				fakeUser.NewPublicNymFromBytesReturns(ecp, nil)
   377  			})
   378  
   379  			It("import is successful", func() {
   380  				k, err := NymPublicKeyImporter.KeyImport([]byte("fake-raw"), nil)
   381  				Expect(err).NotTo(HaveOccurred())
   382  
   383  				bytes, err := k.Bytes()
   384  				Expect(err).NotTo(HaveOccurred())
   385  				Expect(bytes).To(BeEquivalentTo([]byte("fake-pk-bytes")))
   386  			})
   387  		})
   388  
   389  		Context("and the underlying cryptographic algorithm fails", func() {
   390  
   391  			BeforeEach(func() {
   392  				fakeUser.NewPublicNymFromBytesReturns(nil, errors.New("new-public-key-nym-import-err"))
   393  			})
   394  
   395  			It("returns an error on nil raw", func() {
   396  				k, err := NymPublicKeyImporter.KeyImport(nil, nil)
   397  				Expect(err).To(MatchError("invalid raw, expected byte array"))
   398  				Expect(k).To(BeNil())
   399  			})
   400  
   401  			It("returns an error on empty raw", func() {
   402  				k, err := NymPublicKeyImporter.KeyImport([]byte{}, nil)
   403  				Expect(err).To(MatchError("invalid raw, it must not be nil"))
   404  				Expect(k).To(BeNil())
   405  			})
   406  
   407  			It("returns an error on invalid raw", func() {
   408  				k, err := NymPublicKeyImporter.KeyImport(NymPublicKeyImporter, nil)
   409  				Expect(err).To(MatchError("invalid raw, expected byte array"))
   410  				Expect(k).To(BeNil())
   411  			})
   412  
   413  			It("returns an error", func() {
   414  				k, err := NymPublicKeyImporter.KeyImport([]byte("fake-raw"), nil)
   415  				Expect(err).To(MatchError("new-public-key-nym-import-err"))
   416  				Expect(k).To(BeNil())
   417  			})
   418  
   419  		})
   420  
   421  	})
   422  
   423  })