@@ -21,59 +21,94 @@ import (
21
21
"os"
22
22
"path/filepath"
23
23
24
+ "encoding/hex"
25
+ "io"
26
+
27
+ "github.com/hyperledger/fabric/bccsp"
24
28
"github.com/hyperledger/fabric/common/tools/cryptogen/ca"
25
29
"github.com/hyperledger/fabric/common/tools/cryptogen/csp"
26
30
)
27
31
28
32
func GenerateLocalMSP (baseDir , name string , rootCA * ca.CA ) error {
29
33
30
- var response error
31
34
// 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
- }
35
+ mspDir := filepath .Join (baseDir , "msp" )
36
+ tlsDir := filepath .Join (baseDir , "tls" )
37
+
38
+ err := createFolderStructure (mspDir )
39
+ if err != nil {
40
+ return err
41
+ }
42
+
43
+ err = os .MkdirAll (tlsDir , 0755 )
44
+ if err != nil {
45
+ return err
46
+ }
47
+
48
+ // get keystore path
49
+ keystore := filepath .Join (mspDir , "keystore" )
50
+
51
+ // generate private key
52
+ priv , _ , err := csp .GeneratePrivateKey (keystore )
53
+ if err != nil {
54
+ return err
55
+ }
56
+
57
+ // get public signing certificate
58
+ ecPubKey , err := csp .GetECPublicKey (priv )
59
+ if err != nil {
60
+ return err
61
+ }
62
+
63
+ cert , err := rootCA .SignCertificate (filepath .Join (mspDir , "signcerts" ), name , ecPubKey )
64
+ if err != nil {
65
+ return err
66
+ }
67
+
68
+ // write artifacts to MSP folders
69
+ folders := []string {"admincerts" , "cacerts" }
70
+ for _ , folder := range folders {
71
+ err = x509Export (filepath .Join (mspDir , folder , x509Filename (rootCA .Name )), rootCA .SignCert )
72
+ if err != nil {
73
+ return err
57
74
}
58
75
}
59
- return response
76
+
77
+ // write artifacts to TLS folder
78
+ err = x509Export (filepath .Join (tlsDir , "ca.crt" ), rootCA .SignCert )
79
+ if err != nil {
80
+ return err
81
+ }
82
+
83
+ err = x509Export (filepath .Join (tlsDir , "server.crt" ), cert )
84
+ if err != nil {
85
+ return err
86
+ }
87
+
88
+ err = keyExport (keystore , filepath .Join (tlsDir , "server.key" ), priv )
89
+ if err != nil {
90
+ return err
91
+ }
92
+
93
+ return nil
60
94
}
61
95
62
96
func GenerateVerifyingMSP (baseDir string , rootCA * ca.CA ) error {
63
97
64
98
// create folder structure
65
99
err := createFolderStructure (baseDir )
66
100
if err == nil {
67
- // write public cert to appropriate folders
101
+ // write MSP cert to appropriate folders
68
102
folders := []string {"admincerts" , "cacerts" , "signcerts" }
69
103
for _ , folder := range folders {
70
- err = x509ToFile (filepath .Join (baseDir , folder ), rootCA .Name , rootCA .SignCert )
104
+ err = x509Export (filepath .Join (baseDir , folder , x509Filename ( rootCA .Name )) , rootCA .SignCert )
71
105
if err != nil {
72
106
return err
73
107
}
74
108
}
75
109
}
76
- return err
110
+
111
+ return nil
77
112
}
78
113
79
114
func createFolderStructure (rootDir string ) error {
@@ -92,21 +127,50 @@ func createFolderStructure(rootDir string) error {
92
127
return err
93
128
}
94
129
}
130
+
95
131
return nil
96
132
}
97
133
98
- func x509ToFile (baseDir , name string , cert * x509.Certificate ) error {
134
+ func x509Filename (name string ) string {
135
+ return name + "-cert.pem"
136
+ }
99
137
100
- //write cert out to file
101
- fileName := filepath .Join (baseDir , name + "-cert.pem" )
102
- certFile , err := os .Create (fileName )
138
+ func x509Export (path string , cert * x509.Certificate ) error {
139
+ return pemExport (path , "CERTIFICATE" , cert .Raw )
140
+ }
141
+
142
+ func copyFile (src , dst string ) error {
143
+ in , err := os .Open (src )
144
+ if err != nil {
145
+ return err
146
+ }
147
+ defer in .Close ()
148
+ out , err := os .Create (dst )
149
+ if err != nil {
150
+ return err
151
+ }
152
+ defer out .Close ()
153
+ _ , err = io .Copy (out , in )
154
+ cerr := out .Close ()
103
155
if err != nil {
104
156
return err
105
157
}
106
- //pem encode the cert
107
- err = pem .Encode (certFile , & pem.Block {Type : "CERTIFICATE" , Bytes : cert .Raw })
108
- certFile .Close ()
158
+ return cerr
159
+ }
160
+
161
+ func keyExport (keystore , output string , key bccsp.Key ) error {
162
+ id := hex .EncodeToString (key .SKI ())
163
+
164
+ return copyFile (filepath .Join (keystore , id + "_sk" ), output )
165
+ }
109
166
110
- return err
167
+ func pemExport (path , pemType string , bytes []byte ) error {
168
+ //write pem out to file
169
+ file , err := os .Create (path )
170
+ if err != nil {
171
+ return err
172
+ }
173
+ defer file .Close ()
111
174
175
+ return pem .Encode (file , & pem.Block {Type : pemType , Bytes : bytes })
112
176
}
0 commit comments