-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathencrypt.go
82 lines (69 loc) · 1.54 KB
/
encrypt.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
package main
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"github.com/s-gheldd/aftercrypt/acrypt"
)
func sanityCheckFile(relPath string) (string, error) {
absPath, err := filepath.Abs(relPath)
if err != nil {
return "", err
}
info, err := os.Lstat(absPath)
if err != nil {
return "", err
}
if !info.Mode().IsRegular() {
return "", fmt.Errorf("file %s is not regular file %v", relPath, info.Mode())
}
return absPath, nil
}
func encryptFile(secret []byte, relPath string, done chan<- struct{}) {
absPath, err := sanityCheckFile(relPath)
if err != nil {
logErrAndSignalDone(err, done)
return
}
salt, err := acrypt.Nonce(acrypt.Settings.SaltSize)
if err != nil {
logErrAndSignalDone(err, done)
return
}
cipher, err := acrypt.GCMCipher(secret, salt)
if err != nil {
logErrAndSignalDone(err, done)
return
}
input, err := os.Open(absPath)
if err != nil {
logErrAndSignalDone(err, done)
return
}
defer input.Close()
output, err := os.Create(absPath + acrypt.Extension)
if err != nil {
logErrAndSignalDone(err, done)
return
}
defer output.Close()
nonce, err := acrypt.Nonce(cipher.NonceSize())
if err != nil {
logErrAndSignalDone(err, done)
return
}
bytes, err := ioutil.ReadAll(input)
if err != nil {
logErrAndSignalDone(err, done)
return
}
bytes = cipher.Seal(bytes[:0], nonce, bytes, nil)
fileContent := &acrypt.File{Nonce: nonce, Key: acrypt.NewKey(salt), Payload: bytes}
err = fileContent.Serialize(output)
if err != nil {
logErrAndSignalDone(err, done)
return
}
done <- struct{}{}
}