diff options
Diffstat (limited to 'cmd/sigsum_log_go')
| -rw-r--r-- | cmd/sigsum_log_go/.gitignore | 1 | ||||
| -rw-r--r-- | cmd/sigsum_log_go/README.md | 56 | ||||
| -rw-r--r-- | cmd/sigsum_log_go/main.go | 223 | 
3 files changed, 0 insertions, 280 deletions
| diff --git a/cmd/sigsum_log_go/.gitignore b/cmd/sigsum_log_go/.gitignore deleted file mode 100644 index 254defd..0000000 --- a/cmd/sigsum_log_go/.gitignore +++ /dev/null @@ -1 +0,0 @@ -server diff --git a/cmd/sigsum_log_go/README.md b/cmd/sigsum_log_go/README.md deleted file mode 100644 index 5c363f7..0000000 --- a/cmd/sigsum_log_go/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# Run Trillian + sigsum-log-go locally -Trillian uses a database.  So, we will need to set that up.  It is documented -[here](https://github.com/google/trillian#mysql-setup), and how to check that it -is setup properly -[here](https://github.com/google/certificate-transparency-go/blob/master/trillian/docs/ManualDeployment.md#data-storage). - -Other than the database we need Trillian log signer, Trillian log server, and -sigsum-log-go. sigsum-log-go has been tested with trillian v.1.3.13. -``` -$ go install github.com/google/trillian/cmd/trillian_log_signer@v1.3.13 -$ go install github.com/google/trillian/cmd/trillian_log_server@v1.3.13 -``` - -Start Trillian log signer: -``` -trillian_log_signer --logtostderr -v 9 --force_master --rpc_endpoint=localhost:6961 --http_endpoint=localhost:6964 --num_sequencers 1 --sequencer_interval 100ms --batch_size 100 -``` - -Start Trillian log server: -``` -trillian_log_server --logtostderr -v 9 --rpc_endpoint=localhost:6962 --http_endpoint=localhost:6963 -``` - -As described in more detail -[here](https://github.com/google/certificate-transparency-go/blob/master/trillian/docs/ManualDeployment.md#trillian-services), -we need to provision a Merkle tree once: -``` -$ go install github.com/google/trillian/cmd/createtree@v1.3.13 -$ createtree --admin_server localhost:6962 -<tree id> -``` - -Hang on to `<tree id>`.  Our sigsum-log-go instance will use it when talking to -the Trillian log server to specify which Merkle tree we are working against. - -(If you take a look in the `Trees` table you will see that the tree has been -provisioned.) - -We will also need a public key-pair for sigsum-log-go. -``` -$ go install git.sigsum.org/sigsum-log-go/cmd/tmp/keygen -$ ./keygen -sk: <sk> -vk: <vk> -``` - -Start sigsum-log-go: -``` -$ tree_id=<tree_id> -$ sk=<sk> -$ sigsum_log_go --logtostderr -v 9 --http_endpoint localhost:6965 --log_rpc_server localhost:6962 --trillian_id $tree_id --key $sk -``` - -Quick test: -- curl http://localhost:6965/sigsum/v0/get-tree-head-to-cosign -- try `submit` and `cosign` commands in `cmd/tmp` diff --git a/cmd/sigsum_log_go/main.go b/cmd/sigsum_log_go/main.go deleted file mode 100644 index c8e1692..0000000 --- a/cmd/sigsum_log_go/main.go +++ /dev/null @@ -1,223 +0,0 @@ -// Package main provides a sigsum-log-go binary -package main - -import ( -	"context" -	"crypto" -	"crypto/ed25519" -	"encoding/hex" -	"flag" -	"fmt" -	"io/ioutil" -	"net/http" -	"os" -	"os/signal" -	"strings" -	"sync" -	"syscall" -	"time" - -	"github.com/google/trillian" -	"github.com/prometheus/client_golang/prometheus/promhttp" -	"google.golang.org/grpc" - -	"git.sigsum.org/sigsum-go/pkg/log" -	"git.sigsum.org/sigsum-go/pkg/types" -	"git.sigsum.org/sigsum-go/pkg/dns" -	"git.sigsum.org/log-go/pkg/db" -	"git.sigsum.org/log-go/pkg/instance" -	"git.sigsum.org/log-go/pkg/state" -) - -var ( -	httpEndpoint = flag.String("http_endpoint", "localhost:6965", "host:port specification of where sigsum-log-go serves clients") -	rpcBackend   = flag.String("log_rpc_server", "localhost:6962", "host:port specification of where Trillian serves clients") -	prefix       = flag.String("prefix", "", "a prefix that proceeds /sigsum/v0/<endpoint>") -	trillianID   = flag.Int64("trillian_id", 0, "log identifier in the Trillian database") -	deadline     = flag.Duration("deadline", time.Second*10, "deadline for backend requests") -	key          = flag.String("key", "", "path to file with hex-encoded Ed25519 private key") -	witnesses    = flag.String("witnesses", "", "comma-separated list of trusted witness public keys in hex") -	maxRange     = flag.Int64("max_range", 10, "maximum number of entries that can be retrived in a single request") -	interval     = flag.Duration("interval", time.Second*30, "interval used to rotate the log's cosigned STH") -	shardStart   = flag.Int64("shard_interval_start", 0, "start of shard interval since the UNIX epoch in seconds") -	logFile      = flag.String("log-file", "", "file to write logs to (Default: stderr)") -	logLevel     = flag.String("log-level", "info", "log level (Available options: debug, info, warning, error. Default: info)") -	logColor     = flag.Bool("log-color", false, "colored logging output (Default: off)") - -	gitCommit = "unknown" -) - -func main() { -	flag.Parse() - -	if err := setupLogging(*logFile, *logLevel, *logColor); err != nil { -		log.Fatal("setup logging: %v", err) -	} -	log.Info("log-go git-commit %s", gitCommit) - -	// wait for clean-up before exit -	var wg sync.WaitGroup -	defer wg.Wait() -	ctx, cancel := context.WithCancel(context.Background()) -	defer cancel() - -	log.Debug("configuring log-go instance") -	instance, err := setupInstanceFromFlags() -	if err != nil { -		log.Fatal("setup instance: %v", err) -	} - -	log.Debug("starting state manager routine") -	go func() { -		wg.Add(1) -		defer wg.Done() -		instance.Stateman.Run(ctx) -		log.Debug("state manager shutdown") -		cancel() // must have state manager running -	}() - -	log.Debug("starting await routine") -	server := http.Server{Addr: *httpEndpoint} -	go await(ctx, func() { -		wg.Add(1) -		defer wg.Done() -		ctxInner, _ := context.WithTimeout(ctx, time.Second*60) -		log.Info("stopping http server, please wait...") -		server.Shutdown(ctxInner) -		log.Info("stopping go routines, please wait...") -		cancel() -	}) - -	log.Info("serving on %v/%v", *httpEndpoint, *prefix) -	if err = server.ListenAndServe(); err != http.ErrServerClosed { -		log.Error("serve: %v", err) -	} -} - -func setupLogging(logFile, logLevel string, logColor bool) error { -	if len(logFile) != 0 { -		f, err := os.OpenFile(logFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) -		if err != nil { -			return err -		} -		log.SetOutput(f) -	} - -	switch logLevel { -	case "debug": -		log.SetLevel(log.DebugLevel) -	case "info": -		log.SetLevel(log.InfoLevel) -	case "warning": -		log.SetLevel(log.WarningLevel) -	case "error": -		log.SetLevel(log.ErrorLevel) -	default: -		return fmt.Errorf("invalid logging level %s", logLevel) -	} - -	log.SetColor(logColor) -	return nil -} - -// SetupInstance sets up a new sigsum-log-go instance from flags -func setupInstanceFromFlags() (*instance.Instance, error) { -	var i instance.Instance -	var err error - -	// Setup log configuration -	i.Signer, i.LogID, err = newLogIdentity(*key) -	if err != nil { -		return nil, fmt.Errorf("newLogIdentity: %v", err) -	} -	i.TreeID = *trillianID -	i.Prefix = *prefix -	i.MaxRange = *maxRange -	i.Deadline = *deadline -	i.Interval = *interval -	i.ShardStart = uint64(*shardStart) -	if *shardStart < 0 { -		return nil, fmt.Errorf("shard start must be larger than zero") -	} -	i.Witnesses, err = newWitnessMap(*witnesses) -	if err != nil { -		return nil, fmt.Errorf("newWitnessMap: %v", err) -	} - -	// Setup log client -	dialOpts := []grpc.DialOption{grpc.WithInsecure(), grpc.WithBlock(), grpc.WithTimeout(i.Deadline)} -	conn, err := grpc.Dial(*rpcBackend, dialOpts...) -	if err != nil { -		return nil, fmt.Errorf("Dial: %v", err) -	} -	i.Client = &db.TrillianClient{ -		TreeID: i.TreeID, -		GRPC:   trillian.NewTrillianLogClient(conn), -	} - -	// Setup state manager -	i.Stateman, err = state.NewStateManagerSingle(i.Client, i.Signer, i.Interval, i.Deadline) -	if err != nil { -		return nil, fmt.Errorf("NewStateManagerSingle: %v", err) -	} - -	// Setup DNS verifier -	i.DNS = dns.NewDefaultResolver() - -	// Register HTTP endpoints -	mux := http.NewServeMux() -	http.Handle("/", mux) -	for _, handler := range i.Handlers() { -		log.Debug("adding handler: %s", handler.Path()) -		mux.Handle(handler.Path(), handler) -	} -	log.Debug("adding prometheus handler on path: /metrics") -	http.Handle("/metrics", promhttp.Handler()) - -	return &i, nil -} - -func newLogIdentity(keyFile string) (crypto.Signer, string, error) { -	buf, err := ioutil.ReadFile(keyFile) -	if err != nil { -		return nil, "", err -	} -	if buf, err = hex.DecodeString(strings.TrimSpace(string(buf))); err != nil { -		return nil, "", fmt.Errorf("DecodeString: %v", err) -	} -	sk := crypto.Signer(ed25519.NewKeyFromSeed(buf)) -	vk := sk.Public().(ed25519.PublicKey) -	return sk, hex.EncodeToString([]byte(vk[:])), nil -} - -// newWitnessMap creates a new map of trusted witnesses -func newWitnessMap(witnesses string) (map[types.Hash]types.PublicKey, error) { -	w := make(map[types.Hash]types.PublicKey) -	if len(witnesses) > 0 { -		for _, witness := range strings.Split(witnesses, ",") { -			b, err := hex.DecodeString(witness) -			if err != nil { -				return nil, fmt.Errorf("DecodeString: %v", err) -			} - -			var vk types.PublicKey -			if n := copy(vk[:], b); n != types.PublicKeySize { -				return nil, fmt.Errorf("Invalid public key size: %v", n) -			} -			w[*types.HashFn(vk[:])] = vk -		} -	} -	return w, nil -} - -// await waits for a shutdown signal and then runs a clean-up function -func await(ctx context.Context, done func()) { -	sigs := make(chan os.Signal, 1) -	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) -	select { -	case <-sigs: -	case <-ctx.Done(): -	} -	log.Debug("received shutdown signal") -	done() -} | 
