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.
- checksums.yaml +7 -0
- data/.editorconfig +11 -0
- data/.github/workflows/ruby.yml +27 -0
- data/.gitignore +7 -6
- data/.mailmap +1 -0
- data/.ruby-version +1 -0
- data/.yardopts +1 -2
- data/ChangeLog.md +533 -137
- data/Gemfile +20 -20
- data/README.md +137 -61
- data/Rakefile +29 -10
- data/data/text/homoglyphs/ascii.txt +8 -0
- data/data/text/homoglyphs/cyrillic.txt +33 -0
- data/data/text/homoglyphs/full_width.txt +81 -0
- data/data/text/homoglyphs/greek.txt +21 -0
- data/data/text/homoglyphs/latin_numbers.txt +14 -0
- data/data/text/homoglyphs/punctuation.txt +7 -0
- data/data/text/patterns/network/public_suffix.rb.erb +44 -0
- data/examples/ssl_proxy.rb +38 -0
- data/examples/tcp_proxy.rb +41 -0
- data/gemspec.yml +25 -15
- data/lib/ronin/support/archive/core_ext/file.rb +118 -0
- data/lib/ronin/{formatting/sql.rb → support/archive/core_ext.rb} +6 -7
- data/lib/ronin/support/archive/mixin.rb +213 -0
- data/lib/ronin/support/archive/tar/reader.rb +135 -0
- data/lib/ronin/support/archive/tar/writer.rb +197 -0
- data/lib/ronin/support/archive/tar.rb +155 -0
- data/lib/ronin/support/archive/zip/reader/entry.rb +134 -0
- data/lib/ronin/support/archive/zip/reader/statistics.rb +76 -0
- data/lib/ronin/support/archive/zip/reader.rb +273 -0
- data/lib/ronin/support/archive/zip/writer.rb +175 -0
- data/lib/ronin/support/archive/zip.rb +105 -0
- data/lib/ronin/support/archive.rb +211 -0
- data/lib/ronin/support/binary/array.rb +255 -0
- data/lib/ronin/support/binary/bit_flip.rb +147 -0
- data/lib/ronin/support/binary/buffer.rb +2027 -0
- data/lib/ronin/support/binary/byte_slice.rb +324 -0
- data/lib/ronin/support/binary/core_ext/array.rb +75 -0
- data/lib/ronin/support/binary/core_ext/float.rb +80 -0
- data/lib/ronin/support/binary/core_ext/integer.rb +305 -0
- data/lib/ronin/support/binary/core_ext/io.rb +38 -0
- data/lib/ronin/support/binary/core_ext/string.rb +115 -0
- data/lib/ronin/{formatting/extensions/text.rb → support/binary/core_ext.rb} +9 -9
- data/lib/ronin/support/binary/cstring.rb +259 -0
- data/lib/ronin/support/binary/ctypes/aggregate_type.rb +98 -0
- data/lib/ronin/support/binary/ctypes/arch/arm/big_endian.rb +77 -0
- data/lib/ronin/support/binary/ctypes/arch/arm.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/arm64/big_endian.rb +77 -0
- data/lib/ronin/support/binary/ctypes/arch/arm64.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/mips/little_endian.rb +77 -0
- data/lib/ronin/support/binary/ctypes/arch/mips.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/mips64/little_endian.rb +77 -0
- data/lib/ronin/support/binary/ctypes/arch/mips64.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/ppc.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/ppc64.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/x86.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/x86_64.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch.rb +30 -0
- data/lib/ronin/support/binary/ctypes/array_object_type.rb +164 -0
- data/lib/ronin/support/binary/ctypes/array_type.rb +232 -0
- data/lib/ronin/support/binary/ctypes/big_endian.rb +195 -0
- data/lib/ronin/support/binary/ctypes/char_type.rb +59 -0
- data/lib/ronin/support/binary/ctypes/char_types.rb +39 -0
- data/lib/ronin/support/binary/ctypes/enum_type.rb +181 -0
- data/lib/ronin/support/binary/ctypes/float32_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/float64_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/float_type.rb +62 -0
- data/lib/ronin/support/binary/ctypes/int16_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/int32_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/int64_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/int8_type.rb +41 -0
- data/lib/ronin/support/binary/ctypes/int_type.rb +62 -0
- data/lib/ronin/support/binary/ctypes/little_endian.rb +195 -0
- data/lib/ronin/support/binary/ctypes/mixin.rb +135 -0
- data/lib/ronin/support/binary/ctypes/native.rb +205 -0
- data/lib/ronin/support/binary/ctypes/network.rb +29 -0
- data/lib/ronin/support/binary/ctypes/object_type.rb +55 -0
- data/lib/ronin/support/binary/ctypes/os/bsd.rb +65 -0
- data/lib/ronin/support/binary/ctypes/os/freebsd.rb +215 -0
- data/lib/ronin/support/binary/ctypes/os/linux.rb +193 -0
- data/lib/ronin/support/binary/ctypes/os/macos.rb +151 -0
- data/lib/ronin/support/binary/ctypes/os/netbsd.rb +147 -0
- data/lib/ronin/support/binary/ctypes/os/openbsd.rb +168 -0
- data/lib/ronin/support/binary/ctypes/os/unix.rb +78 -0
- data/lib/ronin/support/binary/ctypes/os/windows.rb +125 -0
- data/lib/ronin/support/binary/ctypes/os.rb +125 -0
- data/lib/ronin/support/binary/ctypes/scalar_type.rb +200 -0
- data/lib/ronin/support/binary/ctypes/string_type.rb +143 -0
- data/lib/ronin/support/binary/ctypes/struct_object_type.rb +173 -0
- data/lib/ronin/support/binary/ctypes/struct_type.rb +359 -0
- data/lib/ronin/support/binary/ctypes/type.rb +193 -0
- data/lib/ronin/support/binary/ctypes/type_resolver.rb +206 -0
- data/lib/ronin/support/binary/ctypes/uint16_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/uint32_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/uint64_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/uint8_type.rb +41 -0
- data/lib/ronin/support/binary/ctypes/uint_type.rb +59 -0
- data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +258 -0
- data/lib/ronin/support/binary/ctypes/union_object_type.rb +173 -0
- data/lib/ronin/support/binary/ctypes/union_type.rb +261 -0
- data/lib/ronin/support/binary/ctypes.rb +462 -0
- data/lib/ronin/support/binary/hexdump/core_ext/file.rb +118 -0
- data/lib/ronin/support/binary/hexdump/core_ext/string.rb +115 -0
- data/lib/ronin/support/binary/hexdump/core_ext.rb +20 -0
- data/lib/ronin/support/binary/hexdump/parser.rb +492 -0
- data/lib/ronin/support/binary/hexdump.rb +20 -0
- data/lib/ronin/support/binary/memory.rb +268 -0
- data/lib/ronin/support/binary/packet.rb +33 -0
- data/lib/ronin/support/binary/stack.rb +256 -0
- data/lib/ronin/support/binary/stream/methods.rb +1755 -0
- data/lib/ronin/support/binary/stream.rb +151 -0
- data/lib/ronin/support/binary/struct/member.rb +86 -0
- data/lib/ronin/support/binary/struct.rb +830 -0
- data/lib/ronin/support/binary/template.rb +284 -0
- data/lib/ronin/support/binary/union.rb +162 -0
- data/lib/ronin/support/binary.rb +26 -0
- data/lib/ronin/support/cli/ansi.rb +330 -0
- data/lib/ronin/support/cli/io_shell/core_ext/io.rb +67 -0
- data/lib/ronin/{fuzzing/extensions.rb → support/cli/io_shell/core_ext.rb} +6 -7
- data/lib/ronin/support/cli/io_shell.rb +161 -0
- data/lib/ronin/support/cli/printing.rb +216 -0
- data/lib/ronin/support/cli.rb +20 -0
- data/lib/ronin/support/compression/core_ext/file.rb +70 -0
- data/lib/ronin/support/compression/core_ext/string.rb +101 -0
- data/lib/ronin/{formatting/html.rb → support/compression/core_ext.rb} +6 -7
- data/lib/ronin/support/compression/gzip/reader.rb +70 -0
- data/lib/ronin/support/compression/gzip/writer.rb +74 -0
- data/lib/ronin/support/compression/gzip.rb +105 -0
- data/lib/ronin/support/compression/mixin.rb +180 -0
- data/lib/ronin/{network/extensions/esmtp/net.rb → support/compression/zlib.rb} +9 -10
- data/lib/ronin/support/compression.rb +174 -0
- data/lib/ronin/{extensions → support/core_ext}/enumerable.rb +5 -6
- data/lib/ronin/{extensions → support/core_ext}/file.rb +11 -34
- data/lib/ronin/support/core_ext/integer.rb +37 -0
- data/lib/ronin/support/core_ext/ipaddr.rb +65 -0
- data/lib/ronin/{extensions → support/core_ext}/kernel.rb +10 -9
- data/lib/ronin/{extensions → support/core_ext}/resolv.rb +5 -28
- data/lib/ronin/{extensions → support/core_ext}/string.rb +117 -57
- data/lib/ronin/support/core_ext.rb +33 -0
- data/lib/ronin/support/crypto/cert.rb +522 -0
- data/lib/ronin/support/crypto/cert_chain.rb +204 -0
- data/lib/ronin/support/crypto/cipher/aes.rb +71 -0
- data/lib/ronin/support/crypto/cipher/aes128.rb +54 -0
- data/lib/ronin/support/crypto/cipher/aes256.rb +54 -0
- data/lib/ronin/support/crypto/cipher.rb +194 -0
- data/lib/ronin/support/crypto/core_ext/file.rb +660 -0
- data/lib/ronin/support/crypto/core_ext/string.rb +548 -0
- data/lib/ronin/{binary.rb → support/crypto/core_ext.rb} +7 -8
- data/lib/ronin/support/crypto/hmac.rb +48 -0
- data/lib/ronin/support/crypto/key/dh.rb +122 -0
- data/lib/ronin/support/crypto/key/dsa.rb +103 -0
- data/lib/ronin/support/crypto/key/ec.rb +99 -0
- data/lib/ronin/support/crypto/key/methods.rb +163 -0
- data/lib/ronin/support/crypto/key/rsa.rb +169 -0
- data/lib/ronin/support/crypto/key.rb +105 -0
- data/lib/ronin/support/crypto/mixin.rb +620 -0
- data/lib/ronin/{network/extensions/http/net.rb → support/crypto/openssl.rb} +9 -10
- data/lib/ronin/support/crypto.rb +779 -0
- data/lib/ronin/support/encoding/base16/core_ext/string.rb +63 -0
- data/lib/ronin/support/encoding/base16/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/base16.rb +82 -0
- data/lib/ronin/support/encoding/base32/core_ext/string.rb +63 -0
- data/lib/ronin/support/encoding/base32/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/base32.rb +164 -0
- data/lib/ronin/support/encoding/base64/core_ext/string.rb +76 -0
- data/lib/ronin/support/encoding/base64/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/base64.rb +78 -0
- data/lib/ronin/support/encoding/c/core_ext/integer.rb +82 -0
- data/lib/ronin/support/encoding/c/core_ext/string.rb +125 -0
- data/lib/ronin/support/encoding/c/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/c.rb +277 -0
- data/lib/ronin/support/encoding/core_ext/string.rb +107 -0
- data/lib/ronin/support/encoding/core_ext.rb +33 -0
- data/lib/ronin/support/encoding/hex/core_ext/integer.rb +82 -0
- data/lib/ronin/support/encoding/hex/core_ext/string.rb +133 -0
- data/lib/ronin/support/encoding/hex/core_ext.rb +22 -0
- data/lib/ronin/support/encoding/hex.rb +248 -0
- data/lib/ronin/support/encoding/html/core_ext/integer.rb +106 -0
- data/lib/ronin/support/encoding/html/core_ext/string.rb +130 -0
- data/lib/ronin/support/encoding/html/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/html.rb +233 -0
- data/lib/ronin/support/encoding/http/core_ext/integer.rb +95 -0
- data/lib/ronin/support/encoding/http/core_ext/string.rb +129 -0
- data/lib/ronin/support/encoding/http/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/http.rb +241 -0
- data/lib/ronin/support/encoding/js/core_ext/integer.rb +67 -0
- data/lib/ronin/support/encoding/js/core_ext/string.rb +125 -0
- data/lib/ronin/support/encoding/js/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/js.rb +279 -0
- data/lib/ronin/support/encoding/powershell/core_ext/integer.rb +87 -0
- data/lib/ronin/support/encoding/powershell/core_ext/string.rb +145 -0
- data/lib/ronin/support/encoding/powershell/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/powershell.rb +297 -0
- data/lib/ronin/support/encoding/punycode/core_ext/string.rb +63 -0
- data/lib/ronin/support/encoding/punycode/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/punycode.rb +76 -0
- data/lib/ronin/support/encoding/quoted_printable/core_ext/string.rb +75 -0
- data/lib/ronin/support/encoding/quoted_printable/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/quoted_printable.rb +102 -0
- data/lib/ronin/support/encoding/ruby/core_ext/string.rb +129 -0
- data/lib/ronin/{formatting/binary.rb → support/encoding/ruby/core_ext.rb} +6 -7
- data/lib/ronin/support/encoding/ruby.rb +235 -0
- data/lib/ronin/support/encoding/shell/core_ext/integer.rb +89 -0
- data/lib/ronin/support/encoding/shell/core_ext/string.rb +134 -0
- data/lib/ronin/support/encoding/shell/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/shell.rb +293 -0
- data/lib/ronin/{network/extensions → support/encoding}/smtp.rb +7 -7
- data/lib/ronin/support/encoding/sql/core_ext/string.rb +114 -0
- data/lib/ronin/{formatting/http.rb → support/encoding/sql/core_ext.rb} +6 -7
- data/lib/ronin/support/encoding/sql.rb +124 -0
- data/lib/ronin/support/encoding/uri/core_ext/integer.rb +149 -0
- data/lib/ronin/support/encoding/uri/core_ext/string.rb +195 -0
- data/lib/ronin/support/encoding/uri/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/uri.rb +424 -0
- data/lib/ronin/support/encoding/uuencoding/core_ext/string.rb +73 -0
- data/lib/ronin/support/encoding/uuencoding/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/uuencoding.rb +70 -0
- data/lib/ronin/support/encoding/xml/core_ext/integer.rb +100 -0
- data/lib/ronin/support/encoding/xml/core_ext/string.rb +124 -0
- data/lib/ronin/support/encoding/xml/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/xml.rb +328 -0
- data/lib/ronin/support/encoding.rb +46 -0
- data/lib/ronin/support/home.rb +88 -0
- data/lib/ronin/support/mixin.rb +42 -0
- data/lib/ronin/support/network/asn/dns_record.rb +112 -0
- data/lib/ronin/support/network/asn/list.rb +269 -0
- data/lib/ronin/support/network/asn/record.rb +164 -0
- data/lib/ronin/support/network/asn/record_set.rb +226 -0
- data/lib/ronin/support/network/asn.rb +88 -0
- data/lib/ronin/{binary/hexdump.rb → support/network/core_ext.rb} +6 -7
- data/lib/ronin/support/network/dns/idn.rb +38 -0
- data/lib/ronin/support/network/dns/mixin.rb +941 -0
- data/lib/ronin/support/network/dns/resolver.rb +707 -0
- data/lib/ronin/support/network/dns.rb +1109 -0
- data/lib/ronin/support/network/domain.rb +70 -0
- data/lib/ronin/support/network/email_address.rb +574 -0
- data/lib/ronin/support/network/esmtp/mixin.rb +115 -0
- data/lib/ronin/support/network/exceptions.rb +43 -0
- data/lib/ronin/support/network/ftp/mixin.rb +106 -0
- data/lib/ronin/support/network/host.rb +1473 -0
- data/lib/ronin/support/network/http/cookie.rb +245 -0
- data/lib/ronin/support/network/http/core_ext/uri/http.rb +63 -0
- data/lib/ronin/support/network/http/core_ext.rb +19 -0
- data/lib/ronin/support/network/http/mixin.rb +890 -0
- data/lib/ronin/support/network/http/request.rb +215 -0
- data/lib/ronin/support/network/http/set_cookie.rb +210 -0
- data/lib/ronin/support/network/http/user_agents.rb +115 -0
- data/lib/ronin/support/network/http.rb +2582 -0
- data/lib/ronin/support/network/imap/mixin.rb +133 -0
- data/lib/ronin/support/network/ip/mixin.rb +114 -0
- data/lib/ronin/support/network/ip.rb +540 -0
- data/lib/ronin/support/network/ip_range/cidr.rb +252 -0
- data/lib/ronin/support/network/ip_range/glob.rb +309 -0
- data/lib/ronin/support/network/ip_range/range.rb +249 -0
- data/lib/ronin/support/network/ip_range.rb +284 -0
- data/lib/ronin/support/network/mixin.rb +58 -0
- data/lib/ronin/support/network/packet.rb +27 -0
- data/lib/ronin/support/network/pop3/mixin.rb +113 -0
- data/lib/ronin/support/network/proxy.rb +602 -0
- data/lib/ronin/support/network/public_suffix/list.rb +339 -0
- data/lib/ronin/support/network/public_suffix/suffix.rb +118 -0
- data/lib/ronin/support/network/public_suffix/suffix_set.rb +150 -0
- data/lib/ronin/support/network/public_suffix.rb +41 -0
- data/lib/ronin/support/network/smtp/email.rb +190 -0
- data/lib/ronin/support/network/smtp/mixin.rb +290 -0
- data/lib/ronin/{extensions/meta.rb → support/network/smtp.rb} +6 -7
- data/lib/ronin/support/network/ssl/local_cert.rb +114 -0
- data/lib/ronin/support/network/ssl/local_key.rb +84 -0
- data/lib/ronin/support/network/ssl/mixin.rb +740 -0
- data/lib/ronin/{network/extensions/imap/net.rb → support/network/ssl/openssl.rb} +9 -10
- data/lib/ronin/support/network/ssl/proxy.rb +296 -0
- data/lib/ronin/support/network/ssl.rb +173 -0
- data/lib/ronin/support/network/tcp/mixin.rb +400 -0
- data/lib/ronin/support/network/tcp/proxy.rb +435 -0
- data/lib/ronin/support/network/tcp.rb +443 -0
- data/lib/ronin/support/network/telnet/mixin.rb +150 -0
- data/lib/ronin/support/network/telnet.rb +90 -0
- data/lib/ronin/support/network/tld/list.rb +266 -0
- data/lib/ronin/support/network/tld.rb +41 -0
- data/lib/ronin/support/network/tls/mixin.rb +670 -0
- data/lib/ronin/support/network/tls/proxy.rb +135 -0
- data/lib/ronin/support/network/tls.rb +53 -0
- data/lib/ronin/support/network/udp/mixin.rb +389 -0
- data/lib/ronin/support/network/udp/proxy.rb +192 -0
- data/lib/ronin/support/network/udp.rb +435 -0
- data/lib/ronin/support/network/unix/mixin.rb +273 -0
- data/lib/ronin/support/network.rb +37 -0
- data/lib/ronin/support/path.rb +136 -0
- data/lib/ronin/{network/extensions/dns/net.rb → support/text/core_ext/regexp.rb} +8 -9
- data/lib/ronin/support/text/core_ext/string.rb +46 -0
- data/lib/ronin/support/text/core_ext.rb +23 -0
- data/lib/ronin/support/text/entropy/core_ext/string.rb +45 -0
- data/lib/ronin/support/text/entropy/core_ext.rb +19 -0
- data/lib/ronin/support/text/entropy.rb +66 -0
- data/lib/ronin/support/text/erb/mixin.rb +44 -0
- data/lib/ronin/support/text/erb.rb +19 -0
- data/lib/ronin/support/text/homoglyph/core_ext/string.rb +108 -0
- data/lib/ronin/{formatting/digest.rb → support/text/homoglyph/core_ext.rb} +6 -7
- data/lib/ronin/{network/http/exceptions/unknown_request.rb → support/text/homoglyph/exceptions.rb} +10 -9
- data/lib/ronin/support/text/homoglyph/table.rb +228 -0
- data/lib/ronin/support/text/homoglyph.rb +142 -0
- data/lib/ronin/support/text/mixin.rb +31 -0
- data/lib/ronin/support/text/patterns/credentials.rb +75 -0
- data/lib/ronin/support/text/patterns/crypto.rb +67 -0
- data/lib/ronin/support/text/patterns/file_system.rb +93 -0
- data/lib/ronin/support/text/patterns/language.rb +37 -0
- data/lib/ronin/support/text/patterns/network/public_suffix.rb +44 -0
- data/lib/ronin/support/text/patterns/network.rb +140 -0
- data/lib/ronin/support/text/patterns/numeric.rb +52 -0
- data/lib/ronin/support/text/patterns/pii.rb +105 -0
- data/lib/ronin/support/text/patterns/source_code.rb +148 -0
- data/lib/ronin/support/text/patterns.rb +25 -0
- data/lib/ronin/support/text/random/mixin.rb +437 -0
- data/lib/ronin/support/text/random.rb +419 -0
- data/lib/ronin/support/text/typo/core_ext/string.rb +123 -0
- data/lib/ronin/support/text/typo/core_ext.rb +19 -0
- data/lib/ronin/support/text/typo/exceptions.rb +28 -0
- data/lib/ronin/support/text/typo/generator.rb +161 -0
- data/lib/ronin/support/text/typo.rb +260 -0
- data/lib/ronin/support/text.rb +26 -0
- data/lib/ronin/support/version.rb +6 -7
- data/lib/ronin/support.rb +20 -15
- data/ronin-support.gemspec +3 -1
- metadata +462 -369
- data/.gemtest +0 -0
- data/lib/ronin/binary/hexdump/parser.rb +0 -403
- data/lib/ronin/binary/struct.rb +0 -567
- data/lib/ronin/binary/template.rb +0 -454
- data/lib/ronin/extensions/ip_addr.rb +0 -217
- data/lib/ronin/extensions/meta/object.rb +0 -24
- data/lib/ronin/extensions/regexp.rb +0 -157
- data/lib/ronin/extensions.rb +0 -29
- data/lib/ronin/formatting/extensions/binary/array.rb +0 -61
- data/lib/ronin/formatting/extensions/binary/base64.rb +0 -106
- data/lib/ronin/formatting/extensions/binary/file.rb +0 -77
- data/lib/ronin/formatting/extensions/binary/float.rb +0 -65
- data/lib/ronin/formatting/extensions/binary/integer.rb +0 -180
- data/lib/ronin/formatting/extensions/binary/string.rb +0 -345
- data/lib/ronin/formatting/extensions/binary.rb +0 -26
- data/lib/ronin/formatting/extensions/digest/file.rb +0 -129
- data/lib/ronin/formatting/extensions/digest/string.rb +0 -86
- data/lib/ronin/formatting/extensions/digest.rb +0 -21
- data/lib/ronin/formatting/extensions/html/integer.rb +0 -142
- data/lib/ronin/formatting/extensions/html/string.rb +0 -194
- data/lib/ronin/formatting/extensions/html.rb +0 -21
- data/lib/ronin/formatting/extensions/http/integer.rb +0 -69
- data/lib/ronin/formatting/extensions/http/string.rb +0 -110
- data/lib/ronin/formatting/extensions/http.rb +0 -21
- data/lib/ronin/formatting/extensions/sql/string.rb +0 -128
- data/lib/ronin/formatting/extensions/sql.rb +0 -20
- data/lib/ronin/formatting/extensions/text/array.rb +0 -137
- data/lib/ronin/formatting/extensions/text/string.rb +0 -297
- data/lib/ronin/formatting/extensions.rb +0 -24
- data/lib/ronin/formatting/text.rb +0 -20
- data/lib/ronin/formatting.rb +0 -25
- data/lib/ronin/fuzzing/extensions/string.rb +0 -209
- data/lib/ronin/fuzzing/fuzzer.rb +0 -110
- data/lib/ronin/fuzzing/fuzzing.rb +0 -360
- data/lib/ronin/fuzzing/mutator.rb +0 -161
- data/lib/ronin/fuzzing/repeater.rb +0 -81
- data/lib/ronin/fuzzing/template.rb +0 -133
- data/lib/ronin/fuzzing.rb +0 -21
- data/lib/ronin/mixin.rb +0 -89
- data/lib/ronin/network/dns.rb +0 -201
- data/lib/ronin/network/esmtp.rb +0 -113
- data/lib/ronin/network/extensions/dns.rb +0 -20
- data/lib/ronin/network/extensions/esmtp.rb +0 -20
- data/lib/ronin/network/extensions/http/uri/http.rb +0 -228
- data/lib/ronin/network/extensions/http.rb +0 -21
- data/lib/ronin/network/extensions/imap.rb +0 -20
- data/lib/ronin/network/extensions/pop3/net.rb +0 -24
- data/lib/ronin/network/extensions/pop3.rb +0 -20
- data/lib/ronin/network/extensions/smtp/net.rb +0 -24
- data/lib/ronin/network/extensions/ssl/net.rb +0 -24
- data/lib/ronin/network/extensions/ssl.rb +0 -20
- data/lib/ronin/network/extensions/tcp/net.rb +0 -24
- data/lib/ronin/network/extensions/tcp.rb +0 -20
- data/lib/ronin/network/extensions/telnet/net.rb +0 -24
- data/lib/ronin/network/extensions/telnet.rb +0 -20
- data/lib/ronin/network/extensions/udp/net.rb +0 -24
- data/lib/ronin/network/extensions/udp.rb +0 -20
- data/lib/ronin/network/extensions.rb +0 -29
- data/lib/ronin/network/ftp.rb +0 -149
- data/lib/ronin/network/http/exceptions.rb +0 -20
- data/lib/ronin/network/http/http.rb +0 -1127
- data/lib/ronin/network/http/proxy.rb +0 -330
- data/lib/ronin/network/http.rb +0 -22
- data/lib/ronin/network/imap.rb +0 -158
- data/lib/ronin/network/mixins/dns.rb +0 -55
- data/lib/ronin/network/mixins/esmtp.rb +0 -164
- data/lib/ronin/network/mixins/ftp.rb +0 -155
- data/lib/ronin/network/mixins/http.rb +0 -227
- data/lib/ronin/network/mixins/imap.rb +0 -156
- data/lib/ronin/network/mixins/mixin.rb +0 -58
- data/lib/ronin/network/mixins/pop3.rb +0 -149
- data/lib/ronin/network/mixins/smtp.rb +0 -159
- data/lib/ronin/network/mixins/ssl.rb +0 -148
- data/lib/ronin/network/mixins/tcp.rb +0 -368
- data/lib/ronin/network/mixins/telnet.rb +0 -208
- data/lib/ronin/network/mixins/udp.rb +0 -381
- data/lib/ronin/network/mixins/unix.rb +0 -279
- data/lib/ronin/network/mixins.rb +0 -29
- data/lib/ronin/network/network.rb +0 -45
- data/lib/ronin/network/pop3.rb +0 -124
- data/lib/ronin/network/proxy.rb +0 -578
- data/lib/ronin/network/smtp/email.rb +0 -174
- data/lib/ronin/network/smtp/smtp.rb +0 -230
- data/lib/ronin/network/smtp.rb +0 -22
- data/lib/ronin/network/ssl.rb +0 -186
- data/lib/ronin/network/tcp/proxy.rb +0 -417
- data/lib/ronin/network/tcp/tcp.rb +0 -443
- data/lib/ronin/network/tcp.rb +0 -21
- data/lib/ronin/network/telnet.rb +0 -264
- data/lib/ronin/network/udp/proxy.rb +0 -191
- data/lib/ronin/network/udp/udp.rb +0 -450
- data/lib/ronin/network/udp.rb +0 -21
- data/lib/ronin/network/unix.rb +0 -286
- data/lib/ronin/network.rb +0 -31
- data/lib/ronin/path.rb +0 -137
- data/lib/ronin/spec/ui/output.rb +0 -22
- data/lib/ronin/support/inflector.rb +0 -92
- data/lib/ronin/support/support.rb +0 -42
- data/lib/ronin/templates/erb.rb +0 -78
- data/lib/ronin/templates/template.rb +0 -169
- data/lib/ronin/templates.rb +0 -21
- data/lib/ronin/ui/output/helpers.rb +0 -296
- data/lib/ronin/ui/output/output.rb +0 -146
- data/lib/ronin/ui/output/terminal/color.rb +0 -124
- data/lib/ronin/ui/output/terminal/raw.rb +0 -103
- data/lib/ronin/ui/output/terminal.rb +0 -21
- data/lib/ronin/ui/output.rb +0 -21
- data/lib/ronin/ui/shell.rb +0 -286
- data/lib/ronin/wordlist.rb +0 -287
- data/spec/binary/hexdump/helpers/hexdumps/ascii.bin +0 -0
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_decimal_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_hex_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_hex_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_octal_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_octal_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_repeated.txt +0 -6
- data/spec/binary/hexdump/helpers/hexdumps/od_decimal_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_decimal_ints.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_decimal_quads.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_decimal_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_doubles.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_floats.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_hex_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_hex_ints.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_hex_quads.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_hex_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_named_chars.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_octal_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_octal_ints.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_octal_quads.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_octal_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_repeated.txt +0 -6
- data/spec/binary/hexdump/helpers/hexdumps/repeated.bin +0 -1
- data/spec/binary/hexdump/helpers/hexdumps.rb +0 -13
- data/spec/binary/hexdump/parser_spec.rb +0 -302
- data/spec/binary/struct_spec.rb +0 -496
- data/spec/binary/template_spec.rb +0 -414
- data/spec/extensions/enumerable_spec.rb +0 -24
- data/spec/extensions/file_spec.rb +0 -63
- data/spec/extensions/ip_addr_spec.rb +0 -203
- data/spec/extensions/kernel_spec.rb +0 -30
- data/spec/extensions/regexp_spec.rb +0 -482
- data/spec/extensions/resolv_spec.rb +0 -18
- data/spec/extensions/string_spec.rb +0 -179
- data/spec/formatting/binary/array_spec.rb +0 -26
- data/spec/formatting/binary/base64_spec.rb +0 -50
- data/spec/formatting/binary/float_spec.rb +0 -34
- data/spec/formatting/binary/integer_spec.rb +0 -166
- data/spec/formatting/binary/string_spec.rb +0 -197
- data/spec/formatting/digest/string_spec.rb +0 -82
- data/spec/formatting/html/integer_spec.rb +0 -66
- data/spec/formatting/html/string_spec.rb +0 -103
- data/spec/formatting/http/integer_spec.rb +0 -42
- data/spec/formatting/http/string_spec.rb +0 -76
- data/spec/formatting/sql/string_spec.rb +0 -75
- data/spec/formatting/text/array_spec.rb +0 -105
- data/spec/formatting/text/string_spec.rb +0 -162
- data/spec/fuzzing/extensions/string_spec.rb +0 -87
- data/spec/fuzzing/fuzzer_spec.rb +0 -109
- data/spec/fuzzing/fuzzing_spec.rb +0 -24
- data/spec/fuzzing/mutator_spec.rb +0 -112
- data/spec/fuzzing/repeater_spec.rb +0 -57
- data/spec/fuzzing/template_spec.rb +0 -54
- data/spec/mixin_spec.rb +0 -53
- data/spec/network/dns_spec.rb +0 -201
- data/spec/network/ftp_spec.rb +0 -81
- data/spec/network/http/http_spec.rb +0 -466
- data/spec/network/http/proxy_spec.rb +0 -148
- data/spec/network/network_spec.rb +0 -8
- data/spec/network/proxy_spec.rb +0 -121
- data/spec/network/shared/unix_server.rb +0 -31
- data/spec/network/smtp/email_spec.rb +0 -100
- data/spec/network/ssl_spec.rb +0 -70
- data/spec/network/tcp/proxy_spec.rb +0 -116
- data/spec/network/tcp/tcp_spec.rb +0 -273
- data/spec/network/telnet_spec.rb +0 -67
- data/spec/network/udp/udp_spec.rb +0 -271
- data/spec/network/unix_spec.rb +0 -183
- data/spec/path_spec.rb +0 -86
- data/spec/spec_helper.rb +0 -9
- data/spec/support/inflector_spec.rb +0 -22
- data/spec/support_spec.rb +0 -8
- data/spec/templates/classes/example_erb.rb +0 -11
- data/spec/templates/classes/example_template.rb +0 -35
- data/spec/templates/erb_spec.rb +0 -21
- data/spec/templates/helpers/data/includes/_relative.erb +0 -1
- data/spec/templates/helpers/data/templates/example.erb +0 -1
- data/spec/templates/helpers/data.rb +0 -9
- data/spec/templates/template_spec.rb +0 -54
- data/spec/ui/classes/test_shell.rb +0 -22
- data/spec/ui/output_spec.rb +0 -32
- data/spec/ui/shell_spec.rb +0 -83
- 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
|