pypcapkit 1.3.3.post1__cp313-none-any.whl
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.
- pcapkit/__init__.py +126 -0
- pcapkit/__main__.py +138 -0
- pcapkit/all.py +136 -0
- pcapkit/const/__init__.py +81 -0
- pcapkit/const/arp/__init__.py +25 -0
- pcapkit/const/arp/hardware.py +181 -0
- pcapkit/const/arp/operation.py +131 -0
- pcapkit/const/ftp/__init__.py +25 -0
- pcapkit/const/ftp/command.py +309 -0
- pcapkit/const/ftp/return_code.py +304 -0
- pcapkit/const/hip/__init__.py +94 -0
- pcapkit/const/hip/certificate.py +77 -0
- pcapkit/const/hip/cipher.py +65 -0
- pcapkit/const/hip/di.py +59 -0
- pcapkit/const/hip/ecdsa_curve.py +59 -0
- pcapkit/const/hip/ecdsa_low_curve.py +56 -0
- pcapkit/const/hip/eddsa_curve.py +65 -0
- pcapkit/const/hip/esp_transform_suite.py +98 -0
- pcapkit/const/hip/group.py +86 -0
- pcapkit/const/hip/hi_algorithm.py +86 -0
- pcapkit/const/hip/hit_suite.py +68 -0
- pcapkit/const/hip/nat_traversal.py +62 -0
- pcapkit/const/hip/notify_message.py +200 -0
- pcapkit/const/hip/packet.py +89 -0
- pcapkit/const/hip/parameter.py +377 -0
- pcapkit/const/hip/registration.py +68 -0
- pcapkit/const/hip/registration_failure.py +84 -0
- pcapkit/const/hip/suite.py +71 -0
- pcapkit/const/hip/transport.py +59 -0
- pcapkit/const/http/__init__.py +39 -0
- pcapkit/const/http/error_code.py +95 -0
- pcapkit/const/http/frame.py +95 -0
- pcapkit/const/http/method.py +184 -0
- pcapkit/const/http/setting.py +96 -0
- pcapkit/const/http/status_code.py +294 -0
- pcapkit/const/ipv4/__init__.py +57 -0
- pcapkit/const/ipv4/classification_level.py +64 -0
- pcapkit/const/ipv4/option_class.py +55 -0
- pcapkit/const/ipv4/option_number.py +137 -0
- pcapkit/const/ipv4/protection_authority.py +63 -0
- pcapkit/const/ipv4/qs_function.py +51 -0
- pcapkit/const/ipv4/router_alert.py +251 -0
- pcapkit/const/ipv4/tos_del.py +51 -0
- pcapkit/const/ipv4/tos_ecn.py +55 -0
- pcapkit/const/ipv4/tos_pre.py +63 -0
- pcapkit/const/ipv4/tos_rel.py +51 -0
- pcapkit/const/ipv4/tos_thr.py +51 -0
- pcapkit/const/ipv4/ts_flag.py +53 -0
- pcapkit/const/ipv6/__init__.py +53 -0
- pcapkit/const/ipv6/extension_header.py +66 -0
- pcapkit/const/ipv6/option.py +137 -0
- pcapkit/const/ipv6/option_action.py +55 -0
- pcapkit/const/ipv6/qs_function.py +51 -0
- pcapkit/const/ipv6/router_alert.py +266 -0
- pcapkit/const/ipv6/routing.py +80 -0
- pcapkit/const/ipv6/seed_id.py +55 -0
- pcapkit/const/ipv6/smf_dpd_mode.py +51 -0
- pcapkit/const/ipv6/tagger_id.py +62 -0
- pcapkit/const/ipx/__init__.py +27 -0
- pcapkit/const/ipx/packet.py +72 -0
- pcapkit/const/ipx/socket.py +104 -0
- pcapkit/const/l2tp/__init__.py +21 -0
- pcapkit/const/l2tp/type.py +51 -0
- pcapkit/const/mh/__init__.py +204 -0
- pcapkit/const/mh/access_type.py +92 -0
- pcapkit/const/mh/ack_status_code.py +71 -0
- pcapkit/const/mh/ani_suboption.py +74 -0
- pcapkit/const/mh/auth_subtype.py +53 -0
- pcapkit/const/mh/binding_ack_flag.py +66 -0
- pcapkit/const/mh/binding_error.py +51 -0
- pcapkit/const/mh/binding_revocation.py +59 -0
- pcapkit/const/mh/binding_update_flag.py +81 -0
- pcapkit/const/mh/cga_extension.py +66 -0
- pcapkit/const/mh/cga_sec.py +57 -0
- pcapkit/const/mh/cga_type.py +68 -0
- pcapkit/const/mh/dhcp_support_mode.py +53 -0
- pcapkit/const/mh/dns_status_code.py +65 -0
- pcapkit/const/mh/dsmip6_tls_packet.py +62 -0
- pcapkit/const/mh/dsmipv6_home_address.py +74 -0
- pcapkit/const/mh/enumerating_algorithm.py +56 -0
- pcapkit/const/mh/fb_ack_status.py +62 -0
- pcapkit/const/mh/fb_action.py +71 -0
- pcapkit/const/mh/fb_indication_trigger.py +65 -0
- pcapkit/const/mh/fb_type.py +59 -0
- pcapkit/const/mh/flow_id_status.py +77 -0
- pcapkit/const/mh/flow_id_suboption.py +71 -0
- pcapkit/const/mh/handoff_type.py +71 -0
- pcapkit/const/mh/handover_ack_flag.py +54 -0
- pcapkit/const/mh/handover_ack_status.py +92 -0
- pcapkit/const/mh/handover_initiate_flag.py +57 -0
- pcapkit/const/mh/handover_initiate_status.py +62 -0
- pcapkit/const/mh/home_address_reply.py +71 -0
- pcapkit/const/mh/lla_code.py +63 -0
- pcapkit/const/mh/lma_mag_suboption.py +59 -0
- pcapkit/const/mh/mn_group_id.py +59 -0
- pcapkit/const/mh/mn_id_subtype.py +77 -0
- pcapkit/const/mh/operator_id.py +63 -0
- pcapkit/const/mh/option.py +260 -0
- pcapkit/const/mh/packet.py +119 -0
- pcapkit/const/mh/qos_attribute.py +89 -0
- pcapkit/const/mh/revocation_status_code.py +83 -0
- pcapkit/const/mh/revocation_trigger.py +86 -0
- pcapkit/const/mh/status_code.py +232 -0
- pcapkit/const/mh/traffic_selector.py +62 -0
- pcapkit/const/mh/upa_status.py +71 -0
- pcapkit/const/mh/upn_reason.py +80 -0
- pcapkit/const/ospf/__init__.py +27 -0
- pcapkit/const/ospf/authentication.py +65 -0
- pcapkit/const/ospf/packet.py +71 -0
- pcapkit/const/pcapng/__init__.py +51 -0
- pcapkit/const/pcapng/block_type.py +152 -0
- pcapkit/const/pcapng/filter_type.py +48 -0
- pcapkit/const/pcapng/hash_algorithm.py +59 -0
- pcapkit/const/pcapng/option_type.py +233 -0
- pcapkit/const/pcapng/record_type.py +57 -0
- pcapkit/const/pcapng/secrets_type.py +56 -0
- pcapkit/const/pcapng/verdict_type.py +53 -0
- pcapkit/const/reg/__init__.py +34 -0
- pcapkit/const/reg/apptype.py +32702 -0
- pcapkit/const/reg/ethertype.py +714 -0
- pcapkit/const/reg/linktype.py +902 -0
- pcapkit/const/reg/transtype.py +523 -0
- pcapkit/const/tcp/__init__.py +35 -0
- pcapkit/const/tcp/checksum.py +55 -0
- pcapkit/const/tcp/flags.py +73 -0
- pcapkit/const/tcp/mp_tcp_option.py +80 -0
- pcapkit/const/tcp/option.py +198 -0
- pcapkit/const/vlan/__init__.py +23 -0
- pcapkit/const/vlan/priority_level.py +71 -0
- pcapkit/corekit/__init__.py +59 -0
- pcapkit/corekit/fields/__init__.py +45 -0
- pcapkit/corekit/fields/collections.py +282 -0
- pcapkit/corekit/fields/field.py +269 -0
- pcapkit/corekit/fields/ipaddress.py +274 -0
- pcapkit/corekit/fields/misc.py +722 -0
- pcapkit/corekit/fields/numbers.py +375 -0
- pcapkit/corekit/fields/strings.py +245 -0
- pcapkit/corekit/infoclass.py +394 -0
- pcapkit/corekit/io.py +506 -0
- pcapkit/corekit/module.py +39 -0
- pcapkit/corekit/multidict.py +626 -0
- pcapkit/corekit/protochain.py +263 -0
- pcapkit/corekit/version.py +33 -0
- pcapkit/dumpkit/__init__.py +15 -0
- pcapkit/dumpkit/common.py +199 -0
- pcapkit/dumpkit/null.py +77 -0
- pcapkit/dumpkit/pcap.py +144 -0
- pcapkit/foundation/__init__.py +45 -0
- pcapkit/foundation/engines/__init__.py +36 -0
- pcapkit/foundation/engines/dpkt.py +230 -0
- pcapkit/foundation/engines/engine.py +194 -0
- pcapkit/foundation/engines/pcap.py +188 -0
- pcapkit/foundation/engines/pcapng.py +310 -0
- pcapkit/foundation/engines/pyshark.py +166 -0
- pcapkit/foundation/engines/scapy.py +161 -0
- pcapkit/foundation/extraction.py +915 -0
- pcapkit/foundation/reassembly/__init__.py +49 -0
- pcapkit/foundation/reassembly/data/__init__.py +48 -0
- pcapkit/foundation/reassembly/data/ip.py +117 -0
- pcapkit/foundation/reassembly/data/tcp.py +145 -0
- pcapkit/foundation/reassembly/ip.py +192 -0
- pcapkit/foundation/reassembly/ipv4.py +50 -0
- pcapkit/foundation/reassembly/ipv6.py +50 -0
- pcapkit/foundation/reassembly/reassembly.py +389 -0
- pcapkit/foundation/reassembly/tcp.py +249 -0
- pcapkit/foundation/registry/__init__.py +41 -0
- pcapkit/foundation/registry/foundation.py +327 -0
- pcapkit/foundation/registry/protocols.py +885 -0
- pcapkit/foundation/traceflow/__init__.py +44 -0
- pcapkit/foundation/traceflow/data/__init__.py +30 -0
- pcapkit/foundation/traceflow/data/tcp.py +105 -0
- pcapkit/foundation/traceflow/tcp.py +159 -0
- pcapkit/foundation/traceflow/traceflow.py +390 -0
- pcapkit/interface/__init__.py +22 -0
- pcapkit/interface/core.py +185 -0
- pcapkit/interface/misc.py +120 -0
- pcapkit/protocols/__init__.py +85 -0
- pcapkit/protocols/application/NotImplemented/bgp.py +0 -0
- pcapkit/protocols/application/NotImplemented/dhcp.py +0 -0
- pcapkit/protocols/application/NotImplemented/dhcpv6.py +0 -0
- pcapkit/protocols/application/NotImplemented/dns.py +0 -0
- pcapkit/protocols/application/NotImplemented/imap.py +0 -0
- pcapkit/protocols/application/NotImplemented/ldap.py +0 -0
- pcapkit/protocols/application/NotImplemented/mqtt.py +0 -0
- pcapkit/protocols/application/NotImplemented/nntp.py +0 -0
- pcapkit/protocols/application/NotImplemented/ntp.py +0 -0
- pcapkit/protocols/application/NotImplemented/onc_rpc.py +0 -0
- pcapkit/protocols/application/NotImplemented/pop.py +0 -0
- pcapkit/protocols/application/NotImplemented/rip.py +0 -0
- pcapkit/protocols/application/NotImplemented/rtp.py +0 -0
- pcapkit/protocols/application/NotImplemented/sip.py +0 -0
- pcapkit/protocols/application/NotImplemented/smtp.py +0 -0
- pcapkit/protocols/application/NotImplemented/snmp.py +0 -0
- pcapkit/protocols/application/NotImplemented/ssh.py +0 -0
- pcapkit/protocols/application/NotImplemented/telnet.py +0 -0
- pcapkit/protocols/application/NotImplemented/tls.py +0 -0
- pcapkit/protocols/application/NotImplemented/xmpp.py +0 -0
- pcapkit/protocols/application/__init__.py +34 -0
- pcapkit/protocols/application/application.py +114 -0
- pcapkit/protocols/application/ftp.py +206 -0
- pcapkit/protocols/application/http.py +176 -0
- pcapkit/protocols/application/httpv1.py +320 -0
- pcapkit/protocols/application/httpv2.py +1255 -0
- pcapkit/protocols/data/__init__.py +192 -0
- pcapkit/protocols/data/application/__init__.py +57 -0
- pcapkit/protocols/data/application/ftp.py +59 -0
- pcapkit/protocols/data/application/httpv1.py +79 -0
- pcapkit/protocols/data/application/httpv2.py +293 -0
- pcapkit/protocols/data/data.py +25 -0
- pcapkit/protocols/data/internet/__init__.py +298 -0
- pcapkit/protocols/data/internet/ah.py +31 -0
- pcapkit/protocols/data/internet/hip.py +804 -0
- pcapkit/protocols/data/internet/hopopt.py +351 -0
- pcapkit/protocols/data/internet/ipv4.py +369 -0
- pcapkit/protocols/data/internet/ipv6.py +67 -0
- pcapkit/protocols/data/internet/ipv6_frag.py +29 -0
- pcapkit/protocols/data/internet/ipv6_opts.py +368 -0
- pcapkit/protocols/data/internet/ipv6_route.py +86 -0
- pcapkit/protocols/data/internet/ipx.py +56 -0
- pcapkit/protocols/data/internet/mh.py +509 -0
- pcapkit/protocols/data/link/__init__.py +33 -0
- pcapkit/protocols/data/link/arp.py +74 -0
- pcapkit/protocols/data/link/ethernet.py +28 -0
- pcapkit/protocols/data/link/l2tp.py +63 -0
- pcapkit/protocols/data/link/ospf.py +58 -0
- pcapkit/protocols/data/link/vlan.py +42 -0
- pcapkit/protocols/data/misc/__init__.py +109 -0
- pcapkit/protocols/data/misc/null.py +18 -0
- pcapkit/protocols/data/misc/pcap/__init__.py +18 -0
- pcapkit/protocols/data/misc/pcap/frame.py +56 -0
- pcapkit/protocols/data/misc/pcap/header.py +53 -0
- pcapkit/protocols/data/misc/pcapng.py +925 -0
- pcapkit/protocols/data/misc/raw.py +25 -0
- pcapkit/protocols/data/protocol.py +32 -0
- pcapkit/protocols/data/transport/__init__.py +71 -0
- pcapkit/protocols/data/transport/tcp.py +555 -0
- pcapkit/protocols/data/transport/udp.py +29 -0
- pcapkit/protocols/internet/NotImplemented/ecn.py +0 -0
- pcapkit/protocols/internet/NotImplemented/esp.py +97 -0
- pcapkit/protocols/internet/NotImplemented/icmp.py +0 -0
- pcapkit/protocols/internet/NotImplemented/icmpv6.py +0 -0
- pcapkit/protocols/internet/NotImplemented/igmp.py +0 -0
- pcapkit/protocols/internet/NotImplemented/shim6.py +0 -0
- pcapkit/protocols/internet/__init__.py +43 -0
- pcapkit/protocols/internet/ah.py +275 -0
- pcapkit/protocols/internet/hip.py +4727 -0
- pcapkit/protocols/internet/hopopt.py +1879 -0
- pcapkit/protocols/internet/internet.py +240 -0
- pcapkit/protocols/internet/ip.py +51 -0
- pcapkit/protocols/internet/ipsec.py +50 -0
- pcapkit/protocols/internet/ipv4.py +1782 -0
- pcapkit/protocols/internet/ipv6.py +361 -0
- pcapkit/protocols/internet/ipv6_frag.py +258 -0
- pcapkit/protocols/internet/ipv6_opts.py +1890 -0
- pcapkit/protocols/internet/ipv6_route.py +710 -0
- pcapkit/protocols/internet/ipx.py +230 -0
- pcapkit/protocols/internet/mh.py +2764 -0
- pcapkit/protocols/link/NotImplemented/dsl.py +0 -0
- pcapkit/protocols/link/NotImplemented/eapol.py +1 -0
- pcapkit/protocols/link/NotImplemented/fddi.py +0 -0
- pcapkit/protocols/link/NotImplemented/isdn.py +0 -0
- pcapkit/protocols/link/NotImplemented/ndp.py +0 -0
- pcapkit/protocols/link/NotImplemented/ppp.py +0 -0
- pcapkit/protocols/link/__init__.py +35 -0
- pcapkit/protocols/link/arp.py +421 -0
- pcapkit/protocols/link/ethernet.py +248 -0
- pcapkit/protocols/link/l2tp.py +267 -0
- pcapkit/protocols/link/link.py +140 -0
- pcapkit/protocols/link/ospf.py +342 -0
- pcapkit/protocols/link/rarp.py +82 -0
- pcapkit/protocols/link/vlan.py +225 -0
- pcapkit/protocols/misc/__init__.py +37 -0
- pcapkit/protocols/misc/null.py +129 -0
- pcapkit/protocols/misc/pcap/__init__.py +17 -0
- pcapkit/protocols/misc/pcap/frame.py +478 -0
- pcapkit/protocols/misc/pcap/header.py +358 -0
- pcapkit/protocols/misc/pcapng.py +5520 -0
- pcapkit/protocols/misc/raw.py +180 -0
- pcapkit/protocols/protocol.py +1216 -0
- pcapkit/protocols/schema/__init__.py +140 -0
- pcapkit/protocols/schema/application/__init__.py +40 -0
- pcapkit/protocols/schema/application/ftp.py +21 -0
- pcapkit/protocols/schema/application/httpv1.py +21 -0
- pcapkit/protocols/schema/application/httpv2.py +384 -0
- pcapkit/protocols/schema/internet/__init__.py +294 -0
- pcapkit/protocols/schema/internet/ah.py +40 -0
- pcapkit/protocols/schema/internet/hip.py +1184 -0
- pcapkit/protocols/schema/internet/hopopt.py +679 -0
- pcapkit/protocols/schema/internet/ipv4.py +576 -0
- pcapkit/protocols/schema/internet/ipv6.py +63 -0
- pcapkit/protocols/schema/internet/ipv6_frag.py +48 -0
- pcapkit/protocols/schema/internet/ipv6_opts.py +680 -0
- pcapkit/protocols/schema/internet/ipv6_route.py +198 -0
- pcapkit/protocols/schema/internet/ipx.py +40 -0
- pcapkit/protocols/schema/internet/mh.py +718 -0
- pcapkit/protocols/schema/link/__init__.py +19 -0
- pcapkit/protocols/schema/link/arp.py +39 -0
- pcapkit/protocols/schema/link/ethernet.py +51 -0
- pcapkit/protocols/schema/link/l2tp.py +88 -0
- pcapkit/protocols/schema/link/ospf.py +90 -0
- pcapkit/protocols/schema/link/vlan.py +69 -0
- pcapkit/protocols/schema/misc/__init__.py +108 -0
- pcapkit/protocols/schema/misc/null.py +18 -0
- pcapkit/protocols/schema/misc/pcap/__init__.py +10 -0
- pcapkit/protocols/schema/misc/pcap/frame.py +51 -0
- pcapkit/protocols/schema/misc/pcap/header.py +63 -0
- pcapkit/protocols/schema/misc/pcapng.py +1689 -0
- pcapkit/protocols/schema/misc/raw.py +24 -0
- pcapkit/protocols/schema/schema.py +809 -0
- pcapkit/protocols/schema/transport/__init__.py +69 -0
- pcapkit/protocols/schema/transport/tcp.py +928 -0
- pcapkit/protocols/schema/transport/udp.py +90 -0
- pcapkit/protocols/transport/NotImplemented/dccp.py +0 -0
- pcapkit/protocols/transport/NotImplemented/rsvp.py +0 -0
- pcapkit/protocols/transport/NotImplemented/sctp.py +0 -0
- pcapkit/protocols/transport/__init__.py +27 -0
- pcapkit/protocols/transport/tcp.py +3025 -0
- pcapkit/protocols/transport/transport.py +158 -0
- pcapkit/protocols/transport/udp.py +214 -0
- pcapkit/py.typed +0 -0
- pcapkit/toolkit/__init__.py +57 -0
- pcapkit/toolkit/dpkt.py +306 -0
- pcapkit/toolkit/pcap.py +212 -0
- pcapkit/toolkit/pcapng.py +251 -0
- pcapkit/toolkit/pyshark.py +99 -0
- pcapkit/toolkit/scapy.py +297 -0
- pcapkit/utilities/__init__.py +20 -0
- pcapkit/utilities/compat.py +196 -0
- pcapkit/utilities/decorators.py +192 -0
- pcapkit/utilities/exceptions.py +365 -0
- pcapkit/utilities/logging.py +55 -0
- pcapkit/utilities/warnings.py +185 -0
- pcapkit/vendor/__init__.py +105 -0
- pcapkit/vendor/__main__.py +92 -0
- pcapkit/vendor/arp/__init__.py +27 -0
- pcapkit/vendor/arp/hardware.py +29 -0
- pcapkit/vendor/arp/operation.py +29 -0
- pcapkit/vendor/default.py +474 -0
- pcapkit/vendor/ftp/__init__.py +27 -0
- pcapkit/vendor/ftp/command.py +244 -0
- pcapkit/vendor/ftp/return_code.py +256 -0
- pcapkit/vendor/hip/__init__.py +94 -0
- pcapkit/vendor/hip/certificate.py +29 -0
- pcapkit/vendor/hip/cipher.py +29 -0
- pcapkit/vendor/hip/di.py +29 -0
- pcapkit/vendor/hip/ecdsa_curve.py +29 -0
- pcapkit/vendor/hip/ecdsa_low_curve.py +29 -0
- pcapkit/vendor/hip/eddsa_curve.py +85 -0
- pcapkit/vendor/hip/esp_transform_suite.py +29 -0
- pcapkit/vendor/hip/group.py +87 -0
- pcapkit/vendor/hip/hi_algorithm.py +29 -0
- pcapkit/vendor/hip/hit_suite.py +29 -0
- pcapkit/vendor/hip/nat_traversal.py +29 -0
- pcapkit/vendor/hip/notify_message.py +29 -0
- pcapkit/vendor/hip/packet.py +88 -0
- pcapkit/vendor/hip/parameter.py +88 -0
- pcapkit/vendor/hip/registration.py +29 -0
- pcapkit/vendor/hip/registration_failure.py +29 -0
- pcapkit/vendor/hip/suite.py +29 -0
- pcapkit/vendor/hip/transport.py +29 -0
- pcapkit/vendor/http/__init__.py +39 -0
- pcapkit/vendor/http/error_code.py +95 -0
- pcapkit/vendor/http/frame.py +91 -0
- pcapkit/vendor/http/method.py +167 -0
- pcapkit/vendor/http/setting.py +93 -0
- pcapkit/vendor/http/status_code.py +185 -0
- pcapkit/vendor/ipv4/__init__.py +57 -0
- pcapkit/vendor/ipv4/classification_level.py +91 -0
- pcapkit/vendor/ipv4/option_class.py +80 -0
- pcapkit/vendor/ipv4/option_number.py +105 -0
- pcapkit/vendor/ipv4/protection_authority.py +84 -0
- pcapkit/vendor/ipv4/qs_function.py +78 -0
- pcapkit/vendor/ipv4/router_alert.py +93 -0
- pcapkit/vendor/ipv4/tos_del.py +78 -0
- pcapkit/vendor/ipv4/tos_ecn.py +95 -0
- pcapkit/vendor/ipv4/tos_pre.py +84 -0
- pcapkit/vendor/ipv4/tos_rel.py +78 -0
- pcapkit/vendor/ipv4/tos_thr.py +77 -0
- pcapkit/vendor/ipv4/ts_flag.py +79 -0
- pcapkit/vendor/ipv6/__init__.py +53 -0
- pcapkit/vendor/ipv6/extension_header.py +171 -0
- pcapkit/vendor/ipv6/option.py +104 -0
- pcapkit/vendor/ipv6/option_action.py +90 -0
- pcapkit/vendor/ipv6/qs_function.py +78 -0
- pcapkit/vendor/ipv6/router_alert.py +93 -0
- pcapkit/vendor/ipv6/routing.py +87 -0
- pcapkit/vendor/ipv6/seed_id.py +81 -0
- pcapkit/vendor/ipv6/smf_dpd_mode.py +78 -0
- pcapkit/vendor/ipv6/tagger_id.py +81 -0
- pcapkit/vendor/ipx/__init__.py +37 -0
- pcapkit/vendor/ipx/packet.py +123 -0
- pcapkit/vendor/ipx/socket.py +125 -0
- pcapkit/vendor/l2tp/__init__.py +21 -0
- pcapkit/vendor/l2tp/type.py +78 -0
- pcapkit/vendor/mh/__init__.py +204 -0
- pcapkit/vendor/mh/access_type.py +87 -0
- pcapkit/vendor/mh/ack_status_code.py +88 -0
- pcapkit/vendor/mh/ani_suboption.py +88 -0
- pcapkit/vendor/mh/auth_subtype.py +83 -0
- pcapkit/vendor/mh/binding_ack_flag.py +148 -0
- pcapkit/vendor/mh/binding_error.py +78 -0
- pcapkit/vendor/mh/binding_revocation.py +87 -0
- pcapkit/vendor/mh/binding_update_flag.py +147 -0
- pcapkit/vendor/mh/cga_extension.py +91 -0
- pcapkit/vendor/mh/cga_sec.py +91 -0
- pcapkit/vendor/mh/cga_type.py +74 -0
- pcapkit/vendor/mh/dhcp_support_mode.py +77 -0
- pcapkit/vendor/mh/dns_status_code.py +87 -0
- pcapkit/vendor/mh/dsmip6_tls_packet.py +87 -0
- pcapkit/vendor/mh/dsmipv6_home_address.py +87 -0
- pcapkit/vendor/mh/enumerating_algorithm.py +82 -0
- pcapkit/vendor/mh/fb_ack_status.py +87 -0
- pcapkit/vendor/mh/fb_action.py +88 -0
- pcapkit/vendor/mh/fb_indication_trigger.py +87 -0
- pcapkit/vendor/mh/fb_type.py +88 -0
- pcapkit/vendor/mh/flow_id_status.py +87 -0
- pcapkit/vendor/mh/flow_id_suboption.py +87 -0
- pcapkit/vendor/mh/handoff_type.py +87 -0
- pcapkit/vendor/mh/handover_ack_flag.py +143 -0
- pcapkit/vendor/mh/handover_ack_status.py +87 -0
- pcapkit/vendor/mh/handover_initiate_flag.py +143 -0
- pcapkit/vendor/mh/handover_initiate_status.py +87 -0
- pcapkit/vendor/mh/home_address_reply.py +87 -0
- pcapkit/vendor/mh/lla_code.py +97 -0
- pcapkit/vendor/mh/lma_mag_suboption.py +88 -0
- pcapkit/vendor/mh/mn_group_id.py +87 -0
- pcapkit/vendor/mh/mn_id_subtype.py +87 -0
- pcapkit/vendor/mh/operator_id.py +87 -0
- pcapkit/vendor/mh/option.py +83 -0
- pcapkit/vendor/mh/packet.py +82 -0
- pcapkit/vendor/mh/qos_attribute.py +87 -0
- pcapkit/vendor/mh/revocation_status_code.py +87 -0
- pcapkit/vendor/mh/revocation_trigger.py +87 -0
- pcapkit/vendor/mh/status_code.py +91 -0
- pcapkit/vendor/mh/traffic_selector.py +87 -0
- pcapkit/vendor/mh/upa_status.py +87 -0
- pcapkit/vendor/mh/upn_reason.py +87 -0
- pcapkit/vendor/ospf/__init__.py +27 -0
- pcapkit/vendor/ospf/authentication.py +29 -0
- pcapkit/vendor/ospf/packet.py +29 -0
- pcapkit/vendor/pcapng/__init__.py +51 -0
- pcapkit/vendor/pcapng/block_type.py +94 -0
- pcapkit/vendor/pcapng/filter_type.py +77 -0
- pcapkit/vendor/pcapng/hash_algorithm.py +82 -0
- pcapkit/vendor/pcapng/option_type.py +287 -0
- pcapkit/vendor/pcapng/record_type.py +81 -0
- pcapkit/vendor/pcapng/secrets_type.py +81 -0
- pcapkit/vendor/pcapng/verdict_type.py +79 -0
- pcapkit/vendor/reg/__init__.py +34 -0
- pcapkit/vendor/reg/apptype.py +338 -0
- pcapkit/vendor/reg/ethertype.py +121 -0
- pcapkit/vendor/reg/linktype.py +110 -0
- pcapkit/vendor/reg/transtype.py +111 -0
- pcapkit/vendor/tcp/__init__.py +35 -0
- pcapkit/vendor/tcp/checksum.py +80 -0
- pcapkit/vendor/tcp/flags.py +149 -0
- pcapkit/vendor/tcp/mp_tcp_option.py +90 -0
- pcapkit/vendor/tcp/option.py +103 -0
- pcapkit/vendor/vlan/__init__.py +23 -0
- pcapkit/vendor/vlan/priority_level.py +97 -0
- pypcapkit-1.3.3.post1.dist-info/LICENSE +29 -0
- pypcapkit-1.3.3.post1.dist-info/METADATA +236 -0
- pypcapkit-1.3.3.post1.dist-info/RECORD +466 -0
- pypcapkit-1.3.3.post1.dist-info/WHEEL +5 -0
- pypcapkit-1.3.3.post1.dist-info/entry_points.txt +3 -0
- pypcapkit-1.3.3.post1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# pylint: disable=unused-import
|
3
|
+
"""Fragmented Packets Reassembly
|
4
|
+
===================================
|
5
|
+
|
6
|
+
.. module:: pcapkit.foundation.reassembly
|
7
|
+
|
8
|
+
:mod:`pcapkit.foundation.reassembly` bases on algorithms described
|
9
|
+
in :rfc:`791` and :rfc:`815`, implements datagram reassembly
|
10
|
+
of IP and TCP packets.
|
11
|
+
|
12
|
+
"""
|
13
|
+
# Base Class for Reassembly
|
14
|
+
from pcapkit.foundation.reassembly.reassembly import Reassembly
|
15
|
+
from pcapkit.foundation.reassembly.ip import IP as IP_Reassembly
|
16
|
+
|
17
|
+
# Reassembly for IP
|
18
|
+
from pcapkit.foundation.reassembly.ipv4 import IPv4 as IPv4_Reassembly
|
19
|
+
from pcapkit.foundation.reassembly.ipv6 import IPv6 as IPv6_Reassembly
|
20
|
+
|
21
|
+
# Reassembly for TCP
|
22
|
+
from pcapkit.foundation.reassembly.tcp import TCP as TCP_Reassembly
|
23
|
+
|
24
|
+
__all__ = [
|
25
|
+
'IPv4_Reassembly', 'IPv6_Reassembly', # IP Reassembly
|
26
|
+
'TCP_Reassembly', # TCP Reassembly
|
27
|
+
]
|
28
|
+
|
29
|
+
from typing import TYPE_CHECKING
|
30
|
+
|
31
|
+
from pcapkit.corekit.infoclass import Info, info_final
|
32
|
+
|
33
|
+
if TYPE_CHECKING:
|
34
|
+
from typing import Optional
|
35
|
+
|
36
|
+
|
37
|
+
@info_final
|
38
|
+
class ReassemblyManager(Info):
|
39
|
+
"""Reassembly Manager."""
|
40
|
+
|
41
|
+
#: IPv4 reassembly.
|
42
|
+
ipv4: 'IPv4_Reassembly'
|
43
|
+
#: IPv6 reassembly.
|
44
|
+
ipv6: 'IPv6_Reassembly'
|
45
|
+
#: TCP reassembly.
|
46
|
+
tcp: 'TCP_Reassembly'
|
47
|
+
|
48
|
+
if TYPE_CHECKING:
|
49
|
+
def __init__(self, ipv4: 'Optional[IPv4_Reassembly]', ipv6: 'Optional[IPv6_Reassembly]', tcp: 'Optional[TCP_Reassembly]') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""data models for reassembly"""
|
3
|
+
|
4
|
+
# IP reassembly
|
5
|
+
from pcapkit.foundation.reassembly.data.ip import Buffer as IP_Buffer
|
6
|
+
from pcapkit.foundation.reassembly.data.ip import BufferID as IP_BufferID
|
7
|
+
from pcapkit.foundation.reassembly.data.ip import Datagram as IP_Datagram
|
8
|
+
from pcapkit.foundation.reassembly.data.ip import DatagramID as IP_DatagramID
|
9
|
+
from pcapkit.foundation.reassembly.data.ip import Packet as IP_Packet
|
10
|
+
|
11
|
+
# TCP reassembly
|
12
|
+
from pcapkit.foundation.reassembly.data.tcp import Buffer as TCP_Buffer
|
13
|
+
from pcapkit.foundation.reassembly.data.tcp import BufferID as TCP_BufferID
|
14
|
+
from pcapkit.foundation.reassembly.data.tcp import Datagram as TCP_Datagram
|
15
|
+
from pcapkit.foundation.reassembly.data.tcp import DatagramID as TCP_DatagramID
|
16
|
+
from pcapkit.foundation.reassembly.data.tcp import Fragment as TCP_Fragment
|
17
|
+
from pcapkit.foundation.reassembly.data.tcp import HoleDiscriptor as TCP_HoleDiscriptor
|
18
|
+
from pcapkit.foundation.reassembly.data.tcp import Packet as TCP_Packet
|
19
|
+
|
20
|
+
__all__ = [
|
21
|
+
'IP_Packet', 'IP_DatagramID', 'IP_Datagram', 'IP_Buffer',
|
22
|
+
'IP_BufferID',
|
23
|
+
|
24
|
+
'TCP_Packet', 'TCP_DatagramID', 'TCP_Datagram', 'TCP_Buffer',
|
25
|
+
'TCP_Fragment', 'TCP_HoleDiscriptor', 'TCP_BufferID',
|
26
|
+
]
|
27
|
+
|
28
|
+
from typing import TYPE_CHECKING
|
29
|
+
|
30
|
+
from pcapkit.corekit.infoclass import Info, info_final
|
31
|
+
|
32
|
+
if TYPE_CHECKING:
|
33
|
+
from typing import Optional
|
34
|
+
|
35
|
+
|
36
|
+
@info_final
|
37
|
+
class ReassemblyData(Info):
|
38
|
+
"""Data storage for reassembly."""
|
39
|
+
|
40
|
+
#: IPv4 reassembled data.
|
41
|
+
ipv4: 'tuple[IP_Datagram, ...]'
|
42
|
+
#: IPv6 reassembled data.
|
43
|
+
ipv6: 'tuple[IP_Datagram, ...]'
|
44
|
+
#: TCP reassembled data.
|
45
|
+
tcp: 'tuple[TCP_Datagram, ...]'
|
46
|
+
|
47
|
+
if TYPE_CHECKING:
|
48
|
+
def __init__(self, ipv4: 'Optional[tuple[IP_Datagram, ...]]', ipv6: 'Optional[tuple[IP_Datagram, ...]]', tcp: 'Optional[tuple[TCP_Datagram, ...]]') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""data models for IP reassembly"""
|
3
|
+
|
4
|
+
from typing import TYPE_CHECKING, Generic, TypeVar
|
5
|
+
|
6
|
+
from pcapkit.corekit.infoclass import Info, info_final
|
7
|
+
from pcapkit.utilities.compat import Tuple
|
8
|
+
|
9
|
+
__all__ = [
|
10
|
+
'Packet', 'DatagramID', 'Datagram', 'Buffer', 'BufferID',
|
11
|
+
]
|
12
|
+
|
13
|
+
if TYPE_CHECKING:
|
14
|
+
from ipaddress import IPv4Address, IPv6Address
|
15
|
+
from typing import Optional, overload
|
16
|
+
|
17
|
+
from typing_extensions import Literal, TypeAlias
|
18
|
+
|
19
|
+
from pcapkit.const.reg.transtype import TransType
|
20
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
21
|
+
|
22
|
+
_AT = TypeVar('_AT', 'IPv4Address', 'IPv6Address')
|
23
|
+
|
24
|
+
#: Buffer ID.
|
25
|
+
BufferID: 'TypeAlias' = Tuple[_AT, _AT, int, 'TransType']
|
26
|
+
|
27
|
+
|
28
|
+
@info_final
|
29
|
+
class Packet(Info, Generic[_AT]):
|
30
|
+
"""Data model for :term:`IPv4 <reasm.ipv4.packet>` and/or
|
31
|
+
:term:`IPv6 <reasm.ipv6.packet>` packet representation.."""
|
32
|
+
|
33
|
+
#: Buffer ID.
|
34
|
+
bufid: 'BufferID'
|
35
|
+
#: Original packet range number.
|
36
|
+
num: 'int'
|
37
|
+
#: Fragment offset.
|
38
|
+
fo: 'int'
|
39
|
+
#: Internet header length.
|
40
|
+
ihl: 'int'
|
41
|
+
#: More fragments flag.
|
42
|
+
mf: 'bool'
|
43
|
+
#: Total length, header included.
|
44
|
+
tl: 'int'
|
45
|
+
#: Raw :obj:`bytes` type header.
|
46
|
+
header: 'bytes'
|
47
|
+
#: Raw :obj:`bytearray` type payload.
|
48
|
+
payload: 'bytearray'
|
49
|
+
|
50
|
+
if TYPE_CHECKING:
|
51
|
+
def __init__(self, bufid: 'tuple[_AT, _AT, int, TransType]', num: 'int', fo: 'int', ihl: 'int', mf: 'bool', tl: 'int', header: 'bytes', payload: 'bytearray') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
|
52
|
+
|
53
|
+
|
54
|
+
@info_final
|
55
|
+
class DatagramID(Info, Generic[_AT]):
|
56
|
+
"""Data model for :term:`IPv4 <reasm.ipv4.datagram>` and/or
|
57
|
+
:term:`IPv6 <reasm.ipv6.datagram>` original packet identifier."""
|
58
|
+
|
59
|
+
#: Source address.
|
60
|
+
src: '_AT'
|
61
|
+
#: Destination address.
|
62
|
+
dst: '_AT'
|
63
|
+
#: IP protocol identifier.
|
64
|
+
id: 'int'
|
65
|
+
#: Payload protocol type.
|
66
|
+
proto: 'TransType'
|
67
|
+
|
68
|
+
if TYPE_CHECKING:
|
69
|
+
def __init__(self, src: '_AT', dst: '_AT', id: 'int', proto: 'TransType') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
|
70
|
+
|
71
|
+
|
72
|
+
@info_final
|
73
|
+
class Datagram(Info, Generic[_AT]):
|
74
|
+
"""Data model for :term:`IPv4 <reasm.ipv4.datagram>` and/or
|
75
|
+
:term:`IPv6 <reasm.ipv6.datagram>` reassembled datagram."""
|
76
|
+
|
77
|
+
#: Completed flag.
|
78
|
+
completed: 'bool'
|
79
|
+
#: Original packet identifier.
|
80
|
+
id: 'DatagramID[_AT]'
|
81
|
+
#: Packet numbers.
|
82
|
+
index: 'tuple[int, ...]'
|
83
|
+
#: Initial IP header.
|
84
|
+
header: 'bytes'
|
85
|
+
#: Reassembled IP payload.
|
86
|
+
payload: 'bytes | tuple[bytes, ...]'
|
87
|
+
#: Parsed IP payload.
|
88
|
+
packet: 'Optional[Protocol]'
|
89
|
+
|
90
|
+
if TYPE_CHECKING:
|
91
|
+
@overload #pylint: disable=used-before-assignment
|
92
|
+
def __init__(self, completed: 'Literal[True]', id: 'DatagramID[_AT]', index: 'tuple[int, ...]', header: 'bytes', payload: 'bytes', packet: 'Protocol') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
|
93
|
+
|
94
|
+
@overload
|
95
|
+
def __init__(self, completed: 'Literal[False]', id: 'DatagramID[_AT]', index: 'tuple[int, ...]', header: 'bytes', payload: 'tuple[bytes, ...]', packet: 'None') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
|
96
|
+
|
97
|
+
def __init__(self, completed: 'bool', id: 'DatagramID[_AT]', index: 'tuple[int, ...]', header: 'bytes', payload: 'bytes | tuple[bytes, ...]', packet: 'Optional[Protocol]') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
|
98
|
+
|
99
|
+
|
100
|
+
@info_final
|
101
|
+
class Buffer(Info, Generic[_AT]):
|
102
|
+
"""Data model for :term:`IPv4 <reasm.ipv4.buffer>` and/or
|
103
|
+
:term:`IPv6 <reasm.ipv6.buffer>` reassembly buffer entry."""
|
104
|
+
|
105
|
+
#: Total data length.
|
106
|
+
TDL: 'int'
|
107
|
+
#: Fragment received bit table.
|
108
|
+
RCVBT: 'bytearray'
|
109
|
+
#: List of reassembled packets.
|
110
|
+
index: 'list[int]'
|
111
|
+
#: Header buffer.
|
112
|
+
header: 'bytes'
|
113
|
+
#: Data buffer, holes set to ``b'\x00'``.
|
114
|
+
datagram: 'bytearray'
|
115
|
+
|
116
|
+
if TYPE_CHECKING:
|
117
|
+
def __init__(self, TDL: 'int', RCVBT: 'bytearray', index: 'list[int]', header: 'bytes', datagram: 'bytearray') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
|
@@ -0,0 +1,145 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""data models for TCP reassembly"""
|
3
|
+
|
4
|
+
from typing import TYPE_CHECKING, Generic, TypeVar
|
5
|
+
|
6
|
+
from pcapkit.corekit.infoclass import Info, info_final
|
7
|
+
from pcapkit.utilities.compat import Tuple
|
8
|
+
|
9
|
+
__all__ = [
|
10
|
+
'Packet', 'DatagramID', 'Datagram', 'HoleDiscriptor',
|
11
|
+
'Fragment', 'Buffer', 'BufferID',
|
12
|
+
]
|
13
|
+
|
14
|
+
if TYPE_CHECKING:
|
15
|
+
from ipaddress import IPv4Address, IPv6Address
|
16
|
+
from typing import Optional, overload
|
17
|
+
|
18
|
+
from typing_extensions import Literal, TypeAlias
|
19
|
+
|
20
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
21
|
+
|
22
|
+
_AT = TypeVar('_AT', 'IPv4Address', 'IPv6Address')
|
23
|
+
|
24
|
+
#: Buffer ID.
|
25
|
+
BufferID: 'TypeAlias' = Tuple[_AT, int, _AT, int]
|
26
|
+
|
27
|
+
|
28
|
+
@info_final
|
29
|
+
class Packet(Info):
|
30
|
+
"""Data model for :term:`TCP <reasm.tcp.packet>` packet representation."""
|
31
|
+
|
32
|
+
#: Buffer ID.
|
33
|
+
bufid: 'BufferID'
|
34
|
+
#: Data sequence number.
|
35
|
+
dsn: 'int'
|
36
|
+
#: Acknowledgment number.
|
37
|
+
ack: 'int'
|
38
|
+
#: Original packet range number.
|
39
|
+
num: 'int'
|
40
|
+
#: Synchronise flag.
|
41
|
+
syn: 'bool'
|
42
|
+
#: Finish flag.
|
43
|
+
fin: 'bool'
|
44
|
+
#: Reset connection flag.
|
45
|
+
rst: 'bool'
|
46
|
+
#: Payload length, header excluded.
|
47
|
+
len: 'int'
|
48
|
+
#: This sequence number.
|
49
|
+
first: 'int'
|
50
|
+
#: Next (wanted) sequence number.
|
51
|
+
last: 'int'
|
52
|
+
#: Raw :obj:`bytes` type header.
|
53
|
+
header: 'bytes'
|
54
|
+
#: Raw :obj:`bytearray` type payload.
|
55
|
+
payload: 'bytearray'
|
56
|
+
|
57
|
+
if TYPE_CHECKING:
|
58
|
+
def __init__(self, bufid: 'BufferID', dsn: 'int', ack: 'int', num: 'int', syn: 'bool', fin: 'bool', rst: 'bool', len: 'int', first: 'int', last: 'int', header: 'bytes', payload: 'bytearray') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
|
59
|
+
|
60
|
+
|
61
|
+
@info_final
|
62
|
+
class DatagramID(Info, Generic[_AT]):
|
63
|
+
"""Data model for :term:`TCP <reasm.tcp.datagram>` original packet identifier."""
|
64
|
+
|
65
|
+
#: Source address.
|
66
|
+
src: 'tuple[_AT, int]'
|
67
|
+
#: Destination address.
|
68
|
+
dst: 'tuple[_AT, int]'
|
69
|
+
#: Original packet ACK number.
|
70
|
+
ack: 'int'
|
71
|
+
|
72
|
+
if TYPE_CHECKING:
|
73
|
+
def __init__(self, src: 'tuple[_AT, int]', dst: 'tuple[_AT, int]', ack: 'int') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
|
74
|
+
|
75
|
+
|
76
|
+
@info_final
|
77
|
+
class Datagram(Info, Generic[_AT]):
|
78
|
+
"""Data model for :term:`TCP <reasm.tcp.datagram>`."""
|
79
|
+
|
80
|
+
#: Completed flag.
|
81
|
+
completed: 'bool'
|
82
|
+
#: Original packet identifier.
|
83
|
+
id: 'DatagramID[_AT]'
|
84
|
+
#: Packet numbers.
|
85
|
+
index: 'tuple[int, ...]'
|
86
|
+
#: Initial TCP header.
|
87
|
+
header: 'bytes'
|
88
|
+
#: Reassembled payload (application layer data).
|
89
|
+
payload: 'bytes | tuple[bytes, ...]'
|
90
|
+
#: Parsed reassembled payload.
|
91
|
+
packet: 'Optional[Protocol]'
|
92
|
+
|
93
|
+
if TYPE_CHECKING:
|
94
|
+
@overload # pylint: disable=used-before-assignment
|
95
|
+
def __init__(self, completed: 'Literal[True]', id: 'DatagramID[_AT]', index: 'tuple[int, ...]', header: 'bytes', payload: 'bytes', packet: 'Protocol') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
|
96
|
+
|
97
|
+
@overload
|
98
|
+
def __init__(self, completed: 'Literal[False]', id: 'DatagramID[_AT]', index: 'tuple[int, ...]', header: 'bytes', payload: 'tuple[bytes, ...]', packet: 'None') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
|
99
|
+
|
100
|
+
def __init__(self, completed: 'bool', id: 'DatagramID[_AT]', index: 'tuple[int, ...]', header: 'bytes', payload: 'bytes | tuple[bytes, ...]', packet: 'Optional[Protocol]') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
|
101
|
+
|
102
|
+
|
103
|
+
@info_final
|
104
|
+
class HoleDiscriptor(Info):
|
105
|
+
"""Data model for :term:`TCP <reasm.tcp.buffer>` hole descriptor."""
|
106
|
+
|
107
|
+
#: Start of hole.
|
108
|
+
first: 'int'
|
109
|
+
#: Stop of hole.
|
110
|
+
last: 'int'
|
111
|
+
|
112
|
+
if TYPE_CHECKING:
|
113
|
+
def __init__(self, first: 'int', last: 'int') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
|
114
|
+
|
115
|
+
|
116
|
+
@info_final
|
117
|
+
class Fragment(Info):
|
118
|
+
"""Data model for :term:`TCP <reasm.tcp.buffer>` ACK list fragment item."""
|
119
|
+
|
120
|
+
#: List of reassembled packets.
|
121
|
+
ind: 'list[int]'
|
122
|
+
#: ISN of payload buffer.
|
123
|
+
isn: 'int'
|
124
|
+
#: Length of payload buffer.
|
125
|
+
len: 'int'
|
126
|
+
#: Reassembled payload holes set to b'\x00'.
|
127
|
+
raw: 'bytearray'
|
128
|
+
|
129
|
+
if TYPE_CHECKING:
|
130
|
+
def __init__(self, ind: 'list[int]', isn: 'int', len: 'int', raw: 'bytearray') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
|
131
|
+
|
132
|
+
|
133
|
+
@info_final
|
134
|
+
class Buffer(Info):
|
135
|
+
"""Data model for :term:`TCP <reasm.tcp.buffer>` buffer entry."""
|
136
|
+
|
137
|
+
#: Hole descriptor list.
|
138
|
+
hdl: 'list[HoleDiscriptor]'
|
139
|
+
#: Initial TCP header.
|
140
|
+
hdr: 'bytes'
|
141
|
+
#: ACK list.
|
142
|
+
ack: 'dict[int, Fragment]'
|
143
|
+
|
144
|
+
if TYPE_CHECKING:
|
145
|
+
def __init__(self, hdl: 'list[HoleDiscriptor]', hdr: 'bytes', ack: 'dict[int, Fragment]') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin
|
@@ -0,0 +1,192 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""IP Datagram Reassembly
|
3
|
+
============================
|
4
|
+
|
5
|
+
.. module:: pcapkit.foundation.reassembly.ip
|
6
|
+
|
7
|
+
:mod:`pcapkit.foundation.reassembly.ip` contains
|
8
|
+
:class:`~pcapkit.foundation.reassembly.ip.IP`
|
9
|
+
only, which reconstructs fragmented IP packets back to
|
10
|
+
origin. The following algorithm implement is based on IP
|
11
|
+
reassembly procedure introduced in :rfc:`791`, using
|
12
|
+
``RCVBT`` (fragment receivedbit table). Though another
|
13
|
+
algorithm is explained in :rfc:`815`, replacing ``RCVBT``,
|
14
|
+
however, this implement still used the elder one.
|
15
|
+
|
16
|
+
"""
|
17
|
+
from typing import TYPE_CHECKING, Generic
|
18
|
+
|
19
|
+
from pcapkit.foundation.reassembly.data.ip import (_AT, Buffer, BufferID, Datagram, DatagramID,
|
20
|
+
Packet)
|
21
|
+
from pcapkit.foundation.reassembly.reassembly import ReassemblyBase as Reassembly
|
22
|
+
|
23
|
+
if TYPE_CHECKING:
|
24
|
+
from typing import Type
|
25
|
+
|
26
|
+
from pcapkit.const.reg.transtype import TransType
|
27
|
+
from pcapkit.protocols.internet.ip import IP as IP_Protocol
|
28
|
+
|
29
|
+
__all__ = ['IP']
|
30
|
+
|
31
|
+
|
32
|
+
class IP(Reassembly[Packet[_AT], Datagram[_AT], BufferID, Buffer[_AT]], Generic[_AT]): # pylint: disable=abstract-method
|
33
|
+
"""Reassembly for IP payload.
|
34
|
+
|
35
|
+
Args:
|
36
|
+
strict: if return all datagrams (including those not
|
37
|
+
implemented) when submit
|
38
|
+
store: if store reassembled datagram in memory, i.e.,
|
39
|
+
:attr:`self._dtgram <pcapkit.foundation.reassembly.reassembly.Reassembly._dtgram>`
|
40
|
+
(if not, datagram will be discarded after callback)
|
41
|
+
|
42
|
+
Important:
|
43
|
+
This class is not intended to be instantiated directly,
|
44
|
+
but rather used as a base class for the protocol-aware
|
45
|
+
reassembly classes.
|
46
|
+
|
47
|
+
"""
|
48
|
+
if TYPE_CHECKING:
|
49
|
+
protocol: 'Type[IP_Protocol]'
|
50
|
+
|
51
|
+
##########################################################################
|
52
|
+
# Methods.
|
53
|
+
##########################################################################
|
54
|
+
|
55
|
+
def reassembly(self, info: 'Packet[_AT]') -> 'None':
|
56
|
+
"""Reassembly procedure.
|
57
|
+
|
58
|
+
Arguments:
|
59
|
+
info: info dict of packets to be reassembled
|
60
|
+
|
61
|
+
"""
|
62
|
+
# clear cache
|
63
|
+
self._flag_n = False
|
64
|
+
self.__cached__.clear()
|
65
|
+
|
66
|
+
BUFID = info.bufid # Buffer Identifier
|
67
|
+
FO = info.fo # Fragment Offset
|
68
|
+
IHL = info.ihl # Internet Header Length
|
69
|
+
MF = info.mf # More Fragments flag
|
70
|
+
TL = info.tl # Total Length
|
71
|
+
|
72
|
+
# when non-fragmented (possibly discarded) packet received
|
73
|
+
if not FO and not MF:
|
74
|
+
if BUFID in self._buffer:
|
75
|
+
self._dtgram.extend(
|
76
|
+
self.submit(self._buffer.pop(BUFID), bufid=BUFID)
|
77
|
+
)
|
78
|
+
return
|
79
|
+
|
80
|
+
# initialise buffer with BUFID
|
81
|
+
if BUFID not in self._buffer:
|
82
|
+
self._buffer[BUFID] = Buffer(
|
83
|
+
TDL=-1, # Total Data Length
|
84
|
+
RCVBT=bytearray(8191), # Fragment Received Bit Table
|
85
|
+
index=[], # index record
|
86
|
+
header=b'' if FO else info.header, # header buffer
|
87
|
+
datagram=bytearray(65535), # data buffer
|
88
|
+
)
|
89
|
+
else:
|
90
|
+
# put header into header buffer
|
91
|
+
if not FO: # pylint: disable=else-if-used
|
92
|
+
self._buffer[BUFID].__update__(header=info.header)
|
93
|
+
|
94
|
+
# append packet index
|
95
|
+
self._buffer[BUFID].index.append(info.num)
|
96
|
+
|
97
|
+
# put data into data buffer
|
98
|
+
start = FO
|
99
|
+
stop = TL - IHL + FO
|
100
|
+
self._buffer[BUFID].datagram[start:stop] = info.payload
|
101
|
+
|
102
|
+
# set RCVBT bits (in 8 octets)
|
103
|
+
start = FO // 8
|
104
|
+
stop = FO // 8 + (TL - IHL + 7) // 8
|
105
|
+
self._buffer[BUFID].RCVBT[start:stop] = b'\x01' * (stop - start + 1)
|
106
|
+
|
107
|
+
# get total data length (header excludes)
|
108
|
+
TDL = 0
|
109
|
+
if not MF:
|
110
|
+
TDL = TL - IHL + FO
|
111
|
+
self._buffer[BUFID].__update__(TDL=TDL)
|
112
|
+
|
113
|
+
# when datagram is reassembled in whole
|
114
|
+
start = 0
|
115
|
+
stop = (TDL + 7) // 8
|
116
|
+
if TDL and all(self._buffer[BUFID].RCVBT[start:stop]):
|
117
|
+
self._dtgram.extend(
|
118
|
+
self.submit(self._buffer.pop(BUFID), bufid=BUFID, checked=True)
|
119
|
+
)
|
120
|
+
|
121
|
+
def submit(self, buf: 'Buffer[_AT]', *, bufid: 'tuple[_AT, _AT, int, TransType]', # type: ignore[override] # pylint: disable=arguments-differ
|
122
|
+
checked: 'bool' = False) -> 'list[Datagram[_AT]]':
|
123
|
+
"""Submit reassembled payload.
|
124
|
+
|
125
|
+
Arguments:
|
126
|
+
buf: buffer dict of reassembled packets
|
127
|
+
bufid: buffer identifier
|
128
|
+
checked: buffer consistency checked flag
|
129
|
+
|
130
|
+
Returns:
|
131
|
+
Reassembled packets.
|
132
|
+
|
133
|
+
"""
|
134
|
+
TDL = buf.TDL
|
135
|
+
RCVBT = buf.RCVBT
|
136
|
+
index = buf.index
|
137
|
+
header = buf.header
|
138
|
+
datagram = buf.datagram
|
139
|
+
|
140
|
+
start = 0
|
141
|
+
stop = (TDL + 7) // 8
|
142
|
+
flag = checked or (TDL and all(RCVBT[start:stop]))
|
143
|
+
# if datagram is not implemented
|
144
|
+
if not flag and self._flag_s:
|
145
|
+
data = [] # type: list[bytes]
|
146
|
+
byte = bytearray()
|
147
|
+
# extract received payload
|
148
|
+
for (bctr, bit) in enumerate(RCVBT):
|
149
|
+
if bit: # received bit
|
150
|
+
this = bctr * 8
|
151
|
+
that = this + 8
|
152
|
+
byte += datagram[this:that]
|
153
|
+
else: # missing bit
|
154
|
+
if byte: # strip empty payload
|
155
|
+
data.append(bytes(byte))
|
156
|
+
byte = bytearray()
|
157
|
+
# strip empty packets
|
158
|
+
if data or header:
|
159
|
+
packet = Datagram(
|
160
|
+
completed=False,
|
161
|
+
id=DatagramID(
|
162
|
+
src=bufid[0],
|
163
|
+
dst=bufid[1],
|
164
|
+
id=bufid[2],
|
165
|
+
proto=bufid[3],
|
166
|
+
),
|
167
|
+
index=tuple(index),
|
168
|
+
header=header,
|
169
|
+
payload=tuple(data),
|
170
|
+
packet=None,
|
171
|
+
)
|
172
|
+
# if datagram is reassembled in whole
|
173
|
+
else:
|
174
|
+
payload = datagram[:TDL]
|
175
|
+
packet = Datagram(
|
176
|
+
completed=True,
|
177
|
+
id=DatagramID(
|
178
|
+
src=bufid[0],
|
179
|
+
dst=bufid[1],
|
180
|
+
id=bufid[2],
|
181
|
+
proto=bufid[3],
|
182
|
+
),
|
183
|
+
index=tuple(index),
|
184
|
+
header=header,
|
185
|
+
payload=bytes(payload),
|
186
|
+
packet=self.protocol.analyze(bufid[3], bytes(payload)),
|
187
|
+
)
|
188
|
+
|
189
|
+
ret = [packet]
|
190
|
+
for callback in self.__callback_fn__:
|
191
|
+
callback(ret)
|
192
|
+
return ret
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""IPv4 Datagram Reassembly
|
3
|
+
==============================
|
4
|
+
|
5
|
+
.. module:: pcapkit.foundation.reassembly.ipv4
|
6
|
+
|
7
|
+
:mod:`pcapkit.foundation.reassembly.ipv4` contains
|
8
|
+
:class:`~pcapkit.foundation.reassembly.ipv4.IPv4`
|
9
|
+
only, which reconstructs fragmented IPv4 packets back to
|
10
|
+
origin. Please refer to :doc:`ip` for more information.
|
11
|
+
|
12
|
+
"""
|
13
|
+
from pcapkit.foundation.reassembly.ip import IP
|
14
|
+
from pcapkit.protocols.internet.ipv4 import IPv4 as IPv4_Protocol
|
15
|
+
|
16
|
+
__all__ = ['IPv4']
|
17
|
+
|
18
|
+
|
19
|
+
# BUG: It is supposed to be ``IP[IPv4Address]``. But somehow Python
|
20
|
+
# thinks that ``IP`` should take 4 arguments as in its parent class
|
21
|
+
# ``Reassembly``. So we have to drop the type hint here.
|
22
|
+
class IPv4(IP):
|
23
|
+
"""Reassembly for IPv4 payload.
|
24
|
+
|
25
|
+
Args:
|
26
|
+
strict: if return all datagrams (including those not
|
27
|
+
implemented) when submit
|
28
|
+
store: if store reassembled datagram in memory, i.e.,
|
29
|
+
:attr:`self._dtgram <pcapkit.foundation.reassembly.reassembly.Reassembly._dtgram>`
|
30
|
+
(if not, datagram will be discarded after callback)
|
31
|
+
|
32
|
+
Example:
|
33
|
+
>>> from pcapkit.foundation.reassembly import IPv4
|
34
|
+
# Initialise instance:
|
35
|
+
>>> ipv4_reassembly = IPv4()
|
36
|
+
# Call reassembly:
|
37
|
+
>>> ipv4_reassembly(packet_dict)
|
38
|
+
# Fetch result:
|
39
|
+
>>> result = ipv4_reassembly.datagram
|
40
|
+
|
41
|
+
"""
|
42
|
+
|
43
|
+
##########################################################################
|
44
|
+
# Defaults.
|
45
|
+
##########################################################################
|
46
|
+
|
47
|
+
#: Protocol name of current reassembly object.
|
48
|
+
__protocol_name__ = 'IPv4'
|
49
|
+
#: Protocol of current reassembly object.
|
50
|
+
__protocol_type__ = IPv4_Protocol
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""IPv6 Datagram Reassembly
|
3
|
+
==============================
|
4
|
+
|
5
|
+
.. module:: pcapkit.foundation.reassembly.ipv6
|
6
|
+
|
7
|
+
:mod:`pcapkit.foundation.reassembly.ipv6` contains
|
8
|
+
:class:`~pcapkit.foundation.reassembly.ipv6.IPv6`
|
9
|
+
only, which reconstructs fragmented IPv6 packets back to
|
10
|
+
origin. Please refer to :doc:`ip` for more information.
|
11
|
+
|
12
|
+
"""
|
13
|
+
from pcapkit.foundation.reassembly.ip import IP
|
14
|
+
from pcapkit.protocols.internet.ipv6 import IPv6 as IPv6_Protocol
|
15
|
+
|
16
|
+
__all__ = ['IPv6']
|
17
|
+
|
18
|
+
|
19
|
+
# BUG: It is supposed to be ``IP[IPv6Address]``. But somehow Python
|
20
|
+
# thinks that ``IP`` should take 4 arguments as in its parent class
|
21
|
+
# ``Reassembly``. So we have to drop the type hint here.
|
22
|
+
class IPv6(IP):
|
23
|
+
"""Reassembly for IPv6 payload.
|
24
|
+
|
25
|
+
Args:
|
26
|
+
strict: if return all datagrams (including those not
|
27
|
+
implemented) when submit
|
28
|
+
store: if store reassembled datagram in memory, i.e.,
|
29
|
+
:attr:`self._dtgram <pcapkit.foundation.reassembly.reassembly.Reassembly._dtgram>`
|
30
|
+
(if not, datagram will be discarded after callback)
|
31
|
+
|
32
|
+
Example:
|
33
|
+
>>> from pcapkit.foundation.reassembly import IPv6
|
34
|
+
# Initialise instance:
|
35
|
+
>>> ipv6_reassembly = IPv6()
|
36
|
+
# Call reassembly:
|
37
|
+
>>> ipv6_reassembly(packet_dict)
|
38
|
+
# Fetch result:
|
39
|
+
>>> result = ipv6_reassembly.datagram
|
40
|
+
|
41
|
+
"""
|
42
|
+
|
43
|
+
##########################################################################
|
44
|
+
# Defaults.
|
45
|
+
##########################################################################
|
46
|
+
|
47
|
+
#: Protocol name of current reassembly object.
|
48
|
+
__protocol_name__ = 'IPv6'
|
49
|
+
#: Protocol of current reassembly object.
|
50
|
+
__protocol_type__ = IPv6_Protocol
|