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,144 @@
1
+ # -*- coding: utf-8 -*-
2
+ """PCAP Dumper
3
+ =================
4
+
5
+ .. module:: pcapkit.dumper.pcap
6
+
7
+ :mod:`pcapkit.dumpkit.pcap` is the dumper for :mod:`pcapkit` implementation,
8
+ specifically for PCAP format, which is alike those described in
9
+ :mod:`dictdumper`.
10
+
11
+ """
12
+ import sys
13
+ from typing import TYPE_CHECKING
14
+
15
+ from pcapkit.dumpkit.common import DumperBase as Dumper
16
+ from pcapkit.protocols.data.misc.pcap.header import Header as Data_Header
17
+ from pcapkit.protocols.misc.pcap.frame import Frame
18
+ from pcapkit.protocols.misc.pcap.header import Header
19
+
20
+ if TYPE_CHECKING:
21
+ from enum import IntEnum as StdlibIntEnum
22
+ from typing import IO, Any, Optional
23
+
24
+ from aenum import IntEnum as AenumIntEnum
25
+ from typing_extensions import Literal
26
+
27
+ from pcapkit.const.reg.linktype import LinkType as Enum_LinkType
28
+ from pcapkit.protocols.data.misc.pcap.frame import Frame as Data_Frame
29
+
30
+ __all__ = [
31
+ 'PCAPIO',
32
+ ]
33
+
34
+
35
+ class PCAPIO(Dumper):
36
+ """PCAP file dumper.
37
+
38
+ Args:
39
+ fname: output file name
40
+ protocol: data link type
41
+ byteorder: header byte order
42
+ nanosecond: nanosecond-resolution file flag
43
+ **kwargs: arbitrary keyword arguments
44
+
45
+ """
46
+ if TYPE_CHECKING:
47
+ #: PCAP file global header.
48
+ _ghdr: 'Data_Header'
49
+
50
+ ##########################################################################
51
+ # Properties.
52
+ ##########################################################################
53
+
54
+ @property
55
+ def kind(self) -> 'Literal["pcap"]':
56
+ """File format of current dumper."""
57
+ return 'pcap'
58
+
59
+ ##########################################################################
60
+ # Data models.
61
+ ##########################################################################
62
+
63
+ def __init__(self, fname: 'str', *, protocol: 'Enum_LinkType | StdlibIntEnum | AenumIntEnum | str | int',
64
+ byteorder: 'Literal["big", "little"]' = sys.byteorder,
65
+ nanosecond: 'bool' = False, **kwargs: 'Any') -> 'None': # pylint: disable=arguments-differ
66
+ """Initialise dumper.
67
+
68
+ Args:
69
+ fname: output file name
70
+ protocol: data link type
71
+ byteorder: header byte order
72
+ nanosecond: nanosecond-resolution file flag
73
+ **kwargs: arbitrary keyword arguments
74
+
75
+ """
76
+ #: int: Frame counter.
77
+ self._fnum = 1
78
+ #: bool: Nanosecond-resolution file flag.
79
+ self._nsec = nanosecond
80
+ #: Enum_LinkType | StdlibIntEnum | AenumIntEnum | str | int: Data link type.
81
+ self._link = protocol
82
+
83
+ super().__init__(fname, protocol=protocol, byteorder=byteorder, nanosecond=nanosecond, **kwargs)
84
+
85
+ def __call__(self, value: 'Data_Frame', name: 'Optional[str]' = None) -> 'PCAPIO':
86
+ """Dump a new frame.
87
+
88
+ Args:
89
+ value: content to be dumped
90
+ name: name of current content block
91
+
92
+ Returns:
93
+ The dumper class itself (to support chain calling).
94
+
95
+ """
96
+ with open(self._file, 'ab') as file:
97
+ self._append_value(value, file, name or '')
98
+ return self
99
+
100
+ ##########################################################################
101
+ # Utilities.
102
+ ##########################################################################
103
+
104
+ def _dump_header(self, *, protocol: 'Enum_LinkType | StdlibIntEnum | AenumIntEnum | str | int', # pylint: disable=arguments-differ
105
+ byteorder: 'Literal["big", "little"]' = sys.byteorder, nanosecond: 'bool' = False,
106
+ **kwargs: 'Any') -> 'None': # pylint: disable=unused-argument
107
+ """Initially dump file heads and tails.
108
+
109
+ Args:
110
+ protocol: data link type
111
+ byteorder: header byte order
112
+ nanosecond: nanosecond-resolution file flag
113
+ **kwargs: arbitrary keyword arguments
114
+
115
+ """
116
+ header = Header(
117
+ network=protocol,
118
+ byteorder=byteorder,
119
+ nanosecond=nanosecond,
120
+ )
121
+ packet = header.data
122
+ with open(self._file, 'wb') as file:
123
+ file.write(packet)
124
+ self._ghdr = header.info
125
+
126
+ def _append_value(self, value: 'Data_Frame', file: 'IO[bytes]', name: 'str') -> 'None': # pylint: disable=unused-argument
127
+ """Call this function to write contents.
128
+
129
+ Args:
130
+ value: content to be dumped
131
+ file: output file
132
+ name: name of current content block
133
+
134
+ """
135
+ packet = Frame(
136
+ nanosecond=self._nsec,
137
+ num=self._fnum,
138
+ proto=self._link,
139
+ packet=value.packet,
140
+ header=self._ghdr,
141
+ **value.frame_info,
142
+ ).data
143
+ file.write(packet)
144
+ self._fnum += 1
@@ -0,0 +1,45 @@
1
+ # -*- coding: utf-8 -*-
2
+ # pylint: disable=unused-import, unused-wildcard-import
3
+ """Library Foundation
4
+ ========================
5
+
6
+ .. module:: pcapkit.foundation
7
+
8
+ :mod:`pcapkit.foundation` is a collection of foundations for
9
+ :mod:`pcapkit`, including PCAP file extraction tool
10
+ :class:`~pcapkit.foundation.extraction.Extrator`, flow tracing
11
+ :mod:`~pcapkit.foundation.tractflow`, registry management
12
+ APIs for :mod:`pcapkit`, and TCP/IP reassembly implementations.
13
+
14
+ """
15
+ from pcapkit.foundation.extraction import Extractor
16
+ from pcapkit.foundation.reassembly import *
17
+ from pcapkit.foundation.registry import *
18
+ from pcapkit.foundation.traceflow import *
19
+
20
+ __all__ = [
21
+ 'Extractor',
22
+
23
+ 'IPv4_Reassembly', 'IPv6_Reassembly', 'TCP_Reassembly',
24
+
25
+ 'TCP_TraceFlow',
26
+
27
+ 'register_protocol',
28
+ 'register_linktype',
29
+ 'register_pcap', 'register_pcapng',
30
+ 'register_ethertype',
31
+ 'register_transtype',
32
+ 'register_ipv4_option', 'register_hip_parameter', 'register_hopopt_option',
33
+ 'register_ipv6_opts_option', 'register_ipv6_route_routing',
34
+ 'register_mh_message', 'register_mh_option', 'register_mh_extension',
35
+ 'register_apptype',
36
+ 'register_tcp', 'register_udp',
37
+ 'register_tcp_option', 'register_tcp_mp_option',
38
+ 'register_http_frame',
39
+ 'register_pcapng_block', 'register_pcapng_option', 'register_pcapng_secrets',
40
+ 'register_pcapng_record',
41
+
42
+ 'register_extractor_engine',
43
+ 'register_dumper',
44
+ 'register_extractor_dumper', 'register_traceflow_dumper',
45
+ ]
@@ -0,0 +1,36 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Engine Support
3
+ ====================
4
+
5
+ .. module:: pcapkit.foundation.engines
6
+
7
+ :mod:`pcapkit.foundation.engines` is a collection of engines
8
+ support for :mod:`pcapkit`, including but not limited to the
9
+ built-in PCAP and `PCAP-NG`_ file support, :mod:`Scapy <scapy>`,
10
+ :mod:`PyShark <pyshark>`, :mod:`DPKT <dpkt>` 3rd party engine
11
+ support.
12
+
13
+ .. todo::
14
+
15
+ Implement support for `PCAP-NG`_ file format.
16
+
17
+ .. _PCAPNG: https://wiki.wireshark.org/Development/PcapNg
18
+
19
+ """
20
+ # Base class
21
+ from pcapkit.foundation.engines.engine import Engine
22
+
23
+ # Built-in engines
24
+ from pcapkit.foundation.engines.pcap import PCAP
25
+ from pcapkit.foundation.engines.pcapng import PCAPNG
26
+
27
+ # 3rd party engines
28
+ from pcapkit.foundation.engines.scapy import Scapy
29
+ from pcapkit.foundation.engines.dpkt import DPKT
30
+ from pcapkit.foundation.engines.pyshark import PyShark
31
+
32
+ __all__ = [
33
+ 'PCAP', 'PCAPNG',
34
+
35
+ 'Scapy', 'DPKT', 'PyShark',
36
+ ]
@@ -0,0 +1,230 @@
1
+ # -*- coding: utf-8 -*-
2
+ """DPKT Support
3
+ ==================
4
+
5
+ .. module:: pcapkit.foundation.engines.dpkt
6
+
7
+ This module contains the implementation for `DPKT`_ engine
8
+ support, as is used by :class:`pcapkit.foundation.extraction.Extractor`.
9
+
10
+ .. _DPKT: https://dpkt.readthedocs.io
11
+
12
+ """
13
+ from typing import TYPE_CHECKING, cast
14
+
15
+ from pcapkit.const.reg.linktype import LinkType as Enum_LinkType
16
+ from pcapkit.foundation.engines.engine import EngineBase as Engine
17
+ from pcapkit.utilities.exceptions import FormatError, stacklevel
18
+ from pcapkit.utilities.warnings import AttributeWarning, DPKTWarning, warn
19
+
20
+ __all__ = ['DPKT']
21
+
22
+ if TYPE_CHECKING:
23
+ from typing import Optional, Type, Union
24
+
25
+ from dpkt.dpkt import Packet as DPKTPacket
26
+ from dpkt.pcap import Reader as PCAPReader
27
+ from dpkt.pcapng import Reader as PCAPNGReader
28
+
29
+ from pcapkit.foundation.extraction import Extractor
30
+
31
+ Reader = Union[PCAPReader, PCAPNGReader]
32
+
33
+
34
+ class DPKT(Engine['DPKTPacket']):
35
+ """DPKT engine support.
36
+
37
+ Args:
38
+ extractor: :class:`~pcapkit.foundation.extraction.Extractor` instance.
39
+
40
+ """
41
+ if TYPE_CHECKING:
42
+ import dpkt
43
+
44
+ #: Engine extraction package.
45
+ _expkg: 'dpkt'
46
+ #: Engine extraction temporary storage.
47
+ _extmp: 'Reader'
48
+
49
+ ##########################################################################
50
+ # Defaults.
51
+ ##########################################################################
52
+
53
+ #: Engine name.
54
+ __engine_name__ = 'DPKT'
55
+
56
+ #: Engine module name.
57
+ __engine_module__ = 'dpkt'
58
+
59
+ ##########################################################################
60
+ # Data models.
61
+ ##########################################################################
62
+
63
+ def __init__(self, extractor: 'Extractor') -> 'None':
64
+ import dpkt # isort:skip
65
+
66
+ self._expkg = dpkt
67
+ self._extmp = cast('Reader', None)
68
+
69
+ super().__init__(extractor)
70
+
71
+ ##########################################################################
72
+ # Methods.
73
+ ##########################################################################
74
+
75
+ def run(self) -> 'None':
76
+ """Call :class:`dpkt.pcap.Reader` to extract PCAP files.
77
+
78
+ This method assigns :attr:`self._expkg <DPKT._expkg>`
79
+ as :mod:`dpkt` and :attr:`self._extmp <DPKT._extmp>`
80
+ as an iterator from :class:`dpkt.pcap.Reader`.
81
+
82
+ Warns:
83
+ AttributeWarning: If :attr:`self.extractor._exlyr <pcapkit.foundation.extraction.Extractor._exlyr>`
84
+ and/or :attr:`self.extractor._exptl <pcapkit.foundation.extraction.Extractor._exptl>`
85
+ is provided as the DPKT engine currently does not support such operations.
86
+
87
+ Raises:
88
+ FormatError: If the file format is not supported, i.e., not a PCAP
89
+ and/or PCAP-NG file.
90
+
91
+ """
92
+ from pcapkit.foundation.engines.pcap import PCAP
93
+ from pcapkit.foundation.engines.pcapng import PCAPNG
94
+
95
+ ext = self._extractor
96
+ dpkt = self._expkg
97
+
98
+ if ext._exlyr != 'none' or ext._exptl != 'null':
99
+ warn("'Extractor(engine=dpkt)' does not support protocol and layer threshold; "
100
+ f"'layer={ext._exlyr}' and 'protocol={ext._exptl}' ignored",
101
+ AttributeWarning, stacklevel=stacklevel())
102
+
103
+ # setup verbose handler
104
+ if ext._flag_v:
105
+ from pcapkit.toolkit.dpkt import packet2chain # isort:skip
106
+ ext._vfunc = lambda e, f: print(
107
+ f'Frame {e._frnum:>3d}: {packet2chain(f)}' # pylint: disable=protected-access
108
+ ) # pylint: disable=logging-fstring-interpolation
109
+
110
+ if ext.magic_number in PCAP.MAGIC_NUMBER:
111
+ reader = dpkt.pcap.Reader(ext._ifile)
112
+ elif ext.magic_number in PCAPNG.MAGIC_NUMBER:
113
+ reader = dpkt.pcapng.Reader(ext._ifile)
114
+ else:
115
+ raise FormatError(f'unsupported file format: {ext.magic_number!r}')
116
+
117
+ # extract & analyse file
118
+ self._extmp = reader
119
+
120
+ def read_frame(self) -> 'DPKTPacket':
121
+ """Read frames with DPKT engine.
122
+
123
+ Returns:
124
+ Parsed frame instance.
125
+
126
+ See Also:
127
+ Please refer to :meth:`PCAP.read_frame <pcapkit.foundation.engines.pcap.PCAP.read_frame>`
128
+ for more operational information.
129
+
130
+ """
131
+ from pcapkit.toolkit.dpkt import (ipv4_reassembly, ipv6_reassembly, packet2dict,
132
+ tcp_reassembly, tcp_traceflow)
133
+ ext = self._extractor
134
+
135
+ reader = self._extmp
136
+ linktype = Enum_LinkType.get(reader.datalink())
137
+
138
+ # fetch DPKT packet
139
+ timestamp, pkt = cast('tuple[float, bytes]', next(reader))
140
+ protocol = self._get_protocol(linktype)
141
+ packet = protocol(pkt) # type: DPKTPacket
142
+
143
+ # verbose output
144
+ ext._frnum += 1
145
+ ext._vfunc(ext, packet)
146
+
147
+ # write plist
148
+ frnum = f'Frame {ext._frnum}'
149
+ if not ext._flag_q:
150
+ info = packet2dict(packet, timestamp, data_link=linktype)
151
+ if ext._flag_f:
152
+ ofile = ext._ofile(f'{ext._ofnm}/{frnum}.{ext._fext}')
153
+ ofile(info, name=frnum)
154
+ else:
155
+ ext._ofile(info, name=frnum)
156
+ ofile = ext._ofile
157
+ ext._offmt = ofile.kind
158
+
159
+ # record fragments
160
+ if ext._flag_r:
161
+ if ext._ipv4:
162
+ data_ipv4 = ipv4_reassembly(packet, count=ext._frnum)
163
+ if data_ipv4 is not None:
164
+ ext._reasm.ipv4(data_ipv4)
165
+ if ext._ipv6:
166
+ data_ipv6 = ipv6_reassembly(packet, count=ext._frnum)
167
+ if data_ipv6 is not None:
168
+ ext._reasm.ipv6(data_ipv6)
169
+ if ext._tcp:
170
+ data_tcp = tcp_reassembly(packet, count=ext._frnum)
171
+ if data_tcp is not None:
172
+ ext._reasm.tcp(data_tcp)
173
+
174
+ # trace flows
175
+ if ext._flag_t:
176
+ if ext._tcp:
177
+ data_tf_tcp = tcp_traceflow(packet, timestamp, data_link=linktype, count=ext._frnum)
178
+ if data_tf_tcp is not None:
179
+ ext._trace.tcp(data_tf_tcp)
180
+
181
+ # record frames
182
+ if ext._flag_d:
183
+ # setattr(packet, 'packet2dict', packet2dict)
184
+ # setattr(packet, 'packet2chain', packet2chain)
185
+ ext._frame.append(packet)
186
+
187
+ # return frame record
188
+ return packet
189
+
190
+ ##########################################################################
191
+ # Utilities.
192
+ ##########################################################################
193
+
194
+ def _get_protocol(self, linktype: 'Optional[Enum_LinkType]' = None) -> 'Type[DPKTPacket]':
195
+ """Returns the protocol for parsing the current packet.
196
+
197
+ Args:
198
+ linktype: Link type code.
199
+
200
+ """
201
+ dpkt = self._expkg
202
+ reader = self._extmp
203
+
204
+ if linktype is None:
205
+ linktype = Enum_LinkType.get(reader.datalink())
206
+
207
+ if linktype == Enum_LinkType.ETHERNET:
208
+ pkg = dpkt.ethernet.Ethernet
209
+ elif linktype.value == Enum_LinkType.IPV4:
210
+ pkg = dpkt.ip.IP
211
+ elif linktype.value == Enum_LinkType.IPV6:
212
+ pkg = dpkt.ip6.IP6
213
+ else:
214
+ warn('unrecognised link layer protocol; all analysis functions ignored',
215
+ DPKTWarning, stacklevel=stacklevel())
216
+
217
+ class RawPacket(dpkt.dpkt.Packet): # type: ignore[name-defined]
218
+ """Raw packet."""
219
+
220
+ def __len__(ext) -> 'int':
221
+ return len(ext.data)
222
+
223
+ def __bytes__(ext) -> 'bytes':
224
+ return ext.data
225
+
226
+ def unpack(ext, buf: 'bytes') -> 'None':
227
+ ext.data = buf
228
+
229
+ pkg = RawPacket
230
+ return pkg
@@ -0,0 +1,194 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Base Class
3
+ ================
4
+
5
+ .. module:: pcapkit.foundation.engines.engine
6
+
7
+ This is the abstract base class implementation for
8
+ all engine support functionality.
9
+
10
+ """
11
+ import abc
12
+ from typing import TYPE_CHECKING, Generic, TypeVar, cast
13
+
14
+ __all__ = ['Engine']
15
+
16
+ if TYPE_CHECKING:
17
+ from typing import Any, Optional
18
+
19
+ from pcapkit.foundation.extraction import Extractor
20
+
21
+ _T = TypeVar('_T')
22
+
23
+
24
+ class EngineMeta(abc.ABCMeta, Generic[_T]):
25
+ """Meta class to add dynamic support to :class:`EngineBase`.
26
+
27
+ This meta class is used to generate necessary attributes for the
28
+ :class:`EngineBase` class. It can be useful to reduce unnecessary
29
+ registry calls and simplify the customisation process.
30
+
31
+ """
32
+ if TYPE_CHECKING:
33
+ #: Engine name.
34
+ __engine_name__: 'str'
35
+ #: Engine module name.
36
+ __engine_module__: 'str'
37
+
38
+ @property
39
+ def name(cls) -> 'str':
40
+ """Engine name."""
41
+ if hasattr(cls, '__engine_name__'):
42
+ return cls.__engine_name__
43
+ return cls.__name__
44
+
45
+ @property
46
+ def module(cls) -> 'str':
47
+ """Engine module name."""
48
+ if hasattr(cls, '__engine_module__'):
49
+ return cls.__engine_module__
50
+ return cls.__module__
51
+
52
+
53
+ class EngineBase(Generic[_T], metaclass=EngineMeta):
54
+ """Base class for engine support.
55
+
56
+ Args:
57
+ extractor: :class:`~pcapkit.foundation.extraction.Extractor` instance.
58
+
59
+ Note:
60
+ This class is for internal use only. For customisation, please use
61
+ :class:`Engine` instead.
62
+
63
+ """
64
+ if TYPE_CHECKING:
65
+ #: Engine name.
66
+ __engine_name__: 'str'
67
+ #: Engine module name.
68
+ __engine_module__: 'str'
69
+
70
+ ##########################################################################
71
+ # Properties.
72
+ ##########################################################################
73
+
74
+ @property
75
+ def name(self) -> 'str':
76
+ """Engine name.
77
+
78
+ Note:
79
+ This property is not available as a class
80
+ attribute.
81
+
82
+ """
83
+ if hasattr(self, '__engine_name__'):
84
+ return self.__engine_name__
85
+ return type(self).name # type: ignore[return-value]
86
+
87
+ @property
88
+ def module(self) -> 'str':
89
+ """Engine module name.
90
+
91
+ Note:
92
+ This property is not available as a class
93
+ attribute.
94
+
95
+ """
96
+ if hasattr(self, '__engine_module__'):
97
+ return self.__engine_module__
98
+ return type(self).module # type: ignore[return-value]
99
+
100
+ @property
101
+ def extractor(self) -> 'Extractor':
102
+ """Extractor instance."""
103
+ return self._extractor
104
+
105
+ ##########################################################################
106
+ # Data models.
107
+ ##########################################################################
108
+
109
+ def __init__(self, extractor: 'Extractor') -> 'None':
110
+ self._extractor = extractor
111
+
112
+ def __call__(self) -> 'None':
113
+ """Start extraction.
114
+
115
+ This method will directly call :meth:`run` to start the
116
+ extraction process.
117
+
118
+ """
119
+ self.run()
120
+
121
+ ##########################################################################
122
+ # Methods.
123
+ ##########################################################################
124
+
125
+ @abc.abstractmethod
126
+ def run(self) -> 'None':
127
+ """Start extraction.
128
+
129
+ This method is the entry point for file extraction. It is to be used
130
+ for preparing the extraction process, such as parsing the file header
131
+ and setting up the extraction engines.
132
+
133
+ """
134
+
135
+ @abc.abstractmethod
136
+ def read_frame(self) -> '_T':
137
+ """Read frame.
138
+
139
+ This method is to be used for reading a frame from the file. It is to
140
+ read a frame from the file using the prepared engine instance and
141
+ return the parsed frame.
142
+
143
+ """
144
+
145
+ def close(self) -> 'None':
146
+ """Close engine.
147
+
148
+ This method is to be used for closing the engine instance. It is to
149
+ close the engine instance after the extraction process is finished.
150
+
151
+ """
152
+
153
+
154
+ class Engine(EngineBase[_T], Generic[_T]):
155
+ """Base class for engine support.
156
+
157
+ Example:
158
+
159
+ Use keyword argument ``name`` to specify the engine name at
160
+ class definition:
161
+
162
+ .. code-block:: python
163
+
164
+ class MyEngine(Engine, name='my_engine'):
165
+ ...
166
+
167
+ Args:
168
+ extractor: :class:`~pcapkit.foundation.extraction.Extractor` instance.
169
+
170
+ """
171
+
172
+ def __init_subclass__(cls, /, name: 'Optional[str]' = None, *args: 'Any', **kwargs: 'Any') -> 'None':
173
+ """Initialise subclass.
174
+
175
+ This method is to be used for registering the engine class to
176
+ :class:`~pcapkit.foundation.extraction.Extractor` class.
177
+
178
+ Args:
179
+ name: Engine name, default to class name.
180
+ *args: Arbitrary positional arguments.
181
+ **kwargs: Arbitrary keyword arguments.
182
+
183
+ See Also:
184
+ For more details, please refer to
185
+ :meth:`pcapkit.foundation.extraction.Extractor.register_engine`.
186
+
187
+ """
188
+ if name is None:
189
+ name = cast('str', cls.name)
190
+
191
+ from pcapkit.foundation.extraction import Extractor
192
+ Extractor.register_engine(name.lower(), cls)
193
+
194
+ return super().__init_subclass__()