# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from autotest_lib.client.common_lib import error
from autotest_lib.server.cros.update_engine import update_engine_test


class autoupdate_CatchBadSignatures(update_engine_test.UpdateEngineTest):
    """Test to verify that update_engine correctly checks payload signatures."""
    version = 1

    # The test image to use and the values associated with it.
    _IMAGE_GS_URL='https://storage.googleapis.com/chromiumos-test-assets-public/autoupdate/autoupdate_CatchBadSignatures.bin'

    def _check_signature(self, expected_log_messages,
                         failure_message, public_key=None, tag=None):
        """
        Helper function for updating with a canned Omaha response.

        @param expected_log_messages: A list of strings that are expected to be
                                      in the update_engine log.
        @param failure_message: The message for exception to raise on error.
        @param public_key: The public key to be passed to the update_engine.
        @param tag: String to append to test name to identify it in the logs.

        """
        # Runs the update on the DUT and expect it to fail.
        self._run_client_test_and_check_result('autoupdate_CannedOmahaUpdate',
                                               payload_url=self._IMAGE_GS_URL,
                                               allow_failure=True,
                                               public_key=public_key,
                                               tag=tag)
        if not self._check_update_engine_log_for_entry(expected_log_messages):
            last_error = self._get_last_error_string()
            raise error.TestFail(
                '%s. Last update_engine.log error: %s' % (failure_message,
                                                          last_error))


    def _check_bad_metadata_signature(self):
        """Checks that update_engine rejects updates where the payload
        and Omaha response do not agree on the metadata signature."""
        expected_log_messages = [
                'Mandating payload signature checks since Omaha Response for '
                'unofficial build includes public RSA key',
                'Mandatory metadata signature validation failed'
        ]

        self._check_signature(expected_log_messages,
                              'Check for bad metadata signature failed.',
                              public_key=self._IMAGE_PUBLIC_KEY,
                              tag='metadata_signature')


    def _check_bad_payload_signature(self):
        """Checks that update_engine rejects updates where the payload
        signature does not match what is expected."""
        expected_log_messages = [
                'Mandating payload signature checks since Omaha Response for '
                'unofficial build includes public RSA key',
                'Metadata hash signature matches value in Omaha response.',
                'Public key verification failed, thus update failed'
        ]

        self._check_signature(expected_log_messages,
                              'Check for payload signature failed.',
                              tag='payload_signature')


    def run_once(self):
        """Runs the test on a DUT."""
        self._check_bad_metadata_signature()
        self._check_bad_payload_signature()
