stackforge 0.3.0__tar.gz → 0.4.0__tar.gz

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 (330) hide show
  1. stackforge-0.4.0/CONTRIBUTING.md +238 -0
  2. {stackforge-0.3.0 → stackforge-0.4.0}/Cargo.lock +81 -5
  3. {stackforge-0.3.0 → stackforge-0.4.0}/Cargo.toml +2 -1
  4. stackforge-0.4.0/PKG-INFO +377 -0
  5. stackforge-0.4.0/README.md +352 -0
  6. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/Cargo.toml +1 -0
  7. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/error.rs +4 -1
  8. stackforge-0.4.0/crates/stackforge-core/src/flow/config.rs +54 -0
  9. stackforge-0.4.0/crates/stackforge-core/src/flow/error.rs +25 -0
  10. stackforge-0.4.0/crates/stackforge-core/src/flow/key.rs +455 -0
  11. stackforge-0.4.0/crates/stackforge-core/src/flow/mod.rs +318 -0
  12. stackforge-0.4.0/crates/stackforge-core/src/flow/state.rs +332 -0
  13. stackforge-0.4.0/crates/stackforge-core/src/flow/table.rs +363 -0
  14. stackforge-0.4.0/crates/stackforge-core/src/flow/tcp_reassembly.rs +366 -0
  15. stackforge-0.4.0/crates/stackforge-core/src/flow/tcp_state.rs +451 -0
  16. stackforge-0.4.0/crates/stackforge-core/src/flow/udp_state.rs +71 -0
  17. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/arp.rs +97 -55
  18. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/bindings.rs +15 -3
  19. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dns/bitmap.rs +3 -3
  20. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dns/builder.rs +21 -0
  21. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dns/edns.rs +28 -25
  22. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dns/header.rs +5 -4
  23. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dns/mod.rs +4 -2
  24. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dns/query.rs +5 -0
  25. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dns/rdata.rs +73 -79
  26. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dns/rr.rs +11 -1
  27. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dns/svcb.rs +20 -13
  28. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dns/types.rs +13 -4
  29. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot11/builder.rs +54 -13
  30. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot11/control.rs +17 -1
  31. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot11/data.rs +15 -10
  32. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot11/ie.rs +107 -31
  33. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot11/management.rs +52 -8
  34. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot11/mod.rs +39 -33
  35. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot11/radiotap.rs +51 -42
  36. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot11/security.rs +41 -26
  37. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot11/types.rs +19 -3
  38. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot15d4/beacon.rs +6 -4
  39. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot15d4/builder.rs +52 -7
  40. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot15d4/command.rs +15 -13
  41. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot15d4/crc.rs +4 -1
  42. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot15d4/mod.rs +57 -38
  43. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot15d4/security.rs +19 -27
  44. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/dot15d4/types.rs +9 -0
  45. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ethernet.rs +52 -22
  46. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/field.rs +82 -48
  47. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/field_ext.rs +14 -6
  48. stackforge-0.4.0/crates/stackforge-core/src/layer/ftp/builder.rs +443 -0
  49. stackforge-0.4.0/crates/stackforge-core/src/layer/ftp/mod.rs +599 -0
  50. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/generic/builder.rs +11 -1
  51. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/generic/mod.rs +22 -17
  52. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/http/builder.rs +13 -0
  53. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/http/detection.rs +3 -0
  54. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/http/mod.rs +27 -10
  55. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/http/request.rs +3 -6
  56. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/http/response.rs +3 -6
  57. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/http2/builder.rs +45 -13
  58. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/http2/frames.rs +44 -23
  59. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/http2/hpack.rs +36 -21
  60. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/http2/mod.rs +22 -13
  61. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/icmp/builder.rs +23 -0
  62. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/icmp/checksum.rs +2 -0
  63. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/icmp/error.rs +2 -0
  64. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/icmp/extensions.rs +12 -3
  65. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/icmp/mod.rs +41 -49
  66. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/icmp/types.rs +2 -0
  67. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/icmpv6/builder.rs +37 -16
  68. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/icmpv6/mod.rs +50 -41
  69. stackforge-0.4.0/crates/stackforge-core/src/layer/imap/builder.rs +466 -0
  70. stackforge-0.4.0/crates/stackforge-core/src/layer/imap/mod.rs +602 -0
  71. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ipv4/builder.rs +49 -4
  72. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ipv4/checksum.rs +18 -11
  73. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ipv4/fragmentation.rs +22 -14
  74. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ipv4/header.rs +31 -14
  75. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ipv4/options.rs +73 -51
  76. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ipv4/protocol.rs +5 -3
  77. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ipv4/routing.rs +21 -1
  78. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ipv4/ttl.rs +2 -0
  79. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ipv6/builder.rs +18 -6
  80. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ipv6/ext_headers.rs +16 -9
  81. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ipv6/mod.rs +15 -7
  82. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/l2tp/builder.rs +22 -24
  83. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/l2tp/mod.rs +20 -22
  84. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/mod.rs +480 -232
  85. stackforge-0.4.0/crates/stackforge-core/src/layer/modbus/builder.rs +620 -0
  86. stackforge-0.4.0/crates/stackforge-core/src/layer/modbus/crc.rs +169 -0
  87. stackforge-0.4.0/crates/stackforge-core/src/layer/modbus/mod.rs +866 -0
  88. stackforge-0.4.0/crates/stackforge-core/src/layer/mqtt/builder.rs +781 -0
  89. stackforge-0.4.0/crates/stackforge-core/src/layer/mqtt/mod.rs +1295 -0
  90. stackforge-0.4.0/crates/stackforge-core/src/layer/mqttsn/builder.rs +1095 -0
  91. stackforge-0.4.0/crates/stackforge-core/src/layer/mqttsn/mod.rs +1284 -0
  92. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/neighbor.rs +39 -20
  93. stackforge-0.4.0/crates/stackforge-core/src/layer/pop3/builder.rs +353 -0
  94. stackforge-0.4.0/crates/stackforge-core/src/layer/pop3/mod.rs +382 -0
  95. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/quic/builder.rs +12 -1
  96. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/quic/frames.rs +38 -36
  97. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/quic/headers.rs +6 -1
  98. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/quic/mod.rs +43 -38
  99. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/quic/varint.rs +12 -13
  100. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/raw.rs +42 -13
  101. stackforge-0.4.0/crates/stackforge-core/src/layer/smtp/builder.rs +354 -0
  102. stackforge-0.4.0/crates/stackforge-core/src/layer/smtp/mod.rs +544 -0
  103. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ssh/builder.rs +6 -1
  104. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ssh/mod.rs +16 -10
  105. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/stack.rs +138 -26
  106. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tcp/builder.rs +66 -7
  107. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tcp/checksum.rs +15 -7
  108. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tcp/flags.rs +22 -7
  109. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tcp/header.rs +28 -29
  110. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tcp/options.rs +82 -45
  111. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tcp/services.rs +4 -1
  112. stackforge-0.4.0/crates/stackforge-core/src/layer/tftp/builder.rs +262 -0
  113. stackforge-0.4.0/crates/stackforge-core/src/layer/tftp/mod.rs +585 -0
  114. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/builder.rs +18 -1
  115. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/cert.rs +8 -0
  116. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/crypto/cipher_aead.rs +4 -2
  117. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/crypto/cipher_block.rs +6 -5
  118. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/crypto/cipher_stream.rs +2 -1
  119. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/crypto/compression.rs +3 -0
  120. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/crypto/groups.rs +5 -0
  121. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/crypto/hash.rs +12 -7
  122. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/crypto/hkdf_tls13.rs +21 -7
  123. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/crypto/hmac_tls.rs +13 -8
  124. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/crypto/prf.rs +15 -9
  125. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/crypto/suites.rs +6 -3
  126. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/extensions/common.rs +14 -3
  127. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/extensions/key_share.rs +8 -4
  128. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/extensions/mod.rs +9 -2
  129. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/extensions/signature_algorithms.rs +3 -1
  130. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/extensions/sni.rs +2 -0
  131. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/extensions/supported_versions.rs +10 -6
  132. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/handshake/certificate.rs +9 -3
  133. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/handshake/client_hello.rs +11 -5
  134. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/handshake/finished.rs +4 -2
  135. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/handshake/key_exchange.rs +11 -7
  136. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/handshake/mod.rs +6 -1
  137. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/handshake/server_hello.rs +17 -11
  138. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/keyexchange/ecdhe.rs +8 -2
  139. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/mod.rs +2 -1
  140. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/record.rs +13 -10
  141. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/session.rs +9 -5
  142. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/sslv2/handshake.rs +15 -10
  143. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/sslv2/mod.rs +7 -6
  144. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/sslv2/record.rs +8 -5
  145. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/types.rs +17 -1
  146. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/udp/builder.rs +31 -4
  147. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/udp/checksum.rs +12 -8
  148. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/udp/mod.rs +13 -13
  149. stackforge-0.4.0/crates/stackforge-core/src/layer/zwave/builder.rs +423 -0
  150. stackforge-0.4.0/crates/stackforge-core/src/layer/zwave/mod.rs +1238 -0
  151. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/lib.rs +27 -1
  152. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/packet.rs +128 -14
  153. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/pcap/reader.rs +3 -3
  154. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/pcap/writer.rs +6 -6
  155. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/utils/bits.rs +5 -0
  156. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/utils/checksum.rs +7 -2
  157. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/utils/compare.rs +8 -10
  158. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/utils/hex.rs +13 -9
  159. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/utils/padding.rs +4 -1
  160. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/utils/random.rs +2 -0
  161. {stackforge-0.3.0 → stackforge-0.4.0}/python/stackforge/__init__.py +28 -0
  162. {stackforge-0.3.0 → stackforge-0.4.0}/src/lib.rs +1439 -222
  163. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/dns.rs +5 -5
  164. stackforge-0.4.0/tests/integration/ftp.rs +519 -0
  165. stackforge-0.4.0/tests/integration/imap.rs +537 -0
  166. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/main.rs +8 -0
  167. stackforge-0.4.0/tests/integration/modbus.rs +508 -0
  168. stackforge-0.4.0/tests/integration/mqtt.rs +384 -0
  169. stackforge-0.4.0/tests/integration/pop3.rs +490 -0
  170. stackforge-0.4.0/tests/integration/smtp.rs +517 -0
  171. stackforge-0.4.0/tests/integration/tftp.rs +354 -0
  172. stackforge-0.4.0/tests/integration/zwave.rs +318 -0
  173. stackforge-0.4.0/tests/python/test_flow.py +370 -0
  174. stackforge-0.4.0/tests/python/test_ftp.py +469 -0
  175. stackforge-0.4.0/tests/python/test_imap.py +427 -0
  176. stackforge-0.4.0/tests/python/test_modbus.py +583 -0
  177. stackforge-0.4.0/tests/python/test_mqtt.py +612 -0
  178. stackforge-0.4.0/tests/python/test_mqttsn.py +558 -0
  179. stackforge-0.4.0/tests/python/test_pop3.py +414 -0
  180. stackforge-0.4.0/tests/python/test_smtp.py +452 -0
  181. stackforge-0.4.0/tests/python/test_tftp.py +263 -0
  182. stackforge-0.4.0/tests/python/test_uts_ftp.py +356 -0
  183. stackforge-0.4.0/tests/python/test_uts_imap.py +388 -0
  184. stackforge-0.4.0/tests/python/test_uts_modbus.py +568 -0
  185. stackforge-0.4.0/tests/python/test_uts_mqtt.py +485 -0
  186. stackforge-0.4.0/tests/python/test_uts_mqttsn.py +593 -0
  187. stackforge-0.4.0/tests/python/test_uts_pop3.py +386 -0
  188. stackforge-0.4.0/tests/python/test_uts_smtp.py +364 -0
  189. stackforge-0.4.0/tests/python/test_uts_tftp.py +326 -0
  190. stackforge-0.4.0/tests/python/test_uts_zwave.py +331 -0
  191. stackforge-0.4.0/tests/python/test_zwave.py +493 -0
  192. stackforge-0.4.0/tests/uts/ftp.uts +119 -0
  193. stackforge-0.4.0/tests/uts/imap.uts +147 -0
  194. stackforge-0.4.0/tests/uts/modbus.uts +542 -0
  195. stackforge-0.4.0/tests/uts/mqtt.uts +189 -0
  196. stackforge-0.4.0/tests/uts/mqttsn.uts +818 -0
  197. stackforge-0.4.0/tests/uts/pop3.uts +126 -0
  198. stackforge-0.4.0/tests/uts/smtp.uts +128 -0
  199. stackforge-0.4.0/tests/uts/tftp.uts +92 -0
  200. stackforge-0.4.0/tests/uts/zwave.uts +113 -0
  201. stackforge-0.3.0/CONTRIBUTING.md +0 -63
  202. stackforge-0.3.0/PKG-INFO +0 -208
  203. stackforge-0.3.0/README.md +0 -183
  204. {stackforge-0.3.0 → stackforge-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  205. {stackforge-0.3.0 → stackforge-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  206. {stackforge-0.3.0 → stackforge-0.4.0}/.github/workflows/release.yml +0 -0
  207. {stackforge-0.3.0 → stackforge-0.4.0}/.github/workflows/test.yml +0 -0
  208. {stackforge-0.3.0 → stackforge-0.4.0}/.gitignore +0 -0
  209. {stackforge-0.3.0 → stackforge-0.4.0}/.pre-commit-config.yaml +0 -0
  210. {stackforge-0.3.0 → stackforge-0.4.0}/.python-version +0 -0
  211. {stackforge-0.3.0 → stackforge-0.4.0}/CLAUDE.md +0 -0
  212. {stackforge-0.3.0 → stackforge-0.4.0}/CODE_OF_CONDUCT.md +0 -0
  213. {stackforge-0.3.0 → stackforge-0.4.0}/LICENSE +0 -0
  214. {stackforge-0.3.0 → stackforge-0.4.0}/cliff.toml +0 -0
  215. {stackforge-0.3.0 → stackforge-0.4.0}/cog.toml +0 -0
  216. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-automata/Cargo.toml +0 -0
  217. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-automata/src/lib.rs +0 -0
  218. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/ipv4/mod.rs +0 -0
  219. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tcp/mod.rs +0 -0
  220. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/crypto/mod.rs +0 -0
  221. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/layer/tls/keyexchange/mod.rs +0 -0
  222. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/pcap/mod.rs +0 -0
  223. {stackforge-0.3.0 → stackforge-0.4.0}/crates/stackforge-core/src/utils/mod.rs +0 -0
  224. {stackforge-0.3.0 → stackforge-0.4.0}/pyproject.toml +0 -0
  225. {stackforge-0.3.0 → stackforge-0.4.0}/python/stackforge/custom.py +0 -0
  226. {stackforge-0.3.0 → stackforge-0.4.0}/rust-toolchain.toml +0 -0
  227. {stackforge-0.3.0 → stackforge-0.4.0}/rustfmt.toml +0 -0
  228. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/arp.rs +0 -0
  229. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/compat_tests/arp_compat.rs +0 -0
  230. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/compat_tests/ethernet_compat.rs +0 -0
  231. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/compat_tests/icmp_compat.rs +0 -0
  232. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/compat_tests/ipv4_compat.rs +0 -0
  233. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/compat_tests/mod.rs +0 -0
  234. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/compat_tests/ssh_compat.rs +0 -0
  235. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/compat_tests/tcp_compat.rs +0 -0
  236. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/compat_tests/tls_compat.rs +0 -0
  237. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/compat_tests/udp_compat.rs +0 -0
  238. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/dot11.rs +0 -0
  239. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/dot15d4.rs +0 -0
  240. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/ethernet.rs +0 -0
  241. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/field.rs +0 -0
  242. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/http.rs +0 -0
  243. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/http2.rs +0 -0
  244. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/icmpv6.rs +0 -0
  245. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/ipv6.rs +0 -0
  246. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/layer.rs +0 -0
  247. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/packet.rs +0 -0
  248. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/quic.rs +0 -0
  249. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/ssh.rs +0 -0
  250. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/tls.rs +0 -0
  251. {stackforge-0.3.0 → stackforge-0.4.0}/tests/integration/util.rs +0 -0
  252. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/scapy_compat/__init__.py +0 -0
  253. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/scapy_compat/conftest.py +0 -0
  254. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/scapy_compat/test_arp_compat.py +0 -0
  255. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/scapy_compat/test_checksums_compat.py +0 -0
  256. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/scapy_compat/test_edge_cases_compat.py +0 -0
  257. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/scapy_compat/test_ethernet_compat.py +0 -0
  258. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/scapy_compat/test_icmp_compat.py +0 -0
  259. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/scapy_compat/test_ipv4_compat.py +0 -0
  260. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/scapy_compat/test_pcap_compat.py +0 -0
  261. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/scapy_compat/test_stacking_compat.py +0 -0
  262. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/scapy_compat/test_tcp_compat.py +0 -0
  263. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/scapy_compat/test_udp_compat.py +0 -0
  264. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/scapy_compat/test_uts_integration.py +0 -0
  265. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_core.py +0 -0
  266. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_custom.py +0 -0
  267. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_dns.py +0 -0
  268. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_dot11.py +0 -0
  269. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_dot15d4.py +0 -0
  270. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_http.py +0 -0
  271. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_icmpv6.py +0 -0
  272. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_ipv6.py +0 -0
  273. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_l2tp.py +0 -0
  274. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_pcap.py +0 -0
  275. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_quic.py +0 -0
  276. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_ssh.py +0 -0
  277. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_tls.py +0 -0
  278. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_udp_icmp.py +0 -0
  279. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_uts_http.py +0 -0
  280. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_uts_http2.py +0 -0
  281. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_uts_ipv6.py +0 -0
  282. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_uts_l2tp.py +0 -0
  283. {stackforge-0.3.0 → stackforge-0.4.0}/tests/python/test_uts_quic.py +0 -0
  284. {stackforge-0.3.0 → stackforge-0.4.0}/tests/sample_pcap/http2_h2c.pcap +0 -0
  285. {stackforge-0.3.0 → stackforge-0.4.0}/tests/sample_pcap/http_chunk.pcap +0 -0
  286. {stackforge-0.3.0 → stackforge-0.4.0}/tests/sample_pcap/http_compressed-brotli.pcap +0 -0
  287. {stackforge-0.3.0 → stackforge-0.4.0}/tests/sample_pcap/http_compressed-zstd.pcap +0 -0
  288. {stackforge-0.3.0 → stackforge-0.4.0}/tests/sample_pcap/http_compressed.pcap +0 -0
  289. {stackforge-0.3.0 → stackforge-0.4.0}/tests/sample_pcap/http_content_length.pcap +0 -0
  290. {stackforge-0.3.0 → stackforge-0.4.0}/tests/sample_pcap/http_head.pcapng +0 -0
  291. {stackforge-0.3.0 → stackforge-0.4.0}/tests/sample_pcap/http_tcp_psh.pcap +0 -0
  292. {stackforge-0.3.0 → stackforge-0.4.0}/tests/sample_pcap/ssh_ed25519.pcap +0 -0
  293. {stackforge-0.3.0 → stackforge-0.4.0}/tests/sample_pcap/tcprelay/PCAP.md +0 -0
  294. {stackforge-0.3.0 → stackforge-0.4.0}/tests/sample_pcap/tcprelay/smallFlows.pcap +0 -0
  295. {stackforge-0.3.0 → stackforge-0.4.0}/tests/sample_pcap/tcprelay/test.pcap +0 -0
  296. {stackforge-0.3.0 → stackforge-0.4.0}/tests/scripts/compare_packets.py +0 -0
  297. {stackforge-0.3.0 → stackforge-0.4.0}/tests/scripts/generate_scapy_fixtures.py +0 -0
  298. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/dns.uts +0 -0
  299. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/dns_dnssec.uts +0 -0
  300. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/dns_edns0.uts +0 -0
  301. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/dot11.uts +0 -0
  302. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/dot15d4.uts +0 -0
  303. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/fields.uts +0 -0
  304. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/http.uts +0 -0
  305. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/http2.uts +0 -0
  306. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/inet.uts +0 -0
  307. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/inet6 copy.uts +0 -0
  308. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/inet6.uts +0 -0
  309. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/l2.uts +0 -0
  310. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/l2tp.uts +0 -0
  311. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/quic.uts +0 -0
  312. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/ssh.uts +0 -0
  313. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/__init__.py +0 -0
  314. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/cert.uts +0 -0
  315. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/example_client.py +0 -0
  316. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/example_server.py +0 -0
  317. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/pki/README.md +0 -0
  318. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/pki/ca_cert.pem +0 -0
  319. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/pki/ca_key.pem +0 -0
  320. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/pki/cli_cert.pem +0 -0
  321. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/pki/cli_key.pem +0 -0
  322. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/pki/srv_cert.pem +0 -0
  323. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/pki/srv_cert_ed25519.pem +0 -0
  324. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/pki/srv_key.pem +0 -0
  325. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/pki/srv_key_ed25519.pem +0 -0
  326. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/sslv2.uts +0 -0
  327. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/tls.uts +0 -0
  328. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/tls13.uts +0 -0
  329. {stackforge-0.3.0 → stackforge-0.4.0}/tests/uts/tls/tlsclientserver.uts +0 -0
  330. {stackforge-0.3.0 → stackforge-0.4.0}/uv.lock +0 -0
@@ -0,0 +1,238 @@
1
+ # Contributing to Stackforge
2
+
3
+ Thank you for your interest in contributing! We welcome bug reports, feature requests, and pull requests.
4
+
5
+ ## Prerequisites
6
+
7
+ - **Rust:** Stable toolchain — install via [rustup](https://rustup.rs/)
8
+ - **Python:** 3.13 or higher
9
+ - **uv:** Fast Python package manager — install via [astral.sh/uv](https://docs.astral.sh/uv/)
10
+ - **cog:** Conventional commit tool — install via `cargo install cocogitto`
11
+
12
+ ## Setting Up the Environment
13
+
14
+ ```bash
15
+ # 1. Clone the repository
16
+ git clone https://github.com/LaBackDoor/stackforge.git
17
+ cd stackforge
18
+
19
+ # 2. Sync Python dependencies
20
+ uv sync
21
+
22
+ # 3. Compile the Rust extension and install in editable mode
23
+ uv run maturin develop
24
+ ```
25
+
26
+ > Re-run `uv run maturin develop` any time you change Rust code.
27
+
28
+ ## Project Structure
29
+
30
+ ```
31
+ stackforge/
32
+ ├── crates/
33
+ │ ├── stackforge-core/ # Core Rust library (published to crates.io)
34
+ │ │ └── src/
35
+ │ │ ├── layer/ # Protocol implementations
36
+ │ │ │ ├── mod.rs # LayerKind enum, Layer trait, LayerEnum dispatch
37
+ │ │ │ ├── bindings.rs # Protocol detection rules (ethertype, port → layer)
38
+ │ │ │ ├── field.rs # Field abstractions (MacAddress, BytesField, etc.)
39
+ │ │ │ ├── ethernet.rs
40
+ │ │ │ ├── arp.rs
41
+ │ │ │ ├── ipv4/
42
+ │ │ │ ├── ipv6/
43
+ │ │ │ ├── tcp/
44
+ │ │ │ ├── udp/
45
+ │ │ │ ├── icmp/
46
+ │ │ │ ├── icmpv6/
47
+ │ │ │ ├── dns/
48
+ │ │ │ ├── http/
49
+ │ │ │ ├── http2/
50
+ │ │ │ ├── quic/
51
+ │ │ │ ├── l2tp/
52
+ │ │ │ ├── ssh/
53
+ │ │ │ ├── tls/
54
+ │ │ │ ├── dot11/ # 802.11 Wi-Fi
55
+ │ │ │ ├── dot15d4/ # 802.15.4 Zigbee
56
+ │ │ │ └── generic/ # Runtime custom protocols
57
+ │ │ ├── packet.rs
58
+ │ │ └── lib.rs
59
+ │ └── stackforge-automata/ # Async state machine framework (planned)
60
+ ├── src/
61
+ │ └── lib.rs # PyO3 bindings
62
+ ├── python/
63
+ │ └── stackforge/
64
+ │ ├── __init__.py # Python re-exports
65
+ │ └── custom.py # CustomLayer + typed fields
66
+ └── tests/
67
+ ├── integration/ # Rust integration tests
68
+ ├── python/ # Python tests (pytest)
69
+ │ └── scapy_compat/ # Scapy behavioural compatibility tests
70
+ ├── uts/ # UTS regression test suites (Scapy-format)
71
+ └── sample_pcap/ # PCAP fixtures
72
+ ```
73
+
74
+ ## Running Tests
75
+
76
+ ### Rust tests
77
+
78
+ ```bash
79
+ # All unit + integration tests
80
+ cargo test
81
+
82
+ # Single test by name
83
+ cargo test test_name
84
+
85
+ # Single integration file
86
+ cargo test --test integration dns
87
+ ```
88
+
89
+ ### Python tests
90
+
91
+ ```bash
92
+ # All Python tests
93
+ uv run pytest tests/python
94
+
95
+ # Single file
96
+ uv run pytest tests/python/test_dns.py
97
+
98
+ # Single test
99
+ uv run pytest tests/python/test_dns.py::test_dns_query_build
100
+
101
+ # Scapy compatibility tests only
102
+ uv run pytest tests/python/scapy_compat
103
+
104
+ # Verbose output
105
+ uv run pytest -v tests/python
106
+ ```
107
+
108
+ ### UTS regression tests
109
+
110
+ UTS files in `tests/uts/` are Scapy-format regression suites run via the Python test suite:
111
+
112
+ ```bash
113
+ uv run pytest tests/python/scapy_compat/test_uts_integration.py
114
+ ```
115
+
116
+ ## Linting and Formatting
117
+
118
+ All of the following must pass before submitting a PR:
119
+
120
+ ```bash
121
+ # Rust
122
+ cargo fmt
123
+ cargo clippy
124
+
125
+ # Python
126
+ uv run ruff check .
127
+ ```
128
+
129
+ ## Adding a New Protocol Layer
130
+
131
+ Follow the existing pattern used by layers like `dns`, `http`, or `quic`.
132
+
133
+ ### 1. Create the layer module
134
+
135
+ ```
136
+ crates/stackforge-core/src/layer/<proto>/
137
+ ├── mod.rs # Layer struct, parse(), fields, Layer trait impl
138
+ └── builder.rs # (optional) Builder for constructing packets
139
+ ```
140
+
141
+ The layer struct holds `start`/`end` offsets into a shared `Bytes` buffer — it does **not** copy field values on parse. Fields are read on demand:
142
+
143
+ ```rust
144
+ pub struct MyProtoLayer {
145
+ start: usize,
146
+ end: usize,
147
+ }
148
+
149
+ impl MyProtoLayer {
150
+ pub fn my_field<'a>(&self, buf: &'a [u8]) -> u16 {
151
+ u16::from_be_bytes(buf[self.start..self.start + 2].try_into().unwrap())
152
+ }
153
+ }
154
+ ```
155
+
156
+ ### 2. Register the `LayerKind` variant
157
+
158
+ In `crates/stackforge-core/src/layer/mod.rs`, add a variant to the `LayerKind` enum and handle it in `LayerEnum`.
159
+
160
+ ### 3. Add detection rules
161
+
162
+ In `crates/stackforge-core/src/layer/bindings.rs`, register how the new layer is detected (e.g., from an ethertype, IP protocol number, or TCP/UDP port).
163
+
164
+ ### 4. Expose via PyO3
165
+
166
+ If the layer needs Python-accessible fields, add them to the `PyO3` bindings in `src/lib.rs`.
167
+
168
+ ### 5. Write tests
169
+
170
+ - **Rust:** Add `tests/integration/<proto>.rs` with parse and build tests.
171
+ - **Python:** Add `tests/python/test_<proto>.py` covering field access, builders, and edge cases.
172
+ - **UTS (optional):** Add `tests/uts/<proto>.uts` for Scapy-format regression tests.
173
+
174
+ ## Architecture Notes
175
+
176
+ - **Lazy Zero-Copy View** — `Packet::parse()` only records layer boundaries (offsets). Field values are read directly from the buffer when accessed, with no upfront copying.
177
+ - **Copy-on-Write Mutation** — The underlying `Bytes` buffer is only cloned when a mutation occurs on a shared packet.
178
+ - **`Packet(raw)` is unparsed** — always call `.parse()` before accessing layers or fields.
179
+ - **`Packet::parse()` assumes Ethernet first** — Dot11 and Dot15d4 frames require a dedicated parse entry point.
180
+
181
+ ## Commit Messages
182
+
183
+ This project uses [Conventional Commits](https://www.conventionalcommits.org/) enforced by [cocogitto](https://docs.cocogitto.io/) (`cog`). All commits must follow the format:
184
+
185
+ ```
186
+ <type>(<scope>): <description>
187
+
188
+ [optional body]
189
+ ```
190
+
191
+ Common types:
192
+
193
+ | Type | When to use |
194
+ |------|-------------|
195
+ | `feat` | New feature or protocol |
196
+ | `fix` | Bug fix |
197
+ | `chore` | Maintenance, dependency updates, CI |
198
+ | `docs` | Documentation only |
199
+ | `test` | Adding or fixing tests |
200
+ | `refactor` | Code restructuring with no behaviour change |
201
+ | `perf` | Performance improvement |
202
+
203
+ Use `cog commit` instead of `git commit` to get an interactive prompt that validates the format:
204
+
205
+ ```bash
206
+ cog commit feat "add OSPF layer"
207
+ cog commit fix "correct DNS name compression offset"
208
+ ```
209
+
210
+ Breaking changes must include a `!` after the type or a `BREAKING CHANGE:` footer:
211
+
212
+ ```bash
213
+ cog commit feat! "redesign Layer trait interface"
214
+ ```
215
+
216
+ ## Versioning and Changelog
217
+
218
+ Versions and the changelog are managed by `cog`. Maintainers cut releases with:
219
+
220
+ ```bash
221
+ # Bump version automatically based on commit history (patch / minor / major)
222
+ cog bump --auto
223
+
224
+ # Or bump explicitly
225
+ cog bump --patch
226
+ cog bump --minor
227
+ cog bump --major
228
+ ```
229
+
230
+ `cog bump` runs `pre_bump_hooks` (updates `Cargo.toml` version), tags the commit, and regenerates `CHANGELOG.md` from the commit history. Contributors do not need to edit `CHANGELOG.md` manually.
231
+
232
+ ## Pull Request Process
233
+
234
+ 1. Fork the repo and create your branch from `main`.
235
+ 2. Add tests for any new behaviour — both Rust and Python.
236
+ 3. Ensure all tests pass: `cargo test` and `uv run pytest tests/python`.
237
+ 4. Ensure linting passes: `cargo fmt && cargo clippy && uv run ruff check .`
238
+ 5. Open a pull request with a clear description of what changed and why.
@@ -67,6 +67,12 @@ version = "1.3.2"
67
67
  source = "registry+https://github.com/rust-lang/crates.io-index"
68
68
  checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
69
69
 
70
+ [[package]]
71
+ name = "bitflags"
72
+ version = "2.11.0"
73
+ source = "registry+https://github.com/rust-lang/crates.io-index"
74
+ checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
75
+
70
76
  [[package]]
71
77
  name = "block-buffer"
72
78
  version = "0.10.4"
@@ -187,6 +193,12 @@ dependencies = [
187
193
  "libc",
188
194
  ]
189
195
 
196
+ [[package]]
197
+ name = "crossbeam-utils"
198
+ version = "0.8.21"
199
+ source = "registry+https://github.com/rust-lang/crates.io-index"
200
+ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
201
+
190
202
  [[package]]
191
203
  name = "crypto-bigint"
192
204
  version = "0.5.5"
@@ -245,6 +257,20 @@ dependencies = [
245
257
  "syn 2.0.112",
246
258
  ]
247
259
 
260
+ [[package]]
261
+ name = "dashmap"
262
+ version = "6.1.0"
263
+ source = "registry+https://github.com/rust-lang/crates.io-index"
264
+ checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf"
265
+ dependencies = [
266
+ "cfg-if",
267
+ "crossbeam-utils",
268
+ "hashbrown",
269
+ "lock_api",
270
+ "once_cell",
271
+ "parking_lot_core",
272
+ ]
273
+
248
274
  [[package]]
249
275
  name = "default-net"
250
276
  version = "0.22.0"
@@ -422,6 +448,12 @@ dependencies = [
422
448
  "subtle",
423
449
  ]
424
450
 
451
+ [[package]]
452
+ name = "hashbrown"
453
+ version = "0.14.5"
454
+ source = "registry+https://github.com/rust-lang/crates.io-index"
455
+ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
456
+
425
457
  [[package]]
426
458
  name = "heck"
427
459
  version = "0.5.0"
@@ -480,6 +512,15 @@ version = "0.2.178"
480
512
  source = "registry+https://github.com/rust-lang/crates.io-index"
481
513
  checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091"
482
514
 
515
+ [[package]]
516
+ name = "lock_api"
517
+ version = "0.4.14"
518
+ source = "registry+https://github.com/rust-lang/crates.io-index"
519
+ checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
520
+ dependencies = [
521
+ "scopeguard",
522
+ ]
523
+
483
524
  [[package]]
484
525
  name = "log"
485
526
  version = "0.4.29"
@@ -529,7 +570,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
529
570
  checksum = "053998cea5a306971f88580d0829e90f270f940befd7cf928da179d4187a5a66"
530
571
  dependencies = [
531
572
  "anyhow",
532
- "bitflags",
573
+ "bitflags 1.3.2",
533
574
  "byteorder",
534
575
  "libc",
535
576
  "netlink-packet-core",
@@ -589,6 +630,19 @@ dependencies = [
589
630
  "sha2",
590
631
  ]
591
632
 
633
+ [[package]]
634
+ name = "parking_lot_core"
635
+ version = "0.9.12"
636
+ source = "registry+https://github.com/rust-lang/crates.io-index"
637
+ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
638
+ dependencies = [
639
+ "cfg-if",
640
+ "libc",
641
+ "redox_syscall",
642
+ "smallvec",
643
+ "windows-link",
644
+ ]
645
+
592
646
  [[package]]
593
647
  name = "paste"
594
648
  version = "1.0.15"
@@ -836,6 +890,15 @@ dependencies = [
836
890
  "cipher",
837
891
  ]
838
892
 
893
+ [[package]]
894
+ name = "redox_syscall"
895
+ version = "0.5.18"
896
+ source = "registry+https://github.com/rust-lang/crates.io-index"
897
+ checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
898
+ dependencies = [
899
+ "bitflags 2.11.0",
900
+ ]
901
+
839
902
  [[package]]
840
903
  name = "rfc6979"
841
904
  version = "0.4.0"
@@ -861,6 +924,12 @@ version = "1.0.22"
861
924
  source = "registry+https://github.com/rust-lang/crates.io-index"
862
925
  checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
863
926
 
927
+ [[package]]
928
+ name = "scopeguard"
929
+ version = "1.2.0"
930
+ source = "registry+https://github.com/rust-lang/crates.io-index"
931
+ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
932
+
864
933
  [[package]]
865
934
  name = "sec1"
866
935
  version = "0.7.3"
@@ -961,7 +1030,7 @@ dependencies = [
961
1030
 
962
1031
  [[package]]
963
1032
  name = "stackforge"
964
- version = "0.3.0"
1033
+ version = "0.4.0"
965
1034
  dependencies = [
966
1035
  "pyo3",
967
1036
  "stackforge-automata",
@@ -970,7 +1039,7 @@ dependencies = [
970
1039
 
971
1040
  [[package]]
972
1041
  name = "stackforge-automata"
973
- version = "0.3.0"
1042
+ version = "0.4.0"
974
1043
  dependencies = [
975
1044
  "bytes",
976
1045
  "stackforge-core",
@@ -978,13 +1047,14 @@ dependencies = [
978
1047
 
979
1048
  [[package]]
980
1049
  name = "stackforge-core"
981
- version = "0.3.0"
1050
+ version = "0.4.0"
982
1051
  dependencies = [
983
1052
  "aes",
984
1053
  "aes-gcm",
985
1054
  "bytes",
986
1055
  "cbc",
987
1056
  "chacha20poly1305",
1057
+ "dashmap",
988
1058
  "default-net",
989
1059
  "des",
990
1060
  "digest",
@@ -1037,7 +1107,7 @@ version = "0.5.1"
1037
1107
  source = "registry+https://github.com/rust-lang/crates.io-index"
1038
1108
  checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
1039
1109
  dependencies = [
1040
- "bitflags",
1110
+ "bitflags 1.3.2",
1041
1111
  "core-foundation",
1042
1112
  "system-configuration-sys",
1043
1113
  ]
@@ -1178,6 +1248,12 @@ dependencies = [
1178
1248
  "windows-targets",
1179
1249
  ]
1180
1250
 
1251
+ [[package]]
1252
+ name = "windows-link"
1253
+ version = "0.2.1"
1254
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1255
+ checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
1256
+
1181
1257
  [[package]]
1182
1258
  name = "windows-targets"
1183
1259
  version = "0.48.5"
@@ -21,7 +21,7 @@ shared-version = true
21
21
  tag-name = "v{{version}}"
22
22
 
23
23
  [workspace.package]
24
- version = "0.3.0"
24
+ version = "0.4.0"
25
25
  edition = "2024"
26
26
  license = "GPL-3.0-only"
27
27
  authors = ["Stackforge Contributors"]
@@ -31,6 +31,7 @@ repository = "https://github.com/LaBackDoor/stackforge"
31
31
  bytes = "1.11.0"
32
32
  smallvec = "1.15.1"
33
33
  thiserror = "2.0.17"
34
+ dashmap = "6.1"
34
35
  stackforge-core = { path = "crates/stackforge-core" }
35
36
  stackforge-automata = { path = "crates/stackforge-automata" }
36
37