ruby_smb 1.0.5 → 2.0.3

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 (191) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.travis.yml +3 -2
  5. data/Gemfile +6 -2
  6. data/README.md +35 -47
  7. data/examples/anonymous_auth.rb +3 -3
  8. data/examples/append_file.rb +10 -8
  9. data/examples/authenticate.rb +9 -5
  10. data/examples/delete_file.rb +8 -6
  11. data/examples/enum_registry_key.rb +29 -0
  12. data/examples/enum_registry_values.rb +31 -0
  13. data/examples/list_directory.rb +8 -6
  14. data/examples/negotiate.rb +51 -8
  15. data/examples/negotiate_with_netbios_service.rb +9 -5
  16. data/examples/net_share_enum_all.rb +6 -4
  17. data/examples/pipes.rb +13 -13
  18. data/examples/query_service_status.rb +64 -0
  19. data/examples/read_file.rb +8 -6
  20. data/examples/read_file_encryption.rb +56 -0
  21. data/examples/read_registry_key_value.rb +33 -0
  22. data/examples/rename_file.rb +9 -7
  23. data/examples/tree_connect.rb +7 -5
  24. data/examples/write_file.rb +9 -7
  25. data/lib/ruby_smb.rb +4 -1
  26. data/lib/ruby_smb/client.rb +239 -21
  27. data/lib/ruby_smb/client/authentication.rb +27 -8
  28. data/lib/ruby_smb/client/encryption.rb +62 -0
  29. data/lib/ruby_smb/client/negotiation.rb +154 -12
  30. data/lib/ruby_smb/client/signing.rb +19 -0
  31. data/lib/ruby_smb/client/tree_connect.rb +4 -4
  32. data/lib/ruby_smb/client/utils.rb +8 -7
  33. data/lib/ruby_smb/client/winreg.rb +46 -0
  34. data/lib/ruby_smb/crypto.rb +30 -0
  35. data/lib/ruby_smb/dcerpc.rb +40 -0
  36. data/lib/ruby_smb/dcerpc/bind.rb +2 -2
  37. data/lib/ruby_smb/dcerpc/bind_ack.rb +2 -2
  38. data/lib/ruby_smb/dcerpc/error.rb +6 -0
  39. data/lib/ruby_smb/dcerpc/ndr.rb +260 -16
  40. data/lib/ruby_smb/dcerpc/pdu_header.rb +1 -1
  41. data/lib/ruby_smb/dcerpc/request.rb +41 -9
  42. data/lib/ruby_smb/dcerpc/rpc_security_attributes.rb +34 -0
  43. data/lib/ruby_smb/dcerpc/rrp_unicode_string.rb +38 -0
  44. data/lib/ruby_smb/dcerpc/srvsvc.rb +10 -0
  45. data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +9 -0
  46. data/lib/ruby_smb/dcerpc/svcctl.rb +479 -0
  47. data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request.rb +48 -0
  48. data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response.rb +26 -0
  49. data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_request.rb +25 -0
  50. data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response.rb +26 -0
  51. data/lib/ruby_smb/dcerpc/svcctl/control_service_request.rb +26 -0
  52. data/lib/ruby_smb/dcerpc/svcctl/control_service_response.rb +26 -0
  53. data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request.rb +35 -0
  54. data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response.rb +23 -0
  55. data/lib/ruby_smb/dcerpc/svcctl/open_service_w_request.rb +31 -0
  56. data/lib/ruby_smb/dcerpc/svcctl/open_service_w_response.rb +23 -0
  57. data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request.rb +25 -0
  58. data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response.rb +44 -0
  59. data/lib/ruby_smb/dcerpc/svcctl/query_service_status_request.rb +23 -0
  60. data/lib/ruby_smb/dcerpc/svcctl/query_service_status_response.rb +27 -0
  61. data/lib/ruby_smb/dcerpc/svcctl/service_status.rb +25 -0
  62. data/lib/ruby_smb/dcerpc/svcctl/start_service_w_request.rb +27 -0
  63. data/lib/ruby_smb/dcerpc/svcctl/start_service_w_response.rb +25 -0
  64. data/lib/ruby_smb/dcerpc/winreg.rb +421 -0
  65. data/lib/ruby_smb/dcerpc/winreg/close_key_request.rb +24 -0
  66. data/lib/ruby_smb/dcerpc/winreg/close_key_response.rb +27 -0
  67. data/lib/ruby_smb/dcerpc/winreg/create_key_request.rb +73 -0
  68. data/lib/ruby_smb/dcerpc/winreg/create_key_response.rb +36 -0
  69. data/lib/ruby_smb/dcerpc/winreg/enum_key_request.rb +45 -0
  70. data/lib/ruby_smb/dcerpc/winreg/enum_key_response.rb +42 -0
  71. data/lib/ruby_smb/dcerpc/winreg/enum_value_request.rb +39 -0
  72. data/lib/ruby_smb/dcerpc/winreg/enum_value_response.rb +36 -0
  73. data/lib/ruby_smb/dcerpc/winreg/open_key_request.rb +34 -0
  74. data/lib/ruby_smb/dcerpc/winreg/open_key_response.rb +25 -0
  75. data/lib/ruby_smb/dcerpc/winreg/open_root_key_request.rb +43 -0
  76. data/lib/ruby_smb/dcerpc/winreg/open_root_key_response.rb +35 -0
  77. data/lib/ruby_smb/dcerpc/winreg/query_info_key_request.rb +27 -0
  78. data/lib/ruby_smb/dcerpc/winreg/query_info_key_response.rb +40 -0
  79. data/lib/ruby_smb/dcerpc/winreg/query_value_request.rb +40 -0
  80. data/lib/ruby_smb/dcerpc/winreg/query_value_response.rb +57 -0
  81. data/lib/ruby_smb/dcerpc/winreg/regsam.rb +40 -0
  82. data/lib/ruby_smb/dcerpc/winreg/save_key_request.rb +37 -0
  83. data/lib/ruby_smb/dcerpc/winreg/save_key_response.rb +23 -0
  84. data/lib/ruby_smb/dispatcher/base.rb +1 -1
  85. data/lib/ruby_smb/dispatcher/socket.rb +5 -4
  86. data/lib/ruby_smb/error.rb +28 -1
  87. data/lib/ruby_smb/field/stringz16.rb +17 -1
  88. data/lib/ruby_smb/nbss/session_header.rb +4 -4
  89. data/lib/ruby_smb/smb1/commands.rb +1 -1
  90. data/lib/ruby_smb/smb1/file.rb +8 -14
  91. data/lib/ruby_smb/smb1/packet/session_setup_legacy_request.rb +1 -1
  92. data/lib/ruby_smb/smb1/packet/session_setup_legacy_response.rb +2 -2
  93. data/lib/ruby_smb/smb1/packet/session_setup_request.rb +1 -1
  94. data/lib/ruby_smb/smb1/packet/session_setup_response.rb +2 -2
  95. data/lib/ruby_smb/smb1/packet/write_andx_request.rb +1 -1
  96. data/lib/ruby_smb/smb1/pipe.rb +81 -3
  97. data/lib/ruby_smb/smb1/tree.rb +12 -3
  98. data/lib/ruby_smb/smb2/bit_field/session_flags.rb +2 -1
  99. data/lib/ruby_smb/smb2/bit_field/share_flags.rb +6 -4
  100. data/lib/ruby_smb/smb2/file.rb +51 -61
  101. data/lib/ruby_smb/smb2/negotiate_context.rb +108 -0
  102. data/lib/ruby_smb/smb2/packet.rb +2 -0
  103. data/lib/ruby_smb/smb2/packet/compression_transform_header.rb +41 -0
  104. data/lib/ruby_smb/smb2/packet/error_packet.rb +2 -4
  105. data/lib/ruby_smb/smb2/packet/negotiate_request.rb +51 -14
  106. data/lib/ruby_smb/smb2/packet/negotiate_response.rb +50 -4
  107. data/lib/ruby_smb/smb2/packet/transform_header.rb +84 -0
  108. data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +92 -6
  109. data/lib/ruby_smb/smb2/packet/tree_connect_response.rb +8 -26
  110. data/lib/ruby_smb/smb2/pipe.rb +80 -3
  111. data/lib/ruby_smb/smb2/smb2_header.rb +1 -1
  112. data/lib/ruby_smb/smb2/tree.rb +32 -20
  113. data/lib/ruby_smb/version.rb +1 -1
  114. data/ruby_smb.gemspec +5 -3
  115. data/spec/lib/ruby_smb/client_spec.rb +1583 -102
  116. data/spec/lib/ruby_smb/crypto_spec.rb +25 -0
  117. data/spec/lib/ruby_smb/dcerpc/bind_ack_spec.rb +2 -2
  118. data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +2 -2
  119. data/spec/lib/ruby_smb/dcerpc/ndr_spec.rb +1729 -0
  120. data/spec/lib/ruby_smb/dcerpc/request_spec.rb +50 -7
  121. data/spec/lib/ruby_smb/dcerpc/rpc_security_attributes_spec.rb +161 -0
  122. data/spec/lib/ruby_smb/dcerpc/rrp_unicode_string_spec.rb +135 -0
  123. data/spec/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all_spec.rb +13 -0
  124. data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +60 -0
  125. data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request_spec.rb +191 -0
  126. data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response_spec.rb +38 -0
  127. data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_request_spec.rb +30 -0
  128. data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response_spec.rb +38 -0
  129. data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_request_spec.rb +39 -0
  130. data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_response_spec.rb +38 -0
  131. data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request_spec.rb +78 -0
  132. data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response_spec.rb +38 -0
  133. data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_request_spec.rb +59 -0
  134. data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_response_spec.rb +38 -0
  135. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request_spec.rb +38 -0
  136. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response_spec.rb +152 -0
  137. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_request_spec.rb +30 -0
  138. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_response_spec.rb +38 -0
  139. data/spec/lib/ruby_smb/dcerpc/svcctl/service_status_spec.rb +72 -0
  140. data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_request_spec.rb +46 -0
  141. data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_response_spec.rb +30 -0
  142. data/spec/lib/ruby_smb/dcerpc/svcctl_spec.rb +512 -0
  143. data/spec/lib/ruby_smb/dcerpc/winreg/close_key_request_spec.rb +28 -0
  144. data/spec/lib/ruby_smb/dcerpc/winreg/close_key_response_spec.rb +36 -0
  145. data/spec/lib/ruby_smb/dcerpc/winreg/create_key_request_spec.rb +110 -0
  146. data/spec/lib/ruby_smb/dcerpc/winreg/create_key_response_spec.rb +44 -0
  147. data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_request_spec.rb +104 -0
  148. data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_response_spec.rb +97 -0
  149. data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_request_spec.rb +94 -0
  150. data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_response_spec.rb +82 -0
  151. data/spec/lib/ruby_smb/dcerpc/winreg/open_key_request_spec.rb +74 -0
  152. data/spec/lib/ruby_smb/dcerpc/winreg/open_key_response_spec.rb +35 -0
  153. data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_request_spec.rb +95 -0
  154. data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_response_spec.rb +38 -0
  155. data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_request_spec.rb +35 -0
  156. data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_response_spec.rb +113 -0
  157. data/spec/lib/ruby_smb/dcerpc/winreg/query_value_request_spec.rb +88 -0
  158. data/spec/lib/ruby_smb/dcerpc/winreg/query_value_response_spec.rb +138 -0
  159. data/spec/lib/ruby_smb/dcerpc/winreg/regsam_spec.rb +32 -0
  160. data/spec/lib/ruby_smb/dcerpc/winreg/save_key_request_spec.rb +57 -0
  161. data/spec/lib/ruby_smb/dcerpc/winreg/save_key_response_spec.rb +22 -0
  162. data/spec/lib/ruby_smb/dcerpc/winreg_spec.rb +884 -0
  163. data/spec/lib/ruby_smb/dcerpc_spec.rb +81 -0
  164. data/spec/lib/ruby_smb/dispatcher/socket_spec.rb +12 -12
  165. data/spec/lib/ruby_smb/error_spec.rb +59 -0
  166. data/spec/lib/ruby_smb/field/stringz16_spec.rb +12 -0
  167. data/spec/lib/ruby_smb/nbss/session_header_spec.rb +4 -11
  168. data/spec/lib/ruby_smb/smb1/file_spec.rb +9 -1
  169. data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_request_spec.rb +2 -2
  170. data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_response_spec.rb +2 -2
  171. data/spec/lib/ruby_smb/smb1/packet/session_setup_request_spec.rb +2 -2
  172. data/spec/lib/ruby_smb/smb1/packet/session_setup_response_spec.rb +1 -1
  173. data/spec/lib/ruby_smb/smb1/pipe_spec.rb +216 -147
  174. data/spec/lib/ruby_smb/smb2/bit_field/session_flags_spec.rb +9 -0
  175. data/spec/lib/ruby_smb/smb2/bit_field/share_flags_spec.rb +27 -0
  176. data/spec/lib/ruby_smb/smb2/file_spec.rb +146 -68
  177. data/spec/lib/ruby_smb/smb2/negotiate_context_spec.rb +332 -0
  178. data/spec/lib/ruby_smb/smb2/packet/compression_transform_header_spec.rb +108 -0
  179. data/spec/lib/ruby_smb/smb2/packet/error_packet_spec.rb +3 -24
  180. data/spec/lib/ruby_smb/smb2/packet/negotiate_request_spec.rb +138 -3
  181. data/spec/lib/ruby_smb/smb2/packet/negotiate_response_spec.rb +120 -2
  182. data/spec/lib/ruby_smb/smb2/packet/transform_header_spec.rb +220 -0
  183. data/spec/lib/ruby_smb/smb2/packet/tree_connect_request_spec.rb +339 -9
  184. data/spec/lib/ruby_smb/smb2/packet/tree_connect_response_spec.rb +3 -30
  185. data/spec/lib/ruby_smb/smb2/pipe_spec.rb +226 -148
  186. data/spec/lib/ruby_smb/smb2/smb2_header_spec.rb +2 -2
  187. data/spec/lib/ruby_smb/smb2/tree_spec.rb +88 -9
  188. metadata +257 -81
  189. metadata.gz.sig +0 -0
  190. data/lib/ruby_smb/smb1/dcerpc.rb +0 -72
  191. data/lib/ruby_smb/smb2/dcerpc.rb +0 -75
@@ -0,0 +1,28 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::RpcHkey do
2
+ it 'is NdrContextHandle subclass' do
3
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrContextHandle
4
+ end
5
+ end
6
+
7
+ RSpec.describe RubySMB::Dcerpc::Winreg::CloseKeyRequest do
8
+ subject(:packet) { described_class.new }
9
+
10
+ it { is_expected.to respond_to :hkey }
11
+ it { is_expected.to respond_to :opnum }
12
+
13
+ it 'is little endian' do
14
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
15
+ end
16
+
17
+ describe '#hkey' do
18
+ it 'is a RpcHkey structure' do
19
+ expect(packet.hkey).to be_a RubySMB::Dcerpc::Winreg::RpcHkey
20
+ end
21
+ end
22
+
23
+ describe '#initialize_instance' do
24
+ it 'sets #opnum to REG_CLOSE_KEY constant' do
25
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_CLOSE_KEY)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,36 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::RpcHkey do
2
+ it 'is NdrContextHandle subclass' do
3
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrContextHandle
4
+ end
5
+ end
6
+
7
+ RSpec.describe RubySMB::Dcerpc::Winreg::CloseKeyResponse do
8
+ subject(:packet) { described_class.new }
9
+
10
+ it { is_expected.to respond_to :hkey }
11
+ it { is_expected.to respond_to :error_status }
12
+ it { is_expected.to respond_to :opnum }
13
+
14
+ it 'is little endian' do
15
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
16
+ end
17
+
18
+ describe '#hkey' do
19
+ it 'is a RpcHkey structure' do
20
+ expect(packet.hkey).to be_a RubySMB::Dcerpc::Winreg::RpcHkey
21
+ end
22
+ end
23
+
24
+ describe '#error_status' do
25
+ it 'is a 32-bit unsigned integer' do
26
+ expect(packet.error_status).to be_a BinData::Uint32le
27
+ end
28
+ end
29
+
30
+ describe '#initialize_instance' do
31
+ it 'sets #opnum to REG_CLOSE_KEY constant' do
32
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_CLOSE_KEY)
33
+ end
34
+ end
35
+ end
36
+
@@ -0,0 +1,110 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::RpcHkey do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it 'is NdrContextHandle subclass' do
5
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrContextHandle
6
+ end
7
+ end
8
+
9
+ RSpec.describe RubySMB::Dcerpc::Winreg::CreateKeyRequest do
10
+ subject(:packet) { described_class.new }
11
+
12
+
13
+ it 'is little endian' do
14
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
15
+ end
16
+
17
+ it { is_expected.to respond_to :hkey }
18
+ it { is_expected.to respond_to :lp_sub_key }
19
+ it { is_expected.to respond_to :pad1 }
20
+ it { is_expected.to respond_to :lp_class }
21
+ it { is_expected.to respond_to :pad2 }
22
+ it { is_expected.to respond_to :dw_options }
23
+ it { is_expected.to respond_to :sam_desired }
24
+ it { is_expected.to respond_to :lp_security_attributes }
25
+ it { is_expected.to respond_to :pad3 }
26
+ it { is_expected.to respond_to :lpdw_disposition }
27
+
28
+ describe '#hkey' do
29
+ it 'is a RpcHkey structure' do
30
+ expect(packet.hkey).to be_a RubySMB::Dcerpc::Winreg::RpcHkey
31
+ end
32
+ end
33
+
34
+ describe '#lp_sub_key' do
35
+ it 'is a RrpUnicodeString structure' do
36
+ expect(packet.lp_sub_key).to be_a RubySMB::Dcerpc::RrpUnicodeString
37
+ end
38
+ end
39
+
40
+ describe '#pad1' do
41
+ it 'is a string' do
42
+ expect(packet.pad1).to be_a BinData::String
43
+ end
44
+
45
+ it 'should keep #lp_class 4-byte aligned' do
46
+ packet.lp_sub_key = "test"
47
+ expect(packet.lp_class.abs_offset % 4).to eq 0
48
+ end
49
+ end
50
+
51
+ describe '#lp_class' do
52
+ it 'is a RrpUnicodeString structure' do
53
+ expect(packet.lp_class).to be_a RubySMB::Dcerpc::RrpUnicodeString
54
+ end
55
+ end
56
+
57
+ describe '#pad2' do
58
+ it 'is a string' do
59
+ expect(packet.pad1).to be_a BinData::String
60
+ end
61
+
62
+ it 'should keep #dw_options 4-byte aligned' do
63
+ packet.lp_class = "test"
64
+ expect(packet.dw_options.abs_offset % 4).to eq 0
65
+ end
66
+ end
67
+
68
+ describe '#dw_options' do
69
+ it 'is a 32-bit unsigned integer' do
70
+ expect(packet.dw_options).to be_a BinData::Uint32le
71
+ end
72
+ end
73
+
74
+ describe '#sam_desired' do
75
+ it 'is a Regsam structure' do
76
+ expect(packet.sam_desired).to be_a RubySMB::Dcerpc::Winreg::Regsam
77
+ end
78
+ end
79
+
80
+ describe '#lp_security_attributes' do
81
+ it 'is a PrpcSecurityAttributes structure' do
82
+ expect(packet.lp_security_attributes).to be_a RubySMB::Dcerpc::PrpcSecurityAttributes
83
+ end
84
+ end
85
+
86
+ describe '#pad3' do
87
+ it 'is a string' do
88
+ expect(packet.pad1).to be_a BinData::String
89
+ end
90
+
91
+ it 'should keep #lpdw_disposition 4-byte aligned' do
92
+ sc = RubySMB::Dcerpc::RpcSecurityDescriptor.new(lp_security_descriptor: [1,2,3,4])
93
+ packet.lp_security_attributes = RubySMB::Dcerpc::RpcSecurityAttributes.new(rpc_security_descriptor: sc)
94
+ expect(packet.lpdw_disposition.abs_offset % 4).to eq 0
95
+ end
96
+ end
97
+
98
+ describe '#lpdw_disposition' do
99
+ it 'is a NdrLpDword structure' do
100
+ expect(packet.lpdw_disposition).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
101
+ end
102
+ end
103
+
104
+ describe '#initialize_instance' do
105
+ it 'sets #opnum to REG_CREATE_KEY constant' do
106
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_CREATE_KEY)
107
+ end
108
+ end
109
+ end
110
+
@@ -0,0 +1,44 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::PrpcHkey do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it 'is NdrContextHandle subclass' do
5
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrContextHandle
6
+ end
7
+ end
8
+
9
+ RSpec.describe RubySMB::Dcerpc::Winreg::CreateKeyResponse do
10
+ subject(:packet) { described_class.new }
11
+
12
+ it { is_expected.to respond_to :hkey }
13
+ it { is_expected.to respond_to :lpdw_disposition }
14
+ it { is_expected.to respond_to :error_status }
15
+
16
+ it 'is little endian' do
17
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
18
+ end
19
+
20
+ describe '#hkey' do
21
+ it 'is a PrpcHkey structure' do
22
+ expect(packet.hkey).to be_a RubySMB::Dcerpc::Winreg::PrpcHkey
23
+ end
24
+ end
25
+
26
+ describe '#lpdw_disposition' do
27
+ it 'is a NdrLpDword structure' do
28
+ expect(packet.lpdw_disposition).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
29
+ end
30
+ end
31
+
32
+ describe '#error_status' do
33
+ it 'is a 32-bit unsigned integer' do
34
+ expect(packet.error_status).to be_a BinData::Uint32le
35
+ end
36
+ end
37
+
38
+ describe '#initialize_instance' do
39
+ it 'sets #opnum to REG_CREATE_KEY constant' do
40
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_CREATE_KEY)
41
+ end
42
+ end
43
+ end
44
+
@@ -0,0 +1,104 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::RpcHkey do
2
+ it 'is NdrContextHandle subclass' do
3
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrContextHandle
4
+ end
5
+ end
6
+
7
+ RSpec.describe RubySMB::Dcerpc::Winreg::EnumKeyRequest do
8
+ subject(:packet) { described_class.new }
9
+
10
+ it { is_expected.to respond_to :hkey }
11
+ it { is_expected.to respond_to :dw_index }
12
+ it { is_expected.to respond_to :lp_name }
13
+ it { is_expected.to respond_to :pad1 }
14
+ it { is_expected.to respond_to :lp_class }
15
+ it { is_expected.to respond_to :pad2 }
16
+ it { is_expected.to respond_to :lpft_last_write_time }
17
+ it { is_expected.to respond_to :opnum }
18
+
19
+ it 'is little endian' do
20
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
21
+ end
22
+
23
+ describe '#hkey' do
24
+ it 'is a RpcHkey structure' do
25
+ expect(packet.hkey).to be_a RubySMB::Dcerpc::Winreg::RpcHkey
26
+ end
27
+ end
28
+
29
+ describe '#dw_index' do
30
+ it 'is a 32-bit unsigned integer' do
31
+ expect(packet.dw_index).to be_a BinData::Uint32le
32
+ end
33
+ end
34
+
35
+ describe '#lp_name' do
36
+ it 'is a RrpUnicodeString structure' do
37
+ expect(packet.lp_name).to be_a RubySMB::Dcerpc::RrpUnicodeString
38
+ end
39
+ end
40
+
41
+ describe '#pad1' do
42
+ it 'is a string' do
43
+ expect(packet.pad1).to be_a BinData::String
44
+ end
45
+
46
+ it 'should keep #lp_class 4-byte aligned' do
47
+ packet.lp_name = "test"
48
+ expect(packet.lp_class.abs_offset % 4).to eq 0
49
+ end
50
+ end
51
+
52
+ describe '#lp_class' do
53
+ it 'is a PrrpUnicodeString structure' do
54
+ expect(packet.lp_class).to be_a RubySMB::Dcerpc::PrrpUnicodeString
55
+ end
56
+ end
57
+
58
+ describe '#pad2' do
59
+ it 'is a string' do
60
+ expect(packet.pad2).to be_a BinData::String
61
+ end
62
+
63
+ it 'should keep #lpft_last_write_time 4-byte aligned' do
64
+ packet.lp_class = "test"
65
+ expect(packet.lpft_last_write_time.abs_offset % 4).to eq 0
66
+ end
67
+ end
68
+
69
+ describe '#lpft_last_write_time' do
70
+ it 'is a NdrLpFileTime structure' do
71
+ expect(packet.lpft_last_write_time).to be_a RubySMB::Dcerpc::Ndr::NdrLpFileTime
72
+ end
73
+ end
74
+
75
+ describe '#initialize_instance' do
76
+ it 'sets #opnum to REG_ENUM_KEY constant' do
77
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_ENUM_KEY)
78
+ end
79
+ end
80
+
81
+ describe '#pad_length1' do
82
+ it 'returns 0 when #lp_class is already 4-byte aligned' do
83
+ packet.lp_name = 'align'
84
+ expect(packet.pad_length1).to eq 0
85
+ end
86
+
87
+ it 'returns 2 when #lp_class is only 2-byte aligned' do
88
+ packet.lp_name = 'align' + 'A'
89
+ expect(packet.pad_length1).to eq 2
90
+ end
91
+ end
92
+
93
+ describe '#pad_length2' do
94
+ it 'returns 0 when #lpft_last_write_time is already 4-byte aligned' do
95
+ packet.lp_class = 'align'
96
+ expect(packet.pad_length2).to eq 0
97
+ end
98
+
99
+ it 'returns 2 when #lpft_last_write_time is only 2-byte aligned' do
100
+ packet.lp_class = 'align' + 'A'
101
+ expect(packet.pad_length2).to eq 2
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,97 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::EnumKeyResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :lp_name }
5
+ it { is_expected.to respond_to :pad1 }
6
+ it { is_expected.to respond_to :lp_class }
7
+ it { is_expected.to respond_to :pad2 }
8
+ it { is_expected.to respond_to :lpft_last_write_time }
9
+ it { is_expected.to respond_to :error_status }
10
+ it { is_expected.to respond_to :opnum }
11
+
12
+ it 'is little endian' do
13
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
14
+ end
15
+
16
+
17
+ describe '#lp_name' do
18
+ it 'is a RrpUnicodeString structure' do
19
+ expect(packet.lp_name).to be_a RubySMB::Dcerpc::RrpUnicodeString
20
+ end
21
+ end
22
+
23
+ describe '#pad1' do
24
+ it 'is a string' do
25
+ expect(packet.pad1).to be_a BinData::String
26
+ end
27
+
28
+ it 'should keep #lp_class 4-byte aligned' do
29
+ packet.lp_name = "test"
30
+ expect(packet.lp_class.abs_offset % 4).to eq 0
31
+ end
32
+ end
33
+
34
+ describe '#lp_class' do
35
+ it 'is a PrrpUnicodeString structure' do
36
+ expect(packet.lp_class).to be_a RubySMB::Dcerpc::PrrpUnicodeString
37
+ end
38
+
39
+ it 'has a initial value of 0' do
40
+ expect(packet.lp_class).to eq(0)
41
+ end
42
+ end
43
+
44
+ describe '#pad2' do
45
+ it 'is a string' do
46
+ expect(packet.pad2).to be_a BinData::String
47
+ end
48
+
49
+ it 'should keep #lpft_last_write_time 4-byte aligned' do
50
+ packet.lp_class = "test"
51
+ expect(packet.lpft_last_write_time.abs_offset % 4).to eq 0
52
+ end
53
+ end
54
+
55
+ describe '#lpft_last_write_time' do
56
+ it 'is a NdrLpFileTime structure' do
57
+ expect(packet.lpft_last_write_time).to be_a RubySMB::Dcerpc::Ndr::NdrLpFileTime
58
+ end
59
+ end
60
+
61
+ describe '#error_status' do
62
+ it 'is a 32-bit unsigned integer' do
63
+ expect(packet.error_status).to be_a BinData::Uint32le
64
+ end
65
+ end
66
+
67
+ describe '#initialize_instance' do
68
+ it 'sets #opnum to REG_ENUM_KEY constant' do
69
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_ENUM_KEY)
70
+ end
71
+ end
72
+
73
+ describe '#pad_length1' do
74
+ it 'returns 0 when #lp_class is already 4-byte aligned' do
75
+ packet.lp_name = 'align'
76
+ expect(packet.pad_length1).to eq 0
77
+ end
78
+
79
+ it 'returns 2 when #lp_class is only 2-byte aligned' do
80
+ packet.lp_name = 'align' + 'A'
81
+ expect(packet.pad_length1).to eq 2
82
+ end
83
+ end
84
+
85
+ describe '#pad_length2' do
86
+ it 'returns 0 when #lpft_last_write_time is already 4-byte aligned' do
87
+ packet.lp_class = 'align'
88
+ expect(packet.pad_length2).to eq 0
89
+ end
90
+
91
+ it 'returns 2 when #lpft_last_write_time is only 2-byte aligned' do
92
+ packet.lp_class = 'align' + 'A'
93
+ expect(packet.pad_length2).to eq 2
94
+ end
95
+ end
96
+ end
97
+
@@ -0,0 +1,94 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::RpcHkey do
2
+ it 'is NdrContextHandle subclass' do
3
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrContextHandle
4
+ end
5
+ end
6
+
7
+ RSpec.describe RubySMB::Dcerpc::Winreg::EnumValueRequest do
8
+ subject(:packet) { described_class.new }
9
+
10
+ it { is_expected.to respond_to :hkey }
11
+ it { is_expected.to respond_to :dw_index }
12
+ it { is_expected.to respond_to :lp_value_name }
13
+ it { is_expected.to respond_to :pad }
14
+ it { is_expected.to respond_to :lp_type }
15
+ it { is_expected.to respond_to :lp_data }
16
+ it { is_expected.to respond_to :lpcb_data }
17
+ it { is_expected.to respond_to :lpcb_len }
18
+ it { is_expected.to respond_to :opnum }
19
+
20
+ it 'is little endian' do
21
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
22
+ end
23
+
24
+ describe '#hkey' do
25
+ it 'is a RpcHkey structure' do
26
+ expect(packet.hkey).to be_a RubySMB::Dcerpc::Winreg::RpcHkey
27
+ end
28
+ end
29
+
30
+ describe '#dw_index' do
31
+ it 'is a 32-bit unsigned integer' do
32
+ expect(packet.dw_index).to be_a BinData::Uint32le
33
+ end
34
+ end
35
+
36
+ describe '#lp_value_name' do
37
+ it 'is a RrpUnicodeString structure' do
38
+ expect(packet.lp_value_name).to be_a RubySMB::Dcerpc::RrpUnicodeString
39
+ end
40
+ end
41
+
42
+ describe '#pad' do
43
+ it 'is a string' do
44
+ expect(packet.pad).to be_a BinData::String
45
+ end
46
+
47
+ it 'should keep #lp_type 4-byte aligned' do
48
+ packet.lp_value_name = "test"
49
+ expect(packet.lp_type.abs_offset % 4).to eq 0
50
+ end
51
+ end
52
+
53
+ describe '#lp_type' do
54
+ it 'is a NdrLpDword structure' do
55
+ expect(packet.lp_type).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
56
+ end
57
+ end
58
+
59
+ describe '#lp_data' do
60
+ it 'is a NdrLpByteArray structure' do
61
+ expect(packet.lp_data).to be_a RubySMB::Dcerpc::Ndr::NdrLpByteArray
62
+ end
63
+ end
64
+
65
+ describe '#lpcb_data' do
66
+ it 'is a NdrLpDword structure' do
67
+ expect(packet.lpcb_data).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
68
+ end
69
+ end
70
+
71
+ describe '#lpcb_len' do
72
+ it 'is a NdrLpDword structure' do
73
+ expect(packet.lpcb_len).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
74
+ end
75
+ end
76
+
77
+ describe '#initialize_instance' do
78
+ it 'sets #opnum to REG_ENUM_VALUE constant' do
79
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_ENUM_VALUE)
80
+ end
81
+ end
82
+
83
+ describe '#pad_length' do
84
+ it 'returns 0 when #lp_class is already 4-byte aligned' do
85
+ packet.lp_value_name = 'align'
86
+ expect(packet.pad_length).to eq 0
87
+ end
88
+
89
+ it 'returns 2 when #lp_class is only 2-byte aligned' do
90
+ packet.lp_value_name = 'align' + 'A'
91
+ expect(packet.pad_length).to eq 2
92
+ end
93
+ end
94
+ end