@netkitty/codec 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +21 -0
  3. package/README.md +352 -0
  4. package/README.zh-CN.md +342 -0
  5. package/dist/Codec.d.ts +133 -0
  6. package/dist/Codec.js +632 -0
  7. package/dist/PacketHeaders.d.ts +189 -0
  8. package/dist/PacketHeaders.js +384 -0
  9. package/dist/abstracts/BaseHeader.d.ts +325 -0
  10. package/dist/abstracts/BaseHeader.js +734 -0
  11. package/dist/errors/CodecSchemaValidateError.d.ts +4 -0
  12. package/dist/errors/CodecSchemaValidateError.js +11 -0
  13. package/dist/headers/ADSAMS.d.ts +33 -0
  14. package/dist/headers/ADSAMS.js +208 -0
  15. package/dist/headers/AH.d.ts +28 -0
  16. package/dist/headers/AH.js +137 -0
  17. package/dist/headers/AMQP.d.ts +31 -0
  18. package/dist/headers/AMQP.js +316 -0
  19. package/dist/headers/ARP.d.ts +26 -0
  20. package/dist/headers/ARP.js +243 -0
  21. package/dist/headers/BACnetIP.d.ts +27 -0
  22. package/dist/headers/BACnetIP.js +97 -0
  23. package/dist/headers/BFD.d.ts +28 -0
  24. package/dist/headers/BFD.js +155 -0
  25. package/dist/headers/BGP.d.ts +27 -0
  26. package/dist/headers/BGP.js +111 -0
  27. package/dist/headers/BSAPIP.d.ts +33 -0
  28. package/dist/headers/BSAPIP.js +78 -0
  29. package/dist/headers/Babel.d.ts +32 -0
  30. package/dist/headers/Babel.js +224 -0
  31. package/dist/headers/BitTorrent.d.ts +28 -0
  32. package/dist/headers/BitTorrent.js +72 -0
  33. package/dist/headers/C37118.d.ts +26 -0
  34. package/dist/headers/C37118.js +147 -0
  35. package/dist/headers/CAPWAP.d.ts +38 -0
  36. package/dist/headers/CAPWAP.js +275 -0
  37. package/dist/headers/CDP.d.ts +25 -0
  38. package/dist/headers/CDP.js +117 -0
  39. package/dist/headers/CMS.d.ts +33 -0
  40. package/dist/headers/CMS.js +238 -0
  41. package/dist/headers/COTP.d.ts +30 -0
  42. package/dist/headers/COTP.js +193 -0
  43. package/dist/headers/CassandraCQL.d.ts +28 -0
  44. package/dist/headers/CassandraCQL.js +117 -0
  45. package/dist/headers/CoAP.d.ts +29 -0
  46. package/dist/headers/CoAP.js +140 -0
  47. package/dist/headers/Codesys.d.ts +32 -0
  48. package/dist/headers/Codesys.js +119 -0
  49. package/dist/headers/Collectd.d.ts +29 -0
  50. package/dist/headers/Collectd.js +154 -0
  51. package/dist/headers/DCCP.d.ts +30 -0
  52. package/dist/headers/DCCP.js +204 -0
  53. package/dist/headers/DHCP.d.ts +26 -0
  54. package/dist/headers/DHCP.js +148 -0
  55. package/dist/headers/DHCPFailover.d.ts +30 -0
  56. package/dist/headers/DHCPFailover.js +104 -0
  57. package/dist/headers/DHCPv6.d.ts +25 -0
  58. package/dist/headers/DHCPv6.js +145 -0
  59. package/dist/headers/DNP3.d.ts +27 -0
  60. package/dist/headers/DNP3.js +150 -0
  61. package/dist/headers/DNS.d.ts +55 -0
  62. package/dist/headers/DNS.js +309 -0
  63. package/dist/headers/DTLS.d.ts +33 -0
  64. package/dist/headers/DTLS.js +142 -0
  65. package/dist/headers/Diameter.d.ts +34 -0
  66. package/dist/headers/Diameter.js +229 -0
  67. package/dist/headers/EAPOL.d.ts +32 -0
  68. package/dist/headers/EAPOL.js +135 -0
  69. package/dist/headers/EIGRP.d.ts +28 -0
  70. package/dist/headers/EIGRP.js +165 -0
  71. package/dist/headers/ENIP.d.ts +31 -0
  72. package/dist/headers/ENIP.js +164 -0
  73. package/dist/headers/ESP.d.ts +27 -0
  74. package/dist/headers/ESP.js +140 -0
  75. package/dist/headers/Elasticsearch.d.ts +30 -0
  76. package/dist/headers/Elasticsearch.js +125 -0
  77. package/dist/headers/EtherCAT.d.ts +35 -0
  78. package/dist/headers/EtherCAT.js +150 -0
  79. package/dist/headers/EthernetII.d.ts +28 -0
  80. package/dist/headers/EthernetII.js +117 -0
  81. package/dist/headers/FCoE.d.ts +38 -0
  82. package/dist/headers/FCoE.js +210 -0
  83. package/dist/headers/FTP.d.ts +34 -0
  84. package/dist/headers/FTP.js +158 -0
  85. package/dist/headers/Finger.d.ts +41 -0
  86. package/dist/headers/Finger.js +135 -0
  87. package/dist/headers/FoundationFieldbusHSE.d.ts +43 -0
  88. package/dist/headers/FoundationFieldbusHSE.js +163 -0
  89. package/dist/headers/GELF.d.ts +35 -0
  90. package/dist/headers/GELF.js +261 -0
  91. package/dist/headers/GENEVE.d.ts +26 -0
  92. package/dist/headers/GENEVE.js +209 -0
  93. package/dist/headers/GESRTP.d.ts +32 -0
  94. package/dist/headers/GESRTP.js +141 -0
  95. package/dist/headers/GLBP.d.ts +29 -0
  96. package/dist/headers/GLBP.js +159 -0
  97. package/dist/headers/GRE.d.ts +27 -0
  98. package/dist/headers/GRE.js +181 -0
  99. package/dist/headers/GTPU.d.ts +25 -0
  100. package/dist/headers/GTPU.js +203 -0
  101. package/dist/headers/GTPv2C.d.ts +30 -0
  102. package/dist/headers/GTPv2C.js +281 -0
  103. package/dist/headers/GitProtocol.d.ts +34 -0
  104. package/dist/headers/GitProtocol.js +141 -0
  105. package/dist/headers/Goose.d.ts +115 -0
  106. package/dist/headers/Goose.js +1067 -0
  107. package/dist/headers/Gopher.d.ts +43 -0
  108. package/dist/headers/Gopher.js +182 -0
  109. package/dist/headers/HARTIP.d.ts +30 -0
  110. package/dist/headers/HARTIP.js +145 -0
  111. package/dist/headers/HSR.d.ts +27 -0
  112. package/dist/headers/HSR.js +105 -0
  113. package/dist/headers/HSRP.d.ts +26 -0
  114. package/dist/headers/HSRP.js +173 -0
  115. package/dist/headers/HTTP.d.ts +32 -0
  116. package/dist/headers/HTTP.js +153 -0
  117. package/dist/headers/HTTP2.d.ts +34 -0
  118. package/dist/headers/HTTP2.js +190 -0
  119. package/dist/headers/IAX2.d.ts +33 -0
  120. package/dist/headers/IAX2.js +274 -0
  121. package/dist/headers/ICMP.d.ts +15 -0
  122. package/dist/headers/ICMP.js +148 -0
  123. package/dist/headers/ICMPv6.d.ts +15 -0
  124. package/dist/headers/ICMPv6.js +129 -0
  125. package/dist/headers/IEC104_I_Frame.d.ts +23 -0
  126. package/dist/headers/IEC104_I_Frame.js +6489 -0
  127. package/dist/headers/IEC104_S_Frame.d.ts +26 -0
  128. package/dist/headers/IEC104_S_Frame.js +135 -0
  129. package/dist/headers/IEC104_U_Frame.d.ts +27 -0
  130. package/dist/headers/IEC104_U_Frame.js +176 -0
  131. package/dist/headers/IEC61850SampledValues.d.ts +20 -0
  132. package/dist/headers/IEC61850SampledValues.js +420 -0
  133. package/dist/headers/IGMP.d.ts +31 -0
  134. package/dist/headers/IGMP.js +274 -0
  135. package/dist/headers/IMAP.d.ts +32 -0
  136. package/dist/headers/IMAP.js +185 -0
  137. package/dist/headers/IPFIX.d.ts +29 -0
  138. package/dist/headers/IPFIX.js +156 -0
  139. package/dist/headers/IPv4.d.ts +20 -0
  140. package/dist/headers/IPv4.js +370 -0
  141. package/dist/headers/IPv6.d.ts +29 -0
  142. package/dist/headers/IPv6.js +209 -0
  143. package/dist/headers/IPv6HopByHopOptions.d.ts +81 -0
  144. package/dist/headers/IPv6HopByHopOptions.js +495 -0
  145. package/dist/headers/IRC.d.ts +34 -0
  146. package/dist/headers/IRC.js +175 -0
  147. package/dist/headers/ISAKMP.d.ts +29 -0
  148. package/dist/headers/ISAKMP.js +197 -0
  149. package/dist/headers/ISCSI.d.ts +39 -0
  150. package/dist/headers/ISCSI.js +289 -0
  151. package/dist/headers/ISIS.d.ts +25 -0
  152. package/dist/headers/ISIS.js +79 -0
  153. package/dist/headers/ISOSession.d.ts +27 -0
  154. package/dist/headers/ISOSession.js +343 -0
  155. package/dist/headers/Ident.d.ts +42 -0
  156. package/dist/headers/Ident.js +184 -0
  157. package/dist/headers/KNXnetIP.d.ts +30 -0
  158. package/dist/headers/KNXnetIP.js +135 -0
  159. package/dist/headers/Kafka.d.ts +35 -0
  160. package/dist/headers/Kafka.js +128 -0
  161. package/dist/headers/Kerberos.d.ts +30 -0
  162. package/dist/headers/Kerberos.js +217 -0
  163. package/dist/headers/L2TP.d.ts +26 -0
  164. package/dist/headers/L2TP.js +297 -0
  165. package/dist/headers/LACP.d.ts +31 -0
  166. package/dist/headers/LACP.js +151 -0
  167. package/dist/headers/LDAP.d.ts +31 -0
  168. package/dist/headers/LDAP.js +226 -0
  169. package/dist/headers/LDP.d.ts +31 -0
  170. package/dist/headers/LDP.js +138 -0
  171. package/dist/headers/LISP.d.ts +30 -0
  172. package/dist/headers/LISP.js +103 -0
  173. package/dist/headers/LLC.d.ts +27 -0
  174. package/dist/headers/LLC.js +81 -0
  175. package/dist/headers/LLDP.d.ts +26 -0
  176. package/dist/headers/LLDP.js +126 -0
  177. package/dist/headers/LLMNR.d.ts +23 -0
  178. package/dist/headers/LLMNR.js +40 -0
  179. package/dist/headers/LPD.d.ts +31 -0
  180. package/dist/headers/LPD.js +159 -0
  181. package/dist/headers/MACsec.d.ts +34 -0
  182. package/dist/headers/MACsec.js +178 -0
  183. package/dist/headers/MDNS.d.ts +26 -0
  184. package/dist/headers/MDNS.js +45 -0
  185. package/dist/headers/MGCP.d.ts +30 -0
  186. package/dist/headers/MGCP.js +155 -0
  187. package/dist/headers/MMS.d.ts +29 -0
  188. package/dist/headers/MMS.js +243 -0
  189. package/dist/headers/MPLS.d.ts +31 -0
  190. package/dist/headers/MPLS.js +145 -0
  191. package/dist/headers/MQTT.d.ts +30 -0
  192. package/dist/headers/MQTT.js +173 -0
  193. package/dist/headers/MQTTSN.d.ts +34 -0
  194. package/dist/headers/MQTTSN.js +177 -0
  195. package/dist/headers/MarkerProtocol.d.ts +32 -0
  196. package/dist/headers/MarkerProtocol.js +153 -0
  197. package/dist/headers/Megaco.d.ts +32 -0
  198. package/dist/headers/Megaco.js +144 -0
  199. package/dist/headers/Memcached.d.ts +44 -0
  200. package/dist/headers/Memcached.js +285 -0
  201. package/dist/headers/ModbusTCP.d.ts +25 -0
  202. package/dist/headers/ModbusTCP.js +99 -0
  203. package/dist/headers/ModbusUDP.d.ts +26 -0
  204. package/dist/headers/ModbusUDP.js +100 -0
  205. package/dist/headers/MongoDB.d.ts +33 -0
  206. package/dist/headers/MongoDB.js +143 -0
  207. package/dist/headers/MySQL.d.ts +30 -0
  208. package/dist/headers/MySQL.js +114 -0
  209. package/dist/headers/NATS.d.ts +29 -0
  210. package/dist/headers/NATS.js +135 -0
  211. package/dist/headers/NBDS.d.ts +34 -0
  212. package/dist/headers/NBDS.js +176 -0
  213. package/dist/headers/NBNS.d.ts +34 -0
  214. package/dist/headers/NBNS.js +78 -0
  215. package/dist/headers/NBSS.d.ts +36 -0
  216. package/dist/headers/NBSS.js +137 -0
  217. package/dist/headers/NFS.d.ts +36 -0
  218. package/dist/headers/NFS.js +273 -0
  219. package/dist/headers/NHRP.d.ts +32 -0
  220. package/dist/headers/NHRP.js +154 -0
  221. package/dist/headers/NNTP.d.ts +35 -0
  222. package/dist/headers/NNTP.js +162 -0
  223. package/dist/headers/NTP.d.ts +18 -0
  224. package/dist/headers/NTP.js +73 -0
  225. package/dist/headers/NetFlowV5.d.ts +28 -0
  226. package/dist/headers/NetFlowV5.js +205 -0
  227. package/dist/headers/OLSR.d.ts +31 -0
  228. package/dist/headers/OLSR.js +213 -0
  229. package/dist/headers/OPCUA.d.ts +33 -0
  230. package/dist/headers/OPCUA.js +165 -0
  231. package/dist/headers/OPCUAPubSub.d.ts +33 -0
  232. package/dist/headers/OPCUAPubSub.js +144 -0
  233. package/dist/headers/OSPF.d.ts +31 -0
  234. package/dist/headers/OSPF.js +365 -0
  235. package/dist/headers/OmronFINS.d.ts +31 -0
  236. package/dist/headers/OmronFINS.js +90 -0
  237. package/dist/headers/OpenFlow.d.ts +30 -0
  238. package/dist/headers/OpenFlow.js +113 -0
  239. package/dist/headers/OpenVPN.d.ts +35 -0
  240. package/dist/headers/OpenVPN.js +214 -0
  241. package/dist/headers/PCWorx.d.ts +35 -0
  242. package/dist/headers/PCWorx.js +115 -0
  243. package/dist/headers/PIM.d.ts +27 -0
  244. package/dist/headers/PIM.js +129 -0
  245. package/dist/headers/POP3.d.ts +31 -0
  246. package/dist/headers/POP3.js +152 -0
  247. package/dist/headers/POWERLINK.d.ts +28 -0
  248. package/dist/headers/POWERLINK.js +116 -0
  249. package/dist/headers/PPPoEDiscovery.d.ts +29 -0
  250. package/dist/headers/PPPoEDiscovery.js +198 -0
  251. package/dist/headers/PPPoESession.d.ts +28 -0
  252. package/dist/headers/PPPoESession.js +125 -0
  253. package/dist/headers/PPTP.d.ts +30 -0
  254. package/dist/headers/PPTP.js +122 -0
  255. package/dist/headers/PROFINETRT.d.ts +28 -0
  256. package/dist/headers/PROFINETRT.js +74 -0
  257. package/dist/headers/PTP.d.ts +34 -0
  258. package/dist/headers/PTP.js +213 -0
  259. package/dist/headers/PostgreSQL.d.ts +40 -0
  260. package/dist/headers/PostgreSQL.js +236 -0
  261. package/dist/headers/QUIC.d.ts +34 -0
  262. package/dist/headers/QUIC.js +308 -0
  263. package/dist/headers/RADIUS.d.ts +24 -0
  264. package/dist/headers/RADIUS.js +138 -0
  265. package/dist/headers/RDP.d.ts +27 -0
  266. package/dist/headers/RDP.js +93 -0
  267. package/dist/headers/RFB.d.ts +39 -0
  268. package/dist/headers/RFB.js +151 -0
  269. package/dist/headers/RGoose.d.ts +72 -0
  270. package/dist/headers/RGoose.js +340 -0
  271. package/dist/headers/RIP.d.ts +29 -0
  272. package/dist/headers/RIP.js +133 -0
  273. package/dist/headers/RIPng.d.ts +26 -0
  274. package/dist/headers/RIPng.js +140 -0
  275. package/dist/headers/RMCP.d.ts +26 -0
  276. package/dist/headers/RMCP.js +155 -0
  277. package/dist/headers/RSVP.d.ts +31 -0
  278. package/dist/headers/RSVP.js +263 -0
  279. package/dist/headers/RTCP.d.ts +34 -0
  280. package/dist/headers/RTCP.js +217 -0
  281. package/dist/headers/RTP.d.ts +33 -0
  282. package/dist/headers/RTP.js +291 -0
  283. package/dist/headers/RTPS.d.ts +33 -0
  284. package/dist/headers/RTPS.js +182 -0
  285. package/dist/headers/RTSP.d.ts +36 -0
  286. package/dist/headers/RTSP.js +184 -0
  287. package/dist/headers/RawData.d.ts +17 -0
  288. package/dist/headers/RawData.js +43 -0
  289. package/dist/headers/Redis.d.ts +32 -0
  290. package/dist/headers/Redis.js +202 -0
  291. package/dist/headers/Rlogin.d.ts +42 -0
  292. package/dist/headers/Rlogin.js +139 -0
  293. package/dist/headers/Rsync.d.ts +28 -0
  294. package/dist/headers/Rsync.js +117 -0
  295. package/dist/headers/S7comm.d.ts +36 -0
  296. package/dist/headers/S7comm.js +244 -0
  297. package/dist/headers/SCTP.d.ts +35 -0
  298. package/dist/headers/SCTP.js +174 -0
  299. package/dist/headers/SFlow.d.ts +29 -0
  300. package/dist/headers/SFlow.js +242 -0
  301. package/dist/headers/SIP.d.ts +27 -0
  302. package/dist/headers/SIP.js +146 -0
  303. package/dist/headers/SLMP.d.ts +36 -0
  304. package/dist/headers/SLMP.js +154 -0
  305. package/dist/headers/SLP.d.ts +30 -0
  306. package/dist/headers/SLP.js +207 -0
  307. package/dist/headers/SLPv1.d.ts +32 -0
  308. package/dist/headers/SLPv1.js +138 -0
  309. package/dist/headers/SMB1.d.ts +37 -0
  310. package/dist/headers/SMB1.js +200 -0
  311. package/dist/headers/SMB2.d.ts +36 -0
  312. package/dist/headers/SMB2.js +203 -0
  313. package/dist/headers/SMPP.d.ts +33 -0
  314. package/dist/headers/SMPP.js +119 -0
  315. package/dist/headers/SMTP.d.ts +33 -0
  316. package/dist/headers/SMTP.js +157 -0
  317. package/dist/headers/SNAP.d.ts +22 -0
  318. package/dist/headers/SNAP.js +68 -0
  319. package/dist/headers/SNMP.d.ts +28 -0
  320. package/dist/headers/SNMP.js +302 -0
  321. package/dist/headers/SOCKS4.d.ts +42 -0
  322. package/dist/headers/SOCKS4.js +302 -0
  323. package/dist/headers/SOCKS5.d.ts +45 -0
  324. package/dist/headers/SOCKS5.js +223 -0
  325. package/dist/headers/SSDP.d.ts +27 -0
  326. package/dist/headers/SSDP.js +161 -0
  327. package/dist/headers/SSH.d.ts +44 -0
  328. package/dist/headers/SSH.js +274 -0
  329. package/dist/headers/STOMP.d.ts +48 -0
  330. package/dist/headers/STOMP.js +177 -0
  331. package/dist/headers/STP.d.ts +26 -0
  332. package/dist/headers/STP.js +150 -0
  333. package/dist/headers/STUN.d.ts +25 -0
  334. package/dist/headers/STUN.js +183 -0
  335. package/dist/headers/SercosIII.d.ts +43 -0
  336. package/dist/headers/SercosIII.js +199 -0
  337. package/dist/headers/Skinny.d.ts +32 -0
  338. package/dist/headers/Skinny.js +139 -0
  339. package/dist/headers/StatsD.d.ts +27 -0
  340. package/dist/headers/StatsD.js +134 -0
  341. package/dist/headers/SunRPC.d.ts +34 -0
  342. package/dist/headers/SunRPC.js +268 -0
  343. package/dist/headers/Syslog.d.ts +21 -0
  344. package/dist/headers/Syslog.js +91 -0
  345. package/dist/headers/TCP.d.ts +19 -0
  346. package/dist/headers/TCP.js +905 -0
  347. package/dist/headers/TFTP.d.ts +28 -0
  348. package/dist/headers/TFTP.js +224 -0
  349. package/dist/headers/TLS_Alert.d.ts +24 -0
  350. package/dist/headers/TLS_Alert.js +639 -0
  351. package/dist/headers/TLS_ApplicationData.d.ts +24 -0
  352. package/dist/headers/TLS_ApplicationData.js +170 -0
  353. package/dist/headers/TLS_ChangeCipherSpec.d.ts +23 -0
  354. package/dist/headers/TLS_ChangeCipherSpec.js +168 -0
  355. package/dist/headers/TLS_Handshake.d.ts +65 -0
  356. package/dist/headers/TLS_Handshake.js +860 -0
  357. package/dist/headers/TLS_Heartbeat.d.ts +27 -0
  358. package/dist/headers/TLS_Heartbeat.js +247 -0
  359. package/dist/headers/TPKT.d.ts +26 -0
  360. package/dist/headers/TPKT.js +99 -0
  361. package/dist/headers/TacacsPlus.d.ts +27 -0
  362. package/dist/headers/TacacsPlus.js +133 -0
  363. package/dist/headers/Telnet.d.ts +40 -0
  364. package/dist/headers/Telnet.js +193 -0
  365. package/dist/headers/Teredo.d.ts +40 -0
  366. package/dist/headers/Teredo.js +251 -0
  367. package/dist/headers/TimeProtocol.d.ts +25 -0
  368. package/dist/headers/TimeProtocol.js +53 -0
  369. package/dist/headers/UDP.d.ts +19 -0
  370. package/dist/headers/UDP.js +171 -0
  371. package/dist/headers/VLAN_802dot1Q.d.ts +24 -0
  372. package/dist/headers/VLAN_802dot1Q.js +96 -0
  373. package/dist/headers/VRRP.d.ts +26 -0
  374. package/dist/headers/VRRP.js +309 -0
  375. package/dist/headers/VXLAN.d.ts +24 -0
  376. package/dist/headers/VXLAN.js +75 -0
  377. package/dist/headers/WCCP.d.ts +29 -0
  378. package/dist/headers/WCCP.js +117 -0
  379. package/dist/headers/WHOIS.d.ts +37 -0
  380. package/dist/headers/WHOIS.js +126 -0
  381. package/dist/headers/WSDiscovery.d.ts +29 -0
  382. package/dist/headers/WSDiscovery.js +118 -0
  383. package/dist/headers/WakeOnLAN.d.ts +30 -0
  384. package/dist/headers/WakeOnLAN.js +126 -0
  385. package/dist/headers/WebSocket.d.ts +26 -0
  386. package/dist/headers/WebSocket.js +173 -0
  387. package/dist/headers/WireGuard.d.ts +38 -0
  388. package/dist/headers/WireGuard.js +216 -0
  389. package/dist/headers/XMPP.d.ts +37 -0
  390. package/dist/headers/XMPP.js +149 -0
  391. package/dist/headers/Zabbix.d.ts +35 -0
  392. package/dist/headers/Zabbix.js +153 -0
  393. package/dist/headers/cms/AcsiPdu.d.ts +45 -0
  394. package/dist/headers/cms/AcsiPdu.js +112 -0
  395. package/dist/headers/cms/PerDecoder.d.ts +68 -0
  396. package/dist/headers/cms/PerDecoder.js +211 -0
  397. package/dist/headers/cms/PerReader.d.ts +64 -0
  398. package/dist/headers/cms/PerReader.js +155 -0
  399. package/dist/helper/BufferToHex.d.ts +5 -0
  400. package/dist/helper/BufferToHex.js +10 -0
  401. package/dist/helper/BufferToIP.d.ts +12 -0
  402. package/dist/helper/BufferToIP.js +23 -0
  403. package/dist/helper/BufferToNumber.d.ts +18 -0
  404. package/dist/helper/BufferToNumber.js +47 -0
  405. package/dist/helper/HexToBuffer.d.ts +7 -0
  406. package/dist/helper/HexToBuffer.js +27 -0
  407. package/dist/helper/HexToNumber.d.ts +18 -0
  408. package/dist/helper/HexToNumber.js +48 -0
  409. package/dist/helper/IPToBuffer.d.ts +12 -0
  410. package/dist/helper/IPToBuffer.js +34 -0
  411. package/dist/helper/NumberToBERBuffer.d.ts +18 -0
  412. package/dist/helper/NumberToBERBuffer.js +31 -0
  413. package/dist/helper/NumberToBERHex.d.ts +18 -0
  414. package/dist/helper/NumberToBERHex.js +52 -0
  415. package/dist/helper/NumberToBuffer.d.ts +18 -0
  416. package/dist/helper/NumberToBuffer.js +38 -0
  417. package/dist/helper/NumberToHex.d.ts +18 -0
  418. package/dist/helper/NumberToHex.js +35 -0
  419. package/dist/index.d.ts +52 -0
  420. package/dist/index.js +113 -0
  421. package/dist/lib/FlexibleObject.d.ts +27 -0
  422. package/dist/lib/FlexibleObject.js +113 -0
  423. package/dist/lib/GetBERIntegerLengthFromBuffer.d.ts +6 -0
  424. package/dist/lib/GetBERIntegerLengthFromBuffer.js +16 -0
  425. package/dist/lib/ProcessPacketPostHandlers.d.ts +13 -0
  426. package/dist/lib/ProcessPacketPostHandlers.js +53 -0
  427. package/dist/lib/SortPostHandlers.d.ts +7 -0
  428. package/dist/lib/SortPostHandlers.js +11 -0
  429. package/dist/lib/StringContentEncodingEnum.d.ts +10 -0
  430. package/dist/lib/StringContentEncodingEnum.js +14 -0
  431. package/dist/schema/ProtocolFieldJSONSchema.d.ts +35 -0
  432. package/dist/schema/ProtocolFieldJSONSchema.js +2 -0
  433. package/dist/schema/ProtocolFieldJSONSchemaDefinition.d.ts +2 -0
  434. package/dist/schema/ProtocolFieldJSONSchemaDefinition.js +2 -0
  435. package/dist/schema/ProtocolJSONSchema.d.ts +32 -0
  436. package/dist/schema/ProtocolJSONSchema.js +2 -0
  437. package/dist/types/CodecData.d.ts +7 -0
  438. package/dist/types/CodecData.js +2 -0
  439. package/dist/types/CodecDecodeResult.d.ts +10 -0
  440. package/dist/types/CodecDecodeResult.js +2 -0
  441. package/dist/types/CodecEncodeInput.d.ts +2 -0
  442. package/dist/types/CodecEncodeInput.js +2 -0
  443. package/dist/types/CodecEncodeResult.d.ts +5 -0
  444. package/dist/types/CodecEncodeResult.js +2 -0
  445. package/dist/types/CodecErrorInfo.d.ts +5 -0
  446. package/dist/types/CodecErrorInfo.js +2 -0
  447. package/dist/types/CodecModule.d.ts +2 -0
  448. package/dist/types/CodecModule.js +2 -0
  449. package/dist/types/CodecModuleConstructor.d.ts +2 -0
  450. package/dist/types/CodecModuleConstructor.js +2 -0
  451. package/dist/types/CodecSchema.d.ts +6 -0
  452. package/dist/types/CodecSchema.js +2 -0
  453. package/dist/types/DemuxProducer.d.ts +23 -0
  454. package/dist/types/DemuxProducer.js +2 -0
  455. package/dist/types/Dissection.d.ts +23 -0
  456. package/dist/types/Dissection.js +2 -0
  457. package/dist/types/HeaderTreeNode.d.ts +4 -0
  458. package/dist/types/HeaderTreeNode.js +2 -0
  459. package/dist/types/LayerGraph.d.ts +32 -0
  460. package/dist/types/LayerGraph.js +2 -0
  461. package/dist/types/PostHandlerItem.d.ts +4 -0
  462. package/dist/types/PostHandlerItem.js +2 -0
  463. package/package.json +141 -0
@@ -0,0 +1,309 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DNS = void 0;
4
+ const BaseHeader_1 = require("../abstracts/BaseHeader");
5
+ const BufferToHex_1 = require("../helper/BufferToHex");
6
+ const BufferToNumber_1 = require("../helper/BufferToNumber");
7
+ const NumberToBuffer_1 = require("../helper/NumberToBuffer");
8
+ const StringContentEncodingEnum_1 = require("../lib/StringContentEncodingEnum");
9
+ /**
10
+ * DNS — Domain Name System (RFC 1035), the message carried over UDP port 53. A 12-byte header (ID,
11
+ * flags, and the four section counts) followed by the Question, Answer, Authority and Additional
12
+ * sections. Names use label compression (RFC 1035 §4.1.4): a length octet with its top two bits set
13
+ * (0xC0) is a 14-bit pointer to an earlier offset in the message.
14
+ *
15
+ * Byte-perfect strategy: every name keeps its exact wire bytes (`raw`) and every record's RDATA is
16
+ * kept as raw hex, so compression pointers — inside names and inside RDATA (CNAME/NS/SOA/MX targets) —
17
+ * are reproduced verbatim; the resolved dotted name (`value`) is a decoded convenience. Per-RDATA
18
+ * semantic decoding (A → address, etc.) is a later enrichment on top of this faithful base. DNS over
19
+ * TCP (which prefixes a 2-byte length and can span segments) is out of scope for this single-packet
20
+ * codec and belongs to the reassembly layer.
21
+ */
22
+ class DNS extends BaseHeader_1.BaseHeader {
23
+ constructor() {
24
+ super(...arguments);
25
+ //Running parse/emit cursor shared across the four section closures (they run in schema order:
26
+ //questions → answers → authorities → additionals). Header-relative; the header is 12 bytes.
27
+ this.#cursor = 12;
28
+ this.id = 'dns';
29
+ this.name = 'Domain Name System';
30
+ this.nickname = 'DNS';
31
+ //Port-defined (udp:53). DNS has no content signature, so no heuristicFallback. DNS over TCP uses a
32
+ //2-byte length prefix and can span segments — that is a reassembly-layer concern, not this codec.
33
+ this.matchKeys = ['udpport:53'];
34
+ //A leaf header — nothing demuxes above DNS.
35
+ this.demuxProducers = [];
36
+ }
37
+ //Running parse/emit cursor shared across the four section closures (they run in schema order:
38
+ //questions → answers → authorities → additionals). Header-relative; the header is 12 bytes.
39
+ #cursor;
40
+ static #schemaCache;
41
+ get SCHEMA() {
42
+ return (DNS.#schemaCache ??= DNS.#buildSchema());
43
+ }
44
+ static #flagBit(name, byteOffset, bitOffset, label) {
45
+ return {
46
+ type: 'boolean',
47
+ label: label,
48
+ decode: function () {
49
+ this.instance.flags[name].setValue(!!this.readBits(byteOffset, 1, bitOffset, 1));
50
+ },
51
+ encode: function () {
52
+ const value = !!this.instance.flags[name].getValue();
53
+ this.instance.flags[name].setValue(value);
54
+ this.writeBits(byteOffset, 1, bitOffset, 1, value ? 1 : 0);
55
+ }
56
+ };
57
+ }
58
+ static #flagInt(name, byteOffset, bitOffset, bitLength, label) {
59
+ return {
60
+ type: 'integer',
61
+ label: label,
62
+ minimum: 0,
63
+ maximum: (1 << bitLength) - 1,
64
+ decode: function () {
65
+ this.instance.flags[name].setValue(this.readBits(byteOffset, 1, bitOffset, bitLength));
66
+ },
67
+ encode: function () {
68
+ const value = this.instance.flags[name].getValue(0);
69
+ this.writeBits(byteOffset, 1, bitOffset, bitLength, value);
70
+ }
71
+ };
72
+ }
73
+ static #buildSchema() {
74
+ const nameSchema = {
75
+ type: 'object',
76
+ label: 'Name',
77
+ properties: {
78
+ value: { type: 'string', label: 'Name' },
79
+ raw: { type: 'string', label: 'Raw', contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX, hidden: true }
80
+ }
81
+ };
82
+ return {
83
+ type: 'object',
84
+ summary: 'DNS ${id} queries=${qdcount} answers=${ancount}',
85
+ properties: {
86
+ id: this.fieldUInt('id', 0, 2, 'Transaction ID'),
87
+ //Byte 2 (bit 0 = MSB): QR, Opcode[4], AA, TC, RD. Byte 3: RA, Z, AD, CD, RCODE[4].
88
+ flags: {
89
+ type: 'object',
90
+ label: 'Flags',
91
+ properties: {
92
+ qr: this.#flagBit('qr', 2, 0, 'Response'),
93
+ opcode: this.#flagInt('opcode', 2, 1, 4, 'Opcode'),
94
+ aa: this.#flagBit('aa', 2, 5, 'Authoritative'),
95
+ tc: this.#flagBit('tc', 2, 6, 'Truncated'),
96
+ rd: this.#flagBit('rd', 2, 7, 'Recursion Desired'),
97
+ ra: this.#flagBit('ra', 3, 0, 'Recursion Available'),
98
+ z: this.#flagBit('z', 3, 1, 'Reserved'),
99
+ ad: this.#flagBit('ad', 3, 2, 'Authentic Data'),
100
+ cd: this.#flagBit('cd', 3, 3, 'Checking Disabled'),
101
+ rcode: this.#flagInt('rcode', 3, 4, 4, 'Reply Code')
102
+ }
103
+ },
104
+ qdcount: this.fieldUInt('qdcount', 4, 2, 'Questions'),
105
+ ancount: this.fieldUInt('ancount', 6, 2, 'Answer RRs'),
106
+ nscount: this.fieldUInt('nscount', 8, 2, 'Authority RRs'),
107
+ arcount: this.fieldUInt('arcount', 10, 2, 'Additional RRs'),
108
+ questions: {
109
+ type: 'array',
110
+ label: 'Queries',
111
+ items: {
112
+ type: 'object',
113
+ label: 'Query',
114
+ properties: {
115
+ name: nameSchema,
116
+ qtype: { type: 'integer', label: 'Type', minimum: 0, maximum: 65535 },
117
+ qclass: { type: 'integer', label: 'Class', minimum: 0, maximum: 65535 }
118
+ }
119
+ },
120
+ decode: function () {
121
+ const count = this.instance.qdcount.getValue(0);
122
+ const available = this.packet.length - this.startPos;
123
+ const questions = [];
124
+ let offset = 12;
125
+ for (let i = 0; i < count && offset < available; i++) {
126
+ const nameEnd = this.readName(offset);
127
+ let o = nameEnd.next;
128
+ const qtype = (0, BufferToNumber_1.BufferToUInt16)(this.readBytes(o, 2));
129
+ o += 2;
130
+ const qclass = (0, BufferToNumber_1.BufferToUInt16)(this.readBytes(o, 2));
131
+ o += 2;
132
+ questions.push({ name: nameEnd.name, qtype: qtype, qclass: qclass });
133
+ offset = o;
134
+ }
135
+ this.#cursor = offset;
136
+ this.instance.questions.setValue(questions);
137
+ },
138
+ encode: function () {
139
+ const questions = this.instance.questions.getValue();
140
+ let offset = 12;
141
+ if (questions) {
142
+ for (const question of questions) {
143
+ offset = this.writeName(offset, question.name);
144
+ this.writeBytes(offset, (0, NumberToBuffer_1.UInt16ToBuffer)(question.qtype ? question.qtype : 0));
145
+ offset += 2;
146
+ this.writeBytes(offset, (0, NumberToBuffer_1.UInt16ToBuffer)(question.qclass ? question.qclass : 0));
147
+ offset += 2;
148
+ }
149
+ }
150
+ this.#cursor = offset;
151
+ }
152
+ },
153
+ answers: this.#recordSection('answers', 'Answers', 'ancount'),
154
+ authorities: this.#recordSection('authorities', 'Authoritative nameservers', 'nscount'),
155
+ additionals: this.#recordSection('additionals', 'Additional records', 'arcount')
156
+ }
157
+ };
158
+ }
159
+ //A resource-record section (Answer/Authority/Additional): NAME TYPE CLASS TTL RDLENGTH RDATA, each
160
+ //continuing from the shared cursor. RDLENGTH is derived from the RDATA byte length on encode.
161
+ static #recordSection(field, label, countField) {
162
+ const nameSchema = {
163
+ type: 'object',
164
+ label: 'Name',
165
+ properties: {
166
+ value: { type: 'string', label: 'Name' },
167
+ raw: { type: 'string', label: 'Raw', contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX, hidden: true }
168
+ }
169
+ };
170
+ return {
171
+ type: 'array',
172
+ label: label,
173
+ items: {
174
+ type: 'object',
175
+ label: 'Resource Record',
176
+ properties: {
177
+ name: nameSchema,
178
+ type: { type: 'integer', label: 'Type', minimum: 0, maximum: 65535 },
179
+ class: { type: 'integer', label: 'Class', minimum: 0, maximum: 65535 },
180
+ ttl: { type: 'integer', label: 'Time to Live', minimum: 0, maximum: 4294967295 },
181
+ rdlength: { type: 'integer', label: 'Data Length', minimum: 0, maximum: 65535 },
182
+ rdata: { type: 'string', label: 'Data', contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX }
183
+ }
184
+ },
185
+ decode: function () {
186
+ const count = this.instance[countField].getValue(0);
187
+ const available = this.packet.length - this.startPos;
188
+ const records = [];
189
+ let offset = this.#cursor;
190
+ for (let i = 0; i < count && offset < available; i++) {
191
+ const nameEnd = this.readName(offset);
192
+ let o = nameEnd.next;
193
+ const type = (0, BufferToNumber_1.BufferToUInt16)(this.readBytes(o, 2));
194
+ o += 2;
195
+ const cls = (0, BufferToNumber_1.BufferToUInt16)(this.readBytes(o, 2));
196
+ o += 2;
197
+ const ttl = (0, BufferToNumber_1.BufferToUInt32)(this.readBytes(o, 4));
198
+ o += 4;
199
+ const rdlength = (0, BufferToNumber_1.BufferToUInt16)(this.readBytes(o, 2));
200
+ o += 2;
201
+ let rdata = '';
202
+ if (rdlength) {
203
+ rdata = (0, BufferToHex_1.BufferToHex)(this.readBytes(o, rdlength));
204
+ o += rdlength;
205
+ }
206
+ records.push({ name: nameEnd.name, type: type, class: cls, ttl: ttl, rdlength: rdlength, rdata: rdata });
207
+ offset = o;
208
+ }
209
+ this.#cursor = offset;
210
+ this.instance[field].setValue(records);
211
+ },
212
+ encode: function () {
213
+ const records = this.instance[field].getValue();
214
+ let offset = this.#cursor;
215
+ if (records) {
216
+ for (const record of records) {
217
+ offset = this.writeName(offset, record.name);
218
+ this.writeBytes(offset, (0, NumberToBuffer_1.UInt16ToBuffer)(record.type ? record.type : 0));
219
+ offset += 2;
220
+ this.writeBytes(offset, (0, NumberToBuffer_1.UInt16ToBuffer)(record.class ? record.class : 0));
221
+ offset += 2;
222
+ this.writeBytes(offset, (0, NumberToBuffer_1.UInt32ToBuffer)(record.ttl ? record.ttl : 0));
223
+ offset += 4;
224
+ const rdata = Buffer.from(record.rdata ? record.rdata : '', 'hex');
225
+ //RDLENGTH is authoritatively the RDATA byte length — derive it (byte-perfect,
226
+ //since the decoded RDLENGTH equals the RDATA length).
227
+ this.writeBytes(offset, (0, NumberToBuffer_1.UInt16ToBuffer)(rdata.length));
228
+ offset += 2;
229
+ if (rdata.length) {
230
+ this.writeBytes(offset, rdata);
231
+ offset += rdata.length;
232
+ }
233
+ }
234
+ }
235
+ this.#cursor = offset;
236
+ }
237
+ };
238
+ }
239
+ /**
240
+ * Parse the name at header-relative `offset`. Returns the resolved value + exact physical raw bytes
241
+ * and the offset just past the physical name. Compression pointers are followed only to build the
242
+ * resolved value (dry-run reads that never grow headerLength); the physical bytes are the local
243
+ * labels plus the terminating null OR the 2-byte pointer, so endPos stays exact.
244
+ */
245
+ readName(offset) {
246
+ const labels = [];
247
+ const visited = new Set();
248
+ let o = offset;
249
+ let physicalEnd = -1;
250
+ let guard = 0;
251
+ while (guard++ < 256) {
252
+ if (visited.has(o))
253
+ break;
254
+ visited.add(o);
255
+ const len = (0, BufferToNumber_1.BufferToUInt8)(this.readBytes(o, 1, true));
256
+ if (len === 0) {
257
+ if (physicalEnd < 0)
258
+ physicalEnd = o + 1;
259
+ break;
260
+ }
261
+ if ((len & 0xc0) === 0xc0) {
262
+ const pointer = ((len & 0x3f) << 8) | (0, BufferToNumber_1.BufferToUInt8)(this.readBytes(o + 1, 1, true));
263
+ if (physicalEnd < 0)
264
+ physicalEnd = o + 2;
265
+ o = pointer;
266
+ continue;
267
+ }
268
+ labels.push(this.readBytes(o + 1, len, true).toString('latin1'));
269
+ o = o + 1 + len;
270
+ }
271
+ if (physicalEnd < 0)
272
+ physicalEnd = o;
273
+ const rawLength = physicalEnd - offset;
274
+ //Physically read the local name bytes (non-dry-run) so headerLength/endPos cover them.
275
+ const raw = rawLength > 0 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(offset, rawLength)) : '';
276
+ return { name: { value: labels.join('.'), raw: raw }, next: physicalEnd };
277
+ }
278
+ /**
279
+ * Write a name at `offset`. Re-emits the exact `raw` wire bytes when present (byte-perfect for a
280
+ * decoded name, including its compression pointer); otherwise builds an uncompressed encoding from
281
+ * the dotted `value` (for names crafted from scratch). Returns the offset past the written name.
282
+ */
283
+ writeName(offset, name) {
284
+ const raw = name && name.raw ? name.raw : '';
285
+ if (raw) {
286
+ const rawBuffer = Buffer.from(raw, 'hex');
287
+ this.writeBytes(offset, rawBuffer);
288
+ return offset + rawBuffer.length;
289
+ }
290
+ let o = offset;
291
+ const value = name && name.value ? name.value : '';
292
+ if (value.length) {
293
+ for (const label of value.split('.')) {
294
+ const labelBuffer = Buffer.from(label, 'latin1');
295
+ this.writeBytes(o, (0, NumberToBuffer_1.UInt8ToBuffer)(labelBuffer.length));
296
+ o += 1;
297
+ this.writeBytes(o, labelBuffer);
298
+ o += labelBuffer.length;
299
+ }
300
+ }
301
+ this.writeBytes(o, (0, NumberToBuffer_1.UInt8ToBuffer)(0));
302
+ o += 1;
303
+ return o;
304
+ }
305
+ match() {
306
+ return !!this.prevCodecModule && this.prevCodecModule.id === 'udp';
307
+ }
308
+ }
309
+ exports.DNS = DNS;
@@ -0,0 +1,33 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * DTLS — Datagram Transport Layer Security (RFC 6347), the datagram-oriented sibling of TLS carried over
6
+ * UDP. Its record layer mirrors TLS's but adds explicit anti-replay sequencing: every record begins with a
7
+ * fixed 13-byte header — ContentType(1) + Version(2) + Epoch(2) + SequenceNumber(6) + Length(2) — followed
8
+ * by the `Length`-byte Fragment. ContentType names the sub-protocol (20 change_cipher_spec, 21 alert,
9
+ * 22 handshake, 23 application_data, 24 heartbeat); Version is 0xfeff for DTLS 1.0 or 0xfefd for DTLS 1.2
10
+ * (deliberately ~ the ones-complement of the TLS version so the two never collide). Epoch counts cipher
11
+ * changes and SequenceNumber is a 48-bit per-epoch counter.
12
+ *
13
+ * DTLS has no single well-known UDP port (it underlies WebRTC, CoAP-over-DTLS, OpenVPN-style tunnels,
14
+ * etc.), so this header is bucketed on udp:443 yet opts into the content-heuristic fallback: its record
15
+ * header is a strong signature (ContentType in 20..25 AND Version feff/fefd) that lets it be recognized on
16
+ * any UDP port. This is a minimal record-layer slice: it structures one record header and keeps the
17
+ * Fragment verbatim as hex (bounded by `Length` and the UDP payload); the Fragment's sub-protocol
18
+ * (handshake / alert / …) and any second pipelined record in the same datagram are left to later
19
+ * enrichment / the codec's recursion (a leaf advances only over its own record). The Length is honored
20
+ * when supplied (a crafted record may lie) else derived from the Fragment; a well-formed record
21
+ * round-trips byte-for-byte.
22
+ */
23
+ export declare class DTLS extends BaseHeader {
24
+ #private;
25
+ get SCHEMA(): ProtocolJSONSchema;
26
+ readonly id: string;
27
+ readonly name: string;
28
+ readonly nickname: string;
29
+ readonly matchKeys: string[];
30
+ readonly heuristicFallback: boolean;
31
+ match(): boolean;
32
+ readonly demuxProducers: DemuxProducer[];
33
+ }
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DTLS = void 0;
4
+ const BaseHeader_1 = require("../abstracts/BaseHeader");
5
+ const BufferToHex_1 = require("../helper/BufferToHex");
6
+ const HexToBuffer_1 = require("../helper/HexToBuffer");
7
+ const BufferToNumber_1 = require("../helper/BufferToNumber");
8
+ const NumberToBuffer_1 = require("../helper/NumberToBuffer");
9
+ const StringContentEncodingEnum_1 = require("../lib/StringContentEncodingEnum");
10
+ /**
11
+ * DTLS — Datagram Transport Layer Security (RFC 6347), the datagram-oriented sibling of TLS carried over
12
+ * UDP. Its record layer mirrors TLS's but adds explicit anti-replay sequencing: every record begins with a
13
+ * fixed 13-byte header — ContentType(1) + Version(2) + Epoch(2) + SequenceNumber(6) + Length(2) — followed
14
+ * by the `Length`-byte Fragment. ContentType names the sub-protocol (20 change_cipher_spec, 21 alert,
15
+ * 22 handshake, 23 application_data, 24 heartbeat); Version is 0xfeff for DTLS 1.0 or 0xfefd for DTLS 1.2
16
+ * (deliberately ~ the ones-complement of the TLS version so the two never collide). Epoch counts cipher
17
+ * changes and SequenceNumber is a 48-bit per-epoch counter.
18
+ *
19
+ * DTLS has no single well-known UDP port (it underlies WebRTC, CoAP-over-DTLS, OpenVPN-style tunnels,
20
+ * etc.), so this header is bucketed on udp:443 yet opts into the content-heuristic fallback: its record
21
+ * header is a strong signature (ContentType in 20..25 AND Version feff/fefd) that lets it be recognized on
22
+ * any UDP port. This is a minimal record-layer slice: it structures one record header and keeps the
23
+ * Fragment verbatim as hex (bounded by `Length` and the UDP payload); the Fragment's sub-protocol
24
+ * (handshake / alert / …) and any second pipelined record in the same datagram are left to later
25
+ * enrichment / the codec's recursion (a leaf advances only over its own record). The Length is honored
26
+ * when supplied (a crafted record may lie) else derived from the Fragment; a well-formed record
27
+ * round-trips byte-for-byte.
28
+ */
29
+ class DTLS extends BaseHeader_1.BaseHeader {
30
+ constructor() {
31
+ super(...arguments);
32
+ this.id = 'dtls';
33
+ this.name = 'Datagram Transport Layer Security';
34
+ this.nickname = 'DTLS';
35
+ //Bucketed on the common DTLS-over-HTTPS port; heuristicFallback keeps it recognized on any other UDP
36
+ //port via its record-header signature (DTLS has no single well-known port).
37
+ this.matchKeys = ['udpport:443'];
38
+ this.heuristicFallback = true;
39
+ //A leaf header — the record Fragment's sub-protocol is kept verbatim for now.
40
+ this.demuxProducers = [];
41
+ }
42
+ static #schemaCache;
43
+ get SCHEMA() {
44
+ return (DTLS.#schemaCache ??= DTLS.#buildSchema());
45
+ }
46
+ /**
47
+ * Bytes available to this record, bounded by the enclosing UDP payload (udp.length - 8) so a lying
48
+ * Length near the end of the datagram cannot read into a trailing record / padding, and so the
49
+ * Fragment stops at the datagram boundary rather than swallowing the whole captured buffer.
50
+ */
51
+ #available() {
52
+ let available = this.packet.length - this.startPos;
53
+ const prev = this.prevCodecModule;
54
+ if (prev && prev.id === 'udp') {
55
+ const udpPayload = prev.instance.length.getValue(0) - 8;
56
+ if (udpPayload >= 0 && udpPayload < available)
57
+ available = udpPayload;
58
+ }
59
+ return available < 0 ? 0 : available;
60
+ }
61
+ static #buildSchema() {
62
+ return {
63
+ type: 'object',
64
+ summary: 'DTLS type=${contentType} len=${length}',
65
+ properties: {
66
+ //ContentType (20 change_cipher_spec, 21 alert, 22 handshake, 23 application_data,
67
+ //24 heartbeat). Kept as an integer — the record header is otherwise opaque here.
68
+ contentType: this.fieldUInt('contentType', 0, 1, 'Content Type'),
69
+ //Version — 0xfeff DTLS 1.0 / 0xfefd DTLS 1.2. Stored as a lower-case hex string so any
70
+ //value round-trips verbatim (the match gate restricts real selection to feff/fefd).
71
+ version: this.fieldHex('version', 1, 2, 'Version'),
72
+ epoch: this.fieldUInt('epoch', 3, 2, 'Epoch'),
73
+ //48-bit per-epoch sequence number, kept verbatim as hex (exceeds the 32-bit fieldUInt path).
74
+ sequenceNumber: this.fieldHex('sequenceNumber', 5, 6, 'Sequence Number'),
75
+ length: {
76
+ type: 'integer',
77
+ label: 'Length',
78
+ minimum: 0,
79
+ maximum: 65535,
80
+ decode: function () {
81
+ this.instance.length.setValue((0, BufferToNumber_1.BufferToUInt16)(this.readBytes(11, 2)));
82
+ },
83
+ encode: function () {
84
+ //Honored when supplied (a crafted record may lie); else derived from the Fragment.
85
+ const provided = this.instance.length.getValue();
86
+ let value = (provided !== undefined && provided !== null)
87
+ ? provided
88
+ : (0, HexToBuffer_1.HexToBuffer)(this.instance.fragment.getValue('')).length;
89
+ if (value > 65535) {
90
+ this.recordError(this.instance.length.getPath(), 'Maximum value is 65535');
91
+ value = 65535;
92
+ }
93
+ if (value < 0) {
94
+ this.recordError(this.instance.length.getPath(), 'Minimum value is 0');
95
+ value = 0;
96
+ }
97
+ this.instance.length.setValue(value);
98
+ this.writeBytes(11, (0, NumberToBuffer_1.UInt16ToBuffer)(value));
99
+ }
100
+ },
101
+ //The record Fragment (the sub-protocol payload), kept verbatim. Bounded by the decoded
102
+ //Length and the UDP payload, so trailing / pipelined records are left to the codec's
103
+ //recursion (a leaf record does not re-match itself — its parent is no longer UDP).
104
+ fragment: {
105
+ type: 'string',
106
+ label: 'Fragment',
107
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
108
+ decode: function () {
109
+ const available = this.#available();
110
+ const maxFragment = available - 13;
111
+ let fragmentLength = this.instance.length.getValue(0);
112
+ if (maxFragment <= 0)
113
+ fragmentLength = 0;
114
+ else if (fragmentLength > maxFragment)
115
+ fragmentLength = maxFragment;
116
+ this.instance.fragment.setValue(fragmentLength > 0 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(13, fragmentLength)) : '');
117
+ },
118
+ encode: function () {
119
+ const fragment = this.instance.fragment.getValue('');
120
+ if (fragment)
121
+ this.writeBytes(13, (0, HexToBuffer_1.HexToBuffer)(fragment));
122
+ }
123
+ }
124
+ }
125
+ };
126
+ }
127
+ match() {
128
+ //DTLS rides UDP. Require the full 13-byte record header within the UDP payload, a ContentType in
129
+ //the DTLS sub-protocol range (20..25), and a DTLS 1.0/1.2 Version (feff/fefd) — a distinctive
130
+ //two-field signature so non-DTLS UDP traffic (on 443 or elsewhere) falls through to raw.
131
+ if (!this.prevCodecModule || this.prevCodecModule.id !== 'udp')
132
+ return false;
133
+ if (this.#available() < 13)
134
+ return false;
135
+ const contentType = this.readBytes(0, 1, true)[0];
136
+ if (contentType < 20 || contentType > 25)
137
+ return false;
138
+ const version = (0, BufferToHex_1.BufferToHex)(this.readBytes(1, 2, true));
139
+ return version === 'feff' || version === 'fefd';
140
+ }
141
+ }
142
+ exports.DTLS = DTLS;
@@ -0,0 +1,34 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * Diameter (RFC 6733), the RADIUS successor — TCP/SCTP port 3868. A 20-byte fixed header, all
6
+ * big-endian: Version (1, always 1) + Message Length (3, the whole message including the header and the
7
+ * padded AVPs) + Command Flags (1: R/P/E/T in the high nibble) + Command Code (3) + Application-Id (4) +
8
+ * Hop-by-Hop Id (4) + End-to-End Id (4). It is followed by AVPs until the Message Length is consumed.
9
+ *
10
+ * Each AVP is AVP Code(4) + Flags(1: V/M/P) + Length(3, counts the AVP header + data but NOT the trailing
11
+ * padding) + [Vendor-Id(4) only when the V flag 0x80 is set] + data + padding (zero bytes to the next
12
+ * 4-byte boundary). Because the AVP Length excludes the padding, the alignment pad is the tricky part of a
13
+ * byte-perfect round-trip: it is captured verbatim (per AVP, as hex) and re-emitted, so even a malformed
14
+ * non-zero pad reproduces exactly. AVPs are carried generically (code + flags + verbatim hex value) so
15
+ * every AVP — including Grouped AVPs whose value nests sub-AVPs — round-trips; per-AVP semantic decoding
16
+ * is a later enrichment. The walk is bounded by the Message Length (and the captured bytes), so any
17
+ * trailing/pipelined bytes spill to the raw layer.
18
+ *
19
+ * MATCH is a two-signal gate — the well-known port bucket (tcpport:3868) plus a content signature
20
+ * (Version == 1 and a plausible Message Length >= 20) — so there is deliberately NO heuristicFallback:
21
+ * unlike a content-signed protocol (TLS/IEC104), Diameter's first byte (a constant 1) and 3-byte length
22
+ * are far too weak a signature to claim arbitrary off-port TCP traffic, so recognition stays anchored to
23
+ * the port bucket. Non-Diameter traffic on 3868 (or a Version != 1) falls through to raw.
24
+ */
25
+ export declare class Diameter extends BaseHeader {
26
+ #private;
27
+ get SCHEMA(): ProtocolJSONSchema;
28
+ readonly id: string;
29
+ readonly name: string;
30
+ readonly nickname: string;
31
+ readonly matchKeys: string[];
32
+ match(): boolean;
33
+ readonly demuxProducers: DemuxProducer[];
34
+ }