-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathpassword.go
89 lines (74 loc) · 1.42 KB
/
password.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package main
/*
#include <termios.h>
#include <stdio.h>
#include <errno.h>
struct termios tio_save;
void setnoecho(int fd) {
struct termios tio;
tcgetattr(fd, &tio);
tio.c_lflag &= ~ECHO;
tcsetattr(fd, TCSANOW, &tio);
}
void savetermios(int fd) {
tcgetattr(fd, &tio_save);
}
void resettermios(int fd) {
tcsetattr(fd, TCSANOW, &tio_save);
}
*/
import "C"
import (
"fmt"
"os"
"github.com/peterh/liner"
)
func ReadPassword(line *liner.State) ([]byte, error) {
s, err := line.PasswordPrompt("Enter pass: ")
if err != nil {
return nil, err
}
var data []byte = make([]byte, KeySize)
for k, c := range []byte(s) {
if c == '\n' {
fmt.Fprint(os.Stderr, "have new line")
data[k] = 0
} else {
data[k] = c
}
}
return data, nil
}
func GetNewPass(line *liner.State) ([]byte, error) {
var data []byte = make([]byte, KeySize)
var pass1, pass2 string
var good bool = false
var err error
if pass1, err = line.PasswordPrompt("New pass: "); err != nil {
return nil, err
}
if pass2, err = line.PasswordPrompt("And again: "); err != nil {
return nil, err
}
if len(pass1) != len(pass2) {
good = false
} else {
good = true
for k, _ := range pass1 {
if pass1[k] == '\n' {
data[k] = 0
break
} else if pass1[k] != pass2[k] {
good = false
break
} else {
data[k] = pass1[k]
}
}
}
if good {
return data, nil
} else {
return nil, fmt.Errorf("Passwords did not match.")
}
}