# Copyright (c) 2010 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.

import os

from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error

class firmware_VbootCrypto(test.test):
    """
    Tests for correctness of verified boot reference crypto implementation.
    """
    version = 1
    preserve_srcdir = True

    # TODO(gauravsh): Disable this autotest until we have a way
    # of running these in a 64-bit environment (since for x86, this
    # code is run in 64-bit mode.
    #
    # This issue is tracked as Issue 3792 on the Chromium OS Bug Tracker.
    # http://code.google.com/p/chromium-os/issues/detail?id=3792
    def setup_Disabled(self):
        os.chdir(self.srcdir)
        utils.make('clean')
        utils.make('all')


    # Parses the [result] and output the key-value pairs.
    def __output_result_keyvals(self, results):
        for keyval in results.splitlines():
            if keyval.strip().startswith('#'):
                continue
            key, val = keyval.split(':')
            self.keyvals[key.strip()] = float(val)


    def __generate_test_cases(self):
        gen_test_case_cmd = os.path.join(self.srcdir, "tests",
                                         "gen_test_cases.sh")
        return_code = utils.system(gen_test_case_cmd, ignore_status = True)
        if return_code == 255:
            return False
        if return_code == 1:
            raise error.TestError("Couldn't generate test cases")
        return True


    def __sha_test(self):
        sha_test_cmd = os.path.join(self.srcdir, "tests", "sha_tests")
        return_code = utils.system(sha_test_cmd, ignore_status=True)
        if return_code == 255:
            return False
        if return_code == 1:
            raise error.TestError("SHA Test Error")
        return True


    def __rsa_test(self):
        os.chdir(self.srcdir)
        rsa_test_cmd = os.path.join(self.srcdir, "tests",
                                    "run_rsa_tests.sh")
        return_code = utils.system(rsa_test_cmd, ignore_status=True)
        if return_code == 255:
            return False
        if return_code == 1:
            raise error.TestError("RSA Test Error")
        return True


    def __image_verification_test(self):
        image_verification_cmd = "cd %s && ./run_image_verification_tests.sh" \
                                 % os.path.join(self.srcdir, "tests")
        return_code = utils.system(image_verification_cmd,
                                   ignore_status=True)
        if return_code == 255:
            return False
        if return_code == 1:
            raise error.TestError("Image Verification Test Error")
        return True


    def __sha_benchmark(self):
        sha_benchmark_cmd = os.path.join(self.srcdir, "tests",
                                         "sha_benchmark")
        self.results = utils.system_output(sha_benchmark_cmd,
                                           retain_output=True)
        self.__output_result_keyvals(self.results)


    def __rsa_benchmark(self):
        rsa_benchmark_cmd = "cd %s && ./rsa_verify_benchmark" % \
                            os.path.join(self.srcdir, "tests")
        self.results = utils.system_output(rsa_benchmark_cmd,
                                           retain_output=True)
        self.__output_result_keyvals(self.results)


    def __verify_image_benchmark(self):
        firmware_benchmark_cmd = "cd %s && ./firmware_verify_benchmark" % \
                                 os.path.join(self.srcdir, "tests")
        kernel_benchmark_cmd = "cd %s && ./kernel_verify_benchmark" % \
                                 os.path.join(self.srcdir, "tests")
        self.results = utils.system_output(firmware_benchmark_cmd,
                                           retain_output=True)
        self.__output_result_keyvals(self.results)
        self.results = utils.system_output(kernel_benchmark_cmd,
                                           retain_output=True)
        self.__output_result_keyvals(self.results)


    def __rollback_tests(self):
        firmware_rollback_test_cmd = "cd %s && ./firmware_rollback_tests" % \
                                     os.path.join(self.srcdir, "tests")
        kernel_rollback_test_cmd = "cd %s && ./kernel_rollback_tests" % \
                                     os.path.join(self.srcdir, "tests")
        return_code = utils.system(firmware_rollback_test_cmd,
                                   ignore_status=True)
        if return_code == 255:
            return False
        if return_code == 1:
            raise error.TestError("Firmware Rollback Test Error")

        return_code = utils.system(kernel_rollback_test_cmd,
                                   ignore_status=True)
        if return_code == 255:
            return False
        if return_code == 1:
            raise error.TestError("KernelRollback Test Error")
        return True


    def __splicing_tests(self):
        firmware_splicing_test_cmd = "cd %s && ./firmware_splicing_tests" % \
                                     os.path.join(self.srcdir, "tests")
        kernel_splicing_test_cmd = "cd %s && ./kernel_splicing_tests" % \
                                     os.path.join(self.srcdir, "tests")
        return_code = utils.system(firmware_splicing_test_cmd,
                                   ignore_status=True)
        if return_code == 255:
            return False
        if return_code == 1:
            raise error.TestError("Firmware Splicing Test Error")

        return_code = utils.system(kernel_splicing_test_cmd,
                                   ignore_status=True)
        if return_code == 255:
            return False
        if return_code == 1:
            raise error.TestError("Kernel Splicing Test Error")
        return True


    def run_crypto(self):
        success = self.__sha_test()
        if not success:
            raise error.TestFail("SHA Test Failed")
        success = self.__rsa_test()
        if not success:
            raise error.TestFail("RSA Test Failed")


    def run_verification(self):
        success = self.__image_verification_test()
        if not success:
            raise error.TestFail("Image Verification Test Failed")


    def run_benchmarks(self):
        self.keyvals = {}
        self.__sha_benchmark()
        self.__rsa_benchmark()
        self.__verify_image_benchmark()
        self.write_perf_keyval(self.keyvals)


    def run_rollback(self):
        success = self.__rollback_tests()
        if not success:
            raise error.TestFail("Rollback Tests Failed")


    def run_splicing(self):
        success = self.__splicing_tests()
        if not success:
            raise error.TestFail("Splicing Tests Failed")


    def run_once(self, suite='crypto'):
        self.__generate_test_cases()
        getattr(self, 'run_' + suite)()
