Skip to content

Commit 2ee7e32

Browse files
committed
Remove bccsp from cryptogen
cryptogen is a simple tool for generating sample crypto material to use during development and test. It only generates EC keys/certs with fixed parameters so does not need to use the bccsp package as it can use Go's built-in crypto. FAB-14738 #done Change-Id: Ie39bf958ec5fc283a7a8903305f7435ae5bae193 Signed-off-by: Gari Singh <gari.r.singh@gmail.com>
1 parent 36f783c commit 2ee7e32

File tree

10 files changed

+637
-362
lines changed

10 files changed

+637
-362
lines changed

cmd/cryptogen/main.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ import (
1818
"github.com/hyperledger/fabric/internal/cryptogen/csp"
1919
"github.com/hyperledger/fabric/internal/cryptogen/metadata"
2020
"github.com/hyperledger/fabric/internal/cryptogen/msp"
21-
"gopkg.in/alecthomas/kingpin.v2"
22-
"gopkg.in/yaml.v2"
21+
22+
kingpin "gopkg.in/alecthomas/kingpin.v2"
23+
yaml "gopkg.in/yaml.v2"
2324
)
2425

2526
const (
@@ -698,12 +699,12 @@ func printVersion() {
698699
}
699700

700701
func getCA(caDir string, spec OrgSpec, name string) *ca.CA {
701-
_, signer, _ := csp.LoadPrivateKey(caDir)
702+
priv, _ := csp.LoadPrivateKey(caDir)
702703
cert, _ := ca.LoadCertificateECDSA(caDir)
703704

704705
return &ca.CA{
705706
Name: name,
706-
Signer: signer,
707+
Signer: priv,
707708
SignCert: cert,
708709
Country: spec.CA.Country,
709710
Province: spec.CA.Province,

internal/cryptogen/ca/generator.go renamed to internal/cryptogen/ca/ca.go

Lines changed: 123 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ package ca
88
import (
99
"crypto"
1010
"crypto/ecdsa"
11+
"crypto/elliptic"
1112
"crypto/rand"
13+
"crypto/sha256"
1214
"crypto/x509"
1315
"crypto/x509/pkix"
1416
"encoding/pem"
@@ -20,7 +22,6 @@ import (
2022
"strings"
2123
"time"
2224

23-
"github.com/hyperledger/fabric/bccsp/utils"
2425
"github.com/hyperledger/fabric/internal/cryptogen/csp"
2526
"github.com/pkg/errors"
2627
)
@@ -33,96 +34,131 @@ type CA struct {
3334
OrganizationalUnit string
3435
StreetAddress string
3536
PostalCode string
36-
//SignKey *ecdsa.PrivateKey
37-
Signer crypto.Signer
38-
SignCert *x509.Certificate
37+
Signer crypto.Signer
38+
SignCert *x509.Certificate
3939
}
4040

4141
// NewCA creates an instance of CA and saves the signing key pair in
4242
// baseDir/name
43-
func NewCA(baseDir, org, name, country, province, locality, orgUnit, streetAddress, postalCode string) (*CA, error) {
43+
func NewCA(
44+
baseDir,
45+
org,
46+
name,
47+
country,
48+
province,
49+
locality,
50+
orgUnit,
51+
streetAddress,
52+
postalCode string,
53+
) (*CA, error) {
4454

45-
var response error
4655
var ca *CA
4756

4857
err := os.MkdirAll(baseDir, 0755)
49-
if err == nil {
50-
priv, signer, err := csp.GeneratePrivateKey(baseDir)
51-
response = err
52-
if err == nil {
53-
// get public signing certificate
54-
ecPubKey, err := csp.GetECPublicKey(priv)
55-
response = err
56-
if err == nil {
57-
template := x509Template()
58-
//this is a CA
59-
template.IsCA = true
60-
template.KeyUsage |= x509.KeyUsageDigitalSignature |
61-
x509.KeyUsageKeyEncipherment | x509.KeyUsageCertSign |
62-
x509.KeyUsageCRLSign
63-
template.ExtKeyUsage = []x509.ExtKeyUsage{
64-
x509.ExtKeyUsageClientAuth,
65-
x509.ExtKeyUsageServerAuth,
66-
}
67-
68-
//set the organization for the subject
69-
subject := subjectTemplateAdditional(country, province, locality, orgUnit, streetAddress, postalCode)
70-
subject.Organization = []string{org}
71-
subject.CommonName = name
72-
73-
template.Subject = subject
74-
template.SubjectKeyId = priv.SKI()
75-
76-
x509Cert, err := genCertificateECDSA(baseDir, name, &template, &template,
77-
ecPubKey, signer)
78-
response = err
79-
if err == nil {
80-
ca = &CA{
81-
Name: name,
82-
Signer: signer,
83-
SignCert: x509Cert,
84-
Country: country,
85-
Province: province,
86-
Locality: locality,
87-
OrganizationalUnit: orgUnit,
88-
StreetAddress: streetAddress,
89-
PostalCode: postalCode,
90-
}
91-
}
92-
}
93-
}
58+
if err != nil {
59+
return nil, err
60+
}
61+
62+
priv, err := csp.GeneratePrivateKey(baseDir)
63+
if err != nil {
64+
return nil, err
65+
}
66+
67+
template := x509Template()
68+
//this is a CA
69+
template.IsCA = true
70+
template.KeyUsage |= x509.KeyUsageDigitalSignature |
71+
x509.KeyUsageKeyEncipherment | x509.KeyUsageCertSign |
72+
x509.KeyUsageCRLSign
73+
template.ExtKeyUsage = []x509.ExtKeyUsage{
74+
x509.ExtKeyUsageClientAuth,
75+
x509.ExtKeyUsageServerAuth,
76+
}
77+
78+
//set the organization for the subject
79+
subject := subjectTemplateAdditional(country, province, locality, orgUnit, streetAddress, postalCode)
80+
subject.Organization = []string{org}
81+
subject.CommonName = name
82+
83+
template.Subject = subject
84+
template.SubjectKeyId = computeSKI(priv)
85+
86+
x509Cert, err := genCertificateECDSA(
87+
baseDir,
88+
name,
89+
&template,
90+
&template,
91+
&priv.PublicKey,
92+
priv,
93+
)
94+
if err != nil {
95+
return nil, err
96+
}
97+
ca = &CA{
98+
Name: name,
99+
Signer: &csp.ECDSASigner{
100+
PrivateKey: priv,
101+
},
102+
SignCert: x509Cert,
103+
Country: country,
104+
Province: province,
105+
Locality: locality,
106+
OrganizationalUnit: orgUnit,
107+
StreetAddress: streetAddress,
108+
PostalCode: postalCode,
94109
}
95-
return ca, response
110+
111+
return ca, err
96112
}
97113

98114
// SignCertificate creates a signed certificate based on a built-in template
99115
// and saves it in baseDir/name
100-
func (ca *CA) SignCertificate(baseDir, name string, ous, sans []string, pub *ecdsa.PublicKey,
101-
ku x509.KeyUsage, eku []x509.ExtKeyUsage) (*x509.Certificate, error) {
116+
func (ca *CA) SignCertificate(
117+
baseDir,
118+
name string,
119+
orgUnits,
120+
alternateNames []string,
121+
pub *ecdsa.PublicKey,
122+
ku x509.KeyUsage,
123+
eku []x509.ExtKeyUsage,
124+
) (*x509.Certificate, error) {
102125

103126
template := x509Template()
104127
template.KeyUsage = ku
105128
template.ExtKeyUsage = eku
106129

107130
//set the organization for the subject
108-
subject := subjectTemplateAdditional(ca.Country, ca.Province, ca.Locality, ca.OrganizationalUnit, ca.StreetAddress, ca.PostalCode)
131+
subject := subjectTemplateAdditional(
132+
ca.Country,
133+
ca.Province,
134+
ca.Locality,
135+
ca.OrganizationalUnit,
136+
ca.StreetAddress,
137+
ca.PostalCode,
138+
)
109139
subject.CommonName = name
110140

111-
subject.OrganizationalUnit = append(subject.OrganizationalUnit, ous...)
141+
subject.OrganizationalUnit = append(subject.OrganizationalUnit, orgUnits...)
112142

113143
template.Subject = subject
114-
for _, san := range sans {
144+
for _, san := range alternateNames {
115145
// try to parse as an IP address first
116146
ip := net.ParseIP(san)
117147
if ip != nil {
118148
template.IPAddresses = append(template.IPAddresses, ip)
119149
} else {
120-
template.DNSNames = append(template.DNSNames, san)
150+
template.DNSNames = append(template.DNSNames, alternateNames...)
121151
}
122152
}
123153

124-
cert, err := genCertificateECDSA(baseDir, name, &template, ca.SignCert,
125-
pub, ca.Signer)
154+
cert, err := genCertificateECDSA(
155+
baseDir,
156+
name,
157+
&template,
158+
ca.SignCert,
159+
pub,
160+
ca.Signer,
161+
)
126162

127163
if err != nil {
128164
return nil, err
@@ -131,6 +167,16 @@ func (ca *CA) SignCertificate(baseDir, name string, ous, sans []string, pub *ecd
131167
return cert, nil
132168
}
133169

170+
// compute Subject Key Identifier
171+
func computeSKI(privKey *ecdsa.PrivateKey) []byte {
172+
// Marshall the public key
173+
raw := elliptic.Marshal(privKey.Curve, privKey.PublicKey.X, privKey.PublicKey.Y)
174+
175+
// Hash it
176+
hash := sha256.Sum256(raw)
177+
return hash[:]
178+
}
179+
134180
// default template for X509 subject
135181
func subjectTemplate() pkix.Name {
136182
return pkix.Name{
@@ -141,7 +187,14 @@ func subjectTemplate() pkix.Name {
141187
}
142188

143189
// Additional for X509 subject
144-
func subjectTemplateAdditional(country, province, locality, orgUnit, streetAddress, postalCode string) pkix.Name {
190+
func subjectTemplateAdditional(
191+
country,
192+
province,
193+
locality,
194+
orgUnit,
195+
streetAddress,
196+
postalCode string,
197+
) pkix.Name {
145198
name := subjectTemplate()
146199
if len(country) >= 1 {
147200
name.Country = []string{country}
@@ -189,8 +242,14 @@ func x509Template() x509.Certificate {
189242
}
190243

191244
// generate a signed X509 certificate using ECDSA
192-
func genCertificateECDSA(baseDir, name string, template, parent *x509.Certificate, pub *ecdsa.PublicKey,
193-
priv interface{}) (*x509.Certificate, error) {
245+
func genCertificateECDSA(
246+
baseDir,
247+
name string,
248+
template,
249+
parent *x509.Certificate,
250+
pub *ecdsa.PublicKey,
251+
priv interface{},
252+
) (*x509.Certificate, error) {
194253

195254
//create the x509 public cert
196255
certBytes, err := x509.CreateCertificate(rand.Reader, template, parent, pub, priv)
@@ -233,7 +292,7 @@ func LoadCertificateECDSA(certPath string) (*x509.Certificate, error) {
233292
if block == nil || block.Type != "CERTIFICATE" {
234293
return errors.Errorf("%s: wrong PEM encoding", path)
235294
}
236-
cert, err = utils.DERToX509Certificate(block.Bytes)
295+
cert, err = x509.ParseCertificate(block.Bytes)
237296
if err != nil {
238297
return errors.Errorf("%s: wrong DER encoding", path)
239298
}

0 commit comments

Comments
 (0)