The mnemonic command: child mnemonics (closes #4)
All checks were successful
check / check (push) Successful in 4s
All checks were successful
check / check (push) Successful in 4s
keyfunc mnemonic derives a 12, 18 or 24 word child mnemonic through BIP-85's own mnemonic application, with the specification's test vectors as tests. One review round, passed with no findings; the reviewer reproduced the vectors from an implementation written from the specification alone. Model: opus-5 (implementation and review); fable-5-1 (landing)
This commit was merged in pull request #6.
This commit is contained in:
65
internal/cli/mnemonic/mnemonic.go
Normal file
65
internal/cli/mnemonic/mnemonic.go
Normal file
@@ -0,0 +1,65 @@
|
||||
// Package mnemonic is the command that prints a child mnemonic.
|
||||
package mnemonic
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"git.eeqj.de/sneak/keyfunc/internal/childmnemonic"
|
||||
"git.eeqj.de/sneak/keyfunc/internal/cli/options"
|
||||
"git.eeqj.de/sneak/keyfunc/internal/derive"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
// 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
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().Uint32(
|
||||
"words", childmnemonic.DefaultWords,
|
||||
"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)
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user