From 746435cf3cc7578d406629c316858c696b2855cd Mon Sep 17 00:00:00 2001 From: huangxiaolei <1782360262@qq.com> Date: Mon, 28 Nov 2022 23:36:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E5=AF=86=E9=92=A5=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E9=9A=8F=E6=9C=BA=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/dispatch/key/dispatchKey.bin | Bin 4096 -> 0 bytes cmd/dispatch/key/dispatchSeed.bin | Bin 2076 -> 0 bytes cmd/dispatch/key/secretKey.bin | Bin 4096 -> 0 bytes cmd/dispatch/key/secretKeyBuffer.bin | 1 - cmd/gate/key/dispatchKey.bin | Bin 4096 -> 0 bytes cmd/gate/key/dispatchSeed.bin | Bin 2076 -> 0 bytes cmd/gate/key/secretKey.bin | Bin 4096 -> 0 bytes cmd/gate/key/secretKeyBuffer.bin | 1 - common/region/region.go | 24 ++---- dispatch/app/app.go | 15 ---- dispatch/controller/controller.go | 23 +++++- gate/app/app.go | 2 +- gate/forward/forward.go | 118 +++++++++++++++------------ gate/forward/login_hk4e.go | 33 +++++--- gate/mq/mq.go | 16 +++- gate/net/kcp_connect_manager.go | 35 ++------ gate/net/kcp_endecode.go | 4 +- gate/net/kcp_event.go | 23 ++++-- pkg/random/hk4e_ec2b.go | 8 +- pkg/random/hk4e_mt19937.go | 6 +- pkg/random/hk4e_test.go | 32 ++------ pkg/random/random.go | 4 + 22 files changed, 173 insertions(+), 172 deletions(-) delete mode 100644 cmd/dispatch/key/dispatchKey.bin delete mode 100644 cmd/dispatch/key/dispatchSeed.bin delete mode 100644 cmd/dispatch/key/secretKey.bin delete mode 100644 cmd/dispatch/key/secretKeyBuffer.bin delete mode 100644 cmd/gate/key/dispatchKey.bin delete mode 100644 cmd/gate/key/dispatchSeed.bin delete mode 100644 cmd/gate/key/secretKey.bin delete mode 100644 cmd/gate/key/secretKeyBuffer.bin diff --git a/cmd/dispatch/key/dispatchKey.bin b/cmd/dispatch/key/dispatchKey.bin deleted file mode 100644 index 29b396f149b177e92f9075ee299b93655d3057de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 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 diff --git a/cmd/dispatch/key/secretKey.bin b/cmd/dispatch/key/secretKey.bin deleted file mode 100644 index 0ff2db51aae64f90447ade405696c7d3a708c3d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 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 diff --git a/cmd/gate/key/secretKey.bin b/cmd/gate/key/secretKey.bin deleted file mode 100644 index 0ff2db51aae64f90447ade405696c7d3a708c3d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 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 headMeta convHeadMetaMap map[uint64]*ClientHeadMeta convHeadMetaMapLock sync.RWMutex - secretKeyBuffer []byte - kcpEventInput chan *net.KcpEvent - kcpEventOutput chan *net.KcpEvent - regionCurr *proto.QueryCurrRegionHttpRsp - signRsaKey []byte - encRsaKeyMap map[string][]byte + // kcpConv -> seed + convSeedMap map[uint64]uint64 + convSeedMapLock sync.RWMutex + kcpEventInput chan *net.KcpEvent + kcpEventOutput chan *net.KcpEvent + regionCurr *proto.QueryCurrRegionHttpRsp + signRsaKey []byte + encRsaKeyMap map[string][]byte } func NewForwardManager( @@ -70,6 +72,7 @@ func NewForwardManager( r.userIdConvMap = make(map[uint32]uint64) r.convAddrMap = make(map[uint64]string) r.convHeadMetaMap = make(map[uint64]*ClientHeadMeta) + r.convSeedMap = make(map[uint64]uint64) r.kcpEventInput = kcpEventInput r.kcpEventOutput = kcpEventOutput return r @@ -97,23 +100,21 @@ func (f *ForwardManager) kcpEventHandle() { EventId: net.KcpPacketSendListen, EventMessage: "Disable", } - // 登录成功 通知GS初始化相关数据 - userId, exist := f.getUserIdByConvId(event.ConvId) + seed, exist := f.getSeedByConvId(event.ConvId) if !exist { - logger.LOG.Error("can not find userId by convId") + logger.LOG.Error("can not find seed by convId") continue } - headMeta, exist := f.getHeadMetaByConvId(event.ConvId) - if !exist { - logger.LOG.Error("can not find client head metadata by convId") - continue + keyBlock := random.NewKeyBlock(seed) + xorKey := keyBlock.XorKey() + key := make([]byte, 4096) + copy(key, xorKey[:]) + // 改变密钥 + f.kcpEventInput <- &net.KcpEvent{ + ConvId: event.ConvId, + EventId: net.KcpXorKeyChange, + EventMessage: key, } - netMsg := new(cmd.NetMsg) - netMsg.UserId = userId - netMsg.EventId = cmd.UserLoginNotify - netMsg.ClientSeq = headMeta.seq - f.netMsgInput <- netMsg - logger.LOG.Info("send to gs user login ok, ConvId: %v, UserId: %v", event.ConvId, netMsg.UserId) case net.KcpConnCloseNotify: // 连接断开通知 userId, exist := f.getUserIdByConvId(event.ConvId) @@ -139,6 +140,7 @@ func (f *ForwardManager) kcpEventHandle() { } f.deleteAddrByConvId(event.ConvId) f.deleteHeadMetaByConvId(event.ConvId) + f.deleteSeedByConvId(event.ConvId) case net.KcpConnEstNotify: // 连接建立通知 addr, ok := event.EventMessage.(string) @@ -183,15 +185,9 @@ func (f *ForwardManager) kcpEventHandle() { func (f *ForwardManager) Start() { // 读取密钥相关文件 - var err error = nil - f.secretKeyBuffer, err = os.ReadFile("key/secretKeyBuffer.bin") - if err != nil { - logger.LOG.Error("open secretKeyBuffer.bin error") - return - } f.signRsaKey, f.encRsaKeyMap, _ = region.LoadRsaKey() // region - regionCurr, _ := region.InitRegion(config.CONF.Hk4e.KcpAddr, config.CONF.Hk4e.KcpPort) + regionCurr, _, _ := region.InitRegion(config.CONF.Hk4e.KcpAddr, config.CONF.Hk4e.KcpPort) f.regionCurr = regionCurr // kcp事件监听 go f.kcpEventHandle() @@ -226,12 +222,6 @@ func (f *ForwardManager) sendNetMsgToGameServer() { if getPlayerTokenRsp == nil { continue } - // 改变解密密钥 - f.kcpEventInput <- &net.KcpEvent{ - ConvId: protoMsg.ConvId, - EventId: net.KcpXorKeyChange, - EventMessage: "DEC", - } // 返回数据到客户端 resp := new(net.ProtoMsg) resp.ConvId = protoMsg.ConvId @@ -249,29 +239,30 @@ func (f *ForwardManager) sendNetMsgToGameServer() { if playerLoginRsp == nil { continue } - // 改变加密密钥 - f.kcpEventInput <- &net.KcpEvent{ - ConvId: protoMsg.ConvId, - EventId: net.KcpXorKeyChange, - EventMessage: "ENC", + // 返回数据到客户端 + resp := new(net.ProtoMsg) + resp.ConvId = protoMsg.ConvId + resp.CmdId = cmd.PlayerLoginRsp + resp.HeadMessage = f.getHeadMsg(protoMsg.HeadMessage.ClientSequenceId) + resp.PayloadMessage = playerLoginRsp + f.protoMsgInput <- resp + // 登录成功 通知GS初始化相关数据 + userId, exist := f.getUserIdByConvId(protoMsg.ConvId) + if !exist { + logger.LOG.Error("can not find userId by convId") + continue } - // 开启发包监听 - f.kcpEventInput <- &net.KcpEvent{ - ConvId: protoMsg.ConvId, - EventId: net.KcpPacketSendListen, - EventMessage: "Enable", + headMeta, exist := f.getHeadMetaByConvId(protoMsg.ConvId) + if !exist { + logger.LOG.Error("can not find client head metadata by convId") + continue } - go func() { - // 保证kcp事件已成功生效 - time.Sleep(time.Millisecond * 50) - // 返回数据到客户端 - resp := new(net.ProtoMsg) - resp.ConvId = protoMsg.ConvId - resp.CmdId = cmd.PlayerLoginRsp - resp.HeadMessage = f.getHeadMsg(protoMsg.HeadMessage.ClientSequenceId) - resp.PayloadMessage = playerLoginRsp - f.protoMsgInput <- resp - }() + netMsg := new(cmd.NetMsg) + netMsg.UserId = userId + netMsg.EventId = cmd.UserLoginNotify + netMsg.ClientSeq = headMeta.seq + f.netMsgInput <- netMsg + logger.LOG.Info("send to gs user login ok, ConvId: %v, UserId: %v", protoMsg.ConvId, netMsg.UserId) case cmd.SetPlayerBornDataReq: // 玩家注册请求 if connState != ConnAlive { @@ -480,6 +471,25 @@ func (f *ForwardManager) deleteHeadMetaByConvId(convId uint64) { f.convHeadMetaMapLock.Unlock() } +func (f *ForwardManager) getSeedByConvId(convId uint64) (seed uint64, exist bool) { + f.convSeedMapLock.RLock() + seed, exist = f.convSeedMap[convId] + f.convSeedMapLock.RUnlock() + return seed, exist +} + +func (f *ForwardManager) setSeedByConvId(convId uint64, seed uint64) { + f.convSeedMapLock.Lock() + f.convSeedMap[convId] = seed + f.convSeedMapLock.Unlock() +} + +func (f *ForwardManager) deleteSeedByConvId(convId uint64) { + f.convSeedMapLock.Lock() + delete(f.convSeedMap, convId) + f.convSeedMapLock.Unlock() +} + // 改变网关开放状态 func (f *ForwardManager) ChangeGateOpenState(isOpen bool) bool { f.kcpEventInput <- &net.KcpEvent{ diff --git a/gate/forward/login_hk4e.go b/gate/forward/login_hk4e.go index f077a3ec..42f84a8d 100644 --- a/gate/forward/login_hk4e.go +++ b/gate/forward/login_hk4e.go @@ -4,8 +4,11 @@ import ( "bytes" "encoding/base64" "encoding/binary" + "fmt" "hk4e/dispatch/controller" "hk4e/pkg/httpclient" + "hk4e/pkg/random" + "math/rand" "strconv" "strings" @@ -69,15 +72,16 @@ func (f *ForwardManager) getPlayerToken(convId uint64, req *proto.GetPlayerToken rsp.Uid = tokenVerifyRsp.PlayerID // TODO 不同的token rsp.Token = "xxx" - rsp.AccountType = 1 + data := make([]byte, 16+32) + rand.Read(data) + rsp.SecurityCmdBuffer = data[16:] + rsp.ClientVersionRandomKey = fmt.Sprintf("%03x-%012x", data[:3], data[4:16]) // TODO 要确定一下新注册的号这个值该返回什么 + rsp.AccountType = 1 rsp.IsProficientPlayer = true - rsp.SecretKeySeed = 11468049314633205968 - rsp.SecurityCmdBuffer = f.secretKeyBuffer rsp.PlatformType = 3 rsp.ChannelId = 1 rsp.CountryCode = "US" - rsp.ClientVersionRandomKey = "c25-314dd05b0b5f" rsp.RegPlatform = 3 addr, exist := f.getAddrByConvId(convId) if !exist { @@ -87,7 +91,6 @@ func (f *ForwardManager) getPlayerToken(convId uint64, req *proto.GetPlayerToken split := strings.Split(addr, ":") rsp.ClientIpStr = split[0] if req.GetKeyId() != 0 { - // pre check logger.LOG.Debug("do hk4e 2.8 rsa logic") keyId := strconv.Itoa(int(req.GetKeyId())) encPubPrivKey, exist := f.encRsaKeyMap[keyId] @@ -111,13 +114,6 @@ func (f *ForwardManager) getPlayerToken(convId uint64, req *proto.GetPlayerToken logger.LOG.Error("parse client seed base64 error: %v", err) return nil } - // create error rsp info - clientSeedEncCopy := make([]byte, len(clientSeedEnc)) - copy(clientSeedEncCopy, clientSeedEnc) - endec.Xor(clientSeedEncCopy, []byte{0x9f, 0x26, 0xb2, 0x17, 0x61, 0x5f, 0xc8, 0x00}) - rsp.ServerRandKey = base64.StdEncoding.EncodeToString(clientSeedEncCopy) - rsp.Sign = "bm90aGluZyBoZXJl" - // do clientSeed, err := endec.RsaDecrypt(clientSeedEnc, signPrivkey) if err != nil { logger.LOG.Error("rsa dec error: %v", err) @@ -129,7 +125,10 @@ func (f *ForwardManager) getPlayerToken(convId uint64, req *proto.GetPlayerToken logger.LOG.Error("parse client seed to uint64 error: %v", err) return rsp } - seedUint64 := uint64(11468049314633205968) ^ clientSeedUint64 + timeRand := random.GetTimeRand() + serverSeedUint64 := timeRand.Uint64() + f.setSeedByConvId(convId, serverSeedUint64) + seedUint64 := serverSeedUint64 ^ clientSeedUint64 seedBuf := new(bytes.Buffer) err = binary.Write(seedBuf, binary.BigEndian, seedUint64) if err != nil { @@ -149,6 +148,12 @@ func (f *ForwardManager) getPlayerToken(convId uint64, req *proto.GetPlayerToken } rsp.ServerRandKey = base64.StdEncoding.EncodeToString(seedEnc) rsp.Sign = base64.StdEncoding.EncodeToString(seedSign) + // 开启发包监听 + f.kcpEventInput <- &net.KcpEvent{ + ConvId: convId, + EventId: net.KcpPacketSendListen, + EventMessage: "Enable", + } } return rsp } @@ -170,6 +175,7 @@ func (f *ForwardManager) playerLogin(convId uint64, req *proto.PlayerLoginReq) ( rsp.IsUseAbilityHash = true rsp.AbilityHashCode = 1844674 rsp.GameBiz = "hk4e_global" + rsp.ClientDataVersion = f.regionCurr.RegionInfo.ClientDataVersion rsp.ClientSilenceDataVersion = f.regionCurr.RegionInfo.ClientSilenceDataVersion rsp.ClientMd5 = f.regionCurr.RegionInfo.ClientDataMd5 @@ -177,6 +183,7 @@ func (f *ForwardManager) playerLogin(convId uint64, req *proto.PlayerLoginReq) ( rsp.ResVersionConfig = f.regionCurr.RegionInfo.ResVersionConfig rsp.ClientVersionSuffix = f.regionCurr.RegionInfo.ClientVersionSuffix rsp.ClientSilenceVersionSuffix = f.regionCurr.RegionInfo.ClientSilenceVersionSuffix + rsp.IsScOpen = false rsp.RegisterCps = "mihoyo" rsp.CountryCode = "US" diff --git a/gate/mq/mq.go b/gate/mq/mq.go index 3aa8926f..e5283599 100644 --- a/gate/mq/mq.go +++ b/gate/mq/mq.go @@ -1,8 +1,11 @@ package mq import ( + "encoding/binary" "hk4e/common/config" + "hk4e/gate/net" "hk4e/pkg/logger" + "hk4e/pkg/random" "hk4e/protocol/cmd" "github.com/nats-io/nats.go" @@ -18,7 +21,7 @@ type MessageQueue struct { cmdProtoMap *cmd.CmdProtoMap } -func NewMessageQueue(netMsgInput chan *cmd.NetMsg, netMsgOutput chan *cmd.NetMsg) (r *MessageQueue) { +func NewMessageQueue(netMsgInput chan *cmd.NetMsg, netMsgOutput chan *cmd.NetMsg, kcpEventInput chan *net.KcpEvent) (r *MessageQueue) { r = new(MessageQueue) conn, err := nats.Connect(config.CONF.MQ.NatsUrl) if err != nil { @@ -43,7 +46,16 @@ func NewMessageQueue(netMsgInput chan *cmd.NetMsg, netMsgOutput chan *cmd.NetMsg go func() { for { natsMsg := <-keyNatsMsgChan - logger.LOG.Error("GATE_KEY_HK4E %v", natsMsg.Data) + dispatchEc2bSeed := binary.BigEndian.Uint64(natsMsg.Data) + logger.LOG.Debug("recv new dispatch ec2b seed: %v", dispatchEc2bSeed) + gateDispatchEc2b := random.NewEc2b() + gateDispatchEc2b.SetSeed(dispatchEc2bSeed) + gateDispatchXorKey := gateDispatchEc2b.XorKey() + // 改变密钥 + kcpEventInput <- &net.KcpEvent{ + EventId: net.KcpDispatchKeyChange, + EventMessage: gateDispatchXorKey, + } } }() diff --git a/gate/net/kcp_connect_manager.go b/gate/net/kcp_connect_manager.go index aa7518c1..2b6303af 100644 --- a/gate/net/kcp_connect_manager.go +++ b/gate/net/kcp_connect_manager.go @@ -3,7 +3,6 @@ package net import ( "bytes" "encoding/binary" - "os" "strconv" "sync" "time" @@ -14,11 +13,6 @@ import ( "hk4e/pkg/random" ) -type KcpXorKey struct { - encKey []byte - decKey []byte -} - type KcpConnectManager struct { openState bool connMap map[uint64]*kcp.UDPSession @@ -36,10 +30,10 @@ type KcpConnectManager struct { kcpSendListenMap map[uint64]bool kcpSendListenMapLock sync.RWMutex // key - dispatchKey []byte - secretKey []byte - kcpKeyMap map[uint64]*KcpXorKey - kcpKeyMapLock sync.RWMutex + dispatchKey []byte + dispatchKeyLock sync.RWMutex + kcpKeyMap map[uint64][]byte + kcpKeyMapLock sync.RWMutex // conv短时间内唯一生成 convGenMap map[uint64]int64 convGenMapLock sync.RWMutex @@ -57,7 +51,7 @@ func NewKcpConnectManager(protoMsgInput chan *ProtoMsg, protoMsgOutput chan *Pro r.kcpRawSendChanMap = make(map[uint64]chan *ProtoMsg) r.kcpRecvListenMap = make(map[uint64]bool) r.kcpSendListenMap = make(map[uint64]bool) - r.kcpKeyMap = make(map[uint64]*KcpXorKey) + r.kcpKeyMap = make(map[uint64][]byte) r.convGenMap = make(map[uint64]int64) return r } @@ -65,17 +59,7 @@ func NewKcpConnectManager(protoMsgInput chan *ProtoMsg, protoMsgOutput chan *Pro func (k *KcpConnectManager) Start() { go func() { // key - var err error = nil - k.dispatchKey, err = os.ReadFile("key/dispatchKey.bin") - if err != nil { - logger.LOG.Error("open dispatchKey.bin error") - return - } - k.secretKey, err = os.ReadFile("key/secretKey.bin") - if err != nil { - logger.LOG.Error("open secretKey.bin error") - return - } + k.dispatchKey = make([]byte, 4096) // kcp port := strconv.FormatInt(int64(config.CONF.Hk4e.KcpPort), 10) listener, err := kcp.ListenWithOptions("0.0.0.0:"+port, nil, 0, 0) @@ -110,10 +94,9 @@ func (k *KcpConnectManager) Start() { k.connMap[convId] = conn k.connMapLock.Unlock() k.kcpKeyMapLock.Lock() - k.kcpKeyMap[convId] = &KcpXorKey{ - encKey: k.dispatchKey, - decKey: k.dispatchKey, - } + k.dispatchKeyLock.RLock() + k.kcpKeyMap[convId] = k.dispatchKey + k.dispatchKeyLock.RUnlock() k.kcpKeyMapLock.Unlock() go k.recvHandle(convId) kcpRawSendChan := make(chan *ProtoMsg, 10000) diff --git a/gate/net/kcp_endecode.go b/gate/net/kcp_endecode.go index bd6d05cd..00630f17 100644 --- a/gate/net/kcp_endecode.go +++ b/gate/net/kcp_endecode.go @@ -42,7 +42,7 @@ func (k *KcpConnectManager) decodeBinToPayload(data []byte, convId uint64, kcpMs logger.LOG.Error("kcp xor key not exist, convId: %v", convId) return } - endec.Xor(data, xorKey.decKey) + endec.Xor(data, xorKey) k.decodeRecur(data, convId, kcpMsgList) } @@ -183,6 +183,6 @@ func (k *KcpConnectManager) encodePayloadToBin(kcpMsg *KcpMsg) (bin []byte) { logger.LOG.Error("kcp xor key not exist, convId: %v", kcpMsg.ConvId) return } - endec.Xor(bin, xorKey.encKey) + endec.Xor(bin, xorKey) return bin } diff --git a/gate/net/kcp_event.go b/gate/net/kcp_event.go index f607e771..ced323e1 100644 --- a/gate/net/kcp_event.go +++ b/gate/net/kcp_event.go @@ -4,6 +4,7 @@ import "hk4e/pkg/logger" const ( KcpXorKeyChange = iota + KcpDispatchKeyChange KcpPacketRecvListen KcpPacketSendListen KcpConnForceClose @@ -38,20 +39,24 @@ func (k *KcpConnectManager) eventHandle() { logger.LOG.Error("conn not exist, convId: %v", event.ConvId) continue } - flag, ok := event.EventMessage.(string) + key, ok := event.EventMessage.([]byte) if !ok { logger.LOG.Error("event KcpXorKeyChange msg type error") continue } - if flag == "ENC" { - k.kcpKeyMapLock.Lock() - k.kcpKeyMap[event.ConvId].encKey = k.secretKey - k.kcpKeyMapLock.Unlock() - } else if flag == "DEC" { - k.kcpKeyMapLock.Lock() - k.kcpKeyMap[event.ConvId].decKey = k.secretKey - k.kcpKeyMapLock.Unlock() + k.kcpKeyMapLock.Lock() + k.kcpKeyMap[event.ConvId] = key + k.kcpKeyMapLock.Unlock() + case KcpDispatchKeyChange: + // 首包加密XOR密钥切换 + key, ok := event.EventMessage.([]byte) + if !ok { + logger.LOG.Error("event KcpXorKeyChange msg type error") + continue } + k.dispatchKeyLock.Lock() + k.dispatchKey = key + k.dispatchKeyLock.Unlock() case KcpPacketRecvListen: // 收包监听 k.connMapLock.RLock() diff --git a/pkg/random/hk4e_ec2b.go b/pkg/random/hk4e_ec2b.go index c408bb71..973e49bc 100644 --- a/pkg/random/hk4e_ec2b.go +++ b/pkg/random/hk4e_ec2b.go @@ -13,7 +13,7 @@ type Ec2b struct { temp []byte } -func LoadKey(b []byte) (*Ec2b, error) { +func LoadEc2bKey(b []byte) (*Ec2b, error) { if len(b) < 4+4+16+4+2048 { return nil, fmt.Errorf("invalid ec2b key") } @@ -88,10 +88,8 @@ func (e *Ec2b) Key() []byte { return b } -func (e *Ec2b) Xor(data []byte) { - for i := 0; i < len(data); i++ { - data[i] ^= e.temp[i%4096] - } +func (e *Ec2b) XorKey() []byte { + return e.temp } func keyScramble(key []byte) { diff --git a/pkg/random/hk4e_mt19937.go b/pkg/random/hk4e_mt19937.go index 0a3604a2..06cac309 100644 --- a/pkg/random/hk4e_mt19937.go +++ b/pkg/random/hk4e_mt19937.go @@ -84,8 +84,6 @@ func (b *KeyBlock) Seed() uint64 { return b.seed } -func (b *KeyBlock) Xor(data []byte) { - for i := 0; i < len(data); i++ { - data[i] ^= b.data[i%4096] - } +func (b *KeyBlock) XorKey() [4096]byte { + return b.data } diff --git a/pkg/random/hk4e_test.go b/pkg/random/hk4e_test.go index 68abb289..f2892119 100644 --- a/pkg/random/hk4e_test.go +++ b/pkg/random/hk4e_test.go @@ -2,38 +2,24 @@ package random import ( "fmt" - "os" "testing" ) func TestKey(t *testing.T) { - fmt.Println("hw") + dispatchEc2b := NewEc2b() + dispatchEc2bData := dispatchEc2b.Bytes() + dispatchEc2bSeed := dispatchEc2b.Seed() + _ = dispatchEc2bData - //dispatchEc2b := NewEc2b() - keyBin, err := os.ReadFile("./static/dispatchSeed.bin") - if err != nil { - panic(err) - } - dispatchEc2b, err := LoadKey(keyBin) - if err != nil { - panic(err) - } - dispatchBin := dispatchEc2b.Bytes() - dispatchSeed := dispatchEc2b.Seed() - _ = dispatchBin + dispatchXorKey := dispatchEc2b.XorKey() gateDispatchEc2b := NewEc2b() - gateDispatchEc2b.SetSeed(dispatchSeed) + gateDispatchEc2b.SetSeed(dispatchEc2bSeed) - dispatchKey := make([]byte, 4096) - dispatchEc2b.Xor(dispatchKey) + gateDispatchXorKey := gateDispatchEc2b.XorKey() - gateDispatchKey := make([]byte, 4096) - gateDispatchEc2b.Xor(gateDispatchKey) - - gateXorKey := make([]byte, 4096) keyBlock := NewKeyBlock(uint64(11468049314633205968)) - keyBlock.Xor(gateXorKey) + gateXorKey := keyBlock.XorKey() - fmt.Println("end") + fmt.Println(dispatchXorKey, gateDispatchXorKey, gateXorKey) } diff --git a/pkg/random/random.go b/pkg/random/random.go index 039fc3cc..5010ab15 100644 --- a/pkg/random/random.go +++ b/pkg/random/random.go @@ -10,6 +10,10 @@ func init() { rand.Seed(time.Now().UnixNano()) } +func GetTimeRand() *rand.Rand { + return rand.New(rand.NewSource(time.Now().UnixNano())) +} + func GetRandomStr(strLen int) (str string) { baseStr := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" for i := 0; i < strLen; i++ {