// ParseCertificate parses a single certificate from the given ASN.1 DER data. func ParseCertificate(asn1Data []byte) (*Certificate, error) { var ( c *C.X509 dlen = C.long(len(asn1Data)) buf = (*C.uchar)(&asn1Data[0]) counter = C.long(0) ) c = C.d2i_X509_with_counter(&buf, dlen, &counter) if c == nil { return nil, errors.New("error parsing der data: " + sslerr.SSLErrorMessage().String()) } cert, err := getCertificate(asn1Data[:counter], c) if err != nil { return nil, err } return cert, nil }
// ParseCertificates parses one or more certificates from the given ASN.1 DER // data. The certificates must be concatenated with no intermediate padding. func ParseCertificates(asn1Data []byte) ([]*Certificate, error) { var ( cs []*Certificate dlen = C.long(len(asn1Data)) buf = (*C.uchar)(&asn1Data[0]) counter = C.long(0) prev int ) for counter < dlen { c := C.d2i_X509_with_counter(&buf, dlen, &counter) if c == nil { return nil, errors.New("error parsing der data: " + sslerr.SSLErrorMessage().String()) } cert, err := getCertificate(asn1Data[prev:counter], c) if err != nil { return nil, err } cs = append(cs, cert) prev = int(counter) } return cs, nil }