-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathonepad.go
90 lines (82 loc) · 1.73 KB
/
onepad.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
90
package main
import (
"errors"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
"github.com/flobii/one-time-pad/pkg/onetimepad"
)
const name string = "onepad"
func main() {
if len(os.Args) == 1 {
fmt.Println(name)
fmt.Println(" encrypts and decrypts files")
fmt.Println()
usage(true)
return
}
err := handleArgs()
if err != nil {
log(err)
}
}
func usage(e ...bool) {
var extended bool
if len(e) > 0 {
extended = e[0]
} else {
extended = false
}
fmt.Printf("usage: %s <filename> <keydir / keypath>\n", name)
if extended {
fmt.Println(" if a file with `.key` is provided as the second argument")
fmt.Println(" the file will be decrypted using this key.")
fmt.Println(" otherwise the file will be encrypted and the key will be")
fmt.Println(" stored in the path given as the second argument.")
}
}
func log(err error) {
fmt.Printf("%s: %v\n", name, err)
}
func handleArgs() error {
var err error = nil
if len(os.Args) > 3 {
return errors.New("too many arguments")
}
filename := os.Args[1]
var keypath string
if len(os.Args) < 3 {
keypath = "./"
} else {
keypath = os.Args[2]
}
if strings.HasSuffix(keypath, ".key") {
data, d_err := ioutil.ReadFile(keypath)
if d_err != nil {
return d_err
}
err = onetimepad.DecryptFile(filename, data)
if err != nil {
return err
}
k_err := os.Remove(keypath)
if k_err != nil {
return k_err
}
} else {
key := []byte{}
keypath = strings.ReplaceAll(keypath, "\\", "/")
if !strings.HasSuffix(keypath, "/") {
keypath += "/"
}
key, err = onetimepad.EncryptFile(filename)
if err != nil {
return err
}
keypath = keypath + filepath.Base(filename) + ".key"
ioutil.WriteFile(keypath, key, 0644)
}
return err
}