Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit 0e5f0f6

Browse files
committed
[FAB-6983] fabric-ca to reuse sdk cryptosuite
- fabric-ca will reuse sdk cryptosuite while creating new fabric-client - removed unused internal fabric-ca code - msp.NewBccspMsp will reuse cryptosuite from fabric client - pkg\cryptosuite\bccsp test coverage - 100% - pkg\cryptosuite test coverage - 100% Change-Id: I946d1b6f9d0219d51b5bf354ebb45d745d50340b Signed-off-by: Sudesh Shetty <sudesh.shetty@securekey.com>
1 parent 26b3d2e commit 0e5f0f6

File tree

27 files changed

+374
-441
lines changed

27 files changed

+374
-441
lines changed

api/apicryptosuite/cryptosuite.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616
/*
17-
Notice: This file is a modified version of ‘third_party/github.com/hyperledger/fabric/bccsp/bccsp.go’
17+
Notice: This file is a modified version of ‘internal/github.com/hyperledger/fabric/bccsp/bccsp.go’
1818
where interfaces and functions are removed to minimize for Hyperledger Fabric SDK Go usage.
1919
2020
CryptoSuite interface defined in this file acts as a wrapper for

def/fabapi/context/defprovider/org.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ func NewOrgClientFactory() *OrgClientFactory {
2626
}
2727

2828
// NewMSPClient returns a new default implmentation of the MSP client
29-
func (f *OrgClientFactory) NewMSPClient(orgName string, config apiconfig.Config) (fabca.FabricCAClient, error) {
30-
mspClient, err := fabricCAClient.NewFabricCAClient(config, orgName)
29+
func (f *OrgClientFactory) NewMSPClient(orgName string, config apiconfig.Config, cryptoProvider apicryptosuite.CryptoSuite) (fabca.FabricCAClient, error) {
30+
mspClient, err := fabricCAClient.NewFabricCAClient(orgName, config, cryptoProvider)
3131
if err != nil {
3232
return nil, errors.WithMessage(err, "NewFabricCAClient failed")
3333
}

def/fabapi/context/defprovider/sdk.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import (
1313
"github.com/hyperledger/fabric-sdk-go/api/apicryptosuite"
1414
"github.com/hyperledger/fabric-sdk-go/def/fabapi/opt"
1515
configImpl "github.com/hyperledger/fabric-sdk-go/pkg/config"
16-
cryptosuite "github.com/hyperledger/fabric-sdk-go/pkg/cryptosuite/bccsp"
16+
"github.com/hyperledger/fabric-sdk-go/pkg/cryptosuite"
17+
cryptosuiteimpl "github.com/hyperledger/fabric-sdk-go/pkg/cryptosuite/bccsp"
1718
"github.com/hyperledger/fabric-sdk-go/pkg/errors"
1819
kvs "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/keyvaluestore"
1920
signingMgr "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/signingmgr"
@@ -56,7 +57,12 @@ func (f *DefaultProviderFactory) NewStateStoreProvider(o opt.StateStoreOpts, con
5657

5758
// NewCryptoSuiteProvider returns a new default implementation of BCCSP
5859
func (f *DefaultProviderFactory) NewCryptoSuiteProvider(config apiconfig.Config) (apicryptosuite.CryptoSuite, error) {
59-
return cryptosuite.GetSuiteByConfig(config)
60+
cryptoSuiteProvider, err := cryptosuiteimpl.GetSuiteByConfig(config)
61+
//Setting this cryptosuite as a factory default too
62+
if cryptoSuiteProvider != nil {
63+
cryptosuite.SetDefault(cryptoSuiteProvider)
64+
}
65+
return cryptoSuiteProvider, err
6066
}
6167

6268
// NewSigningManager returns a new default implementation of signing manager

def/fabapi/context/provider.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ type SDKProviderFactory interface {
3030
// OrgClientFactory allows overriding default clients and providers of an organization
3131
// Currently, a context is created for each organization that the client app needs.
3232
type OrgClientFactory interface {
33-
NewMSPClient(orgName string, config apiconfig.Config) (fabca.FabricCAClient, error)
33+
NewMSPClient(orgName string, config apiconfig.Config, cryptoProvider apicryptosuite.CryptoSuite) (fabca.FabricCAClient, error)
3434
NewCredentialManager(orgName string, config apiconfig.Config, cryptoProvider apicryptosuite.CryptoSuite) (fab.CredentialManager, error)
3535
}
3636

def/fabapi/pkgfactory.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,8 @@ func NewConfigManager(configFile string) (config.Config, error) {
186186
}
187187

188188
// NewCAClient returns a new default implmentation of the MSP client
189-
func NewCAClient(orgName string, config config.Config) (fabca.FabricCAClient, error) {
190-
mspClient, err := fabricCAClient.NewFabricCAClient(config, orgName)
189+
func NewCAClient(orgName string, config config.Config, cryptoSuite apicryptosuite.CryptoSuite) (fabca.FabricCAClient, error) {
190+
mspClient, err := fabricCAClient.NewFabricCAClient(orgName, config, cryptoSuite)
191191
if err != nil {
192192
return nil, errors.WithMessage(err, "NewFabricCAClient failed")
193193
}

internal/github.com/hyperledger/fabric-ca/lib/client.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,7 @@ func (c *Client) Init() error {
9494
if err != nil {
9595
return errors.Wrap(err, "Failed to create cacerts directory")
9696
}
97-
// Initialize BCCSP (the crypto layer)
98-
c.csp, err = util.InitBCCSP(&cfg.CSP, mspDir, c.HomeDir)
99-
if err != nil {
100-
return err
101-
}
97+
c.csp = cfg.CSP
10298
// Create http.Client object and associate it with this client
10399
err = c.initHTTPClient()
104100
if err != nil {

internal/github.com/hyperledger/fabric-ca/lib/clientconfig.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ Please review third_party pinning scripts and patches for more details.
2121
package lib
2222

2323
import (
24+
"github.com/hyperledger/fabric-sdk-go/api/apicryptosuite"
2425
"github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric-ca/api"
2526
"github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric-ca/lib/tls"
26-
factory "github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric-ca/sdkpatch/cryptosuitebridge"
2727
)
2828

2929
// ClientConfig is the fabric-ca client's config
@@ -37,6 +37,6 @@ type ClientConfig struct {
3737
ID api.RegistrationRequest
3838
Revoke api.RevocationRequest
3939
CAInfo api.GetCAInfoRequest
40-
CAName string `help:"Name of CA"`
41-
CSP *factory.FactoryOpts `mapstructure:"bccsp"`
40+
CAName string `help:"Name of CA"`
41+
CSP apicryptosuite.CryptoSuite `mapstructure:"bccsp"`
4242
}

internal/github.com/hyperledger/fabric-ca/sdkpatch/cryptosuitebridge/cryptosuitebridge.go

Lines changed: 6 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@ import (
1818
"github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/bccsp"
1919
"github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/bccsp/factory"
2020
cspsigner "github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/bccsp/signer"
21-
"github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/bccsp/sw"
2221
"github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/bccsp/utils"
23-
cryptosuite "github.com/hyperledger/fabric-sdk-go/pkg/cryptosuite/bccsp"
22+
"github.com/hyperledger/fabric-sdk-go/pkg/cryptosuite"
2423
)
2524

2625
const (
@@ -54,18 +53,9 @@ type FactoryOpts struct {
5453
*factory.FactoryOpts
5554
}
5655

57-
//GetBCCSPFromOpts is a bridge for factory.GetBCCSPFromOpts(config)
58-
func GetBCCSPFromOpts(config *FactoryOpts) (apicryptosuite.CryptoSuite, error) {
59-
bccsp, err := factory.GetBCCSPFromOpts(getFactoryOpts(config))
60-
if err != nil {
61-
return nil, err
62-
}
63-
return cryptosuite.GetSuite(bccsp), nil
64-
}
65-
66-
//InitFactories is a bridge for bccsp factory.InitFactories(config)
67-
func InitFactories(config *FactoryOpts) error {
68-
return factory.InitFactories(getFactoryOpts(config))
56+
// NewCspSigner is a bridge for bccsp signer.New call
57+
func NewCspSigner(csp apicryptosuite.CryptoSuite, key apicryptosuite.Key) (crypto.Signer, error) {
58+
return cspsigner.New(csp, key)
6959
}
7060

7161
// PEMtoPrivateKey is a bridge for bccsp utils.PEMtoPrivateKey()
@@ -78,46 +68,9 @@ func PrivateKeyToDER(privateKey *ecdsa.PrivateKey) ([]byte, error) {
7868
return utils.PrivateKeyToDER(privateKey)
7969
}
8070

81-
// NewCspsigner is a bridge for bccsp signer.New call
82-
func NewCspsigner(csp apicryptosuite.CryptoSuite, key apicryptosuite.Key) (crypto.Signer, error) {
83-
return cspsigner.New(csp, key)
84-
}
85-
86-
//NewEmptySwOpts creates new empty bccsp factory.SwOpts
87-
func NewSwOpts() *factory.SwOpts {
88-
return &factory.SwOpts{}
89-
}
90-
91-
//NewEmptyFileKeystoreOpts creates new empty bccsp factory.FileKeystoreOpts
92-
func NewFileKeystoreOpts() *factory.FileKeystoreOpts {
93-
return &factory.FileKeystoreOpts{}
94-
}
95-
96-
//GetFactoryDefaultCryptoSuite creates new cryptosuite from bccsp factory default
71+
//GetDefault returns default cryptosuite from bccsp factory default
9772
func GetDefault() apicryptosuite.CryptoSuite {
98-
return cryptosuite.GetSuite(factory.GetDefault())
99-
}
100-
101-
//SignatureToLowS is a bridge for bccsp sw.SignatureToLowS()
102-
func SignatureToLowS(k *ecdsa.PublicKey, signature []byte) ([]byte, error) {
103-
return sw.SignatureToLowS(k, signature)
104-
}
105-
106-
//GetHashOpt is a bridge for bccsp util GetHashOpt
107-
func GetHashOpt(hashFunction string) (apicryptosuite.HashOpts, error) {
108-
return bccsp.GetHashOpt(hashFunction)
109-
}
110-
111-
func getFactoryOpts(config *FactoryOpts) *factory.FactoryOpts {
112-
if config == nil {
113-
return nil
114-
}
115-
return &factory.FactoryOpts{
116-
SwOpts: config.SwOpts,
117-
ProviderName: config.ProviderName,
118-
Pkcs11Opts: config.Pkcs11Opts,
119-
PluginOpts: config.PluginOpts,
120-
}
73+
return cryptosuite.GetDefault()
12174
}
12275

12376
//GetSHAOpts returns options for computing SHA.

internal/github.com/hyperledger/fabric-ca/util/csp.go

Lines changed: 2 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -29,106 +29,16 @@ import (
2929
"encoding/pem"
3030
"fmt"
3131
"io/ioutil"
32-
"path"
3332
"strings"
3433

3534
"github.com/hyperledger/fabric-sdk-go/api/apicryptosuite"
3635
"github.com/hyperledger/fabric-sdk-go/pkg/errors"
3736

3837
"github.com/cloudflare/cfssl/csr"
39-
"github.com/cloudflare/cfssl/helpers"
4038
factory "github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric-ca/sdkpatch/cryptosuitebridge"
4139
log "github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric-ca/sdkpatch/logbridge"
4240
)
4341

44-
// InitBCCSP initializes BCCSP
45-
func InitBCCSP(optsPtr **factory.FactoryOpts, mspDir, homeDir string) (apicryptosuite.CryptoSuite, error) {
46-
err := ConfigureBCCSP(optsPtr, mspDir, homeDir)
47-
if err != nil {
48-
return nil, err
49-
}
50-
csp, err := GetBCCSP(*optsPtr, homeDir)
51-
if err != nil {
52-
return nil, err
53-
}
54-
return csp, nil
55-
}
56-
57-
// ConfigureBCCSP configures BCCSP, using
58-
func ConfigureBCCSP(optsPtr **factory.FactoryOpts, mspDir, homeDir string) error {
59-
var err error
60-
if optsPtr == nil {
61-
return errors.New("nil argument not allowed")
62-
}
63-
opts := *optsPtr
64-
if opts == nil {
65-
opts = &factory.FactoryOpts{}
66-
}
67-
if opts.ProviderName == "" {
68-
opts.ProviderName = "SW"
69-
}
70-
if strings.ToUpper(opts.ProviderName) == "SW" {
71-
if opts.SwOpts == nil {
72-
opts.SwOpts = factory.NewSwOpts()
73-
}
74-
if opts.SwOpts.HashFamily == "" {
75-
opts.SwOpts.HashFamily = "SHA2"
76-
}
77-
if opts.SwOpts.SecLevel == 0 {
78-
opts.SwOpts.SecLevel = 256
79-
}
80-
if opts.SwOpts.FileKeystore == nil {
81-
opts.SwOpts.FileKeystore = factory.NewFileKeystoreOpts()
82-
}
83-
// The mspDir overrides the KeyStorePath; otherwise, if not set, set default
84-
if mspDir != "" {
85-
opts.SwOpts.FileKeystore.KeyStorePath = path.Join(mspDir, "keystore")
86-
} else if opts.SwOpts.FileKeystore.KeyStorePath == "" {
87-
opts.SwOpts.FileKeystore.KeyStorePath = path.Join("msp", "keystore")
88-
}
89-
}
90-
err = makeFileNamesAbsolute(opts, homeDir)
91-
if err != nil {
92-
return errors.WithMessage(err, "Failed to make BCCSP files absolute")
93-
}
94-
log.Debugf("Initializing BCCSP: %+v", opts)
95-
if opts.SwOpts != nil {
96-
log.Debugf("Initializing BCCSP with software options %+v", opts.SwOpts)
97-
}
98-
if opts.Pkcs11Opts != nil {
99-
log.Debugf("Initializing BCCSP with PKCS11 options %+v", opts.Pkcs11Opts)
100-
}
101-
// Init the BCCSP factories
102-
err = factory.InitFactories(opts)
103-
if err != nil {
104-
return errors.WithMessage(err, "Failed to initialize BCCSP Factories")
105-
}
106-
*optsPtr = opts
107-
return nil
108-
}
109-
110-
// GetBCCSP returns BCCSP
111-
func GetBCCSP(opts *factory.FactoryOpts, homeDir string) (apicryptosuite.CryptoSuite, error) {
112-
113-
// Get BCCSP from the opts
114-
csp, err := factory.GetBCCSPFromOpts(opts)
115-
if err != nil {
116-
return nil, errors.WithMessage(err, "Failed to get BCCSP with opts")
117-
}
118-
return csp, nil
119-
}
120-
121-
// makeFileNamesAbsolute makes all relative file names associated with CSP absolute,
122-
// relative to 'homeDir'.
123-
func makeFileNamesAbsolute(opts *factory.FactoryOpts, homeDir string) error {
124-
var err error
125-
if opts != nil && opts.SwOpts != nil && opts.SwOpts.FileKeystore != nil {
126-
fks := opts.SwOpts.FileKeystore
127-
fks.KeyStorePath, err = MakeFileAbs(fks.KeyStorePath, homeDir)
128-
}
129-
return err
130-
}
131-
13242
// getBCCSPKeyOpts generates a key as specified in the request.
13343
// This supports ECDSA and RSA.
13444
func getBCCSPKeyOpts(kr csr.KeyRequest, ephemeral bool) (opts apicryptosuite.KeyGenOpts, err error) {
@@ -183,30 +93,13 @@ func GetSignerFromCert(cert *x509.Certificate, csp apicryptosuite.CryptoSuite) (
18393
return nil, nil, errors.WithMessage(err, "Could not find matching private key for SKI")
18494
}
18595
// Construct and initialize the signer
186-
signer, err := factory.NewCspsigner(csp, privateKey)
96+
signer, err := factory.NewCspSigner(csp, privateKey)
18797
if err != nil {
18898
return nil, nil, errors.WithMessage(err, "Failed to load ski from bccsp")
18999
}
190100
return privateKey, signer, nil
191101
}
192102

193-
// GetSignerFromCertFile load skiFile and load private key represented by ski and return bccsp signer that conforms to crypto.Signer
194-
func GetSignerFromCertFile(certFile string, csp apicryptosuite.CryptoSuite) (apicryptosuite.Key, crypto.Signer, *x509.Certificate, error) {
195-
// Load cert file
196-
certBytes, err := ioutil.ReadFile(certFile)
197-
if err != nil {
198-
return nil, nil, nil, errors.Wrapf(err, "Could not read certFile '%s'", certFile)
199-
}
200-
// Parse certificate
201-
parsedCa, err := helpers.ParseCertificatePEM(certBytes)
202-
if err != nil {
203-
return nil, nil, nil, err
204-
}
205-
// Get the signer from the cert
206-
key, cspSigner, err := GetSignerFromCert(parsedCa, csp)
207-
return key, cspSigner, parsedCa, err
208-
}
209-
210103
// BCCSPKeyRequestGenerate generates keys through BCCSP
211104
// somewhat mirroring to cfssl/req.KeyRequest.Generate()
212105
func BCCSPKeyRequestGenerate(req *csr.CertificateRequest, myCSP apicryptosuite.CryptoSuite) (apicryptosuite.Key, crypto.Signer, error) {
@@ -220,7 +113,7 @@ func BCCSPKeyRequestGenerate(req *csr.CertificateRequest, myCSP apicryptosuite.C
220113
return nil, nil, err
221114
}
222115

223-
cspSigner, err := factory.NewCspsigner(myCSP, key)
116+
cspSigner, err := factory.NewCspSigner(myCSP, key)
224117
if err != nil {
225118
return nil, nil, errors.WithMessage(err, "Failed initializing CryptoSigner")
226119
}

internal/github.com/hyperledger/fabric/msp/mspimpl.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,12 @@ type bccspmsp struct {
9797
// crypto provider. It handles x.509 certificates and can
9898
// generate identities and signing identities backed by
9999
// certificates and keypairs
100-
func NewBccspMsp(version MSPVersion) (MSP, error) {
100+
func NewBccspMsp(version MSPVersion, cryptoSuite apicryptosuite.CryptoSuite) (MSP, error) {
101101
mspLogger.Debugf("Creating BCCSP-based MSP instance")
102102

103-
bccsp := factory.GetDefault()
104103
theMsp := &bccspmsp{}
105104
theMsp.version = version
106-
theMsp.bccsp = bccsp
105+
theMsp.bccsp = cryptoSuite
107106
switch version {
108107
case MSPv1_0:
109108
theMsp.internalSetupFunc = theMsp.setupV1
@@ -185,7 +184,7 @@ func (msp *bccspmsp) getSigningIdentityFromConf(sidInfo *m.SigningIdentityInfo)
185184
}
186185

187186
// get the peer signer
188-
peerSigner, err := factory.NewCspsigner(msp.bccsp, privKey)
187+
peerSigner, err := factory.NewCspSigner(msp.bccsp, privKey)
189188
if err != nil {
190189
return nil, errors.WithMessage(err, "getIdentityFromBytes error: Failed initializing bccspCryptoSigner")
191190
}

0 commit comments

Comments
 (0)