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,390 @@
1
+ # -*- coding: utf-8 -*-
2
+ # mypy: disable-error-code=dict-item
3
+ """Base Class
4
+ ================
5
+
6
+ .. module:: pcapkit.foundation.traceflow.traceflow
7
+
8
+ :mod:`pcapkit.foundation.traceflow.traceflow` contains
9
+ :class:`~pcapkit.foundation.traceflow.traceflow.TraceFlow` only,
10
+ which is an abstract base class for all flow tracing classes.
11
+
12
+ """
13
+ import abc
14
+ import collections
15
+ import os
16
+ import sys
17
+ from typing import TYPE_CHECKING, Generic, TypeVar, cast, overload
18
+
19
+ from dictdumper.dumper import Dumper
20
+
21
+ from pcapkit.corekit.module import ModuleDescriptor
22
+ from pcapkit.dumpkit.common import make_dumper
23
+ from pcapkit.protocols import __proto__ as protocol_registry
24
+ from pcapkit.protocols.misc.raw import Raw
25
+ from pcapkit.utilities.exceptions import FileExists, RegistryError, stacklevel
26
+ from pcapkit.utilities.warnings import FileWarning, FormatWarning, RegistryWarning, warn
27
+
28
+ __all__ = ['TraceFlow']
29
+
30
+ if TYPE_CHECKING:
31
+ from typing import Any, Callable, DefaultDict, Optional, Type
32
+
33
+ from typing_extensions import Literal, Self
34
+
35
+ from pcapkit.corekit.infoclass import Info
36
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
37
+
38
+ CallbackFn = Callable[['_IT'], None]
39
+
40
+ _DT = TypeVar('_DT')
41
+ _BT = TypeVar('_BT', bound='Info')
42
+ _IT = TypeVar('_IT', bound='Info')
43
+ _PT = TypeVar('_PT', bound='Info')
44
+
45
+
46
+ class TraceFlowMeta(abc.ABCMeta):
47
+ """Meta class to add dynamic support to :class:`TraceFlow`.
48
+
49
+ This meta class is used to generate necessary attributes for the
50
+ :class:`TraceFlow` class. It can be useful to reduce unnecessary
51
+ registry calls and simplify the customisation process.
52
+
53
+ """
54
+ if TYPE_CHECKING:
55
+ #: Protocol name of current object.
56
+ __protocol_name__: 'str'
57
+ #: Protocol of current object.
58
+ __protocol_type__: 'Type[Protocol]'
59
+
60
+ @property
61
+ def name(cls) -> 'str':
62
+ """Protocol name of current object."""
63
+ if hasattr(cls, '__protocol_name__'):
64
+ return cls.__protocol_name__
65
+ return cls.__name__
66
+
67
+ @property
68
+ def protocol(cls) -> 'Type[Protocol]':
69
+ """Protocol of current object."""
70
+ if hasattr(cls, '__protocol_type__'):
71
+ return cls.__protocol_type__
72
+ return protocol_registry.get(cls.name.upper(), Raw)
73
+
74
+
75
+ class TraceFlowBase(Generic[_DT, _BT, _IT, _PT], metaclass=TraceFlowMeta):
76
+ """Base flow tracing class.
77
+
78
+ Arguments:
79
+ fout: output path
80
+ format: output format
81
+ byteorder: output file byte order
82
+ nanosecond: output nanosecond-resolution file flag
83
+
84
+ Note:
85
+ This class is for internal use only. For customisation, please use
86
+ :class:`TraceFlow` instead.
87
+
88
+ """
89
+ if TYPE_CHECKING:
90
+ #: Protocol name of current reassembly object.
91
+ __protocol_name__: 'str'
92
+ #: Protocol of current reassembly object.
93
+ __protocol_type__: 'Type[Protocol]'
94
+
95
+ #: List of callback functions upon reassembled datagram.
96
+ __callback_fn__: 'list[CallbackFn]'
97
+
98
+ # Internal data storage for cached properties.
99
+ __cached__: 'dict[str, Any]'
100
+
101
+ ##########################################################################
102
+ # Defaults.
103
+ ##########################################################################
104
+
105
+ #: DefaultDict[str, tuple[ModuleDescriptor[Dumper] | Type[Dumper], str | None]]:
106
+ #: Format dumper mapping for writing output files. The values should be a
107
+ #: tuple representing the module name and class name, or a
108
+ #: :class:`dictdumper.dumper.Dumper` subclass, and corresponding file extension.
109
+ __output__ = collections.defaultdict(
110
+ lambda: (ModuleDescriptor('pcapkit.dumpkit', 'NotImplementedIO'), None),
111
+ {
112
+ 'pcap': (ModuleDescriptor('pcapkit.dumpkit', 'PCAPIO'), '.pcap'),
113
+ 'cap': (ModuleDescriptor('pcapkit.dumpkit', 'PCAPIO'), '.pcap'),
114
+ 'plist': (ModuleDescriptor('dictdumper', 'PLIST'), '.plist'),
115
+ 'xml': (ModuleDescriptor('dictdumper', 'PLIST'), '.plist'),
116
+ 'json': (ModuleDescriptor('dictdumper', 'JSON'), '.json'),
117
+ 'tree': (ModuleDescriptor('dictdumper', 'Tree'), '.txt'),
118
+ 'text': (ModuleDescriptor('dictdumper', 'Text'), '.txt'),
119
+ 'txt': (ModuleDescriptor('dictdumper', 'Tree'), '.txt'),
120
+ },
121
+ ) # type: DefaultDict[str, tuple[ModuleDescriptor[Dumper] | Type[Dumper], str | None]]
122
+
123
+ ##########################################################################
124
+ # Properties.
125
+ ##########################################################################
126
+
127
+ @property
128
+ def name(self) -> 'str':
129
+ """Protocol name of current flow tracing object.
130
+
131
+ Note:
132
+ This property is not available as a class
133
+ attribute.
134
+
135
+ """
136
+ if hasattr(self, '__protocol_name__'):
137
+ return self.__protocol_name__
138
+ return type(self).name # type: ignore[return-value]
139
+
140
+ @property
141
+ def protocol(self) -> 'Type[Protocol]':
142
+ """Protocol of current flow tracing object.
143
+
144
+ Note:
145
+ This property is not available as a class
146
+ attribute.
147
+
148
+ """
149
+ if hasattr(self, '__protocol_type__'):
150
+ return self.__protocol_type__
151
+ return type(self).protocol # type: ignore[return-value]
152
+
153
+ @property
154
+ def index(self) -> 'tuple[_IT, ...]':
155
+ """_IT table for traced flow."""
156
+ if self._buffer:
157
+ return self.submit()
158
+ return tuple(self._stream)
159
+
160
+ ##########################################################################
161
+ # Methods.
162
+ ##########################################################################
163
+
164
+ @classmethod
165
+ def register_dumper(cls, format: 'str', dumper: 'ModuleDescriptor[Dumper] | Type[Dumper]', ext: 'str') -> 'None':
166
+ r"""Register a new dumper class.
167
+
168
+ Notes:
169
+ The full qualified class name of the new dumper class
170
+ should be as ``{dumper.module}.{dumper.name}``.
171
+
172
+ Arguments:
173
+ format: format name
174
+ dumper: module descriptor or a :class:`dictdumper.dumper.Dumper` subclass
175
+ ext: file extension
176
+
177
+ """
178
+ if isinstance(dumper, ModuleDescriptor):
179
+ dumper = dumper.klass
180
+ if not issubclass(dumper, Dumper):
181
+ raise RegistryError(f'dumper must be a Dumper subclass, not {dumper!r}')
182
+ if format in cls.__output__:
183
+ warn(f'dumper {format} already registered, overwriting', RegistryWarning)
184
+ cls.__output__[format] = (dumper, ext)
185
+
186
+ @classmethod
187
+ def register_callback(cls, callback: 'CallbackFn', *, index: 'Optional[int]' = None) -> 'None':
188
+ """Register callback function.
189
+
190
+ Arguments:
191
+ callback: callback function, which will be called
192
+ when reassembled datagram is obtained, with the
193
+ list of reassembled datagrams as its only argument
194
+ index: index of datagram to be called
195
+
196
+ """
197
+ if index is not None:
198
+ cls.__callback_fn__.insert(index, callback)
199
+ else:
200
+ cls.__callback_fn__.append(callback)
201
+
202
+ @classmethod
203
+ def make_fout(cls, fout: 'str' = './tmp', fmt: 'str' = 'pcap') -> 'tuple[Type[Dumper], str | None]':
204
+ """Make root path for output.
205
+
206
+ Args:
207
+ fout: root path for output
208
+ fmt: output format
209
+
210
+ Returns:
211
+ Dumper of specified format and file extension of output file.
212
+
213
+ Warns:
214
+ FormatWarning: If ``fmt`` is not supported.
215
+ FileWarning: If ``fout`` exists and ``fmt`` is :data:`None`.
216
+
217
+ Raises:
218
+ FileExists: If ``fout`` exists and ``fmt`` is **NOT** :data:`None`.
219
+
220
+ """
221
+ output, ext = cls.__output__[fmt]
222
+ if ext is None:
223
+ warn(f'Unsupported output format: {fmt}; disabled file output feature',
224
+ FormatWarning, stacklevel=stacklevel())
225
+ if isinstance(output, ModuleDescriptor):
226
+ output = output.klass
227
+
228
+ try:
229
+ os.makedirs(fout, exist_ok=True)
230
+ except FileExistsError as error:
231
+ if ext is None:
232
+ warn(error.strerror, FileWarning, stacklevel=stacklevel())
233
+ else:
234
+ raise FileExists(*error.args).with_traceback(error.__traceback__)
235
+ return make_dumper(output), ext
236
+
237
+ @abc.abstractmethod
238
+ def dump(self, packet: '_PT') -> 'None':
239
+ """Dump frame to output files.
240
+
241
+ Arguments:
242
+ packet: a flow packet (:term:`trace.tcp.packet`)
243
+
244
+ """
245
+
246
+ @overload
247
+ def trace(self, packet: '_PT', *, output: 'Literal[True]' = ...) -> 'Dumper': ...
248
+ @overload
249
+ def trace(self, packet: '_PT', *, output: 'Literal[False]' = ...) -> 'str': ...
250
+
251
+ @abc.abstractmethod
252
+ def trace(self, packet: '_PT', *, output: 'bool' = False) -> 'Dumper | str':
253
+ """Trace packets.
254
+
255
+ Arguments:
256
+ packet: a flow packet (:term:`trace.tcp.packet`)
257
+ output: flag if has formatted dumper
258
+
259
+ Returns:
260
+ If ``output`` is :data:`True`, returns the initiated
261
+ :class:`~dictdumper.dumper.Dumper` object, which will dump data to
262
+ the output file named after the flow label; otherwise, returns the
263
+ flow label itself.
264
+
265
+ """
266
+
267
+ @abc.abstractmethod
268
+ def submit(self) -> 'tuple[_IT, ...]':
269
+ """Submit traced TCP flows.
270
+
271
+ Returns:
272
+ Traced TCP flow (:term:`trace.tcp.index`).
273
+
274
+ """
275
+
276
+ ##########################################################################
277
+ # Data models.
278
+ ##########################################################################
279
+
280
+ def __new__(cls, *args: 'Any', **kwargs: 'Any') -> 'Self': # pylint: disable=unused-argument
281
+ self = super().__new__(cls)
282
+
283
+ # NOTE: Assign this attribute after ``__new__`` to avoid shared memory
284
+ # reference between instances.
285
+ self.__cached__ = {}
286
+
287
+ return self
288
+
289
+ def __init__(self, fout: 'Optional[str]', format: 'Optional[str]', # pylint: disable=redefined-builtin
290
+ byteorder: 'Literal["little", "big"]' = sys.byteorder,
291
+ nanosecond: bool = False) -> 'None':
292
+ """Initialise instance.
293
+
294
+ Arguments:
295
+ fout: output path
296
+ format: output format
297
+ byteorder: output file byte order
298
+ nanosecond: output nanosecond-resolution file flag
299
+
300
+ """
301
+ if fout is None:
302
+ fout = './tmp'
303
+ if format is None:
304
+ format = 'pcap'
305
+
306
+ #: str: Output root path.
307
+ self._fproot = fout
308
+
309
+ #: dict[_DT, _BT]: Buffer field (:term:`trace.tcp.buffer`).
310
+ self._buffer = {} # type: dict[_DT, _BT]
311
+ #: list[_IT]: Stream index (:term:`trace.tcp.index`).
312
+ self._stream = [] # type: list[_IT]
313
+
314
+ #: Literal['little', 'big']: Output file byte order.
315
+ self._endian = byteorder
316
+ #: bool: Output nanosecond-resolution file flag.
317
+ self._nnsecd = nanosecond
318
+
319
+ # dump I/O object
320
+ fio, ext = self.make_fout(fout, format)
321
+ #: Type[Dumper]: Dumper class.
322
+ self._foutio = fio
323
+ #: Optional[str]: Output file extension.
324
+ self._fdpext = ext
325
+
326
+ def __call__(self, packet: '_PT') -> 'None':
327
+ """Dump frame to output files.
328
+
329
+ Arguments:
330
+ packet: a flow packet (:term:`trace.tcp.packet`)
331
+
332
+ """
333
+ # trace frame record
334
+ self.dump(packet)
335
+
336
+ def __init_subclass__(cls) -> 'None':
337
+ """Initialise subclass.
338
+
339
+ This method is to be used for generating necessary attributes
340
+ for the :class:`TraceFlow` class. It can be useful to reduce
341
+ unnecessary registry calls and simplify the customisation process.
342
+
343
+ """
344
+ cls.__callback_fn__ = []
345
+
346
+
347
+ class TraceFlow(TraceFlowBase[_DT, _BT, _IT, _PT], Generic[_DT, _BT, _IT, _PT]):
348
+ """Base flow tracing class.
349
+
350
+ Example:
351
+
352
+ Use keyword argument ``protocol`` to specify the protocol
353
+ name at class definition:
354
+
355
+ .. code-block:: python
356
+
357
+ class MyProtocol(TraceFlow, protocol='my_protocol'):
358
+ ...
359
+
360
+ Arguments:
361
+ fout: output path
362
+ format: output format
363
+ byteorder: output file byte order
364
+ nanosecond: output nanosecond-resolution file flag
365
+
366
+ """
367
+
368
+ def __init_subclass__(cls, /, protocol: 'Optional[str]' = None, *args: 'Any', **kwargs: 'Any') -> 'None':
369
+ """Initialise subclass.
370
+
371
+ This method is to be used for registering the engine class to
372
+ :class:`~pcapkit.foundation.extraction.Extractor` class.
373
+
374
+ Args:
375
+ name: Protocol name, default to class name.
376
+ *args: Arbitrary positional arguments.
377
+ **kwargs: Arbitrary keyword arguments.
378
+
379
+ See Also:
380
+ For more details, please refer to
381
+ :meth:`pcapkit.foundation.extraction.Extractor.register_traceflow`.
382
+
383
+ """
384
+ if protocol is None:
385
+ protocol = cast('str', cls.name)
386
+
387
+ from pcapkit.foundation.extraction import Extractor
388
+ Extractor.register_traceflow(protocol.lower(), cls)
389
+
390
+ return super().__init_subclass__()
@@ -0,0 +1,22 @@
1
+ # -*- coding: utf-8 -*-
2
+ # pylint: disable=unused-import
3
+ """User Interface
4
+ ====================
5
+
6
+ .. module:: pcapkit.interface
7
+
8
+ :mod:`pcapkit.interface` defines several user-oriented
9
+ interfaces, variables, and etc. These interfaces are
10
+ designed to help and simplify the usage of :mod:`pcapkit`.
11
+
12
+ """
13
+
14
+ from pcapkit.interface.core import (APP, DPKT, INET, JSON, LINK, PCAP, PLIST, RAW, TRANS, TREE,
15
+ PCAPKit, PyShark, Scapy, extract, reassemble, trace)
16
+
17
+ __all__ = [
18
+ 'extract', 'reassemble', 'trace', # interface functions
19
+ 'TREE', 'JSON', 'PLIST', 'PCAP', # format macros
20
+ 'LINK', 'INET', 'TRANS', 'APP', 'RAW', # layer macros
21
+ 'DPKT', 'Scapy', 'PyShark', 'PCAPKit', # engine macros
22
+ ]
@@ -0,0 +1,185 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Core Interface
3
+ ====================
4
+
5
+ .. module:: pcapkit.interface.core
6
+
7
+ :mod:`pcapkit.interface.core` defines core user-oriented
8
+ interfaces, variables, and etc., which wraps around the
9
+ foundation classes from :mod:`pcapkit.foundation`.
10
+
11
+ """
12
+ import io
13
+ import sys
14
+ from typing import TYPE_CHECKING
15
+
16
+ from pcapkit.foundation.extraction import Extractor
17
+ from pcapkit.foundation.reassembly.ipv4 import IPv4 as IPv4_Reassembly
18
+ from pcapkit.foundation.reassembly.ipv6 import IPv6 as IPv6_Reassembly
19
+ from pcapkit.foundation.reassembly.tcp import TCP as TCP_Reassembly
20
+ from pcapkit.foundation.traceflow.tcp import TCP as TCP_TraceFlow
21
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
22
+ from pcapkit.utilities.exceptions import FormatError
23
+
24
+ if TYPE_CHECKING:
25
+ from typing import IO, Optional, Type
26
+
27
+ from typing_extensions import Literal
28
+
29
+ from pcapkit.foundation.extraction import Engines, Formats, Layers, Protocols, VerboseHandler
30
+ from pcapkit.foundation.reassembly.reassembly import ReassemblyBase as Reassembly
31
+ from pcapkit.foundation.traceflow.traceflow import TraceFlowBase as TraceFlow
32
+
33
+ __all__ = [
34
+ 'extract', 'reassemble', 'trace', # interface functions
35
+ 'TREE', 'JSON', 'PLIST', 'PCAP', # format macros
36
+ 'LINK', 'INET', 'TRANS', 'APP', 'RAW', # layer macros
37
+ 'DPKT', 'Scapy', 'PyShark', 'PCAPKit', # engine macros
38
+ ]
39
+
40
+ # output file formats
41
+ TREE = 'tree'
42
+ JSON = 'json'
43
+ PLIST = 'plist'
44
+ PCAP = 'pcap'
45
+
46
+ # layer thresholds
47
+ RAW = 'none'
48
+ LINK = 'link'
49
+ INET = 'internet'
50
+ TRANS = 'transport'
51
+ APP = 'application'
52
+
53
+ # extraction engines
54
+ DPKT = 'dpkt'
55
+ Scapy = 'scapy'
56
+ PCAPKit = 'default'
57
+ PyShark = 'pyshark'
58
+
59
+
60
+ def extract(fin: 'Optional[str | IO[bytes]]' = None, fout: 'Optional[str]' = None, format: 'Optional[Formats]' = None, # basic settings # pylint: disable=redefined-builtin
61
+ auto: 'bool' = True, extension: 'bool' = True, store: 'bool' = True, # internal settings # pylint: disable=line-too-long
62
+ files: 'bool' = False, nofile: 'bool' = False, verbose: 'bool | VerboseHandler' = False, # output settings # pylint: disable=line-too-long
63
+ engine: 'Optional[Engines]' = None, layer: 'Optional[Layers] | Type[Protocol]' = None, # extraction settings # pylint: disable=line-too-long
64
+ protocol: 'Optional[Protocols]' = None, # extraction settings # pylint: disable=line-too-long
65
+ reassembly: 'bool' = False, reasm_strict: 'bool' = True, reasm_store: 'bool' = True, # reassembly settings # pylint: disable=line-too-long
66
+ trace: 'bool' = False, trace_fout: 'Optional[str]' = None, trace_format: 'Optional[Formats]' = None, # trace settings # pylint: disable=line-too-long
67
+ trace_byteorder: 'Literal["big", "little"]' = sys.byteorder, trace_nanosecond: 'bool' = False, # trace settings # pylint: disable=line-too-long
68
+ ip: 'bool' = False, ipv4: 'bool' = False, ipv6: 'bool' = False, tcp: 'bool' = False, # reassembly/trace settings # pylint: disable=line-too-long
69
+ buffer_size: 'int' = io.DEFAULT_BUFFER_SIZE, buffer_save: 'bool' = False, buffer_path: 'Optional[str]' = None, # buffer settings # pylint: disable=line-too-long
70
+ no_eof: 'bool' = False) -> 'Extractor':
71
+ """Extract a PCAP file.
72
+
73
+ Arguments:
74
+ fin: file name to be read or a binary IO object;
75
+ if file not exist, raise :exc:`FileNotFound`
76
+ fout: file name to be written
77
+ format: file format of output
78
+
79
+ auto: if automatically run till EOF
80
+ extension: if check and append extensions to output file
81
+ store: if store extracted packet info
82
+
83
+ files: if split each frame into different files
84
+ nofile: if no output file is to be dumped
85
+ verbose: a :obj:`bool` value or a function takes the :class:`Extractor`
86
+ instance and current parsed frame (depends on engine selected) as
87
+ parameters to print verbose output information
88
+
89
+ engine: extraction engine to be used
90
+ layer: extract til which layer
91
+ protocol: extract til which protocol
92
+
93
+ reassembly: if perform reassembly
94
+ reasm_strict: if set strict flag for reassembly
95
+ reasm_store: if store reassembled datagrams
96
+
97
+ trace: if trace TCP traffic flows
98
+ trace_fout: path name for flow tracer if necessary
99
+ trace_format: output file format of flow tracer
100
+ trace_byteorder: output file byte order
101
+ trace_nanosecond: output nanosecond-resolution file flag
102
+
103
+ ip: if record data for IPv4 & IPv6 reassembly (must be used with ``reassembly=True``)
104
+ ipv4: if perform IPv4 reassembly (must be used with ``reassembly=True``)
105
+ ipv6: if perform IPv6 reassembly (must be used with ``reassembly=True``)
106
+ tcp: if perform TCP reassembly and/or flow tracing
107
+ (must be used with ``reassembly=True`` or ``trace=True``)
108
+
109
+ buffer_size: buffer size for reading input file (for :class:`~pcapkit.corekit.io.SeekableReader` only)
110
+ buffer_save: if save buffer to file (for :class:`~pcapkit.corekit.io.SeekableReader` only)
111
+ buffer_path: path name for buffer file if necessary (for :class:`~pcapkit.corekit.io.SeekableReader` only)
112
+
113
+ no_eof: if not raise :exc:`EOFError` when reach EOF
114
+
115
+ Returns:
116
+ An :class:`~pcapkit.foundation.extraction.Extractor` object.
117
+
118
+ """
119
+ if isinstance(layer, type) and issubclass(layer, Protocol):
120
+ layer = (layer.__layer__ or 'none').lower() # type: ignore[assignment]
121
+
122
+ return Extractor(fin=fin, fout=fout, format=format,
123
+ store=store, files=files, nofile=nofile,
124
+ auto=auto, verbose=verbose, extension=extension,
125
+ engine=engine, layer=layer, protocol=protocol, # type: ignore[arg-type]
126
+ ip=ip, ipv4=ipv4, ipv6=ipv6, tcp=tcp,
127
+ reassembly=reassembly, reasm_store=reasm_store, reasm_strict=reasm_strict,
128
+ trace=trace, trace_fout=trace_fout, trace_format=trace_format,
129
+ trace_byteorder=trace_byteorder, trace_nanosecond=trace_nanosecond,
130
+ buffer_size=buffer_size, buffer_path=buffer_path, buffer_save=buffer_save,
131
+ no_eof=no_eof)
132
+
133
+
134
+ def reassemble(protocol: 'str | Type[Protocol]', strict: 'bool' = False) -> 'Reassembly':
135
+ """Reassemble fragmented datagrams.
136
+
137
+ Arguments:
138
+ protocol: protocol to be reassembled
139
+ strict: if return all datagrams (including those not implemented) when submit
140
+
141
+ Returns:
142
+ A :class:`~pcapkit.foundation.reassembly.reassembly.Reassembly` object of corresponding protocol.
143
+
144
+ Raises:
145
+ FormatError: If ``protocol`` is **NOT** any of IPv4, IPv6 or TCP.
146
+
147
+ """
148
+ if isinstance(protocol, type) and issubclass(protocol, Protocol):
149
+ protocol = protocol.id()[0]
150
+
151
+ if protocol == 'IPv4':
152
+ return IPv4_Reassembly(strict=strict)
153
+ if protocol == 'IPv6':
154
+ return IPv6_Reassembly(strict=strict)
155
+ if protocol == 'TCP':
156
+ return TCP_Reassembly(strict=strict)
157
+ raise FormatError(f'Unsupported reassembly protocol: {protocol}')
158
+
159
+
160
+ def trace(protocol: 'str | Type[Protocol]', fout: 'Optional[str]',
161
+ format: 'Optional[str]', # pylint: disable=redefined-builtin
162
+ byteorder: 'Literal["little", "big"]' = sys.byteorder,
163
+ nanosecond: bool = False) -> 'TraceFlow':
164
+ """Trace flows.
165
+
166
+ Arguments:
167
+ protocol: protocol to be reassembled
168
+ fout: output path
169
+ format: output format
170
+ byteorder: output file byte order
171
+ nanosecond: output nanosecond-resolution file flag
172
+
173
+ Returns:
174
+ A :class:`~pcapkit.foundation.traceflow.traceflow.TraceFlow` object.
175
+
176
+ Raises:
177
+ FormatError: If ``protocol`` is **NOT** TCP.
178
+
179
+ """
180
+ if isinstance(protocol, type) and issubclass(protocol, Protocol):
181
+ protocol = protocol.id()[0]
182
+
183
+ if protocol == 'TCP':
184
+ return TCP_TraceFlow(fout=fout, format=format, byteorder=byteorder, nanosecond=nanosecond)
185
+ raise FormatError(f'Unsupported flow tracing protocol: {protocol}')