# -*- coding: utf-8 -*-
# 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.

"""All things Chrome OS signing related"""

from __future__ import print_function

import os
import sys

from six.moves import configparser

from chromite.lib import constants


assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'


SIGNING_DIR = os.path.join(constants.CHROMITE_DIR, 'signing')
INPUT_INSN_DIR_REL = os.path.join('crostools', 'signer_instructions')
TEST_INPUT_INSN_DIR = os.path.join(SIGNING_DIR, 'signer_instructions')

CROS_SIGNING_BASE_DIR = os.path.join(constants.SOURCE_ROOT, 'src', 'platform',
                                     'signing', 'signer-production')
CROS_SIGNING_CONFIG = os.path.join(CROS_SIGNING_BASE_DIR,
                                   'signer/configs/cros_common.config')
SECURITY_BASELINES_DIR = os.path.join(CROS_SIGNING_BASE_DIR,
                                      'security_test_baselines')
CROS_SIGNING_BIN_DIR = os.path.join(CROS_SIGNING_BASE_DIR,
                                    'signer/signingtools-bin')


def GetDefaultVbootStableHash(config_file=None):
  """Get the default signer vboot_stable_hash config value."""
  config = configparser.ConfigParser()
  config.read(config_file or CROS_SIGNING_CONFIG)
  try:
    return config.get('signer', 'vboot_stable_hash')
  except configparser.Error:
    return None
