github.com/mundipagg/boleto-api@v0.0.0-20230620145841-3f9ec742599f/certificate/certificateTypes.go (about)

     1  package certificate
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/rsa"
     6  	"crypto/x509"
     7  	"encoding/pem"
     8  
     9  	pkcs122 "software.sslmate.com/src/go-pkcs12"
    10  )
    11  
    12  const (
    13  	icp = "ICP"
    14  	ssl = "SSL"
    15  )
    16  
    17  type TLSCertificate struct {
    18  	Crt string
    19  	Key string
    20  }
    21  
    22  type ICPCertificate struct {
    23  	Name          string
    24  	RsaPrivateKey interface{}
    25  	Certificate   *x509.Certificate
    26  }
    27  
    28  func GetICPCertificate(name string, pfxBytes []byte, pass string) (ICPCertificate, error) {
    29  	rsaPrivateKey, certificate, _, err := pkcs122.DecodeChain(pfxBytes, pass)
    30  	if err != nil {
    31  		return ICPCertificate{}, err
    32  	}
    33  
    34  	iCPCertificate := new(ICPCertificate)
    35  	iCPCertificate.Name = name
    36  	iCPCertificate.RsaPrivateKey = rsaPrivateKey
    37  	iCPCertificate.Certificate = certificate
    38  
    39  	return *iCPCertificate, nil
    40  }
    41  
    42  type SSLCertificate struct {
    43  	Name    string
    44  	PemData []byte
    45  }
    46  
    47  func GetSSLCertificate(name string, pfxBytes []byte, pass string) (SSLCertificate, error) {
    48  	pemData, err := localToPEM(pfxBytes, pass)
    49  	if err != nil {
    50  		return SSLCertificate{}, err
    51  	}
    52  
    53  	sslCertificate := new(SSLCertificate)
    54  	sslCertificate.Name = name
    55  	sslCertificate.PemData = pemData
    56  
    57  	return *sslCertificate, nil
    58  }
    59  
    60  func localToPEM(pfxBytes []byte, pass string) ([]byte, error) {
    61  	privateKey, certificate, caChain, err := pkcs122.DecodeChain(pfxBytes, pass)
    62  
    63  	if err != nil {
    64  		return nil, err
    65  	}
    66  
    67  	var pemBytes bytes.Buffer
    68  	err = pem.Encode(&pemBytes, &pem.Block{Type: "PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey.(*rsa.PrivateKey))})
    69  	if err != nil {
    70  		return nil, err
    71  	}
    72  
    73  	err = pem.Encode(&pemBytes, &pem.Block{Type: "CERTIFICATE", Bytes: certificate.Raw})
    74  	if err != nil {
    75  		return nil, err
    76  	}
    77  
    78  	for _, certChain := range caChain {
    79  		if err := pem.Encode(&pemBytes, &pem.Block{Type: "CERTIFICATE", Bytes: certChain.Raw}); err != nil {
    80  			return nil, err
    81  		}
    82  	}
    83  
    84  	return pemBytes.Bytes(), nil
    85  }