// Package ask implements interactive password retrieval package ask import ( "errors" "os" "golang.org/x/crypto/ssh/terminal" ) var ( ErrNoPassword = errors.New("please provide a password") ErrNoMatch = errors.New("passwords don't match") ) // Confirmed asks for password twice func Confirmed() (string, error) { pass, err := ask(os.Stdin, "passphrase: ") if err != nil { return "", err } pass2, err := ask(os.Stdin, "confirm passphrase: ") if err != nil { return "", err } if pass != pass2 { return "", ErrNoMatch } return pass, nil } // Password ask for password once func Password() (string, error) { return ask(os.Stdin, "passphrase: ") } func ask(f *os.File, prompt string) (string, error) { fd := int(f.Fd()) oldState, err := terminal.MakeRaw(fd) if err != nil { return "", err } defer terminal.Restore(fd, oldState) term := terminal.NewTerminal(f, "") pass, err := term.ReadPassword(prompt) if err != nil { return "", err } if len(pass) == 0 { return "", ErrNoPassword } return pass, nil }