github.com/brimstone/sbuca@v0.0.0-20151202175429-8691d9eba5c5/pkix/csr.go (about)

     1  package pkix
     2  
     3  import (
     4  	"crypto/rand"
     5  	"crypto/x509"
     6  	"encoding/pem"
     7  	"errors"
     8  	"io/ioutil"
     9  )
    10  
    11  type CertificateRequest struct {
    12  	DerBytes []byte
    13  
    14  	Csr *x509.CertificateRequest
    15  }
    16  
    17  func NewCertificateRequest(key *Key) (*CertificateRequest, error) {
    18  	template := &x509.CertificateRequest{
    19  		Subject: GenSubject(""), //FIXME
    20  		//Attributes:
    21  		//SignatureAlgorithm,
    22  		//Extensions:
    23  		DNSNames: []string{},
    24  		//EmailAddress:
    25  		//IPAddresses:
    26  	}
    27  
    28  	derBytes, err := x509.CreateCertificateRequest(rand.Reader, template, key.PrivateKey)
    29  	if err != nil {
    30  		return nil, err
    31  	}
    32  	csr, err := NewCertificateRequestFromDER(derBytes)
    33  	if err != nil {
    34  		return nil, err
    35  	}
    36  
    37  	return csr, nil
    38  }
    39  
    40  func NewCertificateRequestFromDER(derBytes []byte) (*CertificateRequest, error) {
    41  
    42  	csr, err := x509.ParseCertificateRequest(derBytes)
    43  	if err != nil {
    44  		return nil, err
    45  	}
    46  
    47  	certificateRequest := &CertificateRequest{
    48  		DerBytes: derBytes,
    49  		Csr:      csr,
    50  	}
    51  
    52  	return certificateRequest, nil
    53  }
    54  func NewCertificateRequestFromPEM(pemBytes []byte) (*CertificateRequest, error) {
    55  
    56  	pemBlock, _ := pem.Decode(pemBytes)
    57  	if pemBlock == nil {
    58  		return nil, errors.New("PEM decode failed")
    59  	}
    60  
    61  	csr, err := x509.ParseCertificateRequest(pemBlock.Bytes)
    62  	if err != nil {
    63  		return nil, err
    64  	}
    65  
    66  	certificateRequest := &CertificateRequest{
    67  		DerBytes: pemBlock.Bytes,
    68  		Csr:      csr,
    69  	}
    70  
    71  	return certificateRequest, nil
    72  }
    73  func NewCertificateRequestFromPEMFile(filename string) (*CertificateRequest, error) {
    74  
    75  	data, err := ioutil.ReadFile(filename)
    76  	if err != nil {
    77  		return nil, err
    78  	}
    79  
    80  	return NewCertificateRequestFromPEM(data)
    81  }
    82  
    83  func (csr *CertificateRequest) ToPEM() ([]byte, error) {
    84  
    85  	pemBlock := &pem.Block{
    86  		Type:  "CERTIFICATE REQUEST",
    87  		Bytes: csr.DerBytes,
    88  	}
    89  
    90  	pemBytes := pem.EncodeToMemory(pemBlock)
    91  
    92  	return pemBytes, nil
    93  }