# File lib/u2f/u2f.rb, line 44
    def authenticate!(challenges, response, registration_public_key,
                      registration_counter)
      # Handle both single and Array input
      challenges = [challenges] unless challenges.is_a? Array

      # TODO: check that it's the correct key_handle as well
      unless challenges.include?(response.client_data.challenge)
        fail NoMatchingRequestError
      end

      fail ClientDataTypeError unless response.client_data.authentication?

      pem = U2F.public_key_pem(registration_public_key)

      fail AuthenticationFailedError unless response.verify(app_id, pem)

      fail UserNotPresentError unless response.user_present?

      unless response.counter > registration_counter
        unless response.counter == 0 && registration_counter == 0
          fail CounterTooLowError
        end
      end
    end