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,722 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""miscellaneous field class"""
|
3
|
+
|
4
|
+
import copy
|
5
|
+
import io
|
6
|
+
from typing import TYPE_CHECKING, TypeVar, cast
|
7
|
+
|
8
|
+
from pcapkit.corekit.fields.field import FieldBase, NoValue
|
9
|
+
from pcapkit.utilities.exceptions import FieldError, NoDefaultValue
|
10
|
+
|
11
|
+
__all__ = [
|
12
|
+
'ConditionalField', 'PayloadField',
|
13
|
+
'SwitchField', 'ForwardMatchField',
|
14
|
+
'NoValueField',
|
15
|
+
]
|
16
|
+
|
17
|
+
if TYPE_CHECKING:
|
18
|
+
from typing import IO, Any, Callable, Optional, Type
|
19
|
+
|
20
|
+
from typing_extensions import Self
|
21
|
+
|
22
|
+
from pcapkit.corekit.fields.field import NoValueType
|
23
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
24
|
+
from pcapkit.protocols.schema.schema import Schema
|
25
|
+
|
26
|
+
_TC = TypeVar('_TC')
|
27
|
+
_TS = TypeVar('_TS', bound='Schema')
|
28
|
+
_TP = TypeVar('_TP', bound='Protocol')
|
29
|
+
_TN = TypeVar('_TN', bound='NoValueType')
|
30
|
+
|
31
|
+
|
32
|
+
class NoValueField(FieldBase[_TN]):
|
33
|
+
"""Schema field for no value type (or :obj:`None`)."""
|
34
|
+
|
35
|
+
_default = NoValue
|
36
|
+
|
37
|
+
@property
|
38
|
+
def template(self) -> 'str':
|
39
|
+
"""Field template."""
|
40
|
+
return '0s'
|
41
|
+
|
42
|
+
@property
|
43
|
+
def length(self) -> 'int':
|
44
|
+
"""Field size."""
|
45
|
+
return 0
|
46
|
+
|
47
|
+
def pack(self, value: 'Optional[_TN]', packet: 'dict[str, Any]') -> 'bytes':
|
48
|
+
"""Pack field value into :obj:`bytes`.
|
49
|
+
|
50
|
+
Args:
|
51
|
+
value: Field value.
|
52
|
+
packet: Packet data.
|
53
|
+
|
54
|
+
Returns:
|
55
|
+
Packed field value.
|
56
|
+
|
57
|
+
"""
|
58
|
+
return b''
|
59
|
+
|
60
|
+
def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> '_TN':
|
61
|
+
"""Unpack field value from :obj:`bytes`.
|
62
|
+
|
63
|
+
Args:
|
64
|
+
buffer: Field buffer.
|
65
|
+
packet: Packet data.
|
66
|
+
|
67
|
+
Returns:
|
68
|
+
Unpacked field value.
|
69
|
+
|
70
|
+
"""
|
71
|
+
return None # type: ignore[return-value]
|
72
|
+
|
73
|
+
|
74
|
+
class ConditionalField(FieldBase[_TC]):
|
75
|
+
"""Conditional value for protocol fields.
|
76
|
+
|
77
|
+
Args:
|
78
|
+
field: Field instance.
|
79
|
+
condition: Field condition function (this function should return a bool
|
80
|
+
value and accept the current packet :class:`pcapkit.corekit.infoclass.Info`
|
81
|
+
as its only argument).
|
82
|
+
|
83
|
+
"""
|
84
|
+
|
85
|
+
@property
|
86
|
+
def name(self) -> 'str':
|
87
|
+
"""Field name."""
|
88
|
+
return self._field.name
|
89
|
+
|
90
|
+
@name.setter
|
91
|
+
def name(self, value: 'str') -> 'None':
|
92
|
+
"""Set field name."""
|
93
|
+
self._field.name = value
|
94
|
+
|
95
|
+
@property
|
96
|
+
def default(self) -> '_TC | NoValueType':
|
97
|
+
"""Field default value."""
|
98
|
+
return self._field.default
|
99
|
+
|
100
|
+
@default.setter
|
101
|
+
def default(self, value: '_TC | NoValueType') -> 'None':
|
102
|
+
"""Set field default value."""
|
103
|
+
self._field.default = value
|
104
|
+
|
105
|
+
@default.deleter
|
106
|
+
def default(self) -> 'None':
|
107
|
+
"""Delete field default value."""
|
108
|
+
self._field.default = NoValue
|
109
|
+
|
110
|
+
@property
|
111
|
+
def template(self) -> 'str':
|
112
|
+
"""Field template."""
|
113
|
+
return self._field.template
|
114
|
+
|
115
|
+
@property
|
116
|
+
def length(self) -> 'int':
|
117
|
+
"""Field size."""
|
118
|
+
return self._field.length
|
119
|
+
|
120
|
+
@property
|
121
|
+
def optional(self) -> 'bool':
|
122
|
+
"""Field is optional."""
|
123
|
+
return True
|
124
|
+
|
125
|
+
@property
|
126
|
+
def field(self) -> 'FieldBase[_TC]':
|
127
|
+
"""Field instance."""
|
128
|
+
return self._field
|
129
|
+
|
130
|
+
def __init__(self, field: 'FieldBase[_TC]', # pylint: disable=super-init-not-called
|
131
|
+
condition: 'Callable[[dict[str, Any]], bool]') -> 'None':
|
132
|
+
self._field = field # type: FieldBase[_TC]
|
133
|
+
self._condition = condition
|
134
|
+
|
135
|
+
def __call__(self, packet: 'dict[str, Any]') -> 'Self':
|
136
|
+
"""Update field attributes.
|
137
|
+
|
138
|
+
Arguments:
|
139
|
+
packet: Packet data.
|
140
|
+
|
141
|
+
Returns:
|
142
|
+
Updated field instance.
|
143
|
+
|
144
|
+
This method will return a new instance of :class:`ConditionalField`
|
145
|
+
instead of updating the current instance.
|
146
|
+
|
147
|
+
"""
|
148
|
+
new_self = copy.copy(self)
|
149
|
+
if new_self._condition(packet):
|
150
|
+
new_self._field = new_self._field(packet)
|
151
|
+
return new_self
|
152
|
+
|
153
|
+
def pre_process(self, value: '_TC', packet: 'dict[str, Any]') -> 'Any': # pylint: disable=unused-argument
|
154
|
+
"""Process field value before construction (packing).
|
155
|
+
|
156
|
+
Arguments:
|
157
|
+
value: Field value.
|
158
|
+
packet: Packet data.
|
159
|
+
|
160
|
+
Returns:
|
161
|
+
Processed field value.
|
162
|
+
|
163
|
+
"""
|
164
|
+
return self._field.pre_process(value, packet)
|
165
|
+
|
166
|
+
def pack(self, value: 'Optional[_TC]', packet: 'dict[str, Any]') -> 'bytes':
|
167
|
+
"""Pack field value into :obj:`bytes`.
|
168
|
+
|
169
|
+
Args:
|
170
|
+
value: Field value.
|
171
|
+
packet: Packet data.
|
172
|
+
|
173
|
+
Returns:
|
174
|
+
Packed field value.
|
175
|
+
|
176
|
+
"""
|
177
|
+
if not self._condition(packet):
|
178
|
+
return b''
|
179
|
+
return self._field.pack(value, packet)
|
180
|
+
|
181
|
+
def post_process(self, value: 'Any', packet: 'dict[str, Any]') -> '_TC': # pylint: disable=unused-argument
|
182
|
+
"""Process field value after parsing (unpacking).
|
183
|
+
|
184
|
+
Args:
|
185
|
+
value: Field value.
|
186
|
+
packet: Packet data.
|
187
|
+
|
188
|
+
Returns:
|
189
|
+
Processed field value.
|
190
|
+
|
191
|
+
"""
|
192
|
+
return self._field.post_process(value, packet)
|
193
|
+
|
194
|
+
def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> '_TC':
|
195
|
+
"""Unpack field value from :obj:`bytes`.
|
196
|
+
|
197
|
+
Args:
|
198
|
+
buffer: Field buffer.
|
199
|
+
packet: Packet data.
|
200
|
+
|
201
|
+
Returns:
|
202
|
+
Unpacked field value.
|
203
|
+
|
204
|
+
"""
|
205
|
+
if not self._condition(packet):
|
206
|
+
return self._field.default # type: ignore[return-value]
|
207
|
+
return self._field.unpack(buffer, packet)
|
208
|
+
|
209
|
+
def test(self, packet: 'dict[str, Any]') -> 'bool':
|
210
|
+
"""Test field condition.
|
211
|
+
|
212
|
+
Arguments:
|
213
|
+
packet: Current packet.
|
214
|
+
|
215
|
+
Returns:
|
216
|
+
bool: Test result.
|
217
|
+
|
218
|
+
"""
|
219
|
+
return self._condition(packet)
|
220
|
+
|
221
|
+
|
222
|
+
class PayloadField(FieldBase[_TP]):
|
223
|
+
"""Payload value for protocol fields.
|
224
|
+
|
225
|
+
Args:
|
226
|
+
length: Field size (in bytes); if a callable is given, it should return
|
227
|
+
an integer value and accept the current packet as its only argument.
|
228
|
+
default: Field default value.
|
229
|
+
protocol: Payload protocol.
|
230
|
+
callback: Callback function to be called upon
|
231
|
+
:meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
|
232
|
+
|
233
|
+
"""
|
234
|
+
|
235
|
+
@property
|
236
|
+
def template(self) -> 'str':
|
237
|
+
"""Field template."""
|
238
|
+
return self._template
|
239
|
+
|
240
|
+
@property
|
241
|
+
def length(self) -> 'int':
|
242
|
+
"""Field size."""
|
243
|
+
return self._length
|
244
|
+
|
245
|
+
@property
|
246
|
+
def optional(self) -> 'bool':
|
247
|
+
"""Field is optional."""
|
248
|
+
return True
|
249
|
+
|
250
|
+
@property
|
251
|
+
def protocol(self) -> 'Type[_TP]':
|
252
|
+
"""Payload protocol."""
|
253
|
+
if self._protocol is None:
|
254
|
+
from pcapkit.protocols.misc.raw import Raw # type: ignore[unreachable] # pylint: disable=import-outside-top-level # isort:skip
|
255
|
+
return Raw
|
256
|
+
return self._protocol
|
257
|
+
|
258
|
+
@protocol.setter
|
259
|
+
def protocol(self, protocol: 'Type[_TP] | str') -> 'None':
|
260
|
+
"""Set payload protocol.
|
261
|
+
|
262
|
+
Arguments:
|
263
|
+
protocol: Payload protocol.
|
264
|
+
|
265
|
+
"""
|
266
|
+
if isinstance(protocol, str):
|
267
|
+
from pcapkit.protocols import __proto__ # pylint: disable=import-outside-top-level
|
268
|
+
protocol = cast('Type[_TP]', __proto__.get(protocol))
|
269
|
+
self._protocol = protocol
|
270
|
+
|
271
|
+
def __init__(self, length: 'int | Callable[[dict[str, Any]], int]' = lambda _: -1,
|
272
|
+
default: '_TP | NoValueType | bytes' = NoValue,
|
273
|
+
protocol: 'Optional[Type[_TP]]' = None,
|
274
|
+
callback: 'Callable[[Self, dict[str, Any]], None]' = lambda *_: None) -> 'None':
|
275
|
+
#self._name = '<payload>'
|
276
|
+
self._default = default # type: ignore[assignment]
|
277
|
+
self._protocol = protocol # type: ignore[assignment]
|
278
|
+
self._callback = callback
|
279
|
+
|
280
|
+
self._length_callback = None
|
281
|
+
if not isinstance(length, int):
|
282
|
+
self._length_callback, length = length, -1
|
283
|
+
self._length = length
|
284
|
+
self._template = f'{self._length}s' if self._length >= 0 else '1024s' # use a reasonable default
|
285
|
+
|
286
|
+
def __call__(self, packet: 'dict[str, Any]') -> 'Self':
|
287
|
+
"""Update field attributes.
|
288
|
+
|
289
|
+
Args:
|
290
|
+
packet: Packet data.
|
291
|
+
|
292
|
+
Returns:
|
293
|
+
Updated field instance.
|
294
|
+
|
295
|
+
This method will return a new instance of :class:`PayloadField`
|
296
|
+
instead of updating the current instance.
|
297
|
+
|
298
|
+
"""
|
299
|
+
new_self = copy.copy(self)
|
300
|
+
new_self._callback(new_self, packet)
|
301
|
+
if new_self._length_callback is not None:
|
302
|
+
new_self._length = new_self._length_callback(packet)
|
303
|
+
new_self._template = f'{new_self._length}s'
|
304
|
+
return new_self
|
305
|
+
|
306
|
+
def pack(self, value: 'Optional[_TP | Schema | bytes]', packet: 'dict[str, Any]') -> 'bytes':
|
307
|
+
"""Pack field value into :obj:`bytes`.
|
308
|
+
|
309
|
+
Args:
|
310
|
+
value: Field value.
|
311
|
+
packet: Packet data.
|
312
|
+
|
313
|
+
Returns:
|
314
|
+
Packed field value.
|
315
|
+
|
316
|
+
"""
|
317
|
+
if value is None:
|
318
|
+
if self._default is NoValue:
|
319
|
+
raise NoDefaultValue(f'Field {self.name} has no default value.')
|
320
|
+
value = cast('_TP', self._default)
|
321
|
+
|
322
|
+
from pcapkit.protocols.schema.schema import \
|
323
|
+
Schema # pylint: disable=import-outside-top-level
|
324
|
+
if isinstance(value, bytes):
|
325
|
+
return value
|
326
|
+
if isinstance(value, Schema):
|
327
|
+
return value.pack()
|
328
|
+
return value.data # type: ignore[union-attr]
|
329
|
+
|
330
|
+
def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> '_TP':
|
331
|
+
"""Unpack field value from :obj:`bytes`.
|
332
|
+
|
333
|
+
Args:
|
334
|
+
buffer: Field buffer.
|
335
|
+
packet: Packet data.
|
336
|
+
|
337
|
+
Returns:
|
338
|
+
Unpacked field value.
|
339
|
+
|
340
|
+
"""
|
341
|
+
if self._protocol is None:
|
342
|
+
if isinstance(buffer, bytes): # type: ignore[unreachable]
|
343
|
+
return cast('_TP', buffer)
|
344
|
+
return cast('_TP', buffer.read())
|
345
|
+
|
346
|
+
if isinstance(buffer, bytes):
|
347
|
+
file = io.BytesIO(buffer) # type: IO[bytes]
|
348
|
+
else:
|
349
|
+
file = buffer
|
350
|
+
|
351
|
+
length = self._length if self._length > 0 else None
|
352
|
+
return self._protocol(file, length) # type: ignore[abstract]
|
353
|
+
|
354
|
+
|
355
|
+
class SwitchField(FieldBase[_TC]):
|
356
|
+
"""Conditional type-switching field for protocol schema.
|
357
|
+
|
358
|
+
Args:
|
359
|
+
selector: Callable function to select field type, which should accept
|
360
|
+
the current packet as its only argument and return a field instance.
|
361
|
+
|
362
|
+
"""
|
363
|
+
|
364
|
+
@property
|
365
|
+
def name(self) -> 'str':
|
366
|
+
"""Field name."""
|
367
|
+
return self._field.name
|
368
|
+
|
369
|
+
@name.setter
|
370
|
+
def name(self, value: 'str') -> 'None':
|
371
|
+
"""Set field name."""
|
372
|
+
self._field.name = value
|
373
|
+
|
374
|
+
@property
|
375
|
+
def default(self) -> '_TC | NoValueType':
|
376
|
+
"""Field default value."""
|
377
|
+
return self._field.default
|
378
|
+
|
379
|
+
@default.setter
|
380
|
+
def default(self, value: '_TC | NoValueType') -> 'None':
|
381
|
+
"""Set field default value."""
|
382
|
+
self._field.default = value
|
383
|
+
|
384
|
+
@default.deleter
|
385
|
+
def default(self) -> 'None':
|
386
|
+
"""Delete field default value."""
|
387
|
+
self._field.default = NoValue
|
388
|
+
|
389
|
+
@property
|
390
|
+
def template(self) -> 'str':
|
391
|
+
"""Field template."""
|
392
|
+
return self._field.template
|
393
|
+
|
394
|
+
@property
|
395
|
+
def length(self) -> 'int':
|
396
|
+
"""Field size."""
|
397
|
+
return self._field.length
|
398
|
+
|
399
|
+
@property
|
400
|
+
def optional(self) -> 'bool':
|
401
|
+
"""Field is optional."""
|
402
|
+
return True
|
403
|
+
|
404
|
+
@property
|
405
|
+
def field(self) -> 'FieldBase[_TC]':
|
406
|
+
"""Field instance."""
|
407
|
+
return self._field
|
408
|
+
|
409
|
+
def __init__(self, selector: 'Callable[[dict[str, Any]], FieldBase[_TC]]' = lambda _: NoValueField()) -> 'None': # type: ignore[assignment,return-value]
|
410
|
+
#self._name = '<switch>'
|
411
|
+
self._field = cast('FieldBase[_TC]', NoValueField())
|
412
|
+
self._selector = selector
|
413
|
+
|
414
|
+
def __call__(self, packet: 'dict[str, Any]') -> 'SwitchField[_TC]':
|
415
|
+
"""Call field.
|
416
|
+
|
417
|
+
Args:
|
418
|
+
packet: Packet data.
|
419
|
+
|
420
|
+
Returns:
|
421
|
+
New field instance.
|
422
|
+
|
423
|
+
This method will return a new instance of :class:`SwitchField`
|
424
|
+
instead of updating the current instance.
|
425
|
+
|
426
|
+
"""
|
427
|
+
new_self = copy.copy(self)
|
428
|
+
new_self._field = new_self._selector(packet)(packet)
|
429
|
+
new_self._field.name = self.name
|
430
|
+
return new_self
|
431
|
+
|
432
|
+
def pre_process(self, value: '_TC', packet: 'dict[str, Any]') -> 'Any': # pylint: disable=unused-argument
|
433
|
+
"""Process field value before construction (packing).
|
434
|
+
|
435
|
+
Arguments:
|
436
|
+
value: Field value.
|
437
|
+
packet: Packet data.
|
438
|
+
|
439
|
+
Returns:
|
440
|
+
Processed field value.
|
441
|
+
|
442
|
+
"""
|
443
|
+
if self._field is None:
|
444
|
+
return NoValue # type: ignore[unreachable]
|
445
|
+
return self._field.pre_process(value, packet)
|
446
|
+
|
447
|
+
def pack(self, value: 'Optional[_TC]', packet: 'dict[str, Any]') -> 'bytes':
|
448
|
+
"""Pack field value into :obj:`bytes`.
|
449
|
+
|
450
|
+
Args:
|
451
|
+
value: Field value.
|
452
|
+
packet: Packet data.
|
453
|
+
|
454
|
+
Returns:
|
455
|
+
Packed field value.
|
456
|
+
|
457
|
+
"""
|
458
|
+
if self._field is None:
|
459
|
+
return b'' # type: ignore[unreachable]
|
460
|
+
return self._field.pack(value, packet)
|
461
|
+
|
462
|
+
def post_process(self, value: 'Any', packet: 'dict[str, Any]') -> '_TC': # pylint: disable=unused-argument
|
463
|
+
"""Process field value after parsing (unpacking).
|
464
|
+
|
465
|
+
Args:
|
466
|
+
value: Field value.
|
467
|
+
packet: Packet data.
|
468
|
+
|
469
|
+
Returns:
|
470
|
+
Processed field value.
|
471
|
+
|
472
|
+
"""
|
473
|
+
if self._field is None:
|
474
|
+
return NoValue # type: ignore[unreachable]
|
475
|
+
return self._field.post_process(value, packet)
|
476
|
+
|
477
|
+
def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> '_TC':
|
478
|
+
"""Unpack field value from :obj:`bytes`.
|
479
|
+
|
480
|
+
Args:
|
481
|
+
buffer: Field buffer.
|
482
|
+
packet: Packet data.
|
483
|
+
|
484
|
+
Returns:
|
485
|
+
Unpacked field value.
|
486
|
+
|
487
|
+
"""
|
488
|
+
if self._field is None:
|
489
|
+
return None # type: ignore[unreachable]
|
490
|
+
return self._field.unpack(buffer, packet)
|
491
|
+
|
492
|
+
|
493
|
+
class SchemaField(FieldBase[_TS]):
|
494
|
+
"""Schema field for protocol schema.
|
495
|
+
|
496
|
+
Args:
|
497
|
+
length: Field size (in bytes); if a callable is given, it should return
|
498
|
+
an integer value and accept the current packet as its only argument.
|
499
|
+
schema: Field schema.
|
500
|
+
default: Default value for field.
|
501
|
+
packet: Optional packet data for unpacking and/or packing purposes.
|
502
|
+
callback: Callback function to process field value, which should accept
|
503
|
+
the current field and the current packet as its arguments.
|
504
|
+
|
505
|
+
"""
|
506
|
+
|
507
|
+
@property
|
508
|
+
def length(self) -> 'int':
|
509
|
+
"""Field size."""
|
510
|
+
return self._length # type: ignore[has-type]
|
511
|
+
|
512
|
+
@property
|
513
|
+
def optional(self) -> 'bool':
|
514
|
+
"""Field is optional."""
|
515
|
+
return True
|
516
|
+
|
517
|
+
@property
|
518
|
+
def schema(self) -> 'Type[_TS]':
|
519
|
+
"""Field schema."""
|
520
|
+
return self._schema
|
521
|
+
|
522
|
+
def __init__(self, length: 'int | Callable[[dict[str, Any]], int]' = lambda _: -1,
|
523
|
+
schema: 'Optional[Type[_TS]]' = None,
|
524
|
+
default: '_TS | NoValueType | bytes' = NoValue,
|
525
|
+
packet: 'Optional[dict[str, Any]]' = None,
|
526
|
+
callback: 'Callable[[Self, dict[str, Any]], None]' = lambda *_: None) -> 'None':
|
527
|
+
#self._name = '<schema>'
|
528
|
+
self._callback = callback
|
529
|
+
|
530
|
+
if packet is None:
|
531
|
+
packet = {}
|
532
|
+
self._packet = packet
|
533
|
+
|
534
|
+
if schema is None:
|
535
|
+
raise FieldError('Schema field must have a schema.')
|
536
|
+
self._schema = schema
|
537
|
+
|
538
|
+
if isinstance(default, bytes):
|
539
|
+
default = cast('_TS', schema.unpack(default)) # type: ignore[call-arg,misc]
|
540
|
+
self._default = default
|
541
|
+
|
542
|
+
self._length_callback = None
|
543
|
+
if not isinstance(length, int):
|
544
|
+
self._length_callback, length = length, -1
|
545
|
+
self._length = length
|
546
|
+
self._template = f'{self._length}s' if self._length >= 0 else '1024s' # use a reasonable default
|
547
|
+
|
548
|
+
def __call__(self, packet: 'dict[str, Any]') -> 'Self':
|
549
|
+
"""Update field attributes.
|
550
|
+
|
551
|
+
Args:
|
552
|
+
packet: Packet data.
|
553
|
+
|
554
|
+
Returns:
|
555
|
+
New field instance.
|
556
|
+
|
557
|
+
This method will return a new instance of :class:`SchemaField`
|
558
|
+
instead of updating the current instance.
|
559
|
+
|
560
|
+
"""
|
561
|
+
new_self = copy.copy(self)
|
562
|
+
new_self._callback(new_self, packet)
|
563
|
+
if new_self._length_callback is not None:
|
564
|
+
new_self._length = new_self._length_callback(packet)
|
565
|
+
new_self._template = f'{new_self._length}s' if self._length >= 0 else '1024s' # use a reasonable default
|
566
|
+
return new_self
|
567
|
+
|
568
|
+
def pack(self, value: 'Optional[_TS | bytes]', packet: 'dict[str, Any]') -> 'bytes':
|
569
|
+
"""Pack field value into :obj:`bytes`.
|
570
|
+
|
571
|
+
Args:
|
572
|
+
value: Field value.
|
573
|
+
packet: Packet data.
|
574
|
+
|
575
|
+
Returns:
|
576
|
+
Packed field value.
|
577
|
+
|
578
|
+
Notes:
|
579
|
+
We will use ``packet`` as a ``__packet__`` key in the packet context
|
580
|
+
passed to the underlying :class:`~pcapkit.protocols.schema.schema.Schema`
|
581
|
+
for packing purposes.
|
582
|
+
|
583
|
+
"""
|
584
|
+
if value is None:
|
585
|
+
if self._default is NoValue:
|
586
|
+
raise NoDefaultValue(f'Field {self.name} has no default value.')
|
587
|
+
value = cast('_TS', self._default)
|
588
|
+
|
589
|
+
if isinstance(value, bytes):
|
590
|
+
return value
|
591
|
+
|
592
|
+
packet.update(self._packet)
|
593
|
+
return value.pack({
|
594
|
+
'__packet__': packet,
|
595
|
+
})
|
596
|
+
|
597
|
+
def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> '_TS':
|
598
|
+
"""Unpack field value from :obj:`bytes`.
|
599
|
+
|
600
|
+
Args:
|
601
|
+
buffer: Field buffer.
|
602
|
+
packet: Packet data.
|
603
|
+
|
604
|
+
Returns:
|
605
|
+
Unpacked field value.
|
606
|
+
|
607
|
+
Notes:
|
608
|
+
We will use ``packet`` as a ``__packet__`` key in the packet context
|
609
|
+
passed to the underlying :class:`~pcapkit.protocols.schema.schema.Schema`
|
610
|
+
for unpacking purposes.
|
611
|
+
|
612
|
+
"""
|
613
|
+
if isinstance(buffer, bytes):
|
614
|
+
file = io.BytesIO(buffer) # type: IO[bytes]
|
615
|
+
else:
|
616
|
+
file = buffer
|
617
|
+
|
618
|
+
packet.update(self._packet)
|
619
|
+
return cast('_TS', self._schema.unpack(file, self.length, { # type: ignore[call-arg,misc]
|
620
|
+
'__packet__': packet,
|
621
|
+
}))
|
622
|
+
|
623
|
+
|
624
|
+
class ForwardMatchField(FieldBase[_TC]):
|
625
|
+
"""Schema field for non-capturing forward matching.
|
626
|
+
|
627
|
+
Args:
|
628
|
+
field: Field to forward match.
|
629
|
+
|
630
|
+
"""
|
631
|
+
|
632
|
+
@property
|
633
|
+
def name(self) -> 'str':
|
634
|
+
"""Field name."""
|
635
|
+
return self._field.name
|
636
|
+
|
637
|
+
@name.setter
|
638
|
+
def name(self, value: 'str') -> 'None':
|
639
|
+
"""Set field name."""
|
640
|
+
self._field.name = value
|
641
|
+
|
642
|
+
@property
|
643
|
+
def default(self) -> '_TC | NoValueType':
|
644
|
+
"""Field default value."""
|
645
|
+
return self._field.default
|
646
|
+
|
647
|
+
@default.setter
|
648
|
+
def default(self, value: '_TC | NoValueType') -> 'None':
|
649
|
+
"""Set field default value."""
|
650
|
+
self._field.default = value
|
651
|
+
|
652
|
+
@default.deleter
|
653
|
+
def default(self) -> 'None':
|
654
|
+
"""Delete field default value."""
|
655
|
+
self._field.default = NoValue
|
656
|
+
|
657
|
+
@property
|
658
|
+
def template(self) -> 'str':
|
659
|
+
"""Field template."""
|
660
|
+
return self._field.template
|
661
|
+
|
662
|
+
@property
|
663
|
+
def length(self) -> 'int':
|
664
|
+
"""Field size."""
|
665
|
+
return self._field.length
|
666
|
+
|
667
|
+
@property
|
668
|
+
def optional(self) -> 'bool':
|
669
|
+
"""Field is optional."""
|
670
|
+
return True
|
671
|
+
|
672
|
+
@property
|
673
|
+
def field(self) -> 'FieldBase[_TC]':
|
674
|
+
"""Field instance."""
|
675
|
+
return self._field
|
676
|
+
|
677
|
+
def __init__(self, field: 'FieldBase[_TC]') -> 'None':
|
678
|
+
#self._name = '<forward_match>'
|
679
|
+
self._field = field
|
680
|
+
|
681
|
+
def __call__(self, packet: 'dict[str, Any]') -> 'Self':
|
682
|
+
"""Update field attributes.
|
683
|
+
|
684
|
+
Arguments:
|
685
|
+
packet: Packet data.
|
686
|
+
|
687
|
+
Returns:
|
688
|
+
Updated field instance.
|
689
|
+
|
690
|
+
This method will return a new instance of :class:`ConditionalField`
|
691
|
+
instead of updating the current instance.
|
692
|
+
|
693
|
+
"""
|
694
|
+
new_self = copy.copy(self)
|
695
|
+
new_self._field = new_self._field(packet)
|
696
|
+
return new_self
|
697
|
+
|
698
|
+
def pack(self, value: 'Optional[_TC]', packet: 'dict[str, Any]') -> 'bytes':
|
699
|
+
"""Pack field value into :obj:`bytes`.
|
700
|
+
|
701
|
+
Args:
|
702
|
+
value: Field value.
|
703
|
+
packet: Packet data.
|
704
|
+
|
705
|
+
Returns:
|
706
|
+
Packed field value.
|
707
|
+
|
708
|
+
"""
|
709
|
+
return b''
|
710
|
+
|
711
|
+
def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> '_TC':
|
712
|
+
"""Unpack field value from :obj:`bytes`.
|
713
|
+
|
714
|
+
Args:
|
715
|
+
buffer: Field buffer.
|
716
|
+
packet: Packet data.
|
717
|
+
|
718
|
+
Returns:
|
719
|
+
Unpacked field value.
|
720
|
+
|
721
|
+
"""
|
722
|
+
return self._field.unpack(buffer, packet)
|