github.com/kaituanwang/hyperledger@v2.0.1+incompatible/common/tools/idemixgen/idemixca/idemixca_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package idemixca 8 9 import ( 10 "crypto/x509" 11 "encoding/pem" 12 "io/ioutil" 13 "os" 14 "path/filepath" 15 "testing" 16 17 "github.com/golang/protobuf/proto" 18 "github.com/hyperledger/fabric/bccsp/sw" 19 "github.com/hyperledger/fabric/idemix" 20 m "github.com/hyperledger/fabric/msp" 21 "github.com/pkg/errors" 22 "github.com/stretchr/testify/assert" 23 ) 24 25 var testDir = filepath.Join(os.TempDir(), "idemixca-test") 26 27 func TestIdemixCa(t *testing.T) { 28 cleanup() 29 30 isk, ipkBytes, err := GenerateIssuerKey() 31 assert.NoError(t, err) 32 33 revocationkey, err := idemix.GenerateLongTermRevocationKey() 34 assert.NoError(t, err) 35 36 ipk := &idemix.IssuerPublicKey{} 37 err = proto.Unmarshal(ipkBytes, ipk) 38 assert.NoError(t, err) 39 40 encodedRevocationPK, err := x509.MarshalPKIXPublicKey(revocationkey.Public()) 41 assert.NoError(t, err) 42 pemEncodedRevocationPK := pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: encodedRevocationPK}) 43 44 writeVerifierToFile(ipkBytes, pemEncodedRevocationPK) 45 46 key := &idemix.IssuerKey{Isk: isk, Ipk: ipk} 47 48 conf, err := GenerateSignerConfig(m.GetRoleMaskFromIdemixRole(m.MEMBER), "OU1", "enrollmentid1", 1, key, revocationkey) 49 assert.NoError(t, err) 50 cleanupSigner() 51 assert.NoError(t, writeSignerToFile(conf)) 52 assert.NoError(t, setupMSP()) 53 54 conf, err = GenerateSignerConfig(m.GetRoleMaskFromIdemixRole(m.ADMIN), "OU1", "enrollmentid2", 1234, key, revocationkey) 55 assert.NoError(t, err) 56 cleanupSigner() 57 assert.NoError(t, writeSignerToFile(conf)) 58 assert.NoError(t, setupMSP()) 59 60 // Without the verifier dir present, setup should give an error 61 cleanupVerifier() 62 assert.Error(t, setupMSP()) 63 64 _, err = GenerateSignerConfig(m.GetRoleMaskFromIdemixRole(m.ADMIN), "", "enrollmentid", 1, key, revocationkey) 65 assert.EqualError(t, err, "the OU attribute value is empty") 66 67 _, err = GenerateSignerConfig(m.GetRoleMaskFromIdemixRole(m.ADMIN), "OU1", "", 1, key, revocationkey) 68 assert.EqualError(t, err, "the enrollment id value is empty") 69 } 70 71 func cleanup() error { 72 // clean up any previous files 73 err := os.RemoveAll(testDir) 74 if err != nil { 75 return nil 76 } 77 return os.Mkdir(testDir, os.ModePerm) 78 } 79 80 func cleanupSigner() { 81 os.RemoveAll(filepath.Join(testDir, m.IdemixConfigDirUser)) 82 } 83 84 func cleanupVerifier() { 85 os.RemoveAll(filepath.Join(testDir, m.IdemixConfigDirMsp)) 86 } 87 88 func writeVerifierToFile(ipkBytes []byte, revpkBytes []byte) error { 89 err := os.Mkdir(filepath.Join(testDir, m.IdemixConfigDirMsp), os.ModePerm) 90 if err != nil { 91 return err 92 } 93 err = ioutil.WriteFile(filepath.Join(testDir, m.IdemixConfigDirMsp, m.IdemixConfigFileIssuerPublicKey), ipkBytes, 0644) 94 if err != nil { 95 return err 96 } 97 98 return ioutil.WriteFile(filepath.Join(testDir, m.IdemixConfigDirMsp, m.IdemixConfigFileRevocationPublicKey), revpkBytes, 0644) 99 } 100 101 func writeSignerToFile(signerBytes []byte) error { 102 err := os.Mkdir(filepath.Join(testDir, m.IdemixConfigDirUser), os.ModePerm) 103 if err != nil { 104 return err 105 } 106 return ioutil.WriteFile(filepath.Join(testDir, m.IdemixConfigDirUser, m.IdemixConfigFileSigner), signerBytes, 0644) 107 } 108 109 // setupMSP tests whether we can successfully setup an idemix msp 110 // with the generated config bytes 111 func setupMSP() error { 112 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 113 if err != nil { 114 return err 115 } 116 // setup an idemix msp from the test directory 117 msp, err := m.New( 118 &m.IdemixNewOpts{NewBaseOpts: m.NewBaseOpts{Version: m.MSPv1_1}}, 119 cryptoProvider, 120 ) 121 if err != nil { 122 return errors.Wrap(err, "Getting MSP failed") 123 } 124 mspConfig, err := m.GetIdemixMspConfig(testDir, "TestName") 125 126 if err != nil { 127 return err 128 } 129 130 return msp.Setup(mspConfig) 131 }