github.com/leonlxy/hyperledger@v1.0.0-alpha.0.20170427033203-34922035d248/common/tools/cryptogen/msp/generator.go (about)

     1  /*
     2  Copyright IBM Corp. 2017 All Rights Reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8  		 http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  package msp
    17  
    18  import (
    19  	"crypto/x509"
    20  	"encoding/pem"
    21  	"os"
    22  	"path/filepath"
    23  
    24  	"github.com/hyperledger/fabric/common/tools/cryptogen/ca"
    25  	"github.com/hyperledger/fabric/common/tools/cryptogen/csp"
    26  )
    27  
    28  func GenerateLocalMSP(baseDir, name string, rootCA *ca.CA) error {
    29  
    30  	var response error
    31  	// create folder structure
    32  	err := createFolderStructure(baseDir)
    33  	response = err
    34  	if err == nil {
    35  		// generate private key
    36  		priv, _, err := csp.GeneratePrivateKey(filepath.Join(baseDir, "keystore"))
    37  		response = err
    38  		if err == nil {
    39  			// get public signing certificate
    40  			ecPubKey, err := csp.GetECPublicKey(priv)
    41  			response = err
    42  			if err == nil {
    43  				err = rootCA.SignCertificate(filepath.Join(baseDir, "signcerts"),
    44  					name, ecPubKey)
    45  				response = err
    46  				if err == nil {
    47  					// write root cert to folders
    48  					folders := []string{"admincerts", "cacerts"}
    49  					for _, folder := range folders {
    50  						err = x509ToFile(filepath.Join(baseDir, folder), rootCA.Name, rootCA.SignCert)
    51  						if err != nil {
    52  							return err
    53  						}
    54  					}
    55  				}
    56  			}
    57  		}
    58  	}
    59  	return response
    60  }
    61  
    62  func GenerateVerifyingMSP(baseDir string, rootCA *ca.CA) error {
    63  
    64  	// create folder structure
    65  	err := createFolderStructure(baseDir)
    66  	if err == nil {
    67  		// write public cert to appropriate folders
    68  		folders := []string{"admincerts", "cacerts", "signcerts"}
    69  		for _, folder := range folders {
    70  			err = x509ToFile(filepath.Join(baseDir, folder), rootCA.Name, rootCA.SignCert)
    71  			if err != nil {
    72  				return err
    73  			}
    74  		}
    75  	}
    76  	return err
    77  }
    78  
    79  func createFolderStructure(rootDir string) error {
    80  
    81  	// create admincerts, cacerts, keystore and signcerts folders
    82  	folders := []string{
    83  		filepath.Join(rootDir, "admincerts"),
    84  		filepath.Join(rootDir, "cacerts"),
    85  		filepath.Join(rootDir, "keystore"),
    86  		filepath.Join(rootDir, "signcerts"),
    87  	}
    88  
    89  	for _, folder := range folders {
    90  		err := os.MkdirAll(folder, 0755)
    91  		if err != nil {
    92  			return err
    93  		}
    94  	}
    95  	return nil
    96  }
    97  
    98  func x509ToFile(baseDir, name string, cert *x509.Certificate) error {
    99  
   100  	//write cert out to file
   101  	fileName := filepath.Join(baseDir, name+"-cert.pem")
   102  	certFile, err := os.Create(fileName)
   103  	if err != nil {
   104  		return err
   105  	}
   106  	//pem encode the cert
   107  	err = pem.Encode(certFile, &pem.Block{Type: "CERTIFICATE", Bytes: cert.Raw})
   108  	certFile.Close()
   109  
   110  	return err
   111  
   112  }