#!/usr/bin/env python3

# Copyright 2019, The Android Open Source Project
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use, copy,
# modify, merge, publish, distribute, sublicense, and/or sell copies
# of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
"""Unit tests for aftltool."""

import argparse
import base64
import binascii
import io
import os
import struct
import sys
import tempfile
import unittest

import aftltool
import avbtool

# pylint: disable=import-error
import api_pb2
# pylint: enable=import-error


# Workaround for b/149307145 in order to pick up the test data from the right
# location independent where the script is called from.
# TODO(b/149307145): Remove workaround once the referenced bug is fixed.
TEST_EXEC_PATH = os.path.dirname(os.path.realpath(__file__))


class AftltoolTestCase(unittest.TestCase):

  def setUp(self):
    """Sets up the test bed for the unit tests."""
    super(AftltoolTestCase, self).setUp()

    # Redirects the stderr to /dev/null when running the unittests. The reason
    # is that soong interprets any output on stderr as an error and marks the
    # unit test as failed although the test itself succeeded.
    self.stderr = sys.stderr
    self.null = open(os.devnull, 'wt')
    sys.stderr = self.null

    # AFTL public key.
    self.test_aftl_pub_key = (
        '-----BEGIN PUBLIC KEY-----\n'
        'MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4ilqCNsenNA013iCdwgD\n'
        'YPxZ853nbHG9lMBp9boXiwRcqT/8bUKHIL7YX5z7s+QoRYVY3rkMKppRabclXzyx\n'
        'H59YnPMaU4uv7NqwWzjgaZo7E+vo7IF+KBjV3cJulId5Av0yIYUCsrwd7MpGtWdC\n'
        'Q3S+7Vd4zwzCKEhcvliNIhnNlp1U3wNkPCxOyCAsMEn6k8O5ar12ke5TvxDv15db\n'
        'rPDeHh8G2OYWoCkWL+lSN35L2kOJqKqVbLKWrrOd96RCYrrtbPCi580OADJRcUlG\n'
        'lgcjwmNwmypBWvQMZ6ITj0P0ksHnl1zZz1DE2rXe1goLI1doghb5KxLaezlR8c2C\n'
        'E3w/uo9KJgNmNgUVzzqZZ6FE0moyIDNOpP7KtZAL0DvEZj6jqLbB0ccPQElrg52m\n'
        'Dv2/A3nYSr0mYBKeskT4+Bg7PGgoC8p7WyLSxMyzJEDYdtrj9OFx6eZaA23oqTQx\n'
        'k3Qq5H8RfNBeeSUEeKF7pKH/7gyqZ2bNzBFMA2EBZgBozwRfaeN/HCv3qbaCnwvu\n'
        '6caacmAsK+RxiYxSL1QsJqyhCWWGxVyenmxdc1KG/u5ypi7OIioztyzR3t2tAzD3\n'
        'Nb+2t8lgHBRxbV24yiPlnvPmB1ZYEctXnlRR9Evpl1o9xA9NnybPHKr9rozN39CZ\n'
        'V/USB8K6ao1y5xPZxa8CZksCAwEAAQ==\n'
        '-----END PUBLIC KEY-----\n')

    # Test AftlIcpEntry #1
    self.test_tl_url_1 = 'aftl-test-server.google.com'

    self.test_sth_1 = aftltool.TrillianLogRootDescriptor()
    self.test_sth_1.tree_size = 2
    self.test_sth_1.root_hash_size = 32
    self.test_sth_1.root_hash = b'f' * 32
    self.test_sth_1.timestamp = 0x1234567890ABCDEF
    self.test_sth_1.revision = 0xFEDCBA0987654321

    self.test_sth_1_bytes = (
        b'\x00\x01'                          # version
        b'\x00\x00\x00\x00\x00\x00\x00\x02'  # tree_size
        b'\x20'                              # root_hash_size
        + b'f' * 32 +                        # root_hash
        b'\x12\x34\x56\x78\x90\xAB\xCD\xEF'  # timestamp
        b'\xFE\xDC\xBA\x09\x87\x65\x43\x21'  # revision
        b'\x00\x00'                          # metadata_size
        b''                                  # metadata (empty)
    )

    # Fill each structure with an easily observable pattern for easy validation.
    self.test_proof_hashes_1 = []
    self.test_proof_hashes_1.append(b'b' * 32)
    self.test_proof_hashes_1.append(b'c' * 32)
    self.test_proof_hashes_1.append(b'd' * 32)
    self.test_proof_hashes_1.append(b'e' * 32)

    # Valid test AftlIcpEntry #1.
    self.test_entry_1 = aftltool.AftlIcpEntry()
    self.test_entry_1.log_url = self.test_tl_url_1
    self.test_entry_1.leaf_index = 1
    self.test_entry_1.log_root_descriptor = self.test_sth_1
    self.test_entry_1.proofs = self.test_proof_hashes_1
    self.test_entry_1.log_root_signature = b'g' * 512

    self.test_entry_1_bytes = (
        b'\x00\x00\x00\x1b'                  # Transparency log url size.
        b'\x00\x00\x00\x00\x00\x00\x00\x01'  # Leaf index.
        b'\x00\x00\x00\x3d'                  # Log root descriptor size.
        b'\x00\x00\x00\x00'                  # Firmware info leaf size.
        b'\x02\x00'                          # Log root signature size.
        b'\x04'                              # Number of hashes in ICP.
        b'\x00\x00\x00\x80'                  # Size of ICP in bytes.
        + self.test_tl_url_1.encode('ascii') # Transparency log url.
        + self.test_sth_1_bytes
        + b'g' * 512                         # Log root signature.
        + b'b' * 32                          # Hashes...
        + b'c' * 32
        + b'd' * 32
        + b'e' * 32)

    # Valid test AftlIcpEntry #2.
    self.test_tl_url_2 = 'aftl-test-server.google.ch'

    self.test_sth_2 = aftltool.TrillianLogRootDescriptor()
    self.test_sth_2.tree_size = 4
    self.test_sth_2.root_hash_size = 32
    self.test_sth_2.root_hash = b'e' * 32
    self.test_sth_2.timestamp = 6
    self.test_sth_2.revision = 7
    self.test_sth_2.metadata_size = 2
    self.test_sth_2.metadata = b'12'

    self.test_sth_2_bytes = (
        b'\x00\x01'                          # version
        b'\x00\x00\x00\x00\x00\x00\x00\x04'  # tree_size
        b'\x20'                              # root_hash_size
        + b'e' * 32 +                        # root_hash
        b'\x00\x00\x00\x00\x00\x00\x00\x06'  # timestamp
        b'\x00\x00\x00\x00\x00\x00\x00\x07'  # revision
        b'\x00\x02'                          # metadata_size
        b'12'                                # metadata
    )

    # Fill each structure with an easily observable pattern for easy validation.
    self.test_proof_hashes_2 = []
    self.test_proof_hashes_2.append(b'g' * 32)
    self.test_proof_hashes_2.append(b'h' * 32)

    self.test_entry_2 = aftltool.AftlIcpEntry()
    self.test_entry_2.log_url = self.test_tl_url_2
    self.test_entry_2.leaf_index = 2
    self.test_entry_2.log_root_descriptor = self.test_sth_2
    self.test_entry_2.log_root_signature = b'd' * 512
    self.test_entry_2.proofs = self.test_proof_hashes_2

    self.test_entry_2_bytes = (
        b'\x00\x00\x00\x1a'                   # Transparency log url size.
        b'\x00\x00\x00\x00\x00\x00\x00\x02'   # Leaf index.
        b'\x00\x00\x00\x3f'                   # Log root descriptor size.
        b'\x00\x00\x00\x00'                   # Firmware info leaf size.
        b'\x02\x00'                           # Log root signature size.
        b'\x02'                               # Number of hashes in ICP.
        b'\x00\x00\x00\x40'                   # Size of ICP in bytes.
        + self.test_tl_url_2.encode('ascii')  # Transparency log url.
        + self.test_sth_2_bytes               # Log root
        + b'd' * 512                          # Log root signature.
        + b'g' * 32                           # Hashes...
        + b'h' * 32)

    # Valid test AftlImage made out of AftlEntry #1 and #2.
    self.test_aftl_desc = aftltool.AftlImage()
    self.test_aftl_desc.add_icp_entry(self.test_entry_1)
    self.test_aftl_desc.add_icp_entry(self.test_entry_2)

    self.test_expected_aftl_image_bytes = (
        b'AFTL'                                         # Magic.
        + struct.pack('!L', avbtool.AVB_VERSION_MAJOR)  # Major version.
        + struct.pack('!L', avbtool.AVB_VERSION_MINOR)  # Minor version.
        + b'\x00\x00\x05\xb9'                           # Image size.
        b'\x00\x02'                                     # Number of ICP entries.
        + self.test_entry_1_bytes
        + self.test_entry_2_bytes)

    # pylint: disable=no-member
    self.test_afi_resp = api_pb2.AddFirmwareInfoResponse()
    self.test_afi_resp.fw_info_proof.proof.leaf_index = 6263
    hashes = [
        '3ad99869646980c0a51d637a9791f892d12e0bc83f6bac5d305a9e289e7f7e8b',
        '2e5c664d2aee64f71cb4d292e787d0eae7ca9ed80d1e08abb41d26baca386c05',
        'a671dd99f8d97e9155cc2f0a9dc776a112a5ec5b821ec71571bb258ac790717a',
        '78046b839595e4e49ad4b0c73f92bf4803aacd4a3351181086509d057ef0d7a9',
        'c0a7e013f03e7c69e9402070e113dadb345868cf144ccb174fabc384b5605abf',
        'dc36e5dbe36abe9f4ad10f14170aa0148b6fe3fcaba9df43deaf4dede01b02e8',
        'b063e7fb665370a361718208756c363dc5206e2e9af9b4d847d81289cdae30de',
        'a69ea5ba88a221103636d3f4245c800570eb86ad9276121481521f97d0a04a81']
    for h in hashes:
      self.test_afi_resp.fw_info_proof.proof.hashes.append(
          binascii.unhexlify(h))
    self.test_afi_resp.fw_info_proof.sth.key_hint = binascii.unhexlify(
        '5af859abce8fe1ea')
    self.test_afi_resp.fw_info_proof.sth.log_root = binascii.unhexlify(
        '000100000000000018782053b182b55dc1377197c938637f50093131daea4'
        'd0696b1eae5b8a014bfde884a15edb28f1fc7954400000000000013a50000'
    )
    self.test_afi_resp.fw_info_proof.sth.log_root_signature = (
        binascii.unhexlify(
            'c264bc7986a1cf56364ca4dd04989f45515cb8764d05b4fb2b880172585ea404'
            '2105f95a0e0471fb6e0f8c762b14b2e526fb78eaddcc61484917795a12f6ab3b'
            '557b5571d492d07d7950595f9ad8647a606c7c633f4697c5eb59c272aeca0419'
            '397c70a3b9b51537537c4ea6b49d356110e70a9286902f814cc6afbeafe612e4'
            '9e180146140e902bdd9e9dae66b37b4943150a9571949027a648db88a4eea3ad'
            'f930b4fa6a183e97b762ab0e55a3a26aa6b0fd44d30531e2541ecb94bf645e62'
            '59e8e3151e7c3b51a09fe24557ce2fd2c0ecdada7ce99c390d2ef10e5d075801'
            '7c10d49c55cdee930959cc35f0104e04f296591eeb5defbc9ebb237da7b204ca'
            'a4608cb98d6bc3a01f18585a04441caf8ec7a35aa2d35f7483b92b14fd0f4a41'
            '3a91133545579309adc593222ca5032a103b00d8fcaea911936dbec11349e4dd'
            '419b091ea7d1130570d70e2589dd9445fd77fd7492507e1c87736847b9741cc6'
            '236868af42558ff6e833e12010c8ede786e43ada40ff488f5f1870d1619887d7'
            '66a24ad0a06a47cc14e2f7db07361be191172adf3155f49713807c7c265f5a84'
            '040fc84246ccf7913e44721f0043cea05ee774e457e13206775eee992620c3f9'
            'd2b2584f58aac19e4afe35f0a17df699c45729f94101083f9fc4302659a7e6e0'
            'e7eb36f8d1ca0be2c9010160d329bd2d17bb707b010fdd63c30b667a0b886cf9'
        )
    )
    self.test_afi_resp.fw_info_leaf = (
        b'{\"timestamp\":{\"seconds\":1580115370,\"nanos\":621454825},\"Va'
        b'lue\":{\"FwInfo\":{\"info\":{\"info\":{\"vbmeta_hash\":\"ViNzEQS'
        b'/oc/bJ13yl40fk/cvXw90bxHQbzCRxgHDIGc=\",\"version_incremental\":'
        b'\"1\",\"manufacturer_key_hash\":\"yBCrUOdjvaAh4git5EgqWa5neegUao'
        b'XeLlB67+N8ObY=\"}}}}}')

    self.test_fw_info_leaf = aftltool.FirmwareInfoLeaf(
        self.test_afi_resp.fw_info_leaf)

  def tearDown(self):
    """Tears down the test bed for the unit tests."""
    # Reconnects stderr back to the normal stderr; see setUp() for details.
    sys.stderr = self.stderr
    self.null.close()

    super(AftltoolTestCase, self).tearDown()

  def get_testdata_path(self, relative_path):
    """Retrieves the absolute path for testdata given the relative path.

    Arguments:
      relative_path: The relative path to the testdata in the testdata
        directory.

    Returns:
      The absolute path to the testdata.
    """
    rel_path_parts = ['test', 'data']
    rel_path_parts.extend(relative_path.split(os.path.sep))
    return os.path.join(TEST_EXEC_PATH, *rel_path_parts)


class AftltoolTest(AftltoolTestCase):

  def test_merkle_root_hash(self):
    """Tests validation of inclusion proof and the merkle tree calculations.

    The test vectors have been taken from the Trillian tests:
    https://github.com/google/trillian/blob/v1.3.3/merkle/log_verifier_test.go
    """

    inclusion_proofs = [
        (1,
         8,
         [
             binascii.unhexlify('96a296d224f285c67bee93c30f8a3091'
                                '57f0daa35dc5b87e410b78630a09cfc7'),
             binascii.unhexlify('5f083f0a1a33ca076a95279832580db3'
                                'e0ef4584bdff1f54c8a360f50de3031e'),
             binascii.unhexlify('6b47aaf29ee3c2af9af889bc1fb9254d'
                                'abd31177f16232dd6aab035ca39bf6e4')
         ]),
        (6,
         8,
         [
             binascii.unhexlify('bc1a0643b12e4d2d7c77918f44e0f4f7'
                                '9a838b6cf9ec5b5c283e1f4d88599e6b'),
             binascii.unhexlify('ca854ea128ed050b41b35ffc1b87b8eb'
                                '2bde461e9e3b5596ece6b9d5975a0ae0'),
             binascii.unhexlify('d37ee418976dd95753c1c73862b9398f'
                                'a2a2cf9b4ff0fdfe8b30cd95209614b7')
         ]),
        (3,
         3,
         [
             binascii.unhexlify('fac54203e7cc696cf0dfcb42c92a1d9d'
                                'baf70ad9e621f4bd8d98662f00e3c125')
         ]),
        (2,
         5,
         [
             binascii.unhexlify('6e340b9cffb37a989ca544e6bb780a2c'
                                '78901d3fb33738768511a30617afa01d'),
             binascii.unhexlify('5f083f0a1a33ca076a95279832580db3'
                                'e0ef4584bdff1f54c8a360f50de3031e'),
             binascii.unhexlify('bc1a0643b12e4d2d7c77918f44e0f4f7'
                                '9a838b6cf9ec5b5c283e1f4d88599e6b')
         ]
        )
    ]

    leaves = [
        binascii.unhexlify(''),
        binascii.unhexlify('00'),
        binascii.unhexlify('10'),
        binascii.unhexlify('2021'),
        binascii.unhexlify('3031'),
        binascii.unhexlify('40414243'),
        binascii.unhexlify('5051525354555657'),
        binascii.unhexlify('606162636465666768696a6b6c6d6e6f'),
    ]

    roots = [
        binascii.unhexlify('6e340b9cffb37a989ca544e6bb780a2c'
                           '78901d3fb33738768511a30617afa01d'),
        binascii.unhexlify('fac54203e7cc696cf0dfcb42c92a1d9d'
                           'baf70ad9e621f4bd8d98662f00e3c125'),
        binascii.unhexlify('aeb6bcfe274b70a14fb067a5e5578264'
                           'db0fa9b51af5e0ba159158f329e06e77'),
        binascii.unhexlify('d37ee418976dd95753c1c73862b9398f'
                           'a2a2cf9b4ff0fdfe8b30cd95209614b7'),
        binascii.unhexlify('4e3bbb1f7b478dcfe71fb631631519a3'
                           'bca12c9aefca1612bfce4c13a86264d4'),
        binascii.unhexlify('76e67dadbcdf1e10e1b74ddc608abd2f'
                           '98dfb16fbce75277b5232a127f2087ef'),
        binascii.unhexlify('ddb89be403809e325750d3d263cd7892'
                           '9c2942b7942a34b77e122c9594a74c8c'),
        binascii.unhexlify('5dc9da79a70659a9ad559cb701ded9a2'
                           'ab9d823aad2f4960cfe370eff4604328'),
    ]

    for icp in inclusion_proofs:
      leaf_id = icp[0] - 1
      leaf_hash = aftltool.rfc6962_hash_leaf(leaves[leaf_id])
      root_hash = aftltool.root_from_icp(leaf_id, icp[1], icp[2], leaf_hash)
      self.assertEqual(root_hash, roots[icp[1] -1])


class AftlImageTest(AftltoolTestCase):

  def test__init__(self):
    """Tests the constructor."""
    # Calls constructor without data.
    d = aftltool.AftlImage()
    self.assertIsInstance(d.image_header, aftltool.AftlImageHeader)
    self.assertEqual(d.image_header.icp_count, 0)
    self.assertEqual(d.icp_entries, [])
    self.assertTrue(d.is_valid())

    # Calls constructor with data.
    d = aftltool.AftlImage(self.test_expected_aftl_image_bytes)
    self.assertIsInstance(d.image_header, aftltool.AftlImageHeader)
    self.assertEqual(d.image_header.icp_count, 2)
    self.assertEqual(len(d.icp_entries), 2)
    for entry in d.icp_entries:
      self.assertIsInstance(entry, aftltool.AftlIcpEntry)
    self.assertTrue(d.is_valid())

  def test_add_icp_entry(self):
    """Tests the add_icp_entry method."""
    d = aftltool.AftlImage()

    # Adds 1st ICP.
    d.add_icp_entry(self.test_entry_1)
    self.assertEqual(d.image_header.icp_count, 1)
    self.assertEqual(len(d.icp_entries), 1)
    self.assertTrue(d.is_valid())

    # Adds 2nd ICP.
    d.add_icp_entry(self.test_entry_2)
    self.assertEqual(d.image_header.icp_count, 2)
    self.assertEqual(len(d.icp_entries), 2)
    self.assertTrue(d.is_valid())

  def test_verify_vbmeta_image_with_1_icp(self):
    """Tests the verify_vbmeta_image method."""
    # Valid vbmeta image without footer with 1 ICP.
    tool = aftltool.Aftl()
    image_path = self.get_testdata_path(
        'aftltool/aftl_output_vbmeta_with_1_icp.img')
    vbmeta_image, _ = tool.get_vbmeta_image(image_path)
    desc = tool.get_aftl_image(image_path)

    # Valid image checked against correct log key.
    self.assertTrue(desc.verify_vbmeta_image(
        vbmeta_image, [self.get_testdata_path('aftltool/aftl_pubkey_1.pub')]))

    # Valid image checked with a key from another log.
    self.assertFalse(desc.verify_vbmeta_image(
        vbmeta_image, [self.get_testdata_path('aftltool/aftl_pubkey_2.pub')]))

    # Valid image checked with non existed key file path.
    self.assertFalse(desc.verify_vbmeta_image(
        vbmeta_image, [self.get_testdata_path('non_existent_blabli')]))

    # Valid image checked with an invalid key.
    self.assertFalse(desc.verify_vbmeta_image(
        vbmeta_image, [self.get_testdata_path('large_blob.bin')]))

    # Valid image checked with empty list of keys.
    self.assertFalse(desc.verify_vbmeta_image(vbmeta_image, []))

    # Valid image checked with empty list of keys.
    self.assertFalse(desc.verify_vbmeta_image(vbmeta_image, None))

  def test_verify_vbmeta_image_with_2_icp_from_same_log(self):
    """Tests the verify_vbmeta_image method."""
    # Valid vbmeta image without footer with 2 ICPs from same log.
    tool = aftltool.Aftl()
    image_path = self.get_testdata_path(
        'aftltool/aftl_output_vbmeta_with_2_icp_same_log.img')
    vbmeta_image, _ = tool.get_vbmeta_image(image_path)
    desc = tool.get_aftl_image(image_path)

    # Valid image checked against correct log key.
    self.assertTrue(desc.verify_vbmeta_image(
        vbmeta_image, [self.get_testdata_path('aftltool/aftl_pubkey_1.pub')]))

    # Valid vbmeta image checked with key from another log.
    self.assertFalse(desc.verify_vbmeta_image(
        vbmeta_image, [self.get_testdata_path('aftltool/aftl_pubkey_2.pub')]))

    # Valid image checked with non existed key file path.
    self.assertFalse(desc.verify_vbmeta_image(
        vbmeta_image, [self.get_testdata_path('non_existent_blabli')]))

    # Valid image checked with invalid key.
    self.assertFalse(desc.verify_vbmeta_image(
        vbmeta_image, [self.get_testdata_path('large_blob.bin')]))

    # Valid image but checked with empty list of keys.
    self.assertFalse(desc.verify_vbmeta_image(vbmeta_image, []))

  def test_verify_vbmeta_image_with_2_icp_from_different_logs(self):
    """Tests the verify_vbmeta_image method."""
    # Valid vbmeta image without footer with 2 ICPs from different logs.
    tool = aftltool.Aftl()
    image_path = self.get_testdata_path(
        'aftltool/aftl_output_vbmeta_with_2_icp_different_logs.img')
    vbmeta_image, _ = tool.get_vbmeta_image(image_path)
    desc = tool.get_aftl_image(image_path)

    # Valid image checked against log keys from both logs.
    self.assertTrue(desc.verify_vbmeta_image(
        vbmeta_image, [
            self.get_testdata_path('aftltool/aftl_pubkey_1.pub'),
            self.get_testdata_path('aftltool/aftl_pubkey_2.pub')
        ]))

    # Valid image checked with one of the keys with an invalid file path.
    self.assertFalse(desc.verify_vbmeta_image(
        vbmeta_image, [
            self.get_testdata_path('aftltool/aftl_pubkey_1.pub'),
            self.get_testdata_path('non_existent_blabli')
        ]))

    # Valid image checked with one of the keys being a invalid key.
    self.assertFalse(desc.verify_vbmeta_image(
        vbmeta_image, [
            self.get_testdata_path('aftltool/aftl_pubkey_1.pub'),
            self.get_testdata_path('large_blob.bin')
        ]))

    # Valid image checked with one of the keys being None.
    self.assertFalse(desc.verify_vbmeta_image(
        vbmeta_image, [
            self.get_testdata_path('aftltool/aftl_pubkey_1.pub'),
            None
        ]))

    # Valid vbmeta image checked against only one of the log keys.
    self.assertFalse(desc.verify_vbmeta_image(
        vbmeta_image, [self.get_testdata_path('aftltool/aftl_pubkey_1.pub')]))
    self.assertFalse(desc.verify_vbmeta_image(
        vbmeta_image, [self.get_testdata_path('aftltool/aftl_pubkey_2.pub')]))

    # Valid image checked with invalid key.
    self.assertFalse(desc.verify_vbmeta_image(
        vbmeta_image, [self.get_testdata_path('large_blob.bin')]))

    # Valid image but checked with empty list of keys.
    self.assertFalse(desc.verify_vbmeta_image(vbmeta_image, []))

  def test_encode(self):
    """Tests encode method."""
    desc_bytes = self.test_aftl_desc.encode()
    self.assertEqual(desc_bytes, self.test_expected_aftl_image_bytes)

  def test_is_valid(self):
    """Tests is_valid method."""
    d = aftltool.AftlImage()
    d.add_icp_entry(self.test_entry_1)
    d.add_icp_entry(self.test_entry_2)

    # Force invalid ICP header.
    old_magic = d.image_header.magic
    d.image_header.magic = b'YOLO'
    self.assertFalse(d.is_valid())
    d.image_header.magic = old_magic
    self.assertTrue(d.is_valid())

    # Force count mismatch between header and actual entries.
    old_icp_count = d.image_header.icp_count
    d.image_header.icp_count = 1
    self.assertFalse(d.is_valid())
    d.image_header.icp_count = old_icp_count
    self.assertTrue(d.is_valid())

    # Force invalid ICP entry.
    old_leaf_index = d.icp_entries[0].leaf_index
    d.icp_entries[0].leaf_index = -10
    self.assertFalse(d.is_valid())
    d.icp_entries[0].leaf_index = old_leaf_index
    self.assertTrue(d.is_valid())

  def test_print_desc(self):
    """Tests print_desc method."""
    buf = io.StringIO()
    self.test_aftl_desc.print_desc(buf)
    desc = buf.getvalue()

    # Cursory check whether the printed description contains something useful.
    self.assertGreater(len(desc), 0)
    self.assertIn('Log Root Descriptor:', desc)


class AftlImageHeaderTest(AftltoolTestCase):
  """Test suite for testing the AftlImageHeader descriptor."""

  def setUp(self):
    """Sets up the test bed for the unit tests."""
    super(AftlImageHeaderTest, self).setUp()

    self.test_header_valid = aftltool.AftlImageHeader()
    self.test_header_valid.icp_count = 1

    self.test_header_invalid = aftltool.AftlImageHeader()
    self.test_header_invalid.icp_count = -34

    self.test_header_bytes = (
        b'AFTL'                                         # Magic.
        + struct.pack('!L', avbtool.AVB_VERSION_MAJOR)  # Major version.
        + struct.pack('!L', avbtool.AVB_VERSION_MINOR)  # Minor version.
        + b'\x00\x00\x00\x12'                           # Image size.
        b'\x00\x01')                                    # Number of ICP entries.

  def test__init__(self):
    """Tests constructor."""

    # Calls constructor without data.
    header = aftltool.AftlImageHeader()
    self.assertEqual(header.magic, b'AFTL')
    self.assertEqual(header.required_icp_version_major,
                     avbtool.AVB_VERSION_MAJOR)
    self.assertEqual(header.required_icp_version_minor,
                     avbtool.AVB_VERSION_MINOR)
    self.assertEqual(header.aftl_image_size, aftltool.AftlImageHeader.SIZE)
    self.assertEqual(header.icp_count, 0)
    self.assertTrue(header.is_valid())

    # Calls constructor with data.
    header = aftltool.AftlImageHeader(self.test_header_bytes)
    self.assertEqual(header.magic, b'AFTL')
    self.assertEqual(header.required_icp_version_major,
                     avbtool.AVB_VERSION_MAJOR)
    self.assertEqual(header.required_icp_version_minor,
                     avbtool.AVB_VERSION_MINOR)
    self.assertEqual(header.aftl_image_size, aftltool.AftlImageHeader.SIZE)
    self.assertTrue(header.icp_count, 1)
    self.assertTrue(header.is_valid())

  def test_encode(self):
    """Tests encode method."""
    # Valid header.
    header_bytes = self.test_header_valid.encode()
    self.assertEqual(header_bytes, self.test_header_bytes)

    # Invalid header
    with self.assertRaises(aftltool.AftlError):
      header_bytes = self.test_header_invalid.encode()

  def test_is_valid(self):
    """Tests is_valid method."""
    # Valid default record.
    header = aftltool.AftlImageHeader()
    self.assertTrue(header.is_valid())

    # Invalid magic.
    header = aftltool.AftlImageHeader()
    header.magic = b'YOLO'
    self.assertFalse(header.is_valid())

    # Valid ICP count.
    self.assertTrue(self.test_header_valid.is_valid())

    # Invalid ICP count.
    self.assertFalse(self.test_header_invalid.is_valid())

    header = aftltool.AftlImageHeader()
    header.icp_count = 10000000
    self.assertFalse(header.is_valid())

    # Invalid ICP major version.
    header = aftltool.AftlImageHeader()
    header.required_icp_version_major = avbtool.AVB_VERSION_MAJOR + 1
    self.assertFalse(header.is_valid())

    # Invalid ICP minor version.
    header = aftltool.AftlImageHeader()
    header.required_icp_version_minor = avbtool.AVB_VERSION_MINOR + 1
    self.assertFalse(header.is_valid())

  def test_print_desc(self):
    """Tests print_desc method."""
    buf = io.StringIO()
    self.test_header_valid.print_desc(buf)
    desc = buf.getvalue()

    # Cursory check whether the printed description contains something useful.
    self.assertGreater(len(desc), 0)
    self.assertIn('Major version:', desc)


class AftlIcpEntryTest(AftltoolTestCase):
  """Test suite for testing the AftlIcpEntry descriptor."""

  def test__init__and_properties(self):
    """Tests constructor and properties methods."""

    # Calls constructor without data.
    entry = aftltool.AftlIcpEntry()
    self.assertEqual(entry.log_url_size, 0)
    self.assertEqual(entry.leaf_index, 0)
    self.assertEqual(entry.log_root_descriptor_size, 29)
    self.assertEqual(entry.fw_info_leaf_size, 0)
    self.assertEqual(entry.log_root_sig_size, 0)
    self.assertEqual(entry.proof_hash_count, 0)
    self.assertEqual(entry.inc_proof_size, 0)
    self.assertEqual(entry.log_url, '')
    self.assertIsInstance(entry.log_root_descriptor,
                          aftltool.TrillianLogRootDescriptor)
    self.assertEqual(entry.proofs, [])
    self.assertTrue(entry.is_valid())

    # Calls constructor with data.
    entry = aftltool.AftlIcpEntry(self.test_entry_1_bytes)
    self.assertEqual(entry.log_url_size, len(self.test_tl_url_1))
    self.assertEqual(entry.leaf_index, 1)
    self.assertEqual(entry.fw_info_leaf_size, 0)
    self.assertEqual(entry.log_root_sig_size, 512)
    self.assertEqual(entry.proof_hash_count, len(self.test_proof_hashes_1))
    self.assertEqual(entry.inc_proof_size, 128)
    self.assertEqual(entry.log_url, self.test_tl_url_1)
    self.assertEqual(entry.proofs, self.test_proof_hashes_1)
    self.assertTrue(entry.is_valid())

  def test_encode(self):
    """Tests encode method."""
    entry_bytes = self.test_entry_1.encode()
    self.assertEqual(entry_bytes, self.test_entry_1_bytes)

  def test_get_expected_size(self):
    """Tests get_expected_size method."""
    # Default record.
    entry = aftltool.AftlIcpEntry()
    self.assertEqual(entry.get_expected_size(), 56)
    self.assertEqual(entry.get_expected_size(), len(entry.encode()))

    # Test record.
    self.assertEqual(self.test_entry_1.get_expected_size(), 755)
    self.assertEqual(self.test_entry_1.get_expected_size(),
                     len(self.test_entry_1.encode()))

  def test_is_valid(self):
    """Tests is_valid method."""
    # Valid default record.
    entry = aftltool.AftlIcpEntry()
    entry.leaf_index = 2
    entry.log_url = self.test_tl_url_1
    entry.set_log_root_descriptor = self.test_sth_1
    entry.proofs = self.test_proof_hashes_1
    self.assertTrue(entry.is_valid())

    # Invalid leaf index.
    entry = aftltool.AftlIcpEntry()
    entry.leaf_index = -1
    self.assertFalse(entry.is_valid())

    # Invalid log_root_descriptor
    entry = aftltool.AftlIcpEntry()
    entry.log_root_descriptor = None
    self.assertFalse(entry.is_valid())

    entry.log_root_descriptor = b''
    self.assertFalse(entry.is_valid())

    entry.log_root_descriptor = b'blabli'
    self.assertFalse(entry.is_valid())

  def test_translate_response(self):
    """Tests translate_response method."""
    entry = aftltool.AftlIcpEntry()
    entry.translate_response('aftl-test.foo.bar:80', self.test_afi_resp)
    self.assertEqual(entry.log_url, 'aftl-test.foo.bar:80')
    self.assertEqual(entry.leaf_index, 6263)
    self.assertEqual(entry.log_root_descriptor.encode(),
                     self.test_afi_resp.fw_info_proof.sth.log_root)
    self.assertEqual(entry.log_root_signature,
                     self.test_afi_resp.fw_info_proof.sth.log_root_signature)
    self.assertEqual(entry.proofs,
                     self.test_afi_resp.fw_info_proof.proof.hashes)

  def test_verify_icp(self):
    """Tests verify_icp method."""
    with tempfile.NamedTemporaryFile('wt+') as key_file:
      key_file.write(self.test_aftl_pub_key)
      key_file.flush()

      # Valid ICP.
      entry = aftltool.AftlIcpEntry()
      entry.translate_response(self.test_tl_url_1, self.test_afi_resp)
      self.assertTrue(entry.verify_icp(key_file.name))

      # Invalid ICP where fw_info_leaf is not matching up with proofs.
      # pylint: disable=protected-access
      entry = aftltool.AftlIcpEntry()
      entry.translate_response(self.test_tl_url_1, self.test_afi_resp)
      fw_info_leaf_bytes = entry.fw_info_leaf._fw_info_leaf_bytes.replace(
          b'ViNzEQS', b'1234567')
      entry.fw_info_leaf._fw_info_leaf_bytes = fw_info_leaf_bytes
      self.assertFalse(entry.verify_icp(key_file.name))

  def test_verify_vbmeta_image(self):
    """Tests the verify_vbmeta_image method."""
    # Valid vbmeta image without footer with 1 ICP.
    tool = aftltool.Aftl()
    image_path = self.get_testdata_path(
        'aftltool/aftl_output_vbmeta_with_1_icp.img')
    vbmeta_image, _ = tool.get_vbmeta_image(image_path)
    desc = tool.get_aftl_image(image_path)

    # Checks that there is 1 ICP.
    self.assertEqual(desc.image_header.icp_count, 1)
    entry = desc.icp_entries[0]

    # Valid vbmeta image checked with correct log key.
    self.assertTrue(entry.verify_vbmeta_image(
        vbmeta_image, self.get_testdata_path('aftltool/aftl_pubkey_1.pub')))

    # Valid vbmeta image checked with public key of another log.
    self.assertFalse(entry.verify_vbmeta_image(
        vbmeta_image, self.get_testdata_path('aftltool/aftl_pubkey_2.pub')))

    # Valid vbmeta image checked with invalid key.
    self.assertFalse(entry.verify_vbmeta_image(
        vbmeta_image, self.get_testdata_path('large_blob.bin')))

    # Valid vbmeta image checked with no key.
    self.assertFalse(entry.verify_vbmeta_image(vbmeta_image, None))

  def test_verify_invalid_vbmeta_image(self):
    """Tests the verify_vbmeta_image method."""
    # Valid vbmeta image without footer with 1 ICP.
    tool = aftltool.Aftl()
    image_path = self.get_testdata_path(
        'aftltool/aftl_output_vbmeta_with_1_icp.img')
    vbmeta_image, _ = tool.get_vbmeta_image(image_path)
    desc = tool.get_aftl_image(image_path)

    self.assertEqual(desc.image_header.icp_count, 1)
    entry = desc.icp_entries[0]

    # Modify vbmeta image to become invalid
    vbmeta_image = b'A' * len(vbmeta_image)

    # Invalid vbmeta image checked with correct log key.
    self.assertFalse(entry.verify_vbmeta_image(
        vbmeta_image, self.get_testdata_path('aftltool/aftl_pubkey_1.pub')))

    # Invalid vbmeta image checked with invalid key.
    self.assertFalse(entry.verify_vbmeta_image(
        vbmeta_image, self.get_testdata_path('large_blob.bin')))

    # Valid vbmeta image checked with no key.
    self.assertFalse(entry.verify_vbmeta_image(vbmeta_image, None))

    # None image checked with a key.
    self.assertFalse(entry.verify_vbmeta_image(
        None, self.get_testdata_path('aftltool/aftl_pubkey_1.pub')))

  def test_print_desc(self):
    """Tests print_desc method."""
    buf = io.StringIO()
    self.test_entry_1.print_desc(buf)
    desc = buf.getvalue()

    # Cursory check whether the printed description contains something useful.
    self.assertGreater(len(desc), 0)
    self.assertIn('ICP hashes:', desc)


class TrillianLogRootDescriptorTest(AftltoolTestCase):
  """Test suite for testing the TrillianLogRootDescriptor descriptor."""

  def setUp(self):
    """Sets up the test bed for the unit tests."""
    super(TrillianLogRootDescriptorTest, self).setUp()

    # Creates basic log root without metadata fields.
    base_log_root = (
        '0001'                              # version
        '00000000000002e5'                  # tree_size
        '20'                                # root_hash_size
        '2d614759ad408a111a3351c0cb33c099'  # root_hash
        '422c30a5c5104788a343332bde2b387b'
        '15e1c97e3b4bd239'                  # timestamp
        '00000000000002e4'                  # revision
    )

    # Create valid log roots with metadata fields w/ and w/o metadata.
    self.test_log_root_bytes_wo_metadata = binascii.unhexlify(
        base_log_root + '0000')
    self.test_log_root_bytes_with_metadata = binascii.unhexlify(
        base_log_root + '00023132')

  def test__init__(self):
    """Tests constructor."""
    # Calls constructor without data.
    d = aftltool.TrillianLogRootDescriptor()
    self.assertTrue(d.is_valid())
    self.assertEqual(d.version, 1)
    self.assertEqual(d.tree_size, 0)
    self.assertEqual(d.root_hash_size, 0)
    self.assertEqual(d.root_hash, b'')
    self.assertEqual(d.timestamp, 0)
    self.assertEqual(d.revision, 0)
    self.assertEqual(d.metadata_size, 0)
    self.assertEqual(d.metadata, b'')

    # Calls constructor with log_root w/o metadata
    d = aftltool.TrillianLogRootDescriptor(self.test_log_root_bytes_wo_metadata)
    self.assertTrue(d.is_valid())
    self.assertEqual(d.version, 1)
    self.assertEqual(d.tree_size, 741)
    self.assertEqual(d.root_hash_size, 32)
    self.assertEqual(d.root_hash,
                     binascii.unhexlify('2d614759ad408a111a3351c0cb33c099'
                                        '422c30a5c5104788a343332bde2b387b'))
    self.assertEqual(d.timestamp, 1576762888554271289)
    self.assertEqual(d.revision, 740)
    self.assertEqual(d.metadata_size, 0)
    self.assertEqual(d.metadata, b'')

    # Calls constructor with log_root with metadata
    d = aftltool.TrillianLogRootDescriptor(
        self.test_log_root_bytes_with_metadata)
    self.assertEqual(d.metadata_size, 2)
    self.assertEqual(d.metadata, b'12')

  def test_get_expected_size(self):
    """Tests get_expected_size method."""
    # Default constructor.
    d = aftltool.TrillianLogRootDescriptor()
    self.assertEqual(d.get_expected_size(), 11 + 18)

    # Log root without metadata.
    d = aftltool.TrillianLogRootDescriptor(self.test_log_root_bytes_wo_metadata)
    self.assertEqual(d.get_expected_size(), 11 + 18 + 32)

    # Log root with metadata.
    d = aftltool.TrillianLogRootDescriptor(
        self.test_log_root_bytes_with_metadata)
    self.assertEqual(d.get_expected_size(), 11 + 18 + 32 + 2)

  def test_encode(self):
    """Tests encode method."""
    # Log root from default constructor.
    d = aftltool.TrillianLogRootDescriptor()
    expected_bytes = (
        '0001'                              # version
        '0000000000000000'                  # tree_size
        '00'                                # root_hash_size
        ''                                  # root_hash (empty)
        '0000000000000000'                  # timestamp
        '0000000000000000'                  # revision
        '0000'                              # metadata size
        ''                                  # metadata (empty)
    )
    self.assertEqual(d.encode(), binascii.unhexlify(expected_bytes))

    # Log root without metadata.
    d = aftltool.TrillianLogRootDescriptor(self.test_log_root_bytes_wo_metadata)
    self.assertEqual(d.encode(), self.test_log_root_bytes_wo_metadata)

    # Log root with metadata.
    d = aftltool.TrillianLogRootDescriptor(
        self.test_log_root_bytes_with_metadata)
    self.assertEqual(d.encode(), self.test_log_root_bytes_with_metadata)

  def test_is_valid(self):
    """Tests is_valid method."""
    d = aftltool.TrillianLogRootDescriptor()
    self.assertTrue(d.is_valid())

    # Invalid version.
    d = aftltool.TrillianLogRootDescriptor()
    d.version = 2
    self.assertFalse(d.is_valid())

    # Invalid tree_size.
    d = aftltool.TrillianLogRootDescriptor()
    d.tree_size = -1
    self.assertFalse(d.is_valid())

    # Invalid root_hash_size.
    d = aftltool.TrillianLogRootDescriptor()
    d.root_hash_size = -1
    self.assertFalse(d.is_valid())
    d.root_hash_size = 300
    self.assertFalse(d.is_valid())

    # Invalid/valid root_hash_size / root_hash combination.
    d = aftltool.TrillianLogRootDescriptor()
    d.root_hash_size = 4
    d.root_hash = b'123'
    self.assertFalse(d.is_valid())
    d.root_hash = b'1234'
    self.assertTrue(d.is_valid())

    # Invalid timestamp.
    d = aftltool.TrillianLogRootDescriptor()
    d.timestamp = -1
    self.assertFalse(d.is_valid())

    # Invalid revision.
    d = aftltool.TrillianLogRootDescriptor()
    d.revision = -1
    self.assertFalse(d.is_valid())

    # Invalid metadata_size.
    d = aftltool.TrillianLogRootDescriptor()
    d.metadata_size = -1
    self.assertFalse(d.is_valid())
    d.metadata_size = 70000
    self.assertFalse(d.is_valid())

    # Invalid/valid metadata_size / metadata combination.
    d = aftltool.TrillianLogRootDescriptor()
    d.metadata_size = 4
    d.metadata = b'123'
    self.assertFalse(d.is_valid())
    d.metadata = b'1234'
    self.assertTrue(d.is_valid())

  def test_print_desc(self):
    """Tests print_desc method."""
    # Log root without metadata
    buf = io.StringIO()
    d = aftltool.TrillianLogRootDescriptor(self.test_log_root_bytes_wo_metadata)
    d.print_desc(buf)
    desc = buf.getvalue()

    # Cursory check whether the printed description contains something useful.
    self.assertGreater(len(desc), 0)
    self.assertIn('Version:', desc)
    self.assertNotIn('Metadata:', desc)

    # Log root with metadata
    buf = io.StringIO()
    d = aftltool.TrillianLogRootDescriptor(
        self.test_log_root_bytes_with_metadata)
    d.print_desc(buf)
    desc = buf.getvalue()

    # Cursory check whether the printed description contains something useful.
    self.assertGreater(len(desc), 0)
    self.assertIn('Version:', desc)
    self.assertIn('Metadata:', desc)


class FirmwareInfoLeafTest(AftltoolTestCase):
  """Test suite for testing the FirmwareInfoLeaf."""

  def test__init__(self):
    """Tests constructor and properties methods."""
    # Calls constructor without data.
    leaf = aftltool.FirmwareInfoLeaf()
    self.assertTrue(leaf.is_valid())
    self.assertEqual(leaf.vbmeta_hash, None)
    self.assertEqual(leaf.version_incremental, None)
    self.assertEqual(leaf.platform_key, None)
    self.assertEqual(leaf.manufacturer_key_hash, None)
    self.assertEqual(leaf.description, None)

    # Calls constructor with data.
    leaf = aftltool.FirmwareInfoLeaf(self.test_afi_resp.fw_info_leaf)
    self.assertTrue(leaf.is_valid())
    self.assertEqual(
        leaf.vbmeta_hash,
        base64.b64decode('ViNzEQS/oc/bJ13yl40fk/cvXw90bxHQbzCRxgHDIGc='))
    self.assertEqual(leaf.version_incremental, '1')
    self.assertEqual(leaf.platform_key, None)
    self.assertEqual(
        leaf.manufacturer_key_hash,
        base64.b64decode('yBCrUOdjvaAh4git5EgqWa5neegUaoXeLlB67+N8ObY='))
    self.assertEqual(leaf.description, None)

    # Calls constructor with invalid JSON data.
    with self.assertRaises(aftltool.AftlError):
      leaf = aftltool.FirmwareInfoLeaf('Invalid JSON.')

  def test_get_expected_size(self):
    """Tests get_expected_size method."""
    # Calls constructor without data.
    leaf = aftltool.FirmwareInfoLeaf()
    self.assertEqual(leaf.get_expected_size(), 0)

    # Calls constructor with data.
    leaf = aftltool.FirmwareInfoLeaf(self.test_afi_resp.fw_info_leaf)
    self.assertEqual(leaf.get_expected_size(),
                     len(self.test_afi_resp.fw_info_leaf))

  def test_encode(self):
    """Tests encode method."""
    # Calls constructor without data.
    leaf = aftltool.FirmwareInfoLeaf()
    self.assertEqual(leaf.encode(), b'')

    # Calls constructor with data.
    self.assertEqual(self.test_fw_info_leaf.encode(),
                     self.test_afi_resp.fw_info_leaf)

  def test_is_valid(self):
    """Tests is_valid method."""
    # Calls constructor without data.
    leaf = aftltool.FirmwareInfoLeaf()
    self.assertTrue(leaf.is_valid())

    # Calls constructor with data.
    self.assertTrue(self.test_fw_info_leaf.is_valid())

    # Incorrect name for Value key.
    invalid_value_key_name = (
        b'{\"timestamp\":{\"seconds\":1580115370,\"nanos\":621454825},\"In'
        b'val\":{\"FwInfo\":{\"info\":{\"info\":{\"vbmeta_hash\":\"ViNzEQS'
        b'/oc/bJ13yl40fk/cvXw90bxHQbzCRxgHDIGc=\",\"version_incremental\":'
        b'\"1\",\"manufacturer_key_hash\":\"yBCrUOdjvaAh4git5EgqWa5neegUao'
        b'XeLlB67+N8ObY=\"}}}}}')

    with self.assertRaises(aftltool.AftlError):
      aftltool.FirmwareInfoLeaf(invalid_value_key_name)

    # Within Firmware Info having a field which does not exist in
    # proto.aftl_pb2.FirmwareInfo.
    invalid_fields = (
        b'{\"timestamp\":{\"seconds\":1580115370,\"nanos\":621454825},\"Va'
        b'lue\":{\"FwInfo\":{\"info\":{\"info\":{\"invalid_field\":\"ViNzEQS'
        b'/oc/bJ13yl40fk/cvXw90bxHQbzCRxgHDIGc=\",\"version_incremental\":'
        b'\"1\",\"manufacturer_key_hash\":\"yBCrUOdjvaAh4git5EgqWa5neegUao'
        b'XeLlB67+N8ObY=\"}}}}}')

    with self.assertRaises(aftltool.AftlError):
      aftltool.FirmwareInfoLeaf(invalid_fields)

  def test_print_desc(self):
    """Tests print_desc method."""
    buf = io.StringIO()
    self.test_fw_info_leaf.print_desc(buf)
    desc = buf.getvalue()

    # Cursory check whether the printed description contains something useful.
    self.assertGreater(len(desc), 0)
    self.assertIn('VBMeta hash:', desc)


class AftlMockCommunication(aftltool.AftlCommunication):
  """Testing Mock implementation of AftlCommunication."""

  def __init__(self, transparency_log_config, canned_response):
    """Initializes the object.

    Arguments:
      transparency_log_config: An aftltool.TransparencyLogConfig instance.
      canned_response: AddFirmwareInfoResponse to return or the Exception to
        raise.
    """
    super(AftlMockCommunication, self).__init__(transparency_log_config,
                                                timeout=None)
    self.request = None
    self.canned_response = canned_response

  def add_firmware_info(self, request):
    """Records the request and returns the canned response."""
    self.request = request

    if isinstance(self.canned_response, aftltool.AftlError):
      raise self.canned_response
    return self.canned_response


class AftlMock(aftltool.Aftl):
  """Mock for aftltool.Aftl to mock the communication piece."""

  def __init__(self, canned_response):
    """Initializes the object.

    Arguments:
      canned_response: AddFirmwareInfoResponse to return or the Exception to
        raise.
    """
    self.mock_canned_response = canned_response

  def request_inclusion_proof(self, transparency_log_config, vbmeta_image,
                              version_inc, manufacturer_key_path,
                              signing_helper, signing_helper_with_files,
                              timeout, aftl_comms=None):
    """Mocked request_inclusion_proof function."""
    aftl_comms = AftlMockCommunication(transparency_log_config,
                                       self.mock_canned_response)
    return super(AftlMock, self).request_inclusion_proof(
        transparency_log_config, vbmeta_image, version_inc,
        manufacturer_key_path, signing_helper, signing_helper_with_files,
        timeout, aftl_comms=aftl_comms)


class AftlTestCase(AftltoolTestCase):

  def setUp(self):
    """Sets up the test bed for the unit tests."""
    super(AftlTestCase, self).setUp()

    # Sets up the member variables which are then configured by
    # set_up_environment() in the subclasses.
    self.aftl_host = None
    self.aftl_pubkey = None
    self.aftl_apikey = None
    self.vbmeta_image = None
    self.manufacturer_key = None
    self.set_up_environment()

    self.transparency_log_config = aftltool.TransparencyLogConfig(
        self.aftl_host, self.aftl_pubkey, self.aftl_apikey)

    self.make_icp_default_params = {
        'vbmeta_image_path': self.vbmeta_image,
        'output': None,
        'signing_helper': None,
        'signing_helper_with_files': None,
        'version_incremental': '1',
        'transparency_log_configs': [self.transparency_log_config],
        'manufacturer_key': self.manufacturer_key,
        'padding_size': 0,
        'timeout': None
    }

    self.info_icp_default_params = {
        'vbmeta_image_path': None,
        'output': io.StringIO()
    }

    self.verify_icp_default_params = {
        'vbmeta_image_path': None,
        'transparency_log_pub_keys': [self.aftl_pubkey],
        'output': io.StringIO()
    }

    self.load_test_aftl_default_params = {
        'vbmeta_image_path': self.vbmeta_image,
        'output': io.StringIO(),
        'transparency_log_config': self.transparency_log_config,
        'manufacturer_key': self.manufacturer_key,
        'process_count': 1,
        'submission_count': 1,
        'stats_filename': None,
        'preserve_icp_images': False,
        'timeout': None
    }

  def set_up_environment(self):
    """Sets up member variables for the particular test environment.

    This allows to have different settings and mocking for unit tests and
    integration tests.
    """
    raise NotImplementedError('set_up_environment() needs to be implemented '
                              'by subclass.')

  def get_aftl_implementation(self, canned_response):
    """Gets the aftltool.Aftl implementation used for testing.

    This allows to have different Aftl implementations for unit tests and
    integration tests.

    Arguments:
      canned_response: Since we are using the actual implementation and not a
      mock this gets ignored.

    Raises:
      NotImplementedError if subclass is not implementing the method.
    """
    raise NotImplementedError('get_aftl_implementation() needs to be'
                              'implemented by subclass.')


class AftlTest(AftlTestCase):

  def set_up_environment(self):
    """Sets up the environment for unit testing without networking."""
    self.aftl_host = 'test.foo.bar:9000'
    self.aftl_pubkey = self.get_testdata_path('aftltool/aftl_pubkey_1.pub')
    self.vbmeta_image = self.get_testdata_path('aftltool/aftl_input_vbmeta.img')
    self.manufacturer_key = self.get_testdata_path('testkey_rsa4096.pem')

  def get_aftl_implementation(self, canned_response):
    """Retrieves the AftlMock for unit testing without networking."""
    return AftlMock(canned_response)

  def test_get_vbmeta_image(self):
    """Tests the get_vbmeta_image method."""
    tool = aftltool.Aftl()

    # Valid vbmeta image without footer and AftlImage.
    image, footer = tool.get_vbmeta_image(
        self.get_testdata_path('aftltool/aftl_input_vbmeta.img'))
    self.assertIsNotNone(image)
    self.assertEqual(len(image), 4352)
    self.assertIsNone(footer)

    # Valid vbmeta image without footer but with AftlImage.
    image, footer = tool.get_vbmeta_image(
        self.get_testdata_path('aftltool/aftl_output_vbmeta_with_1_icp.img'))
    self.assertIsNotNone(image)
    self.assertEqual(len(image), 4352)
    self.assertIsNone(footer)

    # Invalid vbmeta image.
    image, footer = tool.get_vbmeta_image(
        self.get_testdata_path('large_blob.bin'))
    self.assertIsNone(image)
    self.assertIsNone(footer)

    # Invalid file path.
    image, footer = tool.get_vbmeta_image(
        self.get_testdata_path('blabli_not_existing_file'))
    self.assertIsNone(image)
    self.assertIsNone(footer)

  def test_get_aftl_image(self):
    """Tests the get_aftl_image method."""
    tool = aftltool.Aftl()

    # Valid vbmeta image without footer with AftlImage.
    desc = tool.get_aftl_image(
        self.get_testdata_path('aftltool/aftl_output_vbmeta_with_1_icp.img'))
    self.assertIsInstance(desc, aftltool.AftlImage)

    # Valid vbmeta image without footer and AftlImage.
    desc = tool.get_aftl_image(
        self.get_testdata_path('aftltool/aftl_input_vbmeta.img'))
    self.assertIsNone(desc)

    # Invalid vbmeta image.
    desc = tool.get_aftl_image(self.get_testdata_path('large_blob.bin'))
    self.assertIsNone(desc)

  # pylint: disable=no-member
  def test_request_inclusion_proof(self):
    """Tests the request_inclusion_proof method."""
    # Always work with a mock independent if run as unit or integration tests.
    aftl = AftlMock(self.test_afi_resp)

    icp = aftl.request_inclusion_proof(
        self.transparency_log_config, b'a' * 1024, '1',
        self.get_testdata_path('testkey_rsa4096.pem'), None, None, None)
    self.assertEqual(icp.leaf_index,
                     self.test_afi_resp.fw_info_proof.proof.leaf_index)
    self.assertEqual(icp.proof_hash_count,
                     len(self.test_afi_resp.fw_info_proof.proof.hashes))
    self.assertEqual(icp.log_url, self.aftl_host)
    self.assertEqual(
        icp.log_root_descriptor.root_hash, binascii.unhexlify(
            '53b182b55dc1377197c938637f50093131daea4d0696b1eae5b8a014bfde884a'))

    self.assertEqual(icp.fw_info_leaf.version_incremental, '1')
    # To calculate the hash of the a RSA key use the following command:
    # openssl rsa -in test/data/testkey_rsa4096.pem -pubout \
    #    -outform DER | sha256sum
    self.assertEqual(icp.fw_info_leaf.manufacturer_key_hash, base64.b64decode(
        'yBCrUOdjvaAh4git5EgqWa5neegUaoXeLlB67+N8ObY='))

    self.assertEqual(icp.log_root_signature,
                     self.test_afi_resp.fw_info_proof.sth.log_root_signature)
    self.assertEqual(icp.proofs, self.test_afi_resp.fw_info_proof.proof.hashes)

  # pylint: disable=no-member
  def test_request_inclusion_proof_failure(self):
    """Tests the request_inclusion_proof method in case of a comms problem."""
    # Always work with a mock independent if run as unit or integration tests.
    aftl = AftlMock(aftltool.AftlError('Comms error'))

    with self.assertRaises(aftltool.AftlError):
      aftl.request_inclusion_proof(
          self.transparency_log_config, b'a' * 1024, 'version_inc',
          self.get_testdata_path('testkey_rsa4096.pem'), None, None, None)

  def test_request_inclusion_proof_manuf_key_not_4096(self):
    """Tests request_inclusion_proof with manufacturing key not of size 4096."""
    # Always work with a mock independent if run as unit or integration tests.
    aftl = AftlMock(self.test_afi_resp)
    with self.assertRaises(aftltool.AftlError) as e:
      aftl.request_inclusion_proof(
          self.transparency_log_config, b'a' * 1024, 'version_inc',
          self.get_testdata_path('testkey_rsa2048.pem'), None, None, None)
    self.assertIn('not of size 4096: 2048', str(e.exception))

  def test_make_and_verify_icp_with_1_log(self):
    """Tests make_icp_from_vbmeta, verify_image_icp & info_image_icp."""
    aftl = self.get_aftl_implementation(self.test_afi_resp)

    # Make a VBmeta image with ICP.
    with tempfile.NamedTemporaryFile('wb+') as output_file:
      self.make_icp_default_params['output'] = output_file
      result = aftl.make_icp_from_vbmeta(**self.make_icp_default_params)
      output_file.flush()
      self.assertTrue(result)

      # Checks that there is 1 ICP.
      aftl_image = aftl.get_aftl_image(output_file.name)
      self.assertEqual(aftl_image.image_header.icp_count, 1)

      # Verifies the generated image.
      self.verify_icp_default_params['vbmeta_image_path'] = output_file.name
      result = aftl.verify_image_icp(**self.verify_icp_default_params)
      self.assertTrue(result)

      # Prints the image details.
      self.info_icp_default_params['vbmeta_image_path'] = output_file.name
      result = aftl.info_image_icp(**self.info_icp_default_params)
      self.assertTrue(result)

  def test_make_and_verify_icp_with_2_logs(self):
    """Tests make_icp_from_vbmeta, verify_image_icp & info_image_icp."""
    aftl = self.get_aftl_implementation(self.test_afi_resp)

    # Reconfigures default parameters with two transparency logs.
    self.make_icp_default_params['transparency_log_configs'] = [
        self.transparency_log_config, self.transparency_log_config]

    # Make a VBmeta image with ICP.
    with tempfile.NamedTemporaryFile('wb+') as output_file:
      self.make_icp_default_params['output'] = output_file
      result = aftl.make_icp_from_vbmeta(
          **self.make_icp_default_params)
      output_file.flush()
      self.assertTrue(result)

      # Checks that there are 2 ICPs.
      aftl_image = aftl.get_aftl_image(output_file.name)
      self.assertEqual(aftl_image.image_header.icp_count, 2)

      # Verifies the generated image.
      self.verify_icp_default_params['vbmeta_image_path'] = output_file.name
      result = aftl.verify_image_icp(**self.verify_icp_default_params)
      self.assertTrue(result)

      # Prints the image details.
      self.info_icp_default_params['vbmeta_image_path'] = output_file.name
      result = aftl.info_image_icp(**self.info_icp_default_params)
      self.assertTrue(result)

  def test_info_image_icp(self):
    """Tests info_image_icp with vbmeta image with 2 ICP."""
    # Always work with a mock independent if run as unit or integration tests.
    aftl = AftlMock(self.test_afi_resp)

    image_path = self.get_testdata_path(
        'aftltool/aftl_output_vbmeta_with_2_icp_different_logs.img')
    self.info_icp_default_params['vbmeta_image_path'] = image_path

    # Verifies the generated image.
    result = aftl.info_image_icp(**self.info_icp_default_params)
    self.assertTrue(result)

  def test_info_image_icp_fail(self):
    """Tests info_image_icp with invalid vbmeta image."""
    # Always work with a mock independent if run as unit or integration tests.
    aftl = AftlMock(self.test_afi_resp)

    image_path = self.get_testdata_path('large_blob.bin')
    self.info_icp_default_params['vbmeta_image_path'] = image_path

    # Verifies the generated image.
    result = aftl.info_image_icp(**self.info_icp_default_params)
    self.assertFalse(result)

  def test_verify_image_icp(self):
    """Tets verify_image_icp with 2 ICP with all matching log keys."""
    # Always work with a mock independent if run as unit or integration tests.
    aftl = AftlMock(self.test_afi_resp)

    image_path = self.get_testdata_path(
        'aftltool/aftl_output_vbmeta_with_2_icp_different_logs.img')
    self.verify_icp_default_params['vbmeta_image_path'] = image_path
    self.verify_icp_default_params['transparency_log_pub_keys'] = [
        self.get_testdata_path('aftltool/aftl_pubkey_1.pub'),
        self.get_testdata_path('aftltool/aftl_pubkey_2.pub')
    ]

    result = aftl.verify_image_icp(**self.verify_icp_default_params)
    self.assertTrue(result)

  def test_verify_image_icp_failure(self):
    """Tests verify_image_icp with 2 ICP but only one matching log key."""
    # Always work with a mock independent if run as unit or integration tests.
    aftl = AftlMock(self.test_afi_resp)

    image_path = self.get_testdata_path(
        'aftltool/aftl_output_vbmeta_with_2_icp_different_logs.img')
    self.verify_icp_default_params['vbmeta_image_path'] = image_path
    self.verify_icp_default_params['transparency_log_pub_keys'] = [
        self.get_testdata_path('aftltool/aftl_pubkey_1.pub')
    ]

    result = aftl.verify_image_icp(**self.verify_icp_default_params)
    self.assertFalse(result)

  def test_make_icp_with_invalid_grpc_service(self):
    """Tests make_icp_from_vbmeta command with a host not supporting GRPC."""
    aftl = self.get_aftl_implementation(aftltool.AftlError('Comms error'))
    self.make_icp_default_params[
        'transparency_log_configs'][0].target = 'www.google.com:80'
    with tempfile.NamedTemporaryFile('wb+') as output_file:
      self.make_icp_default_params['output'] = output_file
      result = aftl.make_icp_from_vbmeta(
          **self.make_icp_default_params)
      self.assertFalse(result)

  def test_make_icp_grpc_timeout(self):
    """Tests make_icp_from_vbmeta command when running into GRPC timeout."""
    aftl = self.get_aftl_implementation(aftltool.AftlError('Comms error'))

    # The timeout is set to 1 second which is way below the minimum processing
    # time of the transparency log per load test results in b/139407814#2 where
    # it was 3.43 seconds.
    self.make_icp_default_params['timeout'] = 1
    with tempfile.NamedTemporaryFile('wb+') as output_file:
      self.make_icp_default_params['output'] = output_file
      result = aftl.make_icp_from_vbmeta(
          **self.make_icp_default_params)
      self.assertFalse(result)

  def test_load_test_single_process_single_submission(self):
    """Tests load_test_aftl command with 1 process which does 1 submission."""
    aftl = self.get_aftl_implementation(self.test_afi_resp)

    with tempfile.TemporaryDirectory() as tmp_dir:
      self.load_test_aftl_default_params[
          'stats_filename'] = os.path.join(tmp_dir, 'load_test.csv')
      result = aftl.load_test_aftl(**self.load_test_aftl_default_params)
      self.assertTrue(result)

      output = self.load_test_aftl_default_params['output'].getvalue()
      self.assertRegex(output, 'Succeeded:.+?1\n')
      self.assertRegex(output, 'Failed:.+?0\n')

      self.assertTrue(os.path.exists(
          self.load_test_aftl_default_params['stats_filename']))

  def test_load_test_multi_process_multi_submission(self):
    """Tests load_test_aftl command with 2 processes and 2 submissions each."""
    aftl = self.get_aftl_implementation(self.test_afi_resp)

    self.load_test_aftl_default_params['process_count'] = 2
    self.load_test_aftl_default_params['submission_count'] = 2
    with tempfile.TemporaryDirectory() as tmp_dir:
      self.load_test_aftl_default_params[
          'stats_filename'] = os.path.join(tmp_dir, 'load_test.csv')
      result = aftl.load_test_aftl(**self.load_test_aftl_default_params)
      self.assertTrue(result)

      output = self.load_test_aftl_default_params['output'].getvalue()
      self.assertRegex(output, 'Succeeded:.+?4\n')
      self.assertRegex(output, 'Failed:.+?0\n')

      self.assertTrue(os.path.exists(
          self.load_test_aftl_default_params['stats_filename']))

  def test_load_test_invalid_grpc_service(self):
    """Tests load_test_aftl command with a host that does not support GRPC."""
    aftl = self.get_aftl_implementation(aftltool.AftlError('Comms error'))

    self.load_test_aftl_default_params[
        'transparency_log_config'].target = 'www.google.com:80'
    result = aftl.load_test_aftl(**self.load_test_aftl_default_params)
    self.assertFalse(result)

    output = self.load_test_aftl_default_params['output'].getvalue()
    self.assertRegex(output, 'Succeeded:.+?0\n')
    self.assertRegex(output, 'Failed:.+?1\n')

  def test_load_test_grpc_timeout(self):
    """Tests load_test_aftl command when running into timeout."""
    aftl = self.get_aftl_implementation(aftltool.AftlError('Comms error'))

    self.load_test_aftl_default_params['timeout'] = 1
    result = aftl.load_test_aftl(**self.load_test_aftl_default_params)
    self.assertFalse(result)

    output = self.load_test_aftl_default_params['output'].getvalue()
    self.assertRegex(output, 'Succeeded:.+?0\n')
    self.assertRegex(output, 'Failed:.+?1\n')


class TransparencyLogConfigTestCase(unittest.TestCase):

  def test_from_argument(self):
    log = aftltool.TransparencyLogConfig.from_argument(
        "example.com:8080,mykey.pub")
    self.assertEqual(log.target, "example.com:8080")
    self.assertEqual(log.pub_key, "mykey.pub")

    with self.assertRaises(argparse.ArgumentTypeError):
      aftltool.TransparencyLogConfig.from_argument("example.com:8080,")

    with self.assertRaises(argparse.ArgumentTypeError):
      aftltool.TransparencyLogConfig.from_argument(",")

  def test_from_argument_with_api_key(self):
    log = aftltool.TransparencyLogConfig.from_argument(
        "example.com:8080,mykey.pub,Aipl29gj3x9")
    self.assertEqual(log.target, "example.com:8080")
    self.assertEqual(log.pub_key, "mykey.pub")
    self.assertEqual(log.api_key, "Aipl29gj3x9")

if __name__ == '__main__':
  unittest.main(verbosity=2)
