// package main provides a tool named sigsum-debug. // // Install as follows: // // $ go install -ldflags="-X 'main.someVersion=git commit $(git rev-list -1 HEAD)'" // // Usage: // // $ sigsum-debug help // package main import ( "flag" "fmt" "log" "os" ) const usage = `sigsum-debug version %s Usage: sigsum-debug help Outputs a usage message. sigsum-debug genkey Outputs a new private key. sigsum-debug pubkey Reads a private key from stdin and output its public key. sigsum-debug hashkey Reads a public key from stdin and output its key hash. sigsum-debug hashleaf -k PRIVATE_KEY [-s SHARD_HINT] Reads data from STDIN and outputs a leaf hash. -k, --private-key Private key to sign with -s, --shard-hint Shard hint to use (Default: 0) sigsum-debug sign -k PRIVATE_KEY [-s SHARD_HINT] Reads data from STDIN and outputs a signature. -k, --private-key Private key to sign with -s, --shard-hint Shard hint to use (Default: 0) sigsum-debug cosign -w WIT_PRIV -l LOG_PUB Reads an ASCII signed tree head from STDIN and outputs a cosignature. -w, --witness-priv Witness private key to sign with -l, --log-pub Log public key to verify signed tree head ` var ( optPriv, optPub string optShardHint uint64 someVersion = "unknown" ) func main() { log.SetFlags(0) var err error switch cmd := parseCommand(); cmd.Name() { case "help": cmd.Usage() case "genkey": err = CmdGenKey() case "pubkey": err = CmdPubKey() case "hashkey": err = CmdHashKey() case "hashleaf": err = CmdHashLeaf(optPriv, optShardHint) case "sign": err = CmdSign(optPriv, optShardHint) case "cosign": err = fmt.Errorf("TODO") default: err = fmt.Errorf("invalid command %q, try %q", cmd.Name(), "sigsum help") } if err != nil { log.Printf("%s", err) os.Exit(1) } } func parseCommand() *flag.FlagSet { args := os.Args if len(args) < 2 { args = append(args, "") } fs := flag.NewFlagSet(args[1], flag.ExitOnError) fs.Usage = func() { log.Printf(usage, someVersion) } registerOptions(fs) fs.Parse(args[2:]) return fs } func registerOptions(fs *flag.FlagSet) { switch cmd := fs.Name(); cmd { default: case "hashleaf": registerStringOption(fs, &optPriv, "k", "key", "") registerUint64Option(fs, &optShardHint, "s", "shard-hint", 0) case "sign": registerStringOption(fs, &optPriv, "k", "key", "") registerUint64Option(fs, &optShardHint, "s", "shard-hint", 0) case "cosign": registerStringOption(fs, &optPriv, "w", "--witness-priv", "") registerStringOption(fs, &optPub, "l", "--log-pub", "") } } func registerStringOption(fs *flag.FlagSet, opt *string, short, long, value string) { fs.StringVar(opt, short, value, "") fs.StringVar(opt, long, value, "") } func registerUint64Option(fs *flag.FlagSet, opt *uint64, short, long string, value uint64) { fs.Uint64Var(opt, short, value, "") fs.Uint64Var(opt, long, value, "") }