package main 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 AskPassword(confirm bool) (string, error) { f := os.Stdin fd := f.Fd() oldState, err := terminal.MakeRaw(int(fd)) if err != nil { return "", err } defer terminal.Restore(int(fd), oldState) term := terminal.NewTerminal(f, "") pass, err := term.ReadPassword("passphrase: ") if err != nil { return "", err } if len(pass) == 0 { return "", ErrNoPassword } if confirm { pass2, err := term.ReadPassword("confirm passphrase: ") if err != nil { return "", err } if pass != pass2 { return "", ErrNoMatch } } return pass, nil }