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 })