package signify import ( "errors" "os" "golang.org/x/crypto/ssh/terminal" ) var ( ErrNoPassword = errors.New("please provide a password") ErrNoMatch = errors.New("passwords don't match") ) func AskConfirmed() (string, error) { pass, err := askPassword(os.Stdin, "passphrase: ") if err != nil { return "", err } pass2, err := askPassword(os.Stdin, "confirm passphrase: ") if err != nil { return "", err } if pass != pass2 { return "", ErrNoMatch } return pass, nil } func AskPassword() (string, error) { return askPassword(os.Stdin, "passphrase: ") } func askPassword(f *os.File, q string) (string, error) { oldState, err := terminal.MakeRaw(int(f.Fd())) if err != nil { return "", err } defer terminal.Restore(int(f.Fd()), oldState) term := terminal.NewTerminal(f, "") pass, err := term.ReadPassword(q) if err != nil { return "", err } if len(pass) == 0 { return "", ErrNoPassword } return pass, nil }