mirror of
https://github.com/Mrs4s/go-cqhttp.git
synced 2025-05-04 19:17:37 +08:00
feat: support sign server
This commit is contained in:
parent
b958046a27
commit
9c1390c75c
@ -14,7 +14,7 @@ import (
|
|||||||
|
|
||||||
"github.com/Mrs4s/MiraiGo/client"
|
"github.com/Mrs4s/MiraiGo/client"
|
||||||
"github.com/Mrs4s/MiraiGo/utils"
|
"github.com/Mrs4s/MiraiGo/utils"
|
||||||
"github.com/Mrs4s/MiraiGo/wrapper"
|
"github.com/Mrs4s/go-cqhttp/internal/base"
|
||||||
"github.com/mattn/go-colorable"
|
"github.com/mattn/go-colorable"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
@ -22,18 +22,11 @@ import (
|
|||||||
"gopkg.ilharper.com/x/isatty"
|
"gopkg.ilharper.com/x/isatty"
|
||||||
|
|
||||||
"github.com/Mrs4s/go-cqhttp/global"
|
"github.com/Mrs4s/go-cqhttp/global"
|
||||||
"github.com/Mrs4s/go-cqhttp/internal/base"
|
|
||||||
"github.com/Mrs4s/go-cqhttp/internal/download"
|
"github.com/Mrs4s/go-cqhttp/internal/download"
|
||||||
"github.com/Mrs4s/go-cqhttp/internal/encryption"
|
|
||||||
_ "github.com/Mrs4s/go-cqhttp/internal/encryption/t544" // side effect
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var console = bufio.NewReader(os.Stdin)
|
var console = bufio.NewReader(os.Stdin)
|
||||||
|
|
||||||
func init() {
|
|
||||||
wrapper.DandelionEnergy = energy
|
|
||||||
}
|
|
||||||
|
|
||||||
func readLine() (str string) {
|
func readLine() (str string) {
|
||||||
str, _ = console.ReadString('\n')
|
str, _ = console.ReadString('\n')
|
||||||
str = strings.TrimSpace(str)
|
str = strings.TrimSpace(str)
|
||||||
@ -222,9 +215,8 @@ func loginResponseProcessor(res *client.LoginResponse) error {
|
|||||||
log.Warnf("设备信息被封禁, 请删除 device.json 后重试.")
|
log.Warnf("设备信息被封禁, 请删除 device.json 后重试.")
|
||||||
case 237:
|
case 237:
|
||||||
log.Warnf("登录过于频繁, 请在手机QQ登录并根据提示完成认证后等一段时间重试")
|
log.Warnf("登录过于频繁, 请在手机QQ登录并根据提示完成认证后等一段时间重试")
|
||||||
case 45: // 在提供 t544 后还是出现45错误是需要强行升级到最新客户端或被限制非常用设备
|
case 45:
|
||||||
log.Warnf("你的账号涉嫌违规被限制在非常用设备登录, 请在手机QQ登录并根据提示完成认证")
|
log.Warnf("你的账号被限制登录, 请配置 SignServer 后重试")
|
||||||
log.Warnf("或使用 -update-protocol 升级到最新协议后重试")
|
|
||||||
}
|
}
|
||||||
log.Infof("按 Enter 继续....")
|
log.Infof("按 Enter 继续....")
|
||||||
readLine()
|
readLine()
|
||||||
@ -274,32 +266,47 @@ func fetchCaptcha(id string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func energy(uin uint64, id string, appVersion string, salt []byte) ([]byte, error) {
|
func energy(uin uint64, id string, appVersion string, salt []byte) ([]byte, error) {
|
||||||
if localSigner, ok := encryption.T544Signer[appVersion]; ok {
|
signServer := base.SignServer
|
||||||
log.Debugf("use local T544Signer v%s", appVersion)
|
if !strings.HasSuffix(signServer, "/") {
|
||||||
result := localSigner(time.Now().UnixMicro(), salt)
|
signServer += "/"
|
||||||
log.Debugf("t544 sign result: %x", result)
|
|
||||||
return result, nil
|
|
||||||
}
|
}
|
||||||
log.Debugf("fallback to remote T544Signer v%s", appVersion)
|
response, err := download.Request{
|
||||||
signServer := "https://captcha.go-cqhttp.org/sdk/dandelion/energy"
|
Method: http.MethodGet,
|
||||||
if base.SignServerOverwrite != "" {
|
URL: signServer + "custom_energy" + fmt.Sprintf("?data=%v&salt=%v", id, hex.EncodeToString(salt)),
|
||||||
signServer = base.SignServerOverwrite
|
}.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("获取T544 sign时出现错误: %v server: %v", err, signServer)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
data, err := hex.DecodeString(gjson.GetBytes(response, "data").String())
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("获取T544 sign时出现错误: %v", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if len(data) == 0 {
|
||||||
|
log.Warnf("获取T544 sign时出现错误: %v", "data is empty")
|
||||||
|
return nil, errors.New("data is empty")
|
||||||
|
}
|
||||||
|
return data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func sign(seq uint64, uin string, cmd string, qua string, buff []byte) (sign []byte, extra []byte, token []byte, err error) {
|
||||||
|
signServer := base.SignServer
|
||||||
|
if !strings.HasSuffix(signServer, "/") {
|
||||||
|
signServer += "/"
|
||||||
}
|
}
|
||||||
response, err := download.Request{
|
response, err := download.Request{
|
||||||
Method: http.MethodPost,
|
Method: http.MethodPost,
|
||||||
URL: signServer,
|
URL: signServer + "sign",
|
||||||
Header: map[string]string{"Content-Type": "application/x-www-form-urlencoded"},
|
Header: map[string]string{"Content-Type": "application/x-www-form-urlencoded"},
|
||||||
Body: bytes.NewReader([]byte(fmt.Sprintf("uin=%v&id=%s&salt=%s&version=%s", uin, id, hex.EncodeToString(salt), appVersion))),
|
Body: bytes.NewReader([]byte(fmt.Sprintf("uin=%v&qua=%s&cmd=%s&seq=%v&buffer=%v", uin, qua, cmd, seq, hex.EncodeToString(buff)))),
|
||||||
}.Bytes()
|
}.Bytes()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("获取T544时出现问题: %v", err)
|
log.Warnf("获取sso sign时出现错误: %v server: %v", err, signServer)
|
||||||
return nil, err
|
return nil, nil, nil, err
|
||||||
}
|
}
|
||||||
sign, err := hex.DecodeString(gjson.GetBytes(response, "result").String())
|
sign, _ = hex.DecodeString(gjson.GetBytes(response, "data.sign").String())
|
||||||
if err != nil || len(sign) == 0 {
|
extra, _ = hex.DecodeString(gjson.GetBytes(response, "data.extra").String())
|
||||||
log.Errorf("获取T544时出现问题: %v", err)
|
token, _ = hex.DecodeString(gjson.GetBytes(response, "data.token").String())
|
||||||
return nil, err
|
return sign, extra, token, nil
|
||||||
}
|
|
||||||
log.Debugf("t544 sign result: %x", sign)
|
|
||||||
return sign, nil
|
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ import (
|
|||||||
|
|
||||||
"github.com/Mrs4s/MiraiGo/binary"
|
"github.com/Mrs4s/MiraiGo/binary"
|
||||||
"github.com/Mrs4s/MiraiGo/client"
|
"github.com/Mrs4s/MiraiGo/client"
|
||||||
|
"github.com/Mrs4s/MiraiGo/wrapper"
|
||||||
para "github.com/fumiama/go-hide-param"
|
para "github.com/fumiama/go-hide-param"
|
||||||
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
|
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
@ -163,6 +164,14 @@ func LoginInteract() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if base.SignServer != "-" && base.SignServer != "" {
|
||||||
|
log.Infof("使用服务器 %s 进行数据包签名", base.SignServer)
|
||||||
|
wrapper.DandelionEnergy = energy
|
||||||
|
wrapper.FekitGetSign = sign
|
||||||
|
} else {
|
||||||
|
log.Warnf("警告: 未配置签名服务器, 这可能会导致登录 45 错误码或发送消息被风控")
|
||||||
|
}
|
||||||
|
|
||||||
if base.Account.Encrypt {
|
if base.Account.Encrypt {
|
||||||
if !global.PathExists("password.encrypt") {
|
if !global.PathExists("password.encrypt") {
|
||||||
if base.Account.Password == "" {
|
if base.Account.Password == "" {
|
||||||
|
2
go.mod
2
go.mod
@ -5,7 +5,7 @@ go 1.20
|
|||||||
require (
|
require (
|
||||||
github.com/FloatTech/sqlite v1.5.7
|
github.com/FloatTech/sqlite v1.5.7
|
||||||
github.com/Microsoft/go-winio v0.6.0
|
github.com/Microsoft/go-winio v0.6.0
|
||||||
github.com/Mrs4s/MiraiGo v0.0.0-20230401072048-f8d9841755b5
|
github.com/Mrs4s/MiraiGo v0.0.0-20230627090859-19e3d172596e
|
||||||
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e
|
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e
|
||||||
github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc
|
github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc
|
||||||
github.com/fumiama/go-base16384 v1.6.1
|
github.com/fumiama/go-base16384 v1.6.1
|
||||||
|
11
go.sum
11
go.sum
@ -4,8 +4,8 @@ github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJG
|
|||||||
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs=
|
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs=
|
||||||
github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
|
github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
|
||||||
github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
|
github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
|
||||||
github.com/Mrs4s/MiraiGo v0.0.0-20230401072048-f8d9841755b5 h1:E4fIQ0l/LNZK44NjdViRb/hx4cIeHXyQFPzzkx7cjVE=
|
github.com/Mrs4s/MiraiGo v0.0.0-20230627090859-19e3d172596e h1:99itMjI//+KaFF0+0QCBg/uHhGMJ99jG2lP6z/UnOsU=
|
||||||
github.com/Mrs4s/MiraiGo v0.0.0-20230401072048-f8d9841755b5/go.mod h1:mU3fBFU+7eO0kaGes7YRKtzIDtwIU84nSSwTV7NK2b0=
|
github.com/Mrs4s/MiraiGo v0.0.0-20230627090859-19e3d172596e/go.mod h1:mU3fBFU+7eO0kaGes7YRKtzIDtwIU84nSSwTV7NK2b0=
|
||||||
github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d h1:/Xuj3fIiMY2ls1TwvPKmaqQrtJsPY+c9s+0lOScVHd8=
|
github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d h1:/Xuj3fIiMY2ls1TwvPKmaqQrtJsPY+c9s+0lOScVHd8=
|
||||||
github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA=
|
github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA=
|
||||||
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e h1:wR3MXQ3VbUlPKOOUwLOYgh/QaJThBTYtsl673O3lqSA=
|
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e h1:wR3MXQ3VbUlPKOOUwLOYgh/QaJThBTYtsl673O3lqSA=
|
||||||
@ -31,7 +31,6 @@ github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:x
|
|||||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||||
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
|
|
||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
||||||
@ -44,7 +43,6 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
|||||||
github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=
|
github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=
|
||||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg=
|
github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg=
|
||||||
github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
|
github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
|
||||||
@ -54,7 +52,6 @@ github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQ
|
|||||||
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw=
|
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
@ -96,7 +93,6 @@ github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0
|
|||||||
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
|
|
||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
@ -124,7 +120,6 @@ github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCO
|
|||||||
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
|
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
|
||||||
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
|
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
|
||||||
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
|
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
|
||||||
github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE=
|
|
||||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
go.mongodb.org/mongo-driver v1.11.0 h1:FZKhBSTydeuffHj9CBjXlR8vQLee1cQyTWYPA6/tqiE=
|
go.mongodb.org/mongo-driver v1.11.0 h1:FZKhBSTydeuffHj9CBjXlR8vQLee1cQyTWYPA6/tqiE=
|
||||||
go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8=
|
go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8=
|
||||||
@ -201,13 +196,11 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ
|
|||||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
|
|
||||||
gopkg.ilharper.com/x/isatty v1.1.1 h1:RAg32Pxq/nIK4AVtdm9RBqxsxZZX1uRKRSS21E5SHMk=
|
gopkg.ilharper.com/x/isatty v1.1.1 h1:RAg32Pxq/nIK4AVtdm9RBqxsxZZX1uRKRSS21E5SHMk=
|
||||||
gopkg.ilharper.com/x/isatty v1.1.1/go.mod h1:ofpv77Td5qQO6R1dmDd3oNt8TZdRo+l5gYAMxopRyS0=
|
gopkg.ilharper.com/x/isatty v1.1.1/go.mod h1:ofpv77Td5qQO6R1dmDd3oNt8TZdRo+l5gYAMxopRyS0=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||||
|
@ -38,7 +38,7 @@ var (
|
|||||||
FastStart bool // 是否为快速启动
|
FastStart bool // 是否为快速启动
|
||||||
AllowTempSession bool // 是否允许发送临时会话信息
|
AllowTempSession bool // 是否允许发送临时会话信息
|
||||||
UpdateProtocol bool // 是否更新协议
|
UpdateProtocol bool // 是否更新协议
|
||||||
SignServerOverwrite string // 使用特定的服务器进行签名
|
SignServer string // 使用特定的服务器进行签名
|
||||||
HTTPTimeout int
|
HTTPTimeout int
|
||||||
|
|
||||||
PostFormat string // 上报格式 string or array
|
PostFormat string // 上报格式 string or array
|
||||||
@ -64,7 +64,6 @@ func Parse() {
|
|||||||
d := flag.Bool("D", false, "debug mode")
|
d := flag.Bool("D", false, "debug mode")
|
||||||
flag.BoolVar(&FastStart, "faststart", false, "skip waiting 5 seconds")
|
flag.BoolVar(&FastStart, "faststart", false, "skip waiting 5 seconds")
|
||||||
flag.BoolVar(&UpdateProtocol, "update-protocol", false, "update protocol")
|
flag.BoolVar(&UpdateProtocol, "update-protocol", false, "update protocol")
|
||||||
flag.StringVar(&SignServerOverwrite, "sign-server", "", "use special server to sign tlv")
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
if *d {
|
if *d {
|
||||||
@ -89,6 +88,7 @@ func Init() {
|
|||||||
ReportSelfMessage = conf.Message.ReportSelfMessage
|
ReportSelfMessage = conf.Message.ReportSelfMessage
|
||||||
UseSSOAddress = conf.Account.UseSSOAddress
|
UseSSOAddress = conf.Account.UseSSOAddress
|
||||||
AllowTempSession = conf.Account.AllowTempSession
|
AllowTempSession = conf.Account.AllowTempSession
|
||||||
|
SignServer = conf.Account.SignServer
|
||||||
HTTPTimeout = conf.Message.HTTPTimeout
|
HTTPTimeout = conf.Message.HTTPTimeout
|
||||||
}
|
}
|
||||||
{ // others
|
{ // others
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
package encryption
|
|
||||||
|
|
||||||
var T544Signer = map[string]func(int64, []byte) []byte{}
|
|
File diff suppressed because one or more lines are too long
@ -1,65 +0,0 @@
|
|||||||
//go:build amd64
|
|
||||||
|
|
||||||
package t544
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/binary"
|
|
||||||
"hash/crc32"
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
var crc32Table = func() (tab crc32.Table) {
|
|
||||||
f, err := cryptoZip.Open("crc32.bin")
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
data, err := io.ReadAll(f)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
for i := range tab {
|
|
||||||
tab[i] = binary.LittleEndian.Uint32(data[i*4 : (i+1)*4])
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}()
|
|
||||||
|
|
||||||
//go:noescape
|
|
||||||
func tencentCrc32(tab *crc32.Table, b []byte) uint32
|
|
||||||
|
|
||||||
//go:noescape
|
|
||||||
func sub_a([]byte, []uint32)
|
|
||||||
|
|
||||||
//go:noescape
|
|
||||||
func sub_b([]byte, []uint32)
|
|
||||||
|
|
||||||
//go:noescape
|
|
||||||
func sub_c(*[16][16]byte, []byte)
|
|
||||||
|
|
||||||
//go:noescape
|
|
||||||
func sub_d(*[16]byte, []byte)
|
|
||||||
|
|
||||||
//go:noescape
|
|
||||||
func sub_e(*[256][6]byte, []byte)
|
|
||||||
|
|
||||||
//go:noescape
|
|
||||||
func sub_f(*[16]byte, *[15]uint32, *[16][16]byte) (w [44]uint32)
|
|
||||||
|
|
||||||
//go:noescape
|
|
||||||
func sub_aa(int, *[16][2][16][16]byte, *[16]byte, []byte) byte
|
|
||||||
|
|
||||||
// transformInner see com/tencent/mobileqq/dt/model/FEBound
|
|
||||||
//
|
|
||||||
//go:noescape
|
|
||||||
func transformInner(*[0x15]byte, *[32][16]byte)
|
|
||||||
|
|
||||||
//go:noescape
|
|
||||||
func initState(*state, []byte, []byte, uint64)
|
|
||||||
|
|
||||||
func (c *state) init(key []byte, data []byte, counter uint64, nr uint8) {
|
|
||||||
c.nr = nr
|
|
||||||
c.p = 0
|
|
||||||
initState(c, key, data, counter)
|
|
||||||
}
|
|
||||||
|
|
||||||
//go:noescape
|
|
||||||
func refreshState(c *state)
|
|
@ -1,669 +0,0 @@
|
|||||||
//go:build amd64
|
|
||||||
// +build amd64
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
DATA LC0<>+0(SB)/4, $1634760805
|
|
||||||
DATA LC0<>+4(SB)/4, $857760878
|
|
||||||
DATA LC0<>+8(SB)/4, $2036477234
|
|
||||||
DATA LC0<>+12(SB)/4, $1797285236
|
|
||||||
GLOBL LC0<>(SB), NOPTR, $16
|
|
||||||
|
|
||||||
TEXT ·sub_a(SB), NOSPLIT, $0-48
|
|
||||||
MOVQ a+0(FP), DI
|
|
||||||
MOVQ b+24(FP), CX
|
|
||||||
MOVQ CX, DX
|
|
||||||
MOVBLZX 3(CX), CX
|
|
||||||
XORB CX, (DI)
|
|
||||||
MOVBLZX 2(DX), CX
|
|
||||||
XORB CX, 1(DI)
|
|
||||||
MOVBLZX 1(DX), CX
|
|
||||||
XORB CX, 2(DI)
|
|
||||||
MOVBLZX (DX), CX
|
|
||||||
XORB CX, 3(DI)
|
|
||||||
MOVBLZX 7(DX), CX
|
|
||||||
XORB CX, 4(DI)
|
|
||||||
MOVBLZX 6(DX), CX
|
|
||||||
XORB CX, 5(DI)
|
|
||||||
MOVBLZX 5(DX), CX
|
|
||||||
XORB CX, 6(DI)
|
|
||||||
MOVBLZX 4(DX), CX
|
|
||||||
XORB CX, 7(DI)
|
|
||||||
MOVBLZX 11(DX),CX
|
|
||||||
XORB CX, 8(DI)
|
|
||||||
MOVBLZX 10(DX),CX
|
|
||||||
XORB CX, 9(DI)
|
|
||||||
MOVBLZX 9(DX), CX
|
|
||||||
XORB CX,10(DI)
|
|
||||||
MOVBLZX 8(DX), CX
|
|
||||||
XORB CX,11(DI)
|
|
||||||
MOVBLZX 15(DX),CX
|
|
||||||
XORB CX,12(DI)
|
|
||||||
MOVBLZX 14(DX),CX
|
|
||||||
XORB CX,13(DI)
|
|
||||||
MOVBLZX 13(DX),CX
|
|
||||||
XORB CX,14(DI)
|
|
||||||
MOVBLZX 12(DX),DX
|
|
||||||
XORB DL,15(DI)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·sub_b(SB), NOSPLIT, $0-48
|
|
||||||
MOVQ a+0(FP), DI
|
|
||||||
MOVQ b+24(FP), CX
|
|
||||||
MOVQ CX, DX
|
|
||||||
MOVBLZX 3(CX), CX
|
|
||||||
XORB CX, (DI)
|
|
||||||
MOVBLZX 6(DX), CX
|
|
||||||
XORB CX, 1(DI)
|
|
||||||
MOVBLZX 9(DX), CX
|
|
||||||
XORB CX, 2(DI)
|
|
||||||
MOVBLZX 12(DX),CX
|
|
||||||
XORB CX, 3(DI)
|
|
||||||
MOVBLZX 7(DX), CX
|
|
||||||
XORB CX, 4(DI)
|
|
||||||
MOVBLZX 10(DX),CX
|
|
||||||
XORB CX, 5(DI)
|
|
||||||
MOVBLZX 13(DX),CX
|
|
||||||
XORB CX, 6(DI)
|
|
||||||
MOVBLZX (DX), CX
|
|
||||||
XORB CX,7(DI)
|
|
||||||
MOVBLZX 11(DX),CX
|
|
||||||
XORB CX,8(DI)
|
|
||||||
MOVBLZX 14(DX),CX
|
|
||||||
XORB CX,9(DI)
|
|
||||||
MOVBLZX 1(DX), CX
|
|
||||||
XORB CX,10(DI)
|
|
||||||
MOVBLZX 4(DX), CX
|
|
||||||
XORB CX,11(DI)
|
|
||||||
MOVBLZX 15(DX),CX
|
|
||||||
XORB CX,12(DI)
|
|
||||||
MOVBLZX 2(DX), CX
|
|
||||||
XORB CX,13(DI)
|
|
||||||
MOVBLZX 5(DX), CX
|
|
||||||
XORB CX,14(DI)
|
|
||||||
MOVBLZX 8(DX), DX
|
|
||||||
XORB DL,15(DI)
|
|
||||||
RET
|
|
||||||
|
|
||||||
|
|
||||||
TEXT ·sub_c(SB), NOSPLIT, $0-32
|
|
||||||
MOVQ a+0(FP), DI
|
|
||||||
MOVQ b+8(FP), SI
|
|
||||||
MOVQ SI, AX
|
|
||||||
MOVBLZX (SI), SI
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 1(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, (AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 2(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 1(AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 3(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 2(AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 4(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 3(AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 5(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 4(AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 6(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 5(AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 7(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 6(AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 8(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 7(AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 9(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 8(AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 10(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 9(AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 11(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 10(AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 12(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 11(AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 13(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 12(AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 14(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 13(AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX 15(AX), SI
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 14(AX)
|
|
||||||
MOVL SI, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
SHRL $4, CX
|
|
||||||
SHLL $4, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVLQSX CX, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
MOVB CX, 15(AX)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·sub_d(SB), NOSPLIT, $24-32
|
|
||||||
MOVQ t+0(FP), BX
|
|
||||||
MOVQ s+8(FP), DI
|
|
||||||
MOVOU (DI), X0
|
|
||||||
MOVOU X0, in-16(SP)
|
|
||||||
MOVQ $16, CX
|
|
||||||
ADDQ $15, DI
|
|
||||||
PUSHFQ
|
|
||||||
STD
|
|
||||||
lop:
|
|
||||||
LEAQ -1(CX), AX
|
|
||||||
XLAT
|
|
||||||
LEAQ in-16(SP)(AX*1), SI
|
|
||||||
MOVSB
|
|
||||||
LOOP lop
|
|
||||||
POPFQ
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·sub_e(SB), NOSPLIT, $0-32
|
|
||||||
MOVQ a+0(FP), DI
|
|
||||||
MOVQ n+8(FP), SI
|
|
||||||
MOVQ $4, AX
|
|
||||||
lop:
|
|
||||||
MOVBQZX -4(SI)(AX*4), DX
|
|
||||||
MOVBQZX -3(SI)(AX*4), CX
|
|
||||||
MOVBQZX -2(SI)(AX*4), R10
|
|
||||||
MOVBQZX -1(SI)(AX*4), R8
|
|
||||||
LEAQ (DX)(DX*2), R9
|
|
||||||
LEAQ (R9*2), R9
|
|
||||||
LEAQ (CX)(CX*2), R11
|
|
||||||
LEAQ (R11*2), R11
|
|
||||||
LEAQ (R10)(R10*2), BX
|
|
||||||
LEAQ (BX*2), BX
|
|
||||||
MOVB DX, R13
|
|
||||||
XORB CX, DX
|
|
||||||
XORB R10, CX
|
|
||||||
MOVB (DI)(R9*1), R12
|
|
||||||
XORB 1(DI)(R11*1), R12
|
|
||||||
XORB R8, R10
|
|
||||||
XORB R12, R10
|
|
||||||
MOVB R10, -4(SI)(AX*4)
|
|
||||||
MOVB (DI)(R11*1), R10
|
|
||||||
XORB 1(DI)(BX*1), R10
|
|
||||||
XORB R8, R13
|
|
||||||
XORB R10, R13
|
|
||||||
MOVB R13, -3(SI)(AX*4)
|
|
||||||
MOVB (DI)(BX*1), R10
|
|
||||||
LEAQ (R8)(R8*2), R8
|
|
||||||
LEAQ (R8*2), R8
|
|
||||||
XORB 1(DI)(R8*1), R10
|
|
||||||
XORB R10, DX
|
|
||||||
MOVB DX, -2(SI)(AX*4)
|
|
||||||
MOVB 1(DI)(R9*1), DX
|
|
||||||
XORB (DI)(R8*1), DX
|
|
||||||
XORB DX, CX
|
|
||||||
MOVB CX, -1(SI)(AX*4)
|
|
||||||
DECB AX
|
|
||||||
JNZ lop
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT sub_ab<>(SB), NOSPLIT, $0-24
|
|
||||||
MOVQ s+0(FP), DI
|
|
||||||
MOVQ w+8(FP), SI
|
|
||||||
MOVL SI, AX
|
|
||||||
MOVL SI, CX
|
|
||||||
MOVL SI, DX
|
|
||||||
SHRL $28, AX
|
|
||||||
SHRL $24, CX
|
|
||||||
ANDL $15, CX
|
|
||||||
SALL $4, AX
|
|
||||||
ADDL CX, AX
|
|
||||||
MOVBLZX SI, CX
|
|
||||||
MOVBLZX (DI)(AX*1), AX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
SALL $24, AX
|
|
||||||
ORL CX, AX
|
|
||||||
MOVL SI, CX
|
|
||||||
SHRL $8, SI
|
|
||||||
SHRL $8, CX
|
|
||||||
ANDL $15, SI
|
|
||||||
ANDL $240, CX
|
|
||||||
ADDL SI, CX
|
|
||||||
MOVBLZX (DI)(CX*1), CX
|
|
||||||
SALL $8, CX
|
|
||||||
ORL CX, AX
|
|
||||||
MOVL DX, CX
|
|
||||||
SHRL $16, DX
|
|
||||||
SHRL $16, CX
|
|
||||||
ANDL $15, DX
|
|
||||||
ANDL $240, CX
|
|
||||||
ADDL CX, DX
|
|
||||||
MOVBLZX (DI)(DX*1), DX
|
|
||||||
SALL $16, DX
|
|
||||||
ORL DX, AX
|
|
||||||
MOVQ AX, retval+16(FP)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·sub_f(SB), NOSPLIT, $24-68
|
|
||||||
MOVQ k+0(FP), DI
|
|
||||||
MOVQ r+8(FP), SI
|
|
||||||
MOVQ s+16(FP), DX
|
|
||||||
MOVQ $w+24(FP), CX
|
|
||||||
MOVQ CX, R10
|
|
||||||
MOVQ SI, R9
|
|
||||||
MOVQ DX, R8
|
|
||||||
MOVL $4, BX
|
|
||||||
MOVL (DI), AX
|
|
||||||
BSWAPL AX
|
|
||||||
MOVL AX, (CX)
|
|
||||||
MOVL 4(DI), AX
|
|
||||||
BSWAPL AX
|
|
||||||
MOVL AX, 4(CX)
|
|
||||||
MOVL 8(DI), AX
|
|
||||||
BSWAPL AX
|
|
||||||
MOVL AX, 8(CX)
|
|
||||||
MOVL 12(DI), AX
|
|
||||||
BSWAPL AX
|
|
||||||
MOVL AX, 12(CX)
|
|
||||||
JMP inner
|
|
||||||
for:
|
|
||||||
XORL -16(R10)(BX*4), AX
|
|
||||||
MOVL AX, (R10)(BX*4)
|
|
||||||
ADDQ $1, BX
|
|
||||||
CMPQ BX, $44
|
|
||||||
JE end
|
|
||||||
inner:
|
|
||||||
MOVL -4(R10)(BX*4), AX
|
|
||||||
TESTB $3, BX
|
|
||||||
JNE for
|
|
||||||
ROLL $8, AX
|
|
||||||
MOVQ R8, 0(SP)
|
|
||||||
MOVL AX, 8(SP)
|
|
||||||
CALL sub_ab<>(SB)
|
|
||||||
MOVQ 16(SP), AX
|
|
||||||
LEAL -1(BX), DX
|
|
||||||
SARL $2, DX
|
|
||||||
MOVLQSX DX, DX
|
|
||||||
XORL (R9)(DX*4), AX
|
|
||||||
JMP for
|
|
||||||
end:
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·sub_aa(SB), NOSPLIT, $0-56
|
|
||||||
MOVQ i+0(FP), DI
|
|
||||||
MOVQ t+8(FP), SI
|
|
||||||
MOVQ b+16(FP), DX
|
|
||||||
MOVQ m+24(FP), CX
|
|
||||||
MOVL DI, AX
|
|
||||||
MOVLQSX DI, DI
|
|
||||||
MOVQ SI, R8
|
|
||||||
MOVQ DX, SI
|
|
||||||
MOVBLZX (CX)(DI*1), CX
|
|
||||||
ANDL $15, AX
|
|
||||||
MOVBLZX (SI)(AX*1), SI
|
|
||||||
MOVQ AX, DX
|
|
||||||
MOVL CX, AX
|
|
||||||
SALQ $9, DX
|
|
||||||
ANDL $15, CX
|
|
||||||
SHRB $4, AX
|
|
||||||
MOVL SI, DI
|
|
||||||
ADDQ R8, DX
|
|
||||||
SALQ $4, CX
|
|
||||||
ANDL $15, AX
|
|
||||||
SHRB $4, DI
|
|
||||||
ANDL $15, SI
|
|
||||||
SALQ $4, AX
|
|
||||||
ANDL $15, DI
|
|
||||||
ADDQ DX, AX
|
|
||||||
ADDQ CX, DX
|
|
||||||
MOVBLZX (AX)(DI*1), AX
|
|
||||||
SALL $4, AX
|
|
||||||
ORB 256(SI)(DX*1), AX
|
|
||||||
MOVQ AX, retval+48(FP)
|
|
||||||
RET
|
|
||||||
|
|
||||||
// func transformInner(x *[0x15]byte, tab *[32][16]byte)
|
|
||||||
TEXT ·transformInner(SB), NOSPLIT, $0-16
|
|
||||||
MOVQ x+0(FP), DI
|
|
||||||
MOVQ tab+8(FP), SI
|
|
||||||
MOVQ DI, AX
|
|
||||||
MOVL $1, CX
|
|
||||||
MOVQ SI, DI
|
|
||||||
MOVQ AX, SI
|
|
||||||
lop:
|
|
||||||
MOVBLZX (SI), R8
|
|
||||||
LEAL -1(CX), AX
|
|
||||||
ADDQ $1, SI
|
|
||||||
ANDL $31, AX
|
|
||||||
MOVL R8, DX
|
|
||||||
SALL $4, AX
|
|
||||||
ANDL $15, R8
|
|
||||||
SHRB $4, DX
|
|
||||||
MOVBLZX DX, DX
|
|
||||||
ADDL DX, AX
|
|
||||||
CDQE
|
|
||||||
MOVBLSX (DI)(AX*1), AX
|
|
||||||
SALL $4, AX
|
|
||||||
MOVL AX, DX
|
|
||||||
MOVL CX, AX
|
|
||||||
ADDL $2, CX
|
|
||||||
ANDL $31, AX
|
|
||||||
SALL $4, AX
|
|
||||||
ADDL R8, AX
|
|
||||||
CDQE
|
|
||||||
ORB (DI)(AX*1), DX
|
|
||||||
MOVB DX, -1(SI)
|
|
||||||
CMPL CX, $43
|
|
||||||
JNE lop
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·initState(SB), NOSPLIT, $0-64
|
|
||||||
MOVQ c+0(FP), DI
|
|
||||||
MOVQ key+8(FP), SI
|
|
||||||
MOVQ data+32(FP), R8
|
|
||||||
MOVQ counter+56(FP), AX
|
|
||||||
MOVOA LC0<>(SB), X0
|
|
||||||
MOVUPS X0, (DI)
|
|
||||||
MOVOU (SI), X1
|
|
||||||
MOVOU (DI), X3
|
|
||||||
MOVUPS X1, 16(DI)
|
|
||||||
MOVOU 16(SI), X2
|
|
||||||
MOVQ AX, 48(DI)
|
|
||||||
MOVUPS X2, 32(DI)
|
|
||||||
MOVQ (R8), AX
|
|
||||||
MOVUPS X3, 64(DI)
|
|
||||||
MOVQ AX, 56(DI)
|
|
||||||
MOVQ 48(DI), AX
|
|
||||||
MOVUPS X1, 80(DI)
|
|
||||||
MOVUPS X2, 96(DI)
|
|
||||||
MOVUPS X6,112(DI)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT sub_ad<>(SB), NOSPLIT, $8-8
|
|
||||||
MOVQ a+0(FP), DI
|
|
||||||
MOVQ DI, AX
|
|
||||||
MOVL 40(DI), R10
|
|
||||||
MOVL 12(DI), R12
|
|
||||||
MOVL 44(DI), BP
|
|
||||||
MOVL 16(DI), DX
|
|
||||||
MOVL (DI), R15
|
|
||||||
MOVL 48(DI), R9
|
|
||||||
MOVL 20(DI), SI
|
|
||||||
MOVL 32(DI), R11
|
|
||||||
ADDL DX, R15
|
|
||||||
MOVL 4(DI), R14
|
|
||||||
MOVL 52(DI), R8
|
|
||||||
XORL R15, R9
|
|
||||||
MOVL 24(DI), CX
|
|
||||||
MOVL 8(DI), R13
|
|
||||||
ROLL $16, R9
|
|
||||||
ADDL SI, R14
|
|
||||||
MOVL 36(DI), BX
|
|
||||||
MOVL 56(DI), DI
|
|
||||||
ADDL R9, R11
|
|
||||||
XORL R14, R8
|
|
||||||
ADDL CX, R13
|
|
||||||
XORL R11, DX
|
|
||||||
ROLL $16, R8
|
|
||||||
XORL R13, DI
|
|
||||||
ROLL $12, DX
|
|
||||||
ADDL R8, BX
|
|
||||||
ROLL $16, DI
|
|
||||||
ADDL DX, R15
|
|
||||||
XORL BX, SI
|
|
||||||
ADDL DI, R10
|
|
||||||
XORL R15, R9
|
|
||||||
ROLL $12, SI
|
|
||||||
XORL R10, CX
|
|
||||||
ROLL $8, R9
|
|
||||||
ADDL SI, R14
|
|
||||||
ROLL $12, CX
|
|
||||||
ADDL R9, R11
|
|
||||||
XORL R14, R8
|
|
||||||
ADDL CX, R13
|
|
||||||
XORL R11, DX
|
|
||||||
ROLL $8, R8
|
|
||||||
XORL R13, DI
|
|
||||||
ROLL $7, DX
|
|
||||||
LEAL (BX)(R8*1), BX
|
|
||||||
ROLL $8, DI
|
|
||||||
MOVL DX, tmp0-8(SP)
|
|
||||||
MOVL 28(AX), DX
|
|
||||||
XORL BX, SI
|
|
||||||
MOVL BX, tmp1-4(SP)
|
|
||||||
MOVL R10, BX
|
|
||||||
MOVL 60(AX), R10
|
|
||||||
ROLL $7, SI
|
|
||||||
ADDL DI, BX
|
|
||||||
ADDL DX, R12
|
|
||||||
ADDL SI, R15
|
|
||||||
XORL R12, R10
|
|
||||||
XORL BX, CX
|
|
||||||
ROLL $16, R10
|
|
||||||
ROLL $7, CX
|
|
||||||
ADDL R10, BP
|
|
||||||
ADDL CX, R14
|
|
||||||
XORL BP, DX
|
|
||||||
XORL R14, R9
|
|
||||||
ROLL $12, DX
|
|
||||||
ROLL $16, R9
|
|
||||||
ADDL DX, R12
|
|
||||||
XORL R12, R10
|
|
||||||
ROLL $8, R10
|
|
||||||
ADDL R10, BP
|
|
||||||
XORL R15, R10
|
|
||||||
ROLL $16, R10
|
|
||||||
XORL BP, DX
|
|
||||||
ADDL R9, BP
|
|
||||||
ADDL R10, BX
|
|
||||||
ROLL $7, DX
|
|
||||||
XORL BP, CX
|
|
||||||
XORL BX, SI
|
|
||||||
ROLL $12, SI
|
|
||||||
ADDL SI, R15
|
|
||||||
XORL R15, R10
|
|
||||||
MOVL R15, (AX)
|
|
||||||
ROLL $8, R10
|
|
||||||
ADDL R10, BX
|
|
||||||
MOVL R10, 60(AX)
|
|
||||||
XORL BX, SI
|
|
||||||
MOVD BX, X1
|
|
||||||
ROLL $7, SI
|
|
||||||
ROLL $12, CX
|
|
||||||
ADDL DX, R13
|
|
||||||
XORL R13, R8
|
|
||||||
ADDL CX, R14
|
|
||||||
MOVL SI, 20(AX)
|
|
||||||
ROLL $16, R8
|
|
||||||
XORL R14, R9
|
|
||||||
MOVL R14, 4(AX)
|
|
||||||
ADDL R8, R11
|
|
||||||
ROLL $8, R9
|
|
||||||
XORL R11, DX
|
|
||||||
ADDL R9, BP
|
|
||||||
MOVL R9, 48(AX)
|
|
||||||
ROLL $12, DX
|
|
||||||
XORL BP, CX
|
|
||||||
MOVD BP, X2
|
|
||||||
ADDL DX, R13
|
|
||||||
ROLL $7, CX
|
|
||||||
PUNPCKLLQ X2, X1
|
|
||||||
XORL R13, R8
|
|
||||||
MOVL CX, 24(AX)
|
|
||||||
ROLL $8, R8
|
|
||||||
MOVL R13, 8(AX)
|
|
||||||
ADDL R8, R11
|
|
||||||
XORL R11, DX
|
|
||||||
MOVD R11, X0
|
|
||||||
ROLL $7, DX
|
|
||||||
MOVL DX, 28(AX)
|
|
||||||
MOVL R8, 52(AX)
|
|
||||||
MOVL tmp0-8(SP), SI
|
|
||||||
MOVL tmp1-4(SP), CX
|
|
||||||
ADDL SI, R12
|
|
||||||
XORL R12, DI
|
|
||||||
ROLL $16, DI
|
|
||||||
ADDL DI, CX
|
|
||||||
XORL CX, SI
|
|
||||||
MOVL SI, DX
|
|
||||||
ROLL $12, DX
|
|
||||||
ADDL DX, R12
|
|
||||||
XORL R12, DI
|
|
||||||
MOVL R12, 12(AX)
|
|
||||||
ROLL $8, DI
|
|
||||||
ADDL DI, CX
|
|
||||||
MOVL DI, 56(AX)
|
|
||||||
MOVD CX, X3
|
|
||||||
XORL CX, DX
|
|
||||||
PUNPCKLLQ X3, X0
|
|
||||||
ROLL $7, DX
|
|
||||||
PUNPCKLQDQ X1, X0
|
|
||||||
MOVL DX, 16(AX)
|
|
||||||
MOVUPS X0, 32(AX)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·refreshState(SB), NOSPLIT, $16-8
|
|
||||||
MOVQ i+0(FP), BX
|
|
||||||
MOVB 128(BX), CX
|
|
||||||
JE ad
|
|
||||||
SHRQ $1, CX
|
|
||||||
fr:
|
|
||||||
MOVQ BX, 0(SP)
|
|
||||||
MOVQ CX, c-8(SP)
|
|
||||||
CALL sub_ad<>(SB)
|
|
||||||
MOVQ c-8(SP), CX
|
|
||||||
MOVQ i+0(FP), BX
|
|
||||||
LOOP fr
|
|
||||||
ad:
|
|
||||||
MOVOU (BX), X0
|
|
||||||
MOVOU 64(BX), X1
|
|
||||||
MOVOU 80(BX), X2
|
|
||||||
MOVOU 96(BX), X3
|
|
||||||
PADDD X1, X0
|
|
||||||
MOVOU 48(BX), X4
|
|
||||||
MOVUPS X0, (BX)
|
|
||||||
MOVOU 16(BX), X0
|
|
||||||
PADDD X2, X0
|
|
||||||
MOVUPS X0, 16(BX)
|
|
||||||
MOVOU 32(BX), X0
|
|
||||||
PADDD X3, X0
|
|
||||||
MOVUPS X0, 32(BX)
|
|
||||||
MOVOU 112(BX), X0
|
|
||||||
PADDD X4, X0
|
|
||||||
MOVUPS X0, 48(BX)
|
|
||||||
RET
|
|
||||||
|
|
||||||
// func tencentCrc32(tab *crc32.Table, b []byte) uint32
|
|
||||||
TEXT ·tencentCrc32(SB), NOSPLIT, $0-40
|
|
||||||
MOVQ tab+0(FP), DI
|
|
||||||
MOVQ bptr+8(FP), SI
|
|
||||||
MOVQ bngas+16(FP), DX
|
|
||||||
TESTQ DX, DX
|
|
||||||
JE quickend
|
|
||||||
ADDQ SI, DX
|
|
||||||
MOVL $-1, AX
|
|
||||||
lop:
|
|
||||||
MOVBLZX (SI), CX
|
|
||||||
ADDQ $1, SI
|
|
||||||
XORL AX, CX
|
|
||||||
SHRL $8, AX
|
|
||||||
MOVBLZX CX, CX
|
|
||||||
XORL (DI)(CX*4), AX
|
|
||||||
CMPQ SI, DX
|
|
||||||
JNE lop
|
|
||||||
NOTL AX
|
|
||||||
MOVQ AX, bngas+32(FP)
|
|
||||||
RET
|
|
||||||
quickend:
|
|
||||||
XORL AX, AX
|
|
||||||
RET
|
|
||||||
|
|
@ -1,112 +0,0 @@
|
|||||||
//go:build amd64
|
|
||||||
|
|
||||||
package t544
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/binary"
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
type encryptionData struct {
|
|
||||||
tableA [16][2][16][16]byte
|
|
||||||
tableB [16][16]byte
|
|
||||||
tableC [256][6]byte
|
|
||||||
tableD [16]byte
|
|
||||||
tableE [16]byte
|
|
||||||
tableF [15]uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
type state struct {
|
|
||||||
state [16]uint32 // 16
|
|
||||||
orgstate [16]uint32 // 16
|
|
||||||
nr uint8
|
|
||||||
p uint8
|
|
||||||
}
|
|
||||||
|
|
||||||
var crypto = encryptionData{
|
|
||||||
tableA: readData[[16][2][16][16]byte]("table_a.bin"),
|
|
||||||
tableB: readData[[16][16]byte]("table_b.bin"),
|
|
||||||
tableC: readData[[256][6]byte]("table_c.bin"),
|
|
||||||
tableD: readData[[16]byte]("table_d.bin"),
|
|
||||||
tableE: readData[[16]byte]("table_e.bin"),
|
|
||||||
tableF: func() (tab [15]uint32) {
|
|
||||||
f, err := cryptoZip.Open("table_f.bin")
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
data, err := io.ReadAll(f)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
for i := range tab {
|
|
||||||
tab[i] = binary.LittleEndian.Uint32(data[i*4 : (i+1)*4])
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}(),
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encryptionData) tencentEncryptB(p1 []byte, p2 []uint32) {
|
|
||||||
const c = 10
|
|
||||||
for r := 0; r < 9; r++ {
|
|
||||||
sub_d(&e.tableD, p1)
|
|
||||||
sub_b(p1, p2[r*4:(r+1)*4])
|
|
||||||
sub_c(&e.tableB, p1)
|
|
||||||
sub_e(&e.tableC, p1)
|
|
||||||
}
|
|
||||||
sub_d(&e.tableD, p1)
|
|
||||||
sub_b(p1, p2[(c-1)*4:c*4])
|
|
||||||
sub_c(&e.tableB, p1)
|
|
||||||
sub_a(p1, p2[c*4:(c+1)*4])
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encryptionData) tencentEncryptionB(c []byte, m []byte) (out [0x15]byte) {
|
|
||||||
var buf [16]byte
|
|
||||||
w := sub_f(&e.tableE, &e.tableF, &e.tableB)
|
|
||||||
|
|
||||||
for i := range out {
|
|
||||||
if (i & 0xf) == 0 {
|
|
||||||
copy(buf[:], c)
|
|
||||||
e.tencentEncryptB(buf[:], w[:])
|
|
||||||
for j := 15; j >= 0; j-- {
|
|
||||||
c[j]++
|
|
||||||
if c[j] != 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out[i] = sub_aa(i, &e.tableA, &buf, m)
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func tencentEncryptionA(input, key, data []byte) {
|
|
||||||
var s state
|
|
||||||
s.init(key, data, 0, 20)
|
|
||||||
s.encrypt(input)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *state) encrypt(data []byte) {
|
|
||||||
bp := 0
|
|
||||||
dataLen := uint32(len(data))
|
|
||||||
for dataLen > 0 {
|
|
||||||
if c.p == 0 {
|
|
||||||
refreshState(c)
|
|
||||||
}
|
|
||||||
var sb [16 * 4]byte
|
|
||||||
for i, v := range c.state {
|
|
||||||
binary.LittleEndian.PutUint32(sb[i*4:(i+1)*4], v)
|
|
||||||
}
|
|
||||||
for c.p != 64 && dataLen != 0 {
|
|
||||||
data[bp] ^= sb[c.p]
|
|
||||||
c.p++
|
|
||||||
bp++
|
|
||||||
dataLen--
|
|
||||||
}
|
|
||||||
if c.p >= 64 {
|
|
||||||
c.p = 0
|
|
||||||
c.orgstate[12]++
|
|
||||||
c.state = c.orgstate
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,91 +0,0 @@
|
|||||||
//go:build amd64
|
|
||||||
|
|
||||||
package t544
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/md5"
|
|
||||||
"crypto/rc4"
|
|
||||||
"encoding/binary"
|
|
||||||
"math/rand"
|
|
||||||
|
|
||||||
"github.com/Mrs4s/go-cqhttp/internal/encryption"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
keyTable = "$%&()+,-456789:?ABCDEEFGHIJabcdefghijkopqrstuvwxyz"
|
|
||||||
table2 = "!#$%&)+.0123456789:=>?@ABCDEFGKMNabcdefghijkopqrst"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
magic = uint64(0x6EEDCF0DC4675540)
|
|
||||||
key1 = [8]byte{'a', '$', '(', 'e', 'T', '7', '*', '@'}
|
|
||||||
key2 = [8]byte{'&', 'O', '9', '!', '>', '6', 'X', ')'}
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
encryption.T544Signer["8.9.35.10440"] = sign
|
|
||||||
encryption.T544Signer["8.9.38.10545"] = sign
|
|
||||||
}
|
|
||||||
|
|
||||||
// sign t544 algorithm
|
|
||||||
// special thanks to the anonymous contributor who provided the algorithm
|
|
||||||
func sign(curr int64, input []byte) []byte {
|
|
||||||
var crcData [0x15]byte
|
|
||||||
curr %= 1000000
|
|
||||||
binary.BigEndian.PutUint32(crcData[:4], uint32(curr))
|
|
||||||
input = append(input, crcData[:4]...)
|
|
||||||
var kt [4 + 32 + 4]byte
|
|
||||||
r := rand.New(rand.NewSource(curr))
|
|
||||||
for i := 0; i < 2; i++ {
|
|
||||||
kt[i] = keyTable[r.Int()%0x32] + 50
|
|
||||||
}
|
|
||||||
kt[2] = kt[1] + 20
|
|
||||||
kt[3] = kt[2] + 20
|
|
||||||
key3 := kt[4 : 4+10]
|
|
||||||
k3calc := key3[2:10]
|
|
||||||
copy(k3calc, key1[:4])
|
|
||||||
for i := 0; i < 4; i++ {
|
|
||||||
k3calc[4+i] = key2[i] ^ kt[i]
|
|
||||||
}
|
|
||||||
key3[0], key3[1] = k3calc[6], k3calc[7]
|
|
||||||
key3 = key3[:8]
|
|
||||||
k3calc[6], k3calc[7] = 0, 0
|
|
||||||
rc4Cipher, _ := rc4.NewCipher(key3)
|
|
||||||
rc4Cipher.XORKeyStream(key3, key3)
|
|
||||||
binary.LittleEndian.PutUint64(crcData[4:4+8], magic)
|
|
||||||
tencentEncryptionA(input, kt[4:4+32], crcData[4:4+8])
|
|
||||||
result := md5.Sum(input)
|
|
||||||
crcData[2] = 1
|
|
||||||
crcData[4] = 1
|
|
||||||
copy(crcData[5:9], kt[:4])
|
|
||||||
binary.BigEndian.PutUint32(crcData[9:13], uint32(curr))
|
|
||||||
copy(crcData[13:], result[:8])
|
|
||||||
calcCrc := tencentCrc32(&crc32Table, crcData[2:])
|
|
||||||
binary.LittleEndian.PutUint32(kt[4+32:4+32+4], calcCrc)
|
|
||||||
crcData[0] = kt[4+32]
|
|
||||||
crcData[1] = kt[4+32+3]
|
|
||||||
nonce := uint32(r.Int() ^ r.Int() ^ r.Int())
|
|
||||||
on := kt[:16]
|
|
||||||
binary.BigEndian.PutUint32(on[:4], nonce)
|
|
||||||
copy(on[4:8], on[:4])
|
|
||||||
copy(on[8:16], on[:8])
|
|
||||||
ts.transformEncode(&crcData)
|
|
||||||
encryptedData := crypto.tencentEncryptionB(on, crcData[:])
|
|
||||||
ts.transformDecode(&encryptedData)
|
|
||||||
output := kt[:39]
|
|
||||||
output[0] = 0x0C
|
|
||||||
output[1] = 0x05
|
|
||||||
binary.BigEndian.PutUint32(output[2:6], nonce)
|
|
||||||
copy(output[6:27], encryptedData[:])
|
|
||||||
binary.LittleEndian.PutUint32(output[27:31], 0)
|
|
||||||
output[31] = table2[r.Int()%0x32]
|
|
||||||
output[32] = table2[r.Int()%0x32]
|
|
||||||
addition := r.Int() % 9
|
|
||||||
for addition&1 == 0 {
|
|
||||||
addition = r.Int() % 9
|
|
||||||
}
|
|
||||||
output[33] = output[31] + byte(addition)
|
|
||||||
output[34] = output[32] + byte(9-addition) + 1
|
|
||||||
binary.LittleEndian.PutUint32(output[35:39], 0)
|
|
||||||
return output
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
//go:build !amd64
|
|
||||||
|
|
||||||
package t544
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
package t544
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/rand"
|
|
||||||
"encoding/hex"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestT544(t *testing.T) {
|
|
||||||
r := hex.EncodeToString(sign(0, []byte{}))
|
|
||||||
if r != "0c05d28b405bce1595c70ffa694ff163d4b600f229482e07de32c8000000003525382c00000000" {
|
|
||||||
t.Fatal(r)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCrash(t *testing.T) {
|
|
||||||
brand := make([]byte, 4096)
|
|
||||||
for i := 1; i <= 1024; i++ {
|
|
||||||
rand.Reader.Read(brand)
|
|
||||||
sign(123, brand)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
//go:build amd64
|
|
||||||
|
|
||||||
package t544
|
|
||||||
|
|
||||||
type transformer struct {
|
|
||||||
encode [32][16]byte
|
|
||||||
decode [32][16]byte
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ts *transformer) transformEncode(bArr *[0x15]byte) {
|
|
||||||
transformInner(bArr, &ts.encode)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ts *transformer) transformDecode(bArr *[0x15]byte) {
|
|
||||||
transformInner(bArr, &ts.decode)
|
|
||||||
}
|
|
||||||
|
|
||||||
var ts = transformer{
|
|
||||||
encode: readData[[32][16]byte]("encode.bin"),
|
|
||||||
decode: readData[[32][16]byte]("decode.bin"),
|
|
||||||
}
|
|
@ -35,6 +35,7 @@ type Account struct {
|
|||||||
ReLogin *Reconnect `yaml:"relogin"`
|
ReLogin *Reconnect `yaml:"relogin"`
|
||||||
UseSSOAddress bool `yaml:"use-sso-address"`
|
UseSSOAddress bool `yaml:"use-sso-address"`
|
||||||
AllowTempSession bool `yaml:"allow-temp-session"`
|
AllowTempSession bool `yaml:"allow-temp-session"`
|
||||||
|
SignServer string `yaml:"sign-server"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config 总配置文件
|
// Config 总配置文件
|
||||||
|
@ -16,6 +16,15 @@ account: # 账号相关
|
|||||||
# 是否允许发送临时会话消息
|
# 是否允许发送临时会话消息
|
||||||
allow-temp-session: false
|
allow-temp-session: false
|
||||||
|
|
||||||
|
# 数据包的签名服务器
|
||||||
|
# 兼容 https://github.com/fuqiuluo/unidbg-fetch-qsign
|
||||||
|
# 如果遇到 登录 45 错误, 或者发送信息风控的话需要填入一个服务器
|
||||||
|
# 示例:
|
||||||
|
# sign-server: 'http://127.0.0.1:8080' # 本地签名服务器
|
||||||
|
# sign-server: 'https://signserver.example.com' # 线上签名服务器
|
||||||
|
# 服务器可使用docker在本地搭建或者使用他人开放的服务
|
||||||
|
sign-server: '-'
|
||||||
|
|
||||||
heartbeat:
|
heartbeat:
|
||||||
# 心跳频率, 单位秒
|
# 心跳频率, 单位秒
|
||||||
# -1 为关闭心跳
|
# -1 为关闭心跳
|
||||||
|
Loading…
x
Reference in New Issue
Block a user