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

"""Provides selector information for TPM 2.0 unions.

Describing this information explicitly is easier than extracting it from the
specification.
"""

_SELECTORS = {
    'TPMU_HA': {
        'type': ['TPMI_ALG_HASH'],
        'selectors': {
            'TPM_ALG_SHA1': 'sha1[SHA1_DIGEST_SIZE]',
            'TPM_ALG_SHA256': 'sha256[SHA256_DIGEST_SIZE]',
            'TPM_ALG_SM3_256': 'sm3_256[SM3_256_DIGEST_SIZE]',
            'TPM_ALG_SHA384': 'sha384[SHA384_DIGEST_SIZE]',
            'TPM_ALG_SHA512': 'sha512[SHA512_DIGEST_SIZE]',
            'TPM_ALG_NULL': ''
        }
    },
    'TPMU_CAPABILITIES': {
        'type': ['TPM_CAP'],
        'selectors': {
            'TPM_CAP_ALGS': 'algorithms',
            'TPM_CAP_HANDLES': 'handles',
            'TPM_CAP_COMMANDS': 'command',
            'TPM_CAP_PP_COMMANDS': 'ppCommands',
            'TPM_CAP_AUDIT_COMMANDS': 'auditCommands',
            'TPM_CAP_PCRS': 'assignedPCR',
            'TPM_CAP_TPM_PROPERTIES': 'tpmProperties',
            'TPM_CAP_PCR_PROPERTIES': 'pcrProperties',
            'TPM_CAP_ECC_CURVES': 'eccCurves',
        }
    },
    'TPMU_ATTEST': {
        'type': ['TPMI_ST_ATTEST'],
        'selectors': {
            'TPM_ST_ATTEST_CERTIFY': 'certify',
            'TPM_ST_ATTEST_CREATION': 'creation',
            'TPM_ST_ATTEST_QUOTE': 'quote',
            'TPM_ST_ATTEST_COMMAND_AUDIT': 'commandAudit',
            'TPM_ST_ATTEST_SESSION_AUDIT': 'sessionAudit',
            'TPM_ST_ATTEST_TIME': 'time',
            'TPM_ST_ATTEST_NV': 'nv',
        }
    },
    'TPMU_SYM_KEY_BITS': {
        'type': ['TPMI_ALG_SYM', 'TPMI_ALG_SYM_OBJECT'],
        'selectors': {
            'TPM_ALG_AES': 'aes',
            'TPM_ALG_SM4': 'SM4',
            'TPM_ALG_XOR': 'xor_',
            'TPM_ALG_NULL': '',
        }
    },
    'TPMU_SYM_MODE': {
        'type': ['TPMI_ALG_SYM', 'TPMI_ALG_SYM_OBJECT'],
        'selectors': {
            'TPM_ALG_AES': 'aes',
            'TPM_ALG_SM4': 'SM4',
            'TPM_ALG_XOR': '',
            'TPM_ALG_NULL': '',
        }
    },
    'TPMU_SYM_DETAILS': {
        'type': ['TPMI_ALG_SYM', 'TPMI_ALG_SYM_OBJECT'],
        'selectors': {}
    },
    'TPMU_SCHEME_KEYEDHASH': {
        'type': ['TPMI_ALG_KEYEDHASH_SCHEME'],
        'selectors': {
            'TPM_ALG_HMAC': 'hmac',
            'TPM_ALG_XOR': 'xor_',
            'TPM_ALG_NULL': '',
        }
    },
    'TPMU_SIG_SCHEME': {
        'type': ['TPMI_ALG_SIG_SCHEME', 'TPMI_ALG_ECC_SCHEME'],
        'selectors': {
            'TPM_ALG_RSASSA': 'rsassa',
            'TPM_ALG_RSAPSS': 'rsapss',
            'TPM_ALG_ECDSA': 'ecdsa',
            'TPM_ALG_SM2': 'sm2',
            'TPM_ALG_ECDAA': 'ecdaa',
            'TPM_ALG_ECSCHNORR': 'ecSchnorr',
            'TPM_ALG_HMAC': 'hmac',
            'TPM_ALG_NULL': '',
        }
    },
    'TPMU_KDF_SCHEME': {
        'type': ['TPMI_ALG_KDF'],
        'selectors': {
            'TPM_ALG_MGF1': 'mgf1',
            'TPM_ALG_KDF1_SP800_56a': 'kdf1_SP800_56a',
            'TPM_ALG_KDF2': 'kdf2',
            'TPM_ALG_KDF1_SP800_108': 'kdf1_sp800_108',
            'TPM_ALG_NULL': '',
        }
    },
    'TPMU_ASYM_SCHEME': {
        'type': ['TPMI_ALG_ASYM_SCHEME',
                 'TPMI_ALG_RSA_SCHEME',
                 'TPMI_ALG_RSA_DECRYPT',
                 'TPMI_ALG_ECC_SCHEME'],
        'selectors': {
            'TPM_ALG_RSASSA': 'rsassa',
            'TPM_ALG_RSAPSS': 'rsapss',
            'TPM_ALG_RSAES': '',
            'TPM_ALG_OAEP': 'oaep',
            'TPM_ALG_ECDSA': 'ecdsa',
            'TPM_ALG_SM2': 'sm2',
            'TPM_ALG_ECDAA': 'ecdaa',
            'TPM_ALG_ECSCHNORR': 'ecSchnorr',
            'TPM_ALG_ECDH': 'ecdh',
            'TPM_ALG_NULL': '',
        }
    },
    'TPMU_SIGNATURE': {
        'type': ['TPMI_ALG_SIG_SCHEME'],
        'selectors': {
            'TPM_ALG_RSASSA': 'rsassa',
            'TPM_ALG_RSAPSS': 'rsapss',
            'TPM_ALG_ECDSA': 'ecdsa',
            'TPM_ALG_SM2': 'sm2',
            'TPM_ALG_ECDAA': 'ecdaa',
            'TPM_ALG_ECSCHNORR': 'ecschnorr',
            'TPM_ALG_HMAC': 'hmac',
            'TPM_ALG_NULL': '',
        }
    },
    'TPMU_PUBLIC_PARMS': {
        'type': ['TPMI_ALG_PUBLIC'],
        'selectors': {
            'TPM_ALG_KEYEDHASH': 'keyedHashDetail',
            'TPM_ALG_SYMCIPHER': 'symDetail',
            'TPM_ALG_RSA': 'rsaDetail',
            'TPM_ALG_ECC': 'eccDetail',
        }
    },
    'TPMU_PUBLIC_ID': {
        'type': ['TPMI_ALG_PUBLIC'],
        'selectors': {
            'TPM_ALG_KEYEDHASH': 'keyedHash',
            'TPM_ALG_SYMCIPHER': 'sym',
            'TPM_ALG_RSA': 'rsa',
            'TPM_ALG_ECC': 'ecc',
        }
    },
    'TPMU_SENSITIVE_COMPOSITE': {
        'type': ['TPMI_ALG_PUBLIC'],
        'selectors': {
            'TPM_ALG_KEYEDHASH': 'bits',
            'TPM_ALG_SYMCIPHER': 'sym',
            'TPM_ALG_RSA': 'rsa',
            'TPM_ALG_ECC': 'ecc',
        }
    },
}


def GetUnionSelectorType(union_type):
  """Returns the selector type for a given union."""
  return _SELECTORS[union_type]['type'][0]


def GetUnionSelectorTypes(union_type):
  """Returns a list of all acceptable selector types for a given union."""
  return _SELECTORS[union_type]['type']


def GetUnionSelectorValues(union_type):
  """Returns the list of possible selector values for a given union."""
  return _SELECTORS[union_type]['selectors'].keys()


def GetUnionSelectorField(union_type, selector_value):
  """Returns the union field associated with a given selector value."""
  return _SELECTORS[union_type]['selectors'][selector_value]
