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.
Files changed (466) hide show
  1. pcapkit/__init__.py +126 -0
  2. pcapkit/__main__.py +138 -0
  3. pcapkit/all.py +136 -0
  4. pcapkit/const/__init__.py +81 -0
  5. pcapkit/const/arp/__init__.py +25 -0
  6. pcapkit/const/arp/hardware.py +181 -0
  7. pcapkit/const/arp/operation.py +131 -0
  8. pcapkit/const/ftp/__init__.py +25 -0
  9. pcapkit/const/ftp/command.py +309 -0
  10. pcapkit/const/ftp/return_code.py +304 -0
  11. pcapkit/const/hip/__init__.py +94 -0
  12. pcapkit/const/hip/certificate.py +77 -0
  13. pcapkit/const/hip/cipher.py +65 -0
  14. pcapkit/const/hip/di.py +59 -0
  15. pcapkit/const/hip/ecdsa_curve.py +59 -0
  16. pcapkit/const/hip/ecdsa_low_curve.py +56 -0
  17. pcapkit/const/hip/eddsa_curve.py +65 -0
  18. pcapkit/const/hip/esp_transform_suite.py +98 -0
  19. pcapkit/const/hip/group.py +86 -0
  20. pcapkit/const/hip/hi_algorithm.py +86 -0
  21. pcapkit/const/hip/hit_suite.py +68 -0
  22. pcapkit/const/hip/nat_traversal.py +62 -0
  23. pcapkit/const/hip/notify_message.py +200 -0
  24. pcapkit/const/hip/packet.py +89 -0
  25. pcapkit/const/hip/parameter.py +377 -0
  26. pcapkit/const/hip/registration.py +68 -0
  27. pcapkit/const/hip/registration_failure.py +84 -0
  28. pcapkit/const/hip/suite.py +71 -0
  29. pcapkit/const/hip/transport.py +59 -0
  30. pcapkit/const/http/__init__.py +39 -0
  31. pcapkit/const/http/error_code.py +95 -0
  32. pcapkit/const/http/frame.py +95 -0
  33. pcapkit/const/http/method.py +184 -0
  34. pcapkit/const/http/setting.py +96 -0
  35. pcapkit/const/http/status_code.py +294 -0
  36. pcapkit/const/ipv4/__init__.py +57 -0
  37. pcapkit/const/ipv4/classification_level.py +64 -0
  38. pcapkit/const/ipv4/option_class.py +55 -0
  39. pcapkit/const/ipv4/option_number.py +137 -0
  40. pcapkit/const/ipv4/protection_authority.py +63 -0
  41. pcapkit/const/ipv4/qs_function.py +51 -0
  42. pcapkit/const/ipv4/router_alert.py +251 -0
  43. pcapkit/const/ipv4/tos_del.py +51 -0
  44. pcapkit/const/ipv4/tos_ecn.py +55 -0
  45. pcapkit/const/ipv4/tos_pre.py +63 -0
  46. pcapkit/const/ipv4/tos_rel.py +51 -0
  47. pcapkit/const/ipv4/tos_thr.py +51 -0
  48. pcapkit/const/ipv4/ts_flag.py +53 -0
  49. pcapkit/const/ipv6/__init__.py +53 -0
  50. pcapkit/const/ipv6/extension_header.py +66 -0
  51. pcapkit/const/ipv6/option.py +137 -0
  52. pcapkit/const/ipv6/option_action.py +55 -0
  53. pcapkit/const/ipv6/qs_function.py +51 -0
  54. pcapkit/const/ipv6/router_alert.py +266 -0
  55. pcapkit/const/ipv6/routing.py +80 -0
  56. pcapkit/const/ipv6/seed_id.py +55 -0
  57. pcapkit/const/ipv6/smf_dpd_mode.py +51 -0
  58. pcapkit/const/ipv6/tagger_id.py +62 -0
  59. pcapkit/const/ipx/__init__.py +27 -0
  60. pcapkit/const/ipx/packet.py +72 -0
  61. pcapkit/const/ipx/socket.py +104 -0
  62. pcapkit/const/l2tp/__init__.py +21 -0
  63. pcapkit/const/l2tp/type.py +51 -0
  64. pcapkit/const/mh/__init__.py +204 -0
  65. pcapkit/const/mh/access_type.py +92 -0
  66. pcapkit/const/mh/ack_status_code.py +71 -0
  67. pcapkit/const/mh/ani_suboption.py +74 -0
  68. pcapkit/const/mh/auth_subtype.py +53 -0
  69. pcapkit/const/mh/binding_ack_flag.py +66 -0
  70. pcapkit/const/mh/binding_error.py +51 -0
  71. pcapkit/const/mh/binding_revocation.py +59 -0
  72. pcapkit/const/mh/binding_update_flag.py +81 -0
  73. pcapkit/const/mh/cga_extension.py +66 -0
  74. pcapkit/const/mh/cga_sec.py +57 -0
  75. pcapkit/const/mh/cga_type.py +68 -0
  76. pcapkit/const/mh/dhcp_support_mode.py +53 -0
  77. pcapkit/const/mh/dns_status_code.py +65 -0
  78. pcapkit/const/mh/dsmip6_tls_packet.py +62 -0
  79. pcapkit/const/mh/dsmipv6_home_address.py +74 -0
  80. pcapkit/const/mh/enumerating_algorithm.py +56 -0
  81. pcapkit/const/mh/fb_ack_status.py +62 -0
  82. pcapkit/const/mh/fb_action.py +71 -0
  83. pcapkit/const/mh/fb_indication_trigger.py +65 -0
  84. pcapkit/const/mh/fb_type.py +59 -0
  85. pcapkit/const/mh/flow_id_status.py +77 -0
  86. pcapkit/const/mh/flow_id_suboption.py +71 -0
  87. pcapkit/const/mh/handoff_type.py +71 -0
  88. pcapkit/const/mh/handover_ack_flag.py +54 -0
  89. pcapkit/const/mh/handover_ack_status.py +92 -0
  90. pcapkit/const/mh/handover_initiate_flag.py +57 -0
  91. pcapkit/const/mh/handover_initiate_status.py +62 -0
  92. pcapkit/const/mh/home_address_reply.py +71 -0
  93. pcapkit/const/mh/lla_code.py +63 -0
  94. pcapkit/const/mh/lma_mag_suboption.py +59 -0
  95. pcapkit/const/mh/mn_group_id.py +59 -0
  96. pcapkit/const/mh/mn_id_subtype.py +77 -0
  97. pcapkit/const/mh/operator_id.py +63 -0
  98. pcapkit/const/mh/option.py +260 -0
  99. pcapkit/const/mh/packet.py +119 -0
  100. pcapkit/const/mh/qos_attribute.py +89 -0
  101. pcapkit/const/mh/revocation_status_code.py +83 -0
  102. pcapkit/const/mh/revocation_trigger.py +86 -0
  103. pcapkit/const/mh/status_code.py +232 -0
  104. pcapkit/const/mh/traffic_selector.py +62 -0
  105. pcapkit/const/mh/upa_status.py +71 -0
  106. pcapkit/const/mh/upn_reason.py +80 -0
  107. pcapkit/const/ospf/__init__.py +27 -0
  108. pcapkit/const/ospf/authentication.py +65 -0
  109. pcapkit/const/ospf/packet.py +71 -0
  110. pcapkit/const/pcapng/__init__.py +51 -0
  111. pcapkit/const/pcapng/block_type.py +152 -0
  112. pcapkit/const/pcapng/filter_type.py +48 -0
  113. pcapkit/const/pcapng/hash_algorithm.py +59 -0
  114. pcapkit/const/pcapng/option_type.py +233 -0
  115. pcapkit/const/pcapng/record_type.py +57 -0
  116. pcapkit/const/pcapng/secrets_type.py +56 -0
  117. pcapkit/const/pcapng/verdict_type.py +53 -0
  118. pcapkit/const/reg/__init__.py +34 -0
  119. pcapkit/const/reg/apptype.py +32702 -0
  120. pcapkit/const/reg/ethertype.py +714 -0
  121. pcapkit/const/reg/linktype.py +902 -0
  122. pcapkit/const/reg/transtype.py +523 -0
  123. pcapkit/const/tcp/__init__.py +35 -0
  124. pcapkit/const/tcp/checksum.py +55 -0
  125. pcapkit/const/tcp/flags.py +73 -0
  126. pcapkit/const/tcp/mp_tcp_option.py +80 -0
  127. pcapkit/const/tcp/option.py +198 -0
  128. pcapkit/const/vlan/__init__.py +23 -0
  129. pcapkit/const/vlan/priority_level.py +71 -0
  130. pcapkit/corekit/__init__.py +59 -0
  131. pcapkit/corekit/fields/__init__.py +45 -0
  132. pcapkit/corekit/fields/collections.py +282 -0
  133. pcapkit/corekit/fields/field.py +269 -0
  134. pcapkit/corekit/fields/ipaddress.py +274 -0
  135. pcapkit/corekit/fields/misc.py +722 -0
  136. pcapkit/corekit/fields/numbers.py +375 -0
  137. pcapkit/corekit/fields/strings.py +245 -0
  138. pcapkit/corekit/infoclass.py +394 -0
  139. pcapkit/corekit/io.py +506 -0
  140. pcapkit/corekit/module.py +39 -0
  141. pcapkit/corekit/multidict.py +626 -0
  142. pcapkit/corekit/protochain.py +263 -0
  143. pcapkit/corekit/version.py +33 -0
  144. pcapkit/dumpkit/__init__.py +15 -0
  145. pcapkit/dumpkit/common.py +199 -0
  146. pcapkit/dumpkit/null.py +77 -0
  147. pcapkit/dumpkit/pcap.py +144 -0
  148. pcapkit/foundation/__init__.py +45 -0
  149. pcapkit/foundation/engines/__init__.py +36 -0
  150. pcapkit/foundation/engines/dpkt.py +230 -0
  151. pcapkit/foundation/engines/engine.py +194 -0
  152. pcapkit/foundation/engines/pcap.py +188 -0
  153. pcapkit/foundation/engines/pcapng.py +310 -0
  154. pcapkit/foundation/engines/pyshark.py +166 -0
  155. pcapkit/foundation/engines/scapy.py +161 -0
  156. pcapkit/foundation/extraction.py +915 -0
  157. pcapkit/foundation/reassembly/__init__.py +49 -0
  158. pcapkit/foundation/reassembly/data/__init__.py +48 -0
  159. pcapkit/foundation/reassembly/data/ip.py +117 -0
  160. pcapkit/foundation/reassembly/data/tcp.py +145 -0
  161. pcapkit/foundation/reassembly/ip.py +192 -0
  162. pcapkit/foundation/reassembly/ipv4.py +50 -0
  163. pcapkit/foundation/reassembly/ipv6.py +50 -0
  164. pcapkit/foundation/reassembly/reassembly.py +389 -0
  165. pcapkit/foundation/reassembly/tcp.py +249 -0
  166. pcapkit/foundation/registry/__init__.py +41 -0
  167. pcapkit/foundation/registry/foundation.py +327 -0
  168. pcapkit/foundation/registry/protocols.py +885 -0
  169. pcapkit/foundation/traceflow/__init__.py +44 -0
  170. pcapkit/foundation/traceflow/data/__init__.py +30 -0
  171. pcapkit/foundation/traceflow/data/tcp.py +105 -0
  172. pcapkit/foundation/traceflow/tcp.py +159 -0
  173. pcapkit/foundation/traceflow/traceflow.py +390 -0
  174. pcapkit/interface/__init__.py +22 -0
  175. pcapkit/interface/core.py +185 -0
  176. pcapkit/interface/misc.py +120 -0
  177. pcapkit/protocols/__init__.py +85 -0
  178. pcapkit/protocols/application/NotImplemented/bgp.py +0 -0
  179. pcapkit/protocols/application/NotImplemented/dhcp.py +0 -0
  180. pcapkit/protocols/application/NotImplemented/dhcpv6.py +0 -0
  181. pcapkit/protocols/application/NotImplemented/dns.py +0 -0
  182. pcapkit/protocols/application/NotImplemented/imap.py +0 -0
  183. pcapkit/protocols/application/NotImplemented/ldap.py +0 -0
  184. pcapkit/protocols/application/NotImplemented/mqtt.py +0 -0
  185. pcapkit/protocols/application/NotImplemented/nntp.py +0 -0
  186. pcapkit/protocols/application/NotImplemented/ntp.py +0 -0
  187. pcapkit/protocols/application/NotImplemented/onc_rpc.py +0 -0
  188. pcapkit/protocols/application/NotImplemented/pop.py +0 -0
  189. pcapkit/protocols/application/NotImplemented/rip.py +0 -0
  190. pcapkit/protocols/application/NotImplemented/rtp.py +0 -0
  191. pcapkit/protocols/application/NotImplemented/sip.py +0 -0
  192. pcapkit/protocols/application/NotImplemented/smtp.py +0 -0
  193. pcapkit/protocols/application/NotImplemented/snmp.py +0 -0
  194. pcapkit/protocols/application/NotImplemented/ssh.py +0 -0
  195. pcapkit/protocols/application/NotImplemented/telnet.py +0 -0
  196. pcapkit/protocols/application/NotImplemented/tls.py +0 -0
  197. pcapkit/protocols/application/NotImplemented/xmpp.py +0 -0
  198. pcapkit/protocols/application/__init__.py +34 -0
  199. pcapkit/protocols/application/application.py +114 -0
  200. pcapkit/protocols/application/ftp.py +206 -0
  201. pcapkit/protocols/application/http.py +176 -0
  202. pcapkit/protocols/application/httpv1.py +320 -0
  203. pcapkit/protocols/application/httpv2.py +1255 -0
  204. pcapkit/protocols/data/__init__.py +192 -0
  205. pcapkit/protocols/data/application/__init__.py +57 -0
  206. pcapkit/protocols/data/application/ftp.py +59 -0
  207. pcapkit/protocols/data/application/httpv1.py +79 -0
  208. pcapkit/protocols/data/application/httpv2.py +293 -0
  209. pcapkit/protocols/data/data.py +25 -0
  210. pcapkit/protocols/data/internet/__init__.py +298 -0
  211. pcapkit/protocols/data/internet/ah.py +31 -0
  212. pcapkit/protocols/data/internet/hip.py +804 -0
  213. pcapkit/protocols/data/internet/hopopt.py +351 -0
  214. pcapkit/protocols/data/internet/ipv4.py +369 -0
  215. pcapkit/protocols/data/internet/ipv6.py +67 -0
  216. pcapkit/protocols/data/internet/ipv6_frag.py +29 -0
  217. pcapkit/protocols/data/internet/ipv6_opts.py +368 -0
  218. pcapkit/protocols/data/internet/ipv6_route.py +86 -0
  219. pcapkit/protocols/data/internet/ipx.py +56 -0
  220. pcapkit/protocols/data/internet/mh.py +509 -0
  221. pcapkit/protocols/data/link/__init__.py +33 -0
  222. pcapkit/protocols/data/link/arp.py +74 -0
  223. pcapkit/protocols/data/link/ethernet.py +28 -0
  224. pcapkit/protocols/data/link/l2tp.py +63 -0
  225. pcapkit/protocols/data/link/ospf.py +58 -0
  226. pcapkit/protocols/data/link/vlan.py +42 -0
  227. pcapkit/protocols/data/misc/__init__.py +109 -0
  228. pcapkit/protocols/data/misc/null.py +18 -0
  229. pcapkit/protocols/data/misc/pcap/__init__.py +18 -0
  230. pcapkit/protocols/data/misc/pcap/frame.py +56 -0
  231. pcapkit/protocols/data/misc/pcap/header.py +53 -0
  232. pcapkit/protocols/data/misc/pcapng.py +925 -0
  233. pcapkit/protocols/data/misc/raw.py +25 -0
  234. pcapkit/protocols/data/protocol.py +32 -0
  235. pcapkit/protocols/data/transport/__init__.py +71 -0
  236. pcapkit/protocols/data/transport/tcp.py +555 -0
  237. pcapkit/protocols/data/transport/udp.py +29 -0
  238. pcapkit/protocols/internet/NotImplemented/ecn.py +0 -0
  239. pcapkit/protocols/internet/NotImplemented/esp.py +97 -0
  240. pcapkit/protocols/internet/NotImplemented/icmp.py +0 -0
  241. pcapkit/protocols/internet/NotImplemented/icmpv6.py +0 -0
  242. pcapkit/protocols/internet/NotImplemented/igmp.py +0 -0
  243. pcapkit/protocols/internet/NotImplemented/shim6.py +0 -0
  244. pcapkit/protocols/internet/__init__.py +43 -0
  245. pcapkit/protocols/internet/ah.py +275 -0
  246. pcapkit/protocols/internet/hip.py +4727 -0
  247. pcapkit/protocols/internet/hopopt.py +1879 -0
  248. pcapkit/protocols/internet/internet.py +240 -0
  249. pcapkit/protocols/internet/ip.py +51 -0
  250. pcapkit/protocols/internet/ipsec.py +50 -0
  251. pcapkit/protocols/internet/ipv4.py +1782 -0
  252. pcapkit/protocols/internet/ipv6.py +361 -0
  253. pcapkit/protocols/internet/ipv6_frag.py +258 -0
  254. pcapkit/protocols/internet/ipv6_opts.py +1890 -0
  255. pcapkit/protocols/internet/ipv6_route.py +710 -0
  256. pcapkit/protocols/internet/ipx.py +230 -0
  257. pcapkit/protocols/internet/mh.py +2764 -0
  258. pcapkit/protocols/link/NotImplemented/dsl.py +0 -0
  259. pcapkit/protocols/link/NotImplemented/eapol.py +1 -0
  260. pcapkit/protocols/link/NotImplemented/fddi.py +0 -0
  261. pcapkit/protocols/link/NotImplemented/isdn.py +0 -0
  262. pcapkit/protocols/link/NotImplemented/ndp.py +0 -0
  263. pcapkit/protocols/link/NotImplemented/ppp.py +0 -0
  264. pcapkit/protocols/link/__init__.py +35 -0
  265. pcapkit/protocols/link/arp.py +421 -0
  266. pcapkit/protocols/link/ethernet.py +248 -0
  267. pcapkit/protocols/link/l2tp.py +267 -0
  268. pcapkit/protocols/link/link.py +140 -0
  269. pcapkit/protocols/link/ospf.py +342 -0
  270. pcapkit/protocols/link/rarp.py +82 -0
  271. pcapkit/protocols/link/vlan.py +225 -0
  272. pcapkit/protocols/misc/__init__.py +37 -0
  273. pcapkit/protocols/misc/null.py +129 -0
  274. pcapkit/protocols/misc/pcap/__init__.py +17 -0
  275. pcapkit/protocols/misc/pcap/frame.py +478 -0
  276. pcapkit/protocols/misc/pcap/header.py +358 -0
  277. pcapkit/protocols/misc/pcapng.py +5520 -0
  278. pcapkit/protocols/misc/raw.py +180 -0
  279. pcapkit/protocols/protocol.py +1216 -0
  280. pcapkit/protocols/schema/__init__.py +140 -0
  281. pcapkit/protocols/schema/application/__init__.py +40 -0
  282. pcapkit/protocols/schema/application/ftp.py +21 -0
  283. pcapkit/protocols/schema/application/httpv1.py +21 -0
  284. pcapkit/protocols/schema/application/httpv2.py +384 -0
  285. pcapkit/protocols/schema/internet/__init__.py +294 -0
  286. pcapkit/protocols/schema/internet/ah.py +40 -0
  287. pcapkit/protocols/schema/internet/hip.py +1184 -0
  288. pcapkit/protocols/schema/internet/hopopt.py +679 -0
  289. pcapkit/protocols/schema/internet/ipv4.py +576 -0
  290. pcapkit/protocols/schema/internet/ipv6.py +63 -0
  291. pcapkit/protocols/schema/internet/ipv6_frag.py +48 -0
  292. pcapkit/protocols/schema/internet/ipv6_opts.py +680 -0
  293. pcapkit/protocols/schema/internet/ipv6_route.py +198 -0
  294. pcapkit/protocols/schema/internet/ipx.py +40 -0
  295. pcapkit/protocols/schema/internet/mh.py +718 -0
  296. pcapkit/protocols/schema/link/__init__.py +19 -0
  297. pcapkit/protocols/schema/link/arp.py +39 -0
  298. pcapkit/protocols/schema/link/ethernet.py +51 -0
  299. pcapkit/protocols/schema/link/l2tp.py +88 -0
  300. pcapkit/protocols/schema/link/ospf.py +90 -0
  301. pcapkit/protocols/schema/link/vlan.py +69 -0
  302. pcapkit/protocols/schema/misc/__init__.py +108 -0
  303. pcapkit/protocols/schema/misc/null.py +18 -0
  304. pcapkit/protocols/schema/misc/pcap/__init__.py +10 -0
  305. pcapkit/protocols/schema/misc/pcap/frame.py +51 -0
  306. pcapkit/protocols/schema/misc/pcap/header.py +63 -0
  307. pcapkit/protocols/schema/misc/pcapng.py +1689 -0
  308. pcapkit/protocols/schema/misc/raw.py +24 -0
  309. pcapkit/protocols/schema/schema.py +809 -0
  310. pcapkit/protocols/schema/transport/__init__.py +69 -0
  311. pcapkit/protocols/schema/transport/tcp.py +928 -0
  312. pcapkit/protocols/schema/transport/udp.py +90 -0
  313. pcapkit/protocols/transport/NotImplemented/dccp.py +0 -0
  314. pcapkit/protocols/transport/NotImplemented/rsvp.py +0 -0
  315. pcapkit/protocols/transport/NotImplemented/sctp.py +0 -0
  316. pcapkit/protocols/transport/__init__.py +27 -0
  317. pcapkit/protocols/transport/tcp.py +3025 -0
  318. pcapkit/protocols/transport/transport.py +158 -0
  319. pcapkit/protocols/transport/udp.py +214 -0
  320. pcapkit/py.typed +0 -0
  321. pcapkit/toolkit/__init__.py +57 -0
  322. pcapkit/toolkit/dpkt.py +306 -0
  323. pcapkit/toolkit/pcap.py +212 -0
  324. pcapkit/toolkit/pcapng.py +251 -0
  325. pcapkit/toolkit/pyshark.py +99 -0
  326. pcapkit/toolkit/scapy.py +297 -0
  327. pcapkit/utilities/__init__.py +20 -0
  328. pcapkit/utilities/compat.py +196 -0
  329. pcapkit/utilities/decorators.py +192 -0
  330. pcapkit/utilities/exceptions.py +365 -0
  331. pcapkit/utilities/logging.py +55 -0
  332. pcapkit/utilities/warnings.py +185 -0
  333. pcapkit/vendor/__init__.py +105 -0
  334. pcapkit/vendor/__main__.py +92 -0
  335. pcapkit/vendor/arp/__init__.py +27 -0
  336. pcapkit/vendor/arp/hardware.py +29 -0
  337. pcapkit/vendor/arp/operation.py +29 -0
  338. pcapkit/vendor/default.py +474 -0
  339. pcapkit/vendor/ftp/__init__.py +27 -0
  340. pcapkit/vendor/ftp/command.py +244 -0
  341. pcapkit/vendor/ftp/return_code.py +256 -0
  342. pcapkit/vendor/hip/__init__.py +94 -0
  343. pcapkit/vendor/hip/certificate.py +29 -0
  344. pcapkit/vendor/hip/cipher.py +29 -0
  345. pcapkit/vendor/hip/di.py +29 -0
  346. pcapkit/vendor/hip/ecdsa_curve.py +29 -0
  347. pcapkit/vendor/hip/ecdsa_low_curve.py +29 -0
  348. pcapkit/vendor/hip/eddsa_curve.py +85 -0
  349. pcapkit/vendor/hip/esp_transform_suite.py +29 -0
  350. pcapkit/vendor/hip/group.py +87 -0
  351. pcapkit/vendor/hip/hi_algorithm.py +29 -0
  352. pcapkit/vendor/hip/hit_suite.py +29 -0
  353. pcapkit/vendor/hip/nat_traversal.py +29 -0
  354. pcapkit/vendor/hip/notify_message.py +29 -0
  355. pcapkit/vendor/hip/packet.py +88 -0
  356. pcapkit/vendor/hip/parameter.py +88 -0
  357. pcapkit/vendor/hip/registration.py +29 -0
  358. pcapkit/vendor/hip/registration_failure.py +29 -0
  359. pcapkit/vendor/hip/suite.py +29 -0
  360. pcapkit/vendor/hip/transport.py +29 -0
  361. pcapkit/vendor/http/__init__.py +39 -0
  362. pcapkit/vendor/http/error_code.py +95 -0
  363. pcapkit/vendor/http/frame.py +91 -0
  364. pcapkit/vendor/http/method.py +167 -0
  365. pcapkit/vendor/http/setting.py +93 -0
  366. pcapkit/vendor/http/status_code.py +185 -0
  367. pcapkit/vendor/ipv4/__init__.py +57 -0
  368. pcapkit/vendor/ipv4/classification_level.py +91 -0
  369. pcapkit/vendor/ipv4/option_class.py +80 -0
  370. pcapkit/vendor/ipv4/option_number.py +105 -0
  371. pcapkit/vendor/ipv4/protection_authority.py +84 -0
  372. pcapkit/vendor/ipv4/qs_function.py +78 -0
  373. pcapkit/vendor/ipv4/router_alert.py +93 -0
  374. pcapkit/vendor/ipv4/tos_del.py +78 -0
  375. pcapkit/vendor/ipv4/tos_ecn.py +95 -0
  376. pcapkit/vendor/ipv4/tos_pre.py +84 -0
  377. pcapkit/vendor/ipv4/tos_rel.py +78 -0
  378. pcapkit/vendor/ipv4/tos_thr.py +77 -0
  379. pcapkit/vendor/ipv4/ts_flag.py +79 -0
  380. pcapkit/vendor/ipv6/__init__.py +53 -0
  381. pcapkit/vendor/ipv6/extension_header.py +171 -0
  382. pcapkit/vendor/ipv6/option.py +104 -0
  383. pcapkit/vendor/ipv6/option_action.py +90 -0
  384. pcapkit/vendor/ipv6/qs_function.py +78 -0
  385. pcapkit/vendor/ipv6/router_alert.py +93 -0
  386. pcapkit/vendor/ipv6/routing.py +87 -0
  387. pcapkit/vendor/ipv6/seed_id.py +81 -0
  388. pcapkit/vendor/ipv6/smf_dpd_mode.py +78 -0
  389. pcapkit/vendor/ipv6/tagger_id.py +81 -0
  390. pcapkit/vendor/ipx/__init__.py +37 -0
  391. pcapkit/vendor/ipx/packet.py +123 -0
  392. pcapkit/vendor/ipx/socket.py +125 -0
  393. pcapkit/vendor/l2tp/__init__.py +21 -0
  394. pcapkit/vendor/l2tp/type.py +78 -0
  395. pcapkit/vendor/mh/__init__.py +204 -0
  396. pcapkit/vendor/mh/access_type.py +87 -0
  397. pcapkit/vendor/mh/ack_status_code.py +88 -0
  398. pcapkit/vendor/mh/ani_suboption.py +88 -0
  399. pcapkit/vendor/mh/auth_subtype.py +83 -0
  400. pcapkit/vendor/mh/binding_ack_flag.py +148 -0
  401. pcapkit/vendor/mh/binding_error.py +78 -0
  402. pcapkit/vendor/mh/binding_revocation.py +87 -0
  403. pcapkit/vendor/mh/binding_update_flag.py +147 -0
  404. pcapkit/vendor/mh/cga_extension.py +91 -0
  405. pcapkit/vendor/mh/cga_sec.py +91 -0
  406. pcapkit/vendor/mh/cga_type.py +74 -0
  407. pcapkit/vendor/mh/dhcp_support_mode.py +77 -0
  408. pcapkit/vendor/mh/dns_status_code.py +87 -0
  409. pcapkit/vendor/mh/dsmip6_tls_packet.py +87 -0
  410. pcapkit/vendor/mh/dsmipv6_home_address.py +87 -0
  411. pcapkit/vendor/mh/enumerating_algorithm.py +82 -0
  412. pcapkit/vendor/mh/fb_ack_status.py +87 -0
  413. pcapkit/vendor/mh/fb_action.py +88 -0
  414. pcapkit/vendor/mh/fb_indication_trigger.py +87 -0
  415. pcapkit/vendor/mh/fb_type.py +88 -0
  416. pcapkit/vendor/mh/flow_id_status.py +87 -0
  417. pcapkit/vendor/mh/flow_id_suboption.py +87 -0
  418. pcapkit/vendor/mh/handoff_type.py +87 -0
  419. pcapkit/vendor/mh/handover_ack_flag.py +143 -0
  420. pcapkit/vendor/mh/handover_ack_status.py +87 -0
  421. pcapkit/vendor/mh/handover_initiate_flag.py +143 -0
  422. pcapkit/vendor/mh/handover_initiate_status.py +87 -0
  423. pcapkit/vendor/mh/home_address_reply.py +87 -0
  424. pcapkit/vendor/mh/lla_code.py +97 -0
  425. pcapkit/vendor/mh/lma_mag_suboption.py +88 -0
  426. pcapkit/vendor/mh/mn_group_id.py +87 -0
  427. pcapkit/vendor/mh/mn_id_subtype.py +87 -0
  428. pcapkit/vendor/mh/operator_id.py +87 -0
  429. pcapkit/vendor/mh/option.py +83 -0
  430. pcapkit/vendor/mh/packet.py +82 -0
  431. pcapkit/vendor/mh/qos_attribute.py +87 -0
  432. pcapkit/vendor/mh/revocation_status_code.py +87 -0
  433. pcapkit/vendor/mh/revocation_trigger.py +87 -0
  434. pcapkit/vendor/mh/status_code.py +91 -0
  435. pcapkit/vendor/mh/traffic_selector.py +87 -0
  436. pcapkit/vendor/mh/upa_status.py +87 -0
  437. pcapkit/vendor/mh/upn_reason.py +87 -0
  438. pcapkit/vendor/ospf/__init__.py +27 -0
  439. pcapkit/vendor/ospf/authentication.py +29 -0
  440. pcapkit/vendor/ospf/packet.py +29 -0
  441. pcapkit/vendor/pcapng/__init__.py +51 -0
  442. pcapkit/vendor/pcapng/block_type.py +94 -0
  443. pcapkit/vendor/pcapng/filter_type.py +77 -0
  444. pcapkit/vendor/pcapng/hash_algorithm.py +82 -0
  445. pcapkit/vendor/pcapng/option_type.py +287 -0
  446. pcapkit/vendor/pcapng/record_type.py +81 -0
  447. pcapkit/vendor/pcapng/secrets_type.py +81 -0
  448. pcapkit/vendor/pcapng/verdict_type.py +79 -0
  449. pcapkit/vendor/reg/__init__.py +34 -0
  450. pcapkit/vendor/reg/apptype.py +338 -0
  451. pcapkit/vendor/reg/ethertype.py +121 -0
  452. pcapkit/vendor/reg/linktype.py +110 -0
  453. pcapkit/vendor/reg/transtype.py +111 -0
  454. pcapkit/vendor/tcp/__init__.py +35 -0
  455. pcapkit/vendor/tcp/checksum.py +80 -0
  456. pcapkit/vendor/tcp/flags.py +149 -0
  457. pcapkit/vendor/tcp/mp_tcp_option.py +90 -0
  458. pcapkit/vendor/tcp/option.py +103 -0
  459. pcapkit/vendor/vlan/__init__.py +23 -0
  460. pcapkit/vendor/vlan/priority_level.py +97 -0
  461. pypcapkit-1.3.3.post1.dist-info/LICENSE +29 -0
  462. pypcapkit-1.3.3.post1.dist-info/METADATA +236 -0
  463. pypcapkit-1.3.3.post1.dist-info/RECORD +466 -0
  464. pypcapkit-1.3.3.post1.dist-info/WHEEL +5 -0
  465. pypcapkit-1.3.3.post1.dist-info/entry_points.txt +3 -0
  466. 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)