ronin-support 1.0.0 → 1.0.2

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 (151) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +14 -0
  3. data/.rubocop.yml +109 -0
  4. data/ChangeLog.md +33 -1
  5. data/Gemfile +8 -4
  6. data/README.md +1 -1
  7. data/Rakefile +2 -2
  8. data/examples/ssl_proxy.rb +2 -1
  9. data/examples/tcp_proxy.rb +6 -4
  10. data/lib/ronin/support/archive/core_ext/file.rb +43 -0
  11. data/lib/ronin/support/archive/core_ext.rb +1 -1
  12. data/lib/ronin/support/archive/tar/writer.rb +2 -2
  13. data/lib/ronin/support/archive/tar.rb +4 -4
  14. data/lib/ronin/support/archive/zip/reader.rb +2 -2
  15. data/lib/ronin/support/binary/array.rb +5 -8
  16. data/lib/ronin/support/binary/bit_flip.rb +7 -1
  17. data/lib/ronin/support/binary/buffer.rb +25 -25
  18. data/lib/ronin/support/binary/byte_slice.rb +17 -17
  19. data/lib/ronin/support/binary/core_ext.rb +2 -0
  20. data/lib/ronin/support/binary/cstring.rb +50 -4
  21. data/lib/ronin/support/binary/ctypes/arch/arm/big_endian.rb +4 -0
  22. data/lib/ronin/support/binary/ctypes/arch/arm.rb +3 -0
  23. data/lib/ronin/support/binary/ctypes/arch/arm64/big_endian.rb +4 -0
  24. data/lib/ronin/support/binary/ctypes/arch/arm64.rb +3 -0
  25. data/lib/ronin/support/binary/ctypes/arch/mips/little_endian.rb +4 -0
  26. data/lib/ronin/support/binary/ctypes/arch/mips.rb +3 -0
  27. data/lib/ronin/support/binary/ctypes/arch/mips64/little_endian.rb +4 -0
  28. data/lib/ronin/support/binary/ctypes/arch/mips64.rb +3 -0
  29. data/lib/ronin/support/binary/ctypes/arch/ppc.rb +3 -0
  30. data/lib/ronin/support/binary/ctypes/arch/ppc64.rb +3 -0
  31. data/lib/ronin/support/binary/ctypes/arch/x86.rb +3 -0
  32. data/lib/ronin/support/binary/ctypes/arch/x86_64.rb +3 -0
  33. data/lib/ronin/support/binary/ctypes/array_type.rb +2 -2
  34. data/lib/ronin/support/binary/ctypes/big_endian.rb +3 -0
  35. data/lib/ronin/support/binary/ctypes/enum_type.rb +2 -2
  36. data/lib/ronin/support/binary/ctypes/little_endian.rb +3 -0
  37. data/lib/ronin/support/binary/ctypes/native.rb +3 -0
  38. data/lib/ronin/support/binary/ctypes/os/bsd.rb +1 -1
  39. data/lib/ronin/support/binary/ctypes/scalar_type.rb +2 -2
  40. data/lib/ronin/support/binary/ctypes/struct_type.rb +3 -3
  41. data/lib/ronin/support/binary/ctypes/type_resolver.rb +7 -8
  42. data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +2 -2
  43. data/lib/ronin/support/binary/ctypes/union_type.rb +3 -3
  44. data/lib/ronin/support/binary/ctypes.rb +3 -3
  45. data/lib/ronin/support/binary/memory.rb +2 -2
  46. data/lib/ronin/support/binary/packet.rb +80 -0
  47. data/lib/ronin/support/binary/stack.rb +6 -7
  48. data/lib/ronin/support/binary/struct/member.rb +5 -3
  49. data/lib/ronin/support/binary/struct.rb +81 -79
  50. data/lib/ronin/support/binary/template.rb +2 -5
  51. data/lib/ronin/support/binary/unhexdump/parser.rb +11 -11
  52. data/lib/ronin/support/binary/union.rb +22 -22
  53. data/lib/ronin/support/binary.rb +1 -0
  54. data/lib/ronin/support/cli/ansi.rb +0 -1
  55. data/lib/ronin/support/cli/io_shell/core_ext/io.rb +1 -1
  56. data/lib/ronin/support/cli/io_shell.rb +4 -4
  57. data/lib/ronin/support/cli/printing.rb +3 -3
  58. data/lib/ronin/support/compression/core_ext/file.rb +16 -0
  59. data/lib/ronin/support/compression/zlib.rb +1 -1
  60. data/lib/ronin/support/core_ext/enumerable.rb +0 -2
  61. data/lib/ronin/support/core_ext/file.rb +1 -1
  62. data/lib/ronin/support/core_ext/kernel.rb +6 -9
  63. data/lib/ronin/support/core_ext/string.rb +2 -2
  64. data/lib/ronin/support/crypto/cert.rb +11 -15
  65. data/lib/ronin/support/crypto/cert_chain.rb +1 -1
  66. data/lib/ronin/support/crypto/cipher/aes.rb +3 -0
  67. data/lib/ronin/support/crypto/cipher/aes128.rb +4 -1
  68. data/lib/ronin/support/crypto/cipher/aes256.rb +4 -1
  69. data/lib/ronin/support/crypto/cipher.rb +1 -1
  70. data/lib/ronin/support/crypto/core_ext/file.rb +33 -1
  71. data/lib/ronin/support/crypto/core_ext/string.rb +34 -2
  72. data/lib/ronin/support/crypto/key/methods.rb +4 -1
  73. data/lib/ronin/support/crypto/key.rb +5 -2
  74. data/lib/ronin/support/crypto/openssl.rb +1 -1
  75. data/lib/ronin/support/crypto.rb +0 -1
  76. data/lib/ronin/support/encoding/base16.rb +2 -2
  77. data/lib/ronin/support/encoding/base32.rb +29 -18
  78. data/lib/ronin/support/encoding/c/core_ext/integer.rb +1 -1
  79. data/lib/ronin/support/encoding/c/core_ext/string.rb +1 -1
  80. data/lib/ronin/support/encoding/c.rb +6 -6
  81. data/lib/ronin/support/encoding/core_ext/string.rb +2 -2
  82. data/lib/ronin/support/encoding/hex/core_ext/string.rb +1 -1
  83. data/lib/ronin/support/encoding/hex.rb +4 -4
  84. data/lib/ronin/support/encoding/js/core_ext/integer.rb +1 -1
  85. data/lib/ronin/support/encoding/js.rb +5 -5
  86. data/lib/ronin/support/encoding/powershell/core_ext/integer.rb +2 -2
  87. data/lib/ronin/support/encoding/powershell.rb +5 -6
  88. data/lib/ronin/support/encoding/quoted_printable.rb +3 -1
  89. data/lib/ronin/support/encoding/ruby.rb +5 -5
  90. data/lib/ronin/support/encoding/shell/core_ext/integer.rb +2 -2
  91. data/lib/ronin/support/encoding/shell.rb +3 -3
  92. data/lib/ronin/support/encoding/sql.rb +1 -1
  93. data/lib/ronin/support/encoding/uuencoding.rb +3 -1
  94. data/lib/ronin/support/encoding/xml.rb +3 -3
  95. data/lib/ronin/support/encoding.rb +95 -0
  96. data/lib/ronin/support/network/asn/list.rb +6 -1
  97. data/lib/ronin/support/network/asn/record.rb +3 -0
  98. data/lib/ronin/support/network/asn/record_set.rb +3 -0
  99. data/lib/ronin/support/network/asn.rb +167 -6
  100. data/lib/ronin/support/network/dns/mixin.rb +2 -10
  101. data/lib/ronin/support/network/dns/resolver.rb +3 -0
  102. data/lib/ronin/support/network/domain.rb +21 -21
  103. data/lib/ronin/support/network/email_address.rb +1 -5
  104. data/lib/ronin/support/network/esmtp/mixin.rb +1 -0
  105. data/lib/ronin/support/network/ftp/mixin.rb +1 -1
  106. data/lib/ronin/support/network/host.rb +75 -47
  107. data/lib/ronin/support/network/http/core_ext/uri/http.rb +8 -0
  108. data/lib/ronin/support/network/http/core_ext.rb +1 -1
  109. data/lib/ronin/support/network/http.rb +317 -80
  110. data/lib/ronin/support/network/ip.rb +49 -23
  111. data/lib/ronin/support/network/ip_range/cidr.rb +1 -5
  112. data/lib/ronin/support/network/ip_range/glob.rb +1 -0
  113. data/lib/ronin/support/network/ip_range/range.rb +1 -1
  114. data/lib/ronin/support/network/ip_range.rb +5 -7
  115. data/lib/ronin/support/network/proxy.rb +4 -4
  116. data/lib/ronin/support/network/public_suffix/list.rb +10 -8
  117. data/lib/ronin/support/network/public_suffix/suffix_set.rb +3 -0
  118. data/lib/ronin/support/network/public_suffix.rb +9 -4
  119. data/lib/ronin/support/network/smtp/email.rb +0 -9
  120. data/lib/ronin/support/network/smtp/mixin.rb +2 -2
  121. data/lib/ronin/support/network/ssl/local_cert.rb +1 -3
  122. data/lib/ronin/support/network/ssl/mixin.rb +13 -13
  123. data/lib/ronin/support/network/ssl/openssl.rb +1 -1
  124. data/lib/ronin/support/network/ssl/proxy.rb +14 -16
  125. data/lib/ronin/support/network/ssl.rb +4 -2
  126. data/lib/ronin/support/network/tcp/proxy.rb +3 -3
  127. data/lib/ronin/support/network/tcp.rb +10 -12
  128. data/lib/ronin/support/network/telnet/mixin.rb +14 -14
  129. data/lib/ronin/support/network/tld/list.rb +2 -1
  130. data/lib/ronin/support/network/tld.rb +7 -4
  131. data/lib/ronin/support/network/tls/proxy.rb +1 -1
  132. data/lib/ronin/support/network/tls.rb +0 -2
  133. data/lib/ronin/support/network/udp/proxy.rb +5 -5
  134. data/lib/ronin/support/network/udp.rb +14 -16
  135. data/lib/ronin/support/path.rb +4 -4
  136. data/lib/ronin/support/text/erb/mixin.rb +3 -0
  137. data/lib/ronin/support/text/homoglyph/core_ext/string.rb +33 -0
  138. data/lib/ronin/support/text/homoglyph/table.rb +3 -3
  139. data/lib/ronin/support/text/patterns/credentials.rb +2 -2
  140. data/lib/ronin/support/text/patterns/crypto.rb +1 -1
  141. data/lib/ronin/support/text/patterns/file_system.rb +3 -4
  142. data/lib/ronin/support/text/patterns/network.rb +21 -21
  143. data/lib/ronin/support/text/patterns/numeric.rb +1 -1
  144. data/lib/ronin/support/text/patterns/source_code.rb +2 -2
  145. data/lib/ronin/support/text/random/mixin.rb +17 -17
  146. data/lib/ronin/support/text/random.rb +25 -25
  147. data/lib/ronin/support/text/typo/core_ext/string.rb +24 -0
  148. data/lib/ronin/support/text/typo/generator.rb +2 -2
  149. data/lib/ronin/support/version.rb +1 -1
  150. data/ronin-support.gemspec +6 -5
  151. metadata +3 -2
@@ -37,7 +37,7 @@ module Ronin
37
37
  # member :c, :char
38
38
  # member :i, :int16
39
39
  # member :u, :uint32
40
- #
40
+ #
41
41
  # end
42
42
  #
43
43
  # ### Initializing Fields
@@ -54,19 +54,19 @@ module Ronin
54
54
  # member :c, :char
55
55
  # member :i, :int16
56
56
  # member :u, :uint32
57
- #
57
+ #
58
58
  # end
59
- #
59
+ #
60
60
  # class MyUnion2 < MyUnion
61
- #
61
+ #
62
62
  # member :f, :float32
63
63
  # member :d, :float64
64
- #
64
+ #
65
65
  # end
66
- #
66
+ #
67
67
  # union = MyUnion.new
68
68
  # union.i = -1
69
- #
69
+ #
70
70
  # union2 = MyUnion.new
71
71
  # union2.i = -1
72
72
  # union2.d = 1.123
@@ -74,13 +74,13 @@ module Ronin
74
74
  # ### Packing Unions
75
75
  #
76
76
  # class MyUnion < Ronin::Support::Binary::Union
77
- #
77
+ #
78
78
  # member :c, :char
79
79
  # member :i, :int16
80
80
  # member :u, :uint32
81
- #
81
+ #
82
82
  # end
83
- #
83
+ #
84
84
  # union = MyUnion.new
85
85
  # union.u = 0x11111111
86
86
  # union.i = -1
@@ -90,13 +90,13 @@ module Ronin
90
90
  # ### Unpacking Unions
91
91
  #
92
92
  # class MyUnion < Ronin::Support::Binary::Union
93
- #
93
+ #
94
94
  # member :c, :char
95
95
  # member :i, :int32
96
96
  # member :u, :uint32
97
- #
97
+ #
98
98
  # end
99
- #
99
+ #
100
100
  # union = MyUnion.unpack("\xFF\xFF\x11\x11")
101
101
  # union.c
102
102
  # # => "\xFF"
@@ -108,12 +108,12 @@ module Ronin
108
108
  # ### Array Fields
109
109
  #
110
110
  # class MyUnion < Ronin::Support::Binary::Union
111
- #
111
+ #
112
112
  # member :c, :char
113
113
  # member :i, :int16
114
114
  # member :u, :uint32
115
115
  # member :nums, [:uint8, 10]
116
- #
116
+ #
117
117
  # end
118
118
  #
119
119
  # union = MyUnion.new
@@ -124,14 +124,14 @@ module Ronin
124
124
  # ### Unbounded Array Fields
125
125
  #
126
126
  # class MyUnion < Ronin::Support::Binary::Union
127
- #
127
+ #
128
128
  # member :c, :char
129
129
  # member :i, :int16
130
130
  # member :u, :uint32
131
131
  # member :payload, (:uint8..)
132
- #
132
+ #
133
133
  # end
134
- #
134
+ #
135
135
  # union = MyUnion.new
136
136
  # union.payload = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]
137
137
  # union.pack
@@ -140,15 +140,15 @@ module Ronin
140
140
  # ### Default Endianness
141
141
  #
142
142
  # class MyUnion < Ronin::Support::Binary::Union
143
- #
143
+ #
144
144
  # endian :big
145
- #
145
+ #
146
146
  # member :c, :char
147
147
  # member :i, :int32
148
148
  # member :u, :uint32
149
- #
149
+ #
150
150
  # end
151
- #
151
+ #
152
152
  # union = MyUnion.new(u: 0xaabbccdd)
153
153
  # union.pack
154
154
  # # => "\xAA\xBB\xCC\xDD"
@@ -19,6 +19,7 @@
19
19
  require 'ronin/support/binary/core_ext'
20
20
  require 'ronin/support/binary/template'
21
21
  require 'ronin/support/binary/buffer'
22
+ require 'ronin/support/binary/cstring'
22
23
  require 'ronin/support/binary/array'
23
24
  require 'ronin/support/binary/stack'
24
25
  require 'ronin/support/binary/struct'
@@ -323,7 +323,6 @@ module Ronin
323
323
  end
324
324
  end
325
325
  end
326
-
327
326
  end
328
327
  end
329
328
  end
@@ -40,7 +40,7 @@ class IO
40
40
  # # NOTICE AUTH :*** Checking Ident
41
41
  # # NOTICE AUTH :*** Found your hostname
42
42
  # # NOTICE AUTH :*** No ident response
43
- # # USER test_ruby * * *
43
+ # # USER test_ruby * * *
44
44
  # # NICK test_ruby
45
45
  # # PING :3167790481
46
46
  # # PONG 3167790481
@@ -34,7 +34,7 @@ module Ronin
34
34
  # NOTICE AUTH :*** Checking Ident
35
35
  # NOTICE AUTH :*** Found your hostname
36
36
  # NOTICE AUTH :*** No ident response
37
- # USER test_ruby * * *
37
+ # USER test_ruby * * *
38
38
  # NICK test_ruby
39
39
  # PING :3167790481
40
40
  # PONG 3167790481
@@ -123,7 +123,7 @@ module Ronin
123
123
  io_array = [@io, @stdin]
124
124
 
125
125
  loop do
126
- readable, writable, errors = IO.select(io_array,nil,io_array)
126
+ readable, _writable, errors = IO.select(io_array,nil,io_array)
127
127
 
128
128
  if errors.include?(@io) || errors.include?(@stdin)
129
129
  return false
@@ -132,7 +132,7 @@ module Ronin
132
132
  if readable.include?(@io)
133
133
  data = begin
134
134
  @io.readpartial(4096)
135
- rescue EOFError => error
135
+ rescue EOFError
136
136
  return false
137
137
  end
138
138
 
@@ -142,7 +142,7 @@ module Ronin
142
142
  if readable.include?(@stdin)
143
143
  data = begin
144
144
  @stdin.readpartial(4096)
145
- rescue EOFError => error
145
+ rescue EOFError
146
146
  return true
147
147
  end
148
148
 
@@ -27,7 +27,7 @@ module Ronin
27
27
  # @since 1.0.0
28
28
  #
29
29
  module Printing
30
- @@debug = false
30
+ @debug = false
31
31
 
32
32
  #
33
33
  # The current debug mode.
@@ -38,7 +38,7 @@ module Ronin
38
38
  # @api semipublic
39
39
  #
40
40
  def self.debug?
41
- @@debug
41
+ @debug
42
42
  end
43
43
 
44
44
  #
@@ -53,7 +53,7 @@ module Ronin
53
53
  # @api semipublic
54
54
  #
55
55
  def self.debug=(debug_mode)
56
- @@debug = debug_mode
56
+ @debug = debug_mode
57
57
  end
58
58
 
59
59
  # Enables or disables debug mode.
@@ -36,6 +36,13 @@ class File
36
36
  # @return [Ronin::Support::Compression::Gzip::Reader]
37
37
  # The gzip reader object.
38
38
  #
39
+ # @example
40
+ # File.gunzip('wordlist.gz') do |gz|
41
+ # gz.each_line do |line|
42
+ # # ...
43
+ # end
44
+ # end
45
+ #
39
46
  # @api public
40
47
  #
41
48
  # @since 1.0.0
@@ -59,6 +66,15 @@ class File
59
66
  # @return [Ronin::Support::Compression::Gzip::Writer]
60
67
  # The gzip writer object.
61
68
  #
69
+ # @example
70
+ # File.gunzip('file.gz') do |gz|
71
+ # # gzip header info
72
+ # gz.mtime = Time.now
73
+ # gz.orig_name = 'file.txt'
74
+ #
75
+ # gz.write('Hello World!')
76
+ # end
77
+ #
62
78
  # @api public
63
79
  #
64
80
  # @since 1.0.0
@@ -18,7 +18,7 @@
18
18
 
19
19
  begin
20
20
  require 'zlib'
21
- rescue ::LoadError
21
+ rescue LoadError
22
22
  warn "WARNING: Ruby was not compiled with zlib support"
23
23
  end
24
24
 
@@ -17,7 +17,6 @@
17
17
  #
18
18
 
19
19
  module Enumerable
20
-
21
20
  #
22
21
  # Maps the elements to a Hash.
23
22
  #
@@ -49,5 +48,4 @@ module Enumerable
49
48
  each { |element| new_hash[element] }
50
49
  return new_hash
51
50
  end
52
-
53
51
  end
@@ -104,7 +104,7 @@ class File
104
104
  path = expand_path(File.join('/',path))
105
105
 
106
106
  # remove the leading slash
107
- return path[1..-1]
107
+ return path[1..]
108
108
  end
109
109
 
110
110
  end
@@ -16,11 +16,7 @@
16
16
  # along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
17
17
  #
18
18
 
19
- require 'ronin/support/mixin'
20
-
21
19
  module Kernel
22
- include Ronin::Support::Mixin
23
-
24
20
  #
25
21
  # Calls the given block and ignores any raised exceptions.
26
22
  #
@@ -39,10 +35,11 @@ module Kernel
39
35
  # @api public
40
36
  #
41
37
  def try
42
- begin
43
- yield() if block_given?
44
- rescue Exception
45
- return nil
46
- end
38
+ yield() if block_given?
39
+ rescue SyntaxError => error
40
+ # re-raise syntax errors
41
+ raise(error)
42
+ rescue StandardError
43
+ # ignore any exceptions
47
44
  end
48
45
  end
@@ -199,7 +199,7 @@ class String
199
199
  other_index = (other.length - i - 1)
200
200
 
201
201
  if self[index] != other[other_index]
202
- return self[(index + 1)..-1]
202
+ return self[(index + 1)..]
203
203
  end
204
204
  end
205
205
 
@@ -220,7 +220,7 @@ class String
220
220
  #
221
221
  def uncommon_substring(other)
222
222
  prefix = common_prefix(other)
223
- postfix = self[prefix.length..-1].common_suffix(other[prefix.length..-1])
223
+ postfix = self[prefix.length..].common_suffix(other[prefix.length..])
224
224
 
225
225
  return self[prefix.length...(length - postfix.length)]
226
226
  end
@@ -66,7 +66,7 @@ module Ronin
66
66
  # The populated name.
67
67
  #
68
68
  def self.build(common_name: nil, organizational_unit: nil, organization: nil, locality: nil, state: nil, province: nil, country: nil)
69
- name = new()
69
+ name = new
70
70
  name.add_entry("CN",common_name) if common_name
71
71
  name.add_entry("OU",organizational_unit) if organizational_unit
72
72
  name.add_entry("O",organization) if organization
@@ -83,9 +83,7 @@ module Ronin
83
83
  # @return [Hash{String => String}]
84
84
  #
85
85
  def entries
86
- @entries ||= Hash[to_a.map { |(oid,value,type)|
87
- [oid, value]
88
- }]
86
+ @entries ||= to_a.to_h { |(oid,value,type)| [oid, value] }
89
87
  end
90
88
 
91
89
  alias to_h entries
@@ -328,7 +326,7 @@ module Ronin
328
326
  def self.generate(version: 2,
329
327
  serial: 0,
330
328
  not_before: Time.now,
331
- not_after: not_before+ONE_YEAR,
329
+ not_after: not_before + ONE_YEAR,
332
330
  subject: nil,
333
331
  extensions: nil,
334
332
  # signing arguments
@@ -336,9 +334,10 @@ module Ronin
336
334
  ca_cert: nil,
337
335
  ca_key: nil,
338
336
  signing_hash: :sha256)
339
- cert = new()
337
+ cert = new
338
+
340
339
  cert.version = version
341
- cert.serial = if ca_cert then ca_cert.serial+1
340
+ cert.serial = if ca_cert then ca_cert.serial + 1
342
341
  else serial
343
342
  end
344
343
 
@@ -351,11 +350,10 @@ module Ronin
351
350
  end
352
351
 
353
352
  if extensions
354
- extension_factory = OpenSSL::X509::ExtensionFactory.new()
353
+ extension_factory = OpenSSL::X509::ExtensionFactory.new
354
+
355
355
  extension_factory.subject_certificate = cert
356
- extension_factory.issuer_certificate = if ca_cert then ca_cert
357
- else cert
358
- end
356
+ extension_factory.issuer_certificate = ca_cert || cert
359
357
 
360
358
  extensions.each do |name,(value,critical)|
361
359
  ext = extension_factory.create_extension(name,value,critical)
@@ -363,9 +361,7 @@ module Ronin
363
361
  end
364
362
  end
365
363
 
366
- signing_key = if ca_key then ca_key
367
- else key
368
- end
364
+ signing_key = ca_key || key
369
365
  signing_digest = OpenSSL::Digest.const_get(signing_hash.upcase).new
370
366
 
371
367
  cert.sign(signing_key,signing_digest)
@@ -421,7 +417,7 @@ module Ronin
421
417
  # The Hash of extension OID names and extension objects.
422
418
  #
423
419
  def extensions_hash
424
- Hash[extensions.map { |ext| [ext.oid, ext] }]
420
+ extensions.to_h { |ext| [ext.oid, ext] }
425
421
  end
426
422
 
427
423
  #
@@ -59,7 +59,7 @@ module Ronin
59
59
  #
60
60
  def self.parse(string)
61
61
  cert_buffer = String.new
62
- certs = []
62
+ certs = []
63
63
 
64
64
  string.each_line do |line|
65
65
  cert_buffer << line
@@ -22,6 +22,9 @@ module Ronin
22
22
  module Support
23
23
  module Crypto
24
24
  class Cipher < OpenSSL::Cipher
25
+ #
26
+ # The AES cipher.
27
+ #
25
28
  class AES < Cipher
26
29
 
27
30
  # The AES cipher key size.
@@ -22,6 +22,9 @@ module Ronin
22
22
  module Support
23
23
  module Crypto
24
24
  class Cipher < OpenSSL::Cipher
25
+ #
26
+ # The AES128 cipher.
27
+ #
25
28
  class AES128 < AES
26
29
 
27
30
  #
@@ -44,7 +47,7 @@ module Ronin
44
47
  # The list of supported AES 128bit cipher names.
45
48
  #
46
49
  def self.supported
47
- super().grep(/^aes[-]?128/)
50
+ super().grep(/^aes(?:-)?128/)
48
51
  end
49
52
 
50
53
  end
@@ -22,6 +22,9 @@ module Ronin
22
22
  module Support
23
23
  module Crypto
24
24
  class Cipher < OpenSSL::Cipher
25
+ #
26
+ # The AES256 cipher.
27
+ #
25
28
  class AES256 < AES
26
29
 
27
30
  #
@@ -44,7 +47,7 @@ module Ronin
44
47
  # The list of supported AES 256bit cipher names.
45
48
  #
46
49
  def self.supported
47
- super().grep(/^aes[-]?256/)
50
+ super().grep(/^aes(?:-)?256/)
48
51
  end
49
52
 
50
53
  end
@@ -43,7 +43,7 @@ module Ronin
43
43
  # @see https://rubydoc.info/stdlib/openssl/OpenSSL/Cipher.html
44
44
  #
45
45
  # @since 1.0.0
46
- #
46
+ #
47
47
  # @api public
48
48
  #
49
49
  class Cipher < OpenSSL::Cipher
@@ -172,7 +172,7 @@ class File
172
172
  def self.hmac(path, key: , digest: :sha1)
173
173
  hmac = Ronin::Support::Crypto.hmac(key: key, digest: digest)
174
174
 
175
- open(path,'rb') do |file|
175
+ File.open(path,'rb') do |file|
176
176
  until file.eof?
177
177
  hmac.update(file.read(16384))
178
178
  end
@@ -224,6 +224,10 @@ class File
224
224
  # @return [String]
225
225
  # The encrypted data.
226
226
  #
227
+ # @example
228
+ # File.encrypt('file.txt', 'aes-256-cbc', password: 's3cr3t')
229
+ # # => "..."
230
+ #
227
231
  # @see http://rubydoc.info/stdlib/openssl/OpenSSL/Cipher
228
232
  #
229
233
  # @since 0.6.0
@@ -281,6 +285,10 @@ class File
281
285
  # @return [String]
282
286
  # The decrypted data.
283
287
  #
288
+ # @example
289
+ # File.decrypt('encrypted.bin', 'aes-256-cbc', password: 's3cr3t')
290
+ # # => "..."
291
+ #
284
292
  # @see http://rubydoc.info/stdlib/openssl/OpenSSL/Cipher
285
293
  #
286
294
  # @since 0.6.0
@@ -338,6 +346,10 @@ class File
338
346
  # @raise [ArgumentError]
339
347
  # Either the the `key:` or `password:` keyword argument must be given.
340
348
  #
349
+ # @example
350
+ # File.aes_encrypt('file.txt', key_size: 256, password: 's3cr3t')
351
+ # # => "..."
352
+ #
341
353
  # @since 1.0.0
342
354
  #
343
355
  def self.aes_encrypt(path, block_size: 16384, output: nil, **kwargs,&block)
@@ -390,6 +402,10 @@ class File
390
402
  # @raise [ArgumentError]
391
403
  # Either the the `key:` or `password:` keyword argument must be given.
392
404
  #
405
+ # @example
406
+ # File.aes_decrypt('encrypted.bin', key_size: 256, password: 's3cr3t')
407
+ # # => "..."
408
+ #
393
409
  # @since 1.0.0
394
410
  #
395
411
  def self.aes_decrypt(path, block_size: 16384, output: nil, **kwargs,&block)
@@ -439,6 +455,10 @@ class File
439
455
  # @raise [ArgumentError]
440
456
  # Either the the `key:` or `password:` keyword argument must be given.
441
457
  #
458
+ # @example
459
+ # File.aes128_encrypt('file.txt', password: 's3cr3t')
460
+ # # => "..."
461
+ #
442
462
  # @since 1.0.0
443
463
  #
444
464
  def self.aes128_encrypt(path, block_size: 16384, output: nil, **kwargs,&block)
@@ -488,6 +508,10 @@ class File
488
508
  # @raise [ArgumentError]
489
509
  # Either the the `key:` or `password:` keyword argument must be given.
490
510
  #
511
+ # @example
512
+ # File.aes256_decrypt('encrypted.bin', password: 's3cr3t')
513
+ # # => "..."
514
+ #
491
515
  # @since 1.0.0
492
516
  #
493
517
  def self.aes128_decrypt(path, block_size: 16384, output: nil, **kwargs,&block)
@@ -537,6 +561,10 @@ class File
537
561
  # @raise [ArgumentError]
538
562
  # Either the the `key:` or `password:` keyword argument must be given.
539
563
  #
564
+ # @example
565
+ # File.aes256_encrypt('file.txt', password: 's3cr3t')
566
+ # # => "..."
567
+ #
540
568
  # @since 1.0.0
541
569
  #
542
570
  def self.aes256_encrypt(path, block_size: 16384, output: nil, **kwargs,&block)
@@ -586,6 +614,10 @@ class File
586
614
  # @raise [ArgumentError]
587
615
  # Either the the `key:` or `password:` keyword argument must be given.
588
616
  #
617
+ # @example
618
+ # File.aes256_decrypt('encrypted.bin', password: 's3cr3t')
619
+ # # => "..."
620
+ #
589
621
  # @since 1.0.0
590
622
  #
591
623
  def self.aes256_decrypt(path, block_size: 16384, output: nil, **kwargs,&block)
@@ -54,10 +54,10 @@ class String
54
54
 
55
55
  #
56
56
  # @return [String]
57
- # The SHA2 checksum of the String.
57
+ # The SHA256 checksum of the String.
58
58
  #
59
59
  # @example
60
- # "hello".sha2
60
+ # "hello".sha256
61
61
  # # => "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
62
62
  #
63
63
  # @api public
@@ -152,6 +152,10 @@ class String
152
152
  # @return [String]
153
153
  # The encrypted String.
154
154
  #
155
+ # @example
156
+ # "top secret".encrypt('aes-256-cbc', password: 's3cr3t')
157
+ # # => "\xF0[\x17\xDA\xA2\x82\x93\xF4\xB6s\xB5\xD8\x1F\xF2\xC6\\"
158
+ #
155
159
  # @see http://rubydoc.info/stdlib/openssl/OpenSSL/Cipher
156
160
  #
157
161
  # @since 0.6.0
@@ -191,6 +195,10 @@ class String
191
195
  # @return [String]
192
196
  # The decrypted String.
193
197
  #
198
+ # @example
199
+ # "\xF0[\x17\xDA\xA2\x82\x93\xF4\xB6s\xB5\xD8\x1F\xF2\xC6\\".decrypt('aes-256-cbc', password: 's3cr3t')
200
+ # # => "top secret"
201
+ #
194
202
  # @see http://rubydoc.info/stdlib/openssl/OpenSSL/Cipher
195
203
  #
196
204
  # @since 0.6.0
@@ -236,6 +244,10 @@ class String
236
244
  # @raise [ArgumentError]
237
245
  # Either the the `key:` or `password:` keyword argument must be given.
238
246
  #
247
+ # @example
248
+ # "top secret".aes_encrypt(key_size: 256, password: 's3cr3t')
249
+ # # => "\xF0[\x17\xDA\xA2\x82\x93\xF4\xB6s\xB5\xD8\x1F\xF2\xC6\\"
250
+ #
239
251
  # @since 1.0.0
240
252
  #
241
253
  def aes_encrypt(**kwargs)
@@ -275,6 +287,10 @@ class String
275
287
  # @raise [ArgumentError]
276
288
  # Either the the `key:` or `password:` keyword argument must be given.
277
289
  #
290
+ # @example
291
+ # "\xF0[\x17\xDA\xA2\x82\x93\xF4\xB6s\xB5\xD8\x1F\xF2\xC6\\".aes_decrypt(key_size: 256, password: 's3cr3t')
292
+ # # => "top secret"
293
+ #
278
294
  # @since 1.0.0
279
295
  #
280
296
  def aes_decrypt(**kwargs)
@@ -311,6 +327,10 @@ class String
311
327
  # @raise [ArgumentError]
312
328
  # Either the the `key:` or `password:` keyword argument must be given.
313
329
  #
330
+ # @example
331
+ # "top secret".aes128_encrypt(password: 's3cr3t')
332
+ # # => "\x88\xA53\xE9|\xE2\x8E\xA0\xABv\xCF\x94\x17\xBB*\xC5"
333
+ #
314
334
  # @since 1.0.0
315
335
  #
316
336
  def aes128_encrypt(**kwargs)
@@ -347,6 +367,10 @@ class String
347
367
  # @raise [ArgumentError]
348
368
  # Either the the `key:` or `password:` keyword argument must be given.
349
369
  #
370
+ # @example
371
+ # "\x88\xA53\xE9|\xE2\x8E\xA0\xABv\xCF\x94\x17\xBB*\xC5".aes128_decrypt(password: 's3cr3t')
372
+ # # => "top secret"
373
+ #
350
374
  # @since 1.0.0
351
375
  #
352
376
  def aes128_decrypt(**kwargs)
@@ -383,6 +407,10 @@ class String
383
407
  # @raise [ArgumentError]
384
408
  # Either the the `key:` or `password:` keyword argument must be given.
385
409
  #
410
+ # @example
411
+ # "top secret".aes256_encrypt(password: 's3cr3t')
412
+ # # => "\xF0[\x17\xDA\xA2\x82\x93\xF4\xB6s\xB5\xD8\x1F\xF2\xC6\\"
413
+ #
386
414
  # @since 1.0.0
387
415
  #
388
416
  def aes256_encrypt(**kwargs)
@@ -419,6 +447,10 @@ class String
419
447
  # @raise [ArgumentError]
420
448
  # Either the the `key:` or `password:` keyword argument must be given.
421
449
  #
450
+ # @example
451
+ # "\xF0[\x17\xDA\xA2\x82\x93\xF4\xB6s\xB5\xD8\x1F\xF2\xC6\\".aes256_decrypt(password: 's3cr3t')
452
+ # # => "top secret"
453
+ #
422
454
  # @since 1.0.0
423
455
  #
424
456
  def aes256_decrypt(**kwargs)
@@ -40,6 +40,9 @@ module Ronin
40
40
  key_class.extend ClassMethods
41
41
  end
42
42
 
43
+ #
44
+ # Class-methods.
45
+ #
43
46
  module ClassMethods
44
47
  #
45
48
  # Generates a new random key.
@@ -151,7 +154,7 @@ module Ronin
151
154
  cipher = OpenSSL::Cipher.new(cipher)
152
155
  encoding_method.call(cipher,password)
153
156
  else
154
- encoding_method.call()
157
+ encoding_method.call
155
158
  end
156
159
 
157
160
  File.write(path,exported)