Compare commits

...

2 Commits

Author SHA1 Message Date
b1a2039c7d Update CHANGELOG for v1.15.6. 2025-11-19 09:46:09 -08:00
46c9976e73 certlib: Add file kind functionality. 2025-11-19 09:45:57 -08:00
2 changed files with 76 additions and 0 deletions

View File

@@ -1,5 +1,8 @@
CHANGELOG
v1.15.6 - 2025-11-19
certlib: add FileKind function to determine file type.
v1.15.5 - 2025-11-19
certlib/bundler: add support for crt files that are pem-encoded.

View File

@@ -8,6 +8,7 @@ import (
"errors"
"fmt"
"os"
"strings"
"git.wntrmute.dev/kyle/goutils/certlib/certerr"
)
@@ -135,3 +136,75 @@ func LoadCSR(path string) (*x509.CertificateRequest, error) {
func ExportCSRAsPEM(req *x509.CertificateRequest) []byte {
return pem.EncodeToMemory(&pem.Block{Type: pemTypeCertificateRequest, Bytes: req.Raw})
}
type FileFormat uint8
const (
FormatPEM FileFormat = iota + 1
FormatDER
)
func (f FileFormat) String() string {
switch f {
case FormatPEM:
return "PEM"
case FormatDER:
return "DER"
default:
return "unknown"
}
}
type FileType struct {
Format FileFormat
Type string
}
func (ft FileType) String() string {
if ft.Type == "" {
return ft.Format.String()
}
return fmt.Sprintf("%s (%s)", ft.Type, ft.Format)
}
// FileKind returns the file type of the given file.
func FileKind(path string) (*FileType, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, err
}
block, _ := pem.Decode(data)
if block != nil {
return &FileType{
Format: FormatPEM,
Type: strings.ToLower(strings.TrimSpace(block.Type)),
}, nil
}
_, err = x509.ParseCertificate(data)
if err == nil {
return &FileType{
Format: FormatDER,
Type: strings.ToLower(pemTypeCertificate),
}, nil
}
_, err = x509.ParseCertificateRequest(data)
if err == nil {
return &FileType{
Format: FormatDER,
Type: strings.ToLower(pemTypeCertificateRequest),
}, nil
}
_, err = x509.ParsePKCS8PrivateKey(data)
if err == nil {
return &FileType{
Format: FormatDER,
Type: strings.ToLower(pemTypePrivateKey),
}, nil
}
return nil, errors.New("certlib; unknown file type")
}