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,375 @@
1
+ # -*- coding: utf-8 -*-
2
+ """numerical field class"""
3
+
4
+ import enum
5
+ import math
6
+ from typing import TYPE_CHECKING, Generic, TypeVar, Union, cast
7
+
8
+ import aenum
9
+
10
+ from pcapkit.corekit.fields.field import Field, NoValue
11
+ from pcapkit.utilities.exceptions import IntError
12
+
13
+ __all__ = [
14
+ 'NumberField',
15
+ 'Int32Field', 'UInt32Field',
16
+ 'Int16Field', 'UInt16Field',
17
+ 'Int64Field', 'UInt64Field',
18
+ 'Int8Field', 'UInt8Field',
19
+ 'EnumField',
20
+ ]
21
+
22
+ if TYPE_CHECKING:
23
+ from enum import IntEnum as StdlibEnum
24
+ from typing import Any, Callable, Optional, Type
25
+
26
+ from aenum import IntEnum as AenumEnum
27
+ from typing_extensions import Literal, Self
28
+
29
+ from pcapkit.corekit.fields.field import NoValueType
30
+
31
+ _T = TypeVar('_T', bound='int')
32
+
33
+
34
+ class NumberField(Field[int], Generic[_T]):
35
+ """Numerical value for protocol fields.
36
+
37
+ Args:
38
+ length: Field size (in bytes); if a callable is given, it should return
39
+ an integer value and accept the current packet as its only argument.
40
+ default: Field default value, if any.
41
+ signed: Whether the field is signed.
42
+ byteorder: Field byte order.
43
+ bit_length: Field bit length.
44
+ callback: Callback function to be called upon
45
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
46
+
47
+ """
48
+
49
+ __length__ = None # type: Optional[int]
50
+ __template__ = None # type: Optional[str]
51
+ __signed__ = None # type: Optional[bool]
52
+
53
+ @property
54
+ def bit_length(self) -> 'int':
55
+ """Field bit length."""
56
+ return self._bit_length
57
+
58
+ def __init__(self, length: 'Optional[int | Callable[[dict[str, Any]], int]]' = None,
59
+ default: 'int | NoValueType' = NoValue, signed: 'bool' = False,
60
+ byteorder: 'Literal["little", "big"]' = 'big',
61
+ bit_length: 'Optional[int]' = None,
62
+ callback: 'Callable[[Self, dict[str, Any]], None]' = lambda *_: None) -> 'None':
63
+ if length is None:
64
+ if self.__length__ is None:
65
+ raise IntError(f'Field has no length.')
66
+ length = self.__length__
67
+ super().__init__(length, default, callback)
68
+
69
+ if bit_length is not None:
70
+ self._bit_length = bit_length
71
+ self._bit_mask = (1 << bit_length) - 1
72
+ else:
73
+ self._bit_length, self._bit_mask = -1, -1
74
+
75
+ self._signed = signed if self.__signed__ is None else self.__signed__
76
+ self._byteorder = byteorder
77
+ self._need_process = False
78
+
79
+ endian = '>' if byteorder == 'big' else '<'
80
+ if self.__template__ is not None:
81
+ struct_fmt = self.__template__
82
+ else:
83
+ struct_fmt = self.build_template(self._length, signed)
84
+ self._template = f'{endian}{struct_fmt}'
85
+
86
+ def __call__(self, packet: 'dict[str, Any]') -> 'Self':
87
+ """Update field attributes.
88
+
89
+ Args:
90
+ packet: Packet data.
91
+
92
+ Returns:
93
+ New instance of :class:`NumberField`.
94
+
95
+ This method will return a new instance of :class:`NumberField` instead of
96
+ updating the current instance.
97
+
98
+ """
99
+ new_self = super().__call__(packet)
100
+
101
+ if new_self._bit_length < 0:
102
+ new_self._bit_length = new_self._length * 8
103
+ new_self._bit_mask = (1 << new_self._bit_length) - 1
104
+
105
+ endian = '>' if new_self._byteorder == 'big' else '<'
106
+ struct_fmt = new_self.build_template(new_self._length, new_self._signed)
107
+
108
+ new_self._template = f'{endian}{struct_fmt}'
109
+ return new_self
110
+
111
+ def build_template(self, length: 'int', signed: 'bool') -> 'str':
112
+ """Build template for field.
113
+
114
+ Arguments:
115
+ length: Field size (in bytes)
116
+ signed: Whether the field is signed
117
+
118
+ Returns:
119
+ Template for field.
120
+
121
+ """
122
+ if length == 8: # unpack to 8-byte integer (long long)
123
+ struct_fmt = 'q' if signed else 'Q'
124
+ elif length == 4: # unpack to 4-byte integer (int / long)
125
+ struct_fmt = 'i' if signed else 'I'
126
+ elif length == 2: # unpack to 2-byte integer (short)
127
+ struct_fmt = 'h' if signed else 'H'
128
+ elif length == 1: # unpack to 1-byte integer (char)
129
+ struct_fmt = 'b' if signed else 'B'
130
+ else: # do not unpack
131
+ struct_fmt = f'{length}s'
132
+ self._need_process = True
133
+ return struct_fmt
134
+
135
+ def pre_process(self, value: 'int', packet: 'dict[str, Any]') -> 'int | bytes': # pylint: disable=unused-argument
136
+ """Process field value before construction (packing).
137
+
138
+ Arguments:
139
+ value: Field value.
140
+ packet: Packet data.
141
+
142
+ Returns:
143
+ Processed field value.
144
+
145
+ """
146
+ value = value & self._bit_mask
147
+ if not self._need_process:
148
+ return value
149
+
150
+ if self._length < 0:
151
+ self._length = math.ceil(value.bit_length() // 8)
152
+
153
+ endian = '>' if self._byteorder == 'big' else '<'
154
+ struct_fmt = self.build_template(self._length, self._signed)
155
+
156
+ self._template = f'{endian}{struct_fmt}'
157
+
158
+ return value.to_bytes(
159
+ self._length, self._byteorder, signed=self._signed
160
+ )
161
+
162
+ def post_process(self, value: 'int | bytes', packet: 'dict[str, Any]') -> 'int': # pylint: disable=unused-argument
163
+ """Process field value after parsing (unpacked).
164
+
165
+ Args:
166
+ value: Field value.
167
+ packet: Packet data.
168
+
169
+ Returns:
170
+ Processed field value.
171
+
172
+ """
173
+ if not self._need_process:
174
+ return cast('int', value) & self._bit_mask
175
+ return int.from_bytes(
176
+ cast('bytes', value), self._byteorder, signed=self._signed
177
+ ) & self._bit_mask
178
+
179
+
180
+ class Int32Field(NumberField):
181
+ """Integer value for protocol fields.
182
+
183
+ Args:
184
+ length: Field size (in bytes).
185
+ default: Field default value, if any.
186
+ signed: Whether the field is signed.
187
+ byteorder: Field byte order.
188
+ bit_length: Field bit length.
189
+ callback: Callback function to be called upon
190
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
191
+
192
+ """
193
+
194
+ __length__ = 4
195
+ __template__ = 'i'
196
+ __signed__ = True
197
+
198
+
199
+ class UInt32Field(NumberField):
200
+ """Unsigned integer value for protocol fields.
201
+
202
+ Args:
203
+ length: Field size (in bytes).
204
+ default: Field default value, if any.
205
+ signed: Whether the field is signed.
206
+ byteorder: Field byte order.
207
+ bit_length: Field bit length.
208
+ callback: Callback function to be called upon
209
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
210
+
211
+ """
212
+
213
+ __length__ = 4
214
+ __template__ = 'I'
215
+ __signed__ = False
216
+
217
+
218
+ class Int16Field(NumberField):
219
+ """Short integer value for protocol fields.
220
+
221
+ Args:
222
+ length: Field size (in bytes).
223
+ default: Field default value, if any.
224
+ signed: Whether the field is signed.
225
+ byteorder: Field byte order.
226
+ bit_length: Field bit length.
227
+ callback: Callback function to be called upon
228
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
229
+
230
+ """
231
+
232
+ __length__ = 2
233
+ __template__ = 'h'
234
+ __signed__ = True
235
+
236
+
237
+ class UInt16Field(NumberField):
238
+ """Unsigned short integer value for protocol fields.
239
+
240
+ Args:
241
+ length: Field size (in bytes).
242
+ default: Field default value, if any.
243
+ signed: Whether the field is signed.
244
+ byteorder: Field byte order.
245
+ bit_length: Field bit length.
246
+ callback: Callback function to be called upon
247
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
248
+
249
+ """
250
+
251
+ __length__ = 2
252
+ __template__ = 'H'
253
+ __signed__ = False
254
+
255
+
256
+ class Int64Field(NumberField):
257
+ """Long integer value for protocol fields.
258
+
259
+ Args:
260
+ length: Field size (in bytes).
261
+ default: Field default value, if any.
262
+ signed: Whether the field is signed.
263
+ byteorder: Field byte order.
264
+ bit_length: Field bit length.
265
+ callback: Callback function to be called upon
266
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
267
+
268
+ """
269
+
270
+ __length__ = 8
271
+ __template__ = 'q'
272
+ __signed__ = True
273
+
274
+
275
+ class UInt64Field(NumberField):
276
+ """Unsigned long integer value for protocol fields.
277
+
278
+ Args:
279
+ length: Field size (in bytes).
280
+ default: Field default value, if any.
281
+ signed: Whether the field is signed.
282
+ byteorder: Field byte order.
283
+ bit_length: Field bit length.
284
+ callback: Callback function to be called upon
285
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
286
+
287
+ """
288
+
289
+ __length__ = 8
290
+ __template__ = 'Q'
291
+ __signed__ = False
292
+
293
+
294
+ class Int8Field(NumberField):
295
+ """Byte value for protocol fields.
296
+
297
+ Args:
298
+ length: Field size (in bytes).
299
+ default: Field default value, if any.
300
+ signed: Whether the field is signed.
301
+ byteorder: Field byte order.
302
+ bit_length: Field bit length.
303
+ callback: Callback function to be called upon
304
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
305
+
306
+ """
307
+
308
+ __length__ = 1
309
+ __template__ = 'b'
310
+ __signed__ = True
311
+
312
+
313
+ class UInt8Field(NumberField):
314
+ """Unsigned byte value for protocol fields.
315
+
316
+ Args:
317
+ length: Field size (in bytes).
318
+ default: Field default value, if any.
319
+ signed: Whether the field is signed.
320
+ byteorder: Field byte order.
321
+ bit_length: Field bit length.
322
+ callback: Callback function to be called upon
323
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
324
+
325
+ """
326
+
327
+ __length__ = 1
328
+ __template__ = 'B'
329
+ __signed__ = False
330
+
331
+
332
+ class EnumField(NumberField[Union[enum.IntEnum, aenum.IntEnum]]):
333
+ """Enumerated value for protocol fields.
334
+
335
+ Args:
336
+ length: Field size (in bytes); if a callable is given, it should return
337
+ an integer value and accept the current packet as its only argument.
338
+ default: Field default value, if any.
339
+ signed: Whether the field is signed.
340
+ byteorder: Field byte order.
341
+ bit_length: Field bit length.
342
+ namespace: Field namespace (a :class:`enum.IntEnum` class).
343
+ callback: Callback function to be called upon
344
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
345
+
346
+ """
347
+
348
+ def __init__(self, length: 'int | Callable[[dict[str, Any]], int]',
349
+ default: 'StdlibEnum | AenumEnum | NoValueType' = NoValue, signed: 'bool' = False,
350
+ byteorder: 'Literal["little", "big"]' = 'big',
351
+ bit_length: 'Optional[int]' = None,
352
+ namespace: 'Optional[Type[StdlibEnum] | Type[AenumEnum]]' = None,
353
+ callback: 'Callable[[Self, dict[str, Any]], None]' = lambda *_: None) -> 'None':
354
+ super().__init__(length, default, signed, byteorder, bit_length, callback)
355
+
356
+ self._namespace = namespace
357
+
358
+ def post_process(self, value: 'int | bytes', packet: 'dict[str, Any]') -> 'StdlibEnum | AenumEnum':
359
+ """Process field value after parsing (unpacked).
360
+
361
+ Args:
362
+ value: Field value.
363
+ packet: Packet data.
364
+
365
+ Returns:
366
+ Processed field value.
367
+
368
+ """
369
+ value = super().post_process(value, packet)
370
+ if self._namespace is None:
371
+ unknown = enum.IntEnum('<unknown>', {
372
+ '<unassigned>': value,
373
+ }, module='pcapkit.const', qualname='pcapkit.const.<unknown>')
374
+ return getattr(unknown, '<unassigned>')
375
+ return self._namespace(value)
@@ -0,0 +1,245 @@
1
+ # -*- coding: utf-8 -*-
2
+ """text field class"""
3
+
4
+ import urllib.parse as urllib_parse
5
+ from typing import TYPE_CHECKING, Any, Generic, TypeVar
6
+
7
+ import chardet
8
+
9
+ from pcapkit.corekit.fields.field import Field, NoValue
10
+ from pcapkit.utilities.compat import Dict
11
+
12
+ __all__ = [
13
+ '_TextField',
14
+ 'StringField',
15
+ 'BitField',
16
+ 'PaddingField',
17
+ ]
18
+
19
+ if TYPE_CHECKING:
20
+ from typing import Callable, Optional, Tuple
21
+
22
+ from typing_extensions import Literal, Self
23
+
24
+ from pcapkit.corekit.fields.field import NoValueType
25
+
26
+ NamespaceEntry = Tuple[int, int]
27
+
28
+ _T = TypeVar('_T', 'str', 'bytes', 'dict[str, Any]')
29
+
30
+
31
+ class _TextField(Field[_T], Generic[_T]):
32
+ """Internal text value for protocol fields.
33
+
34
+ Args:
35
+ length: Field size (in bytes); if a callable is given, it should return
36
+ an integer value and accept the current packet as its only argument.
37
+ default: Field default value, if any.
38
+ callback: Callback function to be called upon
39
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
40
+
41
+ """
42
+
43
+ def __init__(self, length: 'int | Callable[[dict[str, Any]], int]',
44
+ default: '_T | NoValueType' = NoValue,
45
+ callback: 'Callable[[Self, dict[str, Any]], None]' = lambda *_: None) -> 'None':
46
+ super().__init__(length, default, callback) # type: ignore[arg-type]
47
+
48
+ self._template = f'{self._length}s' if self._length >= 0 else '1024s' # reasonable default
49
+
50
+ def __call__(self, packet: 'dict[str, Any]') -> 'Self':
51
+ """Update field attributes.
52
+
53
+ Args:
54
+ packet: Packet data.
55
+
56
+ Returns:
57
+ New instance of :class:`_TextField`.
58
+
59
+ This method will return a new instance of :class:`_TextField` instead of
60
+ updating the current instance.
61
+
62
+ """
63
+ new_self = super().__call__(packet)
64
+ new_self._template = f'{new_self._length}s'
65
+ return new_self
66
+
67
+
68
+ class BytesField(_TextField[bytes]):
69
+ """Bytes value for protocol fields.
70
+
71
+ Args:
72
+ length: Field size (in bytes); if a callable is given, it should return
73
+ an integer value and accept the current packet as its only argument.
74
+ default: Field default value, if any.
75
+ callback: Callback function to be called upon
76
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
77
+
78
+ """
79
+
80
+ def pre_process(self, value: 'bytes', packet: 'dict[str, Any]') -> 'bytes': # pylint: disable=unused-argument
81
+ """Process field value before construction (packing).
82
+
83
+ Arguments:
84
+ value: Field value.
85
+ packet: Packet data.
86
+
87
+ Returns:
88
+ Processed field value.
89
+
90
+ """
91
+ if self._length < 0:
92
+ self._length = len(value)
93
+ self._template = f'{self._length}s'
94
+ return value
95
+
96
+
97
+ class StringField(_TextField[str]):
98
+ r"""String value for protocol fields.
99
+
100
+ Args:
101
+ length: Field size (in bytes); if a callable is given, it should return
102
+ an integer value and accept the current packet as its only argument.
103
+ default: Field default value, if any.
104
+ encoding: The encoding with which to decode the :obj:`bytes`.
105
+ If not provided, :mod:`pcapkit` will first try detecting its encoding
106
+ using |chardet|_. The fallback encoding would is **UTF-8**.
107
+ errors: The error handling scheme to use for the handling of decoding errors.
108
+ The default is ``'strict'`` meaning that decoding errors raise a
109
+ :exc:`UnicodeDecodeError`. Other possible values are ``'ignore'`` and ``'replace'``
110
+ as well as any other name registered with :func:`codecs.register_error` that
111
+ can handle :exc:`UnicodeDecodeError`.
112
+ unquote: Whether to unquote the decoded string as a URL. Should decoding failed ,
113
+ the method will try again replacing ``'%'`` with ``'\x'`` then decoding the
114
+ ``url`` as ``'utf-8'`` with ``'replace'`` for error handling.
115
+ callback: Callback function to be called upon
116
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
117
+
118
+ .. |chardet| replace:: ``chardet``
119
+ .. _chardet: https://chardet.readthedocs.io
120
+
121
+ """
122
+
123
+ def __init__(self, length: 'int | Callable[[dict[str, Any]], int]',
124
+ default: 'str | NoValueType' = NoValue, encoding: 'Optional[str]' = None,
125
+ errors: 'Literal["strict", "ignore", "replace"]' = 'strict',
126
+ unquote: 'bool' = False,
127
+ callback: 'Callable[[Self, dict[str, Any]], None]' = lambda *_: None) -> 'None':
128
+ super().__init__(length, default, callback)
129
+
130
+ self._encoding = encoding
131
+ self._errors = errors
132
+ self._unquote = unquote
133
+
134
+ def pre_process(self, value: 'str', packet: 'dict[str, Any]') -> 'bytes': # pylint: disable=unused-argument
135
+ """Process field value before construction (packing).
136
+
137
+ Arguments:
138
+ value: Field value.
139
+ packet: Packet data.
140
+
141
+ Returns:
142
+ Processed field value.
143
+
144
+ """
145
+ if self._unquote:
146
+ value = urllib_parse.quote(value, encoding=self._encoding or 'utf-8', errors=self._errors)
147
+
148
+ if self._length < 0:
149
+ self._length = len(value)
150
+ self._template = f'{self._length}s'
151
+ return value.encode(self._encoding or 'utf-8', self._errors)
152
+
153
+ def post_process(self, value: 'bytes', packet: 'dict[str, Any]') -> 'str': # pylint: disable=unused-argument
154
+ """Process field value after parsing (unpacked).
155
+
156
+ Arguments:
157
+ value: Field value.
158
+ packet: Packet data.
159
+
160
+ Returns:
161
+ Processed field value.
162
+
163
+ """
164
+ if self._unquote:
165
+ try:
166
+ ret = urllib_parse.unquote(value, encoding=self._encoding or 'utf-8', errors=self._errors)
167
+ except UnicodeError:
168
+ ret = urllib_parse.unquote(value.replace(b'%', rb'\x'), encoding='utf-8', errors='replace')
169
+ else:
170
+ charset = self._encoding or chardet.detect(value)['encoding'] or 'utf-8'
171
+ try:
172
+ ret = value.decode(charset, self._errors)
173
+ except UnicodeError:
174
+ ret = value.decode(charset, 'replace')
175
+ return ret
176
+
177
+
178
+ class BitField(_TextField[Dict[str, Any]]):
179
+ """Bit value for protocol fields.
180
+
181
+ Args:
182
+ length: Field size (in bytes).
183
+ default: Field default value, if any.
184
+ namespace: Field namespace (a dict mapping field name to a tuple of start index,
185
+ and length of the subfield).
186
+ callback: Callback function to be called upon
187
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
188
+
189
+ """
190
+
191
+ def __init__(self, length: 'int',
192
+ default: 'dict[str, Any] | NoValueType' = NoValue,
193
+ namespace: 'Optional[dict[str, NamespaceEntry]]' = None,
194
+ callback: 'Callable[[Self, dict[str, Any]], None]' = lambda *_: None) -> 'None':
195
+ super().__init__(length, default, callback)
196
+
197
+ self._namespace = namespace or {}
198
+
199
+ def pre_process(self, value: 'dict[str, Any]', packet: 'dict[str, Any]') -> 'bytes': # pylint: disable=unused-argument
200
+ """Process field value before construction (packing).
201
+
202
+ Arguments:
203
+ value: Field value.
204
+ packet: Packet data.
205
+
206
+ Returns:
207
+ Processed field value.
208
+
209
+ """
210
+ buffer = bytearray(self.length * 8)
211
+ for name, (start, len) in self._namespace.items():
212
+ end = start + len
213
+ buffer[start:end] = f'{value[name]:0{end - start}b}'.encode()
214
+ return int(b''.join(map(lambda x: b'1' if x else b'0', buffer)), 2).to_bytes(self.length, 'big')
215
+
216
+ def post_process(self, value: 'bytes', packet: 'dict[str, Any]') -> 'dict[str, Any]': # pylint: disable=unused-argument
217
+ """Process field value after parsing (unpacked).
218
+
219
+ Arguments:
220
+ value: Field value.
221
+ packet: Packet data.
222
+
223
+ Returns:
224
+ Processed field value.
225
+
226
+ """
227
+ buffer = {}
228
+ binary = ''.join(f'{byte:08b}' for byte in value)
229
+ for name, (start, len) in self._namespace.items():
230
+ end = start + len
231
+ buffer[name] = int(binary[start:end], 2)
232
+ return buffer
233
+
234
+
235
+ class PaddingField(BytesField):
236
+ """Bytes value for protocol fields.
237
+
238
+ Args:
239
+ length: Field size (in bytes); if a callable is given, it should return
240
+ an integer value and accept the current packet as its only argument.
241
+ default: Field default value, if any.
242
+ callback: Callback function to be called upon
243
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
244
+
245
+ """