-
Notifications
You must be signed in to change notification settings - Fork 1
/
module_encryption.go
117 lines (100 loc) · 2.22 KB
/
module_encryption.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package codec
import (
"errors"
"kit.golaxy.org/plugins/transport/method"
)
type (
FetchNonce = func() ([]byte, error)
)
// IEncryptionModule 加密模块接口
type IEncryptionModule interface {
// Transforming 变换数据
Transforming(dst, src []byte) ([]byte, error)
// SizeOfAddition 附加数据大小
SizeOfAddition(msgLen int) (int, error)
// GC GC
GC()
}
// EncryptionModule 加密模块
type EncryptionModule struct {
CipherStream method.CipherStream // 密码流
Padding method.Padding // 填充方案
FetchNonce FetchNonce // 获取nonce值
gcList [][]byte // GC列表
}
// Transforming 变换数据
func (m *EncryptionModule) Transforming(dst, src []byte) (ret []byte, err error) {
if m.CipherStream == nil {
return nil, errors.New("setting CipherStream is nil")
}
var in []byte
is := m.CipherStream.InputSize(len(src))
if is > len(src) {
buf := BytesPool.Get(is)
defer BytesPool.Put(buf)
copy(buf, src)
in = buf
} else {
in = src
}
os := m.CipherStream.OutputSize(len(src))
if os > len(dst) {
buf := BytesPool.Get(os)
defer func() {
if err == nil {
m.gcList = append(m.gcList, buf)
} else {
BytesPool.Put(buf)
}
}()
ret = buf
} else {
ret = dst
}
if m.CipherStream.Pad() {
if m.Padding == nil {
return nil, errors.New("setting Padding is nil")
}
err = m.Padding.Pad(in, len(src))
if err != nil {
return nil, err
}
}
nonce, err := m.FetchNonce()
if err != nil {
return nil, err
}
ts, err := m.CipherStream.Transforming(ret, in, nonce)
if err != nil {
return nil, err
}
ret = ret[:ts]
if m.CipherStream.Unpad() {
if m.Padding == nil {
return nil, errors.New("setting Padding is nil")
}
ret, err = m.Padding.Unpad(ret)
if err != nil {
return nil, err
}
}
return ret, nil
}
// SizeOfAddition 附加数据大小
func (m *EncryptionModule) SizeOfAddition(msgLen int) (int, error) {
if m.CipherStream == nil {
return 0, errors.New("setting CipherStream is nil")
}
size := m.CipherStream.OutputSize(msgLen) - msgLen
if size < 0 {
return 0, nil
}
return size, nil
}
// GC GC
func (m *EncryptionModule) GC() {
for i := range m.gcList {
BytesPool.Put(m.gcList[i])
}
m.gcList = m.gcList[:0]
}