ruby_smb 0.0.18 → 0.0.19

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 (298) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +247 -7
  5. data/examples/anonymous_auth.rb +6 -3
  6. data/examples/append_file.rb +40 -0
  7. data/examples/authenticate.rb +12 -7
  8. data/examples/delete_file.rb +40 -0
  9. data/examples/list_directory.rb +45 -0
  10. data/examples/negotiate.rb +0 -1
  11. data/examples/negotiate_with_netbios_service.rb +36 -0
  12. data/examples/net_share_enum_all.rb +30 -0
  13. data/examples/read_file.rb +39 -0
  14. data/examples/rename_file.rb +41 -0
  15. data/examples/tree_connect.rb +2 -4
  16. data/examples/write_file.rb +40 -0
  17. data/lib/ruby_smb.rb +5 -0
  18. data/lib/ruby_smb/client.rb +196 -43
  19. data/lib/ruby_smb/client/authentication.rb +89 -48
  20. data/lib/ruby_smb/client/echo.rb +1 -4
  21. data/lib/ruby_smb/client/negotiation.rb +46 -45
  22. data/lib/ruby_smb/client/signing.rb +9 -16
  23. data/lib/ruby_smb/client/tree_connect.rb +8 -13
  24. data/lib/ruby_smb/client/utils.rb +79 -0
  25. data/lib/ruby_smb/dcerpc.rb +30 -0
  26. data/lib/ruby_smb/dcerpc/bind.rb +60 -0
  27. data/lib/ruby_smb/dcerpc/handle.rb +60 -0
  28. data/lib/ruby_smb/dcerpc/ndr.rb +41 -0
  29. data/lib/ruby_smb/dcerpc/request.rb +43 -0
  30. data/lib/ruby_smb/dcerpc/response.rb +46 -0
  31. data/lib/ruby_smb/dcerpc/srvsvc.rb +17 -0
  32. data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +93 -0
  33. data/lib/ruby_smb/dcerpc/uuid.rb +28 -0
  34. data/lib/ruby_smb/dispatcher.rb +7 -3
  35. data/lib/ruby_smb/dispatcher/base.rb +23 -14
  36. data/lib/ruby_smb/dispatcher/socket.rb +71 -51
  37. data/lib/ruby_smb/dispositions.rb +32 -0
  38. data/lib/ruby_smb/error.rb +24 -18
  39. data/lib/ruby_smb/field.rb +5 -2
  40. data/lib/ruby_smb/field/extended_attribute_flag.rb +1 -1
  41. data/lib/ruby_smb/field/file_time.rb +3 -1
  42. data/lib/ruby_smb/field/security_descriptor.rb +6 -6
  43. data/lib/ruby_smb/field/smb2_fileid.rb +11 -0
  44. data/lib/ruby_smb/field/smb_fea.rb +3 -3
  45. data/lib/ruby_smb/field/smb_fea_list.rb +3 -3
  46. data/lib/ruby_smb/field/smb_gea.rb +12 -0
  47. data/lib/ruby_smb/field/smb_gea_list.rb +13 -0
  48. data/lib/ruby_smb/field/string16.rb +14 -0
  49. data/lib/ruby_smb/field/stringz16.rb +3 -7
  50. data/lib/ruby_smb/field/utime.rb +11 -10
  51. data/lib/ruby_smb/fscc.rb +12 -0
  52. data/lib/ruby_smb/fscc/control_codes.rb +26 -0
  53. data/lib/ruby_smb/{field → fscc}/ea_info_array.rb +12 -14
  54. data/lib/ruby_smb/fscc/file_attributes.rb +29 -0
  55. data/lib/ruby_smb/{field → fscc}/file_full_ea_info.rb +5 -5
  56. data/lib/ruby_smb/fscc/file_information.rb +60 -0
  57. data/lib/ruby_smb/fscc/file_information/file_both_directory_information.rb +29 -0
  58. data/lib/ruby_smb/fscc/file_information/file_directory_information.rb +25 -0
  59. data/lib/ruby_smb/fscc/file_information/file_disposition_information.rb +15 -0
  60. data/lib/ruby_smb/fscc/file_information/file_full_directory_information.rb +26 -0
  61. data/lib/ruby_smb/fscc/file_information/file_id_both_directory_information.rb +31 -0
  62. data/lib/ruby_smb/fscc/file_information/file_id_full_directory_information.rb +28 -0
  63. data/lib/ruby_smb/fscc/file_information/file_names_information.rb +18 -0
  64. data/lib/ruby_smb/fscc/file_information/file_rename_information.rb +44 -0
  65. data/lib/ruby_smb/generic_packet.rb +40 -18
  66. data/lib/ruby_smb/gss.rb +49 -56
  67. data/lib/ruby_smb/impersonation_levels.rb +7 -2
  68. data/lib/ruby_smb/nbss.rb +16 -0
  69. data/lib/ruby_smb/nbss/negative_session_response.rb +30 -0
  70. data/lib/ruby_smb/nbss/session_header.rb +13 -0
  71. data/lib/ruby_smb/nbss/session_request.rb +13 -0
  72. data/lib/ruby_smb/smb1.rb +20 -17
  73. data/lib/ruby_smb/smb1/bit_field.rb +3 -0
  74. data/lib/ruby_smb/smb1/bit_field/create_options.rb +5 -5
  75. data/lib/ruby_smb/smb1/bit_field/file_status_flags.rb +18 -0
  76. data/lib/ruby_smb/smb1/bit_field/open2_access_mode.rb +11 -11
  77. data/lib/ruby_smb/smb1/bit_field/open2_open_mode.rb +1 -1
  78. data/lib/ruby_smb/smb1/bit_field/optional_support.rb +0 -1
  79. data/lib/ruby_smb/smb1/bit_field/security_flags.rb +15 -0
  80. data/lib/ruby_smb/smb1/bit_field/share_access.rb +2 -3
  81. data/lib/ruby_smb/smb1/bit_field/smb_ext_file_attributes.rb +21 -24
  82. data/lib/ruby_smb/smb1/bit_field/smb_file_attributes.rb +1 -1
  83. data/lib/ruby_smb/smb1/commands.rb +5 -0
  84. data/lib/ruby_smb/smb1/create_actions.rb +3 -5
  85. data/lib/ruby_smb/smb1/file.rb +289 -0
  86. data/lib/ruby_smb/smb1/oplock_levels.rb +2 -4
  87. data/lib/ruby_smb/smb1/packet.rb +10 -0
  88. data/lib/ruby_smb/smb1/packet/close_request.rb +31 -0
  89. data/lib/ruby_smb/smb1/packet/close_response.rb +28 -0
  90. data/lib/ruby_smb/smb1/packet/echo_request.rb +5 -7
  91. data/lib/ruby_smb/smb1/packet/echo_response.rb +5 -7
  92. data/lib/ruby_smb/smb1/packet/empty_packet.rb +1 -2
  93. data/lib/ruby_smb/smb1/packet/logoff_request.rb +1 -4
  94. data/lib/ruby_smb/smb1/packet/logoff_response.rb +1 -4
  95. data/lib/ruby_smb/smb1/packet/negotiate_response.rb +22 -0
  96. data/lib/ruby_smb/smb1/packet/negotiate_response_extended.rb +22 -0
  97. data/lib/ruby_smb/smb1/packet/nt_create_andx_request.rb +62 -0
  98. data/lib/ruby_smb/smb1/packet/nt_create_andx_response.rb +66 -0
  99. data/lib/ruby_smb/smb1/packet/nt_trans.rb +1 -2
  100. data/lib/ruby_smb/smb1/packet/nt_trans/create_request.rb +19 -13
  101. data/lib/ruby_smb/smb1/packet/nt_trans/create_response.rb +8 -10
  102. data/lib/ruby_smb/smb1/packet/nt_trans/request.rb +11 -11
  103. data/lib/ruby_smb/smb1/packet/nt_trans/response.rb +10 -10
  104. data/lib/ruby_smb/smb1/packet/nt_trans/subcommands.rb +8 -1
  105. data/lib/ruby_smb/smb1/packet/read_andx_request.rb +84 -0
  106. data/lib/ruby_smb/smb1/packet/read_andx_response.rb +47 -0
  107. data/lib/ruby_smb/smb1/packet/session_setup_legacy_request.rb +2 -6
  108. data/lib/ruby_smb/smb1/packet/session_setup_legacy_response.rb +1 -4
  109. data/lib/ruby_smb/smb1/packet/session_setup_request.rb +1 -6
  110. data/lib/ruby_smb/smb1/packet/session_setup_response.rb +2 -4
  111. data/lib/ruby_smb/smb1/packet/trans2.rb +8 -2
  112. data/lib/ruby_smb/smb1/packet/trans2/data_block.rb +6 -7
  113. data/lib/ruby_smb/smb1/packet/trans2/find_first2_request.rb +77 -0
  114. data/lib/ruby_smb/smb1/packet/trans2/find_first2_response.rb +87 -0
  115. data/lib/ruby_smb/smb1/packet/trans2/find_information_level.rb +32 -0
  116. data/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_full_directory_info.rb +45 -0
  117. data/lib/ruby_smb/smb1/packet/trans2/find_next2_request.rb +77 -0
  118. data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +86 -0
  119. data/lib/ruby_smb/smb1/packet/trans2/open2_request.rb +10 -10
  120. data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +10 -12
  121. data/lib/ruby_smb/smb1/packet/trans2/request.rb +15 -17
  122. data/lib/ruby_smb/smb1/packet/trans2/request_secondary.rb +8 -10
  123. data/lib/ruby_smb/smb1/packet/trans2/response.rb +11 -13
  124. data/lib/ruby_smb/smb1/packet/trans2/set_file_information_request.rb +66 -0
  125. data/lib/ruby_smb/smb1/packet/trans2/set_file_information_response.rb +57 -0
  126. data/lib/ruby_smb/smb1/packet/trans2/subcommands.rb +5 -2
  127. data/lib/ruby_smb/smb1/packet/tree_connect_request.rb +4 -6
  128. data/lib/ruby_smb/smb1/packet/tree_connect_response.rb +5 -7
  129. data/lib/ruby_smb/smb1/packet/tree_disconnect_request.rb +2 -4
  130. data/lib/ruby_smb/smb1/packet/tree_disconnect_response.rb +2 -4
  131. data/lib/ruby_smb/smb1/packet/write_andx_request.rb +68 -0
  132. data/lib/ruby_smb/smb1/packet/write_andx_response.rb +35 -0
  133. data/lib/ruby_smb/smb1/resource_type.rb +18 -0
  134. data/lib/ruby_smb/smb1/tree.rb +188 -5
  135. data/lib/ruby_smb/smb2.rb +16 -11
  136. data/lib/ruby_smb/smb2/bit_field.rb +1 -0
  137. data/lib/ruby_smb/smb2/bit_field/file_access_mask.rb +1 -1
  138. data/lib/ruby_smb/smb2/bit_field/session_flags.rb +1 -2
  139. data/lib/ruby_smb/smb2/bit_field/share_flags.rb +4 -6
  140. data/lib/ruby_smb/smb2/create_context.rb +29 -0
  141. data/lib/ruby_smb/smb2/file.rb +251 -0
  142. data/lib/ruby_smb/smb2/info_type.rb +21 -0
  143. data/lib/ruby_smb/smb2/packet.rb +16 -0
  144. data/lib/ruby_smb/smb2/packet/close_request.rb +22 -0
  145. data/lib/ruby_smb/smb2/packet/close_response.rb +29 -0
  146. data/lib/ruby_smb/smb2/packet/create_request.rb +54 -0
  147. data/lib/ruby_smb/smb2/packet/create_response.rb +35 -0
  148. data/lib/ruby_smb/smb2/packet/echo_request.rb +1 -3
  149. data/lib/ruby_smb/smb2/packet/echo_response.rb +1 -3
  150. data/lib/ruby_smb/smb2/packet/error_packet.rb +1 -3
  151. data/lib/ruby_smb/smb2/packet/ioctl_request.rb +54 -0
  152. data/lib/ruby_smb/smb2/packet/ioctl_response.rb +39 -0
  153. data/lib/ruby_smb/smb2/packet/logoff_request.rb +1 -4
  154. data/lib/ruby_smb/smb2/packet/logoff_response.rb +1 -4
  155. data/lib/ruby_smb/smb2/packet/negotiate_request.rb +1 -1
  156. data/lib/ruby_smb/smb2/packet/negotiate_response.rb +1 -1
  157. data/lib/ruby_smb/smb2/packet/query_directory_request.rb +35 -0
  158. data/lib/ruby_smb/smb2/packet/query_directory_response.rb +45 -0
  159. data/lib/ruby_smb/smb2/packet/read_request.rb +30 -0
  160. data/lib/ruby_smb/smb2/packet/read_response.rb +26 -0
  161. data/lib/ruby_smb/smb2/packet/session_setup_request.rb +2 -5
  162. data/lib/ruby_smb/smb2/packet/session_setup_response.rb +4 -7
  163. data/lib/ruby_smb/smb2/packet/set_info_request.rb +58 -0
  164. data/lib/ruby_smb/smb2/packet/set_info_response.rb +20 -0
  165. data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +3 -4
  166. data/lib/ruby_smb/smb2/packet/tree_connect_response.rb +5 -9
  167. data/lib/ruby_smb/smb2/packet/tree_disconnect_request.rb +1 -4
  168. data/lib/ruby_smb/smb2/packet/tree_disconnect_response.rb +1 -4
  169. data/lib/ruby_smb/smb2/packet/write_request.rb +29 -0
  170. data/lib/ruby_smb/smb2/packet/write_response.rb +26 -0
  171. data/lib/ruby_smb/smb2/tree.rb +163 -7
  172. data/lib/ruby_smb/version.rb +1 -1
  173. data/spec/lib/ruby_smb/client_spec.rb +459 -120
  174. data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +14 -0
  175. data/spec/lib/ruby_smb/dcerpc/handle_spec.rb +31 -0
  176. data/spec/lib/ruby_smb/dcerpc/request_spec.rb +21 -0
  177. data/spec/lib/ruby_smb/dcerpc/response_spec.rb +15 -0
  178. data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +13 -0
  179. data/spec/lib/ruby_smb/dcerpc/uuid_spec.rb +12 -0
  180. data/spec/lib/ruby_smb/dispatcher/base_spec.rb +26 -0
  181. data/spec/lib/ruby_smb/dispatcher/socket_spec.rb +118 -18
  182. data/spec/lib/ruby_smb/field/extended_attribute_flag_spec.rb +0 -3
  183. data/spec/lib/ruby_smb/field/file_time_spec.rb +4 -2
  184. data/spec/lib/ruby_smb/field/security_descriptor.rb +0 -1
  185. data/spec/lib/ruby_smb/field/smb2_fileid_spec.rb +10 -0
  186. data/spec/lib/ruby_smb/field/smb_fea_list_spec.rb +3 -5
  187. data/spec/lib/ruby_smb/field/smb_gea_list_spec.rb +37 -0
  188. data/spec/lib/ruby_smb/field/smb_gea_spec.rb +22 -0
  189. data/spec/lib/ruby_smb/field/stringz16_spec.rb +7 -9
  190. data/spec/lib/ruby_smb/field/utime_spec.rb +4 -2
  191. data/spec/lib/ruby_smb/{field → fscc}/ea_info_array_spec.rb +7 -9
  192. data/spec/lib/ruby_smb/{field → fscc}/file_full_ea_info_spec.rb +2 -3
  193. data/spec/lib/ruby_smb/fscc/file_information/file_both_directory_information_spec.rb +71 -0
  194. data/spec/lib/ruby_smb/fscc/file_information/file_directory_information_spec.rb +68 -0
  195. data/spec/lib/ruby_smb/fscc/file_information/file_disposition_information_spec.rb +26 -0
  196. data/spec/lib/ruby_smb/fscc/file_information/file_full_directory_information_spec.rb +69 -0
  197. data/spec/lib/ruby_smb/fscc/file_information/file_id_both_directory_information_spec.rb +72 -0
  198. data/spec/lib/ruby_smb/fscc/file_information/file_id_full_directory_information_spec.rb +70 -0
  199. data/spec/lib/ruby_smb/fscc/file_information/file_names_information_spec.rb +41 -0
  200. data/spec/lib/ruby_smb/fscc/file_information/file_rename_information_spec.rb +133 -0
  201. data/spec/lib/ruby_smb/fscc/fscc_file_attributes_spec.rb +143 -0
  202. data/spec/lib/ruby_smb/generic_packet_spec.rb +46 -21
  203. data/spec/lib/ruby_smb/nbss/negative_session_response_spec.rb +29 -0
  204. data/spec/lib/ruby_smb/nbss/session_header_spec.rb +30 -0
  205. data/spec/lib/ruby_smb/nbss/session_request_spec.rb +30 -0
  206. data/spec/lib/ruby_smb/smb1/bit_field/create_options_spec.rb +9 -1
  207. data/spec/lib/ruby_smb/smb1/bit_field/directory_access_mask_spec.rb +0 -2
  208. data/spec/lib/ruby_smb/smb1/bit_field/file_access_mask_spec.rb +0 -2
  209. data/spec/lib/ruby_smb/smb1/bit_field/file_status_flags_spec.rb +35 -0
  210. data/spec/lib/ruby_smb/smb1/bit_field/open2_access_mode_spec.rb +1 -3
  211. data/spec/lib/ruby_smb/smb1/bit_field/open2_flags_spec.rb +0 -2
  212. data/spec/lib/ruby_smb/smb1/bit_field/open2_open_mode_spec.rb +0 -1
  213. data/spec/lib/ruby_smb/smb1/bit_field/optional_support_spec.rb +0 -1
  214. data/spec/lib/ruby_smb/smb1/bit_field/security_flags_spec.rb +26 -0
  215. data/spec/lib/ruby_smb/smb1/bit_field/share_access_spec.rb +0 -3
  216. data/spec/lib/ruby_smb/smb1/bit_field/smb_ext_file_attributes_spec.rb +20 -39
  217. data/spec/lib/ruby_smb/smb1/bit_field/smb_file_attributes_spec.rb +0 -6
  218. data/spec/lib/ruby_smb/smb1/bit_field/smb_nmpipe_status_spec.rb +0 -2
  219. data/spec/lib/ruby_smb/smb1/bit_field/trans2_flags_spec.rb +0 -2
  220. data/spec/lib/ruby_smb/smb1/bit_field/tree_connect_flags_spec.rb +0 -2
  221. data/spec/lib/ruby_smb/smb1/file_spec.rb +469 -0
  222. data/spec/lib/ruby_smb/smb1/packet/close_request_spec.rb +54 -0
  223. data/spec/lib/ruby_smb/smb1/packet/close_response_spec.rb +45 -0
  224. data/spec/lib/ruby_smb/smb1/packet/echo_request_spec.rb +1 -4
  225. data/spec/lib/ruby_smb/smb1/packet/echo_response_spec.rb +1 -4
  226. data/spec/lib/ruby_smb/smb1/packet/error_packet_spec.rb +1 -3
  227. data/spec/lib/ruby_smb/smb1/packet/logoff_request_spec.rb +1 -4
  228. data/spec/lib/ruby_smb/smb1/packet/logoff_response_spec.rb +1 -4
  229. data/spec/lib/ruby_smb/smb1/packet/negotiate_request_spec.rb +1 -1
  230. data/spec/lib/ruby_smb/smb1/packet/negotiate_response_extended_spec.rb +37 -0
  231. data/spec/lib/ruby_smb/smb1/packet/negotiate_response_spec.rb +37 -0
  232. data/spec/lib/ruby_smb/smb1/packet/nt_create_andx_request_spec.rb +151 -0
  233. data/spec/lib/ruby_smb/smb1/packet/nt_create_andx_response_spec.rb +157 -0
  234. data/spec/lib/ruby_smb/smb1/packet/nt_trans/create_request_spec.rb +13 -6
  235. data/spec/lib/ruby_smb/smb1/packet/nt_trans/create_response_spec.rb +1 -7
  236. data/spec/lib/ruby_smb/smb1/packet/nt_trans/request_spec.rb +1 -6
  237. data/spec/lib/ruby_smb/smb1/packet/nt_trans/response_spec.rb +1 -5
  238. data/spec/lib/ruby_smb/smb1/packet/read_andx_request_spec.rb +149 -0
  239. data/spec/lib/ruby_smb/smb1/packet/read_andx_response_spec.rb +93 -0
  240. data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_request_spec.rb +1 -5
  241. data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_response_spec.rb +1 -5
  242. data/spec/lib/ruby_smb/smb1/packet/session_setup_request_spec.rb +3 -8
  243. data/spec/lib/ruby_smb/smb1/packet/session_setup_response_spec.rb +2 -4
  244. data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_request_spec.rb +180 -0
  245. data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb +104 -0
  246. data/spec/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_full_directory_info_spec.rb +128 -0
  247. data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_request_spec.rb +174 -0
  248. data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_response_spec.rb +102 -0
  249. data/spec/lib/ruby_smb/smb1/packet/trans2/open2_request_spec.rb +1 -6
  250. data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +2 -7
  251. data/spec/lib/ruby_smb/smb1/packet/trans2/request_secondary_spec.rb +1 -5
  252. data/spec/lib/ruby_smb/smb1/packet/trans2/request_spec.rb +1 -5
  253. data/spec/lib/ruby_smb/smb1/packet/trans2/response_spec.rb +1 -4
  254. data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_request_spec.rb +98 -0
  255. data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_response_spec.rb +56 -0
  256. data/spec/lib/ruby_smb/smb1/packet/tree_connect_request_spec.rb +1 -5
  257. data/spec/lib/ruby_smb/smb1/packet/tree_connect_response_spec.rb +1 -6
  258. data/spec/lib/ruby_smb/smb1/packet/tree_disconnect_request_spec.rb +1 -4
  259. data/spec/lib/ruby_smb/smb1/packet/tree_disconnect_response_spec.rb +1 -4
  260. data/spec/lib/ruby_smb/smb1/packet/write_andx_request_spec.rb +148 -0
  261. data/spec/lib/ruby_smb/smb1/packet/write_andx_response_spec.rb +54 -0
  262. data/spec/lib/ruby_smb/smb1/tree_spec.rb +409 -7
  263. data/spec/lib/ruby_smb/smb2/bit_field/directory_access_mask_spec.rb +0 -2
  264. data/spec/lib/ruby_smb/smb2/bit_field/file_access_mask_spec.rb +0 -2
  265. data/spec/lib/ruby_smb/smb2/bit_field/session_flags_spec.rb +1 -1
  266. data/spec/lib/ruby_smb/smb2/bit_field/share_capabilities_spec.rb +0 -1
  267. data/spec/lib/ruby_smb/smb2/bit_field/share_flags_spec.rb +0 -2
  268. data/spec/lib/ruby_smb/smb2/create_context_spec.rb +42 -0
  269. data/spec/lib/ruby_smb/smb2/file_spec.rb +233 -0
  270. data/spec/lib/ruby_smb/smb2/packet/close_request_spec.rb +40 -0
  271. data/spec/lib/ruby_smb/smb2/packet/close_response_spec.rb +40 -0
  272. data/spec/lib/ruby_smb/smb2/packet/create_request_spec.rb +101 -0
  273. data/spec/lib/ruby_smb/smb2/packet/create_response_spec.rb +64 -0
  274. data/spec/lib/ruby_smb/smb2/packet/echo_request_spec.rb +1 -3
  275. data/spec/lib/ruby_smb/smb2/packet/echo_response_spec.rb +1 -3
  276. data/spec/lib/ruby_smb/smb2/packet/ioctl_request_spec.rb +48 -0
  277. data/spec/lib/ruby_smb/smb2/packet/logoff_request_spec.rb +1 -3
  278. data/spec/lib/ruby_smb/smb2/packet/logoff_response_spec.rb +1 -3
  279. data/spec/lib/ruby_smb/smb2/packet/query_directory_request_spec.rb +80 -0
  280. data/spec/lib/ruby_smb/smb2/packet/query_directory_response_spec.rb +64 -0
  281. data/spec/lib/ruby_smb/smb2/packet/read_request_spec.rb +43 -0
  282. data/spec/lib/ruby_smb/smb2/packet/read_response_spec.rb +50 -0
  283. data/spec/lib/ruby_smb/smb2/packet/session_setup_request_spec.rb +3 -4
  284. data/spec/lib/ruby_smb/smb2/packet/session_setup_response_spec.rb +2 -3
  285. data/spec/lib/ruby_smb/smb2/packet/set_info_request_spec.rb +205 -0
  286. data/spec/lib/ruby_smb/smb2/packet/set_info_response_spec.rb +32 -0
  287. data/spec/lib/ruby_smb/smb2/packet/tree_connect_request_spec.rb +3 -5
  288. data/spec/lib/ruby_smb/smb2/packet/tree_connect_response_spec.rb +1 -2
  289. data/spec/lib/ruby_smb/smb2/packet/tree_disconnect_request_spec.rb +1 -3
  290. data/spec/lib/ruby_smb/smb2/packet/tree_disconnect_response_spec.rb +1 -3
  291. data/spec/lib/ruby_smb/smb2/packet/write_request_spec.rb +51 -0
  292. data/spec/lib/ruby_smb/smb2/packet/write_response_spec.rb +38 -0
  293. data/spec/lib/ruby_smb/smb2/tree_spec.rb +191 -5
  294. data/spec/spec_helper.rb +1 -1
  295. metadata +195 -12
  296. metadata.gz.sig +0 -0
  297. data/lib/ruby_smb/smb1/dispositions.rb +0 -36
  298. data/spec/lib/ruby_smb/dispatcher/dispatcher_base_spec.rb +0 -22
@@ -2,15 +2,14 @@ module RubySMB
2
2
  class Client
3
3
  # This module holds all the backend client methods for authentication.
4
4
  module Authentication
5
-
6
5
  # Responsible for handling Authentication and Session Setup for
7
6
  # the SMB Client. It returns the final Status code from the authentication
8
7
  # exchange.
9
8
  #
10
9
  # @return [WindowsError::NTStatus] the NTStatus object from the SessionSetup exchange.
11
10
  def authenticate
12
- if self.smb1
13
- if self.username.empty? && self.password.empty?
11
+ if smb1
12
+ if username.empty? && password.empty?
14
13
  smb1_anonymous_auth
15
14
  else
16
15
  smb1_authenticate
@@ -33,9 +32,11 @@ module RubySMB
33
32
  response = smb1_anonymous_auth_response(raw_response)
34
33
  response_code = response.status_code
35
34
 
36
- if response_code.name == "STATUS_SUCCESS"
37
- self.user_id = response.smb_header.uid
38
- self.peer_native_os = response.data_block.native_os
35
+ if response_code == WindowsError::NTStatus::STATUS_SUCCESS
36
+ self.user_id = response.smb_header.uid
37
+ self.peer_native_os = response.data_block.native_os.to_s
38
+ self.peer_native_lm = response.data_block.native_lan_man.to_s
39
+ self.primary_domain = response.data_block.primary_domain.to_s
39
40
  end
40
41
 
41
42
  response_code
@@ -46,7 +47,7 @@ module RubySMB
46
47
  def smb1_anonymous_auth_request
47
48
  packet = RubySMB::SMB1::Packet::SessionSetupLegacyRequest.new
48
49
  packet.data_block.oem_password = "\x00"
49
- packet.parameter_block.max_buffer_size = 4356
50
+ packet.parameter_block.max_buffer_size = self.max_buffer_size
50
51
  packet.parameter_block.max_mpx_count = 50
51
52
  packet.parameter_block.capabilities.extended_security = 0
52
53
  packet
@@ -65,20 +66,30 @@ module RubySMB
65
66
  packet
66
67
  end
67
68
 
68
- # Handles the SMB1 NTLMSSP 4-way handshake for Authentication
69
+ # Handles the SMB1 NTLMSSP 4-way handshake for Authentication and store
70
+ # information about the peer/server.
69
71
  def smb1_authenticate
70
72
  response = smb1_ntlmssp_negotiate
71
73
  challenge_packet = smb1_ntlmssp_challenge_packet(response)
74
+
75
+ # Store the available OS information before going forward.
76
+ @peer_native_os = challenge_packet.data_block.native_os.to_s
77
+ @peer_native_lm = challenge_packet.data_block.native_lan_man.to_s
78
+
72
79
  user_id = challenge_packet.smb_header.uid
73
- challenge_message = smb1_type2_message(challenge_packet)
74
- raw = smb1_ntlmssp_authenticate(challenge_message, user_id)
80
+ type2_b64_message = smb1_type2_message(challenge_packet)
81
+ type3_message = @ntlm_client.init_context(type2_b64_message)
82
+
83
+ @session_key = @ntlm_client.session_key
84
+ challenge_message = @ntlm_client.session.challenge_message
85
+ store_target_info(challenge_message.target_info) if challenge_message.has_flag?(:TARGET_INFO)
86
+ @os_version = extract_os_version(challenge_message.os_version.to_s)
87
+
88
+ raw = smb1_ntlmssp_authenticate(type3_message, user_id)
75
89
  response = smb1_ntlmssp_final_packet(raw)
76
90
  response_code = response.status_code
77
91
 
78
- if response_code.name == "STATUS_SUCCESS"
79
- self.user_id = user_id
80
- self.peer_native_os = response.data_block.native_os
81
- end
92
+ @user_id = user_id if response_code == WindowsError::NTStatus::STATUS_SUCCESS
82
93
 
83
94
  response_code
84
95
  end
@@ -92,31 +103,28 @@ module RubySMB
92
103
  send_recv(packet)
93
104
  end
94
105
 
95
- # Takes the Base64 encoded NTLM Type 2 (Challenge) message
96
- # and calls the routines to build the Auth packet, sends the packet
97
- # and receives the raw response
106
+ # Takes the NTLM Type 3 (authenticate) message and calls the routines to
107
+ # build the Auth packet, sends the packet and receives the raw response.
98
108
  #
99
- # @param type2_string [String] the Base64 Encoded NTLM Type 2 message
109
+ # @param type3_message [String] the NTLM Type 3 message
100
110
  # @param user_id [Integer] the temporary user ID from the Type 2 response
101
111
  # @return [String] the raw binary response from the server
102
- def smb1_ntlmssp_authenticate(type2_string,user_id)
103
- packet = smb1_ntlmssp_auth_packet(type2_string,user_id)
112
+ def smb1_ntlmssp_authenticate(type3_message, user_id)
113
+ packet = smb1_ntlmssp_auth_packet(type3_message, user_id)
104
114
  send_recv(packet)
105
115
  end
106
116
 
107
117
  # Generates the {RubySMB::SMB1::Packet::SessionSetupRequest} packet
108
118
  # with the NTLM Type 3 (Auth) message in the security_blob field.
109
119
  #
110
- # @param type2_string [String] the Base64 encoded Type2 challenge to respond to
120
+ # @param type3_message [String] the NTLM Type 3 message
111
121
  # @param user_id [Integer] the temporary user ID from the Type 2 response
112
122
  # @return [RubySMB::SMB1::Packet::SessionSetupRequest] the second authentication packet to send
113
- def smb1_ntlmssp_auth_packet(type2_string,user_id)
114
- type3_message = ntlm_client.init_context(type2_string)
115
- self.session_key = ntlm_client.session_key
123
+ def smb1_ntlmssp_auth_packet(type3_message, user_id)
116
124
  packet = RubySMB::SMB1::Packet::SessionSetupRequest.new
117
125
  packet.smb_header.uid = user_id
118
126
  packet.set_type3_blob(type3_message.serialize)
119
- packet.parameter_block.max_buffer_size = 4356
127
+ packet.parameter_block.max_buffer_size = self.max_buffer_size
120
128
  packet.parameter_block.max_mpx_count = 50
121
129
  packet.smb_header.flags2.extended_security = 1
122
130
  packet
@@ -131,7 +139,7 @@ module RubySMB
131
139
  type1_message = ntlm_client.init_context
132
140
  packet = RubySMB::SMB1::Packet::SessionSetupRequest.new
133
141
  packet.set_type1_blob(type1_message.serialize)
134
- packet.parameter_block.max_buffer_size = 4356
142
+ packet.parameter_block.max_buffer_size = self.max_buffer_size
135
143
  packet.parameter_block.max_mpx_count = 50
136
144
  packet.smb_header.flags2.extended_security = 1
137
145
  packet
@@ -156,7 +164,7 @@ module RubySMB
156
164
  packet = RubySMB::SMB1::Packet::SessionSetupResponse.read(raw_response)
157
165
  status_code = packet.status_code
158
166
 
159
- unless status_code.name == "STATUS_MORE_PROCESSING_REQUIRED"
167
+ unless status_code.name == 'STATUS_MORE_PROCESSING_REQUIRED'
160
168
  raise RubySMB::Error::UnexpectedStatusCode, status_code.to_s
161
169
  end
162
170
 
@@ -172,24 +180,32 @@ module RubySMB
172
180
  # @return [String] the base64 encoded NTLM Challenge (Type2 Message) from the response
173
181
  def smb1_type2_message(response_packet)
174
182
  sec_blob = response_packet.data_block.security_blob
175
- ntlmssp_offset = sec_blob.index("NTLMSSP")
183
+ ntlmssp_offset = sec_blob.index('NTLMSSP')
176
184
  type2_blob = sec_blob.slice(ntlmssp_offset..-1)
177
- [type2_blob].pack("m")
185
+ [type2_blob].pack('m')
178
186
  end
179
187
 
180
188
  #
181
189
  # SMB 2 Methods
182
190
  #
183
191
 
184
- # Handles the SMB1 NTLMSSP 4-way handshake for Authentication
192
+ # Handles the SMB2 NTLMSSP 4-way handshake for Authentication and store
193
+ # information about the peer/server.
185
194
  def smb2_authenticate
186
195
  response = smb2_ntlmssp_negotiate
187
196
  challenge_packet = smb2_ntlmssp_challenge_packet(response)
188
- session_id = challenge_packet.smb2_header.session_id
189
- self.session_id = session_id
190
- challenge_message = smb2_type2_message(challenge_packet)
191
- raw = smb2_ntlmssp_authenticate(challenge_message, session_id)
197
+ @session_id = challenge_packet.smb2_header.session_id
198
+ type2_b64_message = smb2_type2_message(challenge_packet)
199
+ type3_message = @ntlm_client.init_context(type2_b64_message)
200
+
201
+ @session_key = @ntlm_client.session_key
202
+ challenge_message = ntlm_client.session.challenge_message
203
+ store_target_info(challenge_message.target_info) if challenge_message.has_flag?(:TARGET_INFO)
204
+ @os_version = extract_os_version(challenge_message.os_version.to_s)
205
+
206
+ raw = smb2_ntlmssp_authenticate(type3_message, @session_id)
192
207
  response = smb2_ntlmssp_final_packet(raw)
208
+
193
209
  response.status_code
194
210
  end
195
211
 
@@ -206,7 +222,7 @@ module RubySMB
206
222
  def smb2_ntlmssp_challenge_packet(raw_response)
207
223
  packet = RubySMB::SMB2::Packet::SessionSetupResponse.read(raw_response)
208
224
  status_code = packet.status_code
209
- unless status_code.name == "STATUS_MORE_PROCESSING_REQUIRED"
225
+ unless status_code.name == 'STATUS_MORE_PROCESSING_REQUIRED'
210
226
  raise RubySMB::Error::UnexpectedStatusCode, status_code.to_s
211
227
  end
212
228
 
@@ -247,39 +263,64 @@ module RubySMB
247
263
  # @return [String] the base64 encoded NTLM Challenge (Type2 Message) from the response
248
264
  def smb2_type2_message(response_packet)
249
265
  sec_blob = response_packet.buffer
250
- ntlmssp_offset = sec_blob.index("NTLMSSP")
266
+ ntlmssp_offset = sec_blob.index('NTLMSSP')
251
267
  type2_blob = sec_blob.slice(ntlmssp_offset..-1)
252
- [type2_blob].pack("m")
268
+ [type2_blob].pack('m')
253
269
  end
254
270
 
255
- # Takes the Base64 encoded NTLM Type 2 (Challenge) message
256
- # and calls the routines to build the Auth packet, sends the packet
257
- # and receives the raw response
271
+ # Takes the NTLM Type 3 (authenticate) message and calls the routines to
272
+ # build the Auth packet, sends the packet and receives the raw response.
258
273
  #
259
- # @param type2_string [String] the Base64 Encoded NTLM Type 2 message
274
+ # @param type3_message [String] the NTLM Type 3 message
260
275
  # @param user_id [Integer] the temporary user ID from the Type 2 response
261
276
  # @return [String] the raw binary response from the server
262
- def smb2_ntlmssp_authenticate(type2_string,user_id)
263
- packet = smb2_ntlmssp_auth_packet(type2_string,user_id)
277
+ def smb2_ntlmssp_authenticate(type3_message, user_id)
278
+ packet = smb2_ntlmssp_auth_packet(type3_message, user_id)
264
279
  send_recv(packet)
265
280
  end
266
281
 
267
282
  # Generates the {RubySMB::SMB2::Packet::SessionSetupRequest} packet
268
283
  # with the NTLM Type 3 (Auth) message in the security_blob field.
269
284
  #
270
- # @param type2_string [String] the Base64 encoded Type2 challenge to respond to
285
+ # @param type3_message [String] the NTLM Type 3 message
271
286
  # @param session_id [Integer] the temporary session id from the Type 2 response
272
287
  # @return [RubySMB::SMB2::Packet::SessionSetupRequest] the second authentication packet to send
273
- def smb2_ntlmssp_auth_packet(type2_string, session_id)
274
- type3_message = ntlm_client.init_context(type2_string)
275
- self.session_key = ntlm_client.session_key
288
+ def smb2_ntlmssp_auth_packet(type3_message, session_id)
276
289
  packet = RubySMB::SMB2::Packet::SessionSetupRequest.new
277
290
  packet.smb2_header.session_id = session_id
278
291
  packet.set_type3_blob(type3_message.serialize)
279
292
  packet
280
293
  end
281
294
 
295
+ # Extract and store useful information about the peer/server from the
296
+ # NTLM Type 2 (challenge) TargetInfo fields.
297
+ #
298
+ # @param target_info_str [String] the Target Info string
299
+ def store_target_info(target_info_str)
300
+ target_info = Net::NTLM::TargetInfo.new(target_info_str)
301
+ {
302
+ Net::NTLM::TargetInfo::MSV_AV_NB_COMPUTER_NAME => :@default_name,
303
+ Net::NTLM::TargetInfo::MSV_AV_NB_DOMAIN_NAME => :@default_domain,
304
+ Net::NTLM::TargetInfo::MSV_AV_DNS_COMPUTER_NAME => :@dns_host_name,
305
+ Net::NTLM::TargetInfo::MSV_AV_DNS_DOMAIN_NAME => :@dns_domain_name,
306
+ Net::NTLM::TargetInfo::MSV_AV_DNS_TREE_NAME => :@dns_tree_name
307
+ }.each do |constant, attribute|
308
+ if target_info.av_pairs[constant]
309
+ value = target_info.av_pairs[constant].dup
310
+ value.force_encoding('UTF-16LE')
311
+ instance_variable_set(attribute, value.encode('UTF-8'))
312
+ end
313
+ end
314
+ end
282
315
 
316
+ # Extract the peer/server version number from the NTLM Type 2 (challenge)
317
+ # Version field.
318
+ #
319
+ # @param version [String] the version number as a binary string
320
+ # @return [String] the formated version number (<major>.<minor>.<build>)
321
+ def extract_os_version(version)
322
+ version.unpack('CCS').join('.')
323
+ end
283
324
  end
284
325
  end
285
- end
326
+ end
@@ -1,9 +1,7 @@
1
1
  module RubySMB
2
2
  class Client
3
-
4
3
  # Contains the methods for doing ECHO commands
5
4
  module Echo
6
-
7
5
  # Sends an ECHO request packet and returns the
8
6
  # last response packet.
9
7
  #
@@ -21,7 +19,6 @@ module RubySMB
21
19
  RubySMB::SMB1::Packet::EchoResponse.read(raw_response)
22
20
  end
23
21
 
24
-
25
22
  # Sends an ECHO request packet and returns the
26
23
  # response packet.
27
24
  #
@@ -33,4 +30,4 @@ module RubySMB
33
30
  end
34
31
  end
35
32
  end
36
- end
33
+ end
@@ -3,37 +3,38 @@ module RubySMB
3
3
  class Client
4
4
  # This module holds all of the methods backing the {RubySMB::Client#negotiate} method
5
5
  module Negotiation
6
-
7
6
  # Handles the entire SMB Multi-Protocol Negotiation from the
8
7
  # Client to the Server. It sets state on the client appropriate
9
8
  # to the protocol and capabilites negotiated during the exchange.
9
+ # It also keeps track of the negotiated dialect.
10
10
  #
11
11
  # @return [void]
12
12
  def negotiate
13
- begin
14
- raw_response = negotiate_request
15
- response_packet = negotiate_response(raw_response)
16
- parse_negotiate_response(response_packet)
17
- rescue RubySMB::Error::InvalidPacket, Errno::ECONNRESET
18
- error = "Unable to Negotiate with remote host"
19
- if smb1 && !smb2
20
- error << ', SMB1 may be disabled'
21
- end
22
- raise RubySMB::Error::NegotiationFailure, error
23
- end
13
+ request_packet = negotiate_request
14
+ raw_response = send_recv(request_packet)
15
+ response_packet = negotiate_response(raw_response)
16
+ # The list of dialect identifiers sent to the server is stored
17
+ # internally to be able to retrieve the negotiated dialect later on.
18
+ # This is only valid for SMB1.
19
+ response_packet.dialects = request_packet.dialects if response_packet.respond_to? :dialects=
20
+ parse_negotiate_response(response_packet)
21
+ rescue RubySMB::Error::InvalidPacket, Errno::ECONNRESET
22
+ error = 'Unable to Negotiate with remote host'
23
+ error << ', SMB1 may be disabled' if smb1 && !smb2
24
+ raise RubySMB::Error::NegotiationFailure, error
24
25
  end
25
26
 
26
- # Creates and dispatches the first Negotiate Request Packet and
27
- # returns the raw response data.
27
+ # Creates the first Negotiate Request Packet according to the SMB version
28
+ # used.
28
29
  #
29
- # @return [String] the raw binary string containing the response from the server
30
+ # @return [RubySMB::SMB1::Packet::NegotiateRequest] a SMB1 Negotiate Request packet if SMB1 is used
31
+ # @return [RubySMB::SMB1::Packet::NegotiateRequest] a SMB2 Negotiate Request packet if SMB2 is used
30
32
  def negotiate_request
31
33
  if smb1
32
- request = smb1_negotiate_request
34
+ smb1_negotiate_request
33
35
  elsif smb2
34
- request = smb2_negotiate_request
36
+ smb2_negotiate_request
35
37
  end
36
- send_recv(request)
37
38
  end
38
39
 
39
40
  # Takes the raw response data from the server and tries
@@ -48,57 +49,57 @@ module RubySMB
48
49
  if smb1
49
50
  begin
50
51
  packet = RubySMB::SMB1::Packet::NegotiateResponseExtended.read raw_data
51
- rescue Exception => e
52
+ rescue StandardError => e
52
53
  raise RubySMB::Error::InvalidPacket, "Not a Valid SMB1 Negoitate Response #{e.message}"
53
54
  end
54
- if packet.valid?
55
- response = packet
56
- end
55
+ response = packet if packet.valid?
57
56
  end
58
57
  if smb2 && response.nil?
59
58
  begin
60
59
  packet = RubySMB::SMB2::Packet::NegotiateResponse.read raw_data
61
- rescue Exception => e
60
+ rescue StandardError => e
62
61
  raise RubySMB::Error::InvalidPacket, "Not a Valid SMB2 Negoitate Response #{e.message}"
63
62
  end
64
63
  response = packet
65
64
  end
66
65
  if response.nil?
67
- raise RubySMB::Error::InvalidPacket, "No Valid Negotiate Response found"
66
+ raise RubySMB::Error::InvalidPacket, 'No Valid Negotiate Response found'
68
67
  end
69
68
  response
70
69
  end
71
70
 
72
71
  # Sets the supported SMB Protocol and whether or not
73
72
  # Signing is enabled based on the Negotiate Response Packet.
73
+ # It also stores the negotiated dialect.
74
74
  #
75
75
  # @param packet [RubySMB::SMB1::Packet::NegotiateResponseExtended] if SMB1 was negotiated
76
76
  # @param packet [RubySMB::SMB2::Packet::NegotiateResponse] if SMB2 was negotiated
77
- # @return [void] This method sets state and does not return a meaningful value
77
+ # @return [String] The SMB version as a string ('SMB1', 'SMB2')
78
78
  def parse_negotiate_response(packet)
79
79
  case packet
80
- when RubySMB::SMB1::Packet::NegotiateResponseExtended
81
- self.smb1 = true
82
- self.smb2 = false
83
- if packet.parameter_block.security_mode.security_signatures_required == 1
84
- self.signing_required = true
85
- else
86
- self.signing_required = false
87
- end
88
- 'SMB1'
89
- when RubySMB::SMB2::Packet::NegotiateResponse
90
- self.smb1 = false
91
- self.smb2 = true
92
- if packet.security_mode.signing_required == 1
93
- self.signing_required = true
94
- else
95
- self.signing_required = false
96
- end
97
- 'SMB2'
80
+ when RubySMB::SMB1::Packet::NegotiateResponseExtended
81
+ self.smb1 = true
82
+ self.smb2 = false
83
+ if packet.parameter_block.security_mode.security_signatures_required == 1
84
+ self.signing_required = true
85
+ else
86
+ self.signing_required = false
87
+ end
88
+ self.dialect = packet.negotiated_dialect.to_s
89
+ 'SMB1'
90
+ when RubySMB::SMB2::Packet::NegotiateResponse
91
+ self.smb1 = false
92
+ self.smb2 = true
93
+ self.signing_required = if packet.security_mode.signing_required == 1
94
+ true
95
+ else
96
+ false
97
+ end
98
+ self.dialect = "0x%04x" % packet.dialect_revision
99
+ 'SMB2'
98
100
  end
99
101
  end
100
102
 
101
-
102
103
  # Create a {RubySMB::SMB1::Packet::NegotiateRequest} packet with the
103
104
  # dialects filled in based on the protocol options set on the Client.
104
105
  #
@@ -130,4 +131,4 @@ module RubySMB
130
131
  end
131
132
  end
132
133
  end
133
- end
134
+ end
@@ -1,9 +1,7 @@
1
1
  module RubySMB
2
2
  class Client
3
-
4
3
  # Contains the methods for handling packet signing
5
4
  module Signing
6
-
7
5
  # The NTLM Session Key used for signing
8
6
  # @!attribute [rw] session_key
9
7
  # @return [String]
@@ -16,17 +14,15 @@ module RubySMB
16
14
  # @param packet [RubySMB::GenericPacket] the packet to sign
17
15
  # @return [RubySMB::GenericPacket] the packet, signed if needed
18
16
  def smb1_sign(packet)
19
- if self.signing_required && !self.session_key.empty?
17
+ if signing_required && !session_key.empty?
20
18
  # Pack the Sequence counter into a int64le
21
- packed_sequence_counter = [self.sequence_counter].pack('Q<')
19
+ packed_sequence_counter = [sequence_counter].pack('Q<')
22
20
  packet.smb_header.security_features = packed_sequence_counter
23
- signature = OpenSSL::Digest::MD5.digest(self.session_key + packet.to_binary_s)[0,8]
21
+ signature = OpenSSL::Digest::MD5.digest(session_key + packet.to_binary_s)[0, 8]
24
22
  packet.smb_header.security_features = signature
25
23
  self.sequence_counter += 1
26
- packet
27
- else
28
- packet
29
24
  end
25
+ packet
30
26
  end
31
27
 
32
28
  # Take an SMB2 packet and checks to see if it should be signed.
@@ -36,17 +32,14 @@ module RubySMB
36
32
  # @param packet [RubySMB::GenericPacket] the packet to sign
37
33
  # @return [RubySMB::GenericPacket] the packet, signed if needed
38
34
  def smb2_sign(packet)
39
- if self.signing_required && !self.session_key.empty?
35
+ if signing_required && !session_key.empty?
40
36
  packet.smb2_header.flags.signed = 1
41
37
  packet.smb2_header.signature = "\x00" * 16
42
- hmac = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new, self.session_key, packet.to_binary_s)
43
- packet.smb2_header.signature = hmac[0,16]
44
- packet
45
- else
46
- packet
38
+ hmac = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new, session_key, packet.to_binary_s)
39
+ packet.smb2_header.signature = hmac[0, 16]
47
40
  end
41
+ packet
48
42
  end
49
-
50
43
  end
51
44
  end
52
- end
45
+ end