ronin-support 0.5.1 → 1.0.0.beta1

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 (517) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +11 -0
  3. data/.github/workflows/ruby.yml +27 -0
  4. data/.gitignore +7 -6
  5. data/.mailmap +1 -0
  6. data/.ruby-version +1 -0
  7. data/.yardopts +1 -2
  8. data/ChangeLog.md +533 -137
  9. data/Gemfile +20 -20
  10. data/README.md +137 -61
  11. data/Rakefile +29 -10
  12. data/data/text/homoglyphs/ascii.txt +8 -0
  13. data/data/text/homoglyphs/cyrillic.txt +33 -0
  14. data/data/text/homoglyphs/full_width.txt +81 -0
  15. data/data/text/homoglyphs/greek.txt +21 -0
  16. data/data/text/homoglyphs/latin_numbers.txt +14 -0
  17. data/data/text/homoglyphs/punctuation.txt +7 -0
  18. data/data/text/patterns/network/public_suffix.rb.erb +44 -0
  19. data/examples/ssl_proxy.rb +38 -0
  20. data/examples/tcp_proxy.rb +41 -0
  21. data/gemspec.yml +25 -15
  22. data/lib/ronin/support/archive/core_ext/file.rb +118 -0
  23. data/lib/ronin/{formatting/sql.rb → support/archive/core_ext.rb} +6 -7
  24. data/lib/ronin/support/archive/mixin.rb +213 -0
  25. data/lib/ronin/support/archive/tar/reader.rb +135 -0
  26. data/lib/ronin/support/archive/tar/writer.rb +197 -0
  27. data/lib/ronin/support/archive/tar.rb +155 -0
  28. data/lib/ronin/support/archive/zip/reader/entry.rb +134 -0
  29. data/lib/ronin/support/archive/zip/reader/statistics.rb +76 -0
  30. data/lib/ronin/support/archive/zip/reader.rb +273 -0
  31. data/lib/ronin/support/archive/zip/writer.rb +175 -0
  32. data/lib/ronin/support/archive/zip.rb +105 -0
  33. data/lib/ronin/support/archive.rb +211 -0
  34. data/lib/ronin/support/binary/array.rb +255 -0
  35. data/lib/ronin/support/binary/bit_flip.rb +147 -0
  36. data/lib/ronin/support/binary/buffer.rb +2027 -0
  37. data/lib/ronin/support/binary/byte_slice.rb +324 -0
  38. data/lib/ronin/support/binary/core_ext/array.rb +75 -0
  39. data/lib/ronin/support/binary/core_ext/float.rb +80 -0
  40. data/lib/ronin/support/binary/core_ext/integer.rb +305 -0
  41. data/lib/ronin/support/binary/core_ext/io.rb +38 -0
  42. data/lib/ronin/support/binary/core_ext/string.rb +115 -0
  43. data/lib/ronin/{formatting/extensions/text.rb → support/binary/core_ext.rb} +9 -9
  44. data/lib/ronin/support/binary/cstring.rb +259 -0
  45. data/lib/ronin/support/binary/ctypes/aggregate_type.rb +98 -0
  46. data/lib/ronin/support/binary/ctypes/arch/arm/big_endian.rb +77 -0
  47. data/lib/ronin/support/binary/ctypes/arch/arm.rb +75 -0
  48. data/lib/ronin/support/binary/ctypes/arch/arm64/big_endian.rb +77 -0
  49. data/lib/ronin/support/binary/ctypes/arch/arm64.rb +75 -0
  50. data/lib/ronin/support/binary/ctypes/arch/mips/little_endian.rb +77 -0
  51. data/lib/ronin/support/binary/ctypes/arch/mips.rb +75 -0
  52. data/lib/ronin/support/binary/ctypes/arch/mips64/little_endian.rb +77 -0
  53. data/lib/ronin/support/binary/ctypes/arch/mips64.rb +75 -0
  54. data/lib/ronin/support/binary/ctypes/arch/ppc.rb +75 -0
  55. data/lib/ronin/support/binary/ctypes/arch/ppc64.rb +75 -0
  56. data/lib/ronin/support/binary/ctypes/arch/x86.rb +75 -0
  57. data/lib/ronin/support/binary/ctypes/arch/x86_64.rb +75 -0
  58. data/lib/ronin/support/binary/ctypes/arch.rb +30 -0
  59. data/lib/ronin/support/binary/ctypes/array_object_type.rb +164 -0
  60. data/lib/ronin/support/binary/ctypes/array_type.rb +232 -0
  61. data/lib/ronin/support/binary/ctypes/big_endian.rb +195 -0
  62. data/lib/ronin/support/binary/ctypes/char_type.rb +59 -0
  63. data/lib/ronin/support/binary/ctypes/char_types.rb +39 -0
  64. data/lib/ronin/support/binary/ctypes/enum_type.rb +181 -0
  65. data/lib/ronin/support/binary/ctypes/float32_type.rb +50 -0
  66. data/lib/ronin/support/binary/ctypes/float64_type.rb +50 -0
  67. data/lib/ronin/support/binary/ctypes/float_type.rb +62 -0
  68. data/lib/ronin/support/binary/ctypes/int16_type.rb +50 -0
  69. data/lib/ronin/support/binary/ctypes/int32_type.rb +50 -0
  70. data/lib/ronin/support/binary/ctypes/int64_type.rb +50 -0
  71. data/lib/ronin/support/binary/ctypes/int8_type.rb +41 -0
  72. data/lib/ronin/support/binary/ctypes/int_type.rb +62 -0
  73. data/lib/ronin/support/binary/ctypes/little_endian.rb +195 -0
  74. data/lib/ronin/support/binary/ctypes/mixin.rb +135 -0
  75. data/lib/ronin/support/binary/ctypes/native.rb +205 -0
  76. data/lib/ronin/support/binary/ctypes/network.rb +29 -0
  77. data/lib/ronin/support/binary/ctypes/object_type.rb +55 -0
  78. data/lib/ronin/support/binary/ctypes/os/bsd.rb +65 -0
  79. data/lib/ronin/support/binary/ctypes/os/freebsd.rb +215 -0
  80. data/lib/ronin/support/binary/ctypes/os/linux.rb +193 -0
  81. data/lib/ronin/support/binary/ctypes/os/macos.rb +151 -0
  82. data/lib/ronin/support/binary/ctypes/os/netbsd.rb +147 -0
  83. data/lib/ronin/support/binary/ctypes/os/openbsd.rb +168 -0
  84. data/lib/ronin/support/binary/ctypes/os/unix.rb +78 -0
  85. data/lib/ronin/support/binary/ctypes/os/windows.rb +125 -0
  86. data/lib/ronin/support/binary/ctypes/os.rb +125 -0
  87. data/lib/ronin/support/binary/ctypes/scalar_type.rb +200 -0
  88. data/lib/ronin/support/binary/ctypes/string_type.rb +143 -0
  89. data/lib/ronin/support/binary/ctypes/struct_object_type.rb +173 -0
  90. data/lib/ronin/support/binary/ctypes/struct_type.rb +359 -0
  91. data/lib/ronin/support/binary/ctypes/type.rb +193 -0
  92. data/lib/ronin/support/binary/ctypes/type_resolver.rb +206 -0
  93. data/lib/ronin/support/binary/ctypes/uint16_type.rb +50 -0
  94. data/lib/ronin/support/binary/ctypes/uint32_type.rb +50 -0
  95. data/lib/ronin/support/binary/ctypes/uint64_type.rb +50 -0
  96. data/lib/ronin/support/binary/ctypes/uint8_type.rb +41 -0
  97. data/lib/ronin/support/binary/ctypes/uint_type.rb +59 -0
  98. data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +258 -0
  99. data/lib/ronin/support/binary/ctypes/union_object_type.rb +173 -0
  100. data/lib/ronin/support/binary/ctypes/union_type.rb +261 -0
  101. data/lib/ronin/support/binary/ctypes.rb +462 -0
  102. data/lib/ronin/support/binary/hexdump/core_ext/file.rb +118 -0
  103. data/lib/ronin/support/binary/hexdump/core_ext/string.rb +115 -0
  104. data/lib/ronin/support/binary/hexdump/core_ext.rb +20 -0
  105. data/lib/ronin/support/binary/hexdump/parser.rb +492 -0
  106. data/lib/ronin/support/binary/hexdump.rb +20 -0
  107. data/lib/ronin/support/binary/memory.rb +268 -0
  108. data/lib/ronin/support/binary/packet.rb +33 -0
  109. data/lib/ronin/support/binary/stack.rb +256 -0
  110. data/lib/ronin/support/binary/stream/methods.rb +1755 -0
  111. data/lib/ronin/support/binary/stream.rb +151 -0
  112. data/lib/ronin/support/binary/struct/member.rb +86 -0
  113. data/lib/ronin/support/binary/struct.rb +830 -0
  114. data/lib/ronin/support/binary/template.rb +284 -0
  115. data/lib/ronin/support/binary/union.rb +162 -0
  116. data/lib/ronin/support/binary.rb +26 -0
  117. data/lib/ronin/support/cli/ansi.rb +330 -0
  118. data/lib/ronin/support/cli/io_shell/core_ext/io.rb +67 -0
  119. data/lib/ronin/{fuzzing/extensions.rb → support/cli/io_shell/core_ext.rb} +6 -7
  120. data/lib/ronin/support/cli/io_shell.rb +161 -0
  121. data/lib/ronin/support/cli/printing.rb +216 -0
  122. data/lib/ronin/support/cli.rb +20 -0
  123. data/lib/ronin/support/compression/core_ext/file.rb +70 -0
  124. data/lib/ronin/support/compression/core_ext/string.rb +101 -0
  125. data/lib/ronin/{formatting/html.rb → support/compression/core_ext.rb} +6 -7
  126. data/lib/ronin/support/compression/gzip/reader.rb +70 -0
  127. data/lib/ronin/support/compression/gzip/writer.rb +74 -0
  128. data/lib/ronin/support/compression/gzip.rb +105 -0
  129. data/lib/ronin/support/compression/mixin.rb +180 -0
  130. data/lib/ronin/{network/extensions/esmtp/net.rb → support/compression/zlib.rb} +9 -10
  131. data/lib/ronin/support/compression.rb +174 -0
  132. data/lib/ronin/{extensions → support/core_ext}/enumerable.rb +5 -6
  133. data/lib/ronin/{extensions → support/core_ext}/file.rb +11 -34
  134. data/lib/ronin/support/core_ext/integer.rb +37 -0
  135. data/lib/ronin/support/core_ext/ipaddr.rb +65 -0
  136. data/lib/ronin/{extensions → support/core_ext}/kernel.rb +10 -9
  137. data/lib/ronin/{extensions → support/core_ext}/resolv.rb +5 -28
  138. data/lib/ronin/{extensions → support/core_ext}/string.rb +117 -57
  139. data/lib/ronin/support/core_ext.rb +33 -0
  140. data/lib/ronin/support/crypto/cert.rb +522 -0
  141. data/lib/ronin/support/crypto/cert_chain.rb +204 -0
  142. data/lib/ronin/support/crypto/cipher/aes.rb +71 -0
  143. data/lib/ronin/support/crypto/cipher/aes128.rb +54 -0
  144. data/lib/ronin/support/crypto/cipher/aes256.rb +54 -0
  145. data/lib/ronin/support/crypto/cipher.rb +194 -0
  146. data/lib/ronin/support/crypto/core_ext/file.rb +660 -0
  147. data/lib/ronin/support/crypto/core_ext/string.rb +548 -0
  148. data/lib/ronin/{binary.rb → support/crypto/core_ext.rb} +7 -8
  149. data/lib/ronin/support/crypto/hmac.rb +48 -0
  150. data/lib/ronin/support/crypto/key/dh.rb +122 -0
  151. data/lib/ronin/support/crypto/key/dsa.rb +103 -0
  152. data/lib/ronin/support/crypto/key/ec.rb +99 -0
  153. data/lib/ronin/support/crypto/key/methods.rb +163 -0
  154. data/lib/ronin/support/crypto/key/rsa.rb +169 -0
  155. data/lib/ronin/support/crypto/key.rb +105 -0
  156. data/lib/ronin/support/crypto/mixin.rb +620 -0
  157. data/lib/ronin/{network/extensions/http/net.rb → support/crypto/openssl.rb} +9 -10
  158. data/lib/ronin/support/crypto.rb +779 -0
  159. data/lib/ronin/support/encoding/base16/core_ext/string.rb +63 -0
  160. data/lib/ronin/support/encoding/base16/core_ext.rb +19 -0
  161. data/lib/ronin/support/encoding/base16.rb +82 -0
  162. data/lib/ronin/support/encoding/base32/core_ext/string.rb +63 -0
  163. data/lib/ronin/support/encoding/base32/core_ext.rb +19 -0
  164. data/lib/ronin/support/encoding/base32.rb +164 -0
  165. data/lib/ronin/support/encoding/base64/core_ext/string.rb +76 -0
  166. data/lib/ronin/support/encoding/base64/core_ext.rb +19 -0
  167. data/lib/ronin/support/encoding/base64.rb +78 -0
  168. data/lib/ronin/support/encoding/c/core_ext/integer.rb +82 -0
  169. data/lib/ronin/support/encoding/c/core_ext/string.rb +125 -0
  170. data/lib/ronin/support/encoding/c/core_ext.rb +20 -0
  171. data/lib/ronin/support/encoding/c.rb +277 -0
  172. data/lib/ronin/support/encoding/core_ext/string.rb +107 -0
  173. data/lib/ronin/support/encoding/core_ext.rb +33 -0
  174. data/lib/ronin/support/encoding/hex/core_ext/integer.rb +82 -0
  175. data/lib/ronin/support/encoding/hex/core_ext/string.rb +133 -0
  176. data/lib/ronin/support/encoding/hex/core_ext.rb +22 -0
  177. data/lib/ronin/support/encoding/hex.rb +248 -0
  178. data/lib/ronin/support/encoding/html/core_ext/integer.rb +106 -0
  179. data/lib/ronin/support/encoding/html/core_ext/string.rb +130 -0
  180. data/lib/ronin/support/encoding/html/core_ext.rb +20 -0
  181. data/lib/ronin/support/encoding/html.rb +233 -0
  182. data/lib/ronin/support/encoding/http/core_ext/integer.rb +95 -0
  183. data/lib/ronin/support/encoding/http/core_ext/string.rb +129 -0
  184. data/lib/ronin/support/encoding/http/core_ext.rb +20 -0
  185. data/lib/ronin/support/encoding/http.rb +241 -0
  186. data/lib/ronin/support/encoding/js/core_ext/integer.rb +67 -0
  187. data/lib/ronin/support/encoding/js/core_ext/string.rb +125 -0
  188. data/lib/ronin/support/encoding/js/core_ext.rb +20 -0
  189. data/lib/ronin/support/encoding/js.rb +279 -0
  190. data/lib/ronin/support/encoding/powershell/core_ext/integer.rb +87 -0
  191. data/lib/ronin/support/encoding/powershell/core_ext/string.rb +145 -0
  192. data/lib/ronin/support/encoding/powershell/core_ext.rb +20 -0
  193. data/lib/ronin/support/encoding/powershell.rb +297 -0
  194. data/lib/ronin/support/encoding/punycode/core_ext/string.rb +63 -0
  195. data/lib/ronin/support/encoding/punycode/core_ext.rb +19 -0
  196. data/lib/ronin/support/encoding/punycode.rb +76 -0
  197. data/lib/ronin/support/encoding/quoted_printable/core_ext/string.rb +75 -0
  198. data/lib/ronin/support/encoding/quoted_printable/core_ext.rb +19 -0
  199. data/lib/ronin/support/encoding/quoted_printable.rb +102 -0
  200. data/lib/ronin/support/encoding/ruby/core_ext/string.rb +129 -0
  201. data/lib/ronin/{formatting/binary.rb → support/encoding/ruby/core_ext.rb} +6 -7
  202. data/lib/ronin/support/encoding/ruby.rb +235 -0
  203. data/lib/ronin/support/encoding/shell/core_ext/integer.rb +89 -0
  204. data/lib/ronin/support/encoding/shell/core_ext/string.rb +134 -0
  205. data/lib/ronin/support/encoding/shell/core_ext.rb +20 -0
  206. data/lib/ronin/support/encoding/shell.rb +293 -0
  207. data/lib/ronin/{network/extensions → support/encoding}/smtp.rb +7 -7
  208. data/lib/ronin/support/encoding/sql/core_ext/string.rb +114 -0
  209. data/lib/ronin/{formatting/http.rb → support/encoding/sql/core_ext.rb} +6 -7
  210. data/lib/ronin/support/encoding/sql.rb +124 -0
  211. data/lib/ronin/support/encoding/uri/core_ext/integer.rb +149 -0
  212. data/lib/ronin/support/encoding/uri/core_ext/string.rb +195 -0
  213. data/lib/ronin/support/encoding/uri/core_ext.rb +20 -0
  214. data/lib/ronin/support/encoding/uri.rb +424 -0
  215. data/lib/ronin/support/encoding/uuencoding/core_ext/string.rb +73 -0
  216. data/lib/ronin/support/encoding/uuencoding/core_ext.rb +19 -0
  217. data/lib/ronin/support/encoding/uuencoding.rb +70 -0
  218. data/lib/ronin/support/encoding/xml/core_ext/integer.rb +100 -0
  219. data/lib/ronin/support/encoding/xml/core_ext/string.rb +124 -0
  220. data/lib/ronin/support/encoding/xml/core_ext.rb +20 -0
  221. data/lib/ronin/support/encoding/xml.rb +328 -0
  222. data/lib/ronin/support/encoding.rb +46 -0
  223. data/lib/ronin/support/home.rb +88 -0
  224. data/lib/ronin/support/mixin.rb +42 -0
  225. data/lib/ronin/support/network/asn/dns_record.rb +112 -0
  226. data/lib/ronin/support/network/asn/list.rb +269 -0
  227. data/lib/ronin/support/network/asn/record.rb +164 -0
  228. data/lib/ronin/support/network/asn/record_set.rb +226 -0
  229. data/lib/ronin/support/network/asn.rb +88 -0
  230. data/lib/ronin/{binary/hexdump.rb → support/network/core_ext.rb} +6 -7
  231. data/lib/ronin/support/network/dns/idn.rb +38 -0
  232. data/lib/ronin/support/network/dns/mixin.rb +941 -0
  233. data/lib/ronin/support/network/dns/resolver.rb +707 -0
  234. data/lib/ronin/support/network/dns.rb +1109 -0
  235. data/lib/ronin/support/network/domain.rb +70 -0
  236. data/lib/ronin/support/network/email_address.rb +574 -0
  237. data/lib/ronin/support/network/esmtp/mixin.rb +115 -0
  238. data/lib/ronin/support/network/exceptions.rb +43 -0
  239. data/lib/ronin/support/network/ftp/mixin.rb +106 -0
  240. data/lib/ronin/support/network/host.rb +1473 -0
  241. data/lib/ronin/support/network/http/cookie.rb +245 -0
  242. data/lib/ronin/support/network/http/core_ext/uri/http.rb +63 -0
  243. data/lib/ronin/support/network/http/core_ext.rb +19 -0
  244. data/lib/ronin/support/network/http/mixin.rb +890 -0
  245. data/lib/ronin/support/network/http/request.rb +215 -0
  246. data/lib/ronin/support/network/http/set_cookie.rb +210 -0
  247. data/lib/ronin/support/network/http/user_agents.rb +115 -0
  248. data/lib/ronin/support/network/http.rb +2582 -0
  249. data/lib/ronin/support/network/imap/mixin.rb +133 -0
  250. data/lib/ronin/support/network/ip/mixin.rb +114 -0
  251. data/lib/ronin/support/network/ip.rb +540 -0
  252. data/lib/ronin/support/network/ip_range/cidr.rb +252 -0
  253. data/lib/ronin/support/network/ip_range/glob.rb +309 -0
  254. data/lib/ronin/support/network/ip_range/range.rb +249 -0
  255. data/lib/ronin/support/network/ip_range.rb +284 -0
  256. data/lib/ronin/support/network/mixin.rb +58 -0
  257. data/lib/ronin/support/network/packet.rb +27 -0
  258. data/lib/ronin/support/network/pop3/mixin.rb +113 -0
  259. data/lib/ronin/support/network/proxy.rb +602 -0
  260. data/lib/ronin/support/network/public_suffix/list.rb +339 -0
  261. data/lib/ronin/support/network/public_suffix/suffix.rb +118 -0
  262. data/lib/ronin/support/network/public_suffix/suffix_set.rb +150 -0
  263. data/lib/ronin/support/network/public_suffix.rb +41 -0
  264. data/lib/ronin/support/network/smtp/email.rb +190 -0
  265. data/lib/ronin/support/network/smtp/mixin.rb +290 -0
  266. data/lib/ronin/{extensions/meta.rb → support/network/smtp.rb} +6 -7
  267. data/lib/ronin/support/network/ssl/local_cert.rb +114 -0
  268. data/lib/ronin/support/network/ssl/local_key.rb +84 -0
  269. data/lib/ronin/support/network/ssl/mixin.rb +740 -0
  270. data/lib/ronin/{network/extensions/imap/net.rb → support/network/ssl/openssl.rb} +9 -10
  271. data/lib/ronin/support/network/ssl/proxy.rb +296 -0
  272. data/lib/ronin/support/network/ssl.rb +173 -0
  273. data/lib/ronin/support/network/tcp/mixin.rb +400 -0
  274. data/lib/ronin/support/network/tcp/proxy.rb +435 -0
  275. data/lib/ronin/support/network/tcp.rb +443 -0
  276. data/lib/ronin/support/network/telnet/mixin.rb +150 -0
  277. data/lib/ronin/support/network/telnet.rb +90 -0
  278. data/lib/ronin/support/network/tld/list.rb +266 -0
  279. data/lib/ronin/support/network/tld.rb +41 -0
  280. data/lib/ronin/support/network/tls/mixin.rb +670 -0
  281. data/lib/ronin/support/network/tls/proxy.rb +135 -0
  282. data/lib/ronin/support/network/tls.rb +53 -0
  283. data/lib/ronin/support/network/udp/mixin.rb +389 -0
  284. data/lib/ronin/support/network/udp/proxy.rb +192 -0
  285. data/lib/ronin/support/network/udp.rb +435 -0
  286. data/lib/ronin/support/network/unix/mixin.rb +273 -0
  287. data/lib/ronin/support/network.rb +37 -0
  288. data/lib/ronin/support/path.rb +136 -0
  289. data/lib/ronin/{network/extensions/dns/net.rb → support/text/core_ext/regexp.rb} +8 -9
  290. data/lib/ronin/support/text/core_ext/string.rb +46 -0
  291. data/lib/ronin/support/text/core_ext.rb +23 -0
  292. data/lib/ronin/support/text/entropy/core_ext/string.rb +45 -0
  293. data/lib/ronin/support/text/entropy/core_ext.rb +19 -0
  294. data/lib/ronin/support/text/entropy.rb +66 -0
  295. data/lib/ronin/support/text/erb/mixin.rb +44 -0
  296. data/lib/ronin/support/text/erb.rb +19 -0
  297. data/lib/ronin/support/text/homoglyph/core_ext/string.rb +108 -0
  298. data/lib/ronin/{formatting/digest.rb → support/text/homoglyph/core_ext.rb} +6 -7
  299. data/lib/ronin/{network/http/exceptions/unknown_request.rb → support/text/homoglyph/exceptions.rb} +10 -9
  300. data/lib/ronin/support/text/homoglyph/table.rb +228 -0
  301. data/lib/ronin/support/text/homoglyph.rb +142 -0
  302. data/lib/ronin/support/text/mixin.rb +31 -0
  303. data/lib/ronin/support/text/patterns/credentials.rb +75 -0
  304. data/lib/ronin/support/text/patterns/crypto.rb +67 -0
  305. data/lib/ronin/support/text/patterns/file_system.rb +93 -0
  306. data/lib/ronin/support/text/patterns/language.rb +37 -0
  307. data/lib/ronin/support/text/patterns/network/public_suffix.rb +44 -0
  308. data/lib/ronin/support/text/patterns/network.rb +140 -0
  309. data/lib/ronin/support/text/patterns/numeric.rb +52 -0
  310. data/lib/ronin/support/text/patterns/pii.rb +105 -0
  311. data/lib/ronin/support/text/patterns/source_code.rb +148 -0
  312. data/lib/ronin/support/text/patterns.rb +25 -0
  313. data/lib/ronin/support/text/random/mixin.rb +437 -0
  314. data/lib/ronin/support/text/random.rb +419 -0
  315. data/lib/ronin/support/text/typo/core_ext/string.rb +123 -0
  316. data/lib/ronin/support/text/typo/core_ext.rb +19 -0
  317. data/lib/ronin/support/text/typo/exceptions.rb +28 -0
  318. data/lib/ronin/support/text/typo/generator.rb +161 -0
  319. data/lib/ronin/support/text/typo.rb +260 -0
  320. data/lib/ronin/support/text.rb +26 -0
  321. data/lib/ronin/support/version.rb +6 -7
  322. data/lib/ronin/support.rb +20 -15
  323. data/ronin-support.gemspec +3 -1
  324. metadata +462 -369
  325. data/.gemtest +0 -0
  326. data/lib/ronin/binary/hexdump/parser.rb +0 -403
  327. data/lib/ronin/binary/struct.rb +0 -567
  328. data/lib/ronin/binary/template.rb +0 -454
  329. data/lib/ronin/extensions/ip_addr.rb +0 -217
  330. data/lib/ronin/extensions/meta/object.rb +0 -24
  331. data/lib/ronin/extensions/regexp.rb +0 -157
  332. data/lib/ronin/extensions.rb +0 -29
  333. data/lib/ronin/formatting/extensions/binary/array.rb +0 -61
  334. data/lib/ronin/formatting/extensions/binary/base64.rb +0 -106
  335. data/lib/ronin/formatting/extensions/binary/file.rb +0 -77
  336. data/lib/ronin/formatting/extensions/binary/float.rb +0 -65
  337. data/lib/ronin/formatting/extensions/binary/integer.rb +0 -180
  338. data/lib/ronin/formatting/extensions/binary/string.rb +0 -345
  339. data/lib/ronin/formatting/extensions/binary.rb +0 -26
  340. data/lib/ronin/formatting/extensions/digest/file.rb +0 -129
  341. data/lib/ronin/formatting/extensions/digest/string.rb +0 -86
  342. data/lib/ronin/formatting/extensions/digest.rb +0 -21
  343. data/lib/ronin/formatting/extensions/html/integer.rb +0 -142
  344. data/lib/ronin/formatting/extensions/html/string.rb +0 -194
  345. data/lib/ronin/formatting/extensions/html.rb +0 -21
  346. data/lib/ronin/formatting/extensions/http/integer.rb +0 -69
  347. data/lib/ronin/formatting/extensions/http/string.rb +0 -110
  348. data/lib/ronin/formatting/extensions/http.rb +0 -21
  349. data/lib/ronin/formatting/extensions/sql/string.rb +0 -128
  350. data/lib/ronin/formatting/extensions/sql.rb +0 -20
  351. data/lib/ronin/formatting/extensions/text/array.rb +0 -137
  352. data/lib/ronin/formatting/extensions/text/string.rb +0 -297
  353. data/lib/ronin/formatting/extensions.rb +0 -24
  354. data/lib/ronin/formatting/text.rb +0 -20
  355. data/lib/ronin/formatting.rb +0 -25
  356. data/lib/ronin/fuzzing/extensions/string.rb +0 -209
  357. data/lib/ronin/fuzzing/fuzzer.rb +0 -110
  358. data/lib/ronin/fuzzing/fuzzing.rb +0 -360
  359. data/lib/ronin/fuzzing/mutator.rb +0 -161
  360. data/lib/ronin/fuzzing/repeater.rb +0 -81
  361. data/lib/ronin/fuzzing/template.rb +0 -133
  362. data/lib/ronin/fuzzing.rb +0 -21
  363. data/lib/ronin/mixin.rb +0 -89
  364. data/lib/ronin/network/dns.rb +0 -201
  365. data/lib/ronin/network/esmtp.rb +0 -113
  366. data/lib/ronin/network/extensions/dns.rb +0 -20
  367. data/lib/ronin/network/extensions/esmtp.rb +0 -20
  368. data/lib/ronin/network/extensions/http/uri/http.rb +0 -228
  369. data/lib/ronin/network/extensions/http.rb +0 -21
  370. data/lib/ronin/network/extensions/imap.rb +0 -20
  371. data/lib/ronin/network/extensions/pop3/net.rb +0 -24
  372. data/lib/ronin/network/extensions/pop3.rb +0 -20
  373. data/lib/ronin/network/extensions/smtp/net.rb +0 -24
  374. data/lib/ronin/network/extensions/ssl/net.rb +0 -24
  375. data/lib/ronin/network/extensions/ssl.rb +0 -20
  376. data/lib/ronin/network/extensions/tcp/net.rb +0 -24
  377. data/lib/ronin/network/extensions/tcp.rb +0 -20
  378. data/lib/ronin/network/extensions/telnet/net.rb +0 -24
  379. data/lib/ronin/network/extensions/telnet.rb +0 -20
  380. data/lib/ronin/network/extensions/udp/net.rb +0 -24
  381. data/lib/ronin/network/extensions/udp.rb +0 -20
  382. data/lib/ronin/network/extensions.rb +0 -29
  383. data/lib/ronin/network/ftp.rb +0 -149
  384. data/lib/ronin/network/http/exceptions.rb +0 -20
  385. data/lib/ronin/network/http/http.rb +0 -1127
  386. data/lib/ronin/network/http/proxy.rb +0 -330
  387. data/lib/ronin/network/http.rb +0 -22
  388. data/lib/ronin/network/imap.rb +0 -158
  389. data/lib/ronin/network/mixins/dns.rb +0 -55
  390. data/lib/ronin/network/mixins/esmtp.rb +0 -164
  391. data/lib/ronin/network/mixins/ftp.rb +0 -155
  392. data/lib/ronin/network/mixins/http.rb +0 -227
  393. data/lib/ronin/network/mixins/imap.rb +0 -156
  394. data/lib/ronin/network/mixins/mixin.rb +0 -58
  395. data/lib/ronin/network/mixins/pop3.rb +0 -149
  396. data/lib/ronin/network/mixins/smtp.rb +0 -159
  397. data/lib/ronin/network/mixins/ssl.rb +0 -148
  398. data/lib/ronin/network/mixins/tcp.rb +0 -368
  399. data/lib/ronin/network/mixins/telnet.rb +0 -208
  400. data/lib/ronin/network/mixins/udp.rb +0 -381
  401. data/lib/ronin/network/mixins/unix.rb +0 -279
  402. data/lib/ronin/network/mixins.rb +0 -29
  403. data/lib/ronin/network/network.rb +0 -45
  404. data/lib/ronin/network/pop3.rb +0 -124
  405. data/lib/ronin/network/proxy.rb +0 -578
  406. data/lib/ronin/network/smtp/email.rb +0 -174
  407. data/lib/ronin/network/smtp/smtp.rb +0 -230
  408. data/lib/ronin/network/smtp.rb +0 -22
  409. data/lib/ronin/network/ssl.rb +0 -186
  410. data/lib/ronin/network/tcp/proxy.rb +0 -417
  411. data/lib/ronin/network/tcp/tcp.rb +0 -443
  412. data/lib/ronin/network/tcp.rb +0 -21
  413. data/lib/ronin/network/telnet.rb +0 -264
  414. data/lib/ronin/network/udp/proxy.rb +0 -191
  415. data/lib/ronin/network/udp/udp.rb +0 -450
  416. data/lib/ronin/network/udp.rb +0 -21
  417. data/lib/ronin/network/unix.rb +0 -286
  418. data/lib/ronin/network.rb +0 -31
  419. data/lib/ronin/path.rb +0 -137
  420. data/lib/ronin/spec/ui/output.rb +0 -22
  421. data/lib/ronin/support/inflector.rb +0 -92
  422. data/lib/ronin/support/support.rb +0 -42
  423. data/lib/ronin/templates/erb.rb +0 -78
  424. data/lib/ronin/templates/template.rb +0 -169
  425. data/lib/ronin/templates.rb +0 -21
  426. data/lib/ronin/ui/output/helpers.rb +0 -296
  427. data/lib/ronin/ui/output/output.rb +0 -146
  428. data/lib/ronin/ui/output/terminal/color.rb +0 -124
  429. data/lib/ronin/ui/output/terminal/raw.rb +0 -103
  430. data/lib/ronin/ui/output/terminal.rb +0 -21
  431. data/lib/ronin/ui/output.rb +0 -21
  432. data/lib/ronin/ui/shell.rb +0 -286
  433. data/lib/ronin/wordlist.rb +0 -287
  434. data/spec/binary/hexdump/helpers/hexdumps/ascii.bin +0 -0
  435. data/spec/binary/hexdump/helpers/hexdumps/hexdump_decimal_shorts.txt +0 -17
  436. data/spec/binary/hexdump/helpers/hexdumps/hexdump_hex_bytes.txt +0 -17
  437. data/spec/binary/hexdump/helpers/hexdumps/hexdump_hex_shorts.txt +0 -17
  438. data/spec/binary/hexdump/helpers/hexdumps/hexdump_octal_bytes.txt +0 -17
  439. data/spec/binary/hexdump/helpers/hexdumps/hexdump_octal_shorts.txt +0 -17
  440. data/spec/binary/hexdump/helpers/hexdumps/hexdump_repeated.txt +0 -6
  441. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_bytes.txt +0 -17
  442. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_ints.txt +0 -17
  443. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_quads.txt +0 -17
  444. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_shorts.txt +0 -17
  445. data/spec/binary/hexdump/helpers/hexdumps/od_doubles.txt +0 -17
  446. data/spec/binary/hexdump/helpers/hexdumps/od_floats.txt +0 -17
  447. data/spec/binary/hexdump/helpers/hexdumps/od_hex_bytes.txt +0 -17
  448. data/spec/binary/hexdump/helpers/hexdumps/od_hex_ints.txt +0 -17
  449. data/spec/binary/hexdump/helpers/hexdumps/od_hex_quads.txt +0 -17
  450. data/spec/binary/hexdump/helpers/hexdumps/od_hex_shorts.txt +0 -17
  451. data/spec/binary/hexdump/helpers/hexdumps/od_named_chars.txt +0 -17
  452. data/spec/binary/hexdump/helpers/hexdumps/od_octal_bytes.txt +0 -17
  453. data/spec/binary/hexdump/helpers/hexdumps/od_octal_ints.txt +0 -17
  454. data/spec/binary/hexdump/helpers/hexdumps/od_octal_quads.txt +0 -17
  455. data/spec/binary/hexdump/helpers/hexdumps/od_octal_shorts.txt +0 -17
  456. data/spec/binary/hexdump/helpers/hexdumps/od_repeated.txt +0 -6
  457. data/spec/binary/hexdump/helpers/hexdumps/repeated.bin +0 -1
  458. data/spec/binary/hexdump/helpers/hexdumps.rb +0 -13
  459. data/spec/binary/hexdump/parser_spec.rb +0 -302
  460. data/spec/binary/struct_spec.rb +0 -496
  461. data/spec/binary/template_spec.rb +0 -414
  462. data/spec/extensions/enumerable_spec.rb +0 -24
  463. data/spec/extensions/file_spec.rb +0 -63
  464. data/spec/extensions/ip_addr_spec.rb +0 -203
  465. data/spec/extensions/kernel_spec.rb +0 -30
  466. data/spec/extensions/regexp_spec.rb +0 -482
  467. data/spec/extensions/resolv_spec.rb +0 -18
  468. data/spec/extensions/string_spec.rb +0 -179
  469. data/spec/formatting/binary/array_spec.rb +0 -26
  470. data/spec/formatting/binary/base64_spec.rb +0 -50
  471. data/spec/formatting/binary/float_spec.rb +0 -34
  472. data/spec/formatting/binary/integer_spec.rb +0 -166
  473. data/spec/formatting/binary/string_spec.rb +0 -197
  474. data/spec/formatting/digest/string_spec.rb +0 -82
  475. data/spec/formatting/html/integer_spec.rb +0 -66
  476. data/spec/formatting/html/string_spec.rb +0 -103
  477. data/spec/formatting/http/integer_spec.rb +0 -42
  478. data/spec/formatting/http/string_spec.rb +0 -76
  479. data/spec/formatting/sql/string_spec.rb +0 -75
  480. data/spec/formatting/text/array_spec.rb +0 -105
  481. data/spec/formatting/text/string_spec.rb +0 -162
  482. data/spec/fuzzing/extensions/string_spec.rb +0 -87
  483. data/spec/fuzzing/fuzzer_spec.rb +0 -109
  484. data/spec/fuzzing/fuzzing_spec.rb +0 -24
  485. data/spec/fuzzing/mutator_spec.rb +0 -112
  486. data/spec/fuzzing/repeater_spec.rb +0 -57
  487. data/spec/fuzzing/template_spec.rb +0 -54
  488. data/spec/mixin_spec.rb +0 -53
  489. data/spec/network/dns_spec.rb +0 -201
  490. data/spec/network/ftp_spec.rb +0 -81
  491. data/spec/network/http/http_spec.rb +0 -466
  492. data/spec/network/http/proxy_spec.rb +0 -148
  493. data/spec/network/network_spec.rb +0 -8
  494. data/spec/network/proxy_spec.rb +0 -121
  495. data/spec/network/shared/unix_server.rb +0 -31
  496. data/spec/network/smtp/email_spec.rb +0 -100
  497. data/spec/network/ssl_spec.rb +0 -70
  498. data/spec/network/tcp/proxy_spec.rb +0 -116
  499. data/spec/network/tcp/tcp_spec.rb +0 -273
  500. data/spec/network/telnet_spec.rb +0 -67
  501. data/spec/network/udp/udp_spec.rb +0 -271
  502. data/spec/network/unix_spec.rb +0 -183
  503. data/spec/path_spec.rb +0 -86
  504. data/spec/spec_helper.rb +0 -9
  505. data/spec/support/inflector_spec.rb +0 -22
  506. data/spec/support_spec.rb +0 -8
  507. data/spec/templates/classes/example_erb.rb +0 -11
  508. data/spec/templates/classes/example_template.rb +0 -35
  509. data/spec/templates/erb_spec.rb +0 -21
  510. data/spec/templates/helpers/data/includes/_relative.erb +0 -1
  511. data/spec/templates/helpers/data/templates/example.erb +0 -1
  512. data/spec/templates/helpers/data.rb +0 -9
  513. data/spec/templates/template_spec.rb +0 -54
  514. data/spec/ui/classes/test_shell.rb +0 -22
  515. data/spec/ui/output_spec.rb +0 -32
  516. data/spec/ui/shell_spec.rb +0 -83
  517. data/spec/wordlist_spec.rb +0 -151
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ #
5
+ # Ronin Support is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Lesser General Public License as published
7
+ # by the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Ronin Support is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require 'ronin/support/crypto/key/methods'
20
+ require 'ronin/support/crypto/openssl'
21
+
22
+ module Ronin
23
+ module Support
24
+ module Crypto
25
+ module Key
26
+ #
27
+ # Represents an Diffie-Hellman (DH) key.
28
+ #
29
+ # @see https://rubydoc.info/stdlib/openssl/OpenSSL/PKey/DH.html
30
+ #
31
+ # @since 1.0.0
32
+ #
33
+ # @api public
34
+ #
35
+ class DH < OpenSSL::PKey::DH
36
+
37
+ include Methods
38
+
39
+ #
40
+ # Generates a new DH key.
41
+ #
42
+ # @param [Integer] key_size
43
+ # The size of the key in bits.
44
+ #
45
+ # @param [Integer, nil] generator
46
+ # A small number > 1, typically 2 or 5.
47
+ #
48
+ # @return [DH]
49
+ # The newly generated key.
50
+ #
51
+ # @note
52
+ # jruby's openssl does not define `OpenSSL::PKey::DH.generate`.
53
+ # See https://github.com/jruby/jruby-openssl/issues/254
54
+ #
55
+ def self.generate(key_size=1024, generator: nil)
56
+ new_key = allocate
57
+ new_key.send(:initialize_copy,super(key_size,*generator))
58
+ new_key
59
+ end
60
+
61
+ #
62
+ # The `p` variable for the DH key.
63
+ #
64
+ # @return [OpenSSL::BN]
65
+ #
66
+ # @see https://rubydoc.info/stdlib/openssl/OpenSSL/BN
67
+ #
68
+ def p
69
+ super()
70
+ end
71
+
72
+ #
73
+ # The `q` variable for the DH key.
74
+ #
75
+ # @return [OpenSSL::BN, nil]
76
+ #
77
+ # @see https://rubydoc.info/stdlib/openssl/OpenSSL/BN
78
+ #
79
+ # @note
80
+ # jruby's openssl does not implement `OpenSSL::PKey::DH#q`.
81
+ # See https://github.com/jruby/jruby-openssl/issues/253
82
+ #
83
+ def q
84
+ super() unless RUBY_ENGINE == 'jruby'
85
+ end
86
+
87
+ #
88
+ # The `g` variable for the DH key.
89
+ #
90
+ # @return [OpenSSL::BN]
91
+ #
92
+ # @see https://rubydoc.info/stdlib/openssl/OpenSSL/BN
93
+ #
94
+ def g
95
+ super()
96
+ end
97
+
98
+ #
99
+ # The size of the DH key in bits.
100
+ #
101
+ # @return [Integer]
102
+ # The key size in bits.
103
+ #
104
+ def size
105
+ p.num_bits
106
+ end
107
+
108
+ #
109
+ # Saves the DH key to the given file.
110
+ #
111
+ # @param [String] path
112
+ # The path to the output file.
113
+ #
114
+ def save(path)
115
+ super(path)
116
+ end
117
+
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ #
5
+ # Ronin Support is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Lesser General Public License as published
7
+ # by the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Ronin Support is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require 'ronin/support/crypto/key/methods'
20
+ require 'ronin/support/crypto/openssl'
21
+
22
+ module Ronin
23
+ module Support
24
+ module Crypto
25
+ module Key
26
+ #
27
+ # Represents an DSA key.
28
+ #
29
+ # @see https://rubydoc.info/stdlib/openssl/OpenSSL/PKey/DSA.html
30
+ #
31
+ # @since 1.0.0
32
+ #
33
+ # @api public
34
+ #
35
+ class DSA < OpenSSL::PKey::DSA
36
+
37
+ include Methods
38
+
39
+ #
40
+ # Generates a new random DSA key.
41
+ #
42
+ # @param [Integer] key_size
43
+ # The size of the key in bits.
44
+ #
45
+ # @return [DSA]
46
+ # The newly generated key.
47
+ #
48
+ def self.generate(key_size=1024)
49
+ # HACK: openssl-3.0.0 will return an OpenSSL::PKey::SAA instance,
50
+ # even though we subclassed OpenSSL::PKey::SAA.
51
+ new_key = allocate
52
+ new_key.send(:initialize_copy,super(key_size))
53
+ new_key
54
+ end
55
+
56
+ #
57
+ # The `p` variable for the DSA key.
58
+ #
59
+ # @return [OpenSSL::BN]
60
+ #
61
+ # @see https://rubydoc.info/stdlib/openssl/OpenSSL/BN
62
+ #
63
+ def p
64
+ super()
65
+ end
66
+
67
+ #
68
+ # The `q` variable for the DSA key.
69
+ #
70
+ # @return [OpenSSL::BN]
71
+ #
72
+ # @see https://rubydoc.info/stdlib/openssl/OpenSSL/BN
73
+ #
74
+ def q
75
+ super()
76
+ end
77
+
78
+ #
79
+ # The `g` variable for the DSA key.
80
+ #
81
+ # @return [OpenSSL::BN]
82
+ #
83
+ # @see https://rubydoc.info/stdlib/openssl/OpenSSL/BN
84
+ #
85
+ def g
86
+ super()
87
+ end
88
+
89
+ #
90
+ # The size of the DSA key in bits.
91
+ #
92
+ # @return [Integer]
93
+ # The key size in bits.
94
+ #
95
+ def size
96
+ p.num_bits
97
+ end
98
+
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ #
5
+ # Ronin Support is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Lesser General Public License as published
7
+ # by the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Ronin Support is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require 'ronin/support/crypto/key/methods'
20
+ require 'ronin/support/crypto/openssl'
21
+
22
+ module Ronin
23
+ module Support
24
+ module Crypto
25
+ module Key
26
+ #
27
+ # Represents an EC key.
28
+ #
29
+ # ## Examples
30
+ #
31
+ # ### List supported curves
32
+ #
33
+ # Crypto::Key::EC.supported_curves
34
+ # # => ["secp224r1", "secp256k1", "secp384r1", "secp521r1", "prime256v1"]
35
+ #
36
+ # ### Generate a random key
37
+ #
38
+ # ec = Crypto::Key::EC.random("secp224r1")
39
+ #
40
+ # @see https://rubydoc.info/stdlib/openssl/OpenSSL/PKey/EC.html
41
+ #
42
+ # @since 1.0.0
43
+ #
44
+ # @api public
45
+ #
46
+ class EC < OpenSSL::PKey::EC
47
+
48
+ include Methods
49
+
50
+ #
51
+ # The supported elliptical curves.
52
+ #
53
+ # @return [Array<String>]
54
+ # The supported curve names.
55
+ #
56
+ def self.supported_curves
57
+ builtin_curves.map { |(name,desc)| name }
58
+ end
59
+
60
+ #
61
+ # Generates a new random EC key.
62
+ #
63
+ # @param [String] curve
64
+ # The curve to use. See {supported_curves}.
65
+ #
66
+ # @return [EC]
67
+ # The newly generated key.
68
+ #
69
+ def self.generate(curve='prime256v1')
70
+ super(curve)
71
+ end
72
+
73
+ #
74
+ # Initializes the EC key.
75
+ #
76
+ # @param [Array] args
77
+ # Additional arguments.
78
+ #
79
+ # @note
80
+ # Will print a warning message when running on JRuby about
81
+ # jruby-openssl's EC key bugs:
82
+ # * https://github.com/jruby/jruby-openssl/issues/256
83
+ # *https://github.com/jruby/jruby-openssl/issues/257
84
+ #
85
+ def initialize(*args)
86
+ if RUBY_ENGINE == 'jruby'
87
+ warn "WARNING: jruby-openssl has multiple bugs wrt parsing EC keys"
88
+ warn " * https://github.com/jruby/jruby-openssl/issues/256"
89
+ warn " * https://github.com/jruby/jruby-openssl/issues/257"
90
+ end
91
+
92
+ super(*args)
93
+ end
94
+
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,163 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ #
5
+ # Ronin Support is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Lesser General Public License as published
7
+ # by the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Ronin Support is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require 'ronin/support/crypto/openssl'
20
+
21
+ module Ronin
22
+ module Support
23
+ module Crypto
24
+ module Key
25
+ #
26
+ # Common methods for {Key} classes.
27
+ #
28
+ # @api private
29
+ #
30
+ # @since 1.0.0
31
+ #
32
+ module Methods
33
+ #
34
+ # Extends {ClassMethods}.
35
+ #
36
+ # @param [Class] key_class
37
+ # The {Key} class that is including {Methods}.
38
+ #
39
+ def self.included(key_class)
40
+ key_class.extend ClassMethods
41
+ end
42
+
43
+ module ClassMethods
44
+ #
45
+ # Generates a new random key.
46
+ #
47
+ # @param [Array] arguments
48
+ # Additional arguments for `generate`.
49
+ #
50
+ # @return [Class<Methods>]
51
+ # The newly generated key.
52
+ #
53
+ # @note Alias for `generate`.
54
+ #
55
+ def random(*arguments,&block)
56
+ generate(*arguments,&block)
57
+ end
58
+
59
+ #
60
+ # Parses an PEM encoded key.
61
+ #
62
+ # @param [String] key
63
+ # The PEM or DER encoded key string.
64
+ #
65
+ # @param [String, nil] password
66
+ # Optional password to decrypt the key.
67
+ #
68
+ # @return [OpenSSL::PKey]
69
+ # The parsed key.
70
+ #
71
+ # @api public
72
+ #
73
+ def parse(key, password: nil)
74
+ new(key,*password)
75
+ end
76
+
77
+ #
78
+ # Alias for {#parse}.
79
+ #
80
+ # @param [String] key
81
+ # The PEM or DER encoded key string.
82
+ #
83
+ # @param [Hash{Symbol => Object}] kwargs
84
+ # Additional keyword arguments for {#parse}.
85
+ #
86
+ # @option kwargs [String, nil] :password
87
+ # Optional password to decrypt the key.
88
+ #
89
+ # @return [OpenSSL::PKey]
90
+ # The parsed key.
91
+ #
92
+ # @see parse
93
+ #
94
+ # @api public
95
+ #
96
+ def load(key,**kwargs)
97
+ parse(key,**kwargs)
98
+ end
99
+
100
+ #
101
+ # Loads a key from a file.
102
+ #
103
+ # @param [String] path
104
+ # The path to the PEM or DER encoded key file.
105
+ #
106
+ # @param [Hash{Symbol => Object}] kwargs
107
+ # Additional keyword arguments for {parse}.
108
+ #
109
+ # @option kwargs [String, nil] :password
110
+ # Optional password to decrypt the key.
111
+ #
112
+ # @return [OpenSSL::PKey]
113
+ # The parsed key.
114
+ #
115
+ # @api public
116
+ #
117
+ def load_file(path,**kwargs)
118
+ parse(File.read(path),**kwargs)
119
+ end
120
+ end
121
+
122
+ #
123
+ # Saves the key to the given path.
124
+ #
125
+ # @param [String] path
126
+ # The path to write the exported key to.
127
+ #
128
+ # @param [:pem, :der] encoding
129
+ # The desired encoding of the exported key.
130
+ # * `:pem` - PEM encoding.
131
+ # * `:der` - DER encoding.
132
+ #
133
+ # @param [String, nil] cipher
134
+ # Optional cipher to use to encrypt the key file.
135
+ #
136
+ # @param [String, nil] password
137
+ # Optional password to use to encrypt the key file.
138
+ #
139
+ # @raise [ArgumentError]
140
+ # The `endcoding:` value must be either `:pem` or `:der`.
141
+ #
142
+ def save(path, encoding: :pem, cipher: 'aes-256-cbc', password: nil)
143
+ encoding_method = case encoding
144
+ when :pem then method(:to_pem)
145
+ when :der then method(:to_der)
146
+ else
147
+ raise(ArgumentError,"encoding: keyword argument (#{encoding.inspect}) must be either :pem or :der")
148
+ end
149
+
150
+ exported = if password
151
+ cipher = OpenSSL::Cipher.new(cipher)
152
+ encoding_method.call(cipher,password)
153
+ else
154
+ encoding_method.call()
155
+ end
156
+
157
+ File.write(path,exported)
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,169 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ #
5
+ # Ronin Support is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Lesser General Public License as published
7
+ # by the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Ronin Support is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require 'ronin/support/crypto/key/methods'
20
+ require 'ronin/support/crypto/openssl'
21
+
22
+ module Ronin
23
+ module Support
24
+ module Crypto
25
+ module Key
26
+ #
27
+ # Represents an RSA key.
28
+ #
29
+ # @see https://rubydoc.info/stdlib/openssl/OpenSSL/PKey/RSA.html
30
+ #
31
+ # @since 1.0.0
32
+ #
33
+ # @api public
34
+ #
35
+ class RSA < OpenSSL::PKey::RSA
36
+
37
+ include Methods
38
+
39
+ #
40
+ # Generates a new random RSA key.
41
+ #
42
+ # @param [Integer] key_size
43
+ # The size of the key in bits.
44
+ #
45
+ # @param [Array] arguments
46
+ # Additional arguments for [OpenSSL::PKey::RSA.generate](https://rubydoc.info/gems/openssl/OpenSSL/PKey/RSA#generate-class_method).
47
+ #
48
+ # @return [RSA]
49
+ # The newly generated key.
50
+ #
51
+ def self.generate(key_size=4096,*arguments,&block)
52
+ # HACK: openssl-3.0.0 will return an OpenSSL::PKey::RSA instance,
53
+ # even though we subclassed OpenSSL::PKey::RSA.
54
+ new_key = allocate
55
+ new_key.send(:initialize_copy,super(key_size,*arguments,&block))
56
+ new_key
57
+ end
58
+
59
+ #
60
+ # The `n` variable for the RSA key.
61
+ #
62
+ # @return [OpenSSL::BN]
63
+ #
64
+ # @see https://rubydoc.info/stdlib/openssl/OpenSSL/BN
65
+ #
66
+ def n
67
+ super()
68
+ end
69
+
70
+ #
71
+ # The `e` variable for the RSA key.
72
+ #
73
+ # @return [OpenSSL::BN]
74
+ #
75
+ # @see https://rubydoc.info/stdlib/openssl/OpenSSL/BN
76
+ #
77
+ def e
78
+ super()
79
+ end
80
+
81
+ #
82
+ # The `d` variable for the RSA key.
83
+ #
84
+ # @return [OpenSSL::BN]
85
+ #
86
+ # @see https://rubydoc.info/stdlib/openssl/OpenSSL/BN
87
+ #
88
+ def d
89
+ super()
90
+ end
91
+
92
+ #
93
+ # The size of the RSA key in bits.
94
+ #
95
+ # @return [Integer]
96
+ # The key size in bits.
97
+ #
98
+ def size
99
+ n.num_bits
100
+ end
101
+
102
+ # Mapping of padding names to pdding constants.
103
+ #
104
+ # @api private
105
+ PADDINGS = {
106
+ pkcs1_oaep: PKCS1_OAEP_PADDING,
107
+ pkcs1: PKCS1_PADDING,
108
+ sslv23: SSLV23_PADDING,
109
+
110
+ nil => NO_PADDING,
111
+ false => NO_PADDING
112
+ }
113
+
114
+ #
115
+ # Encrypts data using the public key.
116
+ #
117
+ # @param [String] data
118
+ # The data to encrypt.
119
+ #
120
+ # @param [:pkcs1_oaep, :pkcs1, :sslv23, nil, false] padding
121
+ # Optional padding mode. `nil` and `false` will disable padding.
122
+ #
123
+ # @return [String]
124
+ # The encrypted data.
125
+ #
126
+ # @example
127
+ # rsa = Crypto::Key::RSA.load_file('key.pem')
128
+ # rsa.public_encrypt("top secret", padding: :pkcs1_oaep)
129
+ # # => "i;k\x89\xE9\x92\xA5\xAB\xBAc\xC6;\r\xB7\x18W\x11\x02\xCBf.\xC2\x87\xDF\xDD[|\xF0\x97\x15\xC6\xCF\xCD\x93\x1C\x11S&L\x89\xE6\xCA\xC9\xAD\xAD\x1F\xE6\x8D\x86\xF3$\x8BfS(3\x9F\x7F\xEFZ \xB7\xDC{f\xF1\xB7-\x18\x94\xB8}\x93%,{X\x85\xBD(\xBD\xAD\x00,O\xAC\xECJ}\x99\xC7\xE2\xB6\x11\x9D\xDF\x12\xA5\x8F|\xF8\xC3Q\xDA\x95\x12\xEFH\xFFt\xCD\x854jJ\xE9\xE7\xC4\xDD|\xD4}w\xDAJ8\xAE\x17"
130
+ #
131
+ def public_encrypt(data, padding: :pkcs1)
132
+ padding_const = PADDINGS.fetch(padding) do
133
+ raise(ArgumentError,"padding must be #{PADDINGS.keys.map(&:inspect).join(', ')}: #{padding.inspect}")
134
+ end
135
+
136
+ super(data,padding_const)
137
+ end
138
+
139
+ #
140
+ # Decrypts data using the private key.
141
+ #
142
+ # @param [String] data
143
+ # The data to decrypt.
144
+ #
145
+ # @param [:pkcs1_oaep, :pkcs1, :sslv23, nil, false] padding
146
+ # Optional padding mode. `nil` and `false` will disable padding.
147
+ #
148
+ # @return [String]
149
+ # The decrypted data.
150
+ #
151
+ # @example
152
+ # encrypted = "i;k\x89\xE9\x92\xA5\xAB\xBAc\xC6;\r\xB7\x18W\x11\x02\xCBf.\xC2\x87\xDF\xDD[|\xF0\x97\x15\xC6\xCF\xCD\x93\x1C\x11S&L\x89\xE6\xCA\xC9\xAD\xAD\x1F\xE6\x8D\x86\xF3$\x8BfS(3\x9F\x7F\xEFZ \xB7\xDC{f\xF1\xB7-\x18\x94\xB8}\x93%,{X\x85\xBD(\xBD\xAD\x00,O\xAC\xECJ}\x99\xC7\xE2\xB6\x11\x9D\xDF\x12\xA5\x8F|\xF8\xC3Q\xDA\x95\x12\xEFH\xFFt\xCD\x854jJ\xE9\xE7\xC4\xDD|\xD4}w\xDAJ8\xAE\x17"
153
+ # rsa = Crypto::Key::RSA.load_file('key.pem')
154
+ # rsa.private_decrypt(encrypted, padding: pkcs1_oaep)
155
+ # # => "top secret"
156
+ #
157
+ def private_decrypt(data, padding: :pkcs1)
158
+ padding_const = PADDINGS.fetch(padding) do
159
+ raise(ArgumentError,"padding must be #{PADDINGS.keys.map(&:inspect).join(', ')}: #{padding.inspect}")
160
+ end
161
+
162
+ super(data,padding_const)
163
+ end
164
+
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end