ronin-support 1.0.1 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog.md +38 -0
  3. data/README.md +0 -1
  4. data/lib/ronin/support/archive/core_ext/file.rb +43 -0
  5. data/lib/ronin/support/archive/core_ext.rb +1 -1
  6. data/lib/ronin/support/binary/array.rb +1 -1
  7. data/lib/ronin/support/binary/buffer.rb +3 -3
  8. data/lib/ronin/support/binary/core_ext.rb +2 -0
  9. data/lib/ronin/support/binary/cstring.rb +43 -0
  10. data/lib/ronin/support/binary/ctypes/array_type.rb +1 -1
  11. data/lib/ronin/support/binary/ctypes/os/bsd.rb +1 -1
  12. data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +1 -1
  13. data/lib/ronin/support/binary/packet.rb +77 -0
  14. data/lib/ronin/support/binary/stack.rb +3 -3
  15. data/lib/ronin/support/binary/template.rb +1 -5
  16. data/lib/ronin/support/binary.rb +1 -0
  17. data/lib/ronin/support/cli/io_shell.rb +2 -0
  18. data/lib/ronin/support/compression/core_ext/file.rb +16 -0
  19. data/lib/ronin/support/core_ext/kernel.rb +0 -4
  20. data/lib/ronin/support/crypto/cert.rb +17 -9
  21. data/lib/ronin/support/crypto/core_ext/file.rb +32 -0
  22. data/lib/ronin/support/crypto/core_ext/string.rb +34 -2
  23. data/lib/ronin/support/encoding/base16.rb +1 -1
  24. data/lib/ronin/support/encoding/base32.rb +1 -1
  25. data/lib/ronin/support/encoding/c/core_ext/string.rb +1 -1
  26. data/lib/ronin/support/encoding/c.rb +2 -2
  27. data/lib/ronin/support/encoding/core_ext/string.rb +2 -2
  28. data/lib/ronin/support/encoding/hex/core_ext/string.rb +1 -1
  29. data/lib/ronin/support/encoding/hex.rb +2 -2
  30. data/lib/ronin/support/encoding/js.rb +1 -1
  31. data/lib/ronin/support/encoding/powershell.rb +1 -1
  32. data/lib/ronin/support/encoding/quoted_printable.rb +3 -1
  33. data/lib/ronin/support/encoding/ruby.rb +1 -1
  34. data/lib/ronin/support/encoding/uuencoding.rb +3 -1
  35. data/lib/ronin/support/encoding/xml.rb +1 -1
  36. data/lib/ronin/support/network/dns/mixin.rb +2 -10
  37. data/lib/ronin/support/network/http/core_ext/uri/http.rb +8 -0
  38. data/lib/ronin/support/network/ip.rb +45 -14
  39. data/lib/ronin/support/network/ip_range.rb +4 -4
  40. data/lib/ronin/support/network/ssl/mixin.rb +2 -0
  41. data/lib/ronin/support/path.rb +1 -1
  42. data/lib/ronin/support/text/homoglyph/core_ext/string.rb +33 -0
  43. data/lib/ronin/support/text/patterns/network.rb +20 -20
  44. data/lib/ronin/support/text/random/mixin.rb +17 -17
  45. data/lib/ronin/support/text/random.rb +23 -23
  46. data/lib/ronin/support/text/typo/core_ext/string.rb +24 -0
  47. data/lib/ronin/support/version.rb +1 -1
  48. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e4a9cca292661aabc9b8b8360bef73af12a140bac7b80bbe969671a78d5c4cb8
4
- data.tar.gz: cb8920fa647c56bcf03c9a4b5796f6e58fd732d82ea79027bce10d77246f1af6
3
+ metadata.gz: 3f47bb5e6e9e8b720f2b2e66cfd1eb49bcb4562e5ed0025a3ed491ee7e39f106
4
+ data.tar.gz: a68c5f263d3d7caf40f789354e51a977ada25c52cb7a93f58c4c10208c40da67
5
5
  SHA512:
6
- metadata.gz: '04831026ac5813990e5db208ac229f707f24cfb0bcff277ff0da70eecdce58b379925ed944b5377ead08ac63f7e6fce0a323bcfe05a4a617a6d0cfa5987ec90b'
7
- data.tar.gz: ed25a967fe35242afdb9a9d2e3dc8dff096de0e7737494100b6a54c96f67c4288d2ff21ab2e6eadce4f07fe6284037e454e37498ae1b108dfeda024b115bf26b
6
+ metadata.gz: 302af7c9324ba08daff8107236734c211b10f969723f55cac2843ec52a5e367357c1b3c06d4138215553960a994ae4c3338e3a4302105979fedb1dac51b2cc20
7
+ data.tar.gz: 542b8b0d1caab51fce5fedf516b3b849c2a673492995916db6a43b3522090cd8bb1acc1b3200741832153e874522fcd60eae76f74e2aa90bb76d57dafb6daa1e
data/ChangeLog.md CHANGED
@@ -1,3 +1,41 @@
1
+ ### 1.0.3 / 2023-09-19
2
+
3
+ * {Ronin::Support::Crypto::Cert::Name#entries} now returns UTF-8 encoded
4
+ Strings.
5
+ * {Ronin::Support::Crypto::Cert.Name} now passes through
6
+ {Ronin::Support::Crypto::Cert::Name} objects instead of copying them.
7
+ * Fixed a bug in {Ronin::Support::Crypto::Cert.generate} when it is given a
8
+ `OpenSSL::PKey::EC` signing key.
9
+ * Fixed a bug in {Ronin::Support::Network::SSL::Mixin#ssl_connect} where the
10
+ `OpenSSL::SSL::SSLSocket#hostname` attribute was not being set to the
11
+ host being connected to, which prevented connecting to TLS servers that use
12
+ SNI.
13
+ * Fixed {Ronin::Support::Network::IP#set} to return `self`.
14
+ * Fixed {Ronin::Support::Network::IP#inspect} to call the lazy-initialized
15
+ {Ronin::Support::Network::IP#address} method instead of the `@address`
16
+ instance variable directly.
17
+
18
+ ### 1.0.2 / 2023-06-09
19
+
20
+ * Fixed a bug in {Ronin::Support::Encoding::Base32.decode},
21
+ {Ronin::Support::Encoding::Hex.unescape},
22
+ {Ronin::Support::Encoding::C.unescape},
23
+ {Ronin::Support::Encoding::JS.unescape},
24
+ {Ronin::Support::Encoding::PowerShell.unescape},
25
+ {Ronin::Support::Encoding::Ruby.unescape},
26
+ {Ronin::Support::Encoding::XML.unescape},
27
+ {Ronin::Support::Path#join}, {String#encode_bytes}, and {String#encode_chars}
28
+ where ASCII-bit Strings were always being returned instead of UTF-8 Strings.
29
+ * Fixed a bug where {Ronin::Support::Network::IP#address} was being improperly
30
+ cached.
31
+ * Added missing `require` for {File.tar}, {File.untar}, {File.zip}, and
32
+ {File.unzip} core-ext methods.
33
+ * Added missing `require` for {Integer#pack} and {Float#pack} core-ext methods.
34
+ * No longer include {Ronin::Support::Mixin} into {Kernel} which caused Mixin
35
+ methods to be included into *every* Class and object.
36
+ * Added more example code to documentation.
37
+ * Documentation fixes.
38
+
1
39
  ### 1.0.1 / 2023-03-01
2
40
 
3
41
  * {Ronin::Support::Network::HTTP.connect_uri} can now infer when to enable
data/README.md CHANGED
@@ -8,7 +8,6 @@
8
8
  * [Issues](https://github.com/ronin-rb/ronin-support/issues)
9
9
  * [Documentation](https://ronin-rb.dev/docs/ronin-support/frames)
10
10
  * [Discord](https://discord.gg/6WAb3PsVX9) |
11
- [Twitter](https://twitter.com/ronin_rb) |
12
11
  [Mastodon](https://infosec.exchange/@ronin_rb)
13
12
 
14
13
  ## Description
@@ -38,6 +38,22 @@ class File
38
38
  # @return [Ronin::Support::Archive::Tar::Reader]
39
39
  # The tar reader object.
40
40
  #
41
+ # @example Enumerating over each entry in the tar archive:
42
+ # File.untar('file.tar') do |tar|
43
+ # tar.each do |entry|
44
+ # puts entry.full_name
45
+ # puts '-' * 80
46
+ # puts entry.read
47
+ # puts '-' * 80
48
+ # end
49
+ # end
50
+ #
51
+ # @example Reads a specific file from the tar archive:
52
+ # File.untar('file.tar') do |tar|
53
+ # data = tar.read('foo.txt')
54
+ # # ...
55
+ # end
56
+ #
41
57
  # @api public
42
58
  #
43
59
  # @since 1.0.0
@@ -61,6 +77,12 @@ class File
61
77
  # @return [Ronin::Support::Archive::Tar::Writer]
62
78
  # The tar writer object.
63
79
  #
80
+ # @example
81
+ # File.tar('output.tar') do |tar|
82
+ # tar.mkdir('foo')
83
+ # tar.add_file('foo/bar.txt','Hello World!')
84
+ # end
85
+ #
64
86
  # @api public
65
87
  #
66
88
  # @since 1.0.0
@@ -84,6 +106,22 @@ class File
84
106
  # @return [Ronin::Support::Archive::Zip::Reader]
85
107
  # The zip reader object.
86
108
  #
109
+ # @example Enumerating over each file in a zip archive:
110
+ # File.unzip('file.zip') do |zip|
111
+ # zip.each do |entry|
112
+ # puts entry.name
113
+ # puts '-' * 80
114
+ # puts entry.read
115
+ # puts '-' * 80
116
+ # end
117
+ # end
118
+ #
119
+ # @example Reads a specific file from a zip archive:
120
+ # File.unzip('file.zip') do |zip|
121
+ # data = zip.read('foo.txt')
122
+ # # ...
123
+ # end
124
+ #
87
125
  # @api public
88
126
  #
89
127
  # @since 1.0.0
@@ -107,6 +145,11 @@ class File
107
145
  # @return [Ronin::Support::Archive::Zip::Writer]
108
146
  # The zip writer object.
109
147
  #
148
+ # @example
149
+ # File.zip('output.zip') do |zip|
150
+ # zip.add_file('foo/bar.txt','Hello World!')
151
+ # end
152
+ #
110
153
  # @api public
111
154
  #
112
155
  # @since 1.0.0
@@ -16,4 +16,4 @@
16
16
  # along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
17
17
  #
18
18
 
19
- require 'ronin/support/compression/core_ext/file'
19
+ require 'ronin/support/archive/core_ext/file'
@@ -35,7 +35,7 @@ module Ronin
35
35
  #
36
36
  # Creating an array of `int32`s:
37
37
  #
38
- # array = Binary::Array.new(:int32, 4)
38
+ # array = Binary::Binary::Array.new(:int32, 4)
39
39
  # # => #<Ronin::Support::Binary::Binary::Array: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00">
40
40
  # array[0] = 0x11111111
41
41
  # array[1] = 0x22222222
@@ -30,7 +30,7 @@ module Ronin
30
30
  #
31
31
  # Writing bytes into an empty buffer:
32
32
  #
33
- # buffer = Buffer.new(10)
33
+ # buffer = Binary::Buffer.new(10)
34
34
  # # => #<Ronin::Support::Binary::Buffer: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00">
35
35
  # buffer[0] = 0x41
36
36
  # buffer[1] = 0x42
@@ -40,7 +40,7 @@ module Ronin
40
40
  #
41
41
  # Writing different types of data to a buffer:
42
42
  #
43
- # buffer = Buffer.new(16)
43
+ # buffer = Binary::Buffer.new(16)
44
44
  # # => #<Ronin::Support::Binary::Buffer: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00">
45
45
  # buffer.put_uint32(0,0x11223344)
46
46
  # buffer.put_int32(4,-1)
@@ -51,7 +51,7 @@ module Ronin
51
51
  #
52
52
  # Creating a buffer from an existing String:
53
53
  #
54
- # buffer = Buffer.new("\x41\x00\x00\x00\x42\x00\x00\x00")
54
+ # buffer = Binary::Buffer.new("\x41\x00\x00\x00\x42\x00\x00\x00")
55
55
  # # => #<Ronin::Support::Binary::Buffer: "A\u0000\u0000\u0000B\u0000\u0000\u0000">
56
56
  # buffer.get_uint32(0)
57
57
  # # => 65
@@ -16,6 +16,8 @@
16
16
  # along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
17
17
  #
18
18
 
19
+ require 'ronin/support/binary/core_ext/integer'
20
+ require 'ronin/support/binary/core_ext/float'
19
21
  require 'ronin/support/binary/core_ext/string'
20
22
  require 'ronin/support/binary/core_ext/array'
21
23
  require 'ronin/support/binary/core_ext/io'
@@ -24,6 +24,49 @@ module Ronin
24
24
  #
25
25
  # Represents a null terminated C string.
26
26
  #
27
+ # ## Examples
28
+ #
29
+ # ### Initializing C Strings
30
+ #
31
+ # From a String:
32
+ #
33
+ # str = Binary::CString.new("hello ")
34
+ # # => #<Ronin::Support::Binary::CString:0x00007fc94ba577f8 @string="hello \u0000">
35
+ #
36
+ # From a binary C string:
37
+ #
38
+ # str = Binary::CString.new("world\0".b)
39
+ # # => #<Ronin::Support::Binary::CString:0x00007fc94ba06f88 @string="world\u0000">
40
+ #
41
+ # From characters:
42
+ #
43
+ # str = Binary::CString['A', 'B', 'C']
44
+ # # => #<Ronin::Support::Binary::CString:0x00007fc94ba6f268 @string="ABC\x00">
45
+ #
46
+ # ### Modifying C Strings
47
+ #
48
+ # Concating Strings to a C String:
49
+ #
50
+ # str = Binary::CString.new("hello ")
51
+ # str.concat("world")
52
+ # # => #<Ronin::Support::Binary::CString:0x00007fc94b978df0 @string="hello world\u0000">
53
+ # str.to_s
54
+ # # => "hello world"
55
+ #
56
+ # Appending two C Strings:
57
+ #
58
+ # str1 = Binary::CString.new("hello ")
59
+ # str2 = Binary::CString.new("world\0")
60
+ # str = str1 + str2
61
+ # # => #<Ronin::Support::Binary::CString:0x00007fc94b9523f8 @string="hello world\u0000">
62
+ #
63
+ # Setting characters:
64
+ #
65
+ # str = Binary::CString.new("hello")
66
+ # str[0] = 'X'
67
+ # str.to_s
68
+ # # => "Xello"
69
+ #
27
70
  # @api public
28
71
  #
29
72
  # @since 1.0.0
@@ -152,7 +152,7 @@ module Ronin
152
152
  if @pack_string
153
153
  super(array)
154
154
  else
155
- buffer = String.new("", encoding: Encoding::ASCII_8BIT)
155
+ buffer = String.new
156
156
 
157
157
  @length.times do |index|
158
158
  value = array[index] || @type.uninitialized_value
@@ -33,7 +33,7 @@ module Ronin
33
33
  class BSD < UNIX
34
34
 
35
35
  #
36
- # Initializes the FreeBSD types object.
36
+ # Initializes the common BSD types object.
37
37
  #
38
38
  # @param [#[]] types
39
39
  # The base types module.
@@ -149,7 +149,7 @@ module Ronin
149
149
  if @pack_string
150
150
  super(array)
151
151
  else
152
- buffer = String.new('', encoding: Encoding::ASCII_8BIT)
152
+ buffer = String.new
153
153
 
154
154
  array.each do |element|
155
155
  buffer << @type.pack(element)
@@ -24,6 +24,83 @@ module Ronin
24
24
  #
25
25
  # Represents a network packet in network byte-order.
26
26
  #
27
+ # ## Examples
28
+ #
29
+ # ### Defining Packet Fields
30
+ #
31
+ # class Packet < Ronin::Support::Binary::Packet
32
+ #
33
+ # member :flags, :uint8
34
+ # member :src, :uint32
35
+ # member :dst, :uint32
36
+ # member :length, :uint32
37
+ #
38
+ # end
39
+ #
40
+ # ### Initializing Packets
41
+ #
42
+ # From a Hash:
43
+ #
44
+ # packet = Packet.new(
45
+ # flags: 0x0c,
46
+ # src: IPAddr.new('1.2.3.4').to_i,
47
+ # dst: IPAddr.new('5.6.7.8').to_i,
48
+ # length: 1024
49
+ # )
50
+ #
51
+ # From a buffer:
52
+ #
53
+ # packet = Packet.unpack("\f\x01\x02\x03\x04\x05\x06\a\b\x00\x00\x04\x00")
54
+ #
55
+ # ### Reading Fields
56
+ #
57
+ # packet = Packet.new("\f\x01\x02\x03\x04\x05\x06\a\b\x00\x00\x04\x00")
58
+ # packet[:flags]
59
+ # # => 12
60
+ # packet.flags
61
+ # # => 12
62
+ #
63
+ # ### Packing Packets
64
+ #
65
+ # class Packet < Ronin::Support::Binary::Packet
66
+ #
67
+ # member :flags, :uint8
68
+ # member :src, :uint32
69
+ # member :dst, :uint32
70
+ # member :length, :uint32
71
+ #
72
+ # end
73
+ #
74
+ # packet = Packet.new(
75
+ # flags: 0x0c,
76
+ # src: IPAddr.new('1.2.3.4').to_i,
77
+ # dst: IPAddr.new('5.6.7.8').to_i,
78
+ # length: 1024
79
+ # )
80
+ # packet.pack
81
+ # # => "\f\x01\x02\x03\x04\x05\x06\a\b\x00\x00\x04\x00"
82
+ #
83
+ # ### Unpacking Packets
84
+ #
85
+ # class Packet < Ronin::Support::Binary::Packet
86
+ #
87
+ # member :flags, :uint8
88
+ # member :src, :uint32
89
+ # member :dst, :uint32
90
+ # member :length, :uint32
91
+ #
92
+ # end
93
+ #
94
+ # packet = Packet.unpack("\f\x01\x02\x03\x04\x05\x06\a\b\x00\x00\x04\x00")
95
+ # packet.flags
96
+ # # => 12
97
+ # packet.src
98
+ # # => 16909060
99
+ # packet.dst
100
+ # # => 84281096
101
+ # packet.length
102
+ # # => 1024
103
+ #
27
104
  class Packet < Binary::Struct
28
105
 
29
106
  platform endian: :net
@@ -36,7 +36,7 @@ module Ronin
36
36
  #
37
37
  # Creating a new stack:
38
38
  #
39
- # stack = Stack.new
39
+ # stack = Binary::Stack.new
40
40
  # # => #<Ronin::Support::Binary::Stack: "">
41
41
  # stack.push 0x41414141
42
42
  # # => #<Ronin::Support::Binary::Stack: "AAAA\x00\x00\x00\x00">
@@ -49,7 +49,7 @@ module Ronin
49
49
  #
50
50
  # Creating a stack from an existing String:
51
51
  #
52
- # stack = Stack.new("\x41\x00\x00\x00\x00\x00\x00\x00\x42\x00\x00\x00\x00\x00\x00\x00")
52
+ # stack = Binary::Stack.new("\x41\x00\x00\x00\x00\x00\x00\x00\x42\x00\x00\x00\x00\x00\x00\x00")
53
53
  # stack[0]
54
54
  # # => 65
55
55
  # stack[8]
@@ -125,7 +125,7 @@ module Ronin
125
125
  @size = @string.bytesize
126
126
  @length = @size / @machine_word.size
127
127
  else
128
- @string = String.new("", encoding: Encoding::ASCII_8BIT)
128
+ @string = String.new
129
129
  @size = 0
130
130
  @length = 0
131
131
  end
@@ -36,10 +36,6 @@ module Ronin
36
36
  # * `:int16` - signed 16-bit integer.
37
37
  # * `:int32` - signed 32-bit integer.
38
38
  # * `:int64` - signed 64-bit integer.
39
- # * `:uint16_le` - unsigned 16-bit integer, little endian.
40
- # * `:uint32_le` - unsigned 32-bit integer, little endian.
41
- # * `:uint16_be` - unsigned 16-bit integer, big endian.
42
- # * `:uint32_be` - unsigned 32-bit integer, big endian.
43
39
  # * `:uchar` - unsigned character.
44
40
  # * `:ushort` - unsigned short integer, native endian.
45
41
  # * `:uint` - unsigned integer, native endian.
@@ -209,7 +205,7 @@ module Ronin
209
205
 
210
206
  values.pack(@pack_string)
211
207
  else
212
- buffer = String.new('', encoding: Encoding::ASCII_8BIT)
208
+ buffer = String.new
213
209
 
214
210
  @types.each do |type|
215
211
  # shift off the next value and pack it
@@ -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'
@@ -26,6 +26,8 @@ module Ronin
26
26
  #
27
27
  # ## Example
28
28
  #
29
+ # require 'ronin/support/cli/io_shell'
30
+ #
29
31
  # socket = TCPSocket.new('irc.undernet.org',6667)
30
32
  # CLI::IOShell.sstart(socket)
31
33
  #
@@ -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
@@ -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
  #
@@ -18,6 +18,7 @@
18
18
 
19
19
  require 'ronin/support/crypto/openssl'
20
20
  require 'ronin/support/crypto/key/rsa'
21
+ require 'ronin/support/crypto/key/ec'
21
22
 
22
23
  module Ronin
23
24
  module Support
@@ -83,7 +84,9 @@ module Ronin
83
84
  # @return [Hash{String => String}]
84
85
  #
85
86
  def entries
86
- @entries ||= to_a.to_h { |(oid,value,type)| [oid, value] }
87
+ @entries ||= to_a.to_h do |(oid,value,type)|
88
+ [oid, value && value.force_encoding(Encoding::UTF_8)]
89
+ end
87
90
  end
88
91
 
89
92
  alias to_h entries
@@ -160,7 +163,7 @@ module Ronin
160
163
  #
161
164
  # Coerces a value into a {Name} object.
162
165
  #
163
- # @param [String, Hash, OpenSSL::X509::Name] name
166
+ # @param [String, Hash, OpenSSL::X509::Name, Name] name
164
167
  # The name value to coerce.
165
168
  #
166
169
  # @return [Cert::Name]
@@ -170,8 +173,9 @@ module Ronin
170
173
  #
171
174
  def self.Name(name)
172
175
  case name
173
- when String then Name.parse(name)
174
- when Hash then Name.build(**name)
176
+ when String then Name.parse(name)
177
+ when Hash then Name.build(**name)
178
+ when Name then name
175
179
  when OpenSSL::X509::Name
176
180
  new_name = Name.allocate
177
181
  new_name.send(:initialize_copy,name)
@@ -269,7 +273,7 @@ module Ronin
269
273
  # key: key,
270
274
  # subject: {
271
275
  # common_name: 'localhost',
272
- # organization: 'Test Co..',
276
+ # organization: 'Test Co.',
273
277
  # organizational_unit: 'Test Dept',
274
278
  # locality: 'Test City',
275
279
  # state: 'XX',
@@ -288,7 +292,7 @@ module Ronin
288
292
  # key: ca_key,
289
293
  # subject: {
290
294
  # common_name: 'Test CA',
291
- # organization: 'Test CA, Inc..',
295
+ # organization: 'Test CA, Inc.',
292
296
  # organizational_unit: 'Test Dept',
293
297
  # locality: 'Test City',
294
298
  # state: 'XX',
@@ -309,7 +313,7 @@ module Ronin
309
313
  # ca_cert: ca_cert,
310
314
  # subject: {
311
315
  # common_name: 'test.com',
312
- # organization: 'Test Co..',
316
+ # organization: 'Test Co.',
313
317
  # organizational_unit: 'Test Dept',
314
318
  # locality: 'Test City',
315
319
  # state: 'XX',
@@ -343,7 +347,10 @@ module Ronin
343
347
 
344
348
  cert.not_before = not_before
345
349
  cert.not_after = not_after
346
- cert.public_key = key.public_key
350
+ cert.public_key = case key
351
+ when OpenSSL::PKey::EC then key
352
+ else key.public_key
353
+ end
347
354
  cert.subject = Name(subject) if subject
348
355
  cert.issuer = if ca_cert then ca_cert.subject
349
356
  else cert.subject
@@ -491,7 +498,7 @@ module Ronin
491
498
  #
492
499
  # Coerces a value into a {Cert} object.
493
500
  #
494
- # @param [String, OpenSSL::X509::Certificate] cert
501
+ # @param [String, OpenSSL::X509::Certificate, Cert] cert
495
502
  # The certificate String or `OpenSSL::X509::Certificate` value.
496
503
  #
497
504
  # @return [Cert]
@@ -505,6 +512,7 @@ module Ronin
505
512
  def self.Cert(cert)
506
513
  case cert
507
514
  when String then Cert.parse(cert)
515
+ when Cert then cert
508
516
  when OpenSSL::X509::Certificate
509
517
  new_cert = Cert.allocate
510
518
  new_cert.send(:initialize_copy,cert)
@@ -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)