diff options
-rw-r--r-- | .type.go.swp | bin | 16384 -> 0 bytes | |||
-rw-r--r-- | client/add-entry/main.go | 31 | ||||
-rw-r--r-- | x509.go | 31 |
3 files changed, 33 insertions, 29 deletions
diff --git a/.type.go.swp b/.type.go.swp Binary files differdeleted file mode 100644 index 9599d98..0000000 --- a/.type.go.swp +++ /dev/null diff --git a/client/add-entry/main.go b/client/add-entry/main.go index 56e0ec4..9047529 100644 --- a/client/add-entry/main.go +++ b/client/add-entry/main.go @@ -5,10 +5,8 @@ import ( "flag" "fmt" - "crypto/x509" "encoding/base64" "encoding/json" - "encoding/pem" "io/ioutil" "net/http" @@ -62,11 +60,7 @@ func params() ([]byte, []byte, error) { } func setup() (*client.Client, error) { - blob, err := ioutil.ReadFile(*chain) - if err != nil { - return nil, fmt.Errorf("failed reading certificate chain: %v", err) - } - c, err := parseChain(blob) + c, err := stfe.LoadChain(*chain) if err != nil { return nil, fmt.Errorf("failed loading certificate chain: %v", err) } @@ -76,7 +70,7 @@ func setup() (*client.Client, error) { return nil, fmt.Errorf("failed loading key: %v", err) } - blob, err = ioutil.ReadFile(*operators) + blob, err := ioutil.ReadFile(*operators) if err != nil { return nil, fmt.Errorf("failed reading log operators: %v", err) } @@ -96,24 +90,3 @@ func setup() (*client.Client, error) { } return client.NewClient(log, &http.Client{}, c, &k), nil } - -func parseChain(rest []byte) ([]*x509.Certificate, error) { - var chain []*x509.Certificate - for len(rest) > 0 { - var block *pem.Block - block, rest = pem.Decode(rest) - if block == nil { - break - } - if block.Type != "CERTIFICATE" { - return nil, fmt.Errorf("unexpected pem block type: %v", block.Type) - } - - certificate, err := x509.ParseCertificate(block.Bytes) - if err != nil { - return nil, fmt.Errorf("failed parsing x509 certificate: %v", err) - } - chain = append(chain, certificate) - } - return chain, nil -} @@ -104,6 +104,37 @@ func GenV1STH(ld *LogParameters, th *TreeHeadV1) (*StItem, error) { return NewSignedTreeHeadV1(th, ld.LogId, sig), nil } +// LoadChain loads a PEM-encoded certificate chain from a given path +func LoadChain(path string) ([]*x509.Certificate, error) { + blob, err := ioutil.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("failed reading certificate chain: %v", err) + } + return ParseChain(blob) +} + +// ParseChain parses a PEM-encoded certificate chain +func ParseChain(rest []byte) ([]*x509.Certificate, error) { + var chain []*x509.Certificate + for len(rest) > 0 { + var block *pem.Block + block, rest = pem.Decode(rest) + if block == nil { + break + } + if block.Type != "CERTIFICATE" { + return nil, fmt.Errorf("unexpected pem block type: %v", block.Type) + } + + certificate, err := x509.ParseCertificate(block.Bytes) + if err != nil { + return nil, fmt.Errorf("failed parsing x509 certificate: %v", err) + } + chain = append(chain, certificate) + } + return chain, nil +} + // ParseB64Chain parses a list of base64 DER-encoded X.509 certificates, such // that the first (zero-index) string is interpretted as an end-entity // certificate and the remaining ones as the an intermediate CertPool. |