# Certificate Transparency: Go Code [![Build Status](https://travis-ci.org/google/certificate-transparency-go.svg?branch=master)](https://travis-ci.org/google/certificate-transparency-go) [![Go Report Card](https://goreportcard.com/badge/github.com/google/certificate-transparency-go)](https://goreportcard.com/report/github.com/google/certificate-transparency-go) [![GoDoc](https://godoc.org/github.com/google/certificate-transparency-go?status.svg)](https://godoc.org/github.com/google/certificate-transparency-go) This repository holds Go code related to [Certificate Transparency](https://www.certificate-transparency.org/) (CT). The repository requires Go version 1.9. - [Repository Structure](#repository-structure) - [Trillian CT Personality](#trillian-ct-personality) - [Working on the Code](#working-on-the-code) - [Rebuilding Generated Code](#rebuilding-generated-code) - [Updating Vendor Code](#updating-vendor-code) - [Running Codebase Checks](#running-codebase-checks) ## Repository Structure The main parts of the repository are: - Encoding libraries: - `asn1/` and `x509/` are forks of the upstream Go `encoding/asn1` and `crypto/x509` libraries. We maintain separate forks of these packages because CT is intended to act as an observatory of certificates across the ecosystem; as such, we need to be able to process somewhat-malformed certificates that the stricter upstream code would (correctly) reject. Our `x509` fork also includes code for working with the [pre-certificates defined in RFC 6962](https://tools.ietf.org/html/rfc6962#section-3.1). - `tls` holds a library for processing TLS-encoded data as described in [RFC 5246](https://tools.ietf.org/html/rfc5246). - `x509util` provides additional utilities for dealing with `x509.Certificate`s. - CT client libraries: - The top-level `ct` package (in `.`) holds types and utilities for working with CT data structures defined in [RFC 6962](https://tools.ietf.org/html/rfc6962). - `client/` and `jsonclient/` hold libraries that allow access to CT Logs via entrypoints described in [section 4 of RFC 6962](https://tools.ietf.org/html/rfc6962#section-4). - `scanner/` holds a library for scanning the entire contents of an existing CT Log. - Command line tools: - `./client/ctclient` allows interaction with a CT Log - `./scanner/scanlog` allows an existing CT Log to be scanned for certificates of interest; please be polite when running this tool against a Log. - `./x509util/certcheck` allows display and verification of certificates - `./x509util/crlcheck` allows display and verification of certificate revocation lists (CRLs). - CT Personality for [Trillian](https://github.com/google/trillian): - `trillian/` holds code that allows a Certificate Transparency Log to be run using a Trillian Log as its back-end -- see [below](#trillian-ct-personality). ## Trillian CT Personality The `trillian/` subdirectory holds code and scripts for running a CT Log based on the [Trillian](https://github.com/google/trillian) general transparency Log. The main code for the CT personality is held in `trillian/ctfe`; this code responds to HTTP requests on the [CT API paths](https://tools.ietf.org/html/rfc6962#section-4) and translates them to the equivalent gRPC API requests to the Trillian Log. This obviously relies on the gRPC API definitions at `github.com/google/trillian`; the code also uses common libraries from the Trillian project for: - exposing monitoring and statistics via an `interface` and corresponding Prometheus implementation (`github.com/google/trillian/monitoring/...`) - dealing with cryptographic keys (`github.com/google/trillian/crypto/...`). The `trillian/integration/` directory holds scripts and tests for running the whole system locally. In particular: - `trillian/integration/ct_integration_test.sh` brings up local processes running a Trillian Log server, signer and a CT personality, and exercises the complete set of RFC 6962 API entrypoints. - `trillian/integration/ct_hammer_test.sh` brings up a complete system and runs a continuous randomized test of the CT entrypoints. These scripts require a local database instance to be configured as described in the [Trillian instructions](https://github.com/google/trillian#mysql-setup). ## Working on the Code Developers who want to make changes to the codebase need some additional dependencies and tools, described in the following sections. The [Travis configuration](.travis.yml) for the codebase is also useful reference for the required tools and scripts, as it may be more up-to-date than this document. ### Rebuilding Generated Code Some of the CT Go code is autogenerated from other files: - [Protocol buffer](https://developers.google.com/protocol-buffers/) message definitions are converted to `.pb.go` implementations. - A mock implementation of the Trillian gRPC API (in `trillian/mockclient`) is created with [GoMock](https://github.com/golang/mock). Re-generating mock or protobuffer files is only needed if you're changing the original files; if you do, you'll need to install the prerequisites: - `mockgen` tool from https://github.com/golang/mock - `protoc`, [Go support for protoc](https://github.com/golang/protobuf) (see documentation linked from the [protobuf site](https://github.com/google/protobuf)) and run the following: ```bash go generate -x ./... # hunts for //go:generate comments and runs them ``` ### Updating Vendor Code The codebase includes a couple of external projects under the `vendor/` subdirectory, to ensure that builds use a fixed version (typically because the upstream repository does not guarantee back-compatibility between the tip `master` branch and the current stable release). See [instructions in the Trillian repo](https://github.com/google/trillian#updating-vendor-code) for how to update vendored subtrees. ### Running Codebase Checks The [`scripts/presubmit.sh`](scripts/presubmit.sh) script runs various tools and tests over the codebase. ```bash # Install gometalinter and all linters go get -u github.com/alecthomas/gometalinter gometalinter --install # Run code generation, build, test and linters ./scripts/presubmit.sh # Run build, test and linters but skip code generation ./scripts/presubmit.sh --no-generate # Or just run the linters alone: gometalinter --config=gometalinter.json ./... ```