Skip to content

Commit f0549e3

Browse files
authored
Merge pull request #1312 from kongweiguo/add-csr-der
2 parents 707f415 + 6619c79 commit f0549e3

File tree

3 files changed

+83
-2
lines changed

3 files changed

+83
-2
lines changed

csr/csr.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,9 +408,9 @@ func Regenerate(priv crypto.Signer, csr []byte) ([]byte, error) {
408408
return x509.CreateCertificateRequest(rand.Reader, req, priv)
409409
}
410410

411-
// Generate creates a new CSR from a CertificateRequest structure and
411+
// GenerateDER creates a new CSR(ASN1 DER encoded) from a CertificateRequest structure and
412412
// an existing key. The KeyRequest field is ignored.
413-
func Generate(priv crypto.Signer, req *CertificateRequest) (csr []byte, err error) {
413+
func GenerateDER(priv crypto.Signer, req *CertificateRequest) (csr []byte, err error) {
414414
sigAlgo := helpers.SignerAlgo(priv)
415415
if sigAlgo == x509.UnknownSignatureAlgorithm {
416416
return nil, cferr.New(cferr.PrivateKeyError, cferr.Unavailable)
@@ -466,6 +466,17 @@ func Generate(priv crypto.Signer, req *CertificateRequest) (csr []byte, err erro
466466
err = cferr.Wrap(cferr.CSRError, cferr.BadRequest, err)
467467
return
468468
}
469+
return
470+
}
471+
472+
// Generate creates a new CSR(PEM encoded) from a CertificateRequest structure and
473+
// an existing key. The KeyRequest field is ignored.
474+
func Generate(priv crypto.Signer, req *CertificateRequest) (csr []byte, err error) {
475+
476+
csr, err = GenerateDER(priv, req)
477+
if err != nil {
478+
return
479+
}
469480
block := pem.Block{
470481
Type: "CERTIFICATE REQUEST",
471482
Bytes: csr,

csr/csr_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,59 @@ func TestGenerate(t *testing.T) {
705705
}
706706
}
707707

708+
func TestGenerateASN1(t *testing.T) {
709+
var req = &CertificateRequest{
710+
Names: []Name{
711+
{
712+
C: "US",
713+
ST: "California",
714+
L: "San Francisco",
715+
O: "CloudFlare",
716+
OU: "Systems Engineering",
717+
},
718+
},
719+
CN: "cloudflare.com",
720+
Hosts: []string{"cloudflare.com", "www.cloudflare.com", "192.168.0.1", "jdoe@example.com", "https://www.cloudflare.com"},
721+
KeyRequest: &KeyRequest{"ecdsa", 256},
722+
}
723+
724+
key, err := req.KeyRequest.Generate()
725+
if err != nil {
726+
t.Fatalf("%v", err)
727+
}
728+
729+
priv, ok := key.(crypto.Signer)
730+
if !ok {
731+
t.Fatal("Private key is not a signer.")
732+
}
733+
734+
csrDER, err := GenerateDER(priv, req)
735+
if err != nil {
736+
t.Fatalf("%v", err)
737+
}
738+
739+
csr, err := helpers.ParseCSRDER(csrDER)
740+
if err != nil {
741+
t.Fatalf("%v", err)
742+
}
743+
744+
if len(csr.DNSNames) != 2 {
745+
t.Fatal("SAN parsing error")
746+
}
747+
748+
if len(csr.IPAddresses) != 1 {
749+
t.Fatal("SAN parsing error")
750+
}
751+
752+
if len(csr.EmailAddresses) != 1 {
753+
t.Fatal("SAN parsing error")
754+
}
755+
756+
if len(csr.URIs) != 1 {
757+
t.Fatal("SAN parsing error")
758+
}
759+
}
760+
708761
// TestReGenerate ensures Regenerate() is abel to use the provided CSR as a template for signing a new
709762
// CSR using priv.
710763
func TestReGenerate(t *testing.T) {

helpers/helpers.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,23 @@ func ParseCSRPEM(csrPEM []byte) (*x509.CertificateRequest, error) {
457457
return csrObject, nil
458458
}
459459

460+
// ParseCSRDER parses a PEM-encoded certificate signing request.
461+
// It does not check the signature. This is useful for dumping data from a CSR
462+
// locally.
463+
func ParseCSRDER(csrDER []byte) (*x509.CertificateRequest, error) {
464+
csrObject, err := x509.ParseCertificateRequest(csrDER)
465+
if err != nil {
466+
return nil, err
467+
}
468+
469+
err = csrObject.CheckSignature()
470+
if err != nil {
471+
return nil, err
472+
}
473+
474+
return csrObject, nil
475+
}
476+
460477
// SignerAlgo returns an X.509 signature algorithm from a crypto.Signer.
461478
func SignerAlgo(priv crypto.Signer) x509.SignatureAlgorithm {
462479
switch pub := priv.Public().(type) {

0 commit comments

Comments
 (0)