63 lines
2 KiB
Go
63 lines
2 KiB
Go
package protocol
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
var (
|
|
errAuthAES128IncorrectMAC = errors.New("auth_aes128_* post decrypt incorrect mac")
|
|
errAuthAES128DataLengthError = errors.New("auth_aes128_* post decrypt length mismatch")
|
|
errAuthAES128IncorrectChecksum = errors.New("auth_aes128_* post decrypt incorrect checksum")
|
|
errAuthAES128PositionTooLarge = errors.New("auth_aes128_* post decrypt posision is too large")
|
|
errAuthSHA1v4CRC32Error = errors.New("auth_sha1_v4 post decrypt data crc32 error")
|
|
errAuthSHA1v4DataLengthError = errors.New("auth_sha1_v4 post decrypt data length error")
|
|
errAuthSHA1v4IncorrectChecksum = errors.New("auth_sha1_v4 post decrypt incorrect checksum")
|
|
errAuthChainDataLengthError = errors.New("auth_chain_* post decrypt length mismatch")
|
|
errAuthChainHMACError = errors.New("auth_chain_* post decrypt hmac error")
|
|
)
|
|
|
|
type authData struct {
|
|
clientID []byte
|
|
connectionID uint32
|
|
mutex sync.Mutex
|
|
}
|
|
|
|
type recvInfo struct {
|
|
recvID uint32
|
|
buffer *bytes.Buffer
|
|
}
|
|
|
|
type hmacMethod func(key []byte, data []byte) []byte
|
|
type hashDigestMethod func(data []byte) []byte
|
|
type rndMethod func(dataSize int, random *shift128PlusContext, lastHash []byte, dataSizeList, dataSizeList2 []int, overhead int) int
|
|
|
|
// Protocol provides methods for decoding, encoding and iv setting
|
|
type Protocol interface {
|
|
initForConn(iv []byte) Protocol
|
|
GetProtocolOverhead() int
|
|
SetOverhead(int)
|
|
Decode([]byte) ([]byte, int, error)
|
|
Encode([]byte) ([]byte, error)
|
|
DecodePacket([]byte) ([]byte, int, error)
|
|
EncodePacket([]byte) ([]byte, error)
|
|
}
|
|
|
|
type protocolCreator func(b *Base) Protocol
|
|
|
|
var protocolList = make(map[string]protocolCreator)
|
|
|
|
func register(name string, c protocolCreator) {
|
|
protocolList[name] = c
|
|
}
|
|
|
|
// PickProtocol returns a protocol of the given name
|
|
func PickProtocol(name string, b *Base) (Protocol, error) {
|
|
if protocolCreator, ok := protocolList[strings.ToLower(name)]; ok {
|
|
return protocolCreator(b), nil
|
|
}
|
|
return nil, fmt.Errorf("Protocol %s not supported", name)
|
|
}
|