cloudflare/cfssl_trust

Public

mirrored fromhttps://github.com/cloudflare/cfssl_trustAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
trust-store-2026.1.2

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

info/info.go

135lines · modecode

1package info
2
3import (
4 "crypto/x509"
5 "database/sql"
6 "fmt"
7 "io"
8 "math/big"
9 "os"
10 "time"
11
12 "github.com/cloudflare/cfssl_trust/common"
13 "github.com/cloudflare/cfssl_trust/model/certdb"
14)
15
16func writeBasicInformation(w io.Writer, cert *x509.Certificate) error {
17 _, err := fmt.Fprintf(w, `Subject: %s
18Issuer: %s
19 Not Before: %s
20 Not After: %s
21`, common.NameToString(cert.Subject),
22 common.NameToString(cert.Issuer),
23 cert.NotBefore.UTC().Format(common.DateFormat),
24 cert.NotAfter.UTC().Format(common.DateFormat),
25 )
26 return err
27}
28
29func writeCertificateReleases(w io.Writer, tx *sql.Tx, cert *certdb.Certificate) error {
30 releases, err := cert.Releases(tx)
31 if err != nil {
32 return err
33 }
34
35 _, err = fmt.Fprintf(w, "Releases:\n")
36 if err != nil {
37 return err
38 }
39
40 for _, rel := range releases {
41 _, err = fmt.Fprintf(w, "\t- %s %s (%s)\n",
42 rel.Version, rel.Bundle,
43 time.Unix(rel.ReleasedAt, 0).UTC().Format(common.DateFormat))
44 if err != nil {
45 break
46 }
47 }
48
49 return err
50}
51
52// WriteCertificateInformation pretty prints details about the given certificate
53// to the given io.Writer.
54func WriteCertificateInformation(w io.Writer, db *sql.DB, cert *certdb.Certificate) error {
55 tx, err := db.Begin()
56 if err != nil {
57 fmt.Fprintf(os.Stderr, "[!] %s\n", err)
58 os.Exit(1)
59 }
60 defer certdb.Finalize(&err, tx)
61
62 err = writeBasicInformation(w, cert.X509())
63 if err != nil {
64 return err
65 }
66
67 err = writeCertificateReleases(w, tx, cert)
68 if err != nil {
69 return err
70 }
71
72 return nil
73}
74
75// CertificateMetadata pairs the AKI, SKI, and Serial Number with
76// string versions of the subject and issuer fields.
77type CertificateMetadata struct {
78 SKI, AKI string
79 Serial *big.Int
80 Subject string
81 Issuer string
82 Releases []*certdb.Release
83 cert *certdb.Certificate
84}
85
86// LoadCertificateMetadata returns the metadata for a given certificate.
87func LoadCertificateMetadata(tx *sql.Tx, cert *certdb.Certificate) (*CertificateMetadata, error) {
88 x509Cert := cert.X509()
89 cm := &CertificateMetadata{
90 SKI: cert.SKI,
91 AKI: cert.AKI,
92 Serial: x509Cert.SerialNumber,
93 Subject: common.NameToString(x509Cert.Subject),
94 Issuer: common.NameToString(x509Cert.Issuer),
95 cert: cert,
96 }
97
98 var err error
99 cm.Releases, err = cert.Releases(tx)
100 return cm, err
101}
102
103// WriteCertificateMetadata pretty prints the certificate metadata to
104// the given io.Writer.
105func WriteCertificateMetadata(w io.Writer, cert *CertificateMetadata) error {
106 x509Cert := cert.cert.X509()
107 _, err := fmt.Fprintf(w, `Subject: %s
108Issuer: %s
109 Not Before: %s
110 Not After: %s
111`, (cert.Subject),
112 (cert.Issuer),
113 x509Cert.NotBefore.UTC().Format(common.DateFormat),
114 x509Cert.NotAfter.UTC().Format(common.DateFormat),
115 )
116 if err != nil {
117 return err
118 }
119
120 _, err = fmt.Fprintf(w, "\tReleases:\n")
121 if err != nil {
122 return err
123 }
124
125 for _, rel := range cert.Releases {
126 _, err = fmt.Fprintf(w, "\t\t- %s %s (%s)\n",
127 rel.Version, rel.Bundle,
128 time.Unix(rel.ReleasedAt, 0).UTC().Format(common.DateFormat))
129 if err != nil {
130 break
131 }
132 }
133
134 return err
135}
136