mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 17:35:40 +08:00
82 lines
2.1 KiB
Go
82 lines
2.1 KiB
Go
![]() |
package protocol
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"sort"
|
||
|
|
||
|
"github.com/nadoo/glider/proxy/ssr/internal/tools"
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
register("auth_chain_b", NewAuthChainB)
|
||
|
}
|
||
|
|
||
|
func NewAuthChainB() IProtocol {
|
||
|
a := &authChainA{
|
||
|
salt: "auth_chain_b",
|
||
|
hmac: tools.HmacMD5,
|
||
|
hashDigest: tools.SHA1Sum,
|
||
|
rnd: authChainBGetRandLen,
|
||
|
recvInfo: recvInfo{
|
||
|
recvID: 1,
|
||
|
buffer: new(bytes.Buffer),
|
||
|
},
|
||
|
}
|
||
|
return a
|
||
|
}
|
||
|
|
||
|
func (a *authChainA) authChainBInitDataSize() {
|
||
|
if len(a.Key) == 0 {
|
||
|
return
|
||
|
}
|
||
|
// libev version
|
||
|
random := &a.randomServer
|
||
|
random.InitFromBin(a.Key)
|
||
|
length := random.Next()%8 + 4
|
||
|
a.dataSizeList = make([]int, length)
|
||
|
for i := 0; i < int(length); i++ {
|
||
|
a.dataSizeList[i] = int(random.Next() % 2340 % 2040 % 1440)
|
||
|
}
|
||
|
sort.Ints(a.dataSizeList)
|
||
|
|
||
|
length = random.Next()%16 + 8
|
||
|
a.dataSizeList2 = make([]int, length)
|
||
|
for i := 0; i < int(length); i++ {
|
||
|
a.dataSizeList2[i] = int(random.Next() % 2340 % 2040 % 1440)
|
||
|
}
|
||
|
sort.Ints(a.dataSizeList2)
|
||
|
}
|
||
|
|
||
|
func authChainBGetRandLen(dataLength int, random *tools.Shift128plusContext, lastHash []byte, dataSizeList, dataSizeList2 []int, overhead int) int {
|
||
|
if dataLength > 1440 {
|
||
|
return 0
|
||
|
}
|
||
|
random.InitFromBinDatalen(lastHash[:16], dataLength)
|
||
|
// libev version, upper_bound
|
||
|
pos := sort.Search(len(dataSizeList), func(i int) bool { return dataSizeList[i] > dataLength+overhead })
|
||
|
finalPos := uint64(pos) + random.Next()%uint64(len(dataSizeList))
|
||
|
if finalPos < uint64(len(dataSizeList)) {
|
||
|
return dataSizeList[finalPos] - dataLength - overhead
|
||
|
}
|
||
|
// libev version, upper_bound
|
||
|
pos = sort.Search(len(dataSizeList2), func(i int) bool { return dataSizeList2[i] > dataLength+overhead })
|
||
|
finalPos = uint64(pos) + random.Next()%uint64(len(dataSizeList2))
|
||
|
if finalPos < uint64(len(dataSizeList2)) {
|
||
|
return dataSizeList2[finalPos] - dataLength - overhead
|
||
|
}
|
||
|
if finalPos < uint64(pos+len(dataSizeList2)-1) {
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
if dataLength > 1300 {
|
||
|
return int(random.Next() % 31)
|
||
|
}
|
||
|
if dataLength > 900 {
|
||
|
return int(random.Next() % 127)
|
||
|
}
|
||
|
if dataLength > 400 {
|
||
|
return int(random.Next() % 521)
|
||
|
}
|
||
|
return int(random.Next() % 1021)
|
||
|
}
|