lib/em-websocket/handshake76.rb in em-websocket-0.2.0 vs lib/em-websocket/handshake76.rb in em-websocket-0.2.1

- old
+ new

@@ -33,24 +33,34 @@ private def solve_challenge(first, second, third) # Refer to 5.2 4-9 of the draft 76 - sum = [(extract_nums(first) / count_spaces(first))].pack("N*") + - [(extract_nums(second) / count_spaces(second))].pack("N*") + + sum = [numbers_over_spaces(first)].pack("N*") + + [numbers_over_spaces(second)].pack("N*") + third Digest::MD5.digest(sum) end - def extract_nums(string) - string.scan(/[0-9]/).join.to_i - end + def numbers_over_spaces(string) + numbers = string.scan(/[0-9]/).join.to_i - def count_spaces(string) spaces = string.scan(/ /).size # As per 5.2.5, abort the connection if spaces are zero. raise HandshakeError, "Websocket Key1 or Key2 does not contain spaces - this is a symptom of a cross-protocol attack" if spaces == 0 - return spaces + + # As per 5.2.6, abort if numbers is not an integral multiple of spaces + if numbers % spaces != 0 + raise HandshakeError, "Invalid Key #{string.inspect}" + end + + quotient = numbers / spaces + + if quotient > 2**32-1 + raise HandshakeError, "Challenge computation out of range for key #{string.inspect}" + end + + return quotient end def validate_protocol!(protocol) raise HandshakeError, "Invalid WebSocket-Protocol: empty" if protocol.empty? # TODO: Validate characters