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,779 @@
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
+ require 'ronin/support/crypto/hmac'
21
+ require 'ronin/support/crypto/cipher'
22
+ require 'ronin/support/crypto/cipher/aes'
23
+ require 'ronin/support/crypto/cipher/aes128'
24
+ require 'ronin/support/crypto/cipher/aes256'
25
+ require 'ronin/support/crypto/key/rsa'
26
+ require 'ronin/support/crypto/cert'
27
+ require 'ronin/support/crypto/cert_chain'
28
+ require 'ronin/support/crypto/mixin'
29
+ require 'ronin/support/crypto/core_ext'
30
+
31
+ module Ronin
32
+ module Support
33
+ #
34
+ # {Crypto} provides a nicer more user-friendly API ontop of `OpenSSL`.
35
+ #
36
+ # @api public
37
+ #
38
+ # @since 1.0.0
39
+ #
40
+ module Crypto
41
+ #
42
+ # Looks up a digest.
43
+ #
44
+ # @param [String, Symbol] name
45
+ # The name of the digest.
46
+ #
47
+ # @return [OpenSSL::Digest]
48
+ # The OpenSSL Digest class.
49
+ #
50
+ # @example
51
+ # Crypto.digest(:sha256)
52
+ # # => OpenSSL::Digest::SHA256
53
+ #
54
+ # @see http://rubydoc.info/stdlib/openssl/OpenSSL/Digest
55
+ #
56
+ def self.digest(name)
57
+ OpenSSL::Digest.const_get(name.upcase)
58
+ end
59
+
60
+ #
61
+ # Creates a new HMAC.
62
+ #
63
+ # @param [String, nil] data
64
+ # The optional data to sign.
65
+ #
66
+ # @param [String] key
67
+ # The secret key for the HMAC.
68
+ #
69
+ # @param [Symbol] digest
70
+ # The digest algorithm for the HMAC.
71
+ #
72
+ # @yield [hmac]
73
+ # If a block is given, it will be passed the new HMAC object, which can
74
+ # then be populated.
75
+ #
76
+ # @yieldparam [OpenSSL::HMAC] hmac
77
+ # The new HMAC object.
78
+ #
79
+ # @return [OpenSSL::HMAC]
80
+ # The HMAC object.
81
+ #
82
+ # @example
83
+ # hmac = Crypto.hmac("hello world", key: 'secret')
84
+ # # => #<Ronin::Support::Crypto::HMAC: 03376ee7ad7bbfceee98660439a4d8b125122a5a>
85
+ # hmac.hexdigest
86
+ # # => "03376ee7ad7bbfceee98660439a4d8b125122a5a"
87
+ # hmac.digest
88
+ # # => "\x037n\xE7\xAD{\xBF\xCE\xEE\x98f\x049\xA4\xD8\xB1%\x12*Z"
89
+ #
90
+ # @example with a block:
91
+ # hmac = Crypto.hmac("hello world", key: 'secret') do |hmac|
92
+ # hmac << "hello"
93
+ # hmac << " world"
94
+ # end
95
+ # # => #<Ronin::Support::Crypto::HMAC: 03376ee7ad7bbfceee98660439a4d8b125122a5a>
96
+ #
97
+ # @see HMAC
98
+ #
99
+ def self.hmac(data=nil, key: , digest: :sha1)
100
+ hmac = HMAC.new(key,digest(digest).new)
101
+
102
+ if block_given? then yield hmac
103
+ elsif data then hmac.update(data)
104
+ end
105
+
106
+ return hmac
107
+ end
108
+
109
+ #
110
+ # The list of supported ciphers.
111
+ #
112
+ # @return [Array<String>]
113
+ # The list of supported cipher names.
114
+ #
115
+ # @see Cipher.supported
116
+ #
117
+ # @example
118
+ # Cipher.supported
119
+ # # => ["RC5",
120
+ # # "aes-128-cbc",
121
+ # # "aes-128-cbc-hmac-sha1",
122
+ # # "aes-128-cbc-hmac-sha256",
123
+ # # ...]
124
+ #
125
+ # @see Cipher.supported
126
+ #
127
+ def self.ciphers
128
+ Cipher.supported
129
+ end
130
+
131
+ #
132
+ # Creates a cipher.
133
+ #
134
+ # @param [String] name
135
+ # The cipher name.
136
+ #
137
+ # @param [Hash{Symbol => Object}] kwargs
138
+ # Additional keyword arguments for {Cipher#initialize}.
139
+ #
140
+ # @option kwargs [:encrypt, :decrypt] :direction
141
+ # Specifies whether to encrypt or decrypt data.
142
+ #
143
+ # @option kwargs [Symbol] :hash (:sha256)
144
+ # The algorithm to hash the `:password`.
145
+ #
146
+ # @option kwargs [String] :key
147
+ # The secret key to use.
148
+ #
149
+ # @option kwargs [String] :password
150
+ # The password for the cipher.
151
+ #
152
+ # @option kwargs [String] :iv
153
+ # The optional Initial Vector (IV).
154
+ #
155
+ # @option kwargs [Integer] :padding
156
+ # Sets the padding for the cipher.
157
+ #
158
+ # @return [OpenSSL::Cipher]
159
+ # The newly created cipher.
160
+ #
161
+ # @raise [ArgumentError]
162
+ # Either the the `key:` or `password:` keyword argument must be given.
163
+ #
164
+ # @example
165
+ # Crypto.cipher('aes-128-cbc', direction: :encrypt, key 'secret'.md5)
166
+ # # => #<OpenSSL::Cipher:0x0000000170d108>
167
+ #
168
+ # @see Cipher
169
+ #
170
+ def self.cipher(name,**kwargs)
171
+ Cipher.new(name,**kwargs)
172
+ end
173
+
174
+ #
175
+ # Encrypts data using the cipher.
176
+ #
177
+ # @param [#to_s] data
178
+ # The data to encrypt.
179
+ #
180
+ # @param [String] cipher
181
+ # The cipher name (ex: `"aes-256-cbc"`).
182
+ #
183
+ # @param [Hash{Symbol => Object}] kwargs
184
+ # Additional keyword arguments for {cipher}.
185
+ #
186
+ # @option kwargs [Symbol] :hash (:sha256)
187
+ # The algorithm to hash the `:password`.
188
+ #
189
+ # @option kwargs [String] :key
190
+ # The secret key to use.
191
+ #
192
+ # @option kwargs [String] :password
193
+ # The password for the cipher.
194
+ #
195
+ # @option kwargs [String] :iv
196
+ # The optional Initial Vector (IV).
197
+ #
198
+ # @option kwargs [Integer] :padding
199
+ # Sets the padding for the cipher.
200
+ #
201
+ # @return [String]
202
+ # The encrypted data.
203
+ #
204
+ # @raise [ArgumentError]
205
+ # Either the the `key:` or `password:` keyword argument must be given.
206
+ #
207
+ # @see Cipher#encrypt
208
+ #
209
+ def self.encrypt(data, cipher: ,**kwargs)
210
+ self.cipher(cipher, direction: :encrypt, **kwargs).encrypt(data)
211
+ end
212
+
213
+ #
214
+ # Decrypts data using the cipher.
215
+ #
216
+ # @param [#to_s] data
217
+ # The data to decrypt.
218
+ #
219
+ # @param [String] cipher
220
+ # The cipher name (ex: `"aes-256-cbc"`).
221
+ #
222
+ # @param [Hash{Symbol => Object}] kwargs
223
+ # Additional keyword arguments for {cipher}.
224
+ #
225
+ # @option kwargs [Symbol] :hash (:sha256)
226
+ # The algorithm to hash the `:password`.
227
+ #
228
+ # @option kwargs [String] :key
229
+ # The secret key to use.
230
+ #
231
+ # @option kwargs [String] :password
232
+ # The password for the cipher.
233
+ #
234
+ # @option kwargs [String] :iv
235
+ # The optional Initial Vector (IV).
236
+ #
237
+ # @option kwargs [Integer] :padding
238
+ # Sets the padding for the cipher.
239
+ #
240
+ # @return [String]
241
+ # The decrypted data.
242
+ #
243
+ # @raise [ArgumentError]
244
+ # Either the the `key:` or `password:` keyword argument must be given.
245
+ #
246
+ # @see Cipher#decrypt
247
+ #
248
+ def self.decrypt(data, cipher: ,**kwargs)
249
+ self.cipher(cipher, direction: :decrypt, **kwargs).decrypt(data)
250
+ end
251
+
252
+ #
253
+ # Creates a new AES cipher.
254
+ #
255
+ # @param [Hash{Symbol => Object}] kwargs
256
+ # Additional keyword arguments for {Cipher::AES#initialize}.
257
+ #
258
+ # @option kwargs [Integer] :key_size
259
+ # The desired key size in bits.
260
+ #
261
+ # @option kwargs [:cbc, :cfb, :ofb, :ctr, Symbol] :mode (:cbc)
262
+ # The desired AES cipher mode.
263
+ #
264
+ # @option kwargs [Symbol] :hash (:sha256)
265
+ # The algorithm to hash the `:password`.
266
+ #
267
+ # @option kwargs [String] :key
268
+ # The secret key to use.
269
+ #
270
+ # @option kwargs [String] :password
271
+ # The password for the cipher.
272
+ #
273
+ # @option kwargs [String] :iv
274
+ # The optional Initial Vector (IV).
275
+ #
276
+ # @option kwargs [Integer] :padding
277
+ # Sets the padding for the cipher.
278
+ #
279
+ # @return [Cipher::AES]
280
+ # The new AES cipher.
281
+ #
282
+ # @example
283
+ # Crypto.aes_cipher(key_size: 256, direction: :encrypt, password: 's3cr3t', hash: :sha256)
284
+ # # => #<Ronin::Support::Crypto::Cipher::AES:0x00007f2b84dfa6b8 @key_size=256, @mode=:cbc>
285
+ #
286
+ # @see Cipher::AES
287
+ #
288
+ def self.aes_cipher(**kwargs)
289
+ Cipher::AES.new(**kwargs)
290
+ end
291
+
292
+ #
293
+ # Encrypts data using AES.
294
+ #
295
+ # @param [#to_s] data
296
+ # The data to encrypt.
297
+ #
298
+ # @param [Hash{Symbol => Object}] kwargs
299
+ # Additional keyword arguments for {aes_cipher}.
300
+ #
301
+ # @option kwargs [Integer] :key_size
302
+ # The desired key size in bits.
303
+ #
304
+ # @option kwargs [:cbc, :cfb, :ofb, :ctr, Symbol] mode (:cbc)
305
+ # The desired AES cipher mode.
306
+ #
307
+ # @option kwargs [Symbol] :hash (:sha256)
308
+ # The algorithm to hash the `:password`.
309
+ #
310
+ # @option kwargs [String] :key
311
+ # The secret key to use.
312
+ #
313
+ # @option kwargs [String] :password
314
+ # The password for the cipher.
315
+ #
316
+ # @option kwargs [String] :iv
317
+ # The optional Initial Vector (IV).
318
+ #
319
+ # @option kwargs [Integer] :padding
320
+ # Sets the padding for the cipher.
321
+ #
322
+ # @return [String]
323
+ # The encrypted data.
324
+ #
325
+ # @raise [ArgumentError]
326
+ # Either the the `key:` or `password:` keyword argument must be given.
327
+ #
328
+ def self.aes_encrypt(data,**kwargs)
329
+ self.aes_cipher(direction: :encrypt, **kwargs).encrypt(data)
330
+ end
331
+
332
+ #
333
+ # Decrypts data using AES.
334
+ #
335
+ # @param [#to_s] data
336
+ # The data to encrypt.
337
+ #
338
+ # @param [Hash{Symbol => Object}] kwargs
339
+ # Additional keyword arguments for {aes_cipher}.
340
+ #
341
+ # @option kwargs [Integer] :key_size
342
+ # The desired key size in bits.
343
+ #
344
+ # @option kwargs [:cbc, :cfb, :ofb, :ctr, Symbol] mode (:cbc)
345
+ # The desired AES cipher mode.
346
+ #
347
+ # @option kwargs [Symbol] :hash (:sha256)
348
+ # The algorithm to hash the `:password`.
349
+ #
350
+ # @option kwargs [String] :key
351
+ # The secret key to use.
352
+ #
353
+ # @option kwargs [String] :password
354
+ # The password for the cipher.
355
+ #
356
+ # @option kwargs [String] :iv
357
+ # The optional Initial Vector (IV).
358
+ #
359
+ # @option kwargs [Integer] :padding
360
+ # Sets the padding for the cipher.
361
+ #
362
+ # @return [String]
363
+ # The encrypted data.
364
+ #
365
+ # @raise [ArgumentError]
366
+ # Either the the `key:` or `password:` keyword argument must be given.
367
+ #
368
+ def self.aes_decrypt(data,**kwargs)
369
+ self.aes_cipher(direction: :decrypt, **kwargs).decrypt(data)
370
+ end
371
+
372
+ #
373
+ # Creates a new AES-128 cipher.
374
+ #
375
+ # @param [Hash{Symbol => Object}] kwargs
376
+ # Additional keyword arguments for {Cipher::AES128#initialize}.
377
+ #
378
+ # @option kwargs [:cbc, :cfb, :ofb, :ctr, Symbol] :mode (:cbc)
379
+ # The desired AES cipher mode.
380
+ #
381
+ # @option kwargs [Symbol] :hash (:md5)
382
+ # The algorithm to hash the `:password`.
383
+ #
384
+ # @option kwargs [String] :key
385
+ # The secret key to use.
386
+ #
387
+ # @option kwargs [String] :password
388
+ # The password for the cipher.
389
+ #
390
+ # @option kwargs [String] :iv
391
+ # The optional Initial Vector (IV).
392
+ #
393
+ # @option kwargs [Integer] :padding
394
+ # Sets the padding for the cipher.
395
+ #
396
+ # @return [Cipher::AES]
397
+ # The new AES cipher.
398
+ #
399
+ # @example
400
+ # Crypto.aes128_cipher(direction: :encrypt, password: 's3cr3t')
401
+ # # => #<Ronin::Support::Crypto::Cipher::AES128:0x00007f8bde789648 @key_size=128, @mode=:cbc>
402
+ #
403
+ # @see Cipher::AES128
404
+ #
405
+ def self.aes128_cipher(**kwargs)
406
+ Cipher::AES128.new(**kwargs)
407
+ end
408
+
409
+ #
410
+ # Encrypts data using AES-128.
411
+ #
412
+ # @param [#to_s] data
413
+ # The data to encrypt.
414
+ #
415
+ # @param [Hash{Symbol => Object}] kwargs
416
+ # Additional keyword arguments for {aes128_cipher}.
417
+ #
418
+ # @option kwargs [:cbc, :cfb, :ofb, :ctr, Symbol] mode (:cbc)
419
+ # The desired AES cipher mode.
420
+ #
421
+ # @option kwargs [Symbol] :hash (:md5)
422
+ # The algorithm to hash the `:password`.
423
+ #
424
+ # @option kwargs [String] :key
425
+ # The secret key to use.
426
+ #
427
+ # @option kwargs [String] :password
428
+ # The password for the cipher.
429
+ #
430
+ # @option kwargs [String] :iv
431
+ # The optional Initial Vector (IV).
432
+ #
433
+ # @option kwargs [Integer] :padding
434
+ # Sets the padding for the cipher.
435
+ #
436
+ # @return [String]
437
+ # The encrypted data.
438
+ #
439
+ # @raise [ArgumentError]
440
+ # Either the the `key:` or `password:` keyword argument must be given.
441
+ #
442
+ def self.aes128_encrypt(data,**kwargs)
443
+ self.aes128_cipher(direction: :encrypt, **kwargs).encrypt(data)
444
+ end
445
+
446
+ #
447
+ # Decrypts data using AES-128.
448
+ #
449
+ # @param [#to_s] data
450
+ # The data to encrypt.
451
+ #
452
+ # @param [Hash{Symbol => Object}] kwargs
453
+ # Additional keyword arguments for {aes128_cipher}.
454
+ #
455
+ # @option kwargs [:cbc, :cfb, :ofb, :ctr, Symbol] mode (:cbc)
456
+ # The desired AES cipher mode.
457
+ #
458
+ # @option kwargs [Symbol] :hash (:md5)
459
+ # The algorithm to hash the `:password`.
460
+ #
461
+ # @option kwargs [String] :key
462
+ # The secret key to use.
463
+ #
464
+ # @option kwargs [String] :password
465
+ # The password for the cipher.
466
+ #
467
+ # @option kwargs [String] :iv
468
+ # The optional Initial Vector (IV).
469
+ #
470
+ # @option kwargs [Integer] :padding
471
+ # Sets the padding for the cipher.
472
+ #
473
+ # @return [String]
474
+ # The encrypted data.
475
+ #
476
+ # @raise [ArgumentError]
477
+ # Either the the `key:` or `password:` keyword argument must be given.
478
+ #
479
+ def self.aes128_decrypt(data,**kwargs)
480
+ self.aes128_cipher(direction: :decrypt, **kwargs).decrypt(data)
481
+ end
482
+
483
+ #
484
+ # Creates a new AES-256 cipher.
485
+ #
486
+ # @param [Hash{Symbol => Object}] kwargs
487
+ # Additional keyword arguments for {Cipher::AES256#initialize}.
488
+ #
489
+ # @option kwargs [:cbc, :cfb, :ofb, :ctr, Symbol] :mode (:cbc)
490
+ # The desired AES cipher mode.
491
+ #
492
+ # @option kwargs [Symbol] :hash (:sha256)
493
+ # The algorithm to hash the `:password`.
494
+ #
495
+ # @option kwargs [String] :key
496
+ # The secret key to use.
497
+ #
498
+ # @option kwargs [String] :password
499
+ # The password for the cipher.
500
+ #
501
+ # @option kwargs [String] :iv
502
+ # The optional Initial Vector (IV).
503
+ #
504
+ # @option kwargs [Integer] :padding
505
+ # Sets the padding for the cipher.
506
+ #
507
+ # @return [Cipher::AES]
508
+ # The new AES cipher.
509
+ #
510
+ # @example
511
+ # Crypto.aes256_cipher(direction: :encrypt, password: 's3cr3t')
512
+ # # => #<Ronin::Support::Crypto::Cipher::AES256:0x00007f8bde789648 @key_size=256, @mode=:cbc>
513
+ #
514
+ # @see Cipher::AES256
515
+ #
516
+ def self.aes256_cipher(**kwargs)
517
+ Cipher::AES256.new(**kwargs)
518
+ end
519
+
520
+ #
521
+ # Encrypts data using AES-256.
522
+ #
523
+ # @param [#to_s] data
524
+ # The data to encrypt.
525
+ #
526
+ # @param [Hash{Symbol => Object}] kwargs
527
+ # Additional keyword arguments for {aes256_cipher}.
528
+ #
529
+ # @option kwargs [:cbc, :cfb, :ofb, :ctr, Symbol] mode (:cbc)
530
+ # The desired AES cipher mode.
531
+ #
532
+ # @option kwargs [Symbol] :hash (:sha256)
533
+ # The algorithm to hash the `:password`.
534
+ #
535
+ # @option kwargs [String] :key
536
+ # The secret key to use.
537
+ #
538
+ # @option kwargs [String] :password
539
+ # The password for the cipher.
540
+ #
541
+ # @option kwargs [String] :iv
542
+ # The optional Initial Vector (IV).
543
+ #
544
+ # @option kwargs [Integer] :padding
545
+ # Sets the padding for the cipher.
546
+ #
547
+ # @return [String]
548
+ # The encrypted data.
549
+ #
550
+ # @raise [ArgumentError]
551
+ # Either the the `key:` or `password:` keyword argument must be given.
552
+ #
553
+ def self.aes256_encrypt(data,**kwargs)
554
+ self.aes256_cipher(direction: :encrypt, **kwargs).encrypt(data)
555
+ end
556
+
557
+ #
558
+ # Decrypts data using AES-256.
559
+ #
560
+ # @param [#to_s] data
561
+ # The data to encrypt.
562
+ #
563
+ # @param [Hash{Symbol => Object}] kwargs
564
+ # Additional keyword arguments for {aes256_cipher}.
565
+ #
566
+ # @option kwargs [:cbc, :cfb, :ofb, :ctr, Symbol] mode (:cbc)
567
+ # The desired AES cipher mode.
568
+ #
569
+ # @option kwargs [Symbol] :hash (:sh256)
570
+ # The algorithm to hash the `:password`.
571
+ #
572
+ # @option kwargs [String] :key
573
+ # The secret key to use.
574
+ #
575
+ # @option kwargs [String] :password
576
+ # The password for the cipher.
577
+ #
578
+ # @option kwargs [String] :iv
579
+ # The optional Initial Vector (IV).
580
+ #
581
+ # @option kwargs [Integer] :padding
582
+ # Sets the padding for the cipher.
583
+ #
584
+ # @return [String]
585
+ # The encrypted data.
586
+ #
587
+ # @raise [ArgumentError]
588
+ # Either the the `key:` or `password:` keyword argument must be given.
589
+ #
590
+ def self.aes256_decrypt(data,**kwargs)
591
+ self.aes256_cipher(direction: :decrypt, **kwargs).decrypt(data)
592
+ end
593
+
594
+ #
595
+ # Loads an RSA key.
596
+ #
597
+ # @param [String, nil] key
598
+ # The PEM or DER encoded RSA key string.
599
+ #
600
+ # @param [String, nil] path
601
+ # The path to the PEM or DER encoded RSA key file.
602
+ #
603
+ # @param [String, nil] password
604
+ # The optional password to decrypt the encrypted RSA key.
605
+ #
606
+ # @return [Key::RSA]
607
+ #
608
+ # @raise [ArgumentError]
609
+ # Either the `key:` or `key_file:` keyword argument must be given.
610
+ #
611
+ def self.rsa_key(key=nil, path: nil, password: nil)
612
+ if path
613
+ Key::RSA.load_file(path, password: password)
614
+ elsif key
615
+ case key
616
+ when Key::RSA then key
617
+ when OpenSSL::PKey::RSA then Key::RSA.new(key)
618
+ when String then Key::RSA.load(key, password: password)
619
+ else
620
+ end
621
+ else
622
+ raise(ArgumentError,"either key: or key_file: keyword arguments must be given")
623
+ end
624
+ end
625
+
626
+ #
627
+ # Encrypts data using a RSA key.
628
+ #
629
+ # @param [String] data
630
+ # The data to encrypt.
631
+ #
632
+ # @param [String, nil] key
633
+ # The PEM or DER encoded RSA key string.
634
+ #
635
+ # @param [String, nil] key_file
636
+ # The path to the PEM or DER encoded RSA key file.
637
+ #
638
+ # @param [String, nil] key_password
639
+ # The optional password to decrypt the encrypted RSA key.
640
+ #
641
+ # @param [Hash{Symbol => Object}] kwargs
642
+ # Additional keyword arguments for {Key::RSA#public_encrypt}.
643
+ #
644
+ # @option kwargs [:pkcs1_oaep, :pkcs1, :sslv23,
645
+ # nil, false] :padding (:pkcs1)
646
+ # Optional padding mode. `nil` and `false` will disable padding.
647
+ #
648
+ # @return [String]
649
+ # The encrypted data.
650
+ #
651
+ # @raise [ArgumentError]
652
+ # Either the `key:` or `key_file:` keyword argument must be given.
653
+ #
654
+ def self.rsa_encrypt(data, key: nil, key_file: nil, key_password: nil, **kwargs)
655
+ rsa = rsa_key(key, path: key_file, password: key_password)
656
+
657
+ return rsa.public_encrypt(data,**kwargs)
658
+ end
659
+
660
+ #
661
+ # Decrypts data using a RSA key.
662
+ #
663
+ # @param [String] data
664
+ # The data to decrypt.
665
+ #
666
+ # @param [String, nil] key
667
+ # The PEM or DER encoded RSA key string.
668
+ #
669
+ # @param [String, nil] key_file
670
+ # The path to the PEM or DER encoded RSA key file.
671
+ #
672
+ # @param [String, nil] key_password
673
+ # The optional password to decrypt the encrypted RSA key.
674
+ #
675
+ # @param [Hash{Symbol => Object}] kwargs
676
+ # Additional keyword arguments for {Key::RSA#private_decrypt}.
677
+ #
678
+ # @option kwargs [:pkcs1_oaep, :pkcs1, :sslv23,
679
+ # nil, false] :padding (:pkcs1)
680
+ # Optional padding mode. `nil` and `false` will disable padding.
681
+ #
682
+ # @return [String]
683
+ # The decrypted data.
684
+ #
685
+ # @raise [ArgumentError]
686
+ # Either the `key:` or `key_file:` keyword argument must be given.
687
+ #
688
+ def self.rsa_decrypt(data, key: nil, key_file: nil, key_password: nil, **kwargs)
689
+ rsa = rsa_key(key, path: key_file, password: key_password)
690
+
691
+ return rsa.private_decrypt(data,**kwargs)
692
+ end
693
+
694
+ #
695
+ # Rotates the characters in the given string using the given alphabet.
696
+ #
697
+ # @param [String] string
698
+ # The String to rotate.
699
+ #
700
+ # @param [Integer] n
701
+ # The number of characters to shift each character by.
702
+ #
703
+ # @param [Array<Array<String>>] alphabets
704
+ # The alphabet(s) to use.
705
+ #
706
+ # @return [String]
707
+ # The rotated string.
708
+ #
709
+ # @note
710
+ # This method was added as a joke and should not be used for secure
711
+ # cryptographic communications.
712
+ #
713
+ # @example ROT13 "encryption":
714
+ # Crypto.rot("The quick brown fox jumps over 13 lazy dogs.")
715
+ # # => "Gur dhvpx oebja sbk whzcf bire 46 ynml qbtf."
716
+ #
717
+ # @example ROT13 "decryption":
718
+ # Crypto.rot("Gur dhvpx oebja sbk whzcf bire 46 ynml qbtf.", -13)
719
+ # # => "The quick brown fox jumps over 13 lazy dogs."
720
+ #
721
+ def self.rot(string,n=13, alphabets: [('A'..'Z').to_a, ('a'..'z').to_a, ('0'..'9').to_a])
722
+ translation_table = {}
723
+
724
+ alphabets.each do |alphabet|
725
+ modulo = alphabet.count
726
+
727
+ alphabet.each_with_index do |char,index|
728
+ translation_table[char] = alphabet[(index + n) % modulo]
729
+ end
730
+ end
731
+
732
+ new_string = String.new(encoding: string.encoding)
733
+
734
+ string.each_char do |char|
735
+ new_string << translation_table.fetch(char,char)
736
+ end
737
+
738
+ return new_string
739
+ end
740
+
741
+ #
742
+ # XOR encodes the String.
743
+ #
744
+ # @param [String] string
745
+ # The String to XOR.
746
+ #
747
+ # @param [Enumerable, Integer] key
748
+ # The byte to XOR against each byte in the String.
749
+ #
750
+ # @return [String]
751
+ # The XOR encoded String.
752
+ #
753
+ # @example
754
+ # Crypto.xor("hello", 0x41)
755
+ # # => ")$--."
756
+ #
757
+ # @example
758
+ # Crypto.xor("hello again", [0x55, 0x41, 0xe1])
759
+ # # => "=$\x8d9.\xc14&\x80</"
760
+ #
761
+ def self.xor(string,key)
762
+ key = case key
763
+ when Integer then [key]
764
+ when String then key.bytes
765
+ else key
766
+ end
767
+
768
+ key = key.cycle
769
+ result = String.new(encoding: string.encoding)
770
+
771
+ string.bytes.each do |b|
772
+ result << (b ^ key.next).chr
773
+ end
774
+
775
+ return result
776
+ end
777
+ end
778
+ end
779
+ end