summaryrefslogtreecommitdiff
path: root/Net/SSH/Transport/PacketStream.html
diff options
context:
space:
mode:
Diffstat (limited to 'Net/SSH/Transport/PacketStream.html')
-rw-r--r--Net/SSH/Transport/PacketStream.html105
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">&amp;&amp;</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">&quot;the client ipaddr/name could not be determined&quot;</span> }
<span class="ruby-string">&quot;unknown&quot;</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">&quot;C*&quot;</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">&quot;NCA*A*&quot;</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">&quot;NA*&quot;</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">&quot;using encrypt-then-mac&quot;</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">&lt;&lt;</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">&quot;N&quot;</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">&quot;CA*A*&quot;</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">&lt;&lt;</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">&quot;NA*&quot;</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">&quot;NCA*A*&quot;</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">&quot;NA*&quot;</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">&lt;&lt;</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">&quot;queueing packet nr #{client.sequence_number} type #{payload.getbyte(0)} len #{packet_length}&quot;</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">&lt;=</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">&quot;connection closed by remote host&quot;</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">&quot;timeout waiting for next packet&quot;</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">&quot;connection closed by remote host&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">fill</span> <span class="ruby-operator">&lt;=</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">&lt;</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">&lt;</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">&quot;N&quot;</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">&quot;padding error, need #{need} block #{server.block_size}&quot;</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">&lt;</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">&gt;</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">&quot;NA*&quot;</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">&quot;corrupted mac detected&quot;</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">&quot;NA*&quot;</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">&quot;NA*&quot;</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">&quot;corrupted hmac detected&quot;</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>)