(pd *PacketData)
| 89 | } |
| 90 | |
| 91 | func (d *Device) createPacketParserData(pd *PacketData) (ppd *PacketParserData, err error) { |
| 92 | if pd.PrevAssemblerData != nil { |
| 93 | ppd = pd.PrevAssemblerData.derivePacketParserData(pd.BasePacket, pd.InitTime) |
| 94 | } else { |
| 95 | ppd = &PacketParserData{} |
| 96 | ppd.device = d |
| 97 | ppd.basePacket = pd.BasePacket |
| 98 | ppd.ConnData = pd.ConnData |
| 99 | ppd.ConnCookieStore = pd.ConnCookieStore |
| 100 | ppd.LocalInitTime = pd.InitTime |
| 101 | ppd.ConnLastRemoteSendTime = pd.ConnLastRemoteSendTime |
| 102 | ppd.ConnPeerPublicKey = pd.ConnPeerPublicKey |
| 103 | ppd.decryptedMsgCh = pd.DecryptedMsgCh |
| 104 | |
| 105 | // init header and init device ecdh |
| 106 | ppd.HeaderFlag = ppd.basePacket.Flag() |
| 107 | ppd.header = ppd.basePacket.Header() |
| 108 | ppd.CipherScheme = ppd.header.CipherScheme() |
| 109 | log.Info("start decryption using CIPHER_SCHEME_%d(0: CURVE; 1: GMSM.)", ppd.CipherScheme) |
| 110 | ppd.Ciphers = NewCipherSuite(ppd.CipherScheme) |
| 111 | ppd.deviceEcdh = d.GetEcdhByCipherScheme(ppd.CipherScheme) |
| 112 | |
| 113 | // init chain hash -> ChainHash0 |
| 114 | ppd.chainHash, err = NewHash(ppd.Ciphers.HashType) |
| 115 | if err != nil { |
| 116 | return nil, fmt.Errorf("failed to create chain hash: %w", err) |
| 117 | } |
| 118 | ppd.chainHash.Write([]byte(InitialHashString)) |
| 119 | |
| 120 | // init chain key -> ChainKey0 |
| 121 | ppd.noise.HashType = ppd.Ciphers.HashType |
| 122 | ppd.noise.MixKey(&ppd.chainKey, ppd.chainHash.Sum(nil), []byte(InitialChainKeyString)) |
| 123 | } |
| 124 | |
| 125 | ppd.HeaderType, ppd.BodySize = ppd.header.TypeAndPayloadSize() |
| 126 | |
| 127 | // init hmac hash -> HmacHash0 |
| 128 | ppd.hmacHash, err = NewHash(ppd.Ciphers.HashType) |
| 129 | if err != nil { |
| 130 | return nil, fmt.Errorf("failed to create HMAC hash: %w", err) |
| 131 | } |
| 132 | ppd.hmacHash.Write([]byte(InitialHashString)) |
| 133 | |
| 134 | // evolve hmac hash HmacHash0 -> HmacHash1 |
| 135 | ppd.hmacHash.Write(ppd.deviceEcdh.PublicKey()) |
| 136 | |
| 137 | // check hmac |
| 138 | if ppd.device.deviceType == NHP_SERVER { |
| 139 | // server overload handling |
| 140 | overload := ppd.device.IsOverload() |
| 141 | if overload { |
| 142 | // overload, further discard unwanted packet type |
| 143 | ppd.Overload = true |
| 144 | if !ppd.IsAllowedAtOverload() { |
| 145 | log.Critical("discard packet type %d due to overload", ppd.HeaderType) |
| 146 | err = ErrServerOverload |
| 147 | return |
| 148 | } |
no test coverage detected