-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathcodec_xor_protobuf.go
42 lines (38 loc) · 1.15 KB
/
codec_xor_protobuf.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
package gnet
import "reflect"
// codec for proto.Message and xor
type XorProtoCodec struct {
*ProtoCodec
xorKey []byte
}
func NewXorProtoCodec(xorKey []byte, protoMessageTypeMap map[PacketCommand]reflect.Type) *XorProtoCodec {
codec := &XorProtoCodec{
ProtoCodec: NewProtoCodec(protoMessageTypeMap),
xorKey: xorKey,
}
codec.HeaderEncoder = func(connection Connection, packet Packet, headerData []byte) {
xorEncode(headerData, codec.xorKey, 0)
}
codec.HeaderDecoder = func(connection Connection, headerData []byte) {
xorEncode(headerData, codec.xorKey, 0)
}
codec.ProtoPacketBytesEncoder = func(protoPacketBytes [][]byte) [][]byte {
keyIndex := int(codec.PacketHeaderSize())
for _, data := range protoPacketBytes {
xorEncode(data, codec.xorKey, keyIndex)
keyIndex += len(data)
}
return protoPacketBytes
}
codec.ProtoPacketBytesDecoder = func(packetData []byte) []byte {
xorEncode(packetData, codec.xorKey, int(codec.PacketHeaderSize()))
return packetData
}
return codec
}
// xor encode
func xorEncode(data []byte, key []byte, keyIndex int) {
for i := 0; i < len(data); i++ {
data[i] = data[i] ^ key[(i+keyIndex)%len(key)]
}
}