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 }