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) { return askPassword(true) } func AskPassword() (string, error) { return askPassword(false) } 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 }