diff --git a/pemparser/consts.go b/pemparser/consts.go index 73ebbbc..2e63bb5 100644 --- a/pemparser/consts.go +++ b/pemparser/consts.go @@ -1,8 +1,9 @@ package pemparser const ( - RSAPrivateKeyPemType = "RSA PRIVATE KEY" - ECPrivateKeyPemType = "EC PRIVATE KEY" - CertificatePemType = "CERTIFICATE" - PublicKeyPemType = "PUBLIC KEY" + RSAPrivateKeyPemType = "RSA PRIVATE KEY" + ECPrivateKeyPemType = "EC PRIVATE KEY" + CertificatePemType = "CERTIFICATE" + CertificateRequestPemType = "CERTIFICATE REQUEST" + PublicKeyPemType = "PUBLIC KEY" ) diff --git a/pemparser/parser.go b/pemparser/parser.go index a3bfb64..8c42b55 100644 --- a/pemparser/parser.go +++ b/pemparser/parser.go @@ -23,6 +23,25 @@ func ForeachPemBlock(pemText []byte, f func(*pem.Block) error) error { return nil } +var ErrMultipleCertificateRequestBlocks = errors.New("Found more than one CERTIFICATE REQUEST block") + +func ParseCertificateRequest(pemText []byte) (req *x509.CertificateRequest, err error) { + ForeachPemBlock(pemText, func(block *pem.Block) error { + if block.Type != CertificateRequestPemType { + return nil + } + + if req != nil { + err = ErrMultipleCertificateRequestBlocks + return err + } + + req, err = x509.ParseCertificateRequest(block.Bytes) + return err + }) + return +} + func ParseCertificates(pemText []byte) ([]*x509.Certificate, error) { var certs []*x509.Certificate diff --git a/pemparser/parser_test.go b/pemparser/parser_test.go new file mode 100644 index 0000000..72feb33 --- /dev/null +++ b/pemparser/parser_test.go @@ -0,0 +1,42 @@ +package pemparser_test + +import ( + "testing" + + "github.com/IPA-CyberLab/kmgm/pemparser" +) + +const TestCSR = `-----BEGIN CERTIFICATE REQUEST----- +MIICmDCCAYACAQAwUzELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMSEwHwYD +VQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxETAPBgNVBAMMCGhvZ2VmdWdh +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0f7/xMDop3WNJAYuWFaJ +G5dcbzXRlWk4PHAtZjxQPCKP/lN0pHGyCFs58v4rg7OFba+5WFg9DznvzYukhE7Z +rIej/E4Xpl1LUQcaSm6IdzzBUUF6+rOuufLZMV1v1eaa3KIT96u+65k9+eM7CmkK +cke2dIQs7/OTz+viq/8dFZnSRWCyH0HPE61wF79VHJgAt6Cdi4muWgcBgxg+8nRv +vy0XO70Z2EYtD01ncsoNb+Xd9v6eXLsMBWbMzljN/5rKlybodwnXgMcz2RzQdeuY +PA4MYh5dwieZ23UaKB5IX2IvieCOz5KYT8hsS54HUXQX+DBPnj4uqwVMDAG+xbK8 +uwIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAJXCcsaRXvx1T+AdOvF5aFElJ9tn +00gK8gWf4uyOOypOv3XUzdmuk93m2zkuCTvdC1lyj7KogJR6oHe+Y4UhJBqISh1J ++8ZKSBlusicJftHhxR3s63Zy7cKHu57CdrLW8eYY+Wrt53s/EzN8Rv0s5kQTWtjI +2v7IFUJe81tf5NDW8f4vqcilqM4pA4IqzPJCoulXTlCMiJhhJGFP76YpDOfZX7eA +X/8dzdW3bJ6aBNkt+mMFIk32veY0NKaflVo57FauPyD6/9d1PajYXsTMXL4O/c5j +Lv7aCvdGIifcy7qV0Slxjg6YbDtai0MGogOvsxSFsSzUmwGnfDGb9Q9nhog= +-----END CERTIFICATE REQUEST----- +` + +func Test_ParseCertificateRequest(t *testing.T) { + req, err := pemparser.ParseCertificateRequest([]byte(TestCSR)) + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + + if req.Subject.CommonName != "hogefuga" { + t.Errorf("Unexpected CN: %s", req.Subject.CommonName) + } + + multipleCSRs := append([]byte(TestCSR), []byte(TestCSR)...) + req, err = pemparser.ParseCertificateRequest(multipleCSRs) + if err != pemparser.ErrMultipleCertificateRequestBlocks { + t.Errorf("Unexpected error: %v", err) + } +}