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