github.com/yimialmonte/fabric@v2.1.1+incompatible/bccsp/idemix/bridge/bridge_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  package bridge_test
     7  
     8  import (
     9  	"crypto/rand"
    10  	"fmt"
    11  
    12  	"github.com/golang/protobuf/proto"
    13  	"github.com/hyperledger/fabric-amcl/amcl/FP256BN"
    14  	"github.com/hyperledger/fabric/bccsp"
    15  	"github.com/hyperledger/fabric/bccsp/idemix/bridge"
    16  	"github.com/hyperledger/fabric/bccsp/idemix/handlers"
    17  	"github.com/hyperledger/fabric/bccsp/idemix/handlers/mock"
    18  	cryptolib "github.com/hyperledger/fabric/idemix"
    19  	. "github.com/onsi/ginkgo"
    20  	. "github.com/onsi/gomega"
    21  )
    22  
    23  var _ = Describe("Idemix Bridge", func() {
    24  	var (
    25  		userSecretKey   handlers.Big
    26  		issuerPublicKey handlers.IssuerPublicKey
    27  		issuerSecretKey handlers.IssuerSecretKey
    28  		nymPublicKey    handlers.Ecp
    29  		nymSecretKey    handlers.Big
    30  	)
    31  
    32  	BeforeEach(func() {
    33  		userSecretKey = &bridge.Big{}
    34  		issuerPublicKey = &bridge.IssuerPublicKey{}
    35  		issuerSecretKey = &bridge.IssuerSecretKey{}
    36  		nymPublicKey = &bridge.Ecp{}
    37  		nymSecretKey = &bridge.Big{}
    38  	})
    39  
    40  	Describe("issuer", func() {
    41  		var (
    42  			Issuer *bridge.Issuer
    43  		)
    44  
    45  		BeforeEach(func() {
    46  			Issuer = &bridge.Issuer{NewRand: bridge.NewRandOrPanic}
    47  		})
    48  
    49  		Context("key generation", func() {
    50  
    51  			Context("successful generation", func() {
    52  				var (
    53  					key        handlers.IssuerSecretKey
    54  					err        error
    55  					attributes []string
    56  				)
    57  
    58  				It("with valid attributes", func() {
    59  					attributes = []string{"A", "B"}
    60  					key, err = Issuer.NewKey(attributes)
    61  					Expect(err).NotTo(HaveOccurred())
    62  					Expect(key).NotTo(BeNil())
    63  				})
    64  
    65  				It("with empty attributes", func() {
    66  					attributes = nil
    67  					key, err = Issuer.NewKey(attributes)
    68  					Expect(err).NotTo(HaveOccurred())
    69  					Expect(key).NotTo(BeNil())
    70  				})
    71  
    72  				AfterEach(func() {
    73  					raw, err := key.Bytes()
    74  					Expect(err).NotTo(HaveOccurred())
    75  					Expect(raw).NotTo(BeEmpty())
    76  
    77  					pk := key.Public()
    78  					Expect(pk).NotTo(BeNil())
    79  
    80  					h := pk.Hash()
    81  					Expect(h).NotTo(BeEmpty())
    82  
    83  					raw, err = pk.Bytes()
    84  					Expect(err).NotTo(HaveOccurred())
    85  					Expect(raw).NotTo(BeEmpty())
    86  
    87  					pk2, err := Issuer.NewPublicKeyFromBytes(raw, attributes)
    88  					Expect(err).NotTo(HaveOccurred())
    89  
    90  					raw2, err := pk2.Bytes()
    91  					Expect(err).NotTo(HaveOccurred())
    92  					Expect(raw2).NotTo(BeEmpty())
    93  					Expect(pk2.Hash()).To(BeEquivalentTo(pk.Hash()))
    94  					Expect(raw2).To(BeEquivalentTo(raw))
    95  				})
    96  			})
    97  
    98  			It("panic on rand failure", func() {
    99  				Issuer.NewRand = NewRandPanic
   100  				key, err := Issuer.NewKey(nil)
   101  				Expect(err).To(MatchError("failure [new rand panic]"))
   102  				Expect(key).To(BeNil())
   103  			})
   104  		})
   105  
   106  		Context("public key import", func() {
   107  
   108  			It("fails to unmarshal issuer public key", func() {
   109  				pk, err := Issuer.NewPublicKeyFromBytes([]byte{0, 1, 2, 3, 4}, nil)
   110  				Expect(err).To(MatchError("failed to unmarshal issuer public key: proto: idemix.IssuerPublicKey: illegal tag 0 (wire type 0)"))
   111  				Expect(pk).To(BeNil())
   112  			})
   113  
   114  			It("fails to unmarshal issuer public key", func() {
   115  				pk, err := Issuer.NewPublicKeyFromBytes(nil, nil)
   116  				Expect(err).To(MatchError(ContainSubstring("failure [runtime error: index out of range")))
   117  				Expect(pk).To(BeNil())
   118  			})
   119  
   120  			Context("and it is modified", func() {
   121  				var (
   122  					pk handlers.IssuerPublicKey
   123  				)
   124  				BeforeEach(func() {
   125  					attributes := []string{"A", "B"}
   126  					key, err := Issuer.NewKey(attributes)
   127  					Expect(err).NotTo(HaveOccurred())
   128  					pk = key.Public()
   129  					Expect(pk).NotTo(BeNil())
   130  				})
   131  
   132  				It("fails to validate invalid issuer public key", func() {
   133  					if pk.(*bridge.IssuerPublicKey).PK.ProofC[0] != 1 {
   134  						pk.(*bridge.IssuerPublicKey).PK.ProofC[0] = 1
   135  					} else {
   136  						pk.(*bridge.IssuerPublicKey).PK.ProofC[0] = 0
   137  					}
   138  					raw, err := pk.Bytes()
   139  					Expect(err).NotTo(HaveOccurred())
   140  					Expect(raw).NotTo(BeEmpty())
   141  
   142  					pk, err = Issuer.NewPublicKeyFromBytes(raw, nil)
   143  					Expect(err).To(MatchError("invalid issuer public key: zero knowledge proof in public key invalid"))
   144  					Expect(pk).To(BeNil())
   145  				})
   146  
   147  				It("fails to verify attributes, different length", func() {
   148  					raw, err := pk.Bytes()
   149  					Expect(err).NotTo(HaveOccurred())
   150  					Expect(raw).NotTo(BeEmpty())
   151  
   152  					pk, err := Issuer.NewPublicKeyFromBytes(raw, []string{"A"})
   153  					Expect(err).To(MatchError("invalid number of attributes, expected [2], got [1]"))
   154  					Expect(pk).To(BeNil())
   155  				})
   156  
   157  				It("fails to verify attributes, different attributes", func() {
   158  					raw, err := pk.Bytes()
   159  					Expect(err).NotTo(HaveOccurred())
   160  					Expect(raw).NotTo(BeEmpty())
   161  
   162  					pk, err := Issuer.NewPublicKeyFromBytes(raw, []string{"A", "C"})
   163  					Expect(err).To(MatchError("invalid attribute name at position [1]"))
   164  					Expect(pk).To(BeNil())
   165  				})
   166  			})
   167  
   168  		})
   169  	})
   170  
   171  	Describe("user", func() {
   172  		var (
   173  			User *bridge.User
   174  		)
   175  
   176  		BeforeEach(func() {
   177  			User = &bridge.User{NewRand: bridge.NewRandOrPanic}
   178  		})
   179  
   180  		Context("secret key generation", func() {
   181  			It("panic on rand failure", func() {
   182  				User.NewRand = NewRandPanic
   183  				key, err := User.NewKey()
   184  				Expect(err).To(MatchError("failure [new rand panic]"))
   185  				Expect(key).To(BeNil())
   186  			})
   187  		})
   188  
   189  		Context("secret key import", func() {
   190  			It("success", func() {
   191  				key, err := User.NewKey()
   192  				Expect(err).NotTo(HaveOccurred())
   193  
   194  				raw, err := key.Bytes()
   195  				Expect(err).NotTo(HaveOccurred())
   196  				Expect(raw).NotTo(BeNil())
   197  
   198  				key2, err := User.NewKeyFromBytes(raw)
   199  				Expect(err).NotTo(HaveOccurred())
   200  
   201  				raw2, err := key2.Bytes()
   202  				Expect(err).NotTo(HaveOccurred())
   203  				Expect(raw2).NotTo(BeNil())
   204  
   205  				Expect(raw2).To(BeEquivalentTo(raw))
   206  			})
   207  
   208  			It("fails on nil raw", func() {
   209  				key, err := User.NewKeyFromBytes(nil)
   210  				Expect(err).To(MatchError("invalid length, expected [32], got [0]"))
   211  				Expect(key).To(BeNil())
   212  			})
   213  
   214  			It("fails on invalid raw", func() {
   215  				key, err := User.NewKeyFromBytes([]byte{0, 1, 2, 3})
   216  				Expect(err).To(MatchError("invalid length, expected [32], got [4]"))
   217  				Expect(key).To(BeNil())
   218  			})
   219  		})
   220  
   221  		Context("nym generation", func() {
   222  
   223  			It("fails on nil user secret key", func() {
   224  				r1, r2, err := User.MakeNym(nil, issuerPublicKey)
   225  				Expect(err).To(MatchError("invalid user secret key, expected *Big, got [<nil>]"))
   226  				Expect(r1).To(BeNil())
   227  				Expect(r2).To(BeNil())
   228  			})
   229  
   230  			It("fails on invalid user secret key", func() {
   231  				r1, r2, err := User.MakeNym(issuerPublicKey, issuerPublicKey)
   232  				Expect(err).To(MatchError("invalid user secret key, expected *Big, got [*bridge.IssuerPublicKey]"))
   233  				Expect(r1).To(BeNil())
   234  				Expect(r2).To(BeNil())
   235  			})
   236  
   237  			It("fails on nil issuer public key", func() {
   238  				r1, r2, err := User.MakeNym(userSecretKey, nil)
   239  				Expect(err).To(MatchError("invalid issuer public key, expected *IssuerPublicKey, got [<nil>]"))
   240  				Expect(r1).To(BeNil())
   241  				Expect(r2).To(BeNil())
   242  			})
   243  
   244  			It("fails on invalid issuer public key", func() {
   245  				r1, r2, err := User.MakeNym(userSecretKey, &mock.IssuerPublicKey{})
   246  				Expect(err).To(MatchError("invalid issuer public key, expected *IssuerPublicKey, got [*mock.IssuerPublicKey]"))
   247  				Expect(r1).To(BeNil())
   248  				Expect(r2).To(BeNil())
   249  			})
   250  
   251  			It("panic on rand failure", func() {
   252  				User.NewRand = NewRandPanic
   253  				r1, r2, err := User.MakeNym(userSecretKey, issuerPublicKey)
   254  				Expect(err).To(MatchError("failure [new rand panic]"))
   255  				Expect(r1).To(BeNil())
   256  				Expect(r2).To(BeNil())
   257  			})
   258  		})
   259  
   260  		Context("public nym import", func() {
   261  
   262  			It("success", func() {
   263  				npk := handlers.NewNymPublicKey(&bridge.Ecp{
   264  					E: FP256BN.NewECPbigs(FP256BN.NewBIGint(10), FP256BN.NewBIGint(20)),
   265  				})
   266  				raw, err := npk.Bytes()
   267  				Expect(err).NotTo(HaveOccurred())
   268  				Expect(raw).NotTo(BeNil())
   269  
   270  				npk2, err := User.NewPublicNymFromBytes(raw)
   271  				raw2, err := npk2.Bytes()
   272  				Expect(err).NotTo(HaveOccurred())
   273  				Expect(raw2).NotTo(BeNil())
   274  
   275  				Expect(raw2).To(BeEquivalentTo(raw))
   276  			})
   277  
   278  			It("panic on nil raw", func() {
   279  				key, err := User.NewPublicNymFromBytes(nil)
   280  				Expect(err).To(MatchError("failure [%!s(<nil>)]"))
   281  				Expect(key).To(BeNil())
   282  			})
   283  
   284  			It("failure unmarshalling invalid raw", func() {
   285  				key, err := User.NewPublicNymFromBytes([]byte{0, 1, 2, 3})
   286  				Expect(err).To(MatchError("failure [%!s(<nil>)]"))
   287  				Expect(key).To(BeNil())
   288  			})
   289  
   290  		})
   291  	})
   292  
   293  	Describe("credential request", func() {
   294  		var (
   295  			CredRequest *bridge.CredRequest
   296  			IssuerNonce []byte
   297  		)
   298  		BeforeEach(func() {
   299  			CredRequest = &bridge.CredRequest{NewRand: bridge.NewRandOrPanic}
   300  			IssuerNonce = make([]byte, 32)
   301  			n, err := rand.Read(IssuerNonce)
   302  			Expect(n).To(BeEquivalentTo(32))
   303  			Expect(err).NotTo(HaveOccurred())
   304  		})
   305  
   306  		Context("sign", func() {
   307  			It("fail on nil user secret key", func() {
   308  				raw, err := CredRequest.Sign(nil, issuerPublicKey, IssuerNonce)
   309  				Expect(err).To(MatchError("invalid user secret key, expected *Big, got [<nil>]"))
   310  				Expect(raw).To(BeNil())
   311  			})
   312  
   313  			It("fail on invalid user secret key", func() {
   314  				raw, err := CredRequest.Sign(issuerPublicKey, issuerPublicKey, IssuerNonce)
   315  				Expect(err).To(MatchError("invalid user secret key, expected *Big, got [*bridge.IssuerPublicKey]"))
   316  				Expect(raw).To(BeNil())
   317  			})
   318  
   319  			It("fail on nil issuer public key", func() {
   320  				raw, err := CredRequest.Sign(userSecretKey, nil, IssuerNonce)
   321  				Expect(err).To(MatchError("invalid issuer public key, expected *IssuerPublicKey, got [<nil>]"))
   322  				Expect(raw).To(BeNil())
   323  			})
   324  
   325  			It("fail on invalid issuer public key", func() {
   326  				raw, err := CredRequest.Sign(userSecretKey, &mock.IssuerPublicKey{}, IssuerNonce)
   327  				Expect(err).To(MatchError("invalid issuer public key, expected *IssuerPublicKey, got [*mock.IssuerPublicKey]"))
   328  				Expect(raw).To(BeNil())
   329  			})
   330  
   331  			It("fail on nil nonce", func() {
   332  				raw, err := CredRequest.Sign(userSecretKey, issuerPublicKey, nil)
   333  				Expect(err).To(MatchError("invalid issuer nonce, expected length 32, got 0"))
   334  				Expect(raw).To(BeNil())
   335  			})
   336  
   337  			It("fail on empty nonce", func() {
   338  				raw, err := CredRequest.Sign(userSecretKey, issuerPublicKey, []byte{})
   339  				Expect(err).To(MatchError("invalid issuer nonce, expected length 32, got 0"))
   340  				Expect(raw).To(BeNil())
   341  			})
   342  
   343  			It("panic on rand failure", func() {
   344  				CredRequest.NewRand = NewRandPanic
   345  				raw, err := CredRequest.Sign(userSecretKey, issuerPublicKey, IssuerNonce)
   346  				Expect(err).To(MatchError("failure [new rand panic]"))
   347  				Expect(raw).To(BeNil())
   348  			})
   349  
   350  		})
   351  
   352  		Context("verify", func() {
   353  			It("panic on nil credential request", func() {
   354  				err := CredRequest.Verify(nil, issuerPublicKey, IssuerNonce)
   355  				Expect(err).To(MatchError(ContainSubstring("failure [runtime error: index out of range")))
   356  			})
   357  
   358  			It("fail on invalid credential request", func() {
   359  				err := CredRequest.Verify([]byte{0, 1, 2, 3, 4}, issuerPublicKey, IssuerNonce)
   360  				Expect(err).To(MatchError("proto: idemix.CredRequest: illegal tag 0 (wire type 0)"))
   361  			})
   362  
   363  			It("fail on nil issuer public key", func() {
   364  				err := CredRequest.Verify(nil, nil, IssuerNonce)
   365  				Expect(err).To(MatchError("invalid issuer public key, expected *IssuerPublicKey, got [<nil>]"))
   366  			})
   367  
   368  			It("fail on invalid issuer public key", func() {
   369  				err := CredRequest.Verify(nil, &mock.IssuerPublicKey{}, IssuerNonce)
   370  				Expect(err).To(MatchError("invalid issuer public key, expected *IssuerPublicKey, got [*mock.IssuerPublicKey]"))
   371  			})
   372  
   373  		})
   374  	})
   375  
   376  	Describe("credential", func() {
   377  		var (
   378  			Credential handlers.Credential
   379  		)
   380  		BeforeEach(func() {
   381  			Credential = &bridge.Credential{}
   382  		})
   383  
   384  		Context("sign", func() {
   385  
   386  			It("fail on nil issuer secret key", func() {
   387  				raw, err := Credential.Sign(nil, []byte{0, 1, 2, 3, 4}, nil)
   388  				Expect(err).To(MatchError("invalid issuer secret key, expected *Big, got [<nil>]"))
   389  				Expect(raw).To(BeNil())
   390  			})
   391  
   392  			It("fail on invalid credential request", func() {
   393  				raw, err := Credential.Sign(issuerSecretKey, []byte{0, 1, 2, 3, 4}, nil)
   394  				Expect(err).To(MatchError("failed unmarshalling credential request: proto: idemix.CredRequest: illegal tag 0 (wire type 0)"))
   395  				Expect(raw).To(BeNil())
   396  			})
   397  
   398  			It("fail on nil inputs", func() {
   399  				raw, err := Credential.Sign(issuerSecretKey, nil, nil)
   400  				Expect(err).To(MatchError("failure [runtime error: invalid memory address or nil pointer dereference]"))
   401  				Expect(raw).To(BeNil())
   402  			})
   403  
   404  			It("fail on invalid attributes", func() {
   405  				raw, err := Credential.Sign(issuerSecretKey, nil, []bccsp.IdemixAttribute{
   406  					{Type: 5, Value: nil},
   407  				})
   408  				Expect(err).To(MatchError("attribute type not allowed or supported [5] at position [0]"))
   409  				Expect(raw).To(BeNil())
   410  			})
   411  		})
   412  
   413  		Context("verify", func() {
   414  			It("fail on nil user secret key", func() {
   415  				err := Credential.Verify(nil, nil, nil, nil)
   416  				Expect(err).To(MatchError("invalid user secret key, expected *Big, got [<nil>]"))
   417  			})
   418  
   419  			It("fail on invalid user secret key", func() {
   420  				err := Credential.Verify(issuerPublicKey, nil, nil, nil)
   421  				Expect(err).To(MatchError("invalid user secret key, expected *Big, got [*bridge.IssuerPublicKey]"))
   422  			})
   423  
   424  			It("fail on nil issuer public  key", func() {
   425  				err := Credential.Verify(userSecretKey, nil, nil, nil)
   426  				Expect(err).To(MatchError("invalid issuer public key, expected *IssuerPublicKey, got [*bridge.Big]"))
   427  			})
   428  
   429  			It("fail on invalid issuer public  key", func() {
   430  				err := Credential.Verify(userSecretKey, &mock.IssuerPublicKey{}, nil, nil)
   431  				Expect(err).To(MatchError("invalid issuer public key, expected *IssuerPublicKey, got [*bridge.Big]"))
   432  			})
   433  
   434  			It("fail on invalid attributes", func() {
   435  				err := Credential.Verify(userSecretKey, issuerPublicKey, nil, []bccsp.IdemixAttribute{
   436  					{Type: 5, Value: nil},
   437  				})
   438  				Expect(err).To(MatchError("attribute type not allowed or supported [5] at position [0]"))
   439  			})
   440  		})
   441  	})
   442  
   443  	Describe("revocation", func() {
   444  		var (
   445  			Revocation handlers.Revocation
   446  		)
   447  		BeforeEach(func() {
   448  			Revocation = &bridge.Revocation{}
   449  		})
   450  
   451  		Context("sign", func() {
   452  
   453  			It("fail on nil inputs", func() {
   454  				raw, err := Revocation.Sign(nil, nil, 0, 0)
   455  				Expect(err).To(MatchError("failed creating CRI: CreateCRI received nil input"))
   456  				Expect(raw).To(BeNil())
   457  			})
   458  
   459  			It("fail on invalid handlers", func() {
   460  				raw, err := Revocation.Sign(nil, [][]byte{{0, 2, 3, 4}}, 0, 0)
   461  				Expect(err).To(MatchError(ContainSubstring("failure [runtime error: index out of range")))
   462  				Expect(raw).To(BeNil())
   463  			})
   464  		})
   465  
   466  		Context("verify", func() {
   467  			It("fail on nil inputs", func() {
   468  				err := Revocation.Verify(nil, nil, 0, 0)
   469  				Expect(err).To(MatchError("EpochPK invalid: received nil input"))
   470  			})
   471  
   472  			It("fail on malformed cri", func() {
   473  				err := Revocation.Verify(nil, []byte{0, 1, 2, 3, 4}, 0, 0)
   474  				Expect(err).To(MatchError("proto: idemix.CredentialRevocationInformation: illegal tag 0 (wire type 0)"))
   475  			})
   476  		})
   477  	})
   478  
   479  	Describe("signature", func() {
   480  		var (
   481  			SignatureScheme handlers.SignatureScheme
   482  		)
   483  		BeforeEach(func() {
   484  			SignatureScheme = &bridge.SignatureScheme{NewRand: bridge.NewRandOrPanic}
   485  		})
   486  
   487  		Context("sign", func() {
   488  			It("fail on nil user secret key", func() {
   489  				signature, err := SignatureScheme.Sign(nil, nil, nil, nil, nil, nil, nil, 0, nil)
   490  				Expect(err).To(MatchError("invalid user secret key, expected *Big, got [<nil>]"))
   491  				Expect(signature).To(BeNil())
   492  			})
   493  
   494  			It("fail on nil nym public key", func() {
   495  				signature, err := SignatureScheme.Sign(nil, userSecretKey, nil, nil, nil, nil, nil, 0, nil)
   496  				Expect(err).To(MatchError("invalid nym public key, expected *Ecp, got [<nil>]"))
   497  				Expect(signature).To(BeNil())
   498  			})
   499  
   500  			It("fail on nil nym secret key", func() {
   501  				signature, err := SignatureScheme.Sign(nil, userSecretKey, nymPublicKey, nil, nil, nil, nil, 0, nil)
   502  				Expect(err).To(MatchError("invalid nym secret key, expected *Big, got [<nil>]"))
   503  				Expect(signature).To(BeNil())
   504  			})
   505  
   506  			It("fail on nil issuer public key", func() {
   507  				signature, err := SignatureScheme.Sign(nil, userSecretKey, nymPublicKey, nymSecretKey, nil, nil, nil, 0, nil)
   508  				Expect(err).To(MatchError("invalid issuer public key, expected *IssuerPublicKey, got [<nil>]"))
   509  				Expect(signature).To(BeNil())
   510  			})
   511  		})
   512  
   513  		Context("verify", func() {
   514  			It("fail on nil issuer Public key", func() {
   515  				err := SignatureScheme.Verify(nil, nil, nil, nil, 0, nil, 0)
   516  				Expect(err).To(MatchError("invalid issuer public key, expected *IssuerPublicKey, got [<nil>]"))
   517  			})
   518  
   519  			It("fail on nil signature", func() {
   520  				err := SignatureScheme.Verify(issuerPublicKey, nil, nil, nil, 0, nil, 0)
   521  				Expect(err).To(MatchError("cannot verify idemix signature: received nil input"))
   522  			})
   523  
   524  			It("fail on invalid signature", func() {
   525  				err := SignatureScheme.Verify(issuerPublicKey, []byte{0, 1, 2, 3, 4}, nil, nil, 0, nil, 0)
   526  				Expect(err).To(MatchError("proto: idemix.Signature: illegal tag 0 (wire type 0)"))
   527  			})
   528  
   529  			It("fail on invalid attributes", func() {
   530  				err := SignatureScheme.Verify(issuerPublicKey, nil, nil,
   531  					[]bccsp.IdemixAttribute{{Type: -1}}, 0, nil, 0)
   532  				Expect(err).To(MatchError("attribute type not allowed or supported [-1] at position [0]"))
   533  			})
   534  		})
   535  	})
   536  
   537  	Describe("nym signature", func() {
   538  		var (
   539  			NymSignatureScheme handlers.NymSignatureScheme
   540  		)
   541  		BeforeEach(func() {
   542  			NymSignatureScheme = &bridge.NymSignatureScheme{NewRand: bridge.NewRandOrPanic}
   543  		})
   544  
   545  		Context("sign", func() {
   546  			It("fail on nil user secret key", func() {
   547  				signature, err := NymSignatureScheme.Sign(nil, nil, nil, nil, nil)
   548  				Expect(err).To(MatchError("invalid user secret key, expected *Big, got [<nil>]"))
   549  				Expect(signature).To(BeNil())
   550  			})
   551  
   552  			It("fail on nil nym public key", func() {
   553  				signature, err := NymSignatureScheme.Sign(userSecretKey, nil, nil, nil, nil)
   554  				Expect(err).To(MatchError("invalid nym public key, expected *Ecp, got [<nil>]"))
   555  				Expect(signature).To(BeNil())
   556  			})
   557  
   558  			It("fail on nil nym secret key", func() {
   559  				signature, err := NymSignatureScheme.Sign(userSecretKey, nymPublicKey, nil, nil, nil)
   560  				Expect(err).To(MatchError("invalid nym secret key, expected *Big, got [<nil>]"))
   561  				Expect(signature).To(BeNil())
   562  			})
   563  
   564  			It("fail on nil issuer public key", func() {
   565  				signature, err := NymSignatureScheme.Sign(userSecretKey, nymPublicKey, nymSecretKey, nil, nil)
   566  				Expect(err).To(MatchError("invalid issuer public key, expected *IssuerPublicKey, got [<nil>]"))
   567  				Expect(signature).To(BeNil())
   568  			})
   569  		})
   570  
   571  		Context("verify", func() {
   572  			It("fail on nil issuer Public key", func() {
   573  				err := NymSignatureScheme.Verify(nil, nil, nil, nil)
   574  				Expect(err).To(MatchError("invalid issuer public key, expected *IssuerPublicKey, got [<nil>]"))
   575  			})
   576  
   577  			It("fail on nil nym public key", func() {
   578  				err := NymSignatureScheme.Verify(issuerPublicKey, nil, nil, nil)
   579  				Expect(err).To(MatchError("invalid nym public key, expected *Ecp, got [<nil>]"))
   580  			})
   581  
   582  			It("panic on nil signature", func() {
   583  				err := NymSignatureScheme.Verify(issuerPublicKey, nymPublicKey, nil, nil)
   584  				Expect(err).To(MatchError(ContainSubstring("failure [runtime error: index out of range")))
   585  			})
   586  
   587  			It("fail on invalid signature", func() {
   588  				err := NymSignatureScheme.Verify(issuerPublicKey, nymPublicKey, []byte{0, 1, 2, 3, 4}, nil)
   589  				Expect(err).To(MatchError("error unmarshalling signature: proto: idemix.NymSignature: illegal tag 0 (wire type 0)"))
   590  			})
   591  
   592  		})
   593  	})
   594  
   595  	Describe("setting up the environment with one issuer and one user", func() {
   596  		var (
   597  			Issuer          handlers.Issuer
   598  			IssuerKeyGen    *handlers.IssuerKeyGen
   599  			IssuerKey       bccsp.Key
   600  			IssuerPublicKey bccsp.Key
   601  			AttributeNames  []string
   602  
   603  			User             handlers.User
   604  			UserKeyGen       *handlers.UserKeyGen
   605  			UserKey          bccsp.Key
   606  			NymKeyDerivation *handlers.NymKeyDerivation
   607  			NymKey           bccsp.Key
   608  			NymPublicKey     bccsp.Key
   609  
   610  			CredRequest               handlers.CredRequest
   611  			CredentialRequestSigner   *handlers.CredentialRequestSigner
   612  			CredentialRequestVerifier *handlers.CredentialRequestVerifier
   613  			IssuerNonce               []byte
   614  			credRequest               []byte
   615  
   616  			Credential         handlers.Credential
   617  			CredentialSigner   *handlers.CredentialSigner
   618  			CredentialVerifier *handlers.CredentialVerifier
   619  			credential         []byte
   620  
   621  			Revocation          handlers.Revocation
   622  			RevocationKeyGen    *handlers.RevocationKeyGen
   623  			RevocationKey       bccsp.Key
   624  			RevocationPublicKey bccsp.Key
   625  			CriSigner           *handlers.CriSigner
   626  			CriVerifier         *handlers.CriVerifier
   627  			cri                 []byte
   628  		)
   629  
   630  		BeforeEach(func() {
   631  			// Issuer
   632  			var err error
   633  			Issuer = &bridge.Issuer{NewRand: bridge.NewRandOrPanic}
   634  			IssuerKeyGen = &handlers.IssuerKeyGen{Issuer: Issuer}
   635  			AttributeNames = []string{"Attr1", "Attr2", "Attr3", "Attr4", "Attr5"}
   636  			IssuerKey, err = IssuerKeyGen.KeyGen(&bccsp.IdemixIssuerKeyGenOpts{Temporary: true, AttributeNames: AttributeNames})
   637  			Expect(err).NotTo(HaveOccurred())
   638  			IssuerPublicKey, err = IssuerKey.PublicKey()
   639  			Expect(err).NotTo(HaveOccurred())
   640  
   641  			// User
   642  			User = &bridge.User{NewRand: bridge.NewRandOrPanic}
   643  			UserKeyGen = &handlers.UserKeyGen{User: User}
   644  			UserKey, err = UserKeyGen.KeyGen(&bccsp.IdemixUserSecretKeyGenOpts{})
   645  			Expect(err).NotTo(HaveOccurred())
   646  
   647  			// User Nym Key
   648  			NymKeyDerivation = &handlers.NymKeyDerivation{User: User}
   649  			NymKey, err = NymKeyDerivation.KeyDeriv(UserKey, &bccsp.IdemixNymKeyDerivationOpts{IssuerPK: IssuerPublicKey})
   650  			Expect(err).NotTo(HaveOccurred())
   651  			NymPublicKey, err = NymKey.PublicKey()
   652  			Expect(err).NotTo(HaveOccurred())
   653  
   654  			// Credential Request for User
   655  			IssuerNonce = make([]byte, 32)
   656  			n, err := rand.Read(IssuerNonce)
   657  			Expect(n).To(BeEquivalentTo(32))
   658  			Expect(err).NotTo(HaveOccurred())
   659  
   660  			CredRequest = &bridge.CredRequest{NewRand: bridge.NewRandOrPanic}
   661  			CredentialRequestSigner = &handlers.CredentialRequestSigner{CredRequest: CredRequest}
   662  			CredentialRequestVerifier = &handlers.CredentialRequestVerifier{CredRequest: CredRequest}
   663  			credRequest, err = CredentialRequestSigner.Sign(
   664  				UserKey,
   665  				nil,
   666  				&bccsp.IdemixCredentialRequestSignerOpts{IssuerPK: IssuerPublicKey, IssuerNonce: IssuerNonce},
   667  			)
   668  			Expect(err).NotTo(HaveOccurred())
   669  
   670  			// Credential
   671  			Credential = &bridge.Credential{NewRand: bridge.NewRandOrPanic}
   672  			CredentialSigner = &handlers.CredentialSigner{Credential: Credential}
   673  			CredentialVerifier = &handlers.CredentialVerifier{Credential: Credential}
   674  			credential, err = CredentialSigner.Sign(
   675  				IssuerKey,
   676  				credRequest,
   677  				&bccsp.IdemixCredentialSignerOpts{
   678  					Attributes: []bccsp.IdemixAttribute{
   679  						{Type: bccsp.IdemixBytesAttribute, Value: []byte{0}},
   680  						{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1}},
   681  						{Type: bccsp.IdemixIntAttribute, Value: 1},
   682  						{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1, 2}},
   683  						{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1, 2, 3}},
   684  					},
   685  				},
   686  			)
   687  			Expect(err).NotTo(HaveOccurred())
   688  
   689  			// Revocation
   690  			Revocation = &bridge.Revocation{}
   691  			RevocationKeyGen = &handlers.RevocationKeyGen{Revocation: Revocation}
   692  			RevocationKey, err = RevocationKeyGen.KeyGen(&bccsp.IdemixRevocationKeyGenOpts{})
   693  			Expect(err).NotTo(HaveOccurred())
   694  			RevocationPublicKey, err = RevocationKey.PublicKey()
   695  			Expect(err).NotTo(HaveOccurred())
   696  
   697  			// CRI
   698  			CriSigner = &handlers.CriSigner{Revocation: Revocation}
   699  			CriVerifier = &handlers.CriVerifier{Revocation: Revocation}
   700  			cri, err = CriSigner.Sign(
   701  				RevocationKey,
   702  				nil,
   703  				&bccsp.IdemixCRISignerOpts{},
   704  			)
   705  			Expect(err).NotTo(HaveOccurred())
   706  		})
   707  
   708  		It("the environment is properly set", func() {
   709  			// Verify CredRequest
   710  			valid, err := CredentialRequestVerifier.Verify(
   711  				IssuerPublicKey,
   712  				credRequest,
   713  				nil,
   714  				&bccsp.IdemixCredentialRequestSignerOpts{IssuerNonce: IssuerNonce},
   715  			)
   716  			Expect(err).NotTo(HaveOccurred())
   717  			Expect(valid).To(BeTrue())
   718  
   719  			// Verify Credential
   720  			valid, err = CredentialVerifier.Verify(
   721  				UserKey,
   722  				credential,
   723  				nil,
   724  				&bccsp.IdemixCredentialSignerOpts{
   725  					IssuerPK: IssuerPublicKey,
   726  					Attributes: []bccsp.IdemixAttribute{
   727  						{Type: bccsp.IdemixBytesAttribute, Value: []byte{0}},
   728  						{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1}},
   729  						{Type: bccsp.IdemixIntAttribute, Value: 1},
   730  						{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1, 2}},
   731  						{Type: bccsp.IdemixHiddenAttribute},
   732  					},
   733  				},
   734  			)
   735  			Expect(err).NotTo(HaveOccurred())
   736  			Expect(valid).To(BeTrue())
   737  
   738  			// Verify CRI
   739  			valid, err = CriVerifier.Verify(
   740  				RevocationPublicKey,
   741  				cri,
   742  				nil,
   743  				&bccsp.IdemixCRISignerOpts{},
   744  			)
   745  			Expect(err).NotTo(HaveOccurred())
   746  			Expect(valid).To(BeTrue())
   747  		})
   748  
   749  		Context("the environment is not valid with the respect to different parameters", func() {
   750  
   751  			It("invalid credential request nonce", func() {
   752  				valid, err := CredentialRequestVerifier.Verify(
   753  					IssuerPublicKey,
   754  					credRequest,
   755  					nil,
   756  					&bccsp.IdemixCredentialRequestSignerOpts{IssuerNonce: []byte("pine-apple-pine-apple-pine-apple")},
   757  				)
   758  				Expect(err).To(MatchError(fmt.Sprintf("invalid nonce, expected [%v], got [%v]", []byte("pine-apple-pine-apple-pine-apple"), IssuerNonce)))
   759  				Expect(valid).NotTo(BeTrue())
   760  			})
   761  
   762  			It("invalid credential request nonce, too short", func() {
   763  				valid, err := CredentialRequestVerifier.Verify(
   764  					IssuerPublicKey,
   765  					credRequest,
   766  					nil,
   767  					&bccsp.IdemixCredentialRequestSignerOpts{IssuerNonce: []byte("pine-aple-pine-apple-pinapple")},
   768  				)
   769  				Expect(err).To(MatchError("invalid issuer nonce, expected length 32, got 29"))
   770  				Expect(valid).NotTo(BeTrue())
   771  			})
   772  
   773  			It("invalid credential request", func() {
   774  				if credRequest[4] == 0 {
   775  					credRequest[4] = 1
   776  				} else {
   777  					credRequest[4] = 0
   778  				}
   779  				valid, err := CredentialRequestVerifier.Verify(
   780  					IssuerPublicKey,
   781  					credRequest,
   782  					nil,
   783  					&bccsp.IdemixCredentialRequestSignerOpts{IssuerNonce: IssuerNonce},
   784  				)
   785  				Expect(err).To(MatchError("zero knowledge proof is invalid"))
   786  				Expect(valid).NotTo(BeTrue())
   787  			})
   788  
   789  			It("invalid credential request in verifying credential", func() {
   790  				if credRequest[4] == 0 {
   791  					credRequest[4] = 1
   792  				} else {
   793  					credRequest[4] = 0
   794  				}
   795  				credential, err := CredentialSigner.Sign(
   796  					IssuerKey,
   797  					credRequest,
   798  					&bccsp.IdemixCredentialSignerOpts{
   799  						Attributes: []bccsp.IdemixAttribute{
   800  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0}},
   801  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1}},
   802  							{Type: bccsp.IdemixIntAttribute, Value: 1},
   803  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1, 2}},
   804  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1, 2, 3}},
   805  						},
   806  					},
   807  				)
   808  				Expect(err).To(MatchError("failed creating new credential: zero knowledge proof is invalid"))
   809  				Expect(credential).To(BeNil())
   810  			})
   811  
   812  			It("nil credential", func() {
   813  				// Verify Credential
   814  				valid, err := CredentialVerifier.Verify(
   815  					UserKey,
   816  					nil,
   817  					nil,
   818  					&bccsp.IdemixCredentialSignerOpts{
   819  						IssuerPK: IssuerPublicKey,
   820  						Attributes: []bccsp.IdemixAttribute{
   821  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{1}},
   822  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1}},
   823  							{Type: bccsp.IdemixIntAttribute, Value: 1},
   824  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1, 2}},
   825  							{Type: bccsp.IdemixHiddenAttribute},
   826  						},
   827  					},
   828  				)
   829  				Expect(err).To(MatchError("invalid signature, it must not be empty"))
   830  				Expect(valid).To(BeFalse())
   831  			})
   832  
   833  			It("malformed credential", func() {
   834  				// Verify Credential
   835  				valid, err := CredentialVerifier.Verify(
   836  					UserKey,
   837  					[]byte{0, 1, 2, 3, 4},
   838  					nil,
   839  					&bccsp.IdemixCredentialSignerOpts{
   840  						IssuerPK: IssuerPublicKey,
   841  						Attributes: []bccsp.IdemixAttribute{
   842  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{1}},
   843  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1}},
   844  							{Type: bccsp.IdemixIntAttribute, Value: 1},
   845  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1, 2}},
   846  							{Type: bccsp.IdemixHiddenAttribute},
   847  						},
   848  					},
   849  				)
   850  				Expect(err).To(MatchError("proto: idemix.Credential: illegal tag 0 (wire type 0)"))
   851  				Expect(valid).To(BeFalse())
   852  			})
   853  
   854  			It("invalid credential", func() {
   855  				// Invalidate credential by changing it in one position
   856  				if credential[4] == 0 {
   857  					credential[4] = 1
   858  				} else {
   859  					credential[4] = 0
   860  				}
   861  
   862  				// Verify Credential
   863  				valid, err := CredentialVerifier.Verify(
   864  					UserKey,
   865  					credential,
   866  					nil,
   867  					&bccsp.IdemixCredentialSignerOpts{
   868  						IssuerPK: IssuerPublicKey,
   869  						Attributes: []bccsp.IdemixAttribute{
   870  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0}},
   871  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1}},
   872  							{Type: bccsp.IdemixIntAttribute, Value: 1},
   873  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1, 2}},
   874  							{Type: bccsp.IdemixHiddenAttribute},
   875  						},
   876  					},
   877  				)
   878  				Expect(err).To(MatchError("credential is not cryptographically valid"))
   879  				Expect(valid).To(BeFalse())
   880  			})
   881  
   882  			It("invalid byte array in credential", func() {
   883  				// Verify Credential
   884  				valid, err := CredentialVerifier.Verify(
   885  					UserKey,
   886  					credential,
   887  					nil,
   888  					&bccsp.IdemixCredentialSignerOpts{
   889  						IssuerPK: IssuerPublicKey,
   890  						Attributes: []bccsp.IdemixAttribute{
   891  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{1}},
   892  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1}},
   893  							{Type: bccsp.IdemixIntAttribute, Value: 1},
   894  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1, 2}},
   895  							{Type: bccsp.IdemixHiddenAttribute},
   896  						},
   897  					},
   898  				)
   899  				Expect(err).To(MatchError("credential does not contain the correct attribute value at position [0]"))
   900  				Expect(valid).To(BeFalse())
   901  			})
   902  
   903  			It("invalid int in credential", func() {
   904  				// Verify Credential
   905  				valid, err := CredentialVerifier.Verify(
   906  					UserKey,
   907  					credential,
   908  					nil,
   909  					&bccsp.IdemixCredentialSignerOpts{
   910  						IssuerPK: IssuerPublicKey,
   911  						Attributes: []bccsp.IdemixAttribute{
   912  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0}},
   913  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1}},
   914  							{Type: bccsp.IdemixIntAttribute, Value: 2},
   915  							{Type: bccsp.IdemixBytesAttribute, Value: []byte{0, 1, 2}},
   916  							{Type: bccsp.IdemixHiddenAttribute},
   917  						},
   918  					},
   919  				)
   920  				Expect(err).To(MatchError("credential does not contain the correct attribute value at position [2]"))
   921  				Expect(valid).To(BeFalse())
   922  
   923  			})
   924  
   925  			It("invalid cri", func() {
   926  				// Verify CRI
   927  				cri[8] = 0
   928  				valid, err := CriVerifier.Verify(
   929  					RevocationPublicKey,
   930  					cri,
   931  					nil,
   932  					&bccsp.IdemixCRISignerOpts{},
   933  				)
   934  				Expect(err).To(MatchError("EpochPKSig invalid"))
   935  				Expect(valid).To(BeFalse())
   936  			})
   937  		})
   938  
   939  		Describe("the environment is not properly set", func() {
   940  
   941  			Describe("issuer", func() {
   942  				Context("duplicate attribute", func() {
   943  					It("returns an error", func() {
   944  						AttributeNames = []string{"A", "A"}
   945  						IssuerKey, err := IssuerKeyGen.KeyGen(&bccsp.IdemixIssuerKeyGenOpts{Temporary: true, AttributeNames: AttributeNames})
   946  						Expect(err).To(MatchError("attribute A appears multiple times in AttributeNames"))
   947  						Expect(IssuerKey).To(BeNil())
   948  					})
   949  				})
   950  			})
   951  
   952  		})
   953  
   954  		Describe("producing and verifying idemix signature with different sets of attributes", func() {
   955  			var (
   956  				SignatureScheme handlers.SignatureScheme
   957  				Signer          *handlers.Signer
   958  				Verifier        *handlers.Verifier
   959  				digest          []byte
   960  				signature       []byte
   961  
   962  				SignAttributes   []bccsp.IdemixAttribute
   963  				VerifyAttributes []bccsp.IdemixAttribute
   964  				RhIndex          int
   965  				Epoch            int
   966  				errMessage       string
   967  				validity         bool
   968  			)
   969  
   970  			BeforeEach(func() {
   971  				SignatureScheme = &bridge.SignatureScheme{NewRand: bridge.NewRandOrPanic}
   972  				Signer = &handlers.Signer{SignatureScheme: SignatureScheme}
   973  				Verifier = &handlers.Verifier{SignatureScheme: SignatureScheme}
   974  
   975  				digest = []byte("a digest")
   976  				RhIndex = 4
   977  				Epoch = 0
   978  				errMessage = ""
   979  			})
   980  
   981  			It("the signature with no disclosed attributes is valid", func() {
   982  				validity = true
   983  				SignAttributes = []bccsp.IdemixAttribute{
   984  					{Type: bccsp.IdemixHiddenAttribute},
   985  					{Type: bccsp.IdemixHiddenAttribute},
   986  					{Type: bccsp.IdemixHiddenAttribute},
   987  					{Type: bccsp.IdemixHiddenAttribute},
   988  					{Type: bccsp.IdemixHiddenAttribute},
   989  				}
   990  				VerifyAttributes = SignAttributes
   991  			})
   992  
   993  			It("the signature with disclosed attributes is valid", func() {
   994  				validity = true
   995  				SignAttributes = []bccsp.IdemixAttribute{
   996  					{Type: bccsp.IdemixBytesAttribute, Value: []byte{0}},
   997  					{Type: bccsp.IdemixHiddenAttribute},
   998  					{Type: bccsp.IdemixIntAttribute, Value: 1},
   999  					{Type: bccsp.IdemixHiddenAttribute},
  1000  					{Type: bccsp.IdemixHiddenAttribute},
  1001  				}
  1002  				VerifyAttributes = SignAttributes
  1003  			})
  1004  
  1005  			It("the signature with different disclosed attributes is not valid", func() {
  1006  				validity = false
  1007  				errMessage = "signature invalid: zero-knowledge proof is invalid"
  1008  				SignAttributes = []bccsp.IdemixAttribute{
  1009  					{Type: bccsp.IdemixBytesAttribute},
  1010  					{Type: bccsp.IdemixHiddenAttribute},
  1011  					{Type: bccsp.IdemixIntAttribute},
  1012  					{Type: bccsp.IdemixHiddenAttribute},
  1013  					{Type: bccsp.IdemixHiddenAttribute},
  1014  				}
  1015  				VerifyAttributes = []bccsp.IdemixAttribute{
  1016  					{Type: bccsp.IdemixBytesAttribute, Value: []byte{1}},
  1017  					{Type: bccsp.IdemixHiddenAttribute},
  1018  					{Type: bccsp.IdemixIntAttribute, Value: 1},
  1019  					{Type: bccsp.IdemixHiddenAttribute},
  1020  					{Type: bccsp.IdemixHiddenAttribute},
  1021  				}
  1022  			})
  1023  
  1024  			It("the signature with different disclosed attributes is not valid", func() {
  1025  				validity = false
  1026  				errMessage = "signature invalid: zero-knowledge proof is invalid"
  1027  				SignAttributes = []bccsp.IdemixAttribute{
  1028  					{Type: bccsp.IdemixBytesAttribute},
  1029  					{Type: bccsp.IdemixHiddenAttribute},
  1030  					{Type: bccsp.IdemixIntAttribute},
  1031  					{Type: bccsp.IdemixHiddenAttribute},
  1032  					{Type: bccsp.IdemixHiddenAttribute},
  1033  				}
  1034  				VerifyAttributes = []bccsp.IdemixAttribute{
  1035  					{Type: bccsp.IdemixBytesAttribute, Value: []byte{0}},
  1036  					{Type: bccsp.IdemixHiddenAttribute},
  1037  					{Type: bccsp.IdemixIntAttribute, Value: 10},
  1038  					{Type: bccsp.IdemixHiddenAttribute},
  1039  					{Type: bccsp.IdemixHiddenAttribute},
  1040  				}
  1041  			})
  1042  
  1043  			AfterEach(func() {
  1044  				var err error
  1045  				signature, err = Signer.Sign(
  1046  					UserKey,
  1047  					digest,
  1048  					&bccsp.IdemixSignerOpts{
  1049  						Credential: credential,
  1050  						Nym:        NymKey,
  1051  						IssuerPK:   IssuerPublicKey,
  1052  						Attributes: SignAttributes,
  1053  						RhIndex:    RhIndex,
  1054  						Epoch:      Epoch,
  1055  						CRI:        cri,
  1056  					},
  1057  				)
  1058  				Expect(err).NotTo(HaveOccurred())
  1059  
  1060  				valid, err := Verifier.Verify(
  1061  					IssuerPublicKey,
  1062  					signature,
  1063  					digest,
  1064  					&bccsp.IdemixSignerOpts{
  1065  						RevocationPublicKey: RevocationPublicKey,
  1066  						Attributes:          VerifyAttributes,
  1067  						RhIndex:             RhIndex,
  1068  						Epoch:               Epoch,
  1069  					},
  1070  				)
  1071  
  1072  				if errMessage == "" {
  1073  					Expect(err).NotTo(HaveOccurred())
  1074  				} else {
  1075  					Expect(err).To(MatchError(errMessage))
  1076  				}
  1077  				Expect(valid).To(BeEquivalentTo(validity))
  1078  			})
  1079  
  1080  		})
  1081  
  1082  		Context("producing an idemix signature", func() {
  1083  			var (
  1084  				SignatureScheme handlers.SignatureScheme
  1085  				Signer          *handlers.Signer
  1086  				SignAttributes  []bccsp.IdemixAttribute
  1087  				Verifier        *handlers.Verifier
  1088  			)
  1089  
  1090  			BeforeEach(func() {
  1091  				SignatureScheme = &bridge.SignatureScheme{NewRand: bridge.NewRandOrPanic}
  1092  				Signer = &handlers.Signer{SignatureScheme: SignatureScheme}
  1093  				SignAttributes = []bccsp.IdemixAttribute{
  1094  					{Type: bccsp.IdemixHiddenAttribute},
  1095  					{Type: bccsp.IdemixHiddenAttribute},
  1096  					{Type: bccsp.IdemixHiddenAttribute},
  1097  					{Type: bccsp.IdemixHiddenAttribute},
  1098  					{Type: bccsp.IdemixHiddenAttribute},
  1099  				}
  1100  				Verifier = &handlers.Verifier{SignatureScheme: SignatureScheme}
  1101  			})
  1102  
  1103  			It("fails when the credential is malformed", func() {
  1104  				signature, err := Signer.Sign(
  1105  					UserKey,
  1106  					[]byte("a message"),
  1107  					&bccsp.IdemixSignerOpts{
  1108  						Credential: []byte{0, 1, 2, 3},
  1109  						Nym:        NymKey,
  1110  						IssuerPK:   IssuerPublicKey,
  1111  						Attributes: SignAttributes,
  1112  						RhIndex:    4,
  1113  						Epoch:      0,
  1114  						CRI:        cri,
  1115  					},
  1116  				)
  1117  				Expect(err).To(MatchError("failed unmarshalling credential: proto: idemix.Credential: illegal tag 0 (wire type 0)"))
  1118  				Expect(signature).To(BeNil())
  1119  			})
  1120  
  1121  			It("fails when the cri is malformed", func() {
  1122  				signature, err := Signer.Sign(
  1123  					UserKey,
  1124  					[]byte("a message"),
  1125  					&bccsp.IdemixSignerOpts{
  1126  						Credential: credential,
  1127  						Nym:        NymKey,
  1128  						IssuerPK:   IssuerPublicKey,
  1129  						Attributes: SignAttributes,
  1130  						RhIndex:    4,
  1131  						Epoch:      0,
  1132  						CRI:        []byte{0, 1, 2, 3, 4},
  1133  					},
  1134  				)
  1135  				Expect(err).To(MatchError("failed unmarshalling credential revocation information: proto: idemix.CredentialRevocationInformation: illegal tag 0 (wire type 0)"))
  1136  				Expect(signature).To(BeNil())
  1137  			})
  1138  
  1139  			It("fails when invalid rhIndex is passed", func() {
  1140  				signature, err := Signer.Sign(
  1141  					UserKey,
  1142  					[]byte("a message"),
  1143  					&bccsp.IdemixSignerOpts{
  1144  						Credential: credential,
  1145  						Nym:        NymKey,
  1146  						IssuerPK:   IssuerPublicKey,
  1147  						Attributes: SignAttributes,
  1148  						RhIndex:    5,
  1149  						Epoch:      0,
  1150  						CRI:        cri,
  1151  					},
  1152  				)
  1153  				Expect(err).To(MatchError("failed creating new signature: cannot create idemix signature: received invalid input"))
  1154  				Expect(signature).To(BeNil())
  1155  			})
  1156  
  1157  			It("fails when the credential is invalid", func() {
  1158  				if credential[4] != 0 {
  1159  					credential[4] = 0
  1160  				} else {
  1161  					credential[4] = 1
  1162  				}
  1163  
  1164  				signature, err := Signer.Sign(
  1165  					UserKey,
  1166  					[]byte("a message"),
  1167  					&bccsp.IdemixSignerOpts{
  1168  						Credential: credential,
  1169  						Nym:        NymKey,
  1170  						IssuerPK:   IssuerPublicKey,
  1171  						Attributes: SignAttributes,
  1172  						RhIndex:    4,
  1173  						Epoch:      0,
  1174  						CRI:        cri,
  1175  					},
  1176  				)
  1177  				Expect(err).NotTo(HaveOccurred())
  1178  				Expect(signature).NotTo(BeNil())
  1179  
  1180  				valid, err := Verifier.Verify(
  1181  					IssuerPublicKey,
  1182  					signature,
  1183  					[]byte("a message"),
  1184  					&bccsp.IdemixSignerOpts{
  1185  						RevocationPublicKey: RevocationPublicKey,
  1186  						Attributes:          SignAttributes,
  1187  						RhIndex:             0,
  1188  						Epoch:               0,
  1189  					},
  1190  				)
  1191  				Expect(err).To(MatchError("signature invalid: APrime = 1"))
  1192  				Expect(valid).To(BeFalse())
  1193  
  1194  			})
  1195  
  1196  			It("fails when the credential is nil", func() {
  1197  				credential[4] = 0
  1198  				signature, err := Signer.Sign(
  1199  					UserKey,
  1200  					[]byte("a message"),
  1201  					&bccsp.IdemixSignerOpts{
  1202  						Credential: nil,
  1203  						Nym:        NymKey,
  1204  						IssuerPK:   IssuerPublicKey,
  1205  						Attributes: SignAttributes,
  1206  						RhIndex:    4,
  1207  						Epoch:      0,
  1208  						CRI:        cri,
  1209  					},
  1210  				)
  1211  				Expect(err).To(MatchError(ContainSubstring("failure [runtime error: index out of range")))
  1212  				Expect(signature).To(BeNil())
  1213  			})
  1214  		})
  1215  
  1216  		Describe("producing an idemix nym signature", func() {
  1217  			var (
  1218  				NymSignatureScheme *bridge.NymSignatureScheme
  1219  				NymSigner          *handlers.NymSigner
  1220  				NymVerifier        *handlers.NymVerifier
  1221  				digest             []byte
  1222  				signature          []byte
  1223  			)
  1224  
  1225  			BeforeEach(func() {
  1226  				var err error
  1227  				NymSignatureScheme = &bridge.NymSignatureScheme{NewRand: bridge.NewRandOrPanic}
  1228  				NymSigner = &handlers.NymSigner{NymSignatureScheme: NymSignatureScheme}
  1229  				NymVerifier = &handlers.NymVerifier{NymSignatureScheme: NymSignatureScheme}
  1230  
  1231  				digest = []byte("a digest")
  1232  
  1233  				signature, err = NymSigner.Sign(
  1234  					UserKey,
  1235  					digest,
  1236  					&bccsp.IdemixNymSignerOpts{
  1237  						Nym:      NymKey,
  1238  						IssuerPK: IssuerPublicKey,
  1239  					},
  1240  				)
  1241  				Expect(err).NotTo(HaveOccurred())
  1242  			})
  1243  
  1244  			It("the signature is valid", func() {
  1245  				valid, err := NymVerifier.Verify(
  1246  					NymPublicKey,
  1247  					signature,
  1248  					digest,
  1249  					&bccsp.IdemixNymSignerOpts{
  1250  						IssuerPK: IssuerPublicKey,
  1251  					},
  1252  				)
  1253  				Expect(err).NotTo(HaveOccurred())
  1254  				Expect(valid).To(BeTrue())
  1255  			})
  1256  
  1257  			Context("the signature is malformed", func() {
  1258  				var nymSignature *cryptolib.NymSignature
  1259  
  1260  				BeforeEach(func() {
  1261  					nymSignature = &cryptolib.NymSignature{}
  1262  					err := proto.Unmarshal(signature, nymSignature)
  1263  					Expect(err).NotTo(HaveOccurred())
  1264  				})
  1265  
  1266  				marshalAndVerify := func(nymSignature *cryptolib.NymSignature) (bool, error) {
  1267  					signature, err := proto.Marshal(nymSignature)
  1268  					Expect(err).NotTo(HaveOccurred())
  1269  
  1270  					return NymVerifier.Verify(
  1271  						NymPublicKey,
  1272  						signature,
  1273  						digest,
  1274  						&bccsp.IdemixNymSignerOpts{
  1275  							IssuerPK: IssuerPublicKey,
  1276  						},
  1277  					)
  1278  				}
  1279  
  1280  				Context("cause nonce does not encode a proper Big", func() {
  1281  					It("returns an error", func() {
  1282  						nymSignature.Nonce = []byte{0, 1, 2, 3, 4}
  1283  						valid, err := marshalAndVerify(nymSignature)
  1284  						Expect(valid).To(BeFalse())
  1285  						Expect(err).To(MatchError(ContainSubstring("failure [runtime error: index out of range")))
  1286  					})
  1287  				})
  1288  
  1289  				Context("cause nonce is nil", func() {
  1290  					It("returns an error", func() {
  1291  						nymSignature.Nonce = nil
  1292  						valid, err := marshalAndVerify(nymSignature)
  1293  						Expect(valid).To(BeFalse())
  1294  						Expect(err).To(MatchError(ContainSubstring("failure [runtime error: index out of range")))
  1295  					})
  1296  				})
  1297  
  1298  				Context("cause nonce encode a different thing", func() {
  1299  					It("returns an error", func() {
  1300  						var err error
  1301  						nymSignature.Nonce, err = (&bridge.Big{E: FP256BN.NewBIGint(1)}).Bytes()
  1302  						Expect(err).NotTo(HaveOccurred())
  1303  
  1304  						valid, err := marshalAndVerify(nymSignature)
  1305  						Expect(valid).To(BeFalse())
  1306  						Expect(err).To(MatchError("pseudonym signature invalid: zero-knowledge proof is invalid"))
  1307  					})
  1308  				})
  1309  
  1310  				Context("cause ProofC is not encoded properly", func() {
  1311  					It("returns an error", func() {
  1312  						nymSignature.ProofC = []byte{0, 1, 2, 3, 4}
  1313  
  1314  						valid, err := marshalAndVerify(nymSignature)
  1315  						Expect(valid).To(BeFalse())
  1316  						Expect(err).To(MatchError(ContainSubstring("failure [runtime error: index out of range")))
  1317  					})
  1318  				})
  1319  
  1320  				Context("cause ProofC is nil", func() {
  1321  					It("returns an error", func() {
  1322  						nymSignature.ProofC = nil
  1323  
  1324  						valid, err := marshalAndVerify(nymSignature)
  1325  						Expect(valid).To(BeFalse())
  1326  						Expect(err).To(MatchError(ContainSubstring("failure [runtime error: index out of range")))
  1327  					})
  1328  				})
  1329  
  1330  				Context("cause ProofC encode a different thing", func() {
  1331  					It("returns an error", func() {
  1332  						var err error
  1333  						nymSignature.ProofC, err = (&bridge.Big{E: FP256BN.NewBIGint(1)}).Bytes()
  1334  						Expect(err).NotTo(HaveOccurred())
  1335  
  1336  						valid, err := marshalAndVerify(nymSignature)
  1337  						Expect(valid).To(BeFalse())
  1338  						Expect(err).To(MatchError("pseudonym signature invalid: zero-knowledge proof is invalid"))
  1339  					})
  1340  				})
  1341  
  1342  				Context("cause ProofSRNym is not encoded properly", func() {
  1343  					It("returns an error", func() {
  1344  						nymSignature.ProofSRNym = []byte{0, 1, 2, 3, 4}
  1345  
  1346  						valid, err := marshalAndVerify(nymSignature)
  1347  						Expect(valid).To(BeFalse())
  1348  						Expect(err).To(MatchError(ContainSubstring("failure [runtime error: index out of range")))
  1349  					})
  1350  				})
  1351  
  1352  				Context("cause ProofSRNym is nil", func() {
  1353  					It("returns an error", func() {
  1354  						nymSignature.ProofSRNym = nil
  1355  						valid, err := marshalAndVerify(nymSignature)
  1356  						Expect(valid).To(BeFalse())
  1357  						Expect(err).To(MatchError(ContainSubstring("failure [runtime error: index out of range")))
  1358  					})
  1359  				})
  1360  
  1361  				Context("cause ProofSRNym encode a different thing", func() {
  1362  					It("returns an error", func() {
  1363  						var err error
  1364  						nymSignature.ProofSRNym, err = (&bridge.Big{E: FP256BN.NewBIGint(1)}).Bytes()
  1365  						Expect(err).NotTo(HaveOccurred())
  1366  
  1367  						valid, err := marshalAndVerify(nymSignature)
  1368  						Expect(valid).To(BeFalse())
  1369  						Expect(err).To(MatchError("pseudonym signature invalid: zero-knowledge proof is invalid"))
  1370  					})
  1371  				})
  1372  
  1373  				Context("cause ProofSSk is not encoded properly", func() {
  1374  					It("returns an error", func() {
  1375  						nymSignature.ProofSSk = []byte{0, 1, 2, 3, 4}
  1376  
  1377  						valid, err := marshalAndVerify(nymSignature)
  1378  						Expect(valid).To(BeFalse())
  1379  						Expect(err).To(MatchError(ContainSubstring("failure [runtime error: index out of range")))
  1380  					})
  1381  				})
  1382  
  1383  				Context("cause ProofSSk is nil", func() {
  1384  					It("returns an error", func() {
  1385  						nymSignature.ProofSSk = nil
  1386  
  1387  						valid, err := marshalAndVerify(nymSignature)
  1388  						Expect(valid).To(BeFalse())
  1389  						Expect(err).To(MatchError(ContainSubstring("failure [runtime error: index out of range")))
  1390  					})
  1391  				})
  1392  
  1393  				Context("cause ProofSSk encode a different thing", func() {
  1394  					It("returns an error", func() {
  1395  						var err error
  1396  						nymSignature.ProofSSk, err = (&bridge.Big{E: FP256BN.NewBIGint(1)}).Bytes()
  1397  						Expect(err).NotTo(HaveOccurred())
  1398  
  1399  						valid, err := marshalAndVerify(nymSignature)
  1400  						Expect(valid).To(BeFalse())
  1401  						Expect(err).To(MatchError("pseudonym signature invalid: zero-knowledge proof is invalid"))
  1402  					})
  1403  				})
  1404  			})
  1405  		})
  1406  
  1407  		Context("importing nym key", func() {
  1408  			var (
  1409  				NymPublicKeyImporter *handlers.NymPublicKeyImporter
  1410  			)
  1411  
  1412  			BeforeEach(func() {
  1413  				NymPublicKeyImporter = &handlers.NymPublicKeyImporter{User: User}
  1414  			})
  1415  
  1416  			It("nym key import is successful", func() {
  1417  				raw, err := NymPublicKey.Bytes()
  1418  				Expect(err).NotTo(HaveOccurred())
  1419  				Expect(raw).NotTo(BeEmpty())
  1420  
  1421  				k, err := NymPublicKeyImporter.KeyImport(raw, nil)
  1422  				Expect(err).NotTo(HaveOccurred())
  1423  				raw2, err := k.Bytes()
  1424  				Expect(err).NotTo(HaveOccurred())
  1425  				Expect(raw2).To(BeEquivalentTo(raw))
  1426  			})
  1427  		})
  1428  	})
  1429  })