@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.
- package/CHANGELOG.md +17 -0
- package/LICENSE +21 -0
- package/README.md +352 -0
- package/README.zh-CN.md +342 -0
- package/dist/Codec.d.ts +133 -0
- package/dist/Codec.js +632 -0
- package/dist/PacketHeaders.d.ts +189 -0
- package/dist/PacketHeaders.js +384 -0
- package/dist/abstracts/BaseHeader.d.ts +325 -0
- package/dist/abstracts/BaseHeader.js +734 -0
- package/dist/errors/CodecSchemaValidateError.d.ts +4 -0
- package/dist/errors/CodecSchemaValidateError.js +11 -0
- package/dist/headers/ADSAMS.d.ts +33 -0
- package/dist/headers/ADSAMS.js +208 -0
- package/dist/headers/AH.d.ts +28 -0
- package/dist/headers/AH.js +137 -0
- package/dist/headers/AMQP.d.ts +31 -0
- package/dist/headers/AMQP.js +316 -0
- package/dist/headers/ARP.d.ts +26 -0
- package/dist/headers/ARP.js +243 -0
- package/dist/headers/BACnetIP.d.ts +27 -0
- package/dist/headers/BACnetIP.js +97 -0
- package/dist/headers/BFD.d.ts +28 -0
- package/dist/headers/BFD.js +155 -0
- package/dist/headers/BGP.d.ts +27 -0
- package/dist/headers/BGP.js +111 -0
- package/dist/headers/BSAPIP.d.ts +33 -0
- package/dist/headers/BSAPIP.js +78 -0
- package/dist/headers/Babel.d.ts +32 -0
- package/dist/headers/Babel.js +224 -0
- package/dist/headers/BitTorrent.d.ts +28 -0
- package/dist/headers/BitTorrent.js +72 -0
- package/dist/headers/C37118.d.ts +26 -0
- package/dist/headers/C37118.js +147 -0
- package/dist/headers/CAPWAP.d.ts +38 -0
- package/dist/headers/CAPWAP.js +275 -0
- package/dist/headers/CDP.d.ts +25 -0
- package/dist/headers/CDP.js +117 -0
- package/dist/headers/CMS.d.ts +33 -0
- package/dist/headers/CMS.js +238 -0
- package/dist/headers/COTP.d.ts +30 -0
- package/dist/headers/COTP.js +193 -0
- package/dist/headers/CassandraCQL.d.ts +28 -0
- package/dist/headers/CassandraCQL.js +117 -0
- package/dist/headers/CoAP.d.ts +29 -0
- package/dist/headers/CoAP.js +140 -0
- package/dist/headers/Codesys.d.ts +32 -0
- package/dist/headers/Codesys.js +119 -0
- package/dist/headers/Collectd.d.ts +29 -0
- package/dist/headers/Collectd.js +154 -0
- package/dist/headers/DCCP.d.ts +30 -0
- package/dist/headers/DCCP.js +204 -0
- package/dist/headers/DHCP.d.ts +26 -0
- package/dist/headers/DHCP.js +148 -0
- package/dist/headers/DHCPFailover.d.ts +30 -0
- package/dist/headers/DHCPFailover.js +104 -0
- package/dist/headers/DHCPv6.d.ts +25 -0
- package/dist/headers/DHCPv6.js +145 -0
- package/dist/headers/DNP3.d.ts +27 -0
- package/dist/headers/DNP3.js +150 -0
- package/dist/headers/DNS.d.ts +55 -0
- package/dist/headers/DNS.js +309 -0
- package/dist/headers/DTLS.d.ts +33 -0
- package/dist/headers/DTLS.js +142 -0
- package/dist/headers/Diameter.d.ts +34 -0
- package/dist/headers/Diameter.js +229 -0
- package/dist/headers/EAPOL.d.ts +32 -0
- package/dist/headers/EAPOL.js +135 -0
- package/dist/headers/EIGRP.d.ts +28 -0
- package/dist/headers/EIGRP.js +165 -0
- package/dist/headers/ENIP.d.ts +31 -0
- package/dist/headers/ENIP.js +164 -0
- package/dist/headers/ESP.d.ts +27 -0
- package/dist/headers/ESP.js +140 -0
- package/dist/headers/Elasticsearch.d.ts +30 -0
- package/dist/headers/Elasticsearch.js +125 -0
- package/dist/headers/EtherCAT.d.ts +35 -0
- package/dist/headers/EtherCAT.js +150 -0
- package/dist/headers/EthernetII.d.ts +28 -0
- package/dist/headers/EthernetII.js +117 -0
- package/dist/headers/FCoE.d.ts +38 -0
- package/dist/headers/FCoE.js +210 -0
- package/dist/headers/FTP.d.ts +34 -0
- package/dist/headers/FTP.js +158 -0
- package/dist/headers/Finger.d.ts +41 -0
- package/dist/headers/Finger.js +135 -0
- package/dist/headers/FoundationFieldbusHSE.d.ts +43 -0
- package/dist/headers/FoundationFieldbusHSE.js +163 -0
- package/dist/headers/GELF.d.ts +35 -0
- package/dist/headers/GELF.js +261 -0
- package/dist/headers/GENEVE.d.ts +26 -0
- package/dist/headers/GENEVE.js +209 -0
- package/dist/headers/GESRTP.d.ts +32 -0
- package/dist/headers/GESRTP.js +141 -0
- package/dist/headers/GLBP.d.ts +29 -0
- package/dist/headers/GLBP.js +159 -0
- package/dist/headers/GRE.d.ts +27 -0
- package/dist/headers/GRE.js +181 -0
- package/dist/headers/GTPU.d.ts +25 -0
- package/dist/headers/GTPU.js +203 -0
- package/dist/headers/GTPv2C.d.ts +30 -0
- package/dist/headers/GTPv2C.js +281 -0
- package/dist/headers/GitProtocol.d.ts +34 -0
- package/dist/headers/GitProtocol.js +141 -0
- package/dist/headers/Goose.d.ts +115 -0
- package/dist/headers/Goose.js +1067 -0
- package/dist/headers/Gopher.d.ts +43 -0
- package/dist/headers/Gopher.js +182 -0
- package/dist/headers/HARTIP.d.ts +30 -0
- package/dist/headers/HARTIP.js +145 -0
- package/dist/headers/HSR.d.ts +27 -0
- package/dist/headers/HSR.js +105 -0
- package/dist/headers/HSRP.d.ts +26 -0
- package/dist/headers/HSRP.js +173 -0
- package/dist/headers/HTTP.d.ts +32 -0
- package/dist/headers/HTTP.js +153 -0
- package/dist/headers/HTTP2.d.ts +34 -0
- package/dist/headers/HTTP2.js +190 -0
- package/dist/headers/IAX2.d.ts +33 -0
- package/dist/headers/IAX2.js +274 -0
- package/dist/headers/ICMP.d.ts +15 -0
- package/dist/headers/ICMP.js +148 -0
- package/dist/headers/ICMPv6.d.ts +15 -0
- package/dist/headers/ICMPv6.js +129 -0
- package/dist/headers/IEC104_I_Frame.d.ts +23 -0
- package/dist/headers/IEC104_I_Frame.js +6489 -0
- package/dist/headers/IEC104_S_Frame.d.ts +26 -0
- package/dist/headers/IEC104_S_Frame.js +135 -0
- package/dist/headers/IEC104_U_Frame.d.ts +27 -0
- package/dist/headers/IEC104_U_Frame.js +176 -0
- package/dist/headers/IEC61850SampledValues.d.ts +20 -0
- package/dist/headers/IEC61850SampledValues.js +420 -0
- package/dist/headers/IGMP.d.ts +31 -0
- package/dist/headers/IGMP.js +274 -0
- package/dist/headers/IMAP.d.ts +32 -0
- package/dist/headers/IMAP.js +185 -0
- package/dist/headers/IPFIX.d.ts +29 -0
- package/dist/headers/IPFIX.js +156 -0
- package/dist/headers/IPv4.d.ts +20 -0
- package/dist/headers/IPv4.js +370 -0
- package/dist/headers/IPv6.d.ts +29 -0
- package/dist/headers/IPv6.js +209 -0
- package/dist/headers/IPv6HopByHopOptions.d.ts +81 -0
- package/dist/headers/IPv6HopByHopOptions.js +495 -0
- package/dist/headers/IRC.d.ts +34 -0
- package/dist/headers/IRC.js +175 -0
- package/dist/headers/ISAKMP.d.ts +29 -0
- package/dist/headers/ISAKMP.js +197 -0
- package/dist/headers/ISCSI.d.ts +39 -0
- package/dist/headers/ISCSI.js +289 -0
- package/dist/headers/ISIS.d.ts +25 -0
- package/dist/headers/ISIS.js +79 -0
- package/dist/headers/ISOSession.d.ts +27 -0
- package/dist/headers/ISOSession.js +343 -0
- package/dist/headers/Ident.d.ts +42 -0
- package/dist/headers/Ident.js +184 -0
- package/dist/headers/KNXnetIP.d.ts +30 -0
- package/dist/headers/KNXnetIP.js +135 -0
- package/dist/headers/Kafka.d.ts +35 -0
- package/dist/headers/Kafka.js +128 -0
- package/dist/headers/Kerberos.d.ts +30 -0
- package/dist/headers/Kerberos.js +217 -0
- package/dist/headers/L2TP.d.ts +26 -0
- package/dist/headers/L2TP.js +297 -0
- package/dist/headers/LACP.d.ts +31 -0
- package/dist/headers/LACP.js +151 -0
- package/dist/headers/LDAP.d.ts +31 -0
- package/dist/headers/LDAP.js +226 -0
- package/dist/headers/LDP.d.ts +31 -0
- package/dist/headers/LDP.js +138 -0
- package/dist/headers/LISP.d.ts +30 -0
- package/dist/headers/LISP.js +103 -0
- package/dist/headers/LLC.d.ts +27 -0
- package/dist/headers/LLC.js +81 -0
- package/dist/headers/LLDP.d.ts +26 -0
- package/dist/headers/LLDP.js +126 -0
- package/dist/headers/LLMNR.d.ts +23 -0
- package/dist/headers/LLMNR.js +40 -0
- package/dist/headers/LPD.d.ts +31 -0
- package/dist/headers/LPD.js +159 -0
- package/dist/headers/MACsec.d.ts +34 -0
- package/dist/headers/MACsec.js +178 -0
- package/dist/headers/MDNS.d.ts +26 -0
- package/dist/headers/MDNS.js +45 -0
- package/dist/headers/MGCP.d.ts +30 -0
- package/dist/headers/MGCP.js +155 -0
- package/dist/headers/MMS.d.ts +29 -0
- package/dist/headers/MMS.js +243 -0
- package/dist/headers/MPLS.d.ts +31 -0
- package/dist/headers/MPLS.js +145 -0
- package/dist/headers/MQTT.d.ts +30 -0
- package/dist/headers/MQTT.js +173 -0
- package/dist/headers/MQTTSN.d.ts +34 -0
- package/dist/headers/MQTTSN.js +177 -0
- package/dist/headers/MarkerProtocol.d.ts +32 -0
- package/dist/headers/MarkerProtocol.js +153 -0
- package/dist/headers/Megaco.d.ts +32 -0
- package/dist/headers/Megaco.js +144 -0
- package/dist/headers/Memcached.d.ts +44 -0
- package/dist/headers/Memcached.js +285 -0
- package/dist/headers/ModbusTCP.d.ts +25 -0
- package/dist/headers/ModbusTCP.js +99 -0
- package/dist/headers/ModbusUDP.d.ts +26 -0
- package/dist/headers/ModbusUDP.js +100 -0
- package/dist/headers/MongoDB.d.ts +33 -0
- package/dist/headers/MongoDB.js +143 -0
- package/dist/headers/MySQL.d.ts +30 -0
- package/dist/headers/MySQL.js +114 -0
- package/dist/headers/NATS.d.ts +29 -0
- package/dist/headers/NATS.js +135 -0
- package/dist/headers/NBDS.d.ts +34 -0
- package/dist/headers/NBDS.js +176 -0
- package/dist/headers/NBNS.d.ts +34 -0
- package/dist/headers/NBNS.js +78 -0
- package/dist/headers/NBSS.d.ts +36 -0
- package/dist/headers/NBSS.js +137 -0
- package/dist/headers/NFS.d.ts +36 -0
- package/dist/headers/NFS.js +273 -0
- package/dist/headers/NHRP.d.ts +32 -0
- package/dist/headers/NHRP.js +154 -0
- package/dist/headers/NNTP.d.ts +35 -0
- package/dist/headers/NNTP.js +162 -0
- package/dist/headers/NTP.d.ts +18 -0
- package/dist/headers/NTP.js +73 -0
- package/dist/headers/NetFlowV5.d.ts +28 -0
- package/dist/headers/NetFlowV5.js +205 -0
- package/dist/headers/OLSR.d.ts +31 -0
- package/dist/headers/OLSR.js +213 -0
- package/dist/headers/OPCUA.d.ts +33 -0
- package/dist/headers/OPCUA.js +165 -0
- package/dist/headers/OPCUAPubSub.d.ts +33 -0
- package/dist/headers/OPCUAPubSub.js +144 -0
- package/dist/headers/OSPF.d.ts +31 -0
- package/dist/headers/OSPF.js +365 -0
- package/dist/headers/OmronFINS.d.ts +31 -0
- package/dist/headers/OmronFINS.js +90 -0
- package/dist/headers/OpenFlow.d.ts +30 -0
- package/dist/headers/OpenFlow.js +113 -0
- package/dist/headers/OpenVPN.d.ts +35 -0
- package/dist/headers/OpenVPN.js +214 -0
- package/dist/headers/PCWorx.d.ts +35 -0
- package/dist/headers/PCWorx.js +115 -0
- package/dist/headers/PIM.d.ts +27 -0
- package/dist/headers/PIM.js +129 -0
- package/dist/headers/POP3.d.ts +31 -0
- package/dist/headers/POP3.js +152 -0
- package/dist/headers/POWERLINK.d.ts +28 -0
- package/dist/headers/POWERLINK.js +116 -0
- package/dist/headers/PPPoEDiscovery.d.ts +29 -0
- package/dist/headers/PPPoEDiscovery.js +198 -0
- package/dist/headers/PPPoESession.d.ts +28 -0
- package/dist/headers/PPPoESession.js +125 -0
- package/dist/headers/PPTP.d.ts +30 -0
- package/dist/headers/PPTP.js +122 -0
- package/dist/headers/PROFINETRT.d.ts +28 -0
- package/dist/headers/PROFINETRT.js +74 -0
- package/dist/headers/PTP.d.ts +34 -0
- package/dist/headers/PTP.js +213 -0
- package/dist/headers/PostgreSQL.d.ts +40 -0
- package/dist/headers/PostgreSQL.js +236 -0
- package/dist/headers/QUIC.d.ts +34 -0
- package/dist/headers/QUIC.js +308 -0
- package/dist/headers/RADIUS.d.ts +24 -0
- package/dist/headers/RADIUS.js +138 -0
- package/dist/headers/RDP.d.ts +27 -0
- package/dist/headers/RDP.js +93 -0
- package/dist/headers/RFB.d.ts +39 -0
- package/dist/headers/RFB.js +151 -0
- package/dist/headers/RGoose.d.ts +72 -0
- package/dist/headers/RGoose.js +340 -0
- package/dist/headers/RIP.d.ts +29 -0
- package/dist/headers/RIP.js +133 -0
- package/dist/headers/RIPng.d.ts +26 -0
- package/dist/headers/RIPng.js +140 -0
- package/dist/headers/RMCP.d.ts +26 -0
- package/dist/headers/RMCP.js +155 -0
- package/dist/headers/RSVP.d.ts +31 -0
- package/dist/headers/RSVP.js +263 -0
- package/dist/headers/RTCP.d.ts +34 -0
- package/dist/headers/RTCP.js +217 -0
- package/dist/headers/RTP.d.ts +33 -0
- package/dist/headers/RTP.js +291 -0
- package/dist/headers/RTPS.d.ts +33 -0
- package/dist/headers/RTPS.js +182 -0
- package/dist/headers/RTSP.d.ts +36 -0
- package/dist/headers/RTSP.js +184 -0
- package/dist/headers/RawData.d.ts +17 -0
- package/dist/headers/RawData.js +43 -0
- package/dist/headers/Redis.d.ts +32 -0
- package/dist/headers/Redis.js +202 -0
- package/dist/headers/Rlogin.d.ts +42 -0
- package/dist/headers/Rlogin.js +139 -0
- package/dist/headers/Rsync.d.ts +28 -0
- package/dist/headers/Rsync.js +117 -0
- package/dist/headers/S7comm.d.ts +36 -0
- package/dist/headers/S7comm.js +244 -0
- package/dist/headers/SCTP.d.ts +35 -0
- package/dist/headers/SCTP.js +174 -0
- package/dist/headers/SFlow.d.ts +29 -0
- package/dist/headers/SFlow.js +242 -0
- package/dist/headers/SIP.d.ts +27 -0
- package/dist/headers/SIP.js +146 -0
- package/dist/headers/SLMP.d.ts +36 -0
- package/dist/headers/SLMP.js +154 -0
- package/dist/headers/SLP.d.ts +30 -0
- package/dist/headers/SLP.js +207 -0
- package/dist/headers/SLPv1.d.ts +32 -0
- package/dist/headers/SLPv1.js +138 -0
- package/dist/headers/SMB1.d.ts +37 -0
- package/dist/headers/SMB1.js +200 -0
- package/dist/headers/SMB2.d.ts +36 -0
- package/dist/headers/SMB2.js +203 -0
- package/dist/headers/SMPP.d.ts +33 -0
- package/dist/headers/SMPP.js +119 -0
- package/dist/headers/SMTP.d.ts +33 -0
- package/dist/headers/SMTP.js +157 -0
- package/dist/headers/SNAP.d.ts +22 -0
- package/dist/headers/SNAP.js +68 -0
- package/dist/headers/SNMP.d.ts +28 -0
- package/dist/headers/SNMP.js +302 -0
- package/dist/headers/SOCKS4.d.ts +42 -0
- package/dist/headers/SOCKS4.js +302 -0
- package/dist/headers/SOCKS5.d.ts +45 -0
- package/dist/headers/SOCKS5.js +223 -0
- package/dist/headers/SSDP.d.ts +27 -0
- package/dist/headers/SSDP.js +161 -0
- package/dist/headers/SSH.d.ts +44 -0
- package/dist/headers/SSH.js +274 -0
- package/dist/headers/STOMP.d.ts +48 -0
- package/dist/headers/STOMP.js +177 -0
- package/dist/headers/STP.d.ts +26 -0
- package/dist/headers/STP.js +150 -0
- package/dist/headers/STUN.d.ts +25 -0
- package/dist/headers/STUN.js +183 -0
- package/dist/headers/SercosIII.d.ts +43 -0
- package/dist/headers/SercosIII.js +199 -0
- package/dist/headers/Skinny.d.ts +32 -0
- package/dist/headers/Skinny.js +139 -0
- package/dist/headers/StatsD.d.ts +27 -0
- package/dist/headers/StatsD.js +134 -0
- package/dist/headers/SunRPC.d.ts +34 -0
- package/dist/headers/SunRPC.js +268 -0
- package/dist/headers/Syslog.d.ts +21 -0
- package/dist/headers/Syslog.js +91 -0
- package/dist/headers/TCP.d.ts +19 -0
- package/dist/headers/TCP.js +905 -0
- package/dist/headers/TFTP.d.ts +28 -0
- package/dist/headers/TFTP.js +224 -0
- package/dist/headers/TLS_Alert.d.ts +24 -0
- package/dist/headers/TLS_Alert.js +639 -0
- package/dist/headers/TLS_ApplicationData.d.ts +24 -0
- package/dist/headers/TLS_ApplicationData.js +170 -0
- package/dist/headers/TLS_ChangeCipherSpec.d.ts +23 -0
- package/dist/headers/TLS_ChangeCipherSpec.js +168 -0
- package/dist/headers/TLS_Handshake.d.ts +65 -0
- package/dist/headers/TLS_Handshake.js +860 -0
- package/dist/headers/TLS_Heartbeat.d.ts +27 -0
- package/dist/headers/TLS_Heartbeat.js +247 -0
- package/dist/headers/TPKT.d.ts +26 -0
- package/dist/headers/TPKT.js +99 -0
- package/dist/headers/TacacsPlus.d.ts +27 -0
- package/dist/headers/TacacsPlus.js +133 -0
- package/dist/headers/Telnet.d.ts +40 -0
- package/dist/headers/Telnet.js +193 -0
- package/dist/headers/Teredo.d.ts +40 -0
- package/dist/headers/Teredo.js +251 -0
- package/dist/headers/TimeProtocol.d.ts +25 -0
- package/dist/headers/TimeProtocol.js +53 -0
- package/dist/headers/UDP.d.ts +19 -0
- package/dist/headers/UDP.js +171 -0
- package/dist/headers/VLAN_802dot1Q.d.ts +24 -0
- package/dist/headers/VLAN_802dot1Q.js +96 -0
- package/dist/headers/VRRP.d.ts +26 -0
- package/dist/headers/VRRP.js +309 -0
- package/dist/headers/VXLAN.d.ts +24 -0
- package/dist/headers/VXLAN.js +75 -0
- package/dist/headers/WCCP.d.ts +29 -0
- package/dist/headers/WCCP.js +117 -0
- package/dist/headers/WHOIS.d.ts +37 -0
- package/dist/headers/WHOIS.js +126 -0
- package/dist/headers/WSDiscovery.d.ts +29 -0
- package/dist/headers/WSDiscovery.js +118 -0
- package/dist/headers/WakeOnLAN.d.ts +30 -0
- package/dist/headers/WakeOnLAN.js +126 -0
- package/dist/headers/WebSocket.d.ts +26 -0
- package/dist/headers/WebSocket.js +173 -0
- package/dist/headers/WireGuard.d.ts +38 -0
- package/dist/headers/WireGuard.js +216 -0
- package/dist/headers/XMPP.d.ts +37 -0
- package/dist/headers/XMPP.js +149 -0
- package/dist/headers/Zabbix.d.ts +35 -0
- package/dist/headers/Zabbix.js +153 -0
- package/dist/headers/cms/AcsiPdu.d.ts +45 -0
- package/dist/headers/cms/AcsiPdu.js +112 -0
- package/dist/headers/cms/PerDecoder.d.ts +68 -0
- package/dist/headers/cms/PerDecoder.js +211 -0
- package/dist/headers/cms/PerReader.d.ts +64 -0
- package/dist/headers/cms/PerReader.js +155 -0
- package/dist/helper/BufferToHex.d.ts +5 -0
- package/dist/helper/BufferToHex.js +10 -0
- package/dist/helper/BufferToIP.d.ts +12 -0
- package/dist/helper/BufferToIP.js +23 -0
- package/dist/helper/BufferToNumber.d.ts +18 -0
- package/dist/helper/BufferToNumber.js +47 -0
- package/dist/helper/HexToBuffer.d.ts +7 -0
- package/dist/helper/HexToBuffer.js +27 -0
- package/dist/helper/HexToNumber.d.ts +18 -0
- package/dist/helper/HexToNumber.js +48 -0
- package/dist/helper/IPToBuffer.d.ts +12 -0
- package/dist/helper/IPToBuffer.js +34 -0
- package/dist/helper/NumberToBERBuffer.d.ts +18 -0
- package/dist/helper/NumberToBERBuffer.js +31 -0
- package/dist/helper/NumberToBERHex.d.ts +18 -0
- package/dist/helper/NumberToBERHex.js +52 -0
- package/dist/helper/NumberToBuffer.d.ts +18 -0
- package/dist/helper/NumberToBuffer.js +38 -0
- package/dist/helper/NumberToHex.d.ts +18 -0
- package/dist/helper/NumberToHex.js +35 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.js +113 -0
- package/dist/lib/FlexibleObject.d.ts +27 -0
- package/dist/lib/FlexibleObject.js +113 -0
- package/dist/lib/GetBERIntegerLengthFromBuffer.d.ts +6 -0
- package/dist/lib/GetBERIntegerLengthFromBuffer.js +16 -0
- package/dist/lib/ProcessPacketPostHandlers.d.ts +13 -0
- package/dist/lib/ProcessPacketPostHandlers.js +53 -0
- package/dist/lib/SortPostHandlers.d.ts +7 -0
- package/dist/lib/SortPostHandlers.js +11 -0
- package/dist/lib/StringContentEncodingEnum.d.ts +10 -0
- package/dist/lib/StringContentEncodingEnum.js +14 -0
- package/dist/schema/ProtocolFieldJSONSchema.d.ts +35 -0
- package/dist/schema/ProtocolFieldJSONSchema.js +2 -0
- package/dist/schema/ProtocolFieldJSONSchemaDefinition.d.ts +2 -0
- package/dist/schema/ProtocolFieldJSONSchemaDefinition.js +2 -0
- package/dist/schema/ProtocolJSONSchema.d.ts +32 -0
- package/dist/schema/ProtocolJSONSchema.js +2 -0
- package/dist/types/CodecData.d.ts +7 -0
- package/dist/types/CodecData.js +2 -0
- package/dist/types/CodecDecodeResult.d.ts +10 -0
- package/dist/types/CodecDecodeResult.js +2 -0
- package/dist/types/CodecEncodeInput.d.ts +2 -0
- package/dist/types/CodecEncodeInput.js +2 -0
- package/dist/types/CodecEncodeResult.d.ts +5 -0
- package/dist/types/CodecEncodeResult.js +2 -0
- package/dist/types/CodecErrorInfo.d.ts +5 -0
- package/dist/types/CodecErrorInfo.js +2 -0
- package/dist/types/CodecModule.d.ts +2 -0
- package/dist/types/CodecModule.js +2 -0
- package/dist/types/CodecModuleConstructor.d.ts +2 -0
- package/dist/types/CodecModuleConstructor.js +2 -0
- package/dist/types/CodecSchema.d.ts +6 -0
- package/dist/types/CodecSchema.js +2 -0
- package/dist/types/DemuxProducer.d.ts +23 -0
- package/dist/types/DemuxProducer.js +2 -0
- package/dist/types/Dissection.d.ts +23 -0
- package/dist/types/Dissection.js +2 -0
- package/dist/types/HeaderTreeNode.d.ts +4 -0
- package/dist/types/HeaderTreeNode.js +2 -0
- package/dist/types/LayerGraph.d.ts +32 -0
- package/dist/types/LayerGraph.js +2 -0
- package/dist/types/PostHandlerItem.d.ts +4 -0
- package/dist/types/PostHandlerItem.js +2 -0
- 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
|
+
}
|