MCPcopy
hub / github.com/OpenNHP/opennhp / createPacketParserData

Method createPacketParserData

nhp/core/responder.go:91–178  ·  view source on GitHub ↗
(pd *PacketData)

Source from the content-addressed store, hash-verified

89}
90
91func (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 }

Callers 2

packetToMsgRoutineMethod · 0.95
PacketToMsgMethod · 0.95

Calls 15

GetEcdhByCipherSchemeMethod · 0.95
NewCipherSuiteFunction · 0.85
NewHashFunction · 0.85
HeaderTypeToStringFunction · 0.85
HeaderMethod · 0.80
MixKeyMethod · 0.80
IsOverloadMethod · 0.80
IsAllowedAtOverloadMethod · 0.80
checkHMACMethod · 0.80
FlagMethod · 0.65
CipherSchemeMethod · 0.65

Tested by

no test coverage detected