func DecodePEM()

in app/registry/pem.go [20:73]


func DecodePEM(buf []byte) (*PEMInfo, error) {
	var (
		block     *pem.Block
		caBlock   bytes.Buffer
		certBlock bytes.Buffer
		keyBlock  bytes.Buffer
		pemInfo   PEMInfo
	)

	for {
		block, buf = pem.Decode(buf)
		if block == nil {
			break
		}
		if block.Type == "CERTIFICATE" {
			x509Cert, err := x509.ParseCertificate(block.Bytes)
			if err != nil {
				return nil, fmt.Errorf("unable to parse pem block, %w", err)
			}

			if x509Cert.IsCA {
				if err := pem.Encode(&caBlock, block); err != nil {
					return nil, fmt.Errorf("unable to encode block, %w", err)
				}

				pemInfo.X509CaCACert = append(pemInfo.X509CaCACert, x509Cert)
			} else {
				if err := pem.Encode(&certBlock, block); err != nil {
					return nil, fmt.Errorf("unable to encode block, %w", err)
				}

				pemInfo.X509Cert = append(pemInfo.X509Cert, x509Cert)
			}
		} else {
			if err := pem.Encode(&keyBlock, block); err != nil {
				return nil, fmt.Errorf("unable to encode block, %w", err)
			}
		}
	}

	pemInfo.CACert = caBlock.String()
	pemInfo.Cert = certBlock.String()
	pemInfo.PrivateKey = keyBlock.String()

	if pemInfo.PrivateKey == "" {
		return nil, errors.New("no key found in PEM file")
	} else if pemInfo.CACert == "" {
		return nil, errors.New("no CA certs found in PEM file")
	} else if pemInfo.Cert == "" {
		return nil, errors.New("no cert found in PEM file")
	}

	return &pemInfo, nil
}