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
File without changes
@@ -0,0 +1 @@
1
+ # 802.1X Authentication
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,35 @@
1
+ # -*- coding: utf-8 -*-
2
+ # pylint: disable=unused-import,unused-wildcard-import,fixme
3
+ """Link Layer Protocols
4
+ ==========================
5
+
6
+ .. module:: pcapkit.protocols.link
7
+
8
+ :mod:`pcapkit.protocols.link` is collection of all protocols in
9
+ link layer, with detailed implementation and methods.
10
+
11
+ """
12
+ # TODO: Implements DSL, EAPOL, FDDI, ISDN, NDP, PPP.
13
+
14
+ # Base Class for Link Layer
15
+ from pcapkit.protocols.link.link import Link
16
+
17
+ # Utility Classes for Protocols
18
+ from pcapkit.protocols.link.arp import ARP, InARP
19
+ from pcapkit.protocols.link.ethernet import Ethernet
20
+ from pcapkit.protocols.link.l2tp import L2TP
21
+ from pcapkit.protocols.link.ospf import OSPF
22
+ from pcapkit.protocols.link.rarp import RARP, DRARP
23
+ from pcapkit.protocols.link.vlan import VLAN
24
+
25
+ # Link-Layer Header Type Values
26
+ from pcapkit.const.reg.linktype import LinkType as LINKTYPE
27
+
28
+ __all__ = [
29
+ # Protocol Numbers
30
+ 'LINKTYPE',
31
+
32
+ # Link Layer Protocols
33
+ 'ARP', 'DRARP', 'Ethernet', 'InARP', 'L2TP',
34
+ 'OSPF', 'RARP', 'VLAN',
35
+ ]
@@ -0,0 +1,421 @@
1
+ # -*- coding: utf-8 -*-
2
+ """ARP/InARP - (Inverse) Address Resolution Protocol
3
+ =======================================================
4
+
5
+ .. module:: pcapkit.protocols.link.arp
6
+
7
+ :mod:`pcapkit.protocols.link.arp` contains
8
+ :class:`~pcapkit.protocols.link.arp.ARP` only,
9
+ which implements extractor for (Inverse) Address Resolution
10
+ Protocol (ARP/InARP) [*]_, whose structure is described as
11
+ below:
12
+
13
+ .. table::
14
+
15
+ ====== ==== ============= =======================
16
+ Octets Bits Name Description
17
+ ====== ==== ============= =======================
18
+ 0 0 ``arp.htype`` Hardware Type
19
+ ------ ---- ------------- -----------------------
20
+ 2 16 ``arp.ptype`` Protocol Type
21
+ ------ ---- ------------- -----------------------
22
+ 4 32 ``arp.hlen`` Hardware Address Length
23
+ ------ ---- ------------- -----------------------
24
+ 5 40 ``arp.plen`` Protocol Address Length
25
+ ------ ---- ------------- -----------------------
26
+ 6 48 ``arp.oper`` Operation
27
+ ------ ---- ------------- -----------------------
28
+ 8 64 ``arp.sha`` Sender Hardware Address
29
+ ------ ---- ------------- -----------------------
30
+ 14 112 ``arp.spa`` Sender Protocol Address
31
+ ------ ---- ------------- -----------------------
32
+ 18 144 ``arp.tha`` Target Hardware Address
33
+ ------ ---- ------------- -----------------------
34
+ 24 192 ``arp.tpa`` Target Protocol Address
35
+ ====== ==== ============= =======================
36
+
37
+ .. [*] http://en.wikipedia.org/wiki/Address_Resolution_Protocol
38
+
39
+ """
40
+ import ipaddress
41
+ import re
42
+ import sys
43
+ import textwrap
44
+ from typing import TYPE_CHECKING
45
+
46
+ from pcapkit.const.arp.hardware import Hardware as Enum_Hardware
47
+ from pcapkit.const.arp.operation import Operation as Enum_Operation
48
+ from pcapkit.const.reg.ethertype import EtherType as Enum_EtherType
49
+ from pcapkit.protocols.data.link.arp import ARP as Data_ARP
50
+ from pcapkit.protocols.data.link.arp import Address as Data_Address
51
+ from pcapkit.protocols.data.link.arp import Type as Data_Type
52
+ from pcapkit.protocols.link.link import Link
53
+ from pcapkit.protocols.schema.link.arp import ARP as Schema_ARP
54
+ from pcapkit.utilities.compat import cached_property
55
+ from pcapkit.utilities.exceptions import ProtocolError
56
+
57
+ if TYPE_CHECKING:
58
+ from enum import IntEnum as StdlibEnum
59
+ from ipaddress import IPv4Address, IPv6Address
60
+ from typing import Any, Optional, Type
61
+
62
+ from aenum import IntEnum as AenumEnum
63
+ from typing_extensions import Literal
64
+
65
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
66
+ from pcapkit.protocols.schema.schema import Schema
67
+
68
+ __all__ = ['ARP', 'InARP']
69
+
70
+ # check Python version
71
+ py38 = ((version_info := sys.version_info).major >= 3 and version_info.minor >= 8)
72
+
73
+ # Ethernet address pattern
74
+ PAT_MAC_ADDR = re.compile(rb'(?i)(?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2}')
75
+
76
+
77
+ class ARP(Link[Data_ARP, Schema_ARP],
78
+ schema=Schema_ARP, data=Data_ARP):
79
+ """This class implements all protocols in ARP family.
80
+
81
+ - Address Resolution Protocol (:class:`~pcapkit.protocols.link.arp.ARP`) [:rfc:`826`]
82
+ - Reverse Address Resolution Protocol (:class:`~pcapkit.protocols.link.rarp.RARP`) [:rfc:`903`]
83
+ - Dynamic Reverse Address Resolution Protocol (:class:`~pcapkit.protocols.link.rarp.DRARP`) [:rfc:`1931`]
84
+ - Inverse Address Resolution Protocol (:class:`~pcapkit.protocols.link.arp.InARP`) [:rfc:`2390`]
85
+
86
+ """
87
+ #: Name of corresponding protocol.
88
+ _name: 'Literal["Address Resolution Protocol", "Inverse Address Resolution Protocol", "Reverse Address Resolution Protocol", "Dynamic Reverse Address Resolution Protocol"]' # pylint: disable=line-too-long
89
+ #: Acronym of corresponding protocol.
90
+ _acnm: 'Literal["ARP", "InARP", "RARP", "DRARP"]'
91
+
92
+ ##########################################################################
93
+ # Properties.
94
+ ##########################################################################
95
+
96
+ @property
97
+ def name(self) -> 'Literal["Dynamic Reverse Address Resolution Protocol", "Inverse Address Resolution Protocol", "Reverse Address Resolution Protocol", "Address Resolution Protocol"]': # pylint: disable=line-too-long
98
+ """Name of current protocol."""
99
+ return self._name
100
+
101
+ @property
102
+ def alias(self) -> 'Literal["ARP", "InARP", "RARP", "DRARP"]':
103
+ """Acronym of corresponding protocol."""
104
+ return self._acnm
105
+
106
+ @property
107
+ def length(self) -> 'int':
108
+ """Header length of current protocol."""
109
+ return self._info.len
110
+
111
+ @cached_property
112
+ def src(self) -> 'Data_Address':
113
+ """Sender hardware & protocol address."""
114
+ return Data_Address(self._info.sha, self._info.spa)
115
+
116
+ @cached_property
117
+ def dst(self) -> 'Data_Address':
118
+ """Target hardware & protocol address."""
119
+ return Data_Address(self._info.tha, self._info.tpa)
120
+
121
+ @cached_property
122
+ def type(self) -> 'Data_Type':
123
+ """Hardware & protocol type."""
124
+ return Data_Type(self._info.htype, self._info.ptype)
125
+
126
+ ##########################################################################
127
+ # Methods.
128
+ ##########################################################################
129
+
130
+ @classmethod
131
+ def id(cls) -> 'tuple[Literal["ARP"]]':
132
+ """Index ID of the protocol."""
133
+ return ('ARP',)
134
+
135
+ def read(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_ARP': # pylint: disable=unused-argument
136
+ r"""Read Address Resolution Protocol.
137
+
138
+ Data structure of ARP Request header [:rfc:`826`]:
139
+
140
+ .. code-block:: text
141
+
142
+ 0 1 2 3
143
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
144
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
145
+ | Hdr Type | Proto Type |
146
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
147
+ | Hdr Len | Proto Len | Operation |
148
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
149
+ \ Sender Hdr Addr \
150
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
151
+ \ Sender Proto Addr \
152
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
153
+ \ Target Hdr Addr \
154
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
155
+ \ Target Proto Addr \
156
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
157
+
158
+ Args:
159
+ length: Length of packet data.
160
+ **kwargs: Arbitrary keyword arguments.
161
+
162
+ Returns:
163
+ Parsed packet data.
164
+
165
+ """
166
+ if length is None:
167
+ length = self.__len__()
168
+ schema = self.__header__
169
+
170
+ _hwty = schema.htype
171
+ _ptty = schema.ptype
172
+ _hlen = schema.hlen
173
+ _plen = schema.plen
174
+ _oper = schema.oper
175
+ _shwa = self._read_addr_resolve(schema.sha, _hwty)
176
+ _spta = self._read_proto_resolve(schema.spa, _ptty)
177
+ _thwa = self._read_addr_resolve(schema.tha, _hwty)
178
+ _tpta = self._read_proto_resolve(schema.tpa, _ptty)
179
+
180
+ if _oper in (5, 6, 7):
181
+ self._acnm = 'DRARP'
182
+ self._name = 'Dynamic Reverse Address Resolution Protocol'
183
+ elif _oper in (8, 9):
184
+ self._acnm = 'InARP'
185
+ self._name = 'Inverse Address Resolution Protocol'
186
+ elif _oper in (3, 4):
187
+ self._acnm = 'RARP'
188
+ self._name = 'Reverse Address Resolution Protocol'
189
+ else:
190
+ self._acnm = 'ARP'
191
+ self._name = 'Address Resolution Protocol'
192
+
193
+ arp = Data_ARP(
194
+ htype=_hwty,
195
+ ptype=_ptty,
196
+ hlen=_hlen,
197
+ plen=_plen,
198
+ oper=_oper,
199
+ sha=_shwa,
200
+ spa=_spta,
201
+ tha=_thwa,
202
+ tpa=_tpta,
203
+ len=8 + _hlen * 2 + _plen * 2,
204
+ )
205
+ return self._decode_next_layer(arp, -1, length - arp.len)
206
+
207
+ def make(self, *,
208
+ htype: 'Enum_Hardware | StdlibEnum | AenumEnum | str | int' = Enum_Hardware.Ethernet,
209
+ htype_default: 'Optional[int]' = None,
210
+ htype_namespace: 'Optional[dict[str, int] | dict[int, str] | Type[StdlibEnum] | Type[AenumEnum]]' = None, # pylint: disable=line-too-long
211
+ htype_reversed: 'bool' = False,
212
+ ptype: 'Enum_EtherType | StdlibEnum | AenumEnum | str | int' = Enum_EtherType.Internet_Protocol_version_4,
213
+ ptype_default: 'Optional[int]' = None,
214
+ ptype_namespace: 'Optional[dict[str, int] | dict[int, str] | Type[StdlibEnum] | Type[AenumEnum]]' = None, # pylint: disable=line-too-long
215
+ ptype_reversed: 'bool' = False,
216
+ hlen: 'int' = 6,
217
+ plen: 'int' = 4,
218
+ oper: 'Enum_Operation | StdlibEnum | AenumEnum | str | int' = Enum_Operation.REQUEST,
219
+ oper_default: 'Optional[int]' = None,
220
+ oper_namespace: 'Optional[dict[str, int] | dict[int, str] | Type[StdlibEnum] | Type[AenumEnum]]' = None, # pylint: disable=line-too-long
221
+ oper_reversed: 'bool' = False,
222
+ sha: 'str | bytes | bytearray' = '00:00:00:00:00:00',
223
+ spa: 'IPv4Address | IPv6Address | str | bytes | bytearray' = '0.0.0.0', # nosec: B104
224
+ tha: 'str | bytes | bytearray' = '00:00:00:00:00:00',
225
+ tpa: 'IPv4Address | IPv6Address | str | bytes | bytearray' = '0.0.0.0', # nosec: B104
226
+ payload: 'bytes | Protocol | Schema' = b'',
227
+ **kwargs: 'Any') -> 'Schema_ARP':
228
+ """Make (construct) packet data.
229
+
230
+ Args:
231
+ htype: Hardware type.
232
+ htype_default: Default value of hardware type.
233
+ htype_namespace: Namespace of hardware type.
234
+ htype_reversed: Reversed flag of hardware type.
235
+ ptype: Protocol type.
236
+ ptype_default: Default value of protocol type.
237
+ ptype_namespace: Namespace of protocol type.
238
+ ptype_reversed: Reversed flag of protocol type.
239
+ hlen: Hardware address length.
240
+ plen: Protocol address length.
241
+ oper: Operation.
242
+ oper_default: Default value of operation.
243
+ oper_namespace: Namespace of operation.
244
+ oper_reversed: Reversed flag of operation.
245
+ sha: Sender hardware address.
246
+ spa: Sender protocol address.
247
+ tha: Target hardware address.
248
+ tpa: Target protocol address.
249
+ payload: Payload.
250
+ **kwargs: Arbitrary keyword arguments.
251
+
252
+ Returns:
253
+ Constructed packet data.
254
+
255
+ """
256
+ _htype = self._make_index(htype, htype_default, namespace=htype_namespace,
257
+ reversed=htype_reversed, pack=False)
258
+ _ptype = self._make_index(ptype, ptype_default, namespace=ptype_namespace,
259
+ reversed=ptype_reversed, pack=False)
260
+ _oper = self._make_index(oper, oper_default, namespace=oper_namespace,
261
+ reversed=oper_reversed, pack=False)
262
+
263
+ return Schema_ARP(
264
+ htype=_htype,
265
+ ptype=_ptype,
266
+ hlen=hlen,
267
+ plen=plen,
268
+ oper=_oper,
269
+ sha=self._make_addr_resolve(sha, _htype),
270
+ spa=self._make_proto_resolve(spa, _ptype),
271
+ tha=self._make_addr_resolve(tha, _htype),
272
+ tpa=self._make_proto_resolve(tpa, _ptype),
273
+ payload=payload,
274
+ )
275
+
276
+ ##########################################################################
277
+ # Data models.
278
+ ##########################################################################
279
+
280
+ def __length_hint__(self) -> 'Literal[28]':
281
+ """Return an estimated length for the object."""
282
+ return 28
283
+
284
+ @classmethod
285
+ def __index__(cls) -> 'Enum_EtherType': # pylint: disable=invalid-index-returned
286
+ """Numeral registry index of the protocol.
287
+
288
+ Returns:
289
+ Numeral registry index of the protocol in `IANA`_.
290
+
291
+ .. _IANA: https://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.xhtml
292
+
293
+ """
294
+ return Enum_EtherType.Address_Resolution_Protocol # type: ignore[return-value]
295
+
296
+ ##########################################################################
297
+ # Utilities.
298
+ ##########################################################################
299
+
300
+ @classmethod
301
+ def _make_data(cls, data: 'Data_ARP') -> 'dict[str, Any]': # type: ignore[override]
302
+ """Create key-value pairs from ``data`` for protocol construction.
303
+
304
+ Args:
305
+ data: protocol data
306
+
307
+ Returns:
308
+ Key-value pairs for protocol construction.
309
+
310
+ """
311
+ return {
312
+ 'htype': data.htype,
313
+ 'ptype': data.ptype,
314
+ 'hlen': data.hlen,
315
+ 'plen': data.plen,
316
+ 'oper': data.oper,
317
+ 'sha': data.sha,
318
+ 'spa': data.spa,
319
+ 'tha': data.tha,
320
+ 'tpa': data.tpa,
321
+ 'payload': cls._make_payload(data),
322
+ }
323
+
324
+ def _read_addr_resolve(self, addr: 'bytes', htype: 'int') -> 'str':
325
+ """Resolve headware address according to protocol.
326
+
327
+ Arguments:
328
+ addr: Hardware address.
329
+ htype: Hardware type.
330
+
331
+ Returns:
332
+ Hardware address. If ``htype`` is ``1``, i.e. MAC address,
333
+ returns ``:`` seperated *hex* encoded MAC address.
334
+
335
+ """
336
+ if htype == Enum_Hardware.Ethernet: # Ethernet
337
+ if py38:
338
+ _addr = addr.hex(':')
339
+ else:
340
+ _addr = ':'.join(textwrap.wrap(addr.hex(), 2))
341
+ else:
342
+ _addr = addr.hex()
343
+ return _addr
344
+
345
+ def _read_proto_resolve(self, addr: 'bytes', ptype: 'int') -> 'str | IPv4Address | IPv6Address':
346
+ """Resolve protocol address according to protocol.
347
+
348
+ Arguments:
349
+ addr: Protocol address.
350
+ ptype: Protocol type.
351
+
352
+ Returns:
353
+ Protocol address. If ``ptype`` is ``0x0800``, i.e. IPv4 adddress,
354
+ returns an :class:`~ipaddress.IPv4Address` object; if ``ptype`` is
355
+ ``0x86dd``, i.e. IPv6 address, returns an :class:`~ipaddress.IPv6Address`
356
+ object; otherwise, returns a raw :data:`str` representing the
357
+ protocol address.
358
+
359
+ """
360
+ if ptype == Enum_EtherType.Internet_Protocol_version_4: # IPv4
361
+ return ipaddress.ip_address(addr)
362
+ if ptype == Enum_EtherType.Internet_Protocol_version_6: # IPv6
363
+ return ipaddress.ip_address(addr)
364
+ return addr.hex()
365
+
366
+ def _make_addr_resolve(self, addr: 'str | bytes', htype: 'int') -> 'bytes':
367
+ """Resolve headware address according to protocol.
368
+
369
+ Arguments:
370
+ addr: Hardware address.
371
+
372
+ Returns:
373
+ Hardware address. If ``htype`` is ``1``, i.e. MAC address,
374
+ returns ``:`` seperated *hex* encoded MAC address.
375
+
376
+ """
377
+ _addr = addr.encode() if isinstance(addr, str) else addr
378
+
379
+ if htype == Enum_Hardware.Ethernet:
380
+ if PAT_MAC_ADDR.fullmatch(_addr) is not None:
381
+ return _addr.replace(b':', b'').replace(b'-', b'')
382
+ raise ProtocolError(f'Invalid MAC address: {addr!r}')
383
+ return _addr
384
+
385
+ def _make_proto_resolve(self, addr: 'IPv4Address | IPv6Address | str | bytes', ptype: 'int') -> 'bytes':
386
+ """Resolve protocol address according to protocol.
387
+
388
+ Arguments:
389
+ addr: Protocol address.
390
+
391
+ Returns:
392
+ Protocol address. If ``ptype`` is ``0x0800``, i.e. IPv4 adddress,
393
+ returns an :class:`~ipaddress.IPv4Address` object; if ``ptype`` is
394
+ ``0x86dd``, i.e. IPv6 address, returns an :class:`~ipaddress.IPv6Address`
395
+ object; otherwise, returns a raw :data:`str` representing the
396
+ protocol address.
397
+
398
+ """
399
+ if ptype == Enum_EtherType.Internet_Protocol_version_4:
400
+ return ipaddress.IPv4Address(addr).packed
401
+ if ptype == Enum_EtherType.Internet_Protocol_version_6:
402
+ return ipaddress.IPv6Address(addr).packed
403
+
404
+ if isinstance(addr, str):
405
+ return addr.encode()
406
+ if isinstance(addr, (ipaddress.IPv4Address, ipaddress.IPv6Address)):
407
+ return addr.packed
408
+ return addr
409
+
410
+
411
+ class InARP(ARP):
412
+ """This class implements Inverse Address Resolution Protocol."""
413
+
414
+ ##########################################################################
415
+ # Methods.
416
+ ##########################################################################
417
+
418
+ @classmethod
419
+ def id(cls) -> 'tuple[Literal["InARP"]]': # type: ignore[override]
420
+ """Index ID of the protocol."""
421
+ return ('InARP',)