diff options
Diffstat (limited to 'Net/SSH/Transport/PacketStream.html')
-rw-r--r-- | Net/SSH/Transport/PacketStream.html | 105 |
1 files changed, 67 insertions, 38 deletions
diff --git a/Net/SSH/Transport/PacketStream.html b/Net/SSH/Transport/PacketStream.html index af99475..929883b 100644 --- a/Net/SSH/Transport/PacketStream.html +++ b/Net/SSH/Transport/PacketStream.html @@ -4,7 +4,7 @@ <head> <meta charset="UTF-8"> -<title>module Net::SSH::Transport::PacketStream - net-ssh 4.2.0</title> +<title>module Net::SSH::Transport::PacketStream - net-ssh 6.0.0.beta1</title> <script type="text/javascript"> var rdoc_rel_prefix = "../../../"; @@ -222,7 +222,7 @@ interpret packets coming from the server.</p> <div class="method-source-code" id="extended-source"> - <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 21</span> + <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 22</span> <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">extended</span>(<span class="ruby-identifier">object</span>) <span class="ruby-identifier">object</span>.<span class="ruby-identifier">__send__</span>(<span class="ruby-value">:initialize_ssh</span>) <span class="ruby-keyword">end</span></pre> @@ -263,9 +263,9 @@ interpret packets coming from the server.</p> <div class="method-source-code" id="available_for_read-3F-source"> - <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 74</span> + <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 75</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier">available_for_read?</span> - <span class="ruby-identifier">result</span> = <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">SSH</span><span class="ruby-operator">::</span><span class="ruby-constant">Compat</span>.<span class="ruby-identifier">io_select</span>([<span class="ruby-keyword">self</span>], <span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>, <span class="ruby-value">0</span>) + <span class="ruby-identifier">result</span> = <span class="ruby-constant">IO</span>.<span class="ruby-identifier">select</span>([<span class="ruby-keyword">self</span>], <span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>, <span class="ruby-value">0</span>) <span class="ruby-identifier">result</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">result</span>.<span class="ruby-identifier">first</span>.<span class="ruby-identifier">any?</span> <span class="ruby-keyword">end</span></pre> </div> @@ -299,7 +299,7 @@ href="State.html#method-i-cleanup">Net::SSH::Transport::State#cleanup</a>).</p> <div class="method-source-code" id="cleanup-source"> - <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 169</span> + <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 186</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier">cleanup</span> <span class="ruby-identifier">client</span>.<span class="ruby-identifier">cleanup</span> <span class="ruby-identifier">server</span>.<span class="ruby-identifier">cleanup</span> @@ -334,19 +334,19 @@ socket.</p> <div class="method-source-code" id="client_name-source"> - <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 41</span> + <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 42</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier">client_name</span> <span class="ruby-ivar">@client_name</span> <span class="ruby-operator">||=</span> <span class="ruby-keyword">begin</span> <span class="ruby-identifier">sockaddr</span> = <span class="ruby-identifier">getsockname</span> <span class="ruby-keyword">begin</span> <span class="ruby-constant">Socket</span>.<span class="ruby-identifier">getnameinfo</span>(<span class="ruby-identifier">sockaddr</span>, <span class="ruby-constant">Socket</span><span class="ruby-operator">::</span><span class="ruby-constant">NI_NAMEREQD</span>).<span class="ruby-identifier">first</span> - <span class="ruby-keyword">rescue</span> + <span class="ruby-keyword">rescue</span> <span class="ruby-constant">StandardError</span> <span class="ruby-keyword">begin</span> <span class="ruby-constant">Socket</span>.<span class="ruby-identifier">getnameinfo</span>(<span class="ruby-identifier">sockaddr</span>).<span class="ruby-identifier">first</span> - <span class="ruby-keyword">rescue</span> + <span class="ruby-keyword">rescue</span> <span class="ruby-constant">StandardError</span> <span class="ruby-keyword">begin</span> <span class="ruby-constant">Socket</span>.<span class="ruby-identifier">gethostbyname</span>(<span class="ruby-constant">Socket</span>.<span class="ruby-identifier">gethostname</span>).<span class="ruby-identifier">first</span> - <span class="ruby-keyword">rescue</span> + <span class="ruby-keyword">rescue</span> <span class="ruby-constant">StandardError</span> <span class="ruby-identifier">lwarn</span> { <span class="ruby-string">"the client ipaddr/name could not be determined"</span> } <span class="ruby-string">"unknown"</span> <span class="ruby-keyword">end</span> @@ -385,13 +385,13 @@ client state (compression, cipher, and hmac).</p> <div class="method-source-code" id="enqueue_packet-source"> - <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 132</span> + <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 128</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier">enqueue_packet</span>(<span class="ruby-identifier">payload</span>) <span class="ruby-comment"># try to compress the packet</span> <span class="ruby-identifier">payload</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">compress</span>(<span class="ruby-identifier">payload</span>) <span class="ruby-comment"># the length of the packet, minus the padding</span> - <span class="ruby-identifier">actual_length</span> = <span class="ruby-value">4</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">payload</span>.<span class="ruby-identifier">bytesize</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span> + <span class="ruby-identifier">actual_length</span> = (<span class="ruby-identifier">client</span>.<span class="ruby-identifier">hmac</span>.<span class="ruby-identifier">etm</span> <span class="ruby-operator">?</span> <span class="ruby-value">0</span> <span class="ruby-operator">:</span> <span class="ruby-value">4</span>) <span class="ruby-operator">+</span> <span class="ruby-identifier">payload</span>.<span class="ruby-identifier">bytesize</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span> <span class="ruby-comment"># compute the padding length</span> <span class="ruby-identifier">padding_length</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">block_size</span> <span class="ruby-operator">-</span> (<span class="ruby-identifier">actual_length</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">client</span>.<span class="ruby-identifier">block_size</span>) @@ -407,11 +407,32 @@ client state (compression, cipher, and hmac).</p> <span class="ruby-identifier">padding</span> = <span class="ruby-constant">Array</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">padding_length</span>) { <span class="ruby-identifier">rand</span>(<span class="ruby-value">256</span>) }.<span class="ruby-identifier">pack</span>(<span class="ruby-string">"C*"</span>) - <span class="ruby-identifier">unencrypted_data</span> = [<span class="ruby-identifier">packet_length</span>, <span class="ruby-identifier">padding_length</span>, <span class="ruby-identifier">payload</span>, <span class="ruby-identifier">padding</span>].<span class="ruby-identifier">pack</span>(<span class="ruby-string">"NCA*A*"</span>) - <span class="ruby-identifier">mac</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">hmac</span>.<span class="ruby-identifier">digest</span>([<span class="ruby-identifier">client</span>.<span class="ruby-identifier">sequence_number</span>, <span class="ruby-identifier">unencrypted_data</span>].<span class="ruby-identifier">pack</span>(<span class="ruby-string">"NA*"</span>)) + <span class="ruby-keyword">if</span> <span class="ruby-identifier">client</span>.<span class="ruby-identifier">hmac</span>.<span class="ruby-identifier">etm</span> + <span class="ruby-identifier">debug</span> { <span class="ruby-string">"using encrypt-then-mac"</span> } - <span class="ruby-identifier">encrypted_data</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">update_cipher</span>(<span class="ruby-identifier">unencrypted_data</span>) <span class="ruby-operator"><<</span> <span class="ruby-identifier">client</span>.<span class="ruby-identifier">final_cipher</span> - <span class="ruby-identifier">message</span> = <span class="ruby-identifier">encrypted_data</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">mac</span> + <span class="ruby-comment"># Encrypt padding_length, payload, and padding. Take MAC</span> + <span class="ruby-comment"># from the unencrypted packet_lenght and the encrypted</span> + <span class="ruby-comment"># data.</span> + <span class="ruby-identifier">length_data</span> = [<span class="ruby-identifier">packet_length</span>].<span class="ruby-identifier">pack</span>(<span class="ruby-string">"N"</span>) + + <span class="ruby-identifier">unencrypted_data</span> = [<span class="ruby-identifier">padding_length</span>, <span class="ruby-identifier">payload</span>, <span class="ruby-identifier">padding</span>].<span class="ruby-identifier">pack</span>(<span class="ruby-string">"CA*A*"</span>) + + <span class="ruby-identifier">encrypted_data</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">update_cipher</span>(<span class="ruby-identifier">unencrypted_data</span>) <span class="ruby-operator"><<</span> <span class="ruby-identifier">client</span>.<span class="ruby-identifier">final_cipher</span> + + <span class="ruby-identifier">mac_data</span> = <span class="ruby-identifier">length_data</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">encrypted_data</span> + + <span class="ruby-identifier">mac</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">hmac</span>.<span class="ruby-identifier">digest</span>([<span class="ruby-identifier">client</span>.<span class="ruby-identifier">sequence_number</span>, <span class="ruby-identifier">mac_data</span>].<span class="ruby-identifier">pack</span>(<span class="ruby-string">"NA*"</span>)) + + <span class="ruby-identifier">message</span> = <span class="ruby-identifier">mac_data</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">mac</span> + <span class="ruby-keyword">else</span> + <span class="ruby-identifier">unencrypted_data</span> = [<span class="ruby-identifier">packet_length</span>, <span class="ruby-identifier">padding_length</span>, <span class="ruby-identifier">payload</span>, <span class="ruby-identifier">padding</span>].<span class="ruby-identifier">pack</span>(<span class="ruby-string">"NCA*A*"</span>) + + <span class="ruby-identifier">mac</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">hmac</span>.<span class="ruby-identifier">digest</span>([<span class="ruby-identifier">client</span>.<span class="ruby-identifier">sequence_number</span>, <span class="ruby-identifier">unencrypted_data</span>].<span class="ruby-identifier">pack</span>(<span class="ruby-string">"NA*"</span>)) + + <span class="ruby-identifier">encrypted_data</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">update_cipher</span>(<span class="ruby-identifier">unencrypted_data</span>) <span class="ruby-operator"><<</span> <span class="ruby-identifier">client</span>.<span class="ruby-identifier">final_cipher</span> + + <span class="ruby-identifier">message</span> = <span class="ruby-identifier">encrypted_data</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">mac</span> + <span class="ruby-keyword">end</span> <span class="ruby-identifier">debug</span> { <span class="ruby-node">"queueing packet nr #{client.sequence_number} type #{payload.getbyte(0)} len #{packet_length}"</span> } <span class="ruby-identifier">enqueue</span>(<span class="ruby-identifier">message</span>) @@ -452,7 +473,7 @@ this will yield. Otherwise, this does nothing.</p> <div class="method-source-code" id="if_needs_rekey-3F-source"> - <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 177</span> + <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 194</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier">if_needs_rekey?</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">client</span>.<span class="ruby-identifier">needs_rekey?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">server</span>.<span class="ruby-identifier">needs_rekey?</span> <span class="ruby-keyword">yield</span> @@ -474,7 +495,7 @@ this will yield. Otherwise, this does nothing.</p> <div class="method-heading"> <span class="method-name">next_packet</span><span - class="method-args">(mode=:nonblock)</span> + class="method-args">(mode=:nonblock, timeout=nil)</span> <span class="method-click-advice">click to toggle source</span> @@ -487,14 +508,14 @@ this will yield. Otherwise, this does nothing.</p> default), then this will return immediately, whether a packet is available or not, and will return nil if there is no packet ready to be returned. If the mode parameter is :block, then this method will block until a packet is -available.</p> +available or timeout seconds have passed.</p> <div class="method-source-code" id="next_packet-source"> - <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 84</span> -<span class="ruby-keyword">def</span> <span class="ruby-identifier">next_packet</span>(<span class="ruby-identifier">mode</span>=<span class="ruby-value">:nonblock</span>) + <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 85</span> +<span class="ruby-keyword">def</span> <span class="ruby-identifier">next_packet</span>(<span class="ruby-identifier">mode</span>=<span class="ruby-value">:nonblock</span>, <span class="ruby-identifier">timeout</span>=<span class="ruby-keyword">nil</span>) <span class="ruby-keyword">case</span> <span class="ruby-identifier">mode</span> <span class="ruby-keyword">when</span> <span class="ruby-value">:nonblock</span> <span class="ruby-keyword">then</span> <span class="ruby-identifier">packet</span> = <span class="ruby-identifier">poll_next_packet</span> @@ -517,14 +538,9 @@ available.</p> <span class="ruby-identifier">packet</span> = <span class="ruby-identifier">poll_next_packet</span> <span class="ruby-keyword">return</span> <span class="ruby-identifier">packet</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">packet</span> - <span class="ruby-identifier">loop</span> <span class="ruby-keyword">do</span> - <span class="ruby-identifier">result</span> = <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">SSH</span><span class="ruby-operator">::</span><span class="ruby-constant">Compat</span>.<span class="ruby-identifier">io_select</span>([<span class="ruby-keyword">self</span>]) <span class="ruby-keyword">or</span> <span class="ruby-keyword">next</span> - <span class="ruby-keyword">break</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">result</span>.<span class="ruby-identifier">first</span>.<span class="ruby-identifier">any?</span> - <span class="ruby-keyword">end</span> - - <span class="ruby-keyword">if</span> <span class="ruby-identifier">fill</span> <span class="ruby-operator"><=</span> <span class="ruby-value">0</span> - <span class="ruby-identifier">raise</span> <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">SSH</span><span class="ruby-operator">::</span><span class="ruby-constant">Disconnect</span>, <span class="ruby-string">"connection closed by remote host"</span> - <span class="ruby-keyword">end</span> + <span class="ruby-identifier">result</span> = <span class="ruby-constant">IO</span>.<span class="ruby-identifier">select</span>([<span class="ruby-keyword">self</span>], <span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>, <span class="ruby-identifier">timeout</span>) + <span class="ruby-identifier">raise</span> <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">SSH</span><span class="ruby-operator">::</span><span class="ruby-constant">ConnectionTimeout</span>, <span class="ruby-string">"timeout waiting for next packet"</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">result</span> + <span class="ruby-identifier">raise</span> <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">SSH</span><span class="ruby-operator">::</span><span class="ruby-constant">Disconnect</span>, <span class="ruby-string">"connection closed by remote host"</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">fill</span> <span class="ruby-operator"><=</span> <span class="ruby-value">0</span> <span class="ruby-keyword">end</span> <span class="ruby-keyword">else</span> @@ -561,7 +577,7 @@ socket.</p> <div class="method-source-code" id="peer_ip-source"> - <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 63</span> + <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 64</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier">peer_ip</span> <span class="ruby-ivar">@peer_ip</span> <span class="ruby-operator">||=</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">respond_to?</span>(<span class="ruby-value">:getpeername</span>) @@ -600,7 +616,7 @@ socket.</p> <div class="method-source-code" id="send_packet-source"> - <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 124</span> + <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 120</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier">send_packet</span>(<span class="ruby-identifier">payload</span>) <span class="ruby-identifier">enqueue_packet</span>(<span class="ruby-identifier">payload</span>) <span class="ruby-identifier">wait_for_pending_sends</span> @@ -643,7 +659,7 @@ states and generally prepares the object for use as a packet stream.</p> <div class="method-source-code" id="initialize_ssh-source"> - <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 189</span> + <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 206</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize_ssh</span> <span class="ruby-ivar">@hints</span> = {} <span class="ruby-ivar">@server</span> = <span class="ruby-constant">State</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword">self</span>, <span class="ruby-value">:server</span>) @@ -684,19 +700,27 @@ href="../Packet.html">Packet</a> object.</p> <div class="method-source-code" id="poll_next_packet-source"> - <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 202</span> + <pre><span class="ruby-comment"># File lib/net/ssh/transport/packet_stream.rb, line 219</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier">poll_next_packet</span> + <span class="ruby-identifier">aad_length</span> = <span class="ruby-identifier">server</span>.<span class="ruby-identifier">hmac</span>.<span class="ruby-identifier">etm</span> <span class="ruby-operator">?</span> <span class="ruby-value">4</span> <span class="ruby-operator">:</span> <span class="ruby-value">0</span> + <span class="ruby-keyword">if</span> <span class="ruby-ivar">@packet</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-identifier">minimum</span> = <span class="ruby-identifier">server</span>.<span class="ruby-identifier">block_size</span> <span class="ruby-operator"><</span> <span class="ruby-value">4</span> <span class="ruby-operator">?</span> <span class="ruby-value">4</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">server</span>.<span class="ruby-identifier">block_size</span> <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">available</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">minimum</span> - <span class="ruby-identifier">data</span> = <span class="ruby-identifier">read_available</span>(<span class="ruby-identifier">minimum</span>) + <span class="ruby-identifier">data</span> = <span class="ruby-identifier">read_available</span>(<span class="ruby-identifier">minimum</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">aad_length</span>) <span class="ruby-comment"># decipher it</span> - <span class="ruby-ivar">@packet</span> = <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">SSH</span><span class="ruby-operator">::</span><span class="ruby-constant">Buffer</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">server</span>.<span class="ruby-identifier">update_cipher</span>(<span class="ruby-identifier">data</span>)) - <span class="ruby-ivar">@packet_length</span> = <span class="ruby-ivar">@packet</span>.<span class="ruby-identifier">read_long</span> + <span class="ruby-keyword">if</span> <span class="ruby-identifier">server</span>.<span class="ruby-identifier">hmac</span>.<span class="ruby-identifier">etm</span> + <span class="ruby-ivar">@packet_length</span> = <span class="ruby-identifier">data</span>.<span class="ruby-identifier">unpack</span>(<span class="ruby-string">"N"</span>).<span class="ruby-identifier">first</span> + <span class="ruby-ivar">@mac_data</span> = <span class="ruby-identifier">data</span> + <span class="ruby-ivar">@packet</span> = <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">SSH</span><span class="ruby-operator">::</span><span class="ruby-constant">Buffer</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">server</span>.<span class="ruby-identifier">update_cipher</span>(<span class="ruby-identifier">data</span>[<span class="ruby-identifier">aad_length</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>])) + <span class="ruby-keyword">else</span> + <span class="ruby-ivar">@packet</span> = <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">SSH</span><span class="ruby-operator">::</span><span class="ruby-constant">Buffer</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">server</span>.<span class="ruby-identifier">update_cipher</span>(<span class="ruby-identifier">data</span>)) + <span class="ruby-ivar">@packet_length</span> = <span class="ruby-ivar">@packet</span>.<span class="ruby-identifier">read_long</span> + <span class="ruby-keyword">end</span> <span class="ruby-keyword">end</span> - <span class="ruby-identifier">need</span> = <span class="ruby-ivar">@packet_length</span> <span class="ruby-operator">+</span> <span class="ruby-value">4</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">server</span>.<span class="ruby-identifier">block_size</span> + <span class="ruby-identifier">need</span> = <span class="ruby-ivar">@packet_length</span> <span class="ruby-operator">+</span> <span class="ruby-value">4</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">aad_length</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">server</span>.<span class="ruby-identifier">block_size</span> <span class="ruby-identifier">raise</span> <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">SSH</span><span class="ruby-operator">::</span><span class="ruby-constant">Exception</span>, <span class="ruby-node">"padding error, need #{need} block #{server.block_size}"</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">need</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">server</span>.<span class="ruby-identifier">block_size</span> <span class="ruby-operator">!=</span> <span class="ruby-value">0</span> <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">available</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">need</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">server</span>.<span class="ruby-identifier">hmac</span>.<span class="ruby-identifier">mac_length</span> @@ -704,6 +728,7 @@ href="../Packet.html">Packet</a> object.</p> <span class="ruby-keyword">if</span> <span class="ruby-identifier">need</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-comment"># read the remainder of the packet and decrypt it.</span> <span class="ruby-identifier">data</span> = <span class="ruby-identifier">read_available</span>(<span class="ruby-identifier">need</span>) + <span class="ruby-ivar">@mac_data</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">data</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">server</span>.<span class="ruby-identifier">hmac</span>.<span class="ruby-identifier">etm</span> <span class="ruby-ivar">@packet</span>.<span class="ruby-identifier">append</span>(<span class="ruby-identifier">server</span>.<span class="ruby-identifier">update_cipher</span>(<span class="ruby-identifier">data</span>)) <span class="ruby-keyword">end</span> @@ -716,8 +741,12 @@ href="../Packet.html">Packet</a> object.</p> <span class="ruby-identifier">payload</span> = <span class="ruby-ivar">@packet</span>.<span class="ruby-identifier">read</span>(<span class="ruby-ivar">@packet_length</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">padding_length</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>) - <span class="ruby-identifier">my_computed_hmac</span> = <span class="ruby-identifier">server</span>.<span class="ruby-identifier">hmac</span>.<span class="ruby-identifier">digest</span>([<span class="ruby-identifier">server</span>.<span class="ruby-identifier">sequence_number</span>, <span class="ruby-ivar">@packet</span>.<span class="ruby-identifier">content</span>].<span class="ruby-identifier">pack</span>(<span class="ruby-string">"NA*"</span>)) - <span class="ruby-identifier">raise</span> <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">SSH</span><span class="ruby-operator">::</span><span class="ruby-constant">Exception</span>, <span class="ruby-string">"corrupted mac detected"</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">real_hmac</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">my_computed_hmac</span> + <span class="ruby-identifier">my_computed_hmac</span> = <span class="ruby-keyword">if</span> <span class="ruby-identifier">server</span>.<span class="ruby-identifier">hmac</span>.<span class="ruby-identifier">etm</span> + <span class="ruby-identifier">server</span>.<span class="ruby-identifier">hmac</span>.<span class="ruby-identifier">digest</span>([<span class="ruby-identifier">server</span>.<span class="ruby-identifier">sequence_number</span>, <span class="ruby-ivar">@mac_data</span>].<span class="ruby-identifier">pack</span>(<span class="ruby-string">"NA*"</span>)) + <span class="ruby-keyword">else</span> + <span class="ruby-identifier">server</span>.<span class="ruby-identifier">hmac</span>.<span class="ruby-identifier">digest</span>([<span class="ruby-identifier">server</span>.<span class="ruby-identifier">sequence_number</span>, <span class="ruby-ivar">@packet</span>.<span class="ruby-identifier">content</span>].<span class="ruby-identifier">pack</span>(<span class="ruby-string">"NA*"</span>)) + <span class="ruby-keyword">end</span> + <span class="ruby-identifier">raise</span> <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">SSH</span><span class="ruby-operator">::</span><span class="ruby-constant">Exception</span>, <span class="ruby-string">"corrupted hmac detected"</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">real_hmac</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">my_computed_hmac</span> <span class="ruby-comment"># try to decompress the payload, in case compression is active</span> <span class="ruby-identifier">payload</span> = <span class="ruby-identifier">server</span>.<span class="ruby-identifier">decompress</span>(<span class="ruby-identifier">payload</span>) |