11package cert
22
33import (
4- "bytes"
54 "crypto/sha256"
65 "crypto/x509"
76 "encoding/asn1"
87 "encoding/hex"
98 "encoding/pem"
109 "errors"
1110 "log"
12- "strings"
1311 "time"
1412
1513 "go.mongodb.org/mongo-driver/bson"
@@ -52,8 +50,12 @@ func (c *ParsedCert) ToBson() (bson.M, error) {
5250 if c .Cert == nil {
5351 return nil , errors .New ("certificate is nil" )
5452 }
53+ rawCertPem := pem .EncodeToMemory (& pem.Block {Type : "CERTIFICATE" , Bytes : c .Cert .Raw })
54+ if rawCertPem == nil {
55+ return nil , errors .New ("error encoding certificate to PEM format" )
56+ }
5557 res := bson.M {
56- "pem" : c . Cert . Raw ,
58+ "pem" : rawCertPem ,
5759 "serial_number" : c .Cert .SerialNumber .String (),
5860 "sha256" : c .Sha256 (),
5961 "registers" : c .Registers ,
@@ -98,7 +100,8 @@ func (c *ParsedCert) UnmarshalBSON(data []byte) error {
98100 c .Position = raw ["position" ].(models.Position )
99101
100102 pemData := raw ["pem" ].([]byte )
101- p , _ := pem .Decode (pemData ) // ignore rest for now, maybe use it later
103+ // ignore rest as we expect only PEM data in the DB
104+ p , _ := pem .Decode (pemData )
102105 if p == nil {
103106 return errors .New ("error parsing certificate" )
104107 }
@@ -113,44 +116,29 @@ func (c *ParsedCert) CompanyId() string {
113116 return c .Cert .Subject .SerialNumber
114117}
115118
116- func ParseCert (data []byte ) (* ParsedCert , error ) {
117- data , err := FormatCertContent (data )
118- if err != nil {
119- return nil , err
120- }
121- p , _ := pem .Decode (data ) // ignore rest for now, maybe use it later
122- if p == nil {
123- return nil , errors .New ("error parsing certificate" )
124- }
125- x509Cert , err := x509 .ParseCertificate (p .Bytes )
126- if err != nil {
127- return nil , err
119+ func ParseCerts (data []byte ) ([]* ParsedCert , error ) {
120+ if len (data ) == 0 {
121+ return nil , errors .New ("no data provided" )
128122 }
129- var cert ParsedCert
130- cert .Cert = x509Cert
131- return & cert , nil
132- }
133-
134- func FormatCertContent (content []byte ) ([]byte , error ) {
135- certPrefix := "-----BEGIN CERTIFICATE-----"
136- certSuffix := "-----END CERTIFICATE-----"
137- pemLineLength := 64
138- contentString := string (content )
139- contentString = strings .Replace (contentString , certPrefix , "" , 1 )
140- contentString = strings .Replace (contentString , certSuffix , "" , 1 )
141- contentString = strings .ReplaceAll (contentString , "\n " , "" )
142- contentString = strings .ReplaceAll (contentString , " " , "" )
143- contentString = strings .ReplaceAll (contentString , "\r " , "" )
144- var buffer bytes.Buffer
145- buffer .WriteString (certPrefix )
146- buffer .WriteString ("\n " )
147- for i := 0 ; i < len (contentString ); i += pemLineLength {
148- end := min (i + pemLineLength , len (contentString ))
149- buffer .WriteString (contentString [i :end ])
150- buffer .WriteString ("\n " )
123+ certs := []* ParsedCert {}
124+ for {
125+ p , rest := pem .Decode (data )
126+ if p == nil {
127+ return nil , errors .New ("error parsing certificate" )
128+ }
129+ x509Cert , err := x509 .ParseCertificate (p .Bytes )
130+ if err != nil {
131+ return nil , err
132+ }
133+ var cert ParsedCert
134+ cert .Cert = x509Cert
135+ certs = append (certs , & cert )
136+ if len (rest ) == 0 {
137+ break
138+ }
139+ data = rest
151140 }
152- buffer .WriteString (certSuffix )
153- return buffer .Bytes (), nil
141+ return certs , nil
154142}
155143
156144func (c * ParsedCert ) OBScopes () ([]models.Scope , error ) {
0 commit comments