...
1
16
17 package crypto
18
19 import (
20 "crypto/aes"
21 "crypto/cipher"
22 "crypto/rand"
23
24 "github.com/pkg/errors"
25 )
26
27
28 func CreateRandBytes(size uint32) ([]byte, error) {
29 bytes := make([]byte, size)
30 if _, err := rand.Read(bytes); err != nil {
31 return nil, err
32 }
33 return bytes, nil
34 }
35
36
37
38 func EncryptBytes(data, key []byte) ([]byte, error) {
39 block, err := aes.NewCipher(key)
40 if err != nil {
41 return nil, err
42 }
43 gcm, err := cipher.NewGCM(block)
44 if err != nil {
45 return nil, err
46 }
47 nonce, err := CreateRandBytes(uint32(gcm.NonceSize()))
48 if err != nil {
49 return nil, err
50 }
51 return gcm.Seal(nonce, nonce, data, nil), nil
52 }
53
54
55
56 func DecryptBytes(data, key []byte) ([]byte, error) {
57 block, err := aes.NewCipher(key)
58 if err != nil {
59 return nil, err
60 }
61 gcm, err := cipher.NewGCM(block)
62 if err != nil {
63 return nil, err
64 }
65 nonceSize := gcm.NonceSize()
66 if len(data) < nonceSize {
67 return nil, errors.New("size of data is less than the nonce")
68 }
69
70 nonce, out := data[:nonceSize], data[nonceSize:]
71 out, err = gcm.Open(nil, nonce, out, nil)
72 if err != nil {
73 return nil, err
74 }
75 return out, nil
76 }
77
View as plain text