check / check (push) Waiting to run
The key index, --words, the --to recipients and the input file of age encrypt and age decrypt were checked only after the mnemonic had been obtained, so a run that could not succeed still prompted for it or ran the mnemonic command. options.Index now refuses an index above derive.MaxIndex, which covers every command group; the mnemonic command calls the new childmnemonic.CheckWords first; age encrypt reads its recipients with the new agekey.Recipients, and both age commands open their input, before the key is derived. Encrypt now takes the parsed recipients. The README says which checks come first. Model: opus-5-5
72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
// Package mnemonic is the command that prints a child mnemonic.
|
|
package mnemonic
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/spf13/cobra"
|
|
"sneak.berlin/go/keyfunc/internal/childmnemonic"
|
|
"sneak.berlin/go/keyfunc/internal/cli/options"
|
|
"sneak.berlin/go/keyfunc/internal/derive"
|
|
)
|
|
|
|
// Command returns the mnemonic command.
|
|
func Command() *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "mnemonic",
|
|
Short: "print a child mnemonic derived from the main one",
|
|
Args: cobra.NoArgs,
|
|
RunE: func(cmd *cobra.Command, _ []string) error {
|
|
child, err := derived(cmd)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = fmt.Fprintln(cmd.OutOrStdout(), child)
|
|
if err != nil {
|
|
return fmt.Errorf("writing the mnemonic: %w", err)
|
|
}
|
|
|
|
return nil
|
|
},
|
|
}
|
|
|
|
words := options.Decimal(childmnemonic.DefaultWords)
|
|
cmd.Flags().Var(
|
|
&words, "words",
|
|
"how long the child mnemonic is: 12, 18 or 24 words",
|
|
)
|
|
|
|
return cmd
|
|
}
|
|
|
|
// derived returns the child mnemonic this run asks for.
|
|
func derived(cmd *cobra.Command) (string, error) {
|
|
index, err := options.Index(cmd)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
words, err := cmd.Flags().GetUint32("words")
|
|
if err != nil {
|
|
return "", fmt.Errorf("reading the word count: %w", err)
|
|
}
|
|
|
|
err = childmnemonic.CheckWords(words)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
parent, err := options.Mnemonic(cmd)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
master, err := derive.Master(parent)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return childmnemonic.Derive(master, words, index)
|
|
}
|